diff -Naur ns-3.22/AUTHORS ns-3.23/AUTHORS
--- ns-3.22/AUTHORS 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/AUTHORS 2015-05-13 11:05:26.000000000 -0700
@@ -28,9 +28,11 @@
Eugene Chemeritskiy (echemeritskiy@arccn.ru)
Yufei Cheng (yfcheng@ittc.ku.edu)
Andrey Churin (aachurin@gmail.com)
+Benjamin Cizdziel (ben.cizdziel@gmail.com)
Salva Climent (jocliba@gmail.com)
Luis Cortes (cortes@gatech.edu)
Luca Costantino (luca.costantino@gmail.com)
+Matthieu Coudron (matthieu.coudron@lip6.fr)
Alexander D'souza (moijes12@gmail.com)
Sébastien Deronne (sebastien.deronne@gmail.com)
Craig Dowell (craigdo@ee.washington.edu)
@@ -49,6 +51,7 @@
Ashim Ghosh (ashim.atiit@gmail.com)
Martin Giachino (martin.giachino@gmail.com,giachino@fing.edu.uy)
Tom Goff (tgoff@tgoff.net)
+Mohit Goyal (mohit.bits@gmail.com)
Juan C. Granda (jcgranda@uniovi.es)
David Gross (gdavid.devel@gmail.com)
Maja Grubišić (maja.grubisic@live.com)
@@ -57,6 +60,7 @@
Bruno Haick (bghaick@hotmail.com)
Frank Helbert (frank@ime.usp.br)
Tom Henderson (tomhend@u.washington.edu)
+Christopher Hepner (hepner@hs-ulm.de)
Budiarto Herman (budiarto.herman@magister.fi)
Tom Hewer (tomhewer@mac.com)
Kristian A. Hiorth (kristahi@ifi.uio.no)
@@ -82,6 +86,7 @@
Emmanuelle Laprise (emmmanuelle.laprise@bluekazoo.ca)
Kristijan Lenković (k.lenkovic@me.com)
Daniel Lertpratchya (nikkipui@gmail.com)
+Brett Levasseur (brettl20@gmail.com)
Björn Lichtblau (lichtbla@informatik.hu-berlin.de)
Timo Lindhorst (tlnd@online.de)
Erwan Livolant (erwan.livolant@inria.fr)
@@ -101,6 +106,7 @@
Edvin Močibob (edvin.mocibob@gmail.com)
Mike Moreton (mjvm_ns@hotmail.com)
Michele Muccio (michelemuccio@virgilio.it)
+Esteban Municio (esteban.municio@urjc.es)
Sidharth Nabar (snabar@uw.edu)
Hemanth Narra (hemanth@ittc.ku.edu)
Roman Naumann (naumann@informatik.hu-berlin.de)
diff -Naur ns-3.22/CHANGES.html ns-3.23/CHANGES.html
--- ns-3.22/CHANGES.html 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/CHANGES.html 2015-05-13 11:05:26.000000000 -0700
@@ -51,6 +51,39 @@
us a note on ns-developers mailing list.
+Changes from ns-3.22 to ns-3.23
+New API:
+
+ The mobility module includes a GeographicPositions class used to
+convert geographic to cartesian coordinates, and to generate randomly
+distributed geographic coordinates.
+
+ The spectrum module includes new TvSpectrumTransmitter classes and helpers to create television transmitter(s) that transmit PSD spectrums customized by attributes such as modulation type, power, antenna type, channel frequency, etc.
+
+
+Changes to existing API:
+
+ In LteSpectrumPhy, LtePhyTxEndCallback and the corresponding methods have been removed, since they were unused.
+
+ In the DataRate class in the network module, CalculateTxTime has been declared deprecated. CalculateBytesTxTime and CalculateBitsTxTime are to be used instead. The return value is a Time, instead of a double.
+
+ In the Wi-Fi InterferenceHelper, the interference event now takes the WifiTxVector as an input parameter, instead of the WifiMode. A similar change was made to the WifiPhy::RxOkCallback signature.
+
+
+Changes to build system:
+
+Changed behavior:
+This section is for behavioral changes to the models that were not due to a bug fix.
+
+ 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. Acces 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
New API:
diff -Naur ns-3.22/doc/doxygen.conf ns-3.23/doc/doxygen.conf
--- ns-3.22/doc/doxygen.conf 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/doxygen.conf 2015-05-13 11:05:26.000000000 -0700
@@ -40,7 +40,7 @@
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = "3-dev"
+PROJECT_NUMBER = "3.23"
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
diff -Naur ns-3.22/doc/manual/source/attributes.rst ns-3.23/doc/manual/source/attributes.rst
--- ns-3.22/doc/manual/source/attributes.rst 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/manual/source/attributes.rst 2015-05-13 11:05:26.000000000 -0700
@@ -165,6 +165,7 @@
{
static TypeId tid = TypeId ("ns3::Node")
.SetParent ()
+ .SetGroupName ("Network")
.AddConstructor ()
.AddAttribute ("DeviceList",
"The list of devices associated to this Node.",
@@ -300,6 +301,7 @@
{
static TypeId tid = TypeId ("ns3::DropTailQueue")
.SetParent ()
+ .SetGroupName ("Network")
.AddConstructor ()
.AddAttribute ("MaxPackets",
"The maximum number of packets accepted by this DropTailQueue.",
diff -Naur ns-3.22/doc/manual/source/conf.py ns-3.23/doc/manual/source/conf.py
--- ns-3.22/doc/manual/source/conf.py 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/manual/source/conf.py 2015-05-13 11:05:26.000000000 -0700
@@ -48,9 +48,9 @@
# built documents.
#
# The short X.Y version.
-version = 'ns-3.22'
+version = 'ns-3.23'
# The full version, including alpha/beta/rc tags.
-release = 'ns-3.22'
+release = 'ns-3.23'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
diff -Naur ns-3.22/doc/manual/source/new-models.rst ns-3.23/doc/manual/source/new-models.rst
--- ns-3.22/doc/manual/source/new-models.rst 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/manual/source/new-models.rst 2015-05-13 11:05:26.000000000 -0700
@@ -341,6 +341,7 @@
{
static TypeId tid = TypeId ("ns3::ErrorModel")
.SetParent ()
+ .SetGroupName ("Network")
;
return tid;
}
@@ -359,6 +360,7 @@
{
static TypeId tid = TypeId ("ns3::RateErrorModel")
.SetParent ()
+ .SetGroupName ("Network")
.AddConstructor ()
;
return tid;
@@ -556,6 +558,7 @@
{
static TypeId tid = TypeId ("ns3::RateErrorModel")
.SetParent ()
+ .SetGroupName ("Network")
.AddConstructor ()
...
diff -Naur ns-3.22/doc/manual/source/random-variables.rst ns-3.23/doc/manual/source/random-variables.rst
--- ns-3.22/doc/manual/source/random-variables.rst 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/manual/source/random-variables.rst 2015-05-13 11:05:26.000000000 -0700
@@ -277,6 +277,7 @@
{
static TypeId tid = TypeId ("ns3::RandomPropagationDelayModel")
.SetParent ()
+ .SetGroupName ("Propagation")
.AddConstructor ()
.AddAttribute ("Variable",
"The random variable which generates random delays (s).",
diff -Naur ns-3.22/doc/manual/source/test-framework.rst ns-3.23/doc/manual/source/test-framework.rst
--- ns-3.22/doc/manual/source/test-framework.rst 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/manual/source/test-framework.rst 2015-05-13 11:05:26.000000000 -0700
@@ -4,7 +4,7 @@
Testing framework
-----------------
-ns-3 consists of a simulation core engine, a set of models, example programs,
+|ns3| consists of a simulation core engine, a set of models, example programs,
and tests. Over time, new contributors contribute models, tests, and
examples. A Python test program ``test.py`` serves as the test
execution manager; ``test.py`` can run test code and examples to
@@ -17,7 +17,7 @@
BuildBots
*********
-At the highest level of ns-3 testing are the buildbots (build robots).
+At the highest level of |ns3| testing are the buildbots (build robots).
If you are unfamiliar with
this system look at ` `_.
This is an open-source automated system that allows |ns3| to be rebuilt
@@ -120,6 +120,17 @@
-e EXAMPLE, --example=EXAMPLE
specify a single example to run (no relative path is
needed)
+ -d, --duration print the duration of each test suite and example
+ -e EXAMPLE, --example=EXAMPLE
+ specify a single example to run (no relative path is
+ needed)
+ -u, --update-data If examples use reference data files, get them to re-
+ generate them
+ -f FULLNESS, --fullness=FULLNESS
+ choose the duration of tests to run: QUICK, EXTENSIVE,
+ or TAKES_FOREVER, where EXTENSIVE includes QUICK and
+ TAKES_FOREVER includes QUICK and EXTENSIVE (only QUICK
+ tests are run by default)
-g, --grind run the test suites and examples using valgrind
-k, --kinds print the kinds of tests available
-l, --list print the list of known tests
@@ -307,7 +318,7 @@
PASS: Example examples/udp/udp-echo
-You can specify the directory where ns-3 was built using the
+You can specify the directory where |ns3| was built using the
``--buildpath`` option as follows.
::
@@ -329,7 +340,7 @@
PASS: Example examples/tutorial/first.py
Because Python examples are not built, you do not need to specify the
-directory where ns-3 was built to run them.
+directory where |ns3| was built to run them.
Normally when example programs are executed, they write a large amount of trace
file data. This is normally saved to the base directory of the distribution
@@ -399,7 +410,7 @@
$ ./test.py --verbose
All of these options can be mixed and matched. For example, to run all of the
-ns-3 core test suites under valgrind, in verbose mode, while generating an HTML
+|ns3| core test suites under valgrind, in verbose mode, while generating an HTML
output file, one would do::
$ ./test.py --verbose --grind --constrain=core --html=results.html
@@ -417,14 +428,32 @@
* Examples
* Performance Tests
+Moreover, each test is further classified according to the expected time needed to
+run it. Tests are classified as:
+
+* QUICK
+* EXTENSIVE
+* TAKES_FOREVER
+
+Note that specifying EXTENSIVE fullness will also run tests in QUICK category.
+Specifying TAKES_FOREVER will run tests in EXTENSIVE and QUICK categories.
+By default, only QUICK tests are ran.
+
+As a rule of thumb, tests that must be run to ensure |ns3| coherence should be
+QUICK (i.e., take a few seconds). Tests that could be skipped, but are nice to do
+can be EXTENSIVE; these are tests that typically need minutes. TAKES_FOREVER is
+left for tests that take a really long time, in the order of several minutes.
+The main classification goal is to be able to run the buildbots in a reasonable
+time, and still be able to perform more extensive tests when needed.
+
BuildVerificationTests
++++++++++++++++++++++
These are relatively simple tests that are built along with the distribution
and are used to make sure that the build is pretty much working. Our
current unit tests live in the source files of the code they test and are
-built into the ns-3 modules; and so fit the description of BVTs. BVTs live
-in the same source code that is built into the ns-3 code. Our current tests
+built into the |ns3| modules; and so fit the description of BVTs. BVTs live
+in the same source code that is built into the |ns3| code. Our current tests
are examples of this kind of test.
Unit Tests
@@ -432,10 +461,10 @@
Unit tests are more involved tests that go into detail to make sure that a
piece of code works as advertised in isolation. There is really no reason
-for this kind of test to be built into an ns-3 module. It turns out, for
+for this kind of test to be built into an |ns3| module. It turns out, for
example, that the unit tests for the object name service are about the same
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,
+check a single bit of functionality that are not built into the |ns3| 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/test/names-test-suite.cc is an example of this kind
@@ -451,11 +480,11 @@
but they are typically overloaded examples. We provide a new place
for this kind of test in the directory ``src/test``. The file
src/test/ns3tcp/ns3-interop-test-suite.cc is an example of this kind of
-test. It uses NSC TCP to test the ns-3 TCP implementation. Often there
+test. It uses NSC TCP to test the |ns3| TCP implementation. Often there
will be test vectors required for this kind of test, and they are stored in
the directory where the test lives. For example,
ns3tcp-interop-response-vectors.pcap is a file consisting of a number of TCP
-headers that are used as the expected responses of the ns-3 TCP under test
+headers that are used as the expected responses of the |ns3| TCP under test
to a stimulus generated by the NSC TCP which is used as a ''known good''
implementation.
@@ -492,7 +521,7 @@
$ ./waf --configure --enable-examples --enable-tests
-Then, build ns-3, and after it is built, just run ``test.py``. ``test.py -h``
+Then, build |ns3|, and after it is built, just run ``test.py``. ``test.py -h``
will show a number of configuration options that modify the behavior
of test.py.
@@ -503,12 +532,19 @@
Debugging Tests
***************
-The debugging of the test programs is best performed running the low-level test-runner program. The test-runner is the bridge from generic Python code to |ns3| code. It is written in C++ and uses the automatic test discovery process in the
-|ns3| code to find and allow execution of all of the various tests.
-
-The main reason why ``test.py`` is not suitable for debugging is that it is not allowed for logging to be turned on using the ``NS_LOG`` environmental variable when test.py runs. This limitation does not apply to the test-runner executable. Hence, if you want to see logging output from your tests, you have to run them using the test-runner directly.
+The debugging of the test programs is best performed running the low-level
+test-runner program. The test-runner is the bridge from generic Python
+code to |ns3| code. It is written in C++ and uses the automatic test
+discovery process in the |ns3| code to find and allow execution of all
+of the various tests.
+
+The main reason why ``test.py`` is not suitable for debugging is that it is
+not allowed for logging to be turned on using the ``NS_LOG`` environmental
+variable when test.py runs. This limitation does not apply to the test-runner
+executable. Hence, if you want to see logging output from your tests, you
+have to run them using the test-runner directly.
-In order to execute the test-runner, you run it like any other ns-3 executable
+In order to execute the test-runner, you run it like any other |ns3| executable
-- using ``waf``. To get a list of available options, you can type::
$ ./waf --run "test-runner --help"
@@ -761,7 +797,7 @@
MyTestSuite::MyTestSuite ()
: TestSuite ("my-test-suite-name", UNIT)
{
- AddTestCase (new MyTestCase);
+ AddTestCase (new MyTestCase, TestCase::QUICK);
}
MyTestSuite myTestSuite;
diff -Naur ns-3.22/doc/models/Makefile ns-3.23/doc/models/Makefile
--- ns-3.22/doc/models/Makefile 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/models/Makefile 2015-05-13 11:05:26.000000000 -0700
@@ -250,6 +250,9 @@
$(SRC)/spectrum/doc/spectrum-channel-phy-interface.png \
$(SRC)/spectrum/doc/spectrum-channel-phy-interface.pdf \
$(SRC)/spectrum/doc/spectrum-analyzer-example.eps \
+ $(SRC)/spectrum/doc/spectrum-tv-rand-geo-points.eps \
+ $(SRC)/spectrum/doc/spectrum-tv-8vsb.png \
+ $(SRC)/spectrum/doc/spectrum-tv-cofdm.png \
$(SRC)/lr-wpan/doc/lr-wpan-arch.dia \
$(SRC)/lr-wpan/doc/lr-wpan-data-example.dia \
$(SRC)/lr-wpan/doc/lr-wpan-primitives.dia \
@@ -335,6 +338,7 @@
$(FIGURES)/lte-strongest-cell-handover-algorithm.eps \
$(FIGURES)/auvmobility-classes.eps \
$(FIGURES)/spectrum-analyzer-example.eps \
+ $(FIGURES)/spectrum-tv-rand-geo-points.eps \
$(FIGURES)/lr-wpan-primitives.eps \
$(FIGURES)/lr-wpan-data-example.eps \
$(FIGURES)/lr-wpan-arch.eps \
@@ -390,6 +394,7 @@
$(FIGURES)/helpers.pdf_width = 8cm
$(FIGURES)/auvmobility-classes.pdf_width = 10cm
$(FIGURES)/spectrum-analyzer-example.pdf_width = 15cm
+$(FIGURES)/spectrum-tv-rand-geo-points.pdf_width = 8cm
$(FIGURES)/lr-wpan-primitives.pdf_width = 3in
$(FIGURES)/lr-wpan-arch.pdf_width = 2in
diff -Naur ns-3.22/doc/models/source/conf.py ns-3.23/doc/models/source/conf.py
--- ns-3.22/doc/models/source/conf.py 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/models/source/conf.py 2015-05-13 11:05:26.000000000 -0700
@@ -48,9 +48,9 @@
# built documents.
#
# The short X.Y version.
-version = 'ns-3.22'
+version = 'ns-3.23'
# The full version, including alpha/beta/rc tags.
-release = 'ns-3.22'
+release = 'ns-3.23'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
diff -Naur ns-3.22/doc/tutorial/source/building-topologies.rst ns-3.23/doc/tutorial/source/building-topologies.rst
--- ns-3.22/doc/tutorial/source/building-topologies.rst 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/tutorial/source/building-topologies.rst 2015-05-13 11:05:26.000000000 -0700
@@ -24,7 +24,7 @@
this section. The appearance and operation of these helpers should look
quite familiar to you.
-We provide an example script in our examples/tutorial} directory. This script
+We provide an example script in our ``examples/tutorial`` directory. This script
builds on the ``first.cc`` script and adds a CSMA network to the
point-to-point simulation we've already considered. Go ahead and open
``examples/tutorial/second.cc`` in your favorite editor. You will have already seen
@@ -524,7 +524,7 @@
$ tcpdump -nn -tt -r second-0-0.pcap
-and see that the echoed packet arrives back at the source at 2.007602 seconds,
+and see that the echoed packet arrives back at the source at 2.017607 seconds,
.. sourcecode:: text
@@ -884,7 +884,7 @@
Next, we see an old friend. We instantiate a ``PointToPointHelper`` and
set the associated default ``Attributes`` so that we create a five megabit
per second transmitter on devices created using the helper and a two millisecond
-delay on channels created by the helper. We then ``Intall`` the devices
+delay on channels created by the helper. We then ``Install`` the devices
on the nodes and the channel between them.
::
@@ -1261,7 +1261,7 @@
packets in this trace. We leave it as an exercise to completely parse the
trace dump.
-Now, look at the pcap file of the right side of the point-to-point link,
+Now, look at the pcap file of the left side of the point-to-point link,
.. sourcecode:: bash
diff -Naur ns-3.22/doc/tutorial/source/conceptual-overview.rst ns-3.23/doc/tutorial/source/conceptual-overview.rst
--- ns-3.22/doc/tutorial/source/conceptual-overview.rst 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/tutorial/source/conceptual-overview.rst 2015-05-13 11:05:26.000000000 -0700
@@ -92,7 +92,7 @@
Net Device
++++++++++
-It used to be the case that if you wanted to connect a computers to a network,
+It used to be the case that if you wanted to connect a computer to a network,
you had to buy a specific kind of network cable and a hardware device called
(in PC terminology) a *peripheral card* that needed to be installed in
your computer. If the peripheral card implemented some networking function,
diff -Naur ns-3.22/doc/tutorial/source/conf.py ns-3.23/doc/tutorial/source/conf.py
--- ns-3.22/doc/tutorial/source/conf.py 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/tutorial/source/conf.py 2015-05-13 11:05:26.000000000 -0700
@@ -48,9 +48,9 @@
# built documents.
#
# The short X.Y version.
-version = 'ns-3.22'
+version = 'ns-3.23'
# The full version, including alpha/beta/rc tags.
-release = 'ns-3.22'
+release = 'ns-3.23'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
diff -Naur ns-3.22/doc/tutorial/source/data-collection.rst ns-3.23/doc/tutorial/source/data-collection.rst
--- ns-3.22/doc/tutorial/source/data-collection.rst 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/tutorial/source/data-collection.rst 2015-05-13 11:05:26.000000000 -0700
@@ -321,6 +321,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6PacketProbe")
.SetParent ()
+ .SetGroupName ("Stats")
.AddConstructor ()
.AddTraceSource ( "Output",
"The packet plus its IPv6 object and interface that serve as the output for this probe",
diff -Naur ns-3.22/doc/tutorial/source/getting-started.rst ns-3.23/doc/tutorial/source/getting-started.rst
--- ns-3.22/doc/tutorial/source/getting-started.rst 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/tutorial/source/getting-started.rst 2015-05-13 11:11:44.000000000 -0700
@@ -96,15 +96,15 @@
$ cd
$ mkdir workspace
$ cd workspace
- $ wget http://www.nsnam.org/release/ns-allinone-3.22.tar.bz2
- $ tar xjf ns-allinone-3.22.tar.bz2
+ $ wget http://www.nsnam.org/release/ns-allinone-3.23.tar.bz2
+ $ tar xjf ns-allinone-3.23.tar.bz2
-If you change into the directory ``ns-allinone-3.22`` you should see a
+If you change into the directory ``ns-allinone-3.23`` you should see a
number of files::
$ ls
- bake constants.py ns-3.22 README
- build.py netanim-3.105 pybindgen-0.16.0.886 util.py
+ bake constants.py ns-3.23 README
+ build.py netanim-3.106 pybindgen-0.17.0.886 util.py
You are now ready to build the base |ns3| distribution.
@@ -163,10 +163,10 @@
There are a few configuration targets available:
-1. ``ns-3.22``: the module corresponding to the release; it will download
+1. ``ns-3.23``: the module corresponding to the release; it will download
components similar to the release tarball.
2. ``ns-3-dev``: a similar module but using the development code tree
-3. ``ns-allinone-3.22``: the module that includes other optional features
+3. ``ns-allinone-3.23``: the module that includes other optional features
such as click routing, openflow for |ns3|, and the Network Simulation
Cradle
4. ``ns-3-allinone``: similar to the released version of the allinone
@@ -184,7 +184,7 @@
`"ns-3 Releases"
`_
web page and clicking on the latest release link. We'll proceed in
-this tutorial example with ``ns-3.22``.
+this tutorial example with ``ns-3.23``.
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.
@@ -210,7 +210,7 @@
Step into the workspace directory and type the following into your shell::
- $ ./bake.py configure -e ns-3.22
+ $ ./bake.py configure -e ns-3.23
Next, we'l ask bake to check whether we have enough tools to download
various components. Type::
@@ -256,17 +256,17 @@
>> Searching for system dependency pygoocanvas - OK
>> Searching for system dependency python-dev - OK
>> Searching for system dependency pygraphviz - OK
- >> Downloading pybindgen-0.16.0.886 - OK
+ >> Downloading pybindgen-0.17.0.886 - OK
>> Searching for system dependency g++ - OK
>> Searching for system dependency qt4 - OK
- >> Downloading netanim-3.105 - OK
- >> Downloading ns-3.22 - OK
+ >> Downloading netanim-3.106 - OK
+ >> Downloading ns-3.23 - OK
The above suggests that three sources have been downloaded. Check the
``source`` directory now and type ``ls``; one should see::
$ ls
- netanim-3.105 ns-3.22 pybindgen-0.16.0.886
+ netanim-3.106 ns-3.23 pybindgen-0.17.0.886
You are now ready to build the |ns3| distribution.
@@ -285,7 +285,7 @@
If you downloaded
using a tarball you should have a directory called something like
-``ns-allinone-3.22`` under your ``~/workspace`` directory.
+``ns-allinone-3.23`` under your ``~/workspace`` directory.
Type the following::
$ ./build.py --enable-examples --enable-tests
@@ -301,7 +301,7 @@
script builds the various pieces you downloaded. Eventually you should see the
following::
- Waf: Leaving directory `/path/to/workspace/ns-allinone-3.22/ns-3.22/build'
+ Waf: Leaving directory `/path/to/workspace/ns-allinone-3.23/ns-3.23/build'
'build' finished successfully (6m25.032s)
Modules built:
@@ -323,7 +323,7 @@
brite click openflow
visualizer
- Leaving directory `./ns-3.22'
+ Leaving directory `./ns-3.23'
Regarding the portion about modules not built::
@@ -349,9 +349,9 @@
and you should see something like::
- >> Building pybindgen-0.16.0.886 - OK
- >> Building netanim-3.105 - OK
- >> Building ns-3.22 - OK
+ >> Building pybindgen-0.17.0.886 - OK
+ >> Building netanim-3.106 - OK
+ >> Building ns-3.23 - OK
*Hint: you can also perform both steps, download and build by calling 'bake.py deploy'.*
@@ -664,7 +664,7 @@
$ ../../../waf ...
-but that get's tedious, and error prone, and there are better solutions.
+but that gets tedious, and error prone, and there are better solutions.
If you have the full |ns3| repository this little gem is a start::
@@ -848,7 +848,7 @@
Working Directory
+++++++++++++++++
-Waf needs to run from it's location at the top of the |ns3| tree.
+Waf needs to run from its location at the top of the |ns3| tree.
This becomes the working directory where output files will be written.
But what if you want to keep those ouf to the |ns3| source tree? Use
the ``--cwd`` argument::
diff -Naur ns-3.22/doc/tutorial/source/tracing.rst ns-3.23/doc/tutorial/source/tracing.rst
--- ns-3.22/doc/tutorial/source/tracing.rst 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/tutorial/source/tracing.rst 2015-05-13 11:05:26.000000000 -0700
@@ -365,6 +365,7 @@
{
static TypeId tid = TypeId ("MyObject")
.SetParent (Object::GetTypeId ())
+ .SetGroupName ("MyGroup")
.AddConstructor ()
.AddTraceSource ("MyInteger",
"An integer value to trace.",
diff -Naur ns-3.22/doc/tutorial/source/tweaking.rst ns-3.23/doc/tutorial/source/tweaking.rst
--- ns-3.22/doc/tutorial/source/tweaking.rst 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/tutorial/source/tweaking.rst 2015-05-13 11:05:26.000000000 -0700
@@ -632,6 +632,46 @@
--ns3::PointToPointChannel::Delay=2ms
--ns3::UdpEchoClient::MaxPackets=2"
+A natural question to arise at this point is how to learn about the existence
+of all of these attributes. Again, the command line help facility has
+a feature for this. If we ask for command line help we should see:
+
+.. sourcecode:: bash
+
+ $ ./waf --run "scratch/myfirst --PrintHelp"
+ myfirst [Program Arguments] [General Arguments]
+
+ General Arguments:
+ --PrintGlobals: Print the list of globals.
+ --PrintGroups: Print the list of groups.
+ --PrintGroup=[group]: Print all TypeIds of group.
+ --PrintTypeIds: Print all TypeIds.
+ --PrintAttributes=[typeid]: Print all attributes of typeid.
+ --PrintHelp: Print this help message.
+
+If you select the "PrintGroups" argument, you should see a list of all
+registered TypeId groups. The group names are aligned with the module names
+in the source directory (although with a leading capital letter). Printing
+out all of the information at once would be too much, so a further filter
+is available to print information on a per-group basis. So, focusing
+again on the point-to-point module:
+
+.. sourcecode:: bash
+
+ ./waf --run "scratch/myfirst --PrintGroup=PointToPoint"
+ TypeIds in group PointToPoint:
+ ns3::PointToPointChannel
+ ns3::PointToPointNetDevice
+ ns3::PointToPointRemoteChannel
+ ns3::PppHeader
+
+and from here, one can find the possible TypeId names to search for
+attributes, such as in the ``--PrintAttributes=ns3::PointToPointChannel``
+example shown above.
+
+Another way to find out about attributes is through the ns-3 Doxygen; there
+is a page that lists out all of the registered attributes in the simulator.
+
Hooking Your Own Values
+++++++++++++++++++++++
You can also add your own hooks to the command line system. This is done
diff -Naur ns-3.22/doc/tutorial-pt-br/source/conf.py ns-3.23/doc/tutorial-pt-br/source/conf.py
--- ns-3.22/doc/tutorial-pt-br/source/conf.py 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/doc/tutorial-pt-br/source/conf.py 2015-05-13 11:05:26.000000000 -0700
@@ -50,9 +50,9 @@
# built documents.
#
# The short X.Y version.
-version = 'ns-3.22'
+version = 'ns-3.23'
# The full version, including alpha/beta/rc tags.
-release = 'ns-3.22'
+release = 'ns-3.23'
# The language for content autogenerated by . Refer to babel documentation
# for a list of supported languages.
diff -Naur ns-3.22/examples/wireless/ht-wifi-network.cc ns-3.23/examples/wireless/ht-wifi-network.cc
--- ns-3.22/examples/wireless/ht-wifi-network.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/examples/wireless/ht-wifi-network.cc 2015-05-13 11:05:27.000000000 -0700
@@ -54,7 +54,7 @@
cmd.Parse (argc,argv);
std::cout << "DataRate" << "\t" << "Throughput" << '\n';
- for (int mcs = 0; mcs <= 31; mcs++)
+ for (int i = 0; i <= 31; i++)
{
uint32_t payloadSize; //1500 byte IP packet
if (udp)
@@ -76,17 +76,17 @@
YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();
phy.SetChannel (channel.Create ());
- if (mcs <= 7)
+ if (i <= 7)
{
phy.Set ("ShortGuardEnabled", BooleanValue (false));
phy.Set ("ChannelBonding", BooleanValue (false));
}
- else if (mcs > 7 && mcs <= 15)
+ else if (i > 7 && i <= 15)
{
phy.Set ("ShortGuardEnabled", BooleanValue (true));
phy.Set ("ChannelBonding", BooleanValue (false));
}
- else if (mcs > 15 && mcs <= 23)
+ else if (i > 15 && i <= 23)
{
phy.Set ("ShortGuardEnabled", BooleanValue (false));
phy.Set ("ChannelBonding", BooleanValue (true));
@@ -105,157 +105,157 @@
double datarate = 0;
StringValue DataRate;
- if (mcs == 0)
+ if (i == 0)
{
DataRate = StringValue ("OfdmRate6_5MbpsBW20MHz");
datarate = 6.5;
}
- else if (mcs == 1)
+ else if (i == 1)
{
DataRate = StringValue ("OfdmRate13MbpsBW20MHz");
datarate = 13;
}
- else if (mcs == 2)
+ else if (i == 2)
{
DataRate = StringValue ("OfdmRate19_5MbpsBW20MHz");
datarate = 19.5;
}
- else if (mcs == 3)
+ else if (i == 3)
{
DataRate = StringValue ("OfdmRate26MbpsBW20MHz");
datarate = 26;
}
- else if (mcs == 4)
+ else if (i == 4)
{
DataRate = StringValue ("OfdmRate39MbpsBW20MHz");
datarate = 39;
}
- else if (mcs == 5)
+ else if (i == 5)
{
DataRate = StringValue ("OfdmRate52MbpsBW20MHz");
datarate = 52;
}
- else if (mcs == 6)
+ else if (i == 6)
{
DataRate = StringValue ("OfdmRate58_5MbpsBW20MHz");
datarate = 58.5;
}
- else if (mcs == 7)
+ else if (i == 7)
{
DataRate = StringValue ("OfdmRate65MbpsBW20MHz");
datarate = 65;
}
- else if (mcs == 8)
+ else if (i == 8)
{
DataRate = StringValue ("OfdmRate7_2MbpsBW20MHz");
datarate = 7.2;
}
- else if (mcs == 9)
+ else if (i == 9)
{
DataRate = StringValue ("OfdmRate14_4MbpsBW20MHz");
datarate = 14.4;
}
- else if (mcs == 10)
+ else if (i == 10)
{
DataRate = StringValue ("OfdmRate21_7MbpsBW20MHz");
datarate = 21.7;
}
- else if (mcs == 11)
+ else if (i == 11)
{
DataRate = StringValue ("OfdmRate28_9MbpsBW20MHz");
datarate = 28.9;
}
- else if (mcs == 12)
+ else if (i == 12)
{
DataRate = StringValue ("OfdmRate43_3MbpsBW20MHz");
datarate = 43.3;
}
- else if (mcs == 13)
+ else if (i == 13)
{
DataRate = StringValue ("OfdmRate57_8MbpsBW20MHz");
datarate = 57.8;
}
- else if (mcs == 14)
+ else if (i == 14)
{
DataRate = StringValue ("OfdmRate65MbpsBW20MHzShGi");
datarate = 65;
}
- else if (mcs == 15)
+ else if (i == 15)
{
DataRate = StringValue ("OfdmRate72_2MbpsBW20MHz");
datarate = 72.2;
}
- else if (mcs == 16)
+ else if (i == 16)
{
DataRate = StringValue ("OfdmRate13_5MbpsBW40MHz");
datarate = 13.5;
}
- else if (mcs == 17)
+ else if (i == 17)
{
DataRate = StringValue ("OfdmRate27MbpsBW40MHz");
datarate = 27;
}
- else if (mcs == 18)
+ else if (i == 18)
{
DataRate = StringValue ("OfdmRate40_5MbpsBW40MHz");
datarate = 40.5;
}
- else if (mcs == 19)
+ else if (i == 19)
{
DataRate = StringValue ("OfdmRate54MbpsBW40MHz");
datarate = 54;
}
- else if (mcs == 20)
+ else if (i == 20)
{
DataRate = StringValue ("OfdmRate81MbpsBW40MHz");
datarate = 81;
}
- else if (mcs == 21)
+ else if (i == 21)
{
DataRate = StringValue ("OfdmRate108MbpsBW40MHz");
datarate = 108;
}
- else if (mcs == 22)
+ else if (i == 22)
{
DataRate = StringValue ("OfdmRate121_5MbpsBW40MHz");
datarate = 121.5;
}
- else if (mcs == 23)
+ else if (i == 23)
{
DataRate = StringValue ("OfdmRate135MbpsBW40MHz");
datarate = 135;
}
- else if (mcs == 24)
+ else if (i == 24)
{
DataRate = StringValue ("OfdmRate15MbpsBW40MHz");
datarate = 15;
}
- else if (mcs == 25)
+ else if (i == 25)
{
DataRate = StringValue ("OfdmRate30MbpsBW40MHz");
datarate = 30;
}
- else if (mcs == 26)
+ else if (i == 26)
{
DataRate = StringValue ("OfdmRate45MbpsBW40MHz");
datarate = 45;
}
- else if (mcs == 27)
+ else if (i == 27)
{
DataRate = StringValue ("OfdmRate60MbpsBW40MHz");
datarate = 60;
}
- else if (mcs == 28)
+ else if (i == 28)
{
DataRate = StringValue ("OfdmRate90MbpsBW40MHz");
datarate = 90;
}
- else if (mcs == 29)
+ else if (i == 29)
{
DataRate = StringValue ("OfdmRate120MbpsBW40MHz");
datarate = 120;
}
- else if (mcs == 30)
+ else if (i == 30)
{
DataRate = StringValue ("OfdmRate135MbpsBW40MHzShGi");
datarate = 135;
diff -Naur ns-3.22/examples/wireless/simple-ht-hidden-stations.cc ns-3.23/examples/wireless/simple-ht-hidden-stations.cc
--- ns-3.22/examples/wireless/simple-ht-hidden-stations.cc 1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/examples/wireless/simple-ht-hidden-stations.cc 2015-05-13 11:05:27.000000000 -0700
@@ -0,0 +1,179 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2015 Sébastien Deronne
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Author: Sébastien Deronne
+ */
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/applications-module.h"
+#include "ns3/wifi-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/internet-module.h"
+
+// This example considers two hidden stations in an 802.11n network which supports MPDU aggregation.
+// The user can specify whether RTS/CTS is used and can set the number of aggregated MPDUs.
+//
+// Example: ./waf --run "simple-ht-hidden-stations --enableRts=1 --nMpdus=8"
+//
+// Network topology:
+//
+// Wifi 192.168.1.0
+//
+// AP
+// * * *
+// | | |
+// n1 n2 n3
+//
+// Packets in this simulation aren't marked with a QosTag so they are considered
+// belonging to BestEffort Access Class (AC_BE).
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("SimplesHtHiddenStations");
+
+int main (int argc, char *argv[])
+{
+ uint32_t payloadSize = 1472; //bytes
+ uint64_t simulationTime = 10; //seconds
+ uint32_t nMpdus = 1;
+ bool enableRts = 0;
+
+ CommandLine cmd;
+ cmd.AddValue("nMpdus", "Number of aggregated MPDUs", nMpdus);
+ cmd.AddValue("payloadSize", "Payload size in bytes", payloadSize);
+ cmd.AddValue("enableRts", "Enable RTS/CTS", enableRts); // 1: RTS/CTS enabled; 0: RTS/CTS disabled
+ cmd.AddValue("simulationTime", "Simulation time in seconds", simulationTime);
+ cmd.Parse (argc, argv);
+
+ if(!enableRts)
+ Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("999999"));
+ else
+ Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("0"));
+
+ Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("990000"));
+
+ // Set the maximum wireless range to 5 meters in order to reproduce a hidden nodes scenario, i.e. the distance between hidden stations is larger than 5 meters
+ Config::SetDefault ("ns3::RangePropagationLossModel::MaxRange", DoubleValue (5));
+
+ NodeContainer wifiStaNodes;
+ wifiStaNodes.Create (2);
+ NodeContainer wifiApNode;
+ wifiApNode.Create(1);
+
+ YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
+ channel.AddPropagationLoss ("ns3::RangePropagationLossModel"); //wireless range limited to 5 meters!
+
+ YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();
+ phy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
+ phy.SetChannel (channel.Create());
+
+ WifiHelper wifi = WifiHelper::Default ();
+ wifi.SetStandard (WIFI_PHY_STANDARD_80211n_5GHZ);
+ wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue("OfdmRate65MbpsBW20MHz"), "ControlMode", StringValue("OfdmRate6_5MbpsBW20MHz"));
+ HtWifiMacHelper mac = HtWifiMacHelper::Default ();
+
+ Ssid ssid = Ssid ("simple-mpdu-aggregation");
+ mac.SetType ("ns3::StaWifiMac",
+ "Ssid", SsidValue (ssid),
+ "ActiveProbing", BooleanValue (false));
+
+ if (nMpdus > 1) mac.SetBlockAckThresholdForAc (AC_BE, 2); //enable Block ACK when A-MPDU is enabled
+
+ mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator",
+ "MaxAmpduSize", UintegerValue (nMpdus*(payloadSize+100))); //enable MPDU aggregation for AC_BE with a maximum aggregated size of nMpdus*(payloadSize+100) bytes,
+ //i.e. nMpdus aggregated packets in an A-MPDU
+
+ NetDeviceContainer staDevices;
+ staDevices = wifi.Install (phy, mac, wifiStaNodes);
+
+ mac.SetType ("ns3::ApWifiMac",
+ "Ssid", SsidValue (ssid),
+ "BeaconInterval", TimeValue (MicroSeconds(102400)),
+ "BeaconGeneration", BooleanValue (true));
+
+ if (nMpdus > 1) mac.SetBlockAckThresholdForAc (AC_BE, 2); //enable Block ACK when A-MPDU is enabled
+
+ mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator",
+ "MaxAmpduSize", UintegerValue (nMpdus*(payloadSize+100))); //enable MPDU aggregation for AC_BE with a maximum aggregated size of nMpdus*(payloadSize+100) bytes,
+ //i.e. nMpdus aggregated packets in an A-MPDU
+
+ NetDeviceContainer apDevice;
+ apDevice = wifi.Install (phy, mac, wifiApNode);
+
+ // Setting mobility model
+ MobilityHelper mobility;
+ Ptr positionAlloc = CreateObject ();
+
+ // AP is between the two stations, each station being located at 5 meters from the AP.
+ // The distance between the two stations is thus equal to 10 meters.
+ // Since the wireless range is limited to 5 meters, the two stations are hidden from each other.
+ positionAlloc->Add (Vector (5.0, 0.0, 0.0));
+ positionAlloc->Add (Vector (0.0, 0.0, 0.0));
+ positionAlloc->Add (Vector (10.0, 0.0, 0.0));
+ mobility.SetPositionAllocator (positionAlloc);
+
+ mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+
+ mobility.Install (wifiApNode);
+ mobility.Install (wifiStaNodes);
+
+ // Internet stack
+ InternetStackHelper stack;
+ stack.Install (wifiApNode);
+ stack.Install (wifiStaNodes);
+
+ Ipv4AddressHelper address;
+
+ address.SetBase ("192.168.1.0", "255.255.255.0");
+ Ipv4InterfaceContainer StaInterface;
+ StaInterface = address.Assign (staDevices);
+ Ipv4InterfaceContainer ApInterface;
+ ApInterface = address.Assign (apDevice);
+
+ // Setting applications
+ UdpServerHelper myServer (9);
+ ApplicationContainer serverApp = myServer.Install (wifiApNode);
+ serverApp.Start (Seconds (0.0));
+ serverApp.Stop (Seconds (simulationTime+1));
+
+ UdpClientHelper myClient (ApInterface.GetAddress (0), 9);
+ myClient.SetAttribute ("MaxPackets", UintegerValue (4294967295u));
+ myClient.SetAttribute ("Interval", TimeValue (Time ("0.00002"))); //packets/s
+ myClient.SetAttribute ("PacketSize", UintegerValue (payloadSize));
+
+ // Saturated UDP traffic from stations to AP
+ ApplicationContainer clientApp1 = myClient.Install (wifiStaNodes);
+ clientApp1.Start (Seconds (1.0));
+ clientApp1.Stop (Seconds (simulationTime+1));
+
+ phy.EnablePcap ("SimpleHtHiddenStations_Ap", apDevice.Get (0));
+ phy.EnablePcap ("SimpleHtHiddenStations_Sta1", staDevices.Get (0));
+ phy.EnablePcap ("SimpleHtHiddenStations_Sta2", staDevices.Get (1));
+
+ Simulator::Stop (Seconds (simulationTime+1));
+
+ Simulator::Run ();
+ Simulator::Destroy ();
+
+ uint32_t totalPacketsThrough = DynamicCast(serverApp.Get (0))->GetReceived ();
+ double throughput = totalPacketsThrough*payloadSize*8/(simulationTime*1000000.0);
+ std::cout << "Throughput: " << throughput << " Mbit/s" << '\n';
+
+ return 0;
+}
diff -Naur ns-3.22/examples/wireless/simple-two-level-aggregation.cc ns-3.23/examples/wireless/simple-two-level-aggregation.cc
--- ns-3.22/examples/wireless/simple-two-level-aggregation.cc 1969-12-31 16:00:00.000000000 -0800
+++ ns-3.23/examples/wireless/simple-two-level-aggregation.cc 2015-05-13 11:05:27.000000000 -0700
@@ -0,0 +1,214 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2015 Sébastien Deronne
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Author: Sébastien Deronne
+ */
+
+#include "ns3/core-module.h"
+#include "ns3/network-module.h"
+#include "ns3/applications-module.h"
+#include "ns3/wifi-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/internet-module.h"
+
+// This is a simple example in order to show how 802.11n two-level aggregation feature works.
+// Two-level aggregation is the simultaneous use of MSDU and MPDU aggregation schemes (known as one-level aggregation techniques).
+//
+// The throughput is obtained for a given number of aggregated MSDUs and MPDUs.
+// The number of aggregated MSDUs and MPDUs can be chosen by the user through the nMsdus and nMpdus attibutes, respectively.
+//
+// Example: ./waf --run "simple-two-level-aggregation --nMsdus=3 --nMpdus=8"
+//
+// Network topology:
+//
+// Wifi 192.168.1.0
+//
+// AP
+// * *
+// | |
+// n1 n2
+//
+// Packets in this simulation aren't marked with a QosTag so they are considered
+// belonging to BestEffort Access Class (AC_BE).
+//
+// Throughput gets higher as either nMsdus or nMpdus is increased (one-level aggregation),
+// or when both nMsdus and nMpdus are increases (two-level aggregation).
+// MSDU aggregation offers a better header reduction compare to MPDU aggregation,
+// while MPDU aggregation is more robust against transmission errors than MSDU aggregation.
+// The good setting of nMsdu and nMpdus will depends on various factors (payload size, channel conditions, ...).
+// Since this example considers an ideal channel, the highest throughput is obtained with the largest values for nMsdus and nMpdus parameters.
+// Users should nevertheless take care that the standard rules limit the maximum MSDU size to 7935 bytes and the MPDU size to 65535 bytes.
+// Consequently, more packets should be aggregated if their payload is small with standard-compliant parameters.
+// Users should also note that the maximum duration of the frame is limited by the standard.
+// As a result, higher values for nMsdus and nMpdus may not always provide throughput improvements.
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("SimpleTwoLevelAggregation");
+
+int main (int argc, char *argv[])
+{
+ uint32_t payloadSize = 1472; //bytes
+ uint64_t simulationTime = 10; //seconds
+ uint32_t nMsdus = 1;
+ uint32_t nMpdus = 1;
+ bool enableRts = 0;
+
+ CommandLine cmd;
+ cmd.AddValue ("nMsdus", "Number of aggregated MSDUs", nMsdus); //number of aggregated MSDUs specified by the user
+ cmd.AddValue ("nMpdus", "Number of aggregated MPDUs", nMpdus); //number of aggregated MPDUs specified by the user
+ cmd.AddValue ("payloadSize", "Payload size in bytes", payloadSize);
+ cmd.AddValue ("enableRts", "Enable RTS/CTS", enableRts);
+ cmd.AddValue ("simulationTime", "Simulation time in seconds", simulationTime);
+ cmd.Parse (argc, argv);
+
+ if (!enableRts)
+ {
+ Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("999999"));
+ }
+ else
+ {
+ Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("0"));
+ }
+
+ Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("990000"));
+
+ NodeContainer wifiStaNode;
+ wifiStaNode.Create (1);
+ NodeContainer wifiApNode;
+ wifiApNode.Create (1);
+
+ YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
+ YansWifiPhyHelper phy = YansWifiPhyHelper::Default ();
+ phy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO);
+ phy.SetChannel (channel.Create ());
+
+ WifiHelper wifi = WifiHelper::Default ();
+ wifi.SetStandard (WIFI_PHY_STANDARD_80211n_5GHZ);
+ //We consider a constant bitrate since HT rate adaptation algorithms are not supported yet in the simulator
+ wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
+ "DataMode", StringValue ("OfdmRate65MbpsBW20MHz"),
+ "ControlMode", StringValue ("OfdmRate6_5MbpsBW20MHz"));
+ HtWifiMacHelper mac = HtWifiMacHelper::Default ();
+
+ Ssid ssid = Ssid ("simple-two-level-aggregation");
+ mac.SetType ("ns3::StaWifiMac",
+ "Ssid", SsidValue (ssid),
+ "ActiveProbing", BooleanValue (false));
+
+
+ //Enable aggregation at the station side
+ if (nMpdus > 1)
+ {
+ mac.SetBlockAckThresholdForAc (AC_BE, 2); //enable BlockAck when A-MPDU is used
+ }
+ if (nMsdus > 0)
+ {
+ mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator",
+ "MaxAmpduSize", UintegerValue (nMpdus * (nMsdus * (payloadSize + 100)))); //Set the maximum size for A-MPDU with regards to the payload size and the number of MSDUs expected in each MPDU.
+ }
+ else //MPDU aggregation only (one-level aggregation)
+ {
+ mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator",
+ "MaxAmpduSize", UintegerValue (nMpdus * (payloadSize + 200))); //Set the maximum size for A-MPDU with regards to the payload size
+ }
+ mac.SetMsduAggregatorForAc (AC_BE,"ns3::MsduStandardAggregator",
+ "MaxAmsduSize", UintegerValue (nMsdus * (payloadSize + 100))); //Set the maximum size for A-MSDU with regards to the payload size
+
+
+ NetDeviceContainer staDevice;
+ staDevice = wifi.Install (phy, mac, wifiStaNode);
+
+ mac.SetType ("ns3::ApWifiMac",
+ "Ssid", SsidValue (ssid),
+ "BeaconInterval", TimeValue (MicroSeconds (102400)),
+ "BeaconGeneration", BooleanValue (true));
+
+ //Enable aggregation at the AP side
+ if (nMpdus > 1)
+ {
+ mac.SetBlockAckThresholdForAc (AC_BE, 2); //enable BlockAck when A-MPDU is used
+ }
+ if (nMsdus > 0)
+ {
+ mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator",
+ "MaxAmpduSize", UintegerValue (nMpdus * (nMsdus * (payloadSize + 100)))); //Set the maximum size for A-MPDU according to the payload size and the number of MSDUs expected in each MPDU.
+ }
+ else //MPDU aggregation only (one-level aggregation)
+ {
+ mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator",
+ "MaxAmpduSize", UintegerValue (nMpdus * (payloadSize + 200))); //Set the maximum size for A-MPDU with regards to the payload size
+ }
+ mac.SetMsduAggregatorForAc (AC_BE,"ns3::MsduStandardAggregator",
+ "MaxAmsduSize", UintegerValue (nMsdus * (payloadSize + 100))); //Set the maximum size for A-MSDU with regards to the payload size
+
+ NetDeviceContainer apDevice;
+ apDevice = wifi.Install (phy, mac, wifiApNode);
+
+ /* Setting mobility model */
+ MobilityHelper mobility;
+ Ptr positionAlloc = CreateObject ();
+
+ 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);
+
+ /* Internet stack*/
+ InternetStackHelper stack;
+ stack.Install (wifiApNode);
+ stack.Install (wifiStaNode);
+
+ Ipv4AddressHelper address;
+
+ address.SetBase ("192.168.1.0", "255.255.255.0");
+ Ipv4InterfaceContainer StaInterface;
+ StaInterface = address.Assign (staDevice);
+ Ipv4InterfaceContainer ApInterface;
+ ApInterface = address.Assign (apDevice);
+
+ /* Setting applications */
+ UdpServerHelper myServer (9);
+ ApplicationContainer serverApp = myServer.Install (wifiStaNode.Get (0));
+ serverApp.Start (Seconds (0.0));
+ serverApp.Stop (Seconds (simulationTime + 1));
+
+ UdpClientHelper myClient (StaInterface.GetAddress (0), 9);
+ myClient.SetAttribute ("MaxPackets", UintegerValue (4294967295u));
+ myClient.SetAttribute ("Interval", TimeValue (Time ("0.00002"))); //packets/s
+ myClient.SetAttribute ("PacketSize", UintegerValue (payloadSize));
+
+ ApplicationContainer clientApp = myClient.Install (wifiApNode.Get (0));
+ clientApp.Start (Seconds (1.0));
+ clientApp.Stop (Seconds (simulationTime + 1));
+
+ Simulator::Stop (Seconds (simulationTime + 1));
+
+ Simulator::Run ();
+ Simulator::Destroy ();
+
+ uint32_t totalPacketsThrough = DynamicCast (serverApp.Get (0))->GetReceived ();
+ double throughput = totalPacketsThrough * payloadSize * 8 / (simulationTime * 1000000.0);
+ std::cout << "Throughput: " << throughput << " Mbit/s" << '\n';
+
+ return 0;
+}
diff -Naur ns-3.22/examples/wireless/wifi-wired-bridging.cc ns-3.23/examples/wireless/wifi-wired-bridging.cc
--- ns-3.22/examples/wireless/wifi-wired-bridging.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/examples/wireless/wifi-wired-bridging.cc 2015-05-13 11:05:27.000000000 -0700
@@ -24,7 +24,7 @@
// +-----+ +-----+ +-----+ +-----+
// | STA | | STA | | STA | | STA |
// +-----+ +-----+ +-----+ +-----+
-// 192.168.0.3 192.168.0.4 192.168.0.5 192.168.0.6
+// 192.168.0.2 192.168.0.3 192.168.0.5 192.168.0.6
// -------- -------- -------- --------
// WIFI STA WIFI STA WIFI STA WIFI STA
// -------- -------- -------- --------
@@ -37,7 +37,7 @@
// ############## ##############
// BRIDGE BRIDGE
// ############## ##############
-// 192.168.0.1 192.168.0.2
+// 192.168.0.1 192.168.0.4
// +---------+ +---------+
// | AP Node | | AP Node |
// +---------+ +---------+
diff -Naur ns-3.22/examples/wireless/wscript ns-3.23/examples/wireless/wscript
--- ns-3.22/examples/wireless/wscript 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/examples/wireless/wscript 2015-05-13 11:05:27.000000000 -0700
@@ -71,4 +71,10 @@
obj.source = 'rate-adaptation-distance.cc'
obj = bld.create_ns3_program('simple-mpdu-aggregation', ['internet', 'mobility', 'wifi', 'applications'])
- obj.source = 'simple-mpdu-aggregation.cc'
\ No newline at end of file
+ obj.source = 'simple-mpdu-aggregation.cc'
+
+ obj = bld.create_ns3_program('simple-two-level-aggregation', ['internet', 'mobility', 'wifi', 'applications'])
+ obj.source = 'simple-two-level-aggregation.cc'
+
+ obj = bld.create_ns3_program('simple-ht-hidden-stations', ['internet', 'mobility', 'wifi', 'applications'])
+ obj.source = 'simple-ht-hidden-stations.cc'
diff -Naur ns-3.22/RELEASE_NOTES ns-3.23/RELEASE_NOTES
--- ns-3.22/RELEASE_NOTES 2015-02-05 16:17:45.000000000 -0800
+++ ns-3.23/RELEASE_NOTES 2015-05-13 11:05:26.000000000 -0700
@@ -9,6 +9,72 @@
Consult the file CHANGES.html for more detailed information about changed
API and behavior across ns-3 releases.
+Release 3.23
+============
+
+Availability
+------------
+This release is available from:
+http://www.nsnam.org/release/ns-allinone-3.23.tar.bz2
+
+Supported platforms
+-------------------
+This release has been tested on the following platforms:
+- Ubuntu 15.04 (64 bit) with g++-4.9.2
+- Fedora Core 21 (64 bit) with g++-4.9.2
+- Ubuntu 14.04 (64 bit) with g++-4.8.2
+- Ubuntu 12.04.4 (32/64 bit) with g++-4.6.3
+- CentOS/RHEL 6.6 (64-bit) with g++-4.4.7
+- OS X Yosemite 10.10.3 with Xcode 6.3.1 and Apple LLVM version 6.1.0
+- FreeBSD 10.1-RELEASE (64 bit) with clang-3.4.1
+
+New user-visible features
+-------------------------
+- (network) CalculateTxTime has been declared obsolete.
+ CalculateBytesTxTime and CalculateBitsTxTime are to be used instead.
+ The return value is a Time, instead of a double.
+- (mobility) Classes added for converting geographic to cartesian coordinates.
+- (spectrum) TvSpectrumTransmitter models added to create television
+ transmitter(s) that transmit PSD spectrums customized by attributes such
+ as modulation type, power, antenna type, channel frequency, etc.
+- (wifi) Several model improvements have been made. Access points now
+ establish BSSBasicRateSet for control frame transmissions. PLCP header
+ and payload reception have been decoupled for improved PHY modeling
+ accuracy. RTS/CTS with A-MPDU is now fully supported, and 802.11n
+ stations now support two-level aggregation.
+
+Bugs fixed
+----------
+- Bug 1757 - RLC AM not using NACK_SN
+- Bug 1974 - CalculateTxTime should return a Time, not a double
+- Bug 1982 - AODV and mesh use random variables before seed can be set
+- Bug 2004 - Wrong timeout calculation for 802.11n in WifiMac
+- Bug 2008 - (lr-wpan) Crash if ending rx while status change is in progress
+- Bug 2025 - (lr-wpan) Changing the channel doesn't affect the Tx params
+- Bug 2034 - (lr-wpan) CSMA-CA BackoffPeriod is too short
+- Bug 2054 - TCP window update can shrink the Left Edge of the window
+- Bug 2066 - A-MPDU reception should check for successful preamble
+- Bug 2067 - TCP performance when advertised window exceeds sender buffer size
+- Bug 2070 - Wrong report of Packets and Bytes stored in CoDeL
+- Bug 2073 - NDisc cache entries update timer might be stuck in a loop
+- Bug 2075 - A-MPDU using RTS/CTS behaves wrongly when MaxSsrc is reached
+- Bug 2076 - TCP MinRTO Attribute is not actually used
+- Bug 2077 - Icmpv6L4Protocol::HandleDestinationUnreachable must check the packet size, not its serialized size
+- Bug 2079 - mcs variable in ht-wifi-network example is confusing
+- Bug 2082 - Empirical RV fails if the value provided in the CDF member function is negative
+- Bug 2083 - BridgeNetDevice may send corrupted packets
+- Bug 2087 - Waf fails to build ns-3 if the path contains accented characters
+- Bug 2090 - (rip-ng) Routes may be added twice on interface activation
+- Bug 2093 - MultiModelSpectrumChannel::GetDevice only works for 0-th index
+- Bug 2095 - (wimax) Wrong values in default-traces.h for 16 QAM 3/4
+- Bug 2097 - ACKs should be sent using legacy rates and preambles in 802.11n
+- Bug 2103 - Ipv[4,6]RoutingHelper::PrintRoutingTableAll[At,Every] hangs if a node doesn't have IP
+
+Known issues
+------------
+In general, known issues are tracked on the project tracker available
+at http://www.nsnam.org/bugzilla/
+
Release 3.22
============
diff -Naur ns-3.22/src/antenna/model/antenna-model.cc ns-3.23/src/antenna/model/antenna-model.cc
--- ns-3.22/src/antenna/model/antenna-model.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/antenna/model/antenna-model.cc 2015-05-13 11:05:27.000000000 -0700
@@ -44,6 +44,7 @@
{
static TypeId tid = TypeId ("ns3::AntennaModel")
.SetParent ()
+ .SetGroupName("Antenna")
;
return tid;
}
diff -Naur ns-3.22/src/antenna/model/cosine-antenna-model.cc ns-3.23/src/antenna/model/cosine-antenna-model.cc
--- ns-3.22/src/antenna/model/cosine-antenna-model.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/antenna/model/cosine-antenna-model.cc 2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
{
static TypeId tid = TypeId ("ns3::CosineAntennaModel")
.SetParent ()
+ .SetGroupName("Antenna")
.AddConstructor ()
.AddAttribute ("Beamwidth",
"The 3dB beamwidth (degrees)",
diff -Naur ns-3.22/src/antenna/model/isotropic-antenna-model.cc ns-3.23/src/antenna/model/isotropic-antenna-model.cc
--- ns-3.22/src/antenna/model/isotropic-antenna-model.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/antenna/model/isotropic-antenna-model.cc 2015-05-13 11:05:27.000000000 -0700
@@ -37,6 +37,7 @@
{
static TypeId tid = TypeId ("ns3::IsotropicAntennaModel")
.SetParent ()
+ .SetGroupName("Antenna")
.AddConstructor ()
;
return tid;
diff -Naur ns-3.22/src/antenna/model/parabolic-antenna-model.cc ns-3.23/src/antenna/model/parabolic-antenna-model.cc
--- ns-3.22/src/antenna/model/parabolic-antenna-model.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/antenna/model/parabolic-antenna-model.cc 2015-05-13 11:05:27.000000000 -0700
@@ -39,6 +39,7 @@
{
static TypeId tid = TypeId ("ns3::ParabolicAntennaModel")
.SetParent ()
+ .SetGroupName("Antenna")
.AddConstructor ()
.AddAttribute ("Beamwidth",
"The 3dB beamwidth (degrees)",
diff -Naur ns-3.22/src/aodv/bindings/modulegen__gcc_ILP32.py ns-3.23/src/aodv/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/aodv/bindings/modulegen__gcc_ILP32.py 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/bindings/modulegen__gcc_ILP32.py 2015-05-13 11:05:27.000000000 -0700
@@ -7648,6 +7648,11 @@
[param('ns3::Time', 't')])
## aodv-routing-protocol.h (module 'aodv'): ns3::aodv::RoutingProtocol::AODV_PORT [variable]
cls.add_static_attribute('AODV_PORT', 'uint32_t const', is_const=True)
+ ## aodv-routing-protocol.h (module 'aodv'): void ns3::aodv::RoutingProtocol::DoInitialize() [member function]
+ cls.add_method('DoInitialize',
+ 'void',
+ [],
+ visibility='protected', is_virtual=True)
return
def register_Ns3AodvRoutingTable_methods(root_module, cls):
diff -Naur ns-3.22/src/aodv/bindings/modulegen__gcc_LP64.py ns-3.23/src/aodv/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/aodv/bindings/modulegen__gcc_LP64.py 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/bindings/modulegen__gcc_LP64.py 2015-05-13 11:05:27.000000000 -0700
@@ -7648,6 +7648,11 @@
[param('ns3::Time', 't')])
## aodv-routing-protocol.h (module 'aodv'): ns3::aodv::RoutingProtocol::AODV_PORT [variable]
cls.add_static_attribute('AODV_PORT', 'uint32_t const', is_const=True)
+ ## aodv-routing-protocol.h (module 'aodv'): void ns3::aodv::RoutingProtocol::DoInitialize() [member function]
+ cls.add_method('DoInitialize',
+ 'void',
+ [],
+ visibility='protected', is_virtual=True)
return
def register_Ns3AodvRoutingTable_methods(root_module, cls):
diff -Naur ns-3.22/src/aodv/doc/aodv.rst ns-3.23/src/aodv/doc/aodv.rst
--- ns-3.22/src/aodv/doc/aodv.rst 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/doc/aodv.rst 2015-05-13 11:05:27.000000000 -0700
@@ -94,37 +94,43 @@
No announced plans.
-References
-++++++++++
-
-
-Usage
-*****
-
-Examples
-++++++++
-
-Helpers
-+++++++
-
-Attributes
-++++++++++
-
-Tracing
-+++++++
-
-Logging
-+++++++
-
-Caveats
-+++++++
-
-Validation
-**********
-
-Unit tests
-++++++++++
-
-Larger-scale performance tests
-++++++++++++++++++++++++++++++
+..
+ References
+ ++++++++++
+
+..
+ Usage
+ *****
+
+..
+ Examples
+ ++++++++
+
+..
+ Helpers
+ +++++++
+
+..
+ Attributes
+ ++++++++++
+
+..
+ Tracing
+ +++++++
+
+..
+ Logging
+ +++++++
+
+..
+ Caveats
+ +++++++
+
+..
+ Validation
+ **********
+ Unit tests
+ ++++++++++
+ Larger-scale performance tests
+ ++++++++++++++++++++++++++++++
diff -Naur ns-3.22/src/aodv/model/aodv-packet.cc ns-3.23/src/aodv/model/aodv-packet.cc
--- ns-3.22/src/aodv/model/aodv-packet.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/model/aodv-packet.cc 2015-05-13 11:05:27.000000000 -0700
@@ -46,6 +46,7 @@
{
static TypeId tid = TypeId ("ns3::aodv::TypeHeader")
.SetParent ()
+ .SetGroupName("Aodv")
.AddConstructor ()
;
return tid;
@@ -153,6 +154,7 @@
{
static TypeId tid = TypeId ("ns3::aodv::RreqHeader")
.SetParent ()
+ .SetGroupName("Aodv")
.AddConstructor ()
;
return tid;
@@ -292,6 +294,7 @@
{
static TypeId tid = TypeId ("ns3::aodv::RrepHeader")
.SetParent ()
+ .SetGroupName("Aodv")
.AddConstructor ()
;
return tid;
@@ -434,6 +437,7 @@
{
static TypeId tid = TypeId ("ns3::aodv::RrepAckHeader")
.SetParent ()
+ .SetGroupName("Aodv")
.AddConstructor ()
;
return tid;
@@ -500,6 +504,7 @@
{
static TypeId tid = TypeId ("ns3::aodv::RerrHeader")
.SetParent ()
+ .SetGroupName("Aodv")
.AddConstructor ()
;
return tid;
diff -Naur ns-3.22/src/aodv/model/aodv-routing-protocol.cc ns-3.23/src/aodv/model/aodv-routing-protocol.cc
--- ns-3.22/src/aodv/model/aodv-routing-protocol.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/model/aodv-routing-protocol.cc 2015-05-13 11:05:27.000000000 -0700
@@ -67,6 +67,7 @@
{
static TypeId tid = TypeId ("ns3::aodv::DeferredRouteOutputTag").SetParent ()
.SetParent ()
+ .SetGroupName("Aodv")
.AddConstructor ()
;
return tid;
@@ -158,6 +159,7 @@
{
static TypeId tid = TypeId ("ns3::aodv::RoutingProtocol")
.SetParent ()
+ .SetGroupName("Aodv")
.AddConstructor ()
.AddAttribute ("HelloInterval", "HELLO messages emission interval.",
TimeValue (Seconds (1)),
@@ -580,12 +582,6 @@
NS_ASSERT (ipv4 != 0);
NS_ASSERT (m_ipv4 == 0);
- if (EnableHello)
- {
- m_htimer.SetFunction (&RoutingProtocol::HelloTimerExpire, this);
- m_htimer.Schedule (MilliSeconds (m_uniformRandomVariable->GetInteger (0, 100)));
- }
-
m_ipv4 = ipv4;
// Create lo route. It is asserted that the only one interface up for now is loopback
@@ -1928,5 +1924,20 @@
return socket;
}
+void
+RoutingProtocol::DoInitialize (void)
+{
+ NS_LOG_FUNCTION (this);
+ uint32_t startTime;
+ if (EnableHello)
+ {
+ m_htimer.SetFunction (&RoutingProtocol::HelloTimerExpire, this);
+ startTime = m_uniformRandomVariable->GetInteger (0, 100);
+ NS_LOG_DEBUG ("Starting at time " << startTime << "ms");
+ m_htimer.Schedule (MilliSeconds (startTime));
+ }
+ Ipv4RoutingProtocol::DoInitialize ();
}
-}
+
+} //namespace aodv
+} //namespace ns3
diff -Naur ns-3.22/src/aodv/model/aodv-routing-protocol.h ns-3.23/src/aodv/model/aodv-routing-protocol.h
--- ns-3.22/src/aodv/model/aodv-routing-protocol.h 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/model/aodv-routing-protocol.h 2015-05-13 11:05:27.000000000 -0700
@@ -97,6 +97,8 @@
*/
int64_t AssignStreams (int64_t stream);
+protected:
+ virtual void DoInitialize (void);
private:
// Protocol parameters.
diff -Naur ns-3.22/src/aodv/test/aodv-chain-regression-test-0-0.pcap ns-3.23/src/aodv/test/aodv-chain-regression-test-0-0.pcap
--- ns-3.22/src/aodv/test/aodv-chain-regression-test-0-0.pcap 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/test/aodv-chain-regression-test-0-0.pcap 2015-05-13 11:05:27.000000000 -0700
@@ -1,48 +1,48 @@
-ò i X X E 4
+ò i X X E 4
(
- x X X E 4
+ X X E 4
(
- T T E 0
+ y T T E 0
- 4 @ @ <