diff --git a/doc/build.txt b/doc/build.txt index 2db77ebe0..15b398b44 100644 --- a/doc/build.txt +++ b/doc/build.txt @@ -76,7 +76,7 @@ with --enable-gcov) === Extending ns-3 === To add new modules: - 1. Create the module directory under src (or src/devices, or whatever); + 1. Create the module directory under src; 2. Add the source files to it; 3. Add a 'wscript' describing it; 4. Add the module subdirectory name to the all_modules list in src/wscript. diff --git a/doc/doxygen.conf b/doc/doxygen.conf index b5a2e58d1..2e971f095 100644 --- a/doc/doxygen.conf +++ b/doc/doxygen.conf @@ -603,13 +603,13 @@ RECURSIVE = YES # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. -EXCLUDE = src/routing/olsr/olsr-state.h \ - src/routing/olsr/olsr-repositories.h \ - src/simulator/high-precision.h \ - src/simulator/high-precision-128.h \ - src/simulator/high-precision-double.h \ - src/tools/visualizer/model/visual-simulator-impl.h \ - src/tools/visualizer/model/pyviz.h +EXCLUDE = src/olsr/model/olsr-state.h \ + src/olsr/model/olsr-repositories.h \ + src/core/model/high-precision.h \ + src/core/model/high-precision-128.h \ + src/core/model/high-precision-double.h \ + src/visualizer/model/visual-simulator-impl.h \ + src/visualizer/model/pyviz.h # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded diff --git a/doc/main.h b/doc/main.h index 7616ea517..da9bdf17e 100644 --- a/doc/main.h +++ b/doc/main.h @@ -34,24 +34,14 @@ * * \section module-sec Module overview * - * The ns-3 library is split across multiple modules: + * The ns-3 library is split across many modules. : * - core: located in src/core and contains a number of facilities which * do not depend on any other module. Some of these facilities are * OS-dependent. - * - simulator: located in src/simulator and contains event scheduling - * facilities. - * - common: located in src/common and contains facilities specific - * to network simulations but shared by pretty much every model - * of a network component. - * - node: located in src/node. Defines the abstract interfaces which - * must be implemented by every node and more specifically, by - * IPv4 and IPv6 nodes. - * - devices: located in src/devices. Contains a set of MAC-level models - * - InternetStack: located in src/internet-stack. Contains TCP/IP models. - * - Applications: located in src/applications - * - Routing: located in src/routing; routing protocols. - * - Mobility: located in src/mobility; Mobility models for nodes - * - Helper: located in src/helper; Helper API for the simulator + * - network: located in src/network. Network related files. + * - internet: located in src/internet. Internet related files. + * - applications: located in src/applications + * - mobility: located in src/mobility; Mobility models for nodes * * More detail can be found in the Modules * tab. diff --git a/doc/manual/source/attributes.rst b/doc/manual/source/attributes.rst index eafea19ba..68beab493 100644 --- a/doc/manual/source/attributes.rst +++ b/doc/manual/source/attributes.rst @@ -641,14 +641,14 @@ ConfigStore *********** **Feedback requested:** This is an experimental feature of |ns3|. It is found -in ``src/contrib`` and not in the main tree. If you like this feature and +in ``src/config-store``. If you like this feature and would like to provide feedback on it, please email us. -Values for |ns3| attributes can be stored in an ASCII or XML text file and -loaded into a future simulation. This feature is known as the |ns3| -ConfigStore. The ConfigStore code is in ``src/contrib/``. It is not yet -main-tree code, because we are seeking some user feedback and experience with -this. +Values for |ns3| attributes can be stored in an ASCII or XML text file +and loaded into a future simulation. This feature is known as the +|ns3| ConfigStore. The ConfigStore code is in ``src/config-store/``. +It is still considered as unstable code, because we are seeking some +user feedback and experience with this. We can explore this system by using an example. Copy the ``csma-bridge.cc`` file to the scratch directory::: diff --git a/doc/manual/source/organization.rst b/doc/manual/source/organization.rst index 4ea193f97..9648c0197 100644 --- a/doc/manual/source/organization.rst +++ b/doc/manual/source/organization.rst @@ -27,10 +27,9 @@ on modules beneath them in the figure. We first describe the core of the simulator; those components that are common across all protocol, hardware, and environmental models. -The simulation core is implemented -in ``src/core``, and the core is used to build the simulation engine -``src/simulator``. Packets are fundamental objects in a network simulator -and are implemented in ``src/common``. These three simulation modules by +The simulation core is implemented in ``src/core``. Packets are +fundamental objects in a network simulator +and are implemented in ``src/network``. These two simulation modules by themselves are intended to comprise a generic simulation core that can be used by different kinds of networks, not just Internet-based networks. The above modules of |ns3| are independent of specific network and device diff --git a/doc/manual/source/tcp.rst b/doc/manual/source/tcp.rst index 1360c9914..244ea5a05 100644 --- a/doc/manual/source/tcp.rst +++ b/doc/manual/source/tcp.rst @@ -195,7 +195,7 @@ There are a few example files. Try:: These examples will deposit some ``.pcap`` files in your directory, which can be examined by tcpdump or wireshark. -Let's look at the ``examples/tcp-nsc-zoo.cc`` file for some typical +Let's look at the ``examples/tcp/tcp-nsc-zoo.cc`` file for some typical usage. How does it differ from using native |ns3| TCP? There is one main configuration line, when using NSC and the |ns3| helper API, that needs to be set::: @@ -233,7 +233,7 @@ sockets, as described above and documented in `Doxygen `_ Additionally, NSC TCP exports a lot of configuration variables into the -|ns3| :ref:`Attributes` system, via a `sysctl `_-like interface. In the ``examples/tcp-nsc-zoo`` example, you +|ns3| :ref:`Attributes` system, via a `sysctl `_-like interface. In the ``examples/tcp/tcp-nsc-zoo`` example, you can see the following configuration::: diff --git a/doc/manual/source/wifi.rst b/doc/manual/source/wifi.rst index bd17a8d47..bf8748737 100644 --- a/doc/manual/source/wifi.rst +++ b/doc/manual/source/wifi.rst @@ -105,7 +105,7 @@ limitation found in ns-2. Presently, however, there is no model for cross-channel interference or coupling. The source code for the Wifi NetDevice lives in the directory -``src/devices/wifi``. +``src/wifi``. .. _wifi-architecture: diff --git a/doc/manual/source/wimax.rst b/doc/manual/source/wimax.rst index 5e589394b..c33d531c4 100644 --- a/doc/manual/source/wimax.rst +++ b/doc/manual/source/wimax.rst @@ -16,7 +16,7 @@ of the |ns3| model are: * packet tracing functionality The source code for the WiMAX models lives in the directory -``src/devices/wimax``. +``src/wimax``. There have been two academic papers published on this model: diff --git a/doc/testing/source/how-to-write-tests.rst b/doc/testing/source/how-to-write-tests.rst index 9280a5371..3920c4fce 100644 --- a/doc/testing/source/how-to-write-tests.rst +++ b/doc/testing/source/how-to-write-tests.rst @@ -31,7 +31,7 @@ TestSuite), these things need to be decided up front: separately in src/test/ directory). You will have to edit the wscript file in that directory to compile your new code, if it is a new file. -See the file ``src/test/sample-test-suite.cc`` and corresponding +See the file ``src/template/test/sample-test-suite.cc`` and corresponding wscript file in that directory for a simple example, and see the directories under ``src/test`` for more complicated examples. diff --git a/doc/testing/source/testing-framework.rst b/doc/testing/source/testing-framework.rst index aa02b725b..39b04ce46 100644 --- a/doc/testing/source/testing-framework.rst +++ b/doc/testing/source/testing-framework.rst @@ -421,10 +421,10 @@ size as the object name service code itself. Unit tests are tests that check a single bit of functionality that are not built into the ns-3 code, but live in the same directory as the code it tests. It is possible that these tests check integration of multiple implementation files in a module -as well. The file src/core/names-test-suite.cc is an example of this kind -of test. The file src/common/pcap-file-test-suite.cc is another example +as well. The file src/core/test/names-test-suite.cc is an example of this kind +of test. The file src/network/test/pcap-file-test-suite.cc is another example that uses a known good pcap file as a test vector file. This file is stored -locally in the src/common directory. +locally in the src/network directory. System Tests ++++++++++++ @@ -742,7 +742,7 @@ arguments as needed, but basedir is the minimum needed):: (gdb) r --basedir=`pwd` Starting program: <..>/build/debug/utils/test-runner --basedir=`pwd` [Thread debugging using libthread_db enabled] - assert failed. file=../src/core/type-id.cc, line=138, cond="uid <= m_information.size () && uid != 0" + assert failed. file=../src/core/model/type-id.cc, line=138, cond="uid <= m_information.size () && uid != 0" ... Here is another example of how to use valgrind to debug a memory problem diff --git a/doc/tutorial/source/tracing.rst b/doc/tutorial/source/tracing.rst index 66ea09119..31de42458 100644 --- a/doc/tutorial/source/tracing.rst +++ b/doc/tutorial/source/tracing.rst @@ -1766,9 +1766,9 @@ add an error model to this code also, so we wanted to demonstrate this working. This trace sink will be connected to the "PhyRxDrop" trace source of the point-to-point NetDevice. This trace source fires when a packet is dropped by the physical layer of a ``NetDevice``. If you take a small detour to the -source (``src/devices/point-to-point/point-to-point-net-device.cc``) you will +source (``src/point-to-point/model/point-to-point-net-device.cc``) you will see that this trace source refers to ``PointToPointNetDevice::m_phyRxDropTrace``. -If you then look in ``src/devices/point-to-point/point-to-point-net-device.h`` +If you then look in ``src/point-to-point/model/point-to-point-net-device.h`` for this member variable, you will find that it is declared as a ``TracedCallback >``. This should tell you that the callback target should be a function that returns void and takes a single diff --git a/src/template/wscript b/src/template/wscript index 0c1bfd06e..672255f56 100644 --- a/src/template/wscript +++ b/src/template/wscript @@ -7,6 +7,11 @@ def build(bld): # Set the C++ source files for this module. module.source = [ + # Uncomment this line to compile this model source file. + #'model/sample-model.cc', + + # Uncomment this line to compile this helper source file. + #'helper/sample-helper.cc', ] # Create the module's test library. @@ -23,6 +28,11 @@ def build(bld): # Set the C++ header files for this module. headers.source = [ + # Uncomment this line to install this model header file. + #'model/sample-model.h', + + # Uncomment this line to install this helper header file. + #'helper/sample-helper.h', ] # Uncomment these lines if this module needs a library such as the diff --git a/src/wifi/bindings/modulegen__gcc_ILP32.py b/src/wifi/bindings/modulegen__gcc_ILP32.py index e1674dea3..2ca7aa4f7 100644 --- a/src/wifi/bindings/modulegen__gcc_ILP32.py +++ b/src/wifi/bindings/modulegen__gcc_ILP32.py @@ -1869,11 +1869,6 @@ def register_Ns3InterferenceHelper_methods(root_module, cls): cls.add_method('CalculateSnrPer', 'ns3::InterferenceHelper::SnrPer', [param('ns3::Ptr< ns3::InterferenceHelper::Event >', 'event')]) - ## interference-helper.h (module 'wifi'): static ns3::Time ns3::InterferenceHelper::CalculateTxDuration(uint32_t size, ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function] - cls.add_method('CalculateTxDuration', - 'ns3::Time', - [param('uint32_t', 'size'), param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], - is_static=True) ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::EraseEvents() [member function] cls.add_method('EraseEvents', 'void', @@ -1892,26 +1887,6 @@ def register_Ns3InterferenceHelper_methods(root_module, cls): 'double', [], is_const=True) - ## interference-helper.h (module 'wifi'): static uint32_t ns3::InterferenceHelper::GetPayloadDurationMicroSeconds(uint32_t size, ns3::WifiMode payloadMode) [member function] - cls.add_method('GetPayloadDurationMicroSeconds', - 'uint32_t', - [param('uint32_t', 'size'), param('ns3::WifiMode', 'payloadMode')], - is_static=True) - ## interference-helper.h (module 'wifi'): static uint32_t ns3::InterferenceHelper::GetPlcpHeaderDurationMicroSeconds(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function] - cls.add_method('GetPlcpHeaderDurationMicroSeconds', - 'uint32_t', - [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], - is_static=True) - ## interference-helper.h (module 'wifi'): static ns3::WifiMode ns3::InterferenceHelper::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function] - cls.add_method('GetPlcpHeaderMode', - 'ns3::WifiMode', - [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], - is_static=True) - ## interference-helper.h (module 'wifi'): static uint32_t ns3::InterferenceHelper::GetPlcpPreambleDurationMicroSeconds(ns3::WifiMode mode, ns3::WifiPreamble preamble) [member function] - cls.add_method('GetPlcpPreambleDurationMicroSeconds', - 'uint32_t', - [param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble')], - is_static=True) ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxEnd() [member function] cls.add_method('NotifyRxEnd', 'void', @@ -6266,11 +6241,11 @@ def register_Ns3WifiPhy_methods(root_module, cls): 'double', [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], is_pure_virtual=True, is_const=True, is_virtual=True) - ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) const [member function] + ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function] cls.add_method('CalculateTxDuration', 'ns3::Time', [param('uint32_t', 'size'), param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], - is_pure_virtual=True, is_const=True, is_virtual=True) + is_static=True) ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function] cls.add_method('ConfigureStandard', 'void', @@ -6491,6 +6466,26 @@ def register_Ns3WifiPhy_methods(root_module, cls): 'ns3::WifiMode', [], is_static=True) + ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetPayloadDurationMicroSeconds(uint32_t size, ns3::WifiMode payloadMode) [member function] + cls.add_method('GetPayloadDurationMicroSeconds', + 'uint32_t', + [param('uint32_t', 'size'), param('ns3::WifiMode', 'payloadMode')], + is_static=True) + ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetPlcpHeaderDurationMicroSeconds(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function] + cls.add_method('GetPlcpHeaderDurationMicroSeconds', + 'uint32_t', + [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], + is_static=True) + ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function] + cls.add_method('GetPlcpHeaderMode', + 'ns3::WifiMode', + [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], + is_static=True) + ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetPlcpPreambleDurationMicroSeconds(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function] + cls.add_method('GetPlcpPreambleDurationMicroSeconds', + 'uint32_t', + [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], + is_static=True) ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetStateDuration() [member function] cls.add_method('GetStateDuration', 'ns3::Time', @@ -7084,11 +7079,6 @@ def register_Ns3YansWifiPhy_methods(root_module, cls): 'ns3::Time', [], is_const=True, is_virtual=True) - ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) const [member function] - cls.add_method('CalculateTxDuration', - 'ns3::Time', - [param('uint32_t', 'size'), param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], - is_const=True, is_virtual=True) ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNModes() const [member function] cls.add_method('GetNModes', 'uint32_t', diff --git a/src/wifi/bindings/modulegen__gcc_LP64.py b/src/wifi/bindings/modulegen__gcc_LP64.py index e1674dea3..2ca7aa4f7 100644 --- a/src/wifi/bindings/modulegen__gcc_LP64.py +++ b/src/wifi/bindings/modulegen__gcc_LP64.py @@ -1869,11 +1869,6 @@ def register_Ns3InterferenceHelper_methods(root_module, cls): cls.add_method('CalculateSnrPer', 'ns3::InterferenceHelper::SnrPer', [param('ns3::Ptr< ns3::InterferenceHelper::Event >', 'event')]) - ## interference-helper.h (module 'wifi'): static ns3::Time ns3::InterferenceHelper::CalculateTxDuration(uint32_t size, ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function] - cls.add_method('CalculateTxDuration', - 'ns3::Time', - [param('uint32_t', 'size'), param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], - is_static=True) ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::EraseEvents() [member function] cls.add_method('EraseEvents', 'void', @@ -1892,26 +1887,6 @@ def register_Ns3InterferenceHelper_methods(root_module, cls): 'double', [], is_const=True) - ## interference-helper.h (module 'wifi'): static uint32_t ns3::InterferenceHelper::GetPayloadDurationMicroSeconds(uint32_t size, ns3::WifiMode payloadMode) [member function] - cls.add_method('GetPayloadDurationMicroSeconds', - 'uint32_t', - [param('uint32_t', 'size'), param('ns3::WifiMode', 'payloadMode')], - is_static=True) - ## interference-helper.h (module 'wifi'): static uint32_t ns3::InterferenceHelper::GetPlcpHeaderDurationMicroSeconds(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function] - cls.add_method('GetPlcpHeaderDurationMicroSeconds', - 'uint32_t', - [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], - is_static=True) - ## interference-helper.h (module 'wifi'): static ns3::WifiMode ns3::InterferenceHelper::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function] - cls.add_method('GetPlcpHeaderMode', - 'ns3::WifiMode', - [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], - is_static=True) - ## interference-helper.h (module 'wifi'): static uint32_t ns3::InterferenceHelper::GetPlcpPreambleDurationMicroSeconds(ns3::WifiMode mode, ns3::WifiPreamble preamble) [member function] - cls.add_method('GetPlcpPreambleDurationMicroSeconds', - 'uint32_t', - [param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble')], - is_static=True) ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::NotifyRxEnd() [member function] cls.add_method('NotifyRxEnd', 'void', @@ -6266,11 +6241,11 @@ def register_Ns3WifiPhy_methods(root_module, cls): 'double', [param('ns3::WifiMode', 'txMode'), param('double', 'ber')], is_pure_virtual=True, is_const=True, is_virtual=True) - ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) const [member function] + ## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function] cls.add_method('CalculateTxDuration', 'ns3::Time', [param('uint32_t', 'size'), param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], - is_pure_virtual=True, is_const=True, is_virtual=True) + is_static=True) ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function] cls.add_method('ConfigureStandard', 'void', @@ -6491,6 +6466,26 @@ def register_Ns3WifiPhy_methods(root_module, cls): 'ns3::WifiMode', [], is_static=True) + ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetPayloadDurationMicroSeconds(uint32_t size, ns3::WifiMode payloadMode) [member function] + cls.add_method('GetPayloadDurationMicroSeconds', + 'uint32_t', + [param('uint32_t', 'size'), param('ns3::WifiMode', 'payloadMode')], + is_static=True) + ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetPlcpHeaderDurationMicroSeconds(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function] + cls.add_method('GetPlcpHeaderDurationMicroSeconds', + 'uint32_t', + [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], + is_static=True) + ## wifi-phy.h (module 'wifi'): static ns3::WifiMode ns3::WifiPhy::GetPlcpHeaderMode(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function] + cls.add_method('GetPlcpHeaderMode', + 'ns3::WifiMode', + [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], + is_static=True) + ## wifi-phy.h (module 'wifi'): static uint32_t ns3::WifiPhy::GetPlcpPreambleDurationMicroSeconds(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member function] + cls.add_method('GetPlcpPreambleDurationMicroSeconds', + 'uint32_t', + [param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], + is_static=True) ## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::GetStateDuration() [member function] cls.add_method('GetStateDuration', 'ns3::Time', @@ -7084,11 +7079,6 @@ def register_Ns3YansWifiPhy_methods(root_module, cls): 'ns3::Time', [], is_const=True, is_virtual=True) - ## yans-wifi-phy.h (module 'wifi'): ns3::Time ns3::YansWifiPhy::CalculateTxDuration(uint32_t size, ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) const [member function] - cls.add_method('CalculateTxDuration', - 'ns3::Time', - [param('uint32_t', 'size'), param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPreamble', 'preamble')], - is_const=True, is_virtual=True) ## yans-wifi-phy.h (module 'wifi'): uint32_t ns3::YansWifiPhy::GetNModes() const [member function] cls.add_method('GetNModes', 'uint32_t',