Você está na página 1de 2518

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)
Sbastien 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 Grubii (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)
Bjrn 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.</p>
<hr>
+<h1>Changes from ns-3.22 to ns-3.23</h1>
+<h2>New API:</h2>
+<ul>
+ <li> The mobility module includes a GeographicPositions class used to
+convert geographic to cartesian coordinates, and to generate randomly
+distributed geographic coordinates.

+ </li>
+ <li> The spectrum module includes new TvSpectrumTransmitter classes and help
ers to create television transmitter(s) that transmit PSD spectrums customized b
y attributes such as modulation type, power, antenna type, channel frequency, et
c.
+ </li>
+</ul>
+<h2>Changes to existing API:</h2>
+<ul>
+ <li> In LteSpectrumPhy, LtePhyTxEndCallback and the corresponding methods hav
e been removed, since they were unused.
+ </li>
+ <li> In the DataRate class in the network module, CalculateTxTime has been de
clared deprecated. CalculateBytesTxTime and CalculateBitsTxTime are to be used
instead. The return value is a Time, instead of a double.
+ </li>
+ <li> In the Wi-Fi InterferenceHelper, the interference event now takes the Wi
fiTxVector as an input parameter, instead of the WifiMode. A similar change was
made to the WifiPhy::RxOkCallback signature.
+ </li>
+</ul>
+<h2>Changes to build system:</h2>
+<ul>
+ <li> None </li>
+</ul>
+<h2>Changed behavior:</h2>
+This section is for behavioral changes to the models that were not due to a bug
fix.
+<ul>
+ <li> In Wi-Fi, HT stations (802.11n) now support two-level aggregation. The I
nterferenceHelper now distinguishes between the PLCP and regular payload recepti
on, for higher fidelity modeling. ACKs are now sent using legacy rates and prea
mbles. Acces points now establish BSSBasicRateSet for control frame transmissio
ns. PLCP header and PLCP payload reception have been decoupled to improve PHY l
ayer modeling accuracy. RTS/CTS with A-MPDU is now fully supported.
+ </li>
+ <li> The mesh module was made more compliant to the IEEE 802.11s-2012 standar
d and packet traces are now parseable by Wireshark.
+ </li>
+</ul>
+
+<hr>
<h1>Changes from ns-3.21 to ns-3.22</h1>
<h2>New API:</h2>
<ul>
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
+PROJECT_NUMBER

= "3-dev"
= "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/at
tributes.rst
--- ns-3.22/doc/manual/source/attributes.rst
2015-02-05 15:46:22.000000000 -0

800
+++ ns-3.23/doc/manual/source/attributes.rst
2015-05-13 11:05:26.000000000 -0
700
@@ -165,6 +165,7 @@
{
static TypeId tid = TypeId ("ns3::Node")
.SetParent<Object> ()
+
.SetGroupName ("Network")
.AddConstructor<Node> ()
.AddAttribute ("DeviceList",
"The list of devices associated to this Node.",
@@ -300,6 +301,7 @@
{
static TypeId tid = TypeId ("ns3::DropTailQueue")
.SetParent<Queue> ()
+
.SetGroupName ("Network")
.AddConstructor<DropTailQueue> ()
.AddAttribute ("MaxPackets",
"The maximum number of packets accepted by this DropTail
Queue.",
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/ne
w-models.rst
--- ns-3.22/doc/manual/source/new-models.rst
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/doc/manual/source/new-models.rst
2015-05-13 11:05:26.000000000 -0
700
@@ -341,6 +341,7 @@
{
static TypeId tid = TypeId ("ns3::ErrorModel")
.SetParent<Object> ()
+
.SetGroupName ("Network")
;
return tid;
}
@@ -359,6 +360,7 @@
{
static TypeId tid = TypeId ("ns3::RateErrorModel")
.SetParent<ErrorModel> ()
+
.SetGroupName ("Network")
.AddConstructor<RateErrorModel> ()
;
return tid;
@@ -556,6 +558,7 @@
{
static TypeId tid = TypeId ("ns3::RateErrorModel")

.SetParent<ErrorModel> ()
.SetGroupName ("Network")
.AddConstructor<RateErrorModel> ()
...

diff -Naur ns-3.22/doc/manual/source/random-variables.rst ns-3.23/doc/manual/sou


rce/random-variables.rst
--- ns-3.22/doc/manual/source/random-variables.rst
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/doc/manual/source/random-variables.rst
2015-05-13 11:05:26.0000
00000 -0700
@@ -277,6 +277,7 @@
{
static TypeId tid = TypeId ("ns3::RandomPropagationDelayModel")
.SetParent<PropagationDelayModel> ()
+
.SetGroupName ("Propagation")
.AddConstructor<RandomPropagationDelayModel> ()
.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/sourc
e/test-framework.rst
--- ns-3.22/doc/manual/source/test-framework.rst
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/doc/manual/source/test-framework.rst
2015-05-13 11:05:26.0000
00000 -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 `<http://djmitche.github.com/buildbot/docs/0.7.11/>`_.
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 QUIC
K

-g, --grind
-k, --kinds
-l, --list
@@ -307,7 +318,7 @@

tests are run by default)


run the test suites and examples using valgrind
print the kinds of tests available
print the list of known tests

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 HTM
L
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 executabl
e. Hence, if you want to see logging output from your tests, you have to run the

m 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/tutor
ial/source/building-topologies.rst
--- ns-3.22/doc/tutorial/source/building-topologies.rst 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/doc/tutorial/source/building-topologies.rst 2015-05-13 11:05:26.0000
00000 -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 scri
pt
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 millisecon
d
-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/tutor
ial/source/conceptual-overview.rst
--- ns-3.22/doc/tutorial/source/conceptual-overview.rst 2015-02-05 15:46:22.0000
00000 -0800

+++ ns-3.23/doc/tutorial/source/conceptual-overview.rst 2015-05-13 11:05:26.0000


00000 -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.0000
00000 -0800
+++ ns-3.23/doc/tutorial/source/data-collection.rst
2015-05-13 11:05:26.0000
00000 -0700
@@ -321,6 +321,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6PacketProbe")
.SetParent<Probe> ()
+
.SetGroupName ("Stats")
.AddConstructor<Ipv6PacketProbe> ()
.AddTraceSource ( "Output",
"The packet plus its IPv6 object and interface that ser
ve 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.0000
00000 -0800
+++ ns-3.23/doc/tutorial/source/getting-started.rst
2015-05-13 11:11:44.0000
00000 -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
build.py
bake
build.py

+
+

constants.py
netanim-3.105
constants.py
netanim-3.106

ns-3.22
pybindgen-0.16.0.886
ns-3.23
pybindgen-0.17.0.886

README
util.py
README
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"
<http://www.nsnam.org/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
Building
Building
Building
Building
Building

pybindgen-0.16.0.886 - OK
netanim-3.105 - OK
ns-3.22 - OK
pybindgen-0.17.0.886 - OK
netanim-3.106 - OK
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/t
racing.rst
--- ns-3.22/doc/tutorial/source/tracing.rst
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/doc/tutorial/source/tracing.rst
2015-05-13 11:05:26.000000000 -0
700
@@ -365,6 +365,7 @@
{
static TypeId tid = TypeId ("MyObject")
.SetParent (Object::GetTypeId ())
+
.SetGroupName ("MyGroup")
.AddConstructor<MyObject> ()
.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 -0
800
+++ ns-3.23/doc/tutorial/source/tweaking.rst
2015-05-13 11:05:26.000000000 -0
700
@@ -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 -0
800
+++ ns-3.23/doc/tutorial-pt-br/source/conf.py 2015-05-13 11:05:26.000000000 -0
700
@@ -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
# for a list of supported languages.
diff -Naur ns-3.22/examples/wireless/ht-wifi-network.cc
s/ht-wifi-network.cc
--- ns-3.22/examples/wireless/ht-wifi-network.cc
00000 -0800
+++ ns-3.23/examples/wireless/ht-wifi-network.cc
00000 -0700
@@ -54,7 +54,7 @@
cmd.Parse (argc,argv);

babel documentation
ns-3.23/examples/wireles
2015-02-05 15:46:22.0000
2015-05-13 11:05:27.0000

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
datarate = 6.5;
}
else if (mcs == 1)
else if (i == 1)
{
DataRate = StringValue
datarate = 13;
}
else if (mcs == 2)
else if (i == 2)
{
DataRate = StringValue
datarate = 19.5;
}
else if (mcs == 3)
else if (i == 3)
{
DataRate = StringValue
datarate = 26;
}
else if (mcs == 4)
else if (i == 4)
{
DataRate = StringValue
datarate = 39;
}
else if (mcs == 5)
else if (i == 5)
{
DataRate = StringValue
datarate = 52;
}
else if (mcs == 6)
else if (i == 6)
{
DataRate = StringValue
datarate = 58.5;
}
else if (mcs == 7)
else if (i == 7)
{
DataRate = StringValue
datarate = 65;
}
else if (mcs == 8)
else if (i == 8)
{
DataRate = StringValue
datarate = 7.2;

("OfdmRate6_5MbpsBW20MHz");

("OfdmRate13MbpsBW20MHz");

("OfdmRate19_5MbpsBW20MHz");

("OfdmRate26MbpsBW20MHz");

("OfdmRate39MbpsBW20MHz");

("OfdmRate52MbpsBW20MHz");

("OfdmRate58_5MbpsBW20MHz");

("OfdmRate65MbpsBW20MHz");

("OfdmRate7_2MbpsBW20MHz");

}
else if (mcs == 9)
else if (i == 9)
{
DataRate = StringValue
datarate = 14.4;
}
else if (mcs == 10)
else if (i == 10)
{
DataRate = StringValue
datarate = 21.7;
}
else if (mcs == 11)
else if (i == 11)
{
DataRate = StringValue
datarate = 28.9;
}
else if (mcs == 12)
else if (i == 12)
{
DataRate = StringValue
datarate = 43.3;
}
else if (mcs == 13)
else if (i == 13)
{
DataRate = StringValue
datarate = 57.8;
}
else if (mcs == 14)
else if (i == 14)
{
DataRate = StringValue
datarate = 65;
}
else if (mcs == 15)
else if (i == 15)
{
DataRate = StringValue
datarate = 72.2;
}
else if (mcs == 16)
else if (i == 16)
{
DataRate = StringValue
datarate = 13.5;
}
else if (mcs == 17)
else if (i == 17)
{
DataRate = StringValue
datarate = 27;
}
else if (mcs == 18)
else if (i == 18)
{
DataRate = StringValue
datarate = 40.5;

("OfdmRate14_4MbpsBW20MHz");

("OfdmRate21_7MbpsBW20MHz");

("OfdmRate28_9MbpsBW20MHz");

("OfdmRate43_3MbpsBW20MHz");

("OfdmRate57_8MbpsBW20MHz");

("OfdmRate65MbpsBW20MHzShGi");

("OfdmRate72_2MbpsBW20MHz");

("OfdmRate13_5MbpsBW40MHz");

("OfdmRate27MbpsBW40MHz");

("OfdmRate40_5MbpsBW40MHz");

}
else if (mcs == 19)
else if (i == 19)
{
DataRate = StringValue
datarate = 54;
}
else if (mcs == 20)
else if (i == 20)
{
DataRate = StringValue
datarate = 81;
}
else if (mcs == 21)
else if (i == 21)
{
DataRate = StringValue
datarate = 108;
}
else if (mcs == 22)
else if (i == 22)
{
DataRate = StringValue
datarate = 121.5;
}
else if (mcs == 23)
else if (i == 23)
{
DataRate = StringValue
datarate = 135;
}
else if (mcs == 24)
else if (i == 24)
{
DataRate = StringValue
datarate = 15;
}
else if (mcs == 25)
else if (i == 25)
{
DataRate = StringValue
datarate = 30;
}
else if (mcs == 26)
else if (i == 26)
{
DataRate = StringValue
datarate = 45;
}
else if (mcs == 27)
else if (i == 27)
{
DataRate = StringValue
datarate = 60;
}
else if (mcs == 28)
else if (i == 28)
{
DataRate = StringValue
datarate = 90;

("OfdmRate54MbpsBW40MHz");

("OfdmRate81MbpsBW40MHz");

("OfdmRate108MbpsBW40MHz");

("OfdmRate121_5MbpsBW40MHz");

("OfdmRate135MbpsBW40MHz");

("OfdmRate15MbpsBW40MHz");

("OfdmRate30MbpsBW40MHz");

("OfdmRate45MbpsBW40MHz");

("OfdmRate60MbpsBW40MHz");

("OfdmRate90MbpsBW40MHz");

}
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/exampl
es/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 Sbastien 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: Sbastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#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 suppo
rts MPDU aggregation.
+// The user can specify whether RTS/CTS is used and can set the number of aggre
gated 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 considere
d
+// 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", Strin
gValue ("999999"));
+ else
+
Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", Strin
gValue ("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 meter
s
+ 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 ran
ge 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", Str
ingValue("OfdmRate65MbpsBW20MHz"), "ControlMode", StringValue("OfdmRate6_5MbpsBW
20MHz"));

+ 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*(payloadSiz
e+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*(payloadSiz
e+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<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator
> ();
+
+ // AP is between the two stations, each station being located at 5 meters fro
m 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 hidd
en 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<UdpServer>(serverApp.Get (0))->Get
Received ();
+ 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/exa
mples/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 Sbastien 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: Sbastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#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 s
chemes (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 t
he 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 considere
d
+// belonging to BestEffort Access Class (AC_BE).
+//
+// Throughput gets higher as either nMsdus or nMpdus is increased (one-level ag
gregation),
+// or when both nMsdus and nMpdus are increases (two-level aggregation).
+// MSDU aggregation offers a better header reduction compare to MPDU aggregatio
n,
+// while MPDU aggregation is more robust against transmission errors than MSDU
aggregation.
+// The good setting of nMsdu and nMpdus will depends on various factors (payloa
d size, channel conditions, ...).
+// Since this example considers an ideal channel, the highest throughput is obt
ained with the largest values for nMsdus and nMpdus parameters.
+// Users should nevertheless take care that the standard rules limit the maximu
m MSDU size to 7935 bytes and the MPDU size to 65535 bytes.
+// Consequently, more packets should be aggregated if their payload is small wi
th 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 thro
ughput 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 ag
gregated MSDUs specified by the user
+ cmd.AddValue ("nMpdus", "Number of aggregated MPDUs", nMpdus); //number of ag
gregated 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", Str
ingValue ("999999"));
+
}
+ else
+
{
+
Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", Str
ingValue ("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_5MbpsBW2
0MHz"));
+ 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 i
s used
+
}
+ if (nMsdus > 0)
+
{
+
mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator",
+
"MaxAmpduSize", UintegerValue (nMpdus * (nMsd
us * (payloadSize + 100)))); //Set the maximum size for A-MPDU with regards to t
he 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 * (payl
oadSize + 200))); //Set the maximum size for A-MPDU with regards to the payload
size
+
}
+ mac.SetMsduAggregatorForAc (AC_BE,"ns3::MsduStandardAggregator",
+
"MaxAmsduSize", UintegerValue (nMsdus * (payloadS
ize + 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 i
s used
+
}
+ if (nMsdus > 0)
+
{
+
mac.SetMpduAggregatorForAc (AC_BE,"ns3::MpduStandardAggregator",
+
"MaxAmpduSize", UintegerValue (nMpdus * (nMsd
us * (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 * (payl
oadSize + 200))); //Set the maximum size for A-MPDU with regards to the payload
size
+
}

+ mac.SetMsduAggregatorForAc (AC_BE,"ns3::MsduStandardAggregator",
+
"MaxAmsduSize", UintegerValue (nMsdus * (payloadS
ize + 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<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);
+
+ /* 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<UdpServer> (serverApp.Get (0))->Ge
tReceived ();
+ 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/wir
eless/wifi-wired-bridging.cc
--- ns-3.22/examples/wireless/wifi-wired-bridging.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/examples/wireless/wifi-wired-bridging.cc
2015-05-13 11:05:27.0000
00000 -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', 'mobil
ity', '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', 'mob
ility', '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 pack
et 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 functio
n 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 n
ode 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 -0
800
+++ ns-3.23/src/antenna/model/antenna-model.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -44,6 +44,7 @@
{
static TypeId tid = TypeId ("ns3::AntennaModel")
.SetParent<Object> ()
+
.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.0000
00000 -0800
+++ ns-3.23/src/antenna/model/cosine-antenna-model.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -39,6 +39,7 @@
{
static TypeId tid = TypeId ("ns3::CosineAntennaModel")
.SetParent<AntennaModel> ()
+
.SetGroupName("Antenna")
.AddConstructor<CosineAntennaModel> ()
.AddAttribute ("Beamwidth",
"The 3dB beamwidth (degrees)",
diff -Naur ns-3.22/src/antenna/model/isotropic-antenna-model.cc ns-3.23/src/ante
nna/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<AntennaModel> ()
+
.SetGroupName("Antenna")
.AddConstructor<IsotropicAntennaModel> ()
;
return tid;
diff -Naur ns-3.22/src/antenna/model/parabolic-antenna-model.cc ns-3.23/src/ante
nna/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<AntennaModel> ()
+
.SetGroupName("Antenna")
.AddConstructor<ParabolicAntennaModel> ()
.AddAttribute ("Beamwidth",
"The 3dB beamwidth (degrees)",

diff -Naur ns-3.22/src/aodv/bindings/modulegen__gcc_ILP32.py ns-3.23/src/aodv/bi


ndings/modulegen__gcc_ILP32.py
--- ns-3.22/src/aodv/bindings/modulegen__gcc_ILP32.py 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/aodv/bindings/modulegen__gcc_ILP32.py 2015-05-13 11:05:27.0000
00000 -0700
@@ -7648,6 +7648,11 @@
[param('ns3::Time', 't')])
## aodv-routing-protocol.h (module 'aodv'): ns3::aodv::RoutingProtocol::AOD
V_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/bin
dings/modulegen__gcc_LP64.py
--- ns-3.22/src/aodv/bindings/modulegen__gcc_LP64.py
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/aodv/bindings/modulegen__gcc_LP64.py
2015-05-13 11:05:27.0000
00000 -0700
@@ -7648,6 +7648,11 @@
[param('ns3::Time', 't')])
## aodv-routing-protocol.h (module 'aodv'): ns3::aodv::RoutingProtocol::AOD
V_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-pac


ket.cc
--- ns-3.22/src/aodv/model/aodv-packet.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/aodv/model/aodv-packet.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -46,6 +46,7 @@
{
static TypeId tid = TypeId ("ns3::aodv::TypeHeader")
.SetParent<Header> ()
+
.SetGroupName("Aodv")
.AddConstructor<TypeHeader> ()
;
return tid;
@@ -153,6 +154,7 @@
{
static TypeId tid = TypeId ("ns3::aodv::RreqHeader")
.SetParent<Header> ()
+
.SetGroupName("Aodv")
.AddConstructor<RreqHeader> ()
;
return tid;
@@ -292,6 +294,7 @@
{
static TypeId tid = TypeId ("ns3::aodv::RrepHeader")
.SetParent<Header> ()
+
.SetGroupName("Aodv")
.AddConstructor<RrepHeader> ()
;
return tid;
@@ -434,6 +437,7 @@
{
static TypeId tid = TypeId ("ns3::aodv::RrepAckHeader")
.SetParent<Header> ()
+
.SetGroupName("Aodv")
.AddConstructor<RrepAckHeader> ()
;
return tid;
@@ -500,6 +504,7 @@
{
static TypeId tid = TypeId ("ns3::aodv::RerrHeader")
.SetParent<Header> ()
+
.SetGroupName("Aodv")
.AddConstructor<RerrHeader> ()
;
return tid;
diff -Naur ns-3.22/src/aodv/model/aodv-routing-protocol.cc ns-3.23/src/aodv/mode
l/aodv-routing-protocol.cc
--- ns-3.22/src/aodv/model/aodv-routing-protocol.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/aodv/model/aodv-routing-protocol.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -67,6 +67,7 @@
{
static TypeId tid = TypeId ("ns3::aodv::DeferredRouteOutputTag").SetParent<
Tag> ()
.SetParent<Tag> ()
+
.SetGroupName("Aodv")
.AddConstructor<DeferredRouteOutputTag> ()
;

return tid;
@@ -158,6 +159,7 @@
{
static TypeId tid = TypeId ("ns3::aodv::RoutingProtocol")
.SetParent<Ipv4RoutingProtocol> ()
+
.SetGroupName("Aodv")
.AddConstructor<RoutingProtocol> ()
.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.0000
00000 -0800
+++ ns-3.23/src/aodv/model/aodv-routing-protocol.h
2015-05-13 11:05:27.0000
00000 -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 @@
-iXXE 4
+i XXE 4

   (

-xXXE4
+ XXE 4

   (

- TTE 0
+yTTE0

  

-4@@< 
+R @@< 

-  @@  
+   @@  

-@@<  
+ @@<  

-f FTT<0E 0
+  d TT<0E 0

  

-+V n@@0 
++t   @@0 

-q@@ <@ 
+ @@<@ 

-  xx<@E T@
+  xx<@E T@

-    @@P 
+   @@P 

-f  xx<`E T?
+  xx<`E T?

d-  >xx<pE T=
+   \xx<pET=

-N xx<PE T@
+l xx<PE T@

  xx<  ET?


  pxx< E T=



- ((TTE0
T+T
g
E 0

  

-TT`E0
+}TT`E0

  

@@ -52,11 +52,11 @@

  xx<E T=

- TTE 0
T+T
g
E 0

  

-TT E 0
+xiTT E 0

  

@@ -66,11 +66,11 @@

  xx<E T=

- TTE0
+ OTTE0

  

-p TTE 0
+}TTE0

  

@@ -94,56 +94,56 @@

  

-FTT<0E0
+sRTT<0E0

  

-F TTE0
+ R 0uTTE0

  

- XXE4
-
-    
-
-/TT@E0
+ TT@E 0

  

-3XXPE 4
+(#XXE 4
+
+    
+
+XKXX  PE 4

    

-(#TT  E 0
+TTE 0

  

-;TT`E 0
+PKTT`E 0

  

-TTE0
+(#TTE 0

  

-;TTpE 0
+PKTTpE 0

  

-'X

XXE4
+@


XXE4

    

-X


XX E 4


+I


XX E 4



    

- @


TTE0
+ <

TTE0


  

-a

TT E 0


+d

TT E 0




  
@@ -152,7 +152,7 @@

  

-
h|

TTE 0
+
 M

TTE 0

  

diff -Naur ns-3.22/src/aodv/test/aodv-chain-regression-test-1-0.pcap ns-3.23/src
/aodv/test/aodv-chain-regression-test-1-0.pcap
--- ns-3.22/src/aodv/test/aodv-chain-regression-test-1-0.pcap 2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/aodv/test/aodv-chain-regression-test-1-0.pcap 2015-05-13 11:05
:27.000000000 -0700
@@ -1,58 +1,58 @@
-i`XXE4
+i'XXE 4

   (

-XXE4
+g XXE 4

   (

-I<XXE 4
+5XXE4

   (

-( TTE 0
+yTTE 0

  

- @@< 
+ @@< 

-   @@  
+   @@  

- @@< 
+ @@< 

-q  TT<0E 0
+   TT<0E 0

  

-+  '@@  
++  E @@  

-*@@ <  
+H @@ <  

-: TT<0E 0
+X   TT<0E 0

  

-+  @@0 
++  @@0 

-@@<@ 

+@@<@ 

-  xx<@E T@
+ xx<@E T@

-   '@@P 
+   E@@P 

-*@@ <@ 
+H@@ <@ 

-: xx<`E T?
+X xx<`ET?

-    @@P 
+   @@P 

-b xx<`ET>
+  xx<`E T>

N-  (xx<pET>
l+   Fxx<pET>

-8  xx<pE T=
+V xx<pE T=

-{ xx<PET@
+  xx<PET@

  xx< E T?

@@ -62,15 +62,15 @@

i xx< E T=

- 'TTE0
+ 

TTE 0

  

- 0TTE 0
+h%TTE 0

  

- TT`E 0
+ }TT`E 0

  

@@ -84,15 +84,15 @@

xx<E T=

-
 T TE 0
+
 

TTE 0

  

- TTE 0
+ HTTE 0

  

- TT E 0
+jTT  E0

  

@@ -106,15 +106,15 @@

  xx<E T=

- TTE 0
+ TTE0

  

-DTTE 0
+ !TTE0

  

- TTE 0
+ }TTE 0

  

@@ -138,56 +138,56 @@

  

-3FTT<0E0
+QTT<0E0

  

-F  TTE0
+R uTTE0

  

-XXE 4
-
-    
-
-p/TT  @E 0
+g TT@E 0

  

-X3XXPE 4
+#XXE 4
+
+    

+
+JXXPE4

    

-#TTE0
+XTTE0

  

-(;TT`E 0
+JTT`E 0

  

-XTTE 0
+#TTE 0

  

-(;TTpE 0
+JTTpE 0

  

-X

XXE4
+HA


XXE4

    

-


XX E 4


+I


XX E 4



    

@- A


TTE0
X+ =

TTE0


  

-`

TT E 0


+pd

TT E 0




  
@@ -196,7 +196,7 @@

  

-
{

TTE 0
+
M

TTE 0

  

diff -Naur ns-3.22/src/aodv/test/aodv-chain-regression-test-2-0.pcap ns-3.23/src
/aodv/test/aodv-chain-regression-test-2-0.pcap
--- ns-3.22/src/aodv/test/aodv-chain-regression-test-2-0.pcap 2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/aodv/test/aodv-chain-regression-test-2-0.pcap 2015-05-13 11:05
:27.000000000 -0700
@@ -1,62 +1,62 @@
-ixXXE 4
+i XXE4

   (

-;XXE 4
+ 4XXE 4

   (

-`XXE4
+(IXXE 4

   (

-, @@< 
+Sm@@< 

-  e @@  
+n  @@  

- @ @< 
+ @@< 

-4  J TT<0E 0
+R  h TT<0E 0

  

-+Z  2 @@  
++x  P @@  

-4@@ < 
+R @@ < 

-D TT<0E 0
+b   T T<0E0

  

-+  @@  
++   @@  

-f FTT<0E 0
+  d TT<0E 0

  

-+q@@ <@ 

++ @@<@ 

-  @@P 
+ @@P 

-@@<@ 
+@@<@ 

-f  xx<`E T?
+  xx<`E T?

-   "@@P 
+   @@@P 

-%@@ <@ 
+C@@ <@ 

-5 xx<`E T>
+S xx<`ET>

-   @@P 
+   @@P 

-N  xx<`E T=
+l xx<`E T=

-  xx<pE T?
+   0xx<pET?

-" pxx<pE T>
+@  xx<pE T>

-d >xx<pET=
+  \xx<pE T=

 xx< E T?

@@ -70,15 +70,15 @@

  pxx<  ET=

-((TT  E 0
T+TgE 0

  

-0TTE0
+$TTE 0

  

-YPTTE 0
+ 9TTE 0

  

@@ -94,19 +94,19 @@

 xx<ET=


-TTE 0
T+TgE 0

  

-` TTE 0
-
-  
-
-@TTE 0
+PATTE 0

  

- xx<ET?
+HTTE0
+
+  
+
+ xx<ET?

  ,xx<ET>

@@ -118,39 +118,39 @@

 xx<ET=

-TTE0
+OTTE0

  

- CTTE0
+ TTE0

  

- HTTE0
+MTTE0

  

-xTTE 0
+$TTE0

  

-` TT E 0
+O<TT E 0

  

-7TT0E 0
+$TT0E 0

  

-` TT@E 0
+HTT@E0


  

-C
 TTPE0
+O<
 TTPE0

  

-
7TT`E 0 
+
(TT`E 0 

  

diff -Naur ns-3.22/src/aodv/test/aodv-chain-regression-test-3-0.pcap ns-3.23/src
/aodv/test/aodv-chain-regression-test-3-0.pcap
--- ns-3.22/src/aodv/test/aodv-chain-regression-test-3-0.pcap 2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/aodv/test/aodv-chain-regression-test-3-0.pcap 2015-05-13 11:05
:27.000000000 -0700
@@ -1,58 +1,58 @@
-iI<XXE4
+i5XXE 4

   (

-q_XXE 4
+ HXXE 4

   (

- }TTE 0
-
-  
-
- @@ 
+l@@ 

- @@< 
+l@@ < 

-h  l TT< E 0
+ m  nTT<E0

  

-+|   @@  
++ n  @@  

- @@< 
+ @ @< 

-   T T<0E0
+%   TT<0E 0

  

-+   @@  
++   @@  

-q  TT<0E 0
+   TT<0E 0


  

-+*@@ <@ 
++H@@ <@ 

-  @@P 
+ @@P 

-@@<@ 
+@@<@ 

-b xx<`ET>
+  xx<`E T>

-  @@P 
+   -@@P 

-@@<0 
+/@@ <  

-! xx<`E T=
+? xx<`E T=

-  xx<@ET@
+   xx<0ET@

- Yxx<pE T?
+ wxx<pE T?

-N (xx<pE T>
+l Fxx<pE T>

- xx<  ET>
+ 5TT@E0
+
+  
+
+ xx< E T>

  Cxx<  ET=

@@ -62,15 +62,15 @@

  Yxx< E T>

- 0TTE0
+h%TT  E 0

  

-OTTE 0
+8TTE 0

  

-jTT`E0
+h)TT`E 0

  


@@ -84,15 +84,15 @@

 xx<E T>

- TTE0
-
-  
-
-1@TTE 0
+@TTE0

  

-H^TT E 0
+ HTTE 0
+
+  
+
+@TT E 0

  

@@ -106,67 +106,67 @@

  txx<E T>

-DTTE0
+ !TTE 0

  

-HTTE 0
+ LTTE0

  

-uTTE 0
+@TTE 0

  

-STTE0
+8XTTE0

  

-uTTE 0
+P-TTE 0

  

-q_TT E 0
+ LTT E 0

  

-0bTTE 0
+ LTTE 0


  

-STT0E 0
+@TT0E 0

  

-p TTE 0
-
-  
-
-@ TT<@E0
+'TT<@E 0

  

-  WTTPE 0
+ HTTE 0
+
+  
+
+PTTTPE 0

  

- }TTE 0
+P-TTE 0

  

-[
 TT`E0
+5TT`E 0

  

-0b
 TTE0
+5
 TTE0

  

-
I<TTpE 0 
+
 \TTpE 0 

  

-
jTTE 0

+
P-TTE0 

  

diff -Naur ns-3.22/src/aodv/test/aodv-chain-regression-test-4-0.pcap ns-3.23/src
/aodv/test/aodv-chain-regression-test-4-0.pcap
--- ns-3.22/src/aodv/test/aodv-chain-regression-test-4-0.pcap 2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/aodv/test/aodv-chain-regression-test-4-0.pcap 2015-05-13 11:05
:27.000000000 -0700
@@ -1,48 +1,48 @@
-i`XXE 4
+i(IXXE4


   (

-}TT E 0
-
-  
-
-) @@ 
+Pl@@ 

-, @@ < 
+Sm@@< 

-<   TT< E 0
+cm nTT<E 0

  

-+  e @@  
++n  @@  

-4  J TT<0E 0
+R  h TT<0E 0

  

-+%@@ <@ 
++C@@ <@ 

-  @@P 
+  @@P 

-@@<0 
+@@<  

-N  xx<`E T=
+l xx<`E T=

-  xx<@ET@
+   xx<0ET@

- xx<pET?
+ 0xx<pE T?

-! xx< E T=
+ 4TT@E0
+
+  
+
+! xx<  ET=

  Y xx<PE T@

N Cxx< E T?

-YPTT  E 0
+ 9TTE0

  

-xiTT`E 0

+(TT`E 0

  

@@ -52,11 +52,11 @@

N xx<E T?

-@TTE0
+PATT  E 0

  

-]TT E 0
+P@TT E 0

  

@@ -66,63 +66,63 @@

N ^xx<E T?

- HTTE 0
+TTE 0
M

  

-0uTTE 0
+P@TTE 0

  

-ATTTE0
+XTTE0

  

-0uTTE 0
+,TTE 0

  

-_TT E 0
+MTT E 0

  

-aTTE 0
+LTTE 0

  

-ATTT0E 0
+PATT0E 0

  

- TTE 0
-
-  

-
- TT<@E0
+TT<@E 0

  

-  )XTTPE0
+  HTTE 0
+
+  
+
+TTTPE 0

  

-}TTE0
+,TTE 0

  

-\TT`E 0
+5
 TT`E0

  

-a
 TTE0
+4
 TTE0

  

-
<TTpE 0 
+
\TTpE 0 

  

-
xiTTE0 
+
,TTE0 

  

diff -Naur ns-3.22/src/aodv/test/bug-606-test-0-0.pcap ns-3.23/src/aodv/test/bug
-606-test-0-0.pcap
--- ns-3.22/src/aodv/test/bug-606-test-0-0.pcap 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/aodv/test/bug-606-test-0-0.pcap 2015-05-13 11:05:27.000000000 -0
700
@@ -1,48 +1,48 @@
-iXXE 4
+i@XXE 4

   (

-

XXE4
+0(XXE 4

   (

-3)@@< 
+ D@@<
 

-V*I @@  
+E"e @@  

-I@@ < 
+De@@< 

- J yKTT<0E 0
+e fTT<0E 0

  

-+ K 1W@@  
++f  r@@  

-4X@@<@ 
+ s@@ <@ 

-DX Xxx<0E T@
+ s Dtxx<0E T@

- Y  `mTT@E 0
8+ u  }TT@E0

  

-Ty@@ P 
+ @@P 

-#zW{ xx`<E T?
+{  x x`<E T?

- | } xx<pE T?
+ 6 xx<pET?

-} xx<PE T@
+F  xx<PE T@

  xx<E T?

! 1xx< E T?

-A TTE0
+A hGTTE 0

  

-`mTT`E 0
+]TT`E 0

  

@@ -52,7 +52,7 @@

:$ $xx< E T@



 %  /TTE 0
-
+ %  ((TTE 0

  

@@ -60,61 +60,61 @@

5F G xx<E T?

- N TT E 0
\+ @@< 
+
+]Hq TT E 0

  

-\@@< 
-
- ]| @@ 
+0}@@ 

-}@@< 
+R}@@< 

-} ~xx<ET?
+}  xx<ET?

-~ xx<E T@
+0  xx<E T@

  xx<E T?

! xx<0ET?

- TT@E 0
+ ((TT@E0

  

-aTTE 0
+ TTE 0

  

(#@@ 

-HqTTE0
+aTTE0

  

@@ 

R-TTE 0
+}TT E 0

  

@@ 

-`mTT E0
+ eTT E0

  

@@0 

-XX@E 4
+'XX@E 4

    

'- TTPE0 
(+ # TT PE0 

  

-
(#TT`E 0
+
TT  `E 0


  
diff -Naur ns-3.22/src/aodv/test/bug-606-test-1-0.pcap ns-3.23/src/aodv/test/bug
-606-test-1-0.pcap
--- ns-3.22/src/aodv/test/bug-606-test-1-0.pcap 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/aodv/test/bug-606-test-1-0.pcap 2015-05-13 11:05:27.000000000 -0
700
@@ -1,52 +1,52 @@
-i`XXE4
+iXXE 4

   (

-H

XXE4
+'XXE 4

   (

-(@@
 
+C@@
 

-(@@ < 
+D@@ < 

-p) *TTE<
0
+D rETTE<0

  

-+**ZI
 @@  
++ EJ
 TTE0
+
+  
+
+d@@  

-\J@@< 
+e@@ < 

-lJ JTT<0E 0
+e HfTT<0E 0

  

-+K W@@  
++r@@  
g

-W@@ <@ 
+s@@ <@ 

-pX Yxx<0E T@
+s txx<0E T@

- Y  mTT@E 0
+ 

u  }TT@E0

  

-x@@P 
+< @@P 

-y@@ < 
+? @@0 <
  

-y z xx`<E T?
+O  x x`<E T?

- {   |x0x<ET@
-
- |&} xx<pET?
+    x @x<ET@

-~ TT
@E0
+ ~ x x<pET?

-  
-
-xx<PE T@
+r  xx<PET@

  xx<ET?

@@ -54,55 +54,55 @@

yxx<  ET?

-n 0TTE0
+n  'TT
`E0
+
+  
+
+FTTE 0

  

-mTT`E 0
+H^TT`E 0

  

-TT
`E0
-
-  
-
- #@@p 
+ #@@p 

#@@< 

g$ %xx< E T@

- %  p/TTE 0
+ %  'TTE 0


  

-D@@ 
+ +TT
pE0
+
+  
+
+D@@ 

-E@p@<
 
+E@@<
 


FF
 xx<E T?

- G  NTT E 0
-
-  
-
- [@@
+ G   [@@

[@@< 

-T\ I]xx<ET@
+T\  ]x
x<ET@

-Y] | @@ 
+ ]q TT E 0
+
+  
+
+|@@ 

- }@@< 
+}@@< 

- } 2~xx<ET?
+} h~xx<ET?

-'   TT
 E0
-
-  
-
-xx<E T@
+]  xx<ET@

  xx<ET?

@@ -110,39 +110,39 @@

Lxx<0ET?

-A 0TT@E0
+A 'TT@E 0

  

-0bTTE 0
-
-  

-
- TT
E0
+FTT
E0

  

-0TTPE0
+p TTE 0
+
+  
+
+?TTPE0

  

-'TT`E 0
+?TT`E0

  

-'TTpE 0
+ +TTpE 0

  

-TT E 0
+FTT E 0

  

-p/
 TT  E0
+B
 TT  E0

  

-
 +TTE 0 
+
TT  E 0 

  

diff -Naur ns-3.22/src/aodv/test/bug-606-test-2-0.pcap ns-3.23/src/aodv/test/bug
-606-test-2-0.pcap
--- ns-3.22/src/aodv/test/bug-606-test-2-0.pcap 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/aodv/test/bug-606-test-2-0.pcap 2015-05-13 11:05:27.000000000 -0
700
@@ -1,112 +1,112 @@
-i

XXE4
+i0(XXE4

   (

-0(@@
 
+ C@@
 

-3)@@<
 
+ D@@ < 

-C)  )TTE<0
+ D DTTE<0

  

-+V*I
 @@  
++E8J
 TTE0
+
+  
+
+"e@@   

- J yKTT<0E 0
+e fTT<0E 0

  

-+4X@@<@ 
++ s@@ <@ 

-Y Ty@@P 
+8u  @@P 

-vy@@<  
+ @0@<
 

-#zW{ xx`<E T?
+{  x x`<E T?

g- {  {x0x<ET@
+ x@
x<ET@

-|} xx<pET?
+  6 xx<pE T?

-(TT  
@E0
-
-  
-
- xx<E T?
+ xx<ET?

  ,xPx<ET@

!1xx<  ET?

-TTE 0
-
-  

-
-8TT
`E0
+'TT
`E0

  

-*$@@< 
+hGTTE 0
+
+  
+
+*$@@< 

-% /TTE0
+% ((TTE0

  

-fE@@ 
+*TT
pE0
+
+  
+
+fE@@ 

- E@p@<
 
+ E@@<
 

5F G xx<E T?

- G  [@@
 
+ G  [@@
 

\@@< 

-(\  \xx<ET@
+(\ \x
x<ET@

- ]| @@ 
+]0} @@ 

-} ~xx<ET?
-
-TT
E0
+}  xx<ET?

-  
-
- xx<E T?
+ xx<ET?

  ,xx<ET@

!xx<0E T?

-TT@E 0
+((TT  @E 0

  


-TT
E0
+PFTT
E0

  

-PTT
E0
+2TT
E0

  

-TT
E0
+(#TT
E0

  

-(TT
E0
+8JTT
E0

  

-8TT
 E0
+.TT
 E0

  

-
 TT
E 0
+2
 TT
E 0

  

-
TT 
E0 
+
6TTE0


  

diff -Naur ns-3.22/src/aodv/test/bug-772.cc ns-3.23/src/aodv/test/bug-772.cc
--- ns-3.22/src/aodv/test/bug-772.cc
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/aodv/test/bug-772.cc
2015-05-13 11:05:27.000000000 -0700
@@ -133,9 +133,12 @@
InternetStackHelper internetStack;
internetStack.SetRoutingHelper (aodv);
internetStack.Install (*m_nodes);
+ streamsUsed += internetStack.AssignStreams (*m_nodes, streamsUsed);
+ // Expect to use (3*m_size) more streams for internet stack random variables
+ NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((devices.GetN () * 6) + (3*m_size)), "St
ream assignment mismatch");
streamsUsed += aodv.AssignStreams (*m_nodes, streamsUsed);
// Expect to use m_size more streams for AODV
- NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((devices.GetN () * 6) + m_size), "Stream
assignment mismatch");
+ NS_TEST_ASSERT_MSG_EQ (streamsUsed, ((devices.GetN () * 6) + (3*m_size) + m_s
ize), "Stream assignment mismatch");
Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer interfaces = address.Assign (devices);
diff -Naur ns-3.22/src/aodv/test/tcp-chain-test-0-0.pcap ns-3.23/src/aodv/test/t
cp-chain-test-0-0.pcap
--- ns-3.22/src/aodv/test/tcp-chain-test-0-0.pcap
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/aodv/test/tcp-chain-test-0-0.pcap
2015-05-13 11:05:27.0000

00000 -0700
@@ -1,68 +1,67 @@
-iYTTE0
+i.TTE0

  

-xTTE0
+HTTE0

  

-@XXE 4
+XXE4

   (


-pGXX  E4
+` XX  E4

   (


-&8@@<  
+@@<  

- 9 5Q@@0 
+  @@0 

-WQ@@ <  
+4@@<  

-R 4STT<@E0
+ TT<@E0

  


-DS  f@@0 
+! o@@0 

-g@@<P 
+@@<P 

-g h\\<@E8@
+ \\<@E8@



  
-h 
-m@@` 
+ '@@` 

-m n\\<pE 8?
+( )\\<pE 8?



  
- Z \\<  E88

+


  \\< E 88


  
-Xj XX<PE 4@
+J   XX<PE4@



  
-]X  mXX< E 4?
+RJ  XX< E 4?



  
-]XHpp<`E L@
+RJHpp<`E L@



  
-eX Vpp<E L?
+eJ Vpp<E L?



  
-eX'  XX<E 48
+eJ'  XX<E 48


  z
@@ -106,349 +105,155 @@




  
-_r((<E @
+_   pp<EL?


-

  
-_ ((<E?
+
  
+_((<E?




  
-_ `XX< E 48
-
-

 z
-g_p  pp<E @L
+_%((<E?


-
  
-g .pp<0E ?L
-
-
-
  
-g ((<E 
@ 
+

  
+_((<E?



  
-

-g((<E 
@ 
+

  
+_((<E ?


-  


-g 3 ((<@E ?
+

  
+_;((<E?


-  


-go !XX<PE 48
+

  
X+X_<
 E48

  z
-

-1 h
pp<EL
-@
-
-
-
  
-Y
 v
p p <`E L
-?
-
-
-
  
-Y.
(( <E @
-
-
-
  
-YY
(( <E @
-
-
-
  
-Y
 
( ( <pE ?
-
-
-
  
-Yt
 &
XX<  E48
+

 z
+r|_TT<0E 0
+
+  
+

-
  z
-aY6
  qpp<E L

@
+  XXE 4

+    

-
   
-aDu xpp< E L

?
-
+
+XX@E4
+
+    

-
   
@-aIy((<E
-
+
+ TT<PE 0
+
+  

-
  
@-at}((<E
+
+L & pp<E@L


-
  
?- a   ((<E 
+
  
+r Ppp<`E ?L


-
  
-a6 XX<E 48
+
  
+r; XX<pE 48

-
  z
p-p< 
E L@Y
-
-
-
q  
p-pSa< ]
E L?
-
-
-
q  
(-(S<a0
E @
-
-
-
   
f(-(S< 0
E @
+

+ h
+@


-
   
(-(S\l<Bi
E ?
+
  
+Y
 v
+?


-
   

 z
p p<EL

p p < E L

X-XS<
EE48
+
  
+Y>
 


XX<  E48

-
  z
-[pSpU<@EL@
-
-
-
Y  
-[   ((<PE @
-
-
-
q  
-[0((<PE@
-
-
-
q  
-[
-(( <PE@
+

~ 
+aY
  0@@ 
+
+1@@< 
+
+1 L2pp<EL@


-
q  
-[?  ((<E?
+

  
+
\a5 U U@@ 
+
+$V Ypp<E L?


-
q  
-[TT`E0
+

  
+
\aTTE0

  
-
- = 7 >XX<E 84
-
-
q  z
-G>  ?TT E0
+
+`TTE 0

  

-H@@p 
-
-J@@<0 
-
-Z pp< E L@
-
-

-
A  
-a  ((<  E@
M
-
-
-
!Y  
- e@@@ 
M
-
-4 pp<PE L?
-
-
-
A  
-z((<`E?
M
-
-
-
!Y  
-@@<p 
M
+@@< 

-M @@  
+U )@@ 

-@@< 
+K@@<  

- XX< E 4 8
+ XX<E48

-
!Y  z
-
r
M
  pp<E L@
-
-
-
#)  
-$  pp<E L?

r
-
-
-
#)  
-M((<E @

r
-
-
-
%A  
-T((<E @

r
-
-
-
%A  
-  ((<E ?

r
-
-
-
%A  
-z ,XX<E 4

r
-8
-
-
%A  z
-< pp<EL@


-
-
-
'  
-
Gl pp<E L?

-

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ ~ 
+

'  
Gh((<E @

))  
G((<E @

))  
G ((<E?

))  
G  XX<E 48

))  z
O

G   pp<E L@

*  




O .pp<EL?
\ Ppp<0E L

@


-
-
-
-
-
-
-
-
-
-
-
-
-
-

*  


O((<E@

-  


OY((<E@

-  


O  ((<E?

-  


Oj XX < E 4

8
-
-
-  z
-

, h pp <EL@
-
-
-
.  
-
-A

 v
p p<0EL?
-
-
-
.  
-
-A

( (< E@
-
-
-
0  
-
-A
t
((< E@
-
-
-
0  
-
-A

 
( (<@E?
-
-
-
0  
-
8-A 

 _
XX<PE4
-
-
0  z
-
-I
-Ao
  qpp<0EL@
-
-
-
2  
-
-
-IDu  xpp<`EL?
-
-
-
2  
-
-
-IIy((<@E@
+  


@+

 4pp<@E L


-
4  
-
-
-I}(( <@E @
+
  
+

 pyp<EL

?


-
4  
-
-
-I   ( (<pE?
+  


?+

pp<  E L


-
4  
-
-
-IU  XX< E 48
+
  
+

 T  XVX <0E48

-
4  z
-
-
p-p<P
YE L@
+
  
+



-
6  
-;
p-pa<] 
E L?
-
+
  
+

+
+  

-
6  
-;
(-(a<`
E @
+[ \pp<`E L@


-
8  
-;
(-(e<`
E @
-
+
  
+

+
+  
+

-
8  
-;
(-(8il<
E ?
-
+`  aLL<`E(
+
+  


V  Vpp<PE L@

 Z  [LL <@E(

_  `TT <PE0

-
8  
-;
X-X<
aE48
+ a  q L L<pE(
+
+  

-
8  z
-C;q
\ No newline at end of file
+.  
\ No newline at end of file
diff -Naur ns-3.22/src/aodv/test/tcp-chain-test-9-0.pcap ns-3.23/src/aodv/test/t
cp-chain-test-9-0.pcap
--- ns-3.22/src/aodv/test/tcp-chain-test-9-0.pcap
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/aodv/test/tcp-chain-test-9-0.pcap
2015-05-13 11:05:27.0000
00000 -0700
@@ -1,73 +1,73 @@
-i eTTE0
+iTTE0

  



-xPTTE0
+TTE0

  


-
 PFTTE 0
+
 (TTE 0

  



- @@ 
+@@ 



-% @@<  
+
@@<  


-
  | T T< E0
+
  ` TT< E0


  


-_   @ @0 
+_p e @@0 


-  r T T<@E0

4+   &TT<@E0

  @ 


-@@<P 
-

-   81TT`E 0
+HTTPE 0

  


-
 @ \\<pE 88
+
  @@<` 
+

+      \ \<pE88



  
- @@0 
+   @@0 


-
 @@<  
+
 @@<  



- \\<@E8@
+%  s \\<@E 8@


  
-X \\< E 8?
+JD   \\<  E8?


  
-X@ XX<E 48
+J WXX<E 48



  
-]X   S
pp<EL8
+RJg  S
pp<EL8



  
-eXc
 
XX<PE4@
+eJc
 
XX<PE4@


  z
@@ -96,394 +96,98 @@



  
-y i   pp<E L8
+y s  pp<E L8




  
-_ AXX<pE 4@
+_ K XX<pE 4@



 z
-g_ # XX< E4?
+r_ -XX< E4?



 z
-g_ XX< E 4?
+r_ RTT<0E 0
+

-

 z
-g_ ((<0E 8
-
+  
+

-

  
-_   + pp<@E8L
+?b   q pp<@E8L



  
-g;  XX< E 4@
-
-  z

-V >XX<PE 4?
-
-  z

-zXX<PE 4?
-
-  z

-XX<PE 4?
+r  XX< E 4@

  z
-

-XX<PE 4?
+

 z
+  iXX<PE 4?

  z
-

- ((<`E 
-
-
-  


-g 
+

+
 s
8


8 

 s
pp<pEL
 z
p p <`E L



-Y
-
-
-aY
-
-
-aY
-
-
-
-Y

  
 

XX<  E4@

  z
 Y

XX<  E4?

  z
 

(( < E 8

  
 A   p p<EL

8
-
-
-
   
-a   XX<E4@
+Y
 
XX<  E4@

-
  z
-   XX<E 4?
+

~ 
+aY
 k
XX<pE4?

-
  z
- XX<E 4?
-
-
  z
8- " <((<E 
-
-
-
  
p-p{a<L
E L8w
-
-
-
q  
X-XS<
a{E4@
-
-
  z
X-X[<
}S.|E4?
-
-
  z
X-X[<
S~E4?
-
-
  z
X-X[<
S5E4?
-
-
  z
X-X[<
SE4?
-
-
  z
(-([[S<A
E 8
-
-
-
   
-Sk !pp<E L8
-
-
-
Y  
-[! i !XX<E@4
-
-
q  z
-6" "XX<E?4

-
-
q  z
-?$XX <E ?4
-
-
q  z
-'XX<E ?4
-
-
q  z
- *XX <E ?4
-
-
q  z
-$0XX <E ?4
-
-
q  z
- 8 ;((< E 8
-
-
-
q  
-[;  >TTE0
+

~ 
+aY@ TTE0

  



- LTT0E 0
+ TT E 0

  


-
 R@@<@ 
-

- S @@<@ 
-

V- @@<@ 
+
 @@<  


W- Z  :a  u@@P 
a+   @@ 



-v@@< 
+@@< 


-
 v , zpp<`EL8
+
  A pp<E L8


-
A  
-<z  }((<pE8
M
-
-

-
!Y  
-}  @ @ 
M
+

  
+
\aQ   7@@ 


-
 @ @<  
+
 8@@ < 



-  r XX<E4 @ 
+8 Q9XX<E 4@

-
!Y  z
-?   @@  
r
M
+ ~ 

+

\: z ]@@ 


-   X X<E4 ? 
I+ ^XX<
_
E 4?

-
!Y  z
-!  pp<E L8
r
M
+ ~ 

+

\ > Z Lpp<E L

8


-
#)  
- XX<E4

r
-@
-
-
%A  z
-  XX<E 4


-?
-
-
%A  z
-XX<E 4


-?
-
-
%A  z
-|XX<E 4


-?
-
-
%A  z
-{XX<E 4


-?
-
-
%A  z
-EXX<E4


-?
-
-
%A  z
-


- XX<E4
-?
-
-
%A  z
-((<


E 8
-
-
-
%A  
-  i  pp<EL8

r
-
-
-
'  
-
G AXX< E 4@

-
-
))  z
-
O
G 5 XX<E4?
-
-
))  z
-
O
GXX<E4?
-
-
))  z

-
-
-
-
-
-
-
-
-
-
-
-

O

GXX<E 4?

))  z
O

G ((<E8

))  
G  +pp<EL8

*  


O;  XX <0E4

@
-
-
-

-  z


V tXX < E4

?
-
-
-

-  z


XX< E 4

?
-
-
-

-  z


"XX< E4

?
-
-
-
-
-
-
-
-
-
-
-
@-A 
-
-
-
-I
?-A 
-
-
-
-I
?-A
  I
-
-
-
-I
?-A
  
-
-
-
-I
?-A
  3
-
-
-
-I
?-A
  1
-
-
-
-I
-A
-
-
-
-
-A
-
-
-
-
-

-  z


M g((<0E 8

-  


Ow   s

pp <@E L8

.  


 

XX<@E4

0  z
 

XX<PE4

0  z
XX<PE4
0  z
XX<PE4
0  z
XX<PE4
0  z
XX<PE4
0  z
 

(( <`E 8

0  

2  

 A   p p<pEL8

-I   XX<PE 4@


-
-
4  z
-
-
-   X X<  E4?
-
-
4  z
-
-
- XX< E 4?
-
-
4  z
-
-
-T XX < E 4?
-
-
4  z
-
-
- XX< E 4?
-
-
4  z
-
-
-n  ((<  E8
-
-
-
4  
-
-
p-Ip{<
E Lw8
-
-
-
6  
-;
X-X<
a{{`E4@
+  


+

jL  LXX<E 4@

-
8  z
X-XC<
};.|E4?
+
  
+



 M  NXX <E 4?

-
8  z
(-(C;<
E 8
-
-
-
8  
-;
-
\ No newline at end of file

+
  
+


\ No newline at end of file
diff -Naur ns-3.22/src/aodv/test/udp-chain-test-0-0.pcap ns-3.23/src/aodv/test/u
dp-chain-test-0-0.pcap
--- ns-3.22/src/aodv/test/udp-chain-test-0-0.pcap
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/aodv/test/udp-chain-test-0-0.pcap
2015-05-13 11:05:27.0000
00000 -0700
@@ -1,84 +1,84 @@
-i87TT
+i.TT

E0
+
+  
+
+HTT


E 0

  

-HqTT  
 E0
+ TT

 E0

  

-H^TT
+xPTT


E 0

  

- TT

E0
-
-  
-
-XX

E 4
+XX

E 4

   (


-HXX
+XX

E4

   (


-n@@<
+@@<

0  

- o  @@
+ @@


@  

- @@<
+@@<




0 

-    T T<
+  TT<

PE0

  


-  
-@@
+C 
+@@ 


-@@< 
+j@@< 

`  

 
-
-_((<
+z 
+((<



-
-
-
-
-
+

p  




@ 
@ 

PE @

@ 


 ((<
`E @

p 
 

 @@
@@


-k C((<
+| T((<

 E?


-
|((<
+
 ((<
+

`E @
+
+
+
p  6((<

 E?

@@ -146,34 +146,34 @@


?E 


-
TT
+
gTT

  

-TT
+TT


E 0

  

-x@@

+@@


-z@@< 
+@@< 

 

-  
-D((<
+ 
+ ((<



-
+

0  




E 0
E 0

 
 

 E

@

% 
e 

@@
@@


-   ((<
+ !((<

@E
?

diff -Naur ns-3.22/src/aodv/test/udp-chain-test-9-0.pcap ns-3.23/src/aodv/test/u
dp-chain-test-9-0.pcap
--- ns-3.22/src/aodv/test/udp-chain-test-9-0.pcap
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/aodv/test/udp-chain-test-9-0.pcap
2015-05-13 11:05:27.0000
00000 -0700
@@ -1,53 +1,53 @@
-iYTTE0
+iTTE0

  



- TTE0
+TTE0


  



  :TTE 0
 (TTE 0

-
+

  




-@ TTE0
+HTT E 0

  


-
 @@  
-

-  TT<0E0
-
-  @ 
-
-
-s@@@ 
+
  f@@  



- @@<  
+f@@<  


-
B   TT<PE0
+
f g j hTT<0E0


  


-_ @@<` 
+_zh v @@@ 
+

+v  wTT<PE0
+
+  @ 
+
+
+C @@<` 


-     ((<pE 8
*+   W v ]((<pE8


-
  q  7 ((< E 8
+
 ]   G ((< E 8


-
G    ((< E 8
+
W    ((<  E8



    ((<E8

@@ -65,36 +65,37 @@
 /  5((<E8


-
5 6TT0E 0
+
5 @ TT0E0

  



- TTE 0
+ TTE 0

  



 9  ((<8E


-
 g>@@< 
+
 w@@< 


- D  T@@  
+   <@@  



-T@@<@ 
+^@@<@ 


-
u U q [((<0E
8
+

+ ((<0E 
8 


-
 [ 3  9((<@E 
+
    ((<@E
8


-
9   ((<PE8
+
    ((<PE8



 Y  
((<`E

8
diff -Naur ns-3.22/src/applications/bindings/modulegen__gcc_ILP32.py ns-3.23/src
/applications/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/applications/bindings/modulegen__gcc_ILP32.py 2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/applications/bindings/modulegen__gcc_ILP32.py 2015-05-13 11:05
:27.000000000 -0700
@@ -1721,11 +1721,21 @@
cls.add_constructor([param('uint64_t', 'bps')])
## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate
) [constructor]
cls.add_constructor([param('std::string', 'rate')])
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTx
Time(uint32_t bits) const [member function]
+
cls.add_method('CalculateBitsTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bits')],
+
is_const=True)
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesT
xTime(uint32_t bytes) const [member function]
+
cls.add_method('CalculateBytesTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bytes')],
+
is_const=True)
## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(ui
nt32_t bytes) const [member function]
cls.add_method('CalculateTxTime',
'double',
[param('uint32_t', 'bytes')],
is_const=True)
+
deprecated=True, is_const=True)
## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() con
st [member function]
cls.add_method('GetBitRate',
'uint64_t',
diff -Naur ns-3.22/src/applications/bindings/modulegen__gcc_LP64.py ns-3.23/src/
applications/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/applications/bindings/modulegen__gcc_LP64.py
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/applications/bindings/modulegen__gcc_LP64.py
2015-05-13 11:05
:27.000000000 -0700
@@ -1721,11 +1721,21 @@
cls.add_constructor([param('uint64_t', 'bps')])
## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate
) [constructor]
cls.add_constructor([param('std::string', 'rate')])
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTx
Time(uint32_t bits) const [member function]
+
cls.add_method('CalculateBitsTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bits')],
+
is_const=True)
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesT
xTime(uint32_t bytes) const [member function]
+
cls.add_method('CalculateBytesTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bytes')],
+
is_const=True)
## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(ui
nt32_t bytes) const [member function]

cls.add_method('CalculateTxTime',
'double',
[param('uint32_t', 'bytes')],
is_const=True)
+
deprecated=True, is_const=True)
## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() con
st [member function]
cls.add_method('GetBitRate',
'uint64_t',
diff -Naur ns-3.22/src/applications/model/application-packet-probe.cc ns-3.23/sr
c/applications/model/application-packet-probe.cc
--- ns-3.22/src/applications/model/application-packet-probe.cc 2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/applications/model/application-packet-probe.cc 2015-05-13 11:05
:27.000000000 -0700
@@ -39,6 +39,7 @@
{
static TypeId tid = TypeId ("ns3::ApplicationPacketProbe")
.SetParent<Probe> ()
+
.SetGroupName("Applications")
.AddConstructor<ApplicationPacketProbe> ()
.AddTraceSource ( "Output",
"The packet plus its socket address that serve "
diff -Naur ns-3.22/src/applications/model/bulk-send-application.cc ns-3.23/src/a
pplications/model/bulk-send-application.cc
--- ns-3.22/src/applications/model/bulk-send-application.cc
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/applications/model/bulk-send-application.cc
2015-05-13 11:05
:27.000000000 -0700
@@ -42,6 +42,7 @@
{
static TypeId tid = TypeId ("ns3::BulkSendApplication")
.SetParent<Application> ()
+
.SetGroupName("Applications")
.AddConstructor<BulkSendApplication> ()
.AddAttribute ("SendSize", "The amount of data to send each time.",
UintegerValue (512),
@@ -224,7 +225,7 @@
if (m_connected)
{ // Only send new data if the connection has completed
Simulator::ScheduleNow (&BulkSendApplication::SendData, this);
+
SendData ();
}
}
diff -Naur ns-3.22/src/applications/model/onoff-application.cc ns-3.23/src/appli
cations/model/onoff-application.cc
--- ns-3.22/src/applications/model/onoff-application.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/applications/model/onoff-application.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -53,6 +53,7 @@
{
static TypeId tid = TypeId ("ns3::OnOffApplication")
.SetParent<Application> ()
+
.SetGroupName("Applications")
.AddConstructor<OnOffApplication> ()
.AddAttribute ("DataRate", "The data rate in on state.",
DataRateValue (DataRate ("500kb/s")),

diff -Naur ns-3.22/src/applications/model/packet-sink.cc ns-3.23/src/application


s/model/packet-sink.cc
--- ns-3.22/src/applications/model/packet-sink.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/applications/model/packet-sink.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -43,6 +43,7 @@
{
static TypeId tid = TypeId ("ns3::PacketSink")
.SetParent<Application> ()
+
.SetGroupName("Applications")
.AddConstructor<PacketSink> ()
.AddAttribute ("Local",
"The Address on which to Bind the rx socket.",
diff -Naur ns-3.22/src/applications/model/ping6.cc ns-3.23/src/applications/mode
l/ping6.cc
--- ns-3.22/src/applications/model/ping6.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/applications/model/ping6.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -46,6 +46,7 @@
{
static TypeId tid = TypeId ("ns3::Ping6")
.SetParent<Application>()
+
.SetGroupName("Applications")
.AddConstructor<Ping6>()
.AddAttribute ("MaxPackets",
"The maximum number of packets the application will send",
diff -Naur ns-3.22/src/applications/model/radvd.cc ns-3.23/src/applications/mode
l/radvd.cc
--- ns-3.22/src/applications/model/radvd.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/applications/model/radvd.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -52,6 +52,7 @@
{
static TypeId tid = TypeId ("ns3::Radvd")
.SetParent<Application> ()
+
.SetGroupName("Applications")
.AddConstructor<Radvd> ()
.AddAttribute ("AdvertisementJitter",
"Uniform variable to provide jitter between min and max valu
es of AdvInterval",
diff -Naur ns-3.22/src/applications/model/seq-ts-header.cc ns-3.23/src/applicati
ons/model/seq-ts-header.cc
--- ns-3.22/src/applications/model/seq-ts-header.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/applications/model/seq-ts-header.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -62,6 +62,7 @@
{
static TypeId tid = TypeId ("ns3::SeqTsHeader")
.SetParent<Header> ()
+
.SetGroupName("Applications")
.AddConstructor<SeqTsHeader> ()
;
return tid;
diff -Naur ns-3.22/src/applications/model/udp-client.cc ns-3.23/src/applications
/model/udp-client.cc
--- ns-3.22/src/applications/model/udp-client.cc
2015-02-05 15:46:22.0000

00000 -0800
+++ ns-3.23/src/applications/model/udp-client.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -44,6 +44,7 @@
{
static TypeId tid = TypeId ("ns3::UdpClient")
.SetParent<Application> ()
+
.SetGroupName("Applications")
.AddConstructor<UdpClient> ()
.AddAttribute ("MaxPackets",
"The maximum number of packets the application will send",
diff -Naur ns-3.22/src/applications/model/udp-echo-client.cc ns-3.23/src/applica
tions/model/udp-echo-client.cc
--- ns-3.22/src/applications/model/udp-echo-client.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/applications/model/udp-echo-client.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -40,6 +40,7 @@
{
static TypeId tid = TypeId ("ns3::UdpEchoClient")
.SetParent<Application> ()
+
.SetGroupName("Applications")
.AddConstructor<UdpEchoClient> ()
.AddAttribute ("MaxPackets",
"The maximum number of packets the application will send",
diff -Naur ns-3.22/src/applications/model/udp-echo-server.cc ns-3.23/src/applica
tions/model/udp-echo-server.cc
--- ns-3.22/src/applications/model/udp-echo-server.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/applications/model/udp-echo-server.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -43,6 +43,7 @@
{
static TypeId tid = TypeId ("ns3::UdpEchoServer")
.SetParent<Application> ()
+
.SetGroupName("Applications")
.AddConstructor<UdpEchoServer> ()
.AddAttribute ("Port", "Port on which we listen for incoming packets.",
UintegerValue (9),
diff -Naur ns-3.22/src/applications/model/udp-server.cc ns-3.23/src/applications
/model/udp-server.cc
--- ns-3.22/src/applications/model/udp-server.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/applications/model/udp-server.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -46,6 +46,7 @@
{
static TypeId tid = TypeId ("ns3::UdpServer")
.SetParent<Application> ()
+
.SetGroupName("Applications")
.AddConstructor<UdpServer> ()
.AddAttribute ("Port",
"Port on which we listen for incoming packets.",
diff -Naur ns-3.22/src/applications/model/udp-trace-client.cc ns-3.23/src/applic
ations/model/udp-trace-client.cc
--- ns-3.22/src/applications/model/udp-trace-client.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/applications/model/udp-trace-client.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -62,6 +62,7 @@

static TypeId tid = TypeId ("ns3::UdpTraceClient")


.SetParent<Application> ()
+
.SetGroupName("Applications")
.AddConstructor<UdpTraceClient> ()
.AddAttribute ("RemoteAddress",
"The destination Address of the outbound packets",
diff -Naur ns-3.22/src/applications/model/v4ping.cc ns-3.23/src/applications/mod
el/v4ping.cc
--- ns-3.22/src/applications/model/v4ping.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/applications/model/v4ping.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -37,6 +37,7 @@
{
static TypeId tid = TypeId ("ns3::V4Ping")
.SetParent<Application> ()
+
.SetGroupName("Applications")
.AddConstructor<V4Ping> ()
.AddAttribute ("Remote",
"The address of the machine we want to ping.",
diff -Naur ns-3.22/src/bridge/model/bridge-channel.cc ns-3.23/src/bridge/model/b
ridge-channel.cc
--- ns-3.22/src/bridge/model/bridge-channel.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/bridge/model/bridge-channel.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -30,6 +30,7 @@
{
static TypeId tid = TypeId ("ns3::BridgeChannel")
.SetParent<Channel> ()
+
.SetGroupName("Bridge")
.AddConstructor<BridgeChannel> ()
;
return tid;
diff -Naur ns-3.22/src/bridge/model/bridge-net-device.cc ns-3.23/src/bridge/mode
l/bridge-net-device.cc
--- ns-3.22/src/bridge/model/bridge-net-device.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/bridge/model/bridge-net-device.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -36,6 +36,7 @@
{
static TypeId tid = TypeId ("ns3::BridgeNetDevice")
.SetParent<NetDevice> ()
+
.SetGroupName("Bridge")
.AddConstructor<BridgeNetDevice> ()
.AddAttribute ("Mtu", "The MAC-level Maximum Transmission Unit",
UintegerValue (1500),
@@ -398,11 +399,13 @@
// data was not unicast or no state has been learned for that mac
// address => flood through all ports.
+ Ptr<Packet> pktCopy;
for (std::vector< Ptr<NetDevice> >::iterator iter = m_ports.begin ();
iter != m_ports.end (); iter++)
{
+
pktCopy = packet->Copy ();
Ptr<NetDevice> port = *iter;
port->SendFrom (packet, src, dest, protocolNumber);

port->SendFrom (pktCopy, src, dest, protocolNumber);

return true;
diff -Naur ns-3.22/src/buildings/helper/building-allocator.cc ns-3.23/src/buildi
ngs/helper/building-allocator.cc
--- ns-3.22/src/buildings/helper/building-allocator.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/buildings/helper/building-allocator.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -51,6 +51,7 @@
static TypeId tid = TypeId ("ns3::GridBuildingAllocator")
.SetParent<Object> ()
.AddConstructor<GridBuildingAllocator> ()
+
.SetGroupName ("Buildings")
.AddAttribute ("GridWidth", "The number of objects layed out on a line.",
UintegerValue (10),
MakeUintegerAccessor (&GridBuildingAllocator::m_n),
diff -Naur ns-3.22/src/buildings/helper/building-position-allocator.cc ns-3.23/s
rc/buildings/helper/building-position-allocator.cc
--- ns-3.22/src/buildings/helper/building-position-allocator.cc 2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/buildings/helper/building-position-allocator.cc 2015-05-13 11:05
:27.000000000 -0700
@@ -50,7 +50,7 @@
{
static TypeId tid = TypeId ("ns3::RandomBuildingPositionAllocator")
.SetParent<PositionAllocator> ()
.SetGroupName ("Mobility")
+
.SetGroupName ("Buildings")
.AddConstructor<RandomBuildingPositionAllocator> ()
.AddAttribute ("WithReplacement",
"If true, the building will be randomly selected with replac
ement. "
@@ -117,7 +117,7 @@
{
static TypeId tid = TypeId ("ns3::RandomRoomPositionAllocator")
.SetParent<PositionAllocator> ()
.SetGroupName ("Mobility")
+
.SetGroupName ("Buildings")
.AddConstructor<RandomRoomPositionAllocator> ();
return tid;
}
@@ -221,7 +221,7 @@
{
static TypeId tid = TypeId ("ns3::SameRoomPositionAllocator")
.SetParent<PositionAllocator> ()
.SetGroupName ("Mobility")
+
.SetGroupName ("Buildings")
.AddConstructor<SameRoomPositionAllocator> ();
return tid;
}
@@ -303,7 +303,7 @@
{
static TypeId tid = TypeId ("ns3::FixedRoomPositionAllocator")
.SetParent<PositionAllocator> ()
.SetGroupName ("Mobility")
+
.SetGroupName ("Buildings")
.AddConstructor<SameRoomPositionAllocator> ();
return tid;

}
diff -Naur ns-3.22/src/buildings/model/building.cc ns-3.23/src/buildings/model/b
uilding.cc
--- ns-3.22/src/buildings/model/building.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/buildings/model/building.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -41,6 +41,7 @@
static TypeId tid = TypeId ("ns3::Building")
.SetParent<Object> ()
.AddConstructor<Building> ()
+
.SetGroupName ("Buildings")
.AddAttribute ("NRoomsX", "The number of rooms in the X axis.",
UintegerValue (1),
MakeUintegerAccessor (&Building::GetNRoomsX, &Building::SetN
RoomsX),
diff -Naur ns-3.22/src/buildings/model/building-list.cc ns-3.23/src/buildings/mo
del/building-list.cc
--- ns-3.22/src/buildings/model/building-list.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/buildings/model/building-list.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -64,6 +64,7 @@
{
static TypeId tid = TypeId ("ns3::BuildingListPriv")
.SetParent<Object> ()
+
.SetGroupName ("Buildings")
.AddAttribute ("BuildingList", "The list of all buildings created during th
e simulation.",
ObjectVectorValue (),
MakeObjectVectorAccessor (&BuildingListPriv::m_buildings),
diff -Naur ns-3.22/src/buildings/model/buildings-propagation-loss-model.cc ns-3.
23/src/buildings/model/buildings-propagation-loss-model.cc
--- ns-3.22/src/buildings/model/buildings-propagation-loss-model.cc
2015-0205 15:46:22.000000000 -0800
+++ ns-3.23/src/buildings/model/buildings-propagation-loss-model.cc
2015-0513 11:05:27.000000000 -0700
@@ -65,6 +65,7 @@
static TypeId tid = TypeId ("ns3::BuildingsPropagationLossModel")
+

.SetParent<PropagationLossModel> ()
.SetGroupName ("Buildings")

.AddAttribute ("ShadowSigmaOutdoor",
diff -Naur ns-3.22/src/buildings/model/hybrid-buildings-propagation-loss-model.c
c ns-3.23/src/buildings/model/hybrid-buildings-propagation-loss-model.cc
--- ns-3.22/src/buildings/model/hybrid-buildings-propagation-loss-model.cc
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/buildings/model/hybrid-buildings-propagation-loss-model.cc
2015-05-13 11:05:27.000000000 -0700
@@ -66,6 +66,7 @@
.SetParent<BuildingsPropagationLossModel> ()
+

.AddConstructor<HybridBuildingsPropagationLossModel> ()
.SetGroupName ("Buildings")

.AddAttribute ("Frequency",
"The Frequency (default is 2.106 GHz).",
diff -Naur ns-3.22/src/buildings/model/itu-r-1238-propagation-loss-model.cc ns-3

.23/src/buildings/model/itu-r-1238-propagation-loss-model.cc
--- ns-3.22/src/buildings/model/itu-r-1238-propagation-loss-model.cc
05 15:46:22.000000000 -0800
+++ ns-3.23/src/buildings/model/itu-r-1238-propagation-loss-model.cc
13 11:05:27.000000000 -0700
@@ -41,6 +41,7 @@
static TypeId tid = TypeId ("ns3::ItuR1238PropagationLossModel")
+

2015-022015-05-

.SetParent<PropagationLossModel> ()
.SetGroupName ("Buildings")

.AddAttribute ("Frequency",
"The Frequency (default is 2.106 GHz).",
diff -Naur ns-3.22/src/buildings/model/mobility-building-info.cc ns-3.23/src/bui
ldings/model/mobility-building-info.cc
--- ns-3.22/src/buildings/model/mobility-building-info.cc
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/buildings/model/mobility-building-info.cc
2015-05-13 11:05
:27.000000000 -0700
@@ -37,7 +37,7 @@
{
static TypeId tid = TypeId ("ns3::MobilityBuildingInfo")
.SetParent<Object> ()
.SetGroupName ("Building")
+
.SetGroupName ("Buildings")
.AddConstructor<MobilityBuildingInfo> ();
return tid;
diff -Naur ns-3.22/src/buildings/model/oh-buildings-propagation-loss-model.cc ns
-3.23/src/buildings/model/oh-buildings-propagation-loss-model.cc
--- ns-3.22/src/buildings/model/oh-buildings-propagation-loss-model.cc 2015-0205 15:46:22.000000000 -0800
+++ ns-3.23/src/buildings/model/oh-buildings-propagation-loss-model.cc 2015-0513 11:05:27.000000000 -0700
@@ -54,6 +54,7 @@
static TypeId tid = TypeId ("ns3::OhBuildingsPropagationLossModel")
.SetParent<BuildingsPropagationLossModel> ()
+ .SetGroupName ("Buildings")
.AddConstructor<OhBuildingsPropagationLossModel> ();
diff -Naur ns-3.22/src/click/model/ipv4-click-routing.cc ns-3.23/src/click/model
/ipv4-click-routing.cc
--- ns-3.22/src/click/model/ipv4-click-routing.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/click/model/ipv4-click-routing.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -55,6 +55,7 @@
static TypeId tid = TypeId ("ns3::Ipv4ClickRouting")
.SetParent<Ipv4RoutingProtocol> ()
.AddConstructor<Ipv4ClickRouting> ()
+
.SetGroupName ("Click")
;
return tid;
diff -Naur ns-3.22/src/click/model/ipv4-l3-click-protocol.cc ns-3.23/src/click/m
odel/ipv4-l3-click-protocol.cc
--- ns-3.22/src/click/model/ipv4-l3-click-protocol.cc 2015-02-05 15:46:22.0000
00000 -0800

+++ ns-3.23/src/click/model/ipv4-l3-click-protocol.cc 2015-05-13 11:05:27.0000


00000 -0700
@@ -52,6 +52,7 @@
static TypeId tid = TypeId ("ns3::Ipv4L3ClickProtocol")
.SetParent<Ipv4> ()
.AddConstructor<Ipv4L3ClickProtocol> ()
+
.SetGroupName ("Click")
.AddAttribute ("DefaultTtl", "The TTL value set by default on all outgoing
packets generated on this node.",
UintegerValue (64),
MakeUintegerAccessor (&Ipv4L3ClickProtocol::m_defaultTtl),
diff -Naur ns-3.22/src/config-store/model/config-store.cc ns-3.23/src/config-sto
re/model/config-store.cc
--- ns-3.22/src/config-store/model/config-store.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/config-store/model/config-store.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -29,6 +29,7 @@
{
static TypeId tid = TypeId ("ns3::ConfigStore")
.SetParent<ObjectBase> ()
+
.SetGroupName ("ConfigStore")
.AddAttribute ("Mode",
"Configuration mode",
EnumValue (ConfigStore::NONE),
diff -Naur ns-3.22/src/core/bindings/modulegen__gcc_ILP32.py ns-3.23/src/core/bi
ndings/modulegen__gcc_ILP32.py
--- ns-3.22/src/core/bindings/modulegen__gcc_ILP32.py 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/core/bindings/modulegen__gcc_ILP32.py 2015-05-13 11:05:27.0000
00000 -0700
@@ -3926,10 +3926,10 @@
cls.add_constructor([param('ns3::RealtimeSimulatorImpl const &', 'arg0')])
## realtime-simulator-impl.h (module 'core'): ns3::RealtimeSimulatorImpl::R
ealtimeSimulatorImpl() [constructor]
cls.add_constructor([])
## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorIm
pl::Cancel(ns3::EventId const & id) [member function]
+
## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorIm
pl::Cancel(ns3::EventId const & ev) [member function]
cls.add_method('Cancel',
'void',
[param('ns3::EventId const &', 'id')],
+
[param('ns3::EventId const &', 'ev')],
is_virtual=True)
## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorIm
pl::Destroy() [member function]
cls.add_method('Destroy',
@@ -3971,10 +3971,10 @@
'ns3::TypeId',
[],
is_static=True)
## realtime-simulator-impl.h (module 'core'): bool ns3::RealtimeSimulatorIm
pl::IsExpired(ns3::EventId const & id) const [member function]
+
## realtime-simulator-impl.h (module 'core'): bool ns3::RealtimeSimulatorIm
pl::IsExpired(ns3::EventId const & ev) const [member function]
cls.add_method('IsExpired',
'bool',
[param('ns3::EventId const &', 'id')],
+
[param('ns3::EventId const &', 'ev')],

is_const=True, is_virtual=True)
## realtime-simulator-impl.h (module 'core'): bool ns3::RealtimeSimulatorIm
pl::IsFinished() const [member function]
cls.add_method('IsFinished',
@@ -3991,10 +3991,10 @@
'ns3::Time',
[],
is_const=True)
## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorIm
pl::Remove(ns3::EventId const & id) [member function]
+
## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorIm
pl::Remove(ns3::EventId const & ev) [member function]
cls.add_method('Remove',
'void',
[param('ns3::EventId const &', 'id')],
+
[param('ns3::EventId const &', 'ev')],
is_virtual=True)
## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorIm
pl::Run() [member function]
cls.add_method('Run',
diff -Naur ns-3.22/src/core/bindings/modulegen__gcc_LP64.py ns-3.23/src/core/bin
dings/modulegen__gcc_LP64.py
--- ns-3.22/src/core/bindings/modulegen__gcc_LP64.py
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/core/bindings/modulegen__gcc_LP64.py
2015-05-13 11:05:27.0000
00000 -0700
@@ -3926,10 +3926,10 @@
cls.add_constructor([param('ns3::RealtimeSimulatorImpl const &', 'arg0')])
## realtime-simulator-impl.h (module 'core'): ns3::RealtimeSimulatorImpl::R
ealtimeSimulatorImpl() [constructor]
cls.add_constructor([])
## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorIm
pl::Cancel(ns3::EventId const & id) [member function]
+
## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorIm
pl::Cancel(ns3::EventId const & ev) [member function]
cls.add_method('Cancel',
'void',
[param('ns3::EventId const &', 'id')],
+
[param('ns3::EventId const &', 'ev')],
is_virtual=True)
## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorIm
pl::Destroy() [member function]
cls.add_method('Destroy',
@@ -3971,10 +3971,10 @@
'ns3::TypeId',
[],
is_static=True)
## realtime-simulator-impl.h (module 'core'): bool ns3::RealtimeSimulatorIm
pl::IsExpired(ns3::EventId const & id) const [member function]
+
## realtime-simulator-impl.h (module 'core'): bool ns3::RealtimeSimulatorIm
pl::IsExpired(ns3::EventId const & ev) const [member function]
cls.add_method('IsExpired',
'bool',
[param('ns3::EventId const &', 'id')],
+
[param('ns3::EventId const &', 'ev')],
is_const=True, is_virtual=True)
## realtime-simulator-impl.h (module 'core'): bool ns3::RealtimeSimulatorIm
pl::IsFinished() const [member function]
cls.add_method('IsFinished',
@@ -3991,10 +3991,10 @@

'ns3::Time',
[],
is_const=True)
## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorIm
pl::Remove(ns3::EventId const & id) [member function]
+
## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorIm
pl::Remove(ns3::EventId const & ev) [member function]
cls.add_method('Remove',
'void',
[param('ns3::EventId const &', 'id')],
+
[param('ns3::EventId const &', 'ev')],
is_virtual=True)
## realtime-simulator-impl.h (module 'core'): void ns3::RealtimeSimulatorIm
pl::Run() [member function]
cls.add_method('Run',
diff -Naur ns-3.22/src/core/model/assert.h ns-3.23/src/core/model/assert.h
--- ns-3.22/src/core/model/assert.h
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/assert.h
2015-05-13 11:05:27.000000000 -0700
@@ -22,6 +22,12 @@
#define NS_ASSERT_H
/**
+ * \file
+ * \ingroup assert
+ * Definition of assertion macros NS_ASSERT() and NS_ASSERT_MSG().
+ */
+
+/**
* \ingroup debugging
* \defgroup assert Assertions
*
diff -Naur ns-3.22/src/core/model/breakpoint.cc ns-3.23/src/core/model/breakpoin
t.cc
--- ns-3.22/src/core/model/breakpoint.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/breakpoint.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -28,6 +28,12 @@
namespace ns3 {
+/**
+ * \file
+ * \ingroup breakpoint
+ * ns3::BreakpointFallback function implementation.
+ */
+
NS_LOG_COMPONENT_DEFINE ("Breakpoint");
#if defined (HAVE_SIGNAL_H) && defined (SIGTRAP)
diff -Naur ns-3.22/src/core/model/breakpoint.h ns-3.23/src/core/model/breakpoint
.h
--- ns-3.22/src/core/model/breakpoint.h 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/breakpoint.h 2015-05-13 11:05:27.000000000 -0700
@@ -21,6 +21,13 @@
#ifndef BREAKPOINT_H
#define BREAKPOINT_H
+/**
+ * \file

+
+
+
+
+

* \ingroup breakpoint
* Definition of NS_BREAKPOINT() macro and ns3::BreakpointFallback
* function declaration.
*/
namespace ns3 {

/* Hacker macro to place breakpoints for selected machines.


diff -Naur ns-3.22/src/core/model/cairo-wideint.c ns-3.23/src/core/model/cairo-w
ideint.c
--- ns-3.22/src/core/model/cairo-wideint.c
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/cairo-wideint.c
2015-05-13 11:05:27.000000000 -0
700
@@ -30,6 +30,12 @@
#include "cairo-wideint-private.h"
+/**
+ * \file
+ * \ingroup highprec
+ * Implementation of the cairo_x functions which implement high precision arith
metic.
+ */
+
#if HAVE_UINT64_T
const char * cairo_impl64 = "uint64_t";
diff -Naur ns-3.22/src/core/model/cairo-wideint-private.h ns-3.23/src/core/model
/cairo-wideint-private.h
--- ns-3.22/src/core/model/cairo-wideint-private.h
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/core/model/cairo-wideint-private.h
2015-05-13 11:05:27.0000
00000 -0700
@@ -32,6 +32,12 @@
#ifndef CAIRO_WIDEINT_H
#define CAIRO_WIDEINT_H
+/**
+ * \file
+ * \ingroup highprec
+ * Declaration of the cairo_x functions which implement high precision arithmet
ic.
+ */
+
// Adapt to ns-3 environment
#include "ns3/core-config.h"
#define cairo_private
diff -Naur ns-3.22/src/core/model/calendar-scheduler.cc ns-3.23/src/core/model/c
alendar-scheduler.cc
--- ns-3.22/src/core/model/calendar-scheduler.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/core/model/calendar-scheduler.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -26,6 +26,12 @@
#include "assert.h"
#include "log.h"
+/**
+ * \file

+ * \ingroup scheduler
+ * Implementation of ns3::CalendarScheduler class.
+ */
+
namespace ns3 {
NS_LOG_COMPONENT_DEFINE ("CalendarScheduler");
@@ -37,6 +43,7 @@
{
static TypeId tid = TypeId ("ns3::CalendarScheduler")
.SetParent<Scheduler> ()
+
.SetGroupName ("Core")
.AddConstructor<CalendarScheduler> ()
;
return tid;
diff -Naur ns-3.22/src/core/model/calendar-scheduler.h ns-3.23/src/core/model/ca
lendar-scheduler.h
--- ns-3.22/src/core/model/calendar-scheduler.h 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/calendar-scheduler.h 2015-05-13 11:05:27.000000000 -0
700
@@ -25,6 +25,12 @@
#include <stdint.h>
#include <list>
+/**
+ * \file
+ * \ingroup scheduler
+ * Declaration of ns3::CalendarScheduler class.
+ */
+
namespace ns3 {
class EventImpl;
diff -Naur ns-3.22/src/core/model/callback.h ns-3.23/src/core/model/callback.h
--- ns-3.22/src/core/model/callback.h 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/callback.h 2015-05-13 11:05:27.000000000 -0700
@@ -30,6 +30,12 @@
#include "simple-ref-count.h"
#include <typeinfo>
+/**
+ * \file
+ * \ingroup callback
+ * Declaration of the various callback functions.
+ */
+
namespace ns3 {
// Define the doxygen subgroups all at once,
diff -Naur ns-3.22/src/core/model/config.cc ns-3.23/src/core/model/config.cc
--- ns-3.22/src/core/model/config.cc
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/config.cc
2015-05-13 11:05:27.000000000 -0700
@@ -28,6 +28,12 @@
#include <sstream>
+/**
+ * \file
+ * \ingroup config

+ * Imlementation of the various ns3::Config functions and classes.


+ */
+
namespace ns3 {
NS_LOG_COMPONENT_DEFINE ("Config");
diff -Naur ns-3.22/src/core/model/config.h ns-3.23/src/core/model/config.h
--- ns-3.22/src/core/model/config.h
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/config.h
2015-05-13 11:05:27.000000000 -0700
@@ -24,6 +24,12 @@
#include <string>
#include <vector>
+/**
+ * \file
+ * \ingroup config
+ * Declaration of the various ns3::Config functions and classes.
+ */
+
namespace ns3 {
class AttributeValue;
@@ -31,18 +37,26 @@
class CallbackBase;
/**
- * \brief Configuration of simulation parameters and tracing
* \ingroup core
+ * \defgroup config Configuration
+ * \brief Configuration of simulation parameters and tracing.
+ */
+
+/**
+ * \ingroup config
+ * Namespace for the various functions implementing the Config system.
*/
namespace 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 (void);
/**
+ * \ingroup config
* \param path a path to match attributes.
* \param value the value to set in all matching attributes.
*
@@ -52,6 +66,7 @@
*/
void Set (std::string path, const AttributeValue &value);
/**
+ * \ingroup config
* \param name the full name of the attribute
* \param value the value to set.
*
@@ -61,6 +76,7 @@
*/

void SetDefault (std::string name, const AttributeValue &value);


/**
+ * \ingroup config
* \param name the full name of the attribute
* \param value the value to set.
* \returns true if the value was set successfully, false otherwise.
@@ -70,6 +86,7 @@
*/
bool SetDefaultFailSafe (std::string name, const AttributeValue &value);
/**
+ * \ingroup config
* \param name the name of the requested GlobalValue.
* \param value the value to set
*
@@ -77,6 +94,7 @@
*/
void SetGlobal (std::string name, const AttributeValue &value);
/**
+ * \ingroup config
* \param name the name of the requested GlobalValue.
* \param value the value to set
*
@@ -84,6 +102,7 @@
*/
bool SetGlobalFailSafe (std::string name, const AttributeValue &value);
/**
+ * \ingroup config
* \param path a path to match trace sources.
* \param cb the callback to connect to the matching trace sources.
*
@@ -93,6 +112,7 @@
*/
void ConnectWithoutContext (std::string path, const CallbackBase &cb);
/**
+ * \ingroup config
* \param path a path to match trace sources.
* \param cb the callback to disconnect to the matching trace sources.
*
@@ -100,6 +120,7 @@
*/
void DisconnectWithoutContext (std::string path, const CallbackBase &cb);
/**
+ * \ingroup config
* \param path a path to match trace sources.
* \param cb the callback to connect to the matching trace sources.
*
@@ -110,6 +131,7 @@
*/
void Connect (std::string path, const CallbackBase &cb);
/**
+ * \ingroup config
* \param path a path to match trace sources.
* \param cb the callback to connect to the matching trace sources.
*
@@ -118,6 +140,7 @@
void Disconnect (std::string path, const CallbackBase &cb);
/**
+ * \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
@@ -216,6 +239,7 @@
};
/**
+ * \ingroup config
* \param path the path to perform a match against
* \returns a container which contains all the objects which match the input
*
path.
@@ -223,6 +247,7 @@
MatchContainer LookupMatches (std::string path);
/**
+ * \ingroup config
* \param obj a new root object
*
* Each root object is used during path matching as
@@ -230,6 +255,7 @@
*/
void RegisterRootNamespaceObject (Ptr<Object> obj);
/**
+ * \ingroup config
* \param obj a new root object
*
* This function undoes the work of Config::RegisterRootNamespaceObject.
@@ -237,11 +263,13 @@
void UnregisterRootNamespaceObject (Ptr<Object> obj);
/**
+ * \ingroup config
* \returns the number of registered root namespace objects.
*/
uint32_t GetRootNamespaceObjectN (void);
/**
+ * \ingroup config
* \param i the index of the requested object.
* \returns the requested root namespace object
*/
diff -Naur ns-3.22/src/core/model/default-simulator-impl.cc ns-3.23/src/core/mod
el/default-simulator-impl.cc
--- ns-3.22/src/core/model/default-simulator-impl.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/core/model/default-simulator-impl.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -31,6 +31,12 @@
#include <cmath>
+/**
+ * \file
+ * \ingroup simulator
+ * Implementation of class ns3::DefaultSimulatorImpl.
+ */
+
namespace ns3 {
// Note: Logging in this file is largely avoided due to the
@@ -45,6 +51,7 @@

static TypeId tid = TypeId ("ns3::DefaultSimulatorImpl")


.SetParent<SimulatorImpl> ()
+
.SetGroupName ("Core")
.AddConstructor<DefaultSimulatorImpl> ()
;
return tid;
diff -Naur ns-3.22/src/core/model/default-simulator-impl.h ns-3.23/src/core/mode
l/default-simulator-impl.h
--- ns-3.22/src/core/model/default-simulator-impl.h
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/core/model/default-simulator-impl.h
2015-05-13 11:05:27.0000
00000 -0700
@@ -31,6 +31,12 @@
#include <list>
+/**
+ * \file
+ * \ingroup simulator
+ * Declaration of class ns3::DefaultSimulatorImpl.
+ */
+
namespace ns3 {
/**
diff -Naur ns-3.22/src/core/model/deprecated.h ns-3.23/src/core/model/deprecated
.h
--- ns-3.22/src/core/model/deprecated.h 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/deprecated.h 2015-05-13 11:05:27.000000000 -0700
@@ -1,6 +1,22 @@
#ifndef NS3_DEPRECATED_H
#define NS3_DEPRECATED_H
+/**
+ * \file
+ * \ingroup core
+ * Definition of the NS_DEPRECATED macro.
+ */
+
+/**
+ * \ingroup core
+ * \def NS_DEPRECATED
+ * Mark a function as deprecated.
+ *
+ * Users should expect deprecated features to be removed eventually.
+ *
+ * When deprecating a feature, please update the documentation
+ * with information for users on how to update their code.
+ */
#if defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ > 1)
#define NS_DEPRECATED __attribute__ ((deprecated))
#else
diff -Naur ns-3.22/src/core/model/empty.h ns-3.23/src/core/model/empty.h
--- ns-3.22/src/core/model/empty.h
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/empty.h
2015-05-13 11:05:27.000000000 -0700
@@ -20,6 +20,12 @@
#ifndef EMPTY_H
#define EMPTY_H

+/**
+ * \file
+ * \ingroup callback
+ * Definition of class ns3::empty, used by callbacks.
+ */
+
namespace ns3 {
/**
* \brief make Callback use a separate empty type
diff -Naur ns-3.22/src/core/model/global-value.cc ns-3.23/src/core/model/globalvalue.cc
--- ns-3.22/src/core/model/global-value.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/global-value.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -29,6 +29,12 @@
#include <cstdlib>
#endif
+/**
+ * \file
+ * \ingroup core
+ * ns3::GlobalValue implementation.
+ */
+
namespace ns3 {
NS_LOG_COMPONENT_DEFINE ("GlobalValue");
diff -Naur ns-3.22/src/core/model/global-value.h ns-3.23/src/core/model/global-v
alue.h
--- ns-3.22/src/core/model/global-value.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/global-value.h
2015-05-13 11:05:27.000000000 -0
700
@@ -25,6 +25,12 @@
#include "ptr.h"
#include "attribute.h"
+/**
+ * \file
+ * \ingroup core
+ * ns3::GlobalValue declaration.
+ */
+
class GlobalValueTestCase;
namespace ns3 {
diff -Naur ns-3.22/src/core/model/heap-scheduler.cc ns-3.23/src/core/model/heapscheduler.cc
--- ns-3.22/src/core/model/heap-scheduler.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/heap-scheduler.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -25,6 +25,12 @@
#include "assert.h"
#include "log.h"
+/**
+ * \file
+ * \ingroup scheduler

+ * Implementation of ns3::HeapScheduler class.


+ */
+
namespace ns3 {
NS_LOG_COMPONENT_DEFINE ("HeapScheduler");
@@ -36,6 +42,7 @@
{
static TypeId tid = TypeId ("ns3::HeapScheduler")
.SetParent<Scheduler> ()
+
.SetGroupName ("Core")
.AddConstructor<HeapScheduler> ()
;
return tid;
diff -Naur ns-3.22/src/core/model/heap-scheduler.h ns-3.23/src/core/model/heap-s
cheduler.h
--- ns-3.22/src/core/model/heap-scheduler.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/heap-scheduler.h
2015-05-13 11:05:27.000000000 -0
700
@@ -25,6 +25,12 @@
#include <stdint.h>
#include <vector>
+/**
+ * \file
+ * \ingroup scheduler
+ * Declaration of ns3::HeapScheduler class.
+ */
+
namespace ns3 {
/**
diff -Naur ns-3.22/src/core/model/int64x64-128.cc ns-3.23/src/core/model/int64x6
4-128.cc
--- ns-3.22/src/core/model/int64x64-128.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/int64x64-128.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -22,6 +22,12 @@
#include "assert.h"
#include "log.h"
+/**
+ * \file
+ * \ingroup highprec
+ * Implementation of the ns3::int64x64_t type using a native int128_t type..
+ */
+
namespace ns3 {
// Note: Logging in this file is largely avoided due to the
diff -Naur ns-3.22/src/core/model/int64x64-128.h ns-3.23/src/core/model/int64x64
-128.h
--- ns-3.22/src/core/model/int64x64-128.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/int64x64-128.h
2015-05-13 11:05:27.000000000 -0
700
@@ -30,6 +30,12 @@
typedef __int128_t int128_t;

#endif
+/**
+ * \file
+ * \ingroup highprec
+ * Declaration of the ns3::int64x64_t type using a native int128_t type..
+ */
+
namespace ns3 {
/**
diff -Naur ns-3.22/src/core/model/int64x64-cairo.cc ns-3.23/src/core/model/int64
x64-cairo.cc
--- ns-3.22/src/core/model/int64x64-cairo.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/int64x64-cairo.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -30,6 +30,12 @@
#include "cairo-wideint.c"
}
+/**
+ * \file
+ * \ingroup highprec
+ * Implementation of the ns3::int64x64_t type using the Cairo implementation.
+ */
+
namespace ns3 {
// Note: Logging in this file is largely avoided due to the
diff -Naur ns-3.22/src/core/model/int64x64-cairo.h ns-3.23/src/core/model/int64x
64-cairo.h
--- ns-3.22/src/core/model/int64x64-cairo.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/int64x64-cairo.h
2015-05-13 11:05:27.000000000 -0
700
@@ -25,6 +25,11 @@
#include "cairo-wideint-private.h"
+/**
+ * \file
+ * \ingroup highprec
+ * Declaration of the ns3::int64x64_t type using the Cairo implementation.
+ */
namespace ns3 {
diff -Naur ns-3.22/src/core/model/int64x64.cc ns-3.23/src/core/model/int64x64.cc
--- ns-3.22/src/core/model/int64x64.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/int64x64.cc 2015-05-13 11:05:27.000000000 -0700
@@ -25,6 +25,12 @@
#include "assert.h"
#include "log.h"
+/**
+ * \file
+ * \ingroup highprec
+ * Implementation of the streaming input and output operators for
+ * the ns3::int64x64_t type.

+ */
namespace ns3 {
diff -Naur ns-3.22/src/core/model/int64x64-double.h ns-3.23/src/core/model/int64
x64-double.h
--- ns-3.22/src/core/model/int64x64-double.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/int64x64-double.h
2015-05-13 11:05:27.000000000 -0
700
@@ -25,6 +25,12 @@
#include <cmath> // pow
#include <utility> // pair
+/**
+ * \file
+ * \ingroup highprec
+ * Declaration and implementation of the ns3::int64x64_t type
+ * using the double type.
+ */
namespace ns3 {
diff -Naur ns-3.22/src/core/model/int64x64.h ns-3.23/src/core/model/int64x64.h
--- ns-3.22/src/core/model/int64x64.h 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/int64x64.h 2015-05-13 11:05:27.000000000 -0700
@@ -36,6 +36,12 @@
#include <iostream>
+/**
+ * \file
+ * \ingroup highprec
+ * Declaration of the ns3::int64x64_t type and associated operators.
+ */
+
namespace ns3 {
/**
diff -Naur ns-3.22/src/core/model/list-scheduler.cc ns-3.23/src/core/model/listscheduler.cc
--- ns-3.22/src/core/model/list-scheduler.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/list-scheduler.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -25,6 +25,12 @@
#include <string>
#include "assert.h"
+/**
+ * \file
+ * \ingroup scheduler
+ * Implementation of ns3::ListScheduler class.
+ */
+
namespace ns3 {
NS_LOG_COMPONENT_DEFINE ("ListScheduler");
@@ -36,6 +42,7 @@
{

static TypeId tid = TypeId ("ns3::ListScheduler")


.SetParent<Scheduler> ()
+
.SetGroupName ("Core")
.AddConstructor<ListScheduler> ()
;
return tid;
diff -Naur ns-3.22/src/core/model/list-scheduler.h ns-3.23/src/core/model/list-s
cheduler.h
--- ns-3.22/src/core/model/list-scheduler.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/list-scheduler.h
2015-05-13 11:05:27.000000000 -0
700
@@ -26,6 +26,12 @@
#include <utility>
#include <stdint.h>
+/**
+ * \file
+ * \ingroup scheduler
+ * Declaration of ns3::ListScheduler class.
+ */
+
namespace ns3 {
class EventImpl;
diff -Naur ns-3.22/src/core/model/log-macros-disabled.h ns-3.23/src/core/model/l
og-macros-disabled.h
--- ns-3.22/src/core/model/log-macros-disabled.h
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/core/model/log-macros-disabled.h
2015-05-13 11:05:27.0000
00000 -0700
@@ -18,11 +18,22 @@
* Author: Andrey Mazo <ahippo@yandex.com>
*/
+/**
+ * \file
+ * \ingroup logging
+ * Definition of empty logging macros and the NS_LOG_NOOP_INTERNAL macro.
+ */
+
+
#ifndef NS3_LOG_MACROS_DISABLED_H
#define NS3_LOG_MACROS_DISABLED_H
#ifndef NS3_LOG_ENABLE
+/**
+ * \ingroup logging
+ * Empty logging macro implementation, used when logging is disabled.
+ */
#define NS_LOG_NOOP_INTERNAL(msg)
\
do
\
{
\
diff -Naur ns-3.22/src/core/model/log-macros-enabled.h ns-3.23/src/core/model/lo
g-macros-enabled.h
--- ns-3.22/src/core/model/log-macros-enabled.h 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/log-macros-enabled.h 2015-05-13 11:05:27.000000000 -0
700

@@ -21,6 +21,12 @@
#ifndef NS3_LOG_MACROS_ENABLED_H
#define NS3_LOG_MACROS_ENABLED_H
+/**
+ * \file
+ * \ingroup logging
+ * Definition of logging macros.
+ */
+
#ifdef NS3_LOG_ENABLE
diff -Naur ns-3.22/src/core/model/map-scheduler.cc ns-3.23/src/core/model/map-sc
heduler.cc
--- ns-3.22/src/core/model/map-scheduler.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/map-scheduler.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -25,6 +25,12 @@
#include "log.h"
#include <string>
+/**
+ * \file
+ * \ingroup scheduler
+ * Implementation of ns3::MapScheduler class.
+ */
+
namespace ns3 {
NS_LOG_COMPONENT_DEFINE ("MapScheduler");
@@ -36,6 +42,7 @@
{
static TypeId tid = TypeId ("ns3::MapScheduler")
.SetParent<Scheduler> ()
+
.SetGroupName ("Core")
.AddConstructor<MapScheduler> ()
;
return tid;
diff -Naur ns-3.22/src/core/model/map-scheduler.h ns-3.23/src/core/model/map-sch
eduler.h
--- ns-3.22/src/core/model/map-scheduler.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/map-scheduler.h
2015-05-13 11:05:27.000000000 -0
700
@@ -26,6 +26,12 @@
#include <map>
#include <utility>
+/**
+ * \file
+ * \ingroup scheduler
+ * Declaration of ns3::MapScheduler class.
+ */
+
namespace ns3 {
/**
diff -Naur ns-3.22/src/core/model/math.h ns-3.23/src/core/model/math.h

--- ns-3.22/src/core/model/math.h
+++ ns-3.23/src/core/model/math.h
@@ -24,6 +24,12 @@
#ifndef MATH_H
#define MATH_H

2015-02-05 15:46:22.000000000 -0800


2015-05-13 11:05:27.000000000 -0700

+/**
+ * \file
+ * \ingroup core
+ * Custom version of log2() to deal with \bugid{1467}.
+ */
+
#include <cmath>
#ifdef __FreeBSD__
diff -Naur ns-3.22/src/core/model/names.cc ns-3.23/src/core/model/names.cc
--- ns-3.22/src/core/model/names.cc
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/names.cc
2015-05-13 11:05:27.000000000 -0700
@@ -23,6 +23,13 @@
#include "abort.h"
#include "names.h"
+/**
+ * \file
+ * \ingroup config
+ * Implementation of class ns3::Names, and declaration of classes
+ * ns3::NamesNode and ns3::NamePriv.
+ */
+
namespace ns3 {
NS_LOG_COMPONENT_DEFINE ("Names");
diff -Naur ns-3.22/src/core/model/names.h ns-3.23/src/core/model/names.h
--- ns-3.22/src/core/model/names.h
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/names.h
2015-05-13 11:05:27.000000000 -0700
@@ -22,6 +22,12 @@
#include "ptr.h"
#include "object.h"
+/**
+ * \file
+ * \ingroup config
+ * Declaration of class ns3::Names.
+ */
+
namespace ns3 {
/**
diff -Naur ns-3.22/src/core/model/nstime.h ns-3.23/src/core/model/nstime.h
--- ns-3.22/src/core/model/nstime.h
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/nstime.h
2015-05-13 11:05:27.000000000 -0700
@@ -31,6 +31,13 @@
#include <ostream>
#include <set>
+/**
+ * \file
+ * \ingroup time
+ * Declaration of classes ns3::Time and ns3::TimeWithUnit,
+ * and the TimeValue implementation classes.

+ */
+
namespace ns3 {
class TimeWithUnit;
diff -Naur ns-3.22/src/core/model/object.cc ns-3.23/src/core/model/object.cc
--- ns-3.22/src/core/model/object.cc
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/object.cc
2015-05-13 11:05:27.000000000 -0700
@@ -87,6 +87,7 @@
{
static TypeId tid = TypeId ("ns3::Object")
.SetParent<ObjectBase> ()
+
.SetGroupName ("Core")
;
return tid;
}
diff -Naur ns-3.22/src/core/model/object-factory.cc ns-3.23/src/core/model/objec
t-factory.cc
--- ns-3.22/src/core/model/object-factory.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/object-factory.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -21,6 +21,12 @@
#include "log.h"
#include <sstream>
+/**
+ * \file
+ * \ingroup object
+ * ns3::ObjectFactory class implementation.
+ */
+
namespace ns3 {
NS_LOG_COMPONENT_DEFINE("ObjectFactory");
diff -Naur ns-3.22/src/core/model/random-variable-stream.cc ns-3.23/src/core/mod
el/random-variable-stream.cc
--- ns-3.22/src/core/model/random-variable-stream.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/core/model/random-variable-stream.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -36,6 +36,12 @@
#include <cmath>
#include <iostream>
+/**
+ * \file
+ * \ingroup randomvariable
+ * Implementation of ns3::RandomVariableStream and derivatives.
+ */
+
namespace ns3 {
NS_LOG_COMPONENT_DEFINE ("RandomVariableStream");
@@ -47,6 +53,7 @@
{
static TypeId tid = TypeId ("ns3::RandomVariableStream")
.SetParent<Object> ()
+
.SetGroupName ("Core")
.AddAttribute("Stream",

"The stream number for this RNG stream. -1 means \"allocate a


stream automatically\". "
"Note that if -1 is set, Get will return -1 so that it is not
possible to know which "
@@ -137,6 +144,7 @@
{
static TypeId tid = TypeId ("ns3::UniformRandomVariable")
.SetParent<RandomVariableStream>()
+
.SetGroupName ("Core")
.AddConstructor<UniformRandomVariable> ()
.AddAttribute("Min", "The lower bound on the values returned by this RNG st
ream.",
DoubleValue(0),
@@ -207,6 +215,7 @@
{
static TypeId tid = TypeId ("ns3::ConstantRandomVariable")
.SetParent<RandomVariableStream>()
+
.SetGroupName ("Core")
.AddConstructor<ConstantRandomVariable> ()
.AddAttribute("Constant", "The constant value returned by this RNG stream."
,
DoubleValue(0),
@@ -261,6 +270,7 @@
{
static TypeId tid = TypeId ("ns3::SequentialRandomVariable")
.SetParent<RandomVariableStream>()
+
.SetGroupName ("Core")
.AddConstructor<SequentialRandomVariable> ()
.AddAttribute("Min", "The first value of the sequence.",
DoubleValue(0),
@@ -360,6 +370,7 @@
{
static TypeId tid = TypeId ("ns3::ExponentialRandomVariable")
.SetParent<RandomVariableStream>()
+
.SetGroupName ("Core")
.AddConstructor<ExponentialRandomVariable> ()
.AddAttribute("Mean", "The mean of the values returned by this RNG stream."
,
DoubleValue(1.0),
@@ -441,6 +452,7 @@
{
static TypeId tid = TypeId ("ns3::ParetoRandomVariable")
.SetParent<RandomVariableStream>()
+
.SetGroupName ("Core")
.AddConstructor<ParetoRandomVariable> ()
.AddAttribute("Mean", "The mean parameter for the Pareto distribution retur
ned by this RNG stream.",
DoubleValue(1.0),
@@ -536,6 +548,7 @@
{
static TypeId tid = TypeId ("ns3::WeibullRandomVariable")
.SetParent<RandomVariableStream>()
+
.SetGroupName ("Core")
.AddConstructor<WeibullRandomVariable> ()
.AddAttribute("Scale", "The scale parameter for the Weibull distribution re
turned by this RNG stream.",
DoubleValue(1.0),
@@ -631,6 +644,7 @@
{
static TypeId tid = TypeId ("ns3::NormalRandomVariable")

.SetParent<RandomVariableStream>()
.SetGroupName ("Core")
.AddConstructor<NormalRandomVariable> ()
.AddAttribute("Mean", "The mean value for the normal distribution returned
by this RNG stream.",
DoubleValue(0.0),
@@ -748,6 +762,7 @@
{
static TypeId tid = TypeId ("ns3::LogNormalRandomVariable")
.SetParent<RandomVariableStream>()
+
.SetGroupName ("Core")
.AddConstructor<LogNormalRandomVariable> ()
.AddAttribute("Mu", "The mu value for the log-normal distribution returned
by this RNG stream.",
DoubleValue(0.0),
@@ -867,6 +882,7 @@
{
static TypeId tid = TypeId ("ns3::GammaRandomVariable")
.SetParent<RandomVariableStream>()
+
.SetGroupName ("Core")
.AddConstructor<GammaRandomVariable> ()
.AddAttribute("Alpha", "The alpha value for the gamma distribution returned
by this RNG stream.",
DoubleValue(1.0),
@@ -1042,6 +1058,7 @@
{
static TypeId tid = TypeId ("ns3::ErlangRandomVariable")
.SetParent<RandomVariableStream>()
+
.SetGroupName ("Core")
.AddConstructor<ErlangRandomVariable> ()
.AddAttribute("K", "The k value for the Erlang distribution returned by thi
s RNG stream.",
IntegerValue(1),
@@ -1153,6 +1170,7 @@
{
static TypeId tid = TypeId ("ns3::TriangularRandomVariable")
.SetParent<RandomVariableStream>()
+
.SetGroupName ("Core")
.AddConstructor<TriangularRandomVariable> ()
.AddAttribute("Mean", "The mean value for the triangular distribution retur
ned by this RNG stream.",
DoubleValue(0.5),
@@ -1247,6 +1265,7 @@
{
static TypeId tid = TypeId ("ns3::ZipfRandomVariable")
.SetParent<RandomVariableStream>()
+
.SetGroupName ("Core")
.AddConstructor<ZipfRandomVariable> ()
.AddAttribute("N", "The n value for the Zipf distribution returned by this
RNG stream.",
IntegerValue(1),
@@ -1337,6 +1356,7 @@
{
static TypeId tid = TypeId ("ns3::ZetaRandomVariable")
.SetParent<RandomVariableStream>()
+
.SetGroupName ("Core")
.AddConstructor<ZetaRandomVariable> ()
.AddAttribute("Alpha", "The alpha value for the zeta distribution returned
by this RNG stream.",
DoubleValue(3.14),
+

@@ -1420,6 +1440,7 @@
{
static TypeId tid = TypeId ("ns3::DeterministicRandomVariable")
.SetParent<RandomVariableStream>()
+
.SetGroupName ("Core")
.AddConstructor<DeterministicRandomVariable> ()
;
return tid;
@@ -1512,6 +1533,7 @@
{
static TypeId tid = TypeId ("ns3::EmpiricalRandomVariable")
.SetParent<RandomVariableStream>()
+
.SetGroupName ("Core")
.AddConstructor<EmpiricalRandomVariable> ()
;
return tid;
@@ -1594,7 +1616,7 @@
void EmpiricalRandomVariable::Validate ()
{
NS_LOG_FUNCTION (this);
- ValueCDF prior;
+ ValueCDF prior = emp[0];
for (std::vector<ValueCDF>::size_type i = 0; i < emp.size (); ++i)
{
ValueCDF& current = emp[i];
diff -Naur ns-3.22/src/core/model/realtime-simulator-impl.cc ns-3.23/src/core/mo
del/realtime-simulator-impl.cc
--- ns-3.22/src/core/model/realtime-simulator-impl.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/core/model/realtime-simulator-impl.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -56,6 +56,7 @@
{
static TypeId tid = TypeId ("ns3::RealtimeSimulatorImpl")
.SetParent<SimulatorImpl> ()
+
.SetGroupName ("Core")
.AddConstructor<RealtimeSimulatorImpl> ()
.AddAttribute ("SynchronizationMode",
"What to do if the simulation cannot keep up with real time.
",
diff -Naur ns-3.22/src/core/model/realtime-simulator-impl.h ns-3.23/src/core/mod
el/realtime-simulator-impl.h
--- ns-3.22/src/core/model/realtime-simulator-impl.h
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/core/model/realtime-simulator-impl.h
2015-05-13 11:05:27.0000
00000 -0700
@@ -33,28 +33,62 @@
#include <list>
+/**
+ * \file
+ * \ingroup realtime
+ * ns3::RealTimeSimulatorImpl declaration.
+ */
+
namespace ns3 {
/**
* \ingroup simulator

+ * \defgroup realtime Realtime Simulator


+ *
+ * Realtime simulator implementation.
+ */
+
+/**
+ * \ingroup realtime
+ *
+ * Realtime version of SimulatorImpl.
*/
class RealtimeSimulatorImpl : public SimulatorImpl
{
public:
+ /**
+ * Get the registered TypeId for this class.
+ * \returns The TypeId.
+ */
static TypeId GetTypeId (void);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

/**
* Enumeration of the types of packets supported in the class.
*
* What to do when we can't maintain real time synchrony.
*/
enum SynchronizationMode {
SYNC_BEST_EFFORT, /** Make a best effort to keep synced to real-time */
SYNC_HARD_LIMIT, /** Keep to real-time within a tolerance or die trying */
/**
* Make a best effort to keep synced to real-time.
*
* If we fall behind, keep going.
*/
SYNC_BEST_EFFORT,
/**
* Keep to real time within the hard limit tolerance configured
* with SetHardLimit, or die trying.
*
* Falling behind by more than the hard limit tolerance triggers
* a fatal error.
* \see SetHardLimit
*/
SYNC_HARD_LIMIT,
};

+ /** Constructor. */
RealtimeSimulatorImpl ();
+ /** Destructor. */
~RealtimeSimulatorImpl ();
+ // Inherited from SimulatorImpl
virtual void Destroy ();
virtual bool IsFinished (void) const;
virtual void Stop (void);
@@ -63,9 +97,9 @@
virtual void ScheduleWithContext (uint32_t context, Time const &time, EventIm
pl *event);
virtual EventId ScheduleNow (EventImpl *event);
virtual EventId ScheduleDestroy (EventImpl *event);
- virtual void Remove (const EventId &id);
- virtual void Cancel (const EventId &id);

+
+
+

virtual bool IsExpired (const EventId &id) const;


virtual void Remove (const EventId &ev);
virtual void Cancel (const EventId &ev);
virtual bool IsExpired (const EventId &ev) const;
virtual void Run (void);
virtual Time Now (void) const;
virtual Time GetDelayLeft (const EventId &id) const;
@@ -74,52 +108,115 @@
virtual uint32_t GetSystemId (void) const;
virtual uint32_t GetContext (void) const;
+ /** \copydoc ScheduleWithContext */
void ScheduleRealtimeWithContext (uint32_t context, Time const &time, EventIm
pl *event);
+ /** \copydoc Schedule */
void ScheduleRealtime (Time const &time, EventImpl *event);
+ /**
+ * \copybrief ScheduleNow
+ *
+ * \param context Event context.
+ * \param event The event to schedule.
+ */
void ScheduleRealtimeNowWithContext (uint32_t context, EventImpl *event);
+ /** \copydoc ScheduleNow */
void ScheduleRealtimeNow (EventImpl *event);
+ /**
+ * Get the current real time from the synchronizer.
+ * \returns The current real time.
+ */
Time RealtimeNow (void) const;
+ /**
+ * Set the SynchronizationMode.
+ *
+ * \param mode The new SynchronizationMode.
+ */
void SetSynchronizationMode (RealtimeSimulatorImpl::SynchronizationMode mode)
;
+ /**
+ * Get the SynchronizationMode.
+ * \returns The current SynchronizationMode.
+ */
RealtimeSimulatorImpl::SynchronizationMode GetSynchronizationMode (void) cons
t;
+ /**
+ * Set the fatal error threshold for SynchronizationMode SYNC_HARD_LIMIT.
+ *
+ * \param limit The maximum amount of real time we are allowed to fall
+ *
behind before we trigger a fatal error.
+ */
void SetHardLimit (Time limit);
+ /**
+ * Get the current fatal error threshold for SynchronizationMode
+ * SYNC_HARD_LIMIT.
+ *
+ * \returns The hard limit threshold.
+ */
Time GetHardLimit (void) const;

private:
+ /**
+ * Is the simulator running?
+ * \returns \c true if we are running.
+ */
bool Running (void) const;
+ /**
+ * Check that the Synchronizer is locked to the real time clock.
+ * \return \c true if the Synchronizer is locked.
+ */
bool Realtime (void) const;
+ /**
+ * Get the timestep of the next event.
+ * \returns The timestep of the next event.
+ */
uint64_t NextTs (void) const;
+ /** Process the next event. */
void ProcessOneEvent (void);
+ /** Destructor implementation. */
virtual void DoDispose (void);
+ /** Container type for events to be run at destroy time. */
typedef std::list<EventId> DestroyEvents;
+ /** Container for events to be run at destroy time. */
DestroyEvents m_destroyEvents;
+ /** Has the stopping condition been reached? */
bool m_stop;
+ /** Is the simulator currently running. */
bool m_running;
+
+
+
+
+
+
+
+
+
+
+
+
+
+

// The following variables are protected using the m_mutex


/**
* \name Mutex-protected variables.
*
* These variables are protected by #m_mutex.
*/
/**@{*/
/** The event list. */
Ptr<Scheduler> m_events;
/**< Number of events in the event list. */
int m_unscheduledEvents;
/**< Unique id for the next event to be scheduled. */
uint32_t m_uid;
/**< Unique id of the current event. */
uint32_t m_currentUid;
/**< Timestep of the current event. */
uint64_t m_currentTs;
uint32_t m_currentContext;
/**< Execution context. */
uint32_t m_currentContext;
/**@}*/

- mutable SystemMutex m_mutex;


+ /** Mutex to control access to key state. */
+ mutable SystemMutex m_mutex;
+ /** The synchronizer in use to track real time. */
Ptr<Synchronizer> m_synchronizer;
- /**

- * The policy to use if the simulation cannot keep synchronized to real-time.


- */
+ /** SynchronizationMode policy. */
SynchronizationMode m_synchronizationMode;
- /**
- * The maximum allowable drift from real-time in SYNC_HARD_LIMIT mode.
- */
+ /** The maximum allowable drift from real-time in SYNC_HARD_LIMIT mode. */
Time m_hardLimit;
+ /** Main SystemThread. */
SystemThread::ThreadId m_main;
};
diff -Naur ns-3.22/src/core/model/ref-count-base.cc ns-3.23/src/core/model/ref-c
ount-base.cc
--- ns-3.22/src/core/model/ref-count-base.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/ref-count-base.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -24,6 +24,12 @@
#include "ref-count-base.h"
#include "log.h"
+/**
+ * \file
+ * \ingroup ptr
+ * (Deprecated) ns3::RefCountBase implementation.
+ */
+
namespace ns3 {
NS_LOG_COMPONENT_DEFINE ("RefCountBase");
diff -Naur ns-3.22/src/core/model/ref-count-base.h ns-3.23/src/core/model/ref-co
unt-base.h
--- ns-3.22/src/core/model/ref-count-base.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/ref-count-base.h
2015-05-13 11:05:27.000000000 -0
700
@@ -25,6 +25,12 @@
#include "simple-ref-count.h"
+/**
+ * \file
+ * \ingroup ptr
+ * (Deprecated) ns3::RefCountBase declaration.
+ */
+
namespace ns3 {
/**
diff -Naur ns-3.22/src/core/model/rng-seed-manager.cc ns-3.23/src/core/model/rng
-seed-manager.cc
--- ns-3.22/src/core/model/rng-seed-manager.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/rng-seed-manager.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -24,6 +24,12 @@

#include "config.h"
#include "log.h"
+/**
+ * \file
+ * \ingroup randomvariable
+ * ns3::RngSeedManager implementation.
+ */
+
namespace ns3 {
NS_LOG_COMPONENT_DEFINE ("RngSeedManager");
diff -Naur ns-3.22/src/core/model/scheduler.cc ns-3.23/src/core/model/scheduler.
cc
--- ns-3.22/src/core/model/scheduler.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/core/model/scheduler.cc 2015-05-13 11:05:27.000000000 -0700
@@ -44,6 +44,7 @@
{
static TypeId tid = TypeId ("ns3::Scheduler")
.SetParent<Object> ()
+
.SetGroupName ("Core")
;
return tid;
}
diff -Naur ns-3.22/src/core/model/simulator-impl.cc ns-3.23/src/core/model/simul
ator-impl.cc
--- ns-3.22/src/core/model/simulator-impl.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/simulator-impl.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -20,6 +20,12 @@
#include "simulator-impl.h"
#include "log.h"
+/**
+ * \file
+ * \ingroup simulator
+ * Implementation of class ns3::SimulatorImpl.
+ */
+
namespace ns3 {
NS_LOG_COMPONENT_DEFINE ("SimulatorImpl");
@@ -31,6 +37,7 @@
{
static TypeId tid = TypeId ("ns3::SimulatorImpl")
.SetParent<Object> ()
+
.SetGroupName ("Core")
;
return tid;
}
diff -Naur ns-3.22/src/core/model/simulator-impl.h ns-3.23/src/core/model/simula
tor-impl.h
--- ns-3.22/src/core/model/simulator-impl.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/core/model/simulator-impl.h
2015-05-13 11:05:27.000000000 -0
700
@@ -28,6 +28,12 @@
#include "object-factory.h"
#include "ptr.h"

+/**
+ * \file
+ * \ingroup simulator
+ * Declaration of class ns3::SimulatorImpl.
+ */
+
namespace ns3 {
class Scheduler;
diff -Naur ns-3.22/src/core/model/synchronizer.cc ns-3.23/src/core/model/synchro
nizer.cc
--- ns-3.22/src/core/model/synchronizer.cc
2015-02-05 15:46:23.000000000 -0
800
+++ ns-3.23/src/core/model/synchronizer.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -36,6 +36,7 @@
{
static TypeId tid = TypeId ("ns3::Synchronizer")
.SetParent<Object> ()
+
.SetGroupName ("Core")
;
return tid;
}
diff -Naur ns-3.22/src/core/model/test.cc ns-3.23/src/core/model/test.cc
--- ns-3.22/src/core/model/test.cc
2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/core/model/test.cc
2015-05-13 11:05:27.000000000 -0700
@@ -28,6 +28,12 @@
#include <map>
+/**
+ * \file
+ * \ingroup testing
+ * Implementation of the testing classes and functions
+ */
+
namespace ns3 {
NS_LOG_COMPONENT_DEFINE ("Test");
diff -Naur ns-3.22/src/core/model/test.h ns-3.23/src/core/model/test.h
--- ns-3.22/src/core/model/test.h
2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/core/model/test.h
2015-05-13 11:05:27.000000000 -0700
@@ -31,6 +31,12 @@
#include "system-wall-clock-ms.h"
/**
+ * \file
+ * \ingroup testing
+ * Definition of the testing macros and declaration of the testing classes.
+ */
+
+/**
* \ingroup core
* \defgroup testing Testing
* \brief Tools to define and execute unit tests.
diff -Naur ns-3.22/src/core/model/time.cc ns-3.23/src/core/model/time.cc
--- ns-3.22/src/core/model/time.cc
2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/core/model/time.cc
2015-05-13 11:05:27.000000000 -0700
@@ -27,6 +27,13 @@

#include <iomanip> // showpos


#include <sstream>
+/**
+ * \file
+ * \ingroup time
+ * Implementation of classes ns3::Time and ns3::TimeWithUnit,
+ * and the TimeValue implementation classes.
+ */
+
namespace ns3 {
NS_LOG_COMPONENT_DEFINE_MASK ("Time", ns3::LOG_PREFIX_TIME);
diff -Naur ns-3.22/src/core/model/type-id.cc ns-3.23/src/core/model/type-id.cc
--- ns-3.22/src/core/model/type-id.cc 2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/core/model/type-id.cc 2015-05-13 11:05:27.000000000 -0700
@@ -28,6 +28,13 @@
#include <sstream>
#include <iomanip>
+/**
+ * \file
+ * \ingroup object
+ * ns3::TypeId and ns3::IidManager implementations.
+ */
+
+
/*********************************************************************
*
Helper code
*********************************************************************/
diff -Naur ns-3.22/src/core/model/type-id.h ns-3.23/src/core/model/type-id.h
--- ns-3.22/src/core/model/type-id.h
2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/core/model/type-id.h
2015-05-13 11:05:27.000000000 -0700
@@ -30,6 +30,12 @@
#include <string>
#include <stdint.h>
+/**
+ * \file
+ * \ingroup object
+ * ns3::TypeId declaration; inline and template implementations.
+ */
+
namespace ns3 {
class ObjectBase;
diff -Naur ns-3.22/src/core/model/type-traits.h ns-3.23/src/core/model/type-trai
ts.h
--- ns-3.22/src/core/model/type-traits.h
2015-02-05 15:46:23.000000000 -0
800
+++ ns-3.23/src/core/model/type-traits.h
2015-05-13 11:05:27.000000000 -0
700
@@ -20,6 +20,12 @@
#ifndef TYPE_TRAITS_H
#define TYPE_TRAITS_H
+/**
+ * \file
+ * \ingroup object
+ * TypeTraits introspection template.

+ */
+
/** Type trait reference values */
template <typename T>
struct TypeTraits
diff -Naur ns-3.22/src/core/model/unused.h ns-3.23/src/core/model/unused.h
--- ns-3.22/src/core/model/unused.h
2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/core/model/unused.h
2015-05-13 11:05:27.000000000 -0700
@@ -1,10 +1,26 @@
#ifndef UNUSED_H
#define UNUSED_H
+/**
+ * \file
+ * \ingroup core
+ * Definition of the NS_UNUSED NS_UNUSED_GLOBAL macros.
+ */
+
+/**
+ * \ingroup core
+ * \def NS_UNUSED()
+ * Mark a local variable as unused.
+ */
#ifndef NS_UNUSED
# define NS_UNUSED(x) ((void)(x))
#endif
+/**
+ * \ingroup core
+ * \def NS_UNUSED_GLOBAL()
+ * Mark a variable at file scope as unused.
+ */
#ifndef NS_UNUSED_GLOBAL
#if defined(__GNUC__)
# define NS_UNUSED_GLOBAL(x) x __attribute__((unused))
diff -Naur ns-3.22/src/core/model/wall-clock-synchronizer.cc ns-3.23/src/core/mo
del/wall-clock-synchronizer.cc
--- ns-3.22/src/core/model/wall-clock-synchronizer.cc 2015-02-05 15:46:23.0000
00000 -0800
+++ ns-3.23/src/core/model/wall-clock-synchronizer.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -43,6 +43,7 @@
{
static TypeId tid = TypeId ("ns3::WallClockSynchronizer")
.SetParent<Synchronizer> ()
+
.SetGroupName ("Core")
;
return tid;
}
diff -Naur ns-3.22/src/core/test/random-variable-stream-test-suite.cc ns-3.23/sr
c/core/test/random-variable-stream-test-suite.cc
--- ns-3.22/src/core/test/random-variable-stream-test-suite.cc 2015-02-05 15:46
:23.000000000 -0800
+++ ns-3.23/src/core/test/random-variable-stream-test-suite.cc 2015-05-13 11:05
:27.000000000 -0700
@@ -2754,6 +2754,13 @@
// Test that values have approximately the right mean value.
double TOLERANCE = expectedMean * 1e-2;
NS_TEST_ASSERT_MSG_EQ_TOL (valueMean, expectedMean, TOLERANCE, "Wrong mean va
lue.");

+
+ // Bug 2082: Create the RNG with a uniform distribution between -1 and 1.
+ Ptr<EmpiricalRandomVariable> y = CreateObject<EmpiricalRandomVariable> ();
+ y->CDF (-1.0, 0.0);
+ y->CDF (0.0, 0.5);
+ y->CDF (1.0, 1.0);
+ NS_TEST_ASSERT_MSG_LT (y->GetValue (), 2, "Empirical variable with negative d
omain");
}
// ===========================================================================
diff -Naur ns-3.22/src/csma/bindings/modulegen__gcc_ILP32.py ns-3.23/src/csma/bi
ndings/modulegen__gcc_ILP32.py
--- ns-3.22/src/csma/bindings/modulegen__gcc_ILP32.py 2015-02-05 15:46:23.0000
00000 -0800
+++ ns-3.23/src/csma/bindings/modulegen__gcc_ILP32.py 2015-05-13 11:05:27.0000
00000 -0700
@@ -1157,11 +1157,21 @@
cls.add_constructor([param('uint64_t', 'bps')])
## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate
) [constructor]
cls.add_constructor([param('std::string', 'rate')])
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTx
Time(uint32_t bits) const [member function]
+
cls.add_method('CalculateBitsTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bits')],
+
is_const=True)
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesT
xTime(uint32_t bytes) const [member function]
+
cls.add_method('CalculateBytesTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bytes')],
+
is_const=True)
## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(ui
nt32_t bytes) const [member function]
cls.add_method('CalculateTxTime',
'double',
[param('uint32_t', 'bytes')],
is_const=True)
+
deprecated=True, is_const=True)
## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() con
st [member function]
cls.add_method('GetBitRate',
'uint64_t',
diff -Naur ns-3.22/src/csma/bindings/modulegen__gcc_LP64.py ns-3.23/src/csma/bin
dings/modulegen__gcc_LP64.py
--- ns-3.22/src/csma/bindings/modulegen__gcc_LP64.py
2015-02-05 15:46:23.0000
00000 -0800
+++ ns-3.23/src/csma/bindings/modulegen__gcc_LP64.py
2015-05-13 11:05:27.0000
00000 -0700
@@ -1157,11 +1157,21 @@
cls.add_constructor([param('uint64_t', 'bps')])
## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate
) [constructor]
cls.add_constructor([param('std::string', 'rate')])
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTx
Time(uint32_t bits) const [member function]
+
cls.add_method('CalculateBitsTxTime',
+
'ns3::Time',

+
[param('uint32_t', 'bits')],
+
is_const=True)
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesT
xTime(uint32_t bytes) const [member function]
+
cls.add_method('CalculateBytesTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bytes')],
+
is_const=True)
## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(ui
nt32_t bytes) const [member function]
cls.add_method('CalculateTxTime',
'double',
[param('uint32_t', 'bytes')],
is_const=True)
+
deprecated=True, is_const=True)
## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() con
st [member function]
cls.add_method('GetBitRate',
'uint64_t',
diff -Naur ns-3.22/src/csma/model/backoff.cc ns-3.23/src/csma/model/backoff.cc
--- ns-3.22/src/csma/model/backoff.cc 2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/csma/model/backoff.cc 2015-05-13 11:05:27.000000000 -0700
@@ -32,6 +32,7 @@
m_maxSlots = 1000;
m_ceiling = 10;
m_maxRetries = 1000;
+ m_numBackoffRetries = 0;
m_rng = CreateObject<UniformRandomVariable> ();
ResetBackoffTime ();
@@ -44,6 +45,7 @@
m_maxSlots = maxSlots;
m_ceiling = ceiling;
m_maxRetries = maxRetries;
+ m_numBackoffRetries = 0;
m_rng = CreateObject<UniformRandomVariable> ();
}
diff -Naur ns-3.22/src/csma/model/csma-channel.cc ns-3.23/src/csma/model/csma-ch
annel.cc
--- ns-3.22/src/csma/model/csma-channel.cc
2015-02-05 15:46:23.000000000 -0
800
+++ ns-3.23/src/csma/model/csma-channel.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -35,6 +35,7 @@
{
static TypeId tid = TypeId ("ns3::CsmaChannel")
.SetParent<Channel> ()
+
.SetGroupName ("Csma")
.AddConstructor<CsmaChannel> ()
.AddAttribute ("DataRate",
"The transmission data rate to be provided to devices connec
ted to the channel",
diff -Naur ns-3.22/src/csma/model/csma-net-device.cc ns-3.23/src/csma/model/csma
-net-device.cc
--- ns-3.22/src/csma/model/csma-net-device.cc 2015-02-05 15:46:23.000000000 -0
800
+++ ns-3.23/src/csma/model/csma-net-device.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -44,6 +44,7 @@

static TypeId tid = TypeId ("ns3::CsmaNetDevice")


.SetParent<NetDevice> ()
+
.SetGroupName ("Csma")
.AddConstructor<CsmaNetDevice> ()
.AddAttribute ("Address",
"The MAC address of this device.",
@@ -520,7 +521,7 @@
m_txMachineState = BUSY;
m_phyTxBeginTrace (m_currentPkt);
)));
+

Time tEvent = Seconds (m_bps.CalculateTxTime (m_currentPkt->GetSize (

Time tEvent = m_bps.CalculateBytesTxTime (m_currentPkt->GetSize ());


NS_LOG_LOGIC ("Schedule TransmitCompleteEvent in " << tEvent.GetSecon
ds () << "sec");
Simulator::Schedule (tEvent, &CsmaNetDevice::TransmitCompleteEvent, t
his);
}
@@ -656,7 +657,7 @@
//
// We use the Ethernet interframe gap of 96 bit times.
//
- m_tInterframeGap = Seconds (m_bps.CalculateTxTime (96/8));
+ m_tInterframeGap = m_bps.CalculateBytesTxTime (96/8);
//
// This device is up whenever a channel is attached to it.
diff -Naur ns-3.22/src/csma-layout/bindings/modulegen__gcc_ILP32.py ns-3.23/src/
csma-layout/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/csma-layout/bindings/modulegen__gcc_ILP32.py
2015-02-05 15:46
:23.000000000 -0800
+++ ns-3.23/src/csma-layout/bindings/modulegen__gcc_ILP32.py
2015-05-13 11:05
:27.000000000 -0700
@@ -1340,11 +1340,21 @@
cls.add_constructor([param('uint64_t', 'bps')])
## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate
) [constructor]
cls.add_constructor([param('std::string', 'rate')])
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTx
Time(uint32_t bits) const [member function]
+
cls.add_method('CalculateBitsTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bits')],
+
is_const=True)
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesT
xTime(uint32_t bytes) const [member function]
+
cls.add_method('CalculateBytesTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bytes')],
+
is_const=True)
## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(ui
nt32_t bytes) const [member function]
cls.add_method('CalculateTxTime',
'double',
[param('uint32_t', 'bytes')],
is_const=True)
+
deprecated=True, is_const=True)
## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() con
st [member function]

cls.add_method('GetBitRate',
'uint64_t',
diff -Naur ns-3.22/src/csma-layout/bindings/modulegen__gcc_LP64.py ns-3.23/src/c
sma-layout/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/csma-layout/bindings/modulegen__gcc_LP64.py
2015-02-05 15:46
:23.000000000 -0800
+++ ns-3.23/src/csma-layout/bindings/modulegen__gcc_LP64.py
2015-05-13 11:05
:27.000000000 -0700
@@ -1340,11 +1340,21 @@
cls.add_constructor([param('uint64_t', 'bps')])
## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate
) [constructor]
cls.add_constructor([param('std::string', 'rate')])
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTx
Time(uint32_t bits) const [member function]
+
cls.add_method('CalculateBitsTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bits')],
+
is_const=True)
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesT
xTime(uint32_t bytes) const [member function]
+
cls.add_method('CalculateBytesTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bytes')],
+
is_const=True)
## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(ui
nt32_t bytes) const [member function]
cls.add_method('CalculateTxTime',
'double',
[param('uint32_t', 'bytes')],
is_const=True)
+
deprecated=True, is_const=True)
## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() con
st [member function]
cls.add_method('GetBitRate',
'uint64_t',
diff -Naur ns-3.22/src/dsdv/model/dsdv-packet.cc ns-3.23/src/dsdv/model/dsdv-pac
ket.cc
--- ns-3.22/src/dsdv/model/dsdv-packet.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/dsdv/model/dsdv-packet.cc
2015-05-13 11:05:26.000000000 -0
700
@@ -53,6 +53,7 @@
{
static TypeId tid = TypeId ("ns3::dsdv::DsdvHeader")
.SetParent<Header> ()
+
.SetGroupName ("Dsdv")
.AddConstructor<DsdvHeader> ();
return tid;
}
diff -Naur ns-3.22/src/dsdv/model/dsdv-routing-protocol.cc ns-3.23/src/dsdv/mode
l/dsdv-routing-protocol.cc
--- ns-3.22/src/dsdv/model/dsdv-routing-protocol.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/dsdv/model/dsdv-routing-protocol.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -66,7 +66,7 @@
static TypeId
GetTypeId ()
{

Tag>
+
Tag>
}

static TypeId tid = TypeId ("ns3::dsdv::DeferredRouteOutputTag").SetParent<


();
static TypeId tid = TypeId ("ns3::dsdv::DeferredRouteOutputTag").SetParent<
().SetGroupName ("Dsdv");
return tid;

@@ -106,6 +106,7 @@
{
static TypeId tid = TypeId ("ns3::dsdv::RoutingProtocol")
.SetParent<Ipv4RoutingProtocol> ()
+
.SetGroupName ("Dsdv")
.AddConstructor<RoutingProtocol> ()
.AddAttribute ("PeriodicUpdateInterval","Periodic interval between exchange
of full routing tables among nodes. ",
TimeValue (Seconds (15)),
diff -Naur ns-3.22/src/dsr/bindings/modulegen__gcc_ILP32.py ns-3.23/src/dsr/bind
ings/modulegen__gcc_ILP32.py
--- ns-3.22/src/dsr/bindings/modulegen__gcc_ILP32.py
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/dsr/bindings/modulegen__gcc_ILP32.py
2015-05-13 11:05:26.0000
00000 -0700
@@ -6042,6 +6042,10 @@
'int64_t',
[param('int64_t', 'stream')],
is_pure_virtual=True, is_virtual=True)
+
## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpDuratio
n(ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
+
cls.add_method('CalculatePlcpDuration',
+
'ns3::Time',
+
[param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPre
amble', 'preamble')])
## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiM
ode txMode, double ber) const [member function]
cls.add_method('CalculateSnr',
'double',
@@ -6515,10 +6519,10 @@
'ns3::WifiMode',
[param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPrea
mble', 'preamble')],
is_static=True)
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigH
eaderDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member fun
ction]
+
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigH
eaderDuration(ns3::WifiPreamble preamble) [member function]
cls.add_method('GetPlcpHtSigHeaderDuration',
'ns3::Time',
[param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPrea
mble', 'preamble')],
+
[param('ns3::WifiPreamble', 'preamble')],
is_static=True)
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrai
ningSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [memb
er function]
cls.add_method('GetPlcpHtTrainingSymbolDuration',
@@ -6692,10 +6696,10 @@
'void',
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >,
double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty,

ns3::empty >', 'callback')],


is_pure_virtual=True, is_virtual=True)
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3:
:Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiMode,ns3::WifiPreamble,ns3:
:empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3:
:Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiTxVector,ns3::WifiPreamble,
ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member functi
on]
cls.add_method('SetReceiveOkCallback',
'void',
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double
, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::emp
ty, ns3::empty >', 'callback')],
+
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double
, ns3::WifiTxVector, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3:
:empty, ns3::empty >', 'callback')],
is_pure_virtual=True, is_virtual=True)
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSleepMode() [member fu
nction]
cls.add_method('SetSleepMode',
diff -Naur ns-3.22/src/dsr/bindings/modulegen__gcc_LP64.py ns-3.23/src/dsr/bindi
ngs/modulegen__gcc_LP64.py
--- ns-3.22/src/dsr/bindings/modulegen__gcc_LP64.py
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/dsr/bindings/modulegen__gcc_LP64.py
2015-05-13 11:05:26.0000
00000 -0700
@@ -6042,6 +6042,10 @@
'int64_t',
[param('int64_t', 'stream')],
is_pure_virtual=True, is_virtual=True)
+
## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpDuratio
n(ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
+
cls.add_method('CalculatePlcpDuration',
+
'ns3::Time',
+
[param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPre
amble', 'preamble')])
## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiM
ode txMode, double ber) const [member function]
cls.add_method('CalculateSnr',
'double',
@@ -6515,10 +6519,10 @@
'ns3::WifiMode',
[param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPrea
mble', 'preamble')],
is_static=True)
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigH
eaderDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member fun
ction]
+
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigH
eaderDuration(ns3::WifiPreamble preamble) [member function]
cls.add_method('GetPlcpHtSigHeaderDuration',
'ns3::Time',
[param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPrea
mble', 'preamble')],
+
[param('ns3::WifiPreamble', 'preamble')],
is_static=True)
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrai
ningSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [memb
er function]

cls.add_method('GetPlcpHtTrainingSymbolDuration',
@@ -6692,10 +6696,10 @@
'void',
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >,
double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty,
ns3::empty >', 'callback')],
is_pure_virtual=True, is_virtual=True)
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3:
:Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiMode,ns3::WifiPreamble,ns3:
:empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3:
:Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiTxVector,ns3::WifiPreamble,
ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member functi
on]
cls.add_method('SetReceiveOkCallback',
'void',
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double
, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::emp
ty, ns3::empty >', 'callback')],
+
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double
, ns3::WifiTxVector, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3:
:empty, ns3::empty >', 'callback')],
is_pure_virtual=True, is_virtual=True)
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSleepMode() [member fu
nction]
cls.add_method('SetSleepMode',
diff -Naur ns-3.22/src/dsr/model/dsr-fs-header.cc ns-3.23/src/dsr/model/dsr-fs-h
eader.cc
--- ns-3.22/src/dsr/model/dsr-fs-header.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/dsr/model/dsr-fs-header.cc
2015-05-13 11:05:26.000000000 -0
700
@@ -47,6 +47,7 @@
static TypeId tid = TypeId ("ns3::dsr::DsrFsHeader")
.AddConstructor<DsrFsHeader> ()
.SetParent<Header> ()
+
.SetGroupName ("Dsr")
;
return tid;
}
diff -Naur ns-3.22/src/dsr/model/dsr-gratuitous-reply-table.cc ns-3.23/src/dsr/m
odel/dsr-gratuitous-reply-table.cc
--- ns-3.22/src/dsr/model/dsr-gratuitous-reply-table.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/dsr/model/dsr-gratuitous-reply-table.cc 2015-05-13 11:05:26.0000
00000 -0700
@@ -45,6 +45,7 @@
{
static TypeId tid = TypeId ("ns3::dsr::GraReply")
.SetParent<Object> ()
+
.SetGroupName ("Dsr")
.AddConstructor<GraReply> ()
;
return tid;
diff -Naur ns-3.22/src/dsr/model/dsr-network-queue.cc ns-3.23/src/dsr/model/dsrnetwork-queue.cc
--- ns-3.22/src/dsr/model/dsr-network-queue.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/dsr/model/dsr-network-queue.cc 2015-05-13 11:05:26.000000000 -0
700

@@ -51,6 +51,7 @@
{
static TypeId tid = TypeId ("ns3::dsr::DsrNetworkQueue")
.SetParent<Object> ()
+
.SetGroupName ("Dsr")
.AddConstructor<DsrNetworkQueue> ()
;
return tid;
diff -Naur ns-3.22/src/dsr/model/dsr-option-header.cc ns-3.23/src/dsr/model/dsroption-header.cc
--- ns-3.22/src/dsr/model/dsr-option-header.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/dsr/model/dsr-option-header.cc 2015-05-13 11:05:26.000000000 -0
700
@@ -51,6 +51,7 @@
static TypeId tid = TypeId ("ns3::dsr::DsrOptionHeader")
.AddConstructor<DsrOptionHeader> ()
.SetParent<Header> ()
+
.SetGroupName ("Dsr")
;
return tid;
}
@@ -139,6 +140,7 @@
static TypeId tid = TypeId ("ns3::dsr::DsrOptionPad1Header")
.AddConstructor<DsrOptionPad1Header> ()
.SetParent<DsrOptionHeader> ()
+
.SetGroupName ("Dsr")
;
return tid;
}
@@ -190,6 +192,7 @@
static TypeId tid = TypeId ("ns3::dsr::DsrOptionPadnHeader")
.AddConstructor<DsrOptionPadnHeader> ()
.SetParent<DsrOptionHeader> ()
+
.SetGroupName ("Dsr")
;
return tid;
}
@@ -250,6 +253,7 @@
static TypeId tid = TypeId ("ns3::dsr::DsrOptionRreqHeader")
.AddConstructor<DsrOptionRreqHeader> ()
.SetParent<DsrOptionHeader> ()
+
.SetGroupName ("Dsr")
;
return tid;
}
@@ -397,6 +401,7 @@
static TypeId tid = TypeId ("ns3::dsr::DsrOptionRrepHeader")
.AddConstructor<DsrOptionRrepHeader> ()
.SetParent<DsrOptionHeader> ()
+
.SetGroupName ("Dsr")
;
return tid;
}
@@ -518,6 +523,7 @@
static TypeId tid = TypeId ("ns3::dsr::DsrOptionSRHeader")
.AddConstructor<DsrOptionSRHeader> ()
.SetParent<DsrOptionHeader> ()
+
.SetGroupName ("Dsr")
;

return tid;
}
@@ -660,6 +666,7 @@
static TypeId tid = TypeId ("ns3::dsr::DsrOptionRerrHeader")
.AddConstructor<DsrOptionRerrHeader> ()
.SetParent<DsrOptionHeader> ()
+
.SetGroupName ("Dsr")
;
return tid;
}
@@ -782,6 +789,7 @@
static TypeId tid = TypeId ("ns3::dsr::DsrOptionRerrUnreachHeader")
.AddConstructor<DsrOptionRerrUnreachHeader> ()
.SetParent<DsrOptionRerrHeader> ()
+
.SetGroupName ("Dsr")
;
return tid;
}
@@ -910,6 +918,7 @@
static TypeId tid = TypeId ("ns3::dsr::DsrOptionRerrUnsupportHeader")
.AddConstructor<DsrOptionRerrUnsupportHeader> ()
.SetParent<DsrOptionRerrHeader> ()
+
.SetGroupName ("Dsr")
;
return tid;
}
@@ -1028,6 +1037,7 @@
static TypeId tid = TypeId ("ns3::dsr::DsrOptionAckReqHeader")
.AddConstructor<DsrOptionAckReqHeader> ()
.SetParent<DsrOptionHeader> ()
+
.SetGroupName ("Dsr")
;
return tid;
}
@@ -1103,6 +1113,7 @@
static TypeId tid = TypeId ("ns3::dsr::DsrOptionAckHeader")
.AddConstructor<DsrOptionAckHeader> ()
.SetParent<DsrOptionHeader> ()
+
.SetGroupName ("Dsr")
;
return tid;
}
diff -Naur ns-3.22/src/dsr/model/dsr-options.cc ns-3.23/src/dsr/model/dsr-option
s.cc
--- ns-3.22/src/dsr/model/dsr-options.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/dsr/model/dsr-options.cc
2015-05-13 11:05:26.000000000 -0
700
@@ -72,6 +72,7 @@
{
static TypeId tid = TypeId ("ns3::dsr::DsrOptions")
.SetParent<Object> ()
+
.SetGroupName ("Dsr")
.AddAttribute ("OptionNumber", "The Dsr option number.",
UintegerValue (0),
MakeUintegerAccessor (&DsrOptions::GetOptionNumber),
@@ -384,6 +385,7 @@
{
static TypeId tid = TypeId ("ns3::dsr::DsrOptionPad1")
.SetParent<DsrOptions> ()

.SetGroupName ("Dsr")
.AddConstructor<DsrOptionPad1> ()

;
return tid;
@@ -424,6 +426,7 @@
{
static TypeId tid = TypeId ("ns3::dsr::DsrOptionPadn")
.SetParent<DsrOptions> ()
+
.SetGroupName ("Dsr")
.AddConstructor<DsrOptionPadn> ()
;
return tid;
@@ -464,6 +467,7 @@
{
static TypeId tid = TypeId ("ns3::dsr::DsrOptionRreq")
.SetParent<DsrOptions> ()
+
.SetGroupName ("Dsr")
.AddConstructor<DsrOptionRreq> ()
;
return tid;
@@ -963,6 +967,7 @@
{
static TypeId tid = TypeId ("ns3::dsr::DsrOptionRrep")
.SetParent<DsrOptions> ()
+
.SetGroupName ("Dsr")
.AddConstructor<DsrOptionRrep> ()
;
return tid;
@@ -1163,6 +1168,7 @@
{
static TypeId tid = TypeId ("ns3::dsr::DsrOptionSR")
.SetParent<DsrOptions> ()
+
.SetGroupName ("Dsr")
.AddConstructor<DsrOptionSR> ()
;
return tid;
@@ -1404,6 +1410,7 @@
{
static TypeId tid = TypeId ("ns3::dsr::DsrOptionRerr")
.SetParent<DsrOptions> ()
+
.SetGroupName ("Dsr")
.AddConstructor<DsrOptionRerr> ()
;
return tid;
@@ -1583,6 +1590,7 @@
{
static TypeId tid = TypeId ("ns3::dsr::DsrOptionAckReq")
.SetParent<DsrOptions> ()
+
.SetGroupName ("Dsr")
.AddConstructor<DsrOptionAckReq> ()
;
return tid;
@@ -1638,6 +1646,7 @@
{
static TypeId tid = TypeId ("ns3::dsr::DsrOptionAck")
.SetParent<DsrOptions> ()
+
.SetGroupName ("Dsr")
.AddConstructor<DsrOptionAck> ()
;
return tid;

diff -Naur ns-3.22/src/dsr/model/dsr-passive-buff.cc ns-3.23/src/dsr/model/dsr-p


assive-buff.cc
--- ns-3.22/src/dsr/model/dsr-passive-buff.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/dsr/model/dsr-passive-buff.cc 2015-05-13 11:05:26.000000000 -0
700
@@ -48,6 +48,7 @@
{
static TypeId tid = TypeId ("ns3::dsr::PassiveBuffer")
.SetParent<Object> ()
+
.SetGroupName ("Dsr")
.AddConstructor<PassiveBuffer> ()
;
return tid;
diff -Naur ns-3.22/src/dsr/model/dsr-rcache.cc ns-3.23/src/dsr/model/dsr-rcache.
cc
--- ns-3.22/src/dsr/model/dsr-rcache.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/dsr/model/dsr-rcache.cc 2015-05-13 11:05:26.000000000 -0700
@@ -138,6 +138,7 @@
{
static TypeId tid = TypeId ("ns3::dsr::RouteCache")
.SetParent<Object> ()
+
.SetGroupName ("Dsr")
.AddConstructor<RouteCache> ()
;
return tid;
diff -Naur ns-3.22/src/dsr/model/dsr-routing.cc ns-3.23/src/dsr/model/dsr-routin
g.cc
--- ns-3.22/src/dsr/model/dsr-routing.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/dsr/model/dsr-routing.cc
2015-05-13 11:05:26.000000000 -0
700
@@ -108,6 +108,7 @@
{
static TypeId tid = TypeId ("ns3::dsr::DsrRouting")
.SetParent<IpL4Protocol> ()
+
.SetGroupName ("Dsr")
.AddConstructor<DsrRouting> ()
.AddAttribute ("RouteCache",
"The route cache for saving routes from "
diff -Naur ns-3.22/src/dsr/model/dsr-rreq-table.cc ns-3.23/src/dsr/model/dsr-rre
q-table.cc
--- ns-3.22/src/dsr/model/dsr-rreq-table.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/dsr/model/dsr-rreq-table.cc
2015-05-13 11:05:26.000000000 -0
700
@@ -46,6 +46,7 @@
{
static TypeId tid = TypeId ("ns3::dsr::RreqTable")
.SetParent<Object> ()
+
.SetGroupName ("Dsr")
.AddConstructor<RreqTable> ()
;
return tid;
diff -Naur ns-3.22/src/energy/bindings/modulegen__gcc_ILP32.py ns-3.23/src/energ
y/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/energy/bindings/modulegen__gcc_ILP32.py 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/energy/bindings/modulegen__gcc_ILP32.py 2015-05-13 11:05:26.0000
00000 -0700

@@ -3564,6 +3564,10 @@
'int64_t',
[param('int64_t', 'stream')],
is_pure_virtual=True, is_virtual=True)
+
## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpDuratio
n(ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
+
cls.add_method('CalculatePlcpDuration',
+
'ns3::Time',
+
[param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPre
amble', 'preamble')])
## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiM
ode txMode, double ber) const [member function]
cls.add_method('CalculateSnr',
'double',
@@ -4037,10 +4041,10 @@
'ns3::WifiMode',
[param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPrea
mble', 'preamble')],
is_static=True)
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigH
eaderDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member fun
ction]
+
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigH
eaderDuration(ns3::WifiPreamble preamble) [member function]
cls.add_method('GetPlcpHtSigHeaderDuration',
'ns3::Time',
[param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPrea
mble', 'preamble')],
+
[param('ns3::WifiPreamble', 'preamble')],
is_static=True)
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrai
ningSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [memb
er function]
cls.add_method('GetPlcpHtTrainingSymbolDuration',
@@ -4214,10 +4218,10 @@
'void',
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >,
double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty,
ns3::empty >', 'callback')],
is_pure_virtual=True, is_virtual=True)
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3:
:Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiMode,ns3::WifiPreamble,ns3:
:empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3:
:Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiTxVector,ns3::WifiPreamble,
ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member functi
on]
cls.add_method('SetReceiveOkCallback',
'void',
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double
, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::emp
ty, ns3::empty >', 'callback')],
+
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double
, ns3::WifiTxVector, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3:
:empty, ns3::empty >', 'callback')],
is_pure_virtual=True, is_virtual=True)
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSleepMode() [member fu
nction]
cls.add_method('SetSleepMode',
diff -Naur ns-3.22/src/energy/bindings/modulegen__gcc_LP64.py ns-3.23/src/energy

/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/energy/bindings/modulegen__gcc_LP64.py 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/energy/bindings/modulegen__gcc_LP64.py 2015-05-13 11:05:26.0000
00000 -0700
@@ -3564,6 +3564,10 @@
'int64_t',
[param('int64_t', 'stream')],
is_pure_virtual=True, is_virtual=True)
+
## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpDuratio
n(ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
+
cls.add_method('CalculatePlcpDuration',
+
'ns3::Time',
+
[param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPre
amble', 'preamble')])
## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiM
ode txMode, double ber) const [member function]
cls.add_method('CalculateSnr',
'double',
@@ -4037,10 +4041,10 @@
'ns3::WifiMode',
[param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPrea
mble', 'preamble')],
is_static=True)
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigH
eaderDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member fun
ction]
+
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigH
eaderDuration(ns3::WifiPreamble preamble) [member function]
cls.add_method('GetPlcpHtSigHeaderDuration',
'ns3::Time',
[param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPrea
mble', 'preamble')],
+
[param('ns3::WifiPreamble', 'preamble')],
is_static=True)
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrai
ningSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [memb
er function]
cls.add_method('GetPlcpHtTrainingSymbolDuration',
@@ -4214,10 +4218,10 @@
'void',
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >,
double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty,
ns3::empty >', 'callback')],
is_pure_virtual=True, is_virtual=True)
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3:
:Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiMode,ns3::WifiPreamble,ns3:
:empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3:
:Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiTxVector,ns3::WifiPreamble,
ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member functi
on]
cls.add_method('SetReceiveOkCallback',
'void',
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double
, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::emp
ty, ns3::empty >', 'callback')],
+
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double
, ns3::WifiTxVector, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3:
:empty, ns3::empty >', 'callback')],

is_pure_virtual=True, is_virtual=True)
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSleepMode() [member fu
nction]
cls.add_method('SetSleepMode',
diff -Naur ns-3.22/src/energy/doc/energy.rst ns-3.23/src/energy/doc/energy.rst
--- ns-3.22/src/energy/doc/energy.rst 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/energy/doc/energy.rst 2015-05-13 11:05:26.000000000 -0700
@@ -186,6 +186,11 @@
Energy Framework for Network Simulator 3 (ns-3). Workshop on ns-3
(WNS3), Poster Session, Atlanta, GA, USA. May, 2014.
+.. [7] C. Tapparello, H. Ayatollahi and W. Heinzelman. Energy Harvesting
+ Framework for Network Simulator 3 (ns-3). 2nd International Workshop on
+ Energy Neutral Sensing Systems (ENSsys), Memphis, TN, USA. November 6,
+ 2014.
+
Usage
=====
diff -Naur ns-3.22/src/energy/helper/energy-harvester-container.cc ns-3.23/src/e
nergy/helper/energy-harvester-container.cc
--- ns-3.22/src/energy/helper/energy-harvester-container.cc
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/energy/helper/energy-harvester-container.cc
2015-05-13 11:05
:26.000000000 -0700
@@ -35,6 +35,7 @@
{
static TypeId tid = TypeId ("ns3::EnergyHarvesterContainer")
.SetParent<Object> ()
+
.SetGroupName ("Energy")
.AddConstructor<EnergyHarvesterContainer> ()
;
return tid;
diff -Naur ns-3.22/src/energy/helper/energy-source-container.cc ns-3.23/src/ener
gy/helper/energy-source-container.cc
--- ns-3.22/src/energy/helper/energy-source-container.cc
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/energy/helper/energy-source-container.cc
2015-05-13 11:05
:26.000000000 -0700
@@ -32,6 +32,7 @@
{
static TypeId tid = TypeId ("ns3::EnergySourceContainer")
.SetParent<Object> ()
+
.SetGroupName ("Energy")
.AddConstructor<EnergySourceContainer> ()
;
return tid;
diff -Naur ns-3.22/src/energy/helper/li-ion-energy-source-helper.cc ns-3.23/src/
energy/helper/li-ion-energy-source-helper.cc
--- ns-3.22/src/energy/helper/li-ion-energy-source-helper.cc
1969-12-31 16:00
:00.000000000 -0800
+++ ns-3.23/src/energy/helper/li-ion-energy-source-helper.cc
2015-05-13 11:05
:26.000000000 -0700
@@ -0,0 +1,53 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 Wireless Communications and Networking Group (WCNG),
+ * University of Rochester, Rochester, NY, USA.
+ *
+ * This program is free software; you can redistribute it and/or modify

+ * it under the terms of the GNU General Public License version 2 as


+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Authors: Hoda Ayatollahi <hayatoll@ur.rochester.edu>
+ *
Cristiano Tapparello <cristiano.tapparello@rochester.edu>
+ */
+
+#include "li-ion-energy-source-helper.h"
+#include "ns3/energy-source.h"
+
+namespace ns3 {
+
+LiIonEnergySourceHelper::LiIonEnergySourceHelper ()
+{
+ m_liIonEnergySource.SetTypeId ("ns3::LiIonEnergySource");
+}
+
+LiIonEnergySourceHelper::~LiIonEnergySourceHelper ()
+{
+}
+
+void
+LiIonEnergySourceHelper::Set (std::string name, const AttributeValue &v)
+{
+ m_liIonEnergySource.Set (name, v);
+}
+
+Ptr<EnergySource>
+LiIonEnergySourceHelper::DoInstall (Ptr<Node> node) const
+{
+ NS_ASSERT (node != NULL);
+ Ptr<EnergySource> source = m_liIonEnergySource.Create<EnergySource> ();
+ NS_ASSERT (source != NULL);
+ source->SetNode (node);
+ return source;
+}
+
+} // namespace ns3
diff -Naur ns-3.22/src/energy/helper/li-ion-energy-source-helper.h ns-3.23/src/e
nergy/helper/li-ion-energy-source-helper.h
--- ns-3.22/src/energy/helper/li-ion-energy-source-helper.h
1969-12-31 16:00
:00.000000000 -0800
+++ ns-3.23/src/energy/helper/li-ion-energy-source-helper.h
2015-05-13 11:05
:26.000000000 -0700
@@ -0,0 +1,54 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2014 Wireless Communications and Networking Group (WCNG),
+ * University of Rochester, Rochester, NY, USA.
+ *
+ * This program is free software; you can redistribute it and/or modify

+ * it under the terms of the GNU General Public License version 2 as


+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Authors: Hoda Ayatollahi <hayatoll@ur.rochester.edu>
+ *
Cristiano Tapparello <cristiano.tapparello@rochester.edu>
+ */
+
+#ifndef LI_ION_ENERGY_SOURCE_HELPER_H_
+#define LI_ION_ENERGY_SOURCE_HELPER_H_
+
+#include "energy-model-helper.h"
+#include "ns3/node.h"
+
+namespace ns3 {
+
+/**
+ * \ingroup energy
+ * \brief Creates a LiIonEnergySource object.
+ *
+ */
+class LiIonEnergySourceHelper: public EnergySourceHelper
+{
+public:
+ LiIonEnergySourceHelper ();
+ ~LiIonEnergySourceHelper ();
+
+ void Set (std::string name, const AttributeValue &v);
+
+private:
+ virtual Ptr<EnergySource> DoInstall (Ptr<Node> node) const;
+
+private:
+ ObjectFactory m_liIonEnergySource;
+
+};
+
+} // namespace ns3
+
+#endif /* LI_ION_ENERGY_SOURCE_HELPER_H_ */
diff -Naur ns-3.22/src/energy/model/basic-energy-harvester.cc ns-3.23/src/energy
/model/basic-energy-harvester.cc
--- ns-3.22/src/energy/model/basic-energy-harvester.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/energy/model/basic-energy-harvester.cc 2015-05-13 11:05:26.0000
00000 -0700
@@ -39,6 +39,7 @@
{
static TypeId tid = TypeId ("ns3::BasicEnergyHarvester")
.SetParent<EnergyHarvester> ()
+ .SetGroupName ("Energy")
.AddConstructor<BasicEnergyHarvester> ()

.AddAttribute ("PeriodicHarvestedPowerUpdateInterval",
"Time between two consecutive periodic updates of the harveste
d power. By default, the value is updated every 1 s",
diff -Naur ns-3.22/src/energy/model/basic-energy-source.cc ns-3.23/src/energy/mo
del/basic-energy-source.cc
--- ns-3.22/src/energy/model/basic-energy-source.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/energy/model/basic-energy-source.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -36,6 +36,7 @@
{
static TypeId tid = TypeId ("ns3::BasicEnergySource")
.SetParent<EnergySource> ()
+
.SetGroupName ("Energy")
.AddConstructor<BasicEnergySource> ()
.AddAttribute ("BasicEnergySourceInitialEnergyJ",
"Initial energy stored in basic energy source.",
diff -Naur ns-3.22/src/energy/model/device-energy-model.cc ns-3.23/src/energy/mo
del/device-energy-model.cc
--- ns-3.22/src/energy/model/device-energy-model.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/energy/model/device-energy-model.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -32,6 +32,7 @@
{
static TypeId tid = TypeId ("ns3::DeviceEnergyModel")
.SetParent<Object> ()
+
.SetGroupName ("Energy")
;
return tid;
}
diff -Naur ns-3.22/src/energy/model/energy-harvester.cc ns-3.23/src/energy/model
/energy-harvester.cc
--- ns-3.22/src/energy/model/energy-harvester.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/energy/model/energy-harvester.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -33,6 +33,7 @@
{
static TypeId tid = TypeId ("ns3::EnergyHarvester")
.SetParent<Object> ()
+
.SetGroupName ("Energy")
;
return tid;
}
diff -Naur ns-3.22/src/energy/model/energy-source.cc ns-3.23/src/energy/model/en
ergy-source.cc
--- ns-3.22/src/energy/model/energy-source.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/energy/model/energy-source.cc 2015-05-13 11:05:26.000000000 -0
700
@@ -37,6 +37,7 @@
{
static TypeId tid = TypeId ("ns3::EnergySource")
.SetParent<Object> ()
+
.SetGroupName ("Energy")
;
return tid;
}
diff -Naur ns-3.22/src/energy/model/li-ion-energy-source.cc ns-3.23/src/energy/m

odel/li-ion-energy-source.cc
--- ns-3.22/src/energy/model/li-ion-energy-source.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/energy/model/li-ion-energy-source.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -38,6 +38,7 @@
{
static TypeId tid = TypeId ("ns3::LiIonEnergySource")
.SetParent<EnergySource> ()
+
.SetGroupName ("Energy")
.AddConstructor<LiIonEnergySource> ()
.AddAttribute ("LiIonEnergySourceInitialEnergyJ",
"Initial energy stored in basic energy source.",
diff -Naur ns-3.22/src/energy/model/rv-battery-model.cc ns-3.23/src/energy/model
/rv-battery-model.cc
--- ns-3.22/src/energy/model/rv-battery-model.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/energy/model/rv-battery-model.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -37,6 +37,7 @@
{
static TypeId tid = TypeId ("ns3::RvBatteryModel")
.SetParent<EnergySource> ()
+
.SetGroupName ("Energy")
.AddConstructor<RvBatteryModel> ()
.AddAttribute ("RvBatteryModelPeriodicEnergyUpdateInterval",
"RV battery model sampling interval.",
@@ -94,8 +95,9 @@
RvBatteryModel::RvBatteryModel ()
{
NS_LOG_FUNCTION (this);
- m_lastSampleTime = Seconds (0.0);
- m_previousLoad = 0.0;
+ m_lastSampleTime = Simulator::Now ();
+ m_timeStamps.push_back (m_lastSampleTime);
+ m_previousLoad = -1.0;
m_batteryLevel = 1; // fully charged
m_lifetime = Seconds (0.0);
}
@@ -170,13 +172,12 @@
m_batteryLevel = 0;
}
- // check if battery is dead.
+ // check if battery level is below the low battery threshold.
if (m_batteryLevel <= m_lowBatteryTh)
{
m_lifetime = Simulator::Now ();
NS_LOG_DEBUG ("RvBatteryModel:Battery is dead!");
+
m_lifetime = Simulator::Now () - m_timeStamps[0];
+
NS_LOG_DEBUG ("RvBatteryModel:Battery level below threshold!");
HandleEnergyDrainedEvent ();
return; // stop periodic sampling
}
m_previousLoad = currentLoad;
@@ -326,19 +327,15 @@
{
m_load.push_back (load);
m_previousLoad = load;

+
+
+
+

if (t != Seconds (0.0))
{
m_timeStamps[m_timeStamps.size () - 1] = m_lastSampleTime;
}
else
{
m_timeStamps.push_back (Seconds (0.0));
}
m_timeStamps[m_timeStamps.size () - 1] = m_lastSampleTime;
m_timeStamps.push_back (t);

}
else
{

m_timeStamps[m_timeStamps.size () - 1] = t;
if (!m_timeStamps.empty())
{
m_timeStamps[m_timeStamps.size () - 1] = t;
}

m_lastSampleTime = t;
diff -Naur ns-3.22/src/energy/model/rv-battery-model.h ns-3.23/src/energy/model/
rv-battery-model.h
--- ns-3.22/src/energy/model/rv-battery-model.h 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/energy/model/rv-battery-model.h 2015-05-13 11:05:26.000000000 -0
700
@@ -55,7 +55,7 @@
virtual ~RvBatteryModel ();
/**
- * \return Initial energy stored (theoretical capacity) in the battery.
+ * \return Initial energy stored (theoretical capacity) in the battery, in Jo
ules.
*
* Implements GetInitialEnergy.
*/
diff -Naur ns-3.22/src/energy/model/simple-device-energy-model.cc ns-3.23/src/en
ergy/model/simple-device-energy-model.cc
--- ns-3.22/src/energy/model/simple-device-energy-model.cc
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/energy/model/simple-device-energy-model.cc
2015-05-13 11:05
:26.000000000 -0700
@@ -35,6 +35,7 @@
{
static TypeId tid = TypeId ("ns3::SimpleDeviceEnergyModel")
.SetParent<DeviceEnergyModel> ()
+
.SetGroupName ("Energy")
.AddConstructor<SimpleDeviceEnergyModel> ()
.AddTraceSource ("TotalEnergyConsumption",
"Total energy consumption of the radio device.",
diff -Naur ns-3.22/src/energy/model/wifi-radio-energy-model.cc ns-3.23/src/energ
y/model/wifi-radio-energy-model.cc
--- ns-3.22/src/energy/model/wifi-radio-energy-model.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/energy/model/wifi-radio-energy-model.cc 2015-05-13 11:05:26.0000
00000 -0700
@@ -38,6 +38,7 @@
{
static TypeId tid = TypeId ("ns3::WifiRadioEnergyModel")

.SetParent<DeviceEnergyModel> ()
.SetGroupName ("Energy")
.AddConstructor<WifiRadioEnergyModel> ()
.AddAttribute ("IdleCurrentA",
"The default radio Idle current in Ampere.",
diff -Naur ns-3.22/src/energy/model/wifi-tx-current-model.cc ns-3.23/src/energy/
model/wifi-tx-current-model.cc
--- ns-3.22/src/energy/model/wifi-tx-current-model.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/energy/model/wifi-tx-current-model.cc 2015-05-13 11:05:26.0000
00000 -0700
@@ -39,6 +39,7 @@
{
static TypeId tid = TypeId ("ns3::WifiTxCurrentModel")
.SetParent<Object> ()
+
.SetGroupName ("Energy")
;
return tid;
}
diff -Naur ns-3.22/src/fd-net-device/bindings/modulegen__gcc_ILP32.py ns-3.23/sr
c/fd-net-device/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/fd-net-device/bindings/modulegen__gcc_ILP32.py 2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/fd-net-device/bindings/modulegen__gcc_ILP32.py 2015-05-13 11:05
:26.000000000 -0700
@@ -1053,11 +1053,21 @@
cls.add_constructor([param('uint64_t', 'bps')])
## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate
) [constructor]
cls.add_constructor([param('std::string', 'rate')])
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTx
Time(uint32_t bits) const [member function]
+
cls.add_method('CalculateBitsTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bits')],
+
is_const=True)
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesT
xTime(uint32_t bytes) const [member function]
+
cls.add_method('CalculateBytesTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bytes')],
+
is_const=True)
## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(ui
nt32_t bytes) const [member function]
cls.add_method('CalculateTxTime',
'double',
[param('uint32_t', 'bytes')],
is_const=True)
+
deprecated=True, is_const=True)
## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() con
st [member function]
cls.add_method('GetBitRate',
'uint64_t',
diff -Naur ns-3.22/src/fd-net-device/bindings/modulegen__gcc_LP64.py ns-3.23/src
/fd-net-device/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/fd-net-device/bindings/modulegen__gcc_LP64.py 2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/fd-net-device/bindings/modulegen__gcc_LP64.py 2015-05-13 11:05
:26.000000000 -0700
@@ -1053,11 +1053,21 @@
+

cls.add_constructor([param('uint64_t', 'bps')])
## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate
) [constructor]
cls.add_constructor([param('std::string', 'rate')])
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTx
Time(uint32_t bits) const [member function]
+
cls.add_method('CalculateBitsTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bits')],
+
is_const=True)
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesT
xTime(uint32_t bytes) const [member function]
+
cls.add_method('CalculateBytesTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bytes')],
+
is_const=True)
## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(ui
nt32_t bytes) const [member function]
cls.add_method('CalculateTxTime',
'double',
[param('uint32_t', 'bytes')],
is_const=True)
+
deprecated=True, is_const=True)
## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() con
st [member function]
cls.add_method('GetBitRate',
'uint64_t',
diff -Naur ns-3.22/src/fd-net-device/doc/fd-net-device.rst ns-3.23/src/fd-net-de
vice/doc/fd-net-device.rst
--- ns-3.22/src/fd-net-device/doc/fd-net-device.rst
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/fd-net-device/doc/fd-net-device.rst
2015-05-13 11:05:26.0000
00000 -0700
@@ -131,7 +131,7 @@
DIX for Ethernet II frames, LLC for 802.2 LLC/SNAP frames,
and DIXPI for Ethernet II frames with an additional TAP PI header.
This means that traffic traversing the file descriptor is expected to be
-Ethernet II compatible.
+Ethernet II compatible. IEEE 802.1q (VLAN) tagging is not supported.
Attaching an FdNetDevice to a wireless interface is possible as long as the
driver provides Ethernet II frames to the socket API.
Note that to associate a FdNetDevice to a wireless card in ad-hoc mode,
diff -Naur ns-3.22/src/fd-net-device/examples/fd2fd-onoff.cc ns-3.23/src/fd-netdevice/examples/fd2fd-onoff.cc
--- ns-3.22/src/fd-net-device/examples/fd2fd-onoff.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/fd-net-device/examples/fd2fd-onoff.cc 2015-05-13 11:05:26.0000
00000 -0700
@@ -38,6 +38,7 @@
// Steps to run the experiment:
//
// $ ./waf --run="fd2fd-onoff"
+// $ ./waf --run="fd2fd-onoff --tcpMode=1"
//
#include <sys/socket.h>
@@ -56,6 +57,24 @@
int
main (int argc, char *argv[])
{

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

// Command-line arguments
//
bool tcpMode = false;
CommandLine cmd;
cmd.AddValue ("tcpMode", "1:true, 0:false, default mode UDP",tcpMode);
cmd.Parse (argc, argv);
std::string factory;
if (tcpMode==1)
{
factory = "ns3::TcpSocketFactory";
}
else
{
factory = "ns3::UdpSocketFactory";
}
GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));

uint16_t sinkPort = 8000;


@@ -100,7 +119,8 @@
// server
Address sinkLocalAddress (InetSocketAddress (serverIp, sinkPort));
- PacketSinkHelper sinkHelper ("ns3::TcpSocketFactory", sinkLocalAddress);
+
+ PacketSinkHelper sinkHelper (factory, sinkLocalAddress);
ApplicationContainer sinkApp = sinkHelper.Install (serverNode);
sinkApp.Start (Seconds (0.0));
sinkApp.Stop (Seconds (30.0));
@@ -108,7 +128,7 @@
// client
AddressValue serverAddress (InetSocketAddress (serverIp, sinkPort));
- OnOffHelper onoff ("ns3::TcpSocketFactory", Address ());
+ OnOffHelper onoff (factory, Address ());
onoff.SetAttribute ("Remote", serverAddress);
onoff.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Const
ant=1]"));
onoff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Cons
tant=0]"));
diff -Naur ns-3.22/src/fd-net-device/helper/tap-fd-net-device-helper.cc ns-3.23/
src/fd-net-device/helper/tap-fd-net-device-helper.cc
--- ns-3.22/src/fd-net-device/helper/tap-fd-net-device-helper.cc
2015-0205 15:46:22.000000000 -0800
+++ ns-3.23/src/fd-net-device/helper/tap-fd-net-device-helper.cc
2015-0513 11:05:26.000000000 -0700
@@ -112,7 +112,6 @@
{
Ptr<NetDevice> d = FdNetDeviceHelper::InstallPriv (node);
Ptr<FdNetDevice> device = d->GetObject<FdNetDevice> ();
- Ptr<FdNetDevice> fdnd = device->GetObject<FdNetDevice> ();
//
// We need to explicitly set the encapsulation mode for the traffic
@@ -122,7 +121,7 @@
//
if (m_modePi)
{

fdnd->SetEncapsulationMode (FdNetDevice::DIXPI);
device->SetEncapsulationMode (FdNetDevice::DIXPI);

SetFileDescriptor (device);
diff -Naur ns-3.22/src/fd-net-device/model/fd-net-device.cc ns-3.23/src/fd-net-d
evice/model/fd-net-device.cc
--- ns-3.22/src/fd-net-device/model/fd-net-device.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/fd-net-device/model/fd-net-device.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -52,6 +52,7 @@
void
FdNetDeviceFdReader::SetBufferSize (uint32_t bufferSize)
{
+ NS_LOG_FUNCTION (this << bufferSize);
m_bufferSize = bufferSize;
}
@@ -70,7 +71,7 @@
buf = 0;
len = 0;
}
+ NS_LOG_LOGIC ("Read " << len << " bytes on fd " << m_fd);
return FdReader::Data (buf, len);
}
@@ -81,6 +82,7 @@
{
static TypeId tid = TypeId ("ns3::FdNetDevice")
.SetParent<NetDevice> ()
+
.SetGroupName ("FdNetDevice")
.AddConstructor<FdNetDevice> ()
.AddAttribute ("Address",
"The MAC address of this device.",
@@ -246,7 +248,8 @@
m_nodeId = GetNode ()->GetId ();
m_fdReader = Create<FdNetDeviceFdReader> ();
- m_fdReader->SetBufferSize(m_mtu);
+ // 22 bytes covers 14 bytes Ethernet header with possible 8 bytes LLC/SNAP
+ m_fdReader->SetBufferSize(m_mtu + 22);
m_fdReader->Start (m_fd, MakeCallback (&FdNetDevice::ReceiveCallback, this));
NotifyLinkUp ();
@@ -280,7 +283,7 @@
CriticalSection cs (m_pendingReadMutex);
if (m_pendingReadCount >= m_maxPendingReads)
{
//XXX: Packet dropped!
+
NS_LOG_WARN ("Packet dropped");
skip = true;
}
else
@@ -493,8 +496,7 @@
FdNetDevice::SendFrom (Ptr<Packet> packet, const Address& src, const Address& d
est, uint16_t protocolNumber)
{
NS_LOG_FUNCTION (this << packet << src << dest << protocolNumber);

- NS_LOG_LOGIC ("packet " << packet);


- NS_LOG_LOGIC ("UID is " << packet->GetUid ());
+ NS_LOG_LOGIC ("packet: " << packet << " UID: " << packet->GetUid ());
if (IsLinkUp () == false)
{
@@ -513,6 +515,8 @@
header.SetSource (source);
header.SetDestination (destination);
+ NS_ASSERT_MSG (packet->GetSize () <= m_mtu, "FdNetDevice::SendFrom(): Packet
too big " << packet->GetSize ());
+
if (m_encapMode == LLC)
{
LlcSnapHeader llc;
@@ -540,7 +544,6 @@
NS_LOG_LOGIC ("calling write");
- NS_ASSERT_MSG (packet->GetSize () <= m_mtu, "FdNetDevice::SendFrom(): Packet
too big " << packet->GetSize ());
ssize_t len = (ssize_t) packet->GetSize ();
uint8_t *buffer = (uint8_t*)malloc (len);
diff -Naur ns-3.22/src/fd-net-device/test/examples-to-run.py ns-3.23/src/fd-netdevice/test/examples-to-run.py
--- ns-3.22/src/fd-net-device/test/examples-to-run.py 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/fd-net-device/test/examples-to-run.py 2015-05-13 11:05:26.0000
00000 -0700
@@ -13,7 +13,7 @@
("fd-emu-onoff", "False", "True"),
("fd-emu-udp-echo", "False", "True"),
("realtime-dummy-network", "False", "True"),
("fd2fd-onoff", "False", "True"),
+
("fd2fd-onoff", "True", "True"),
("fd-tap-ping", "False", "True"),
("realtime-fd2fd-onoff", "False", "True"),
]
diff -Naur ns-3.22/src/flow-monitor/model/flow-monitor.cc ns-3.23/src/flow-monit
or/model/flow-monitor.cc
--- ns-3.22/src/flow-monitor/model/flow-monitor.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/flow-monitor/model/flow-monitor.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -41,6 +41,7 @@
{
static TypeId tid = TypeId ("ns3::FlowMonitor")
.SetParent<Object> ()
+
.SetGroupName ("FlowMonitor")
.AddConstructor<FlowMonitor> ()
.AddAttribute ("MaxPerHopDelay", ("The maximum per-hop delay that should be
considered. "
"Packets still not received after this de
lay are to be considered lost."),
diff -Naur ns-3.22/src/flow-monitor/model/ipv4-flow-probe.cc ns-3.23/src/flow-mo
nitor/model/ipv4-flow-probe.cc
--- ns-3.22/src/flow-monitor/model/ipv4-flow-probe.cc 2015-02-05 15:46:22.0000
00000 -0800

+++ ns-3.23/src/flow-monitor/model/ipv4-flow-probe.cc 2015-05-13 11:05:27.0000


00000 -0700
@@ -108,6 +108,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv4FlowProbeTag")
.SetParent<Tag> ()
+
.SetGroupName ("FlowMonitor")
.AddConstructor<Ipv4FlowProbeTag> ()
;
return tid;
diff -Naur ns-3.22/src/flow-monitor/model/ipv6-flow-probe.cc ns-3.23/src/flow-mo
nitor/model/ipv6-flow-probe.cc
--- ns-3.22/src/flow-monitor/model/ipv6-flow-probe.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/flow-monitor/model/ipv6-flow-probe.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -109,6 +109,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6FlowProbeTag")
.SetParent<Tag> ()
+
.SetGroupName ("FlowMonitor")
.AddConstructor<Ipv6FlowProbeTag> ()
;
return tid;
diff -Naur ns-3.22/src/internet/bindings/modulegen__gcc_ILP32.py ns-3.23/src/int
ernet/bindings/modulegen__gcc_ILP32.py
--- ns-3.22/src/internet/bindings/modulegen__gcc_ILP32.py
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/internet/bindings/modulegen__gcc_ILP32.py
2015-05-13 11:05
:27.000000000 -0700
@@ -8893,6 +8893,11 @@
cls.add_method('EnableChecksums',
'void',
[])
+
## tcp-header.h (module 'internet'): static std::string ns3::TcpHeader::Fla
gsToString(uint8_t flags, std::string const & delimiter="|") [member function]
+
cls.add_method('FlagsToString',
+
'std::string',
+
[param('uint8_t', 'flags'), param('std::string const &', 'de
limiter', default_value='"|"')],
+
is_static=True)
## tcp-header.h (module 'internet'): ns3::SequenceNumber32 ns3::TcpHeader::
GetAckNumber() const [member function]
cls.add_method('GetAckNumber',
'ns3::SequenceNumber32',
@@ -9755,6 +9760,11 @@
'void',
[],
visibility='protected', is_virtual=True)
+
## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ScaleSsT
hresh(uint8_t scaleFactor) [member function]
+
cls.add_method('ScaleSsThresh',
+
'void',
+
[param('uint8_t', 'scaleFactor')],
+
is_pure_virtual=True, visibility='protected', is_virtual=Tru
e)
## tcp-socket-base.h (module 'internet'): uint32_t ns3::TcpSocketBase::Send
DataPacket(ns3::SequenceNumber32 seq, uint32_t maxSize, bool withAck) [member fu
nction]
cls.add_method('SendDataPacket',

'uint32_t',
@@ -9860,11 +9870,16 @@
'uint32_t',
[],
visibility='protected', is_virtual=True)
+
## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::UpdateWi
ndowSize(ns3::TcpHeader const & header) [member function]
+
cls.add_method('UpdateWindowSize',
+
'void',
+
[param('ns3::TcpHeader const &', 'header')],
+
visibility='protected')
## tcp-socket-base.h (module 'internet'): uint32_t ns3::TcpSocketBase::Wind
ow() [member function]
cls.add_method('Window',
'uint32_t',
[],
visibility='protected', is_virtual=True)
+
is_pure_virtual=True, visibility='protected', is_virtual=Tru
e)
return
def register_Ns3TcpSocketFactory_methods(root_module, cls):
@@ -9929,6 +9944,11 @@
'void',
[],
visibility='protected', is_virtual=True)
+
## tcp-tahoe.h (module 'internet'): void ns3::TcpTahoe::ScaleSsThresh(uint8
_t scaleFactor) [member function]
+
cls.add_method('ScaleSsThresh',
+
'void',
+
[param('uint8_t', 'scaleFactor')],
+
visibility='protected', is_virtual=True)
## tcp-tahoe.h (module 'internet'): void ns3::TcpTahoe::SetInitialCwnd(uint
32_t cwnd) [member function]
cls.add_method('SetInitialCwnd',
'void',
@@ -10073,6 +10093,11 @@
'void',
[],
visibility='protected', is_virtual=True)
+
## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::ScaleSsThresh
(uint8_t scaleFactor) [member function]
+
cls.add_method('ScaleSsThresh',
+
'void',
+
[param('uint8_t', 'scaleFactor')],
+
visibility='protected', is_virtual=True)
## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::SetInitialCwn
d(uint32_t cwnd) [member function]
cls.add_method('SetInitialCwnd',
'void',
@@ -14584,15 +14609,6 @@
'ns3::Address',
[],
is_const=True)
## ndisc-cache.h (module 'internet'): uint8_t ns3::NdiscCache::Entry::GetNS
Retransmit() const [member function]
cls.add_method('GetNSRetransmit',
'uint8_t',
[],
is_const=True)

## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::IncNSRet


ransmit() [member function]
cls.add_method('IncNSRetransmit',
'void',
[])
## ndisc-cache.h (module 'internet'): bool ns3::NdiscCache::Entry::IsDelay(
) const [member function]
cls.add_method('IsDelay',
'bool',
@@ -14651,10 +14667,6 @@
cls.add_method('MarkStale',
'void',
[])
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::ResetNSR
etransmit() [member function]
cls.add_method('ResetNSRetransmit',
'void',
[])
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::SetIpv6A
ddress(ns3::Ipv6Address ipv6Address) [member function]
cls.add_method('SetIpv6Address',
'void',
@@ -14683,20 +14695,8 @@
cls.add_method('StartRetransmitTimer',
'void',
[])
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopDela
yTimer() [member function]
cls.add_method('StopDelayTimer',
'void',
[])
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopProb
eTimer() [member function]
cls.add_method('StopProbeTimer',
'void',
[])
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopReac
hableTimer() [member function]
cls.add_method('StopReachableTimer',
'void',
[])
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopRetr
ansmitTimer() [member function]
cls.add_method('StopRetransmitTimer',
+
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopNudT
imer() [member function]
+
cls.add_method('StopNudTimer',
'void',
[])
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::UpdateLa
stReachabilityconfirmation() [member function]
@@ -15640,6 +15640,11 @@
'void',
[],
visibility='protected', is_virtual=True)
+
## tcp-newreno.h (module 'internet'): void ns3::TcpNewReno::ScaleSsThresh(u
int8_t scaleFactor) [member function]
+
cls.add_method('ScaleSsThresh',
+
'void',
+
[param('uint8_t', 'scaleFactor')],

visibility='protected', is_virtual=True)
## tcp-newreno.h (module 'internet'): void ns3::TcpNewReno::SetInitialCwnd(
uint32_t cwnd) [member function]
cls.add_method('SetInitialCwnd',
'void',
@@ -15712,6 +15717,11 @@
'void',
[],
visibility='protected', is_virtual=True)
+
## tcp-reno.h (module 'internet'): void ns3::TcpReno::ScaleSsThresh(uint8_t
scaleFactor) [member function]
+
cls.add_method('ScaleSsThresh',
+
'void',
+
[param('uint8_t', 'scaleFactor')],
+
visibility='protected', is_virtual=True)
## tcp-reno.h (module 'internet'): void ns3::TcpReno::SetInitialCwnd(uint32
_t cwnd) [member function]
cls.add_method('SetInitialCwnd',
'void',
@@ -15764,6 +15774,11 @@
'uint32_t',
[],
is_const=True, visibility='protected', is_virtual=True)
+
## tcp-rfc793.h (module 'internet'): void ns3::TcpRfc793::ScaleSsThresh(uin
t8_t scaleFactor) [member function]
+
cls.add_method('ScaleSsThresh',
+
'void',
+
[param('uint8_t', 'scaleFactor')],
+
visibility='protected', is_virtual=True)
## tcp-rfc793.h (module 'internet'): void ns3::TcpRfc793::SetInitialCwnd(ui
nt32_t cwnd) [member function]
cls.add_method('SetInitialCwnd',
'void',
@@ -15774,6 +15789,11 @@
'void',
[param('uint32_t', 'threshold')],
visibility='protected', is_virtual=True)
+
## tcp-rfc793.h (module 'internet'): uint32_t ns3::TcpRfc793::Window() [mem
ber function]
+
cls.add_method('Window',
+
'uint32_t',
+
[],
+
visibility='protected', is_virtual=True)
return
def register_Ns3TimeValue_methods(root_module, cls):
diff -Naur ns-3.22/src/internet/bindings/modulegen__gcc_LP64.py ns-3.23/src/inte
rnet/bindings/modulegen__gcc_LP64.py
--- ns-3.22/src/internet/bindings/modulegen__gcc_LP64.py
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/internet/bindings/modulegen__gcc_LP64.py
2015-05-13 11:05
:27.000000000 -0700
@@ -8893,6 +8893,11 @@
cls.add_method('EnableChecksums',
'void',
[])
+
## tcp-header.h (module 'internet'): static std::string ns3::TcpHeader::Fla
gsToString(uint8_t flags, std::string const & delimiter="|") [member function]
+
cls.add_method('FlagsToString',
+
'std::string',

+
[param('uint8_t', 'flags'), param('std::string const &', 'de
limiter', default_value='"|"')],
+
is_static=True)
## tcp-header.h (module 'internet'): ns3::SequenceNumber32 ns3::TcpHeader::
GetAckNumber() const [member function]
cls.add_method('GetAckNumber',
'ns3::SequenceNumber32',
@@ -9755,6 +9760,11 @@
'void',
[],
visibility='protected', is_virtual=True)
+
## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::ScaleSsT
hresh(uint8_t scaleFactor) [member function]
+
cls.add_method('ScaleSsThresh',
+
'void',
+
[param('uint8_t', 'scaleFactor')],
+
is_pure_virtual=True, visibility='protected', is_virtual=Tru
e)
## tcp-socket-base.h (module 'internet'): uint32_t ns3::TcpSocketBase::Send
DataPacket(ns3::SequenceNumber32 seq, uint32_t maxSize, bool withAck) [member fu
nction]
cls.add_method('SendDataPacket',
'uint32_t',
@@ -9860,11 +9870,16 @@
'uint32_t',
[],
visibility='protected', is_virtual=True)
+
## tcp-socket-base.h (module 'internet'): void ns3::TcpSocketBase::UpdateWi
ndowSize(ns3::TcpHeader const & header) [member function]
+
cls.add_method('UpdateWindowSize',
+
'void',
+
[param('ns3::TcpHeader const &', 'header')],
+
visibility='protected')
## tcp-socket-base.h (module 'internet'): uint32_t ns3::TcpSocketBase::Wind
ow() [member function]
cls.add_method('Window',
'uint32_t',
[],
visibility='protected', is_virtual=True)
+
is_pure_virtual=True, visibility='protected', is_virtual=Tru
e)
return
def register_Ns3TcpSocketFactory_methods(root_module, cls):
@@ -9929,6 +9944,11 @@
'void',
[],
visibility='protected', is_virtual=True)
+
## tcp-tahoe.h (module 'internet'): void ns3::TcpTahoe::ScaleSsThresh(uint8
_t scaleFactor) [member function]
+
cls.add_method('ScaleSsThresh',
+
'void',
+
[param('uint8_t', 'scaleFactor')],
+
visibility='protected', is_virtual=True)
## tcp-tahoe.h (module 'internet'): void ns3::TcpTahoe::SetInitialCwnd(uint
32_t cwnd) [member function]
cls.add_method('SetInitialCwnd',
'void',
@@ -10073,6 +10093,11 @@
'void',

[],
visibility='protected', is_virtual=True)
+
## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::ScaleSsThresh
(uint8_t scaleFactor) [member function]
+
cls.add_method('ScaleSsThresh',
+
'void',
+
[param('uint8_t', 'scaleFactor')],
+
visibility='protected', is_virtual=True)
## tcp-westwood.h (module 'internet'): void ns3::TcpWestwood::SetInitialCwn
d(uint32_t cwnd) [member function]
cls.add_method('SetInitialCwnd',
'void',
@@ -14584,15 +14609,6 @@
'ns3::Address',
[],
is_const=True)
## ndisc-cache.h (module 'internet'): uint8_t ns3::NdiscCache::Entry::GetNS
Retransmit() const [member function]
cls.add_method('GetNSRetransmit',
'uint8_t',
[],
is_const=True)
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::IncNSRet
ransmit() [member function]
cls.add_method('IncNSRetransmit',
'void',
[])
## ndisc-cache.h (module 'internet'): bool ns3::NdiscCache::Entry::IsDelay(
) const [member function]
cls.add_method('IsDelay',
'bool',
@@ -14651,10 +14667,6 @@
cls.add_method('MarkStale',
'void',
[])
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::ResetNSR
etransmit() [member function]
cls.add_method('ResetNSRetransmit',
'void',
[])
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::SetIpv6A
ddress(ns3::Ipv6Address ipv6Address) [member function]
cls.add_method('SetIpv6Address',
'void',
@@ -14683,20 +14695,8 @@
cls.add_method('StartRetransmitTimer',
'void',
[])
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopDela
yTimer() [member function]
cls.add_method('StopDelayTimer',
'void',
[])
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopProb
eTimer() [member function]
cls.add_method('StopProbeTimer',
'void',
[])
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopReac
hableTimer() [member function]

cls.add_method('StopReachableTimer',
'void',
[])
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopRetr
ansmitTimer() [member function]
cls.add_method('StopRetransmitTimer',
+
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::StopNudT
imer() [member function]
+
cls.add_method('StopNudTimer',
'void',
[])
## ndisc-cache.h (module 'internet'): void ns3::NdiscCache::Entry::UpdateLa
stReachabilityconfirmation() [member function]
@@ -15640,6 +15640,11 @@
'void',
[],
visibility='protected', is_virtual=True)
+
## tcp-newreno.h (module 'internet'): void ns3::TcpNewReno::ScaleSsThresh(u
int8_t scaleFactor) [member function]
+
cls.add_method('ScaleSsThresh',
+
'void',
+
[param('uint8_t', 'scaleFactor')],
+
visibility='protected', is_virtual=True)
## tcp-newreno.h (module 'internet'): void ns3::TcpNewReno::SetInitialCwnd(
uint32_t cwnd) [member function]
cls.add_method('SetInitialCwnd',
'void',
@@ -15712,6 +15717,11 @@
'void',
[],
visibility='protected', is_virtual=True)
+
## tcp-reno.h (module 'internet'): void ns3::TcpReno::ScaleSsThresh(uint8_t
scaleFactor) [member function]
+
cls.add_method('ScaleSsThresh',
+
'void',
+
[param('uint8_t', 'scaleFactor')],
+
visibility='protected', is_virtual=True)
## tcp-reno.h (module 'internet'): void ns3::TcpReno::SetInitialCwnd(uint32
_t cwnd) [member function]
cls.add_method('SetInitialCwnd',
'void',
@@ -15764,6 +15774,11 @@
'uint32_t',
[],
is_const=True, visibility='protected', is_virtual=True)
+
## tcp-rfc793.h (module 'internet'): void ns3::TcpRfc793::ScaleSsThresh(uin
t8_t scaleFactor) [member function]
+
cls.add_method('ScaleSsThresh',
+
'void',
+
[param('uint8_t', 'scaleFactor')],
+
visibility='protected', is_virtual=True)
## tcp-rfc793.h (module 'internet'): void ns3::TcpRfc793::SetInitialCwnd(ui
nt32_t cwnd) [member function]
cls.add_method('SetInitialCwnd',
'void',
@@ -15774,6 +15789,11 @@
'void',
[param('uint32_t', 'threshold')],
visibility='protected', is_virtual=True)
+
## tcp-rfc793.h (module 'internet'): uint32_t ns3::TcpRfc793::Window() [mem

ber function]
+
cls.add_method('Window',
+
'uint32_t',
+
[],
+
visibility='protected', is_virtual=True)
return
def register_Ns3TimeValue_methods(root_module, cls):
diff -Naur ns-3.22/src/internet/helper/ipv4-routing-helper.cc ns-3.23/src/intern
et/helper/ipv4-routing-helper.cc
--- ns-3.22/src/internet/helper/ipv4-routing-helper.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/helper/ipv4-routing-helper.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -71,19 +71,25 @@
Ipv4RoutingHelper::Print (Ptr<Node> node, Ptr<OutputStreamWrapper> stream)
{
Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();
- Ptr<Ipv4RoutingProtocol> rp = ipv4->GetRoutingProtocol ();
- NS_ASSERT (rp);
- rp->PrintRoutingTable (stream);
+ if (ipv4)
+
{
+
Ptr<Ipv4RoutingProtocol> rp = ipv4->GetRoutingProtocol ();
+
NS_ASSERT (rp);
+
rp->PrintRoutingTable (stream);
+
}
}
void
Ipv4RoutingHelper::PrintEvery (Time printInterval, Ptr<Node> node, Ptr<OutputSt
reamWrapper> stream)
{
Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();
- Ptr<Ipv4RoutingProtocol> rp = ipv4->GetRoutingProtocol ();
- NS_ASSERT (rp);
- rp->PrintRoutingTable (stream);
- Simulator::Schedule (printInterval, &Ipv4RoutingHelper::PrintEvery, printInte
rval, node, stream);
+ if (ipv4)
+
{
+
Ptr<Ipv4RoutingProtocol> rp = ipv4->GetRoutingProtocol ();
+
NS_ASSERT (rp);
+
rp->PrintRoutingTable (stream);
+
Simulator::Schedule (printInterval, &Ipv4RoutingHelper::PrintEvery, print
Interval, node, stream);
+
}
}
void
@@ -121,27 +127,30 @@
void
Ipv4RoutingHelper::PrintArpCache (Ptr<Node> node, Ptr<OutputStreamWrapper> stre
am)
{
- std::ostream* os = stream->GetStream ();
- *os << "ARP Cache of node ";
- std::string found = Names::FindName (node);
- if (Names::FindName (node) != "")

{
*os << found;
}
- else
{
*os << static_cast<int> (node->GetId ());
}
- *os << " at time " << Simulator::Now ().GetSeconds () << "\n";
Ptr<Ipv4L3Protocol> ipv4 = node->GetObject<Ipv4L3Protocol> ();
- for (uint32_t i=0; i<ipv4->GetNInterfaces(); i++)
+ if (ipv4)
{
Ptr<ArpCache> arpCache = ipv4->GetInterface (i)->GetArpCache ();
if (arpCache)
+
std::ostream* os = stream->GetStream ();
+
+
*os << "ARP Cache of node ";
+
std::string found = Names::FindName (node);
+
if (Names::FindName (node) != "")
+
{
+
*os << found;
+
}
+
else
+
{
+
*os << static_cast<int> (node->GetId ());
+
}
+
*os << " at time " << Simulator::Now ().GetSeconds () << "\n";
+
+
for (uint32_t i=0; i<ipv4->GetNInterfaces(); i++)
{
arpCache->PrintArpCache (stream);
+
Ptr<ArpCache> arpCache = ipv4->GetInterface (i)->GetArpCache ();
+
if (arpCache)
+
{
+
arpCache->PrintArpCache (stream);
+
}
}
}
}
@@ -149,30 +158,33 @@
void
Ipv4RoutingHelper::PrintArpCacheEvery (Time printInterval, Ptr<Node> node, Ptr<
OutputStreamWrapper> stream)
{
- std::ostream* os = stream->GetStream ();
- *os << "ARP Cache of node ";
- std::string found = Names::FindName (node);
- if (Names::FindName (node) != "")
{
*os << found;
}
- else
{
*os << static_cast<int> (node->GetId ());
}
- *os << " at time " << Simulator::Now ().GetSeconds () << "\n";
Ptr<Ipv4L3Protocol> ipv4 = node->GetObject<Ipv4L3Protocol> ();

- for (uint32_t i=0; i<ipv4->GetNInterfaces(); i++)


+ if (ipv4)
{
Ptr<ArpCache> arpCache = ipv4->GetInterface (i)->GetArpCache ();
if (arpCache)
+
std::ostream* os = stream->GetStream ();
+
+
*os << "ARP Cache of node ";
+
std::string found = Names::FindName (node);
+
if (Names::FindName (node) != "")
{
arpCache->PrintArpCache (stream);
+
*os << found;
}
+
else
+
{
+
*os << static_cast<int> (node->GetId ());
+
}
+
*os << " at time " << Simulator::Now ().GetSeconds () << "\n";
+
+
for (uint32_t i=0; i<ipv4->GetNInterfaces(); i++)
+
{
+
Ptr<ArpCache> arpCache = ipv4->GetInterface (i)->GetArpCache ();
+
if (arpCache)
+
{
+
arpCache->PrintArpCache (stream);
+
}
+
}
+
Simulator::Schedule (printInterval, &Ipv4RoutingHelper::PrintArpCacheEver
y, printInterval, node, stream);
}
- Simulator::Schedule (printInterval, &Ipv4RoutingHelper::PrintArpCacheEvery, p
rintInterval, node, stream);
}
} // namespace ns3
diff -Naur ns-3.22/src/internet/helper/ipv6-routing-helper.cc ns-3.23/src/intern
et/helper/ipv6-routing-helper.cc
--- ns-3.22/src/internet/helper/ipv6-routing-helper.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/helper/ipv6-routing-helper.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -71,19 +71,25 @@
Ipv6RoutingHelper::Print (Ptr<Node> node, Ptr<OutputStreamWrapper> stream)
{
Ptr<Ipv6> ipv6 = node->GetObject<Ipv6> ();
- Ptr<Ipv6RoutingProtocol> rp = ipv6->GetRoutingProtocol ();
- NS_ASSERT (rp);
- rp->PrintRoutingTable (stream);
+ if (ipv6)
+
{
+
Ptr<Ipv6RoutingProtocol> rp = ipv6->GetRoutingProtocol ();
+
NS_ASSERT (rp);
+
rp->PrintRoutingTable (stream);
+
}
}
void
Ipv6RoutingHelper::PrintEvery (Time printInterval, Ptr<Node> node, Ptr<OutputSt
reamWrapper> stream)

Ptr<Ipv6> ipv6 = node->GetObject<Ipv6> ();


- Ptr<Ipv6RoutingProtocol> rp = ipv6->GetRoutingProtocol ();
- NS_ASSERT (rp);
- rp->PrintRoutingTable (stream);
- Simulator::Schedule (printInterval, &Ipv6RoutingHelper::PrintEvery, printInte
rval, node, stream);
+ if (ipv6)
+
{
+
Ptr<Ipv6RoutingProtocol> rp = ipv6->GetRoutingProtocol ();
+
NS_ASSERT (rp);
+
rp->PrintRoutingTable (stream);
+
Simulator::Schedule (printInterval, &Ipv6RoutingHelper::PrintEvery, print
Interval, node, stream);
+
}
}
void
@@ -121,27 +127,30 @@
void
Ipv6RoutingHelper::PrintNdiscCache (Ptr<Node> node, Ptr<OutputStreamWrapper> st
ream)
{
- std::ostream* os = stream->GetStream ();
- *os << "NDISC Cache of node ";
- std::string found = Names::FindName (node);
- if (Names::FindName (node) != "")
{
*os << found;
}
- else
{
*os << static_cast<int> (node->GetId ());
}
- *os << " at time " << Simulator::Now ().GetSeconds () << "\n";
Ptr<Ipv6L3Protocol> ipv6 = node->GetObject<Ipv6L3Protocol> ();
- for (uint32_t i=0; i<ipv6->GetNInterfaces(); i++)
+ if (ipv6)
{
Ptr<NdiscCache> ndiscCache = ipv6->GetInterface (i)->GetNdiscCache ();
if (ndiscCache)
+
std::ostream* os = stream->GetStream ();
+
+
*os << "NDISC Cache of node ";
+
std::string found = Names::FindName (node);
+
if (Names::FindName (node) != "")
+
{
+
*os << found;
+
}
+
else
+
{
+
*os << static_cast<int> (node->GetId ());
+
}
+
*os << " at time " << Simulator::Now ().GetSeconds () << "\n";
+
+
for (uint32_t i=0; i<ipv6->GetNInterfaces(); i++)
{
ndiscCache->PrintNdiscCache (stream);

+
;
+
+
+
+

Ptr<NdiscCache> ndiscCache = ipv6->GetInterface (i)->GetNdiscCache ()

if (ndiscCache)
{
ndiscCache->PrintNdiscCache (stream);
}

}
@@ -149,30 +158,33 @@
void
Ipv6RoutingHelper::PrintNdiscCacheEvery (Time printInterval, Ptr<Node> node, Pt
r<OutputStreamWrapper> stream)
{
- std::ostream* os = stream->GetStream ();
- *os << "NDISC Cache of node ";
- std::string found = Names::FindName (node);
- if (Names::FindName (node) != "")
{
*os << found;
}
- else
{
*os << static_cast<int> (node->GetId ());
}
- *os << " at time " << Simulator::Now ().GetSeconds () << "\n";
Ptr<Ipv6L3Protocol> ipv6 = node->GetObject<Ipv6L3Protocol> ();
- for (uint32_t i=0; i<ipv6->GetNInterfaces(); i++)
+ if (ipv6)
{
Ptr<NdiscCache> ndiscCache = ipv6->GetInterface (i)->GetNdiscCache ();
if (ndiscCache)
+
std::ostream* os = stream->GetStream ();
+
+
*os << "NDISC Cache of node ";
+
std::string found = Names::FindName (node);
+
if (Names::FindName (node) != "")
{
ndiscCache->PrintNdiscCache (stream);
+
*os << found;
}
+
else
+
{
+
*os << static_cast<int> (node->GetId ());
+
}
+
*os << " at time " << Simulator::Now ().GetSeconds () << "\n";
+
+
for (uint32_t i=0; i<ipv6->GetNInterfaces(); i++)
+
{
+
Ptr<NdiscCache> ndiscCache = ipv6->GetInterface (i)->GetNdiscCache ()
;
+
if (ndiscCache)
+
{
+
ndiscCache->PrintNdiscCache (stream);
+
}
+
}
+
Simulator::Schedule (printInterval, &Ipv6RoutingHelper::PrintNdiscCacheEv
ery, printInterval, node, stream);

}
- Simulator::Schedule (printInterval, &Ipv6RoutingHelper::PrintNdiscCacheEvery,
printInterval, node, stream);
}
} // namespace ns3
diff -Naur ns-3.22/src/internet/model/arp-cache.cc ns-3.23/src/internet/model/ar
p-cache.cc
--- ns-3.22/src/internet/model/arp-cache.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/arp-cache.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -41,6 +41,7 @@
{
static TypeId tid = TypeId ("ns3::ArpCache")
.SetParent<Object> ()
+
.SetGroupName ("Internet")
.AddAttribute ("AliveTimeout",
"When this timeout expires, "
"the matching cache entry needs refreshing",
diff -Naur ns-3.22/src/internet/model/arp-header.cc ns-3.23/src/internet/model/a
rp-header.cc
--- ns-3.22/src/internet/model/arp-header.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/arp-header.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -98,6 +98,7 @@
{
static TypeId tid = TypeId ("ns3::ArpHeader")
.SetParent<Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<ArpHeader> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/arp-l3-protocol.cc ns-3.23/src/internet/mo
del/arp-l3-protocol.cc
--- ns-3.22/src/internet/model/arp-l3-protocol.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/arp-l3-protocol.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -46,6 +46,7 @@
static TypeId tid = TypeId ("ns3::ArpL3Protocol")
.SetParent<Object> ()
.AddConstructor<ArpL3Protocol> ()
+
.SetGroupName ("Internet")
.AddAttribute ("CacheList",
"The list of ARP caches",
ObjectVectorValue (),
diff -Naur ns-3.22/src/internet/model/codel-queue.cc ns-3.23/src/internet/model/
codel-queue.cc
--- ns-3.22/src/internet/model/codel-queue.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/codel-queue.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -148,6 +148,7 @@
{
static TypeId tid = TypeId ("ns3::CoDelQueue")
.SetParent<Queue> ()
+
.SetGroupName ("Internet")
.AddConstructor<CoDelQueue> ()

.AddAttribute ("Mode",
"Whether to use Bytes (see MaxBytes) or Packets (see MaxPack
ets) as the maximum queue size metric.",
@@ -399,6 +400,12 @@
// hence the while loop.
NS_LOG_LOGIC ("Sojourn time is still above target and it's time f
or next drop; dropping " << p);
Drop (p);
+
+
// p was in queue, trace dequeue and update stats manually
+
m_traceDequeue (p);
+
m_nBytes -= p->GetSize ();
+
m_nPackets--;
+
++m_dropCount;
++m_count;
NewtonStep ();
@@ -444,6 +451,12 @@
NS_LOG_LOGIC ("Sojourn time goes above target, dropping the first pac
ket " << p << " and entering the dropping state");
++m_dropCount;
Drop (p);
+
+
// p was in queue, trace the dequeue and update stats manually
+
m_traceDequeue (p);
+
m_nBytes -= p->GetSize ();
+
m_nPackets--;
+
if (m_packets.empty ())
{
m_dropping = false;
diff -Naur ns-3.22/src/internet/model/global-router-interface.cc ns-3.23/src/int
ernet/model/global-router-interface.cc
--- ns-3.22/src/internet/model/global-router-interface.cc
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/internet/model/global-router-interface.cc
2015-05-13 11:05
:27.000000000 -0700
@@ -510,7 +510,8 @@
GlobalRouter::GetTypeId (void)
{
static TypeId tid = TypeId ("ns3::GlobalRouter")
.SetParent<Object> ();
+
.SetParent<Object> ()
+
.SetGroupName ("Internet");
return tid;
}
diff -Naur ns-3.22/src/internet/model/icmpv4.cc ns-3.23/src/internet/model/icmpv
4.cc
--- ns-3.22/src/internet/model/icmpv4.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/icmpv4.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -37,6 +37,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv4Header")
.SetParent<Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv4Header> ()
;

return tid;
@@ -198,6 +199,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv4Echo")
.SetParent<Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv4Echo> ()
;
return tid;
@@ -277,6 +279,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv4DestinationUnreachable")
.SetParent<Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv4DestinationUnreachable> ()
;
return tid;
@@ -400,6 +403,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv4TimeExceeded")
.SetParent<Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv4TimeExceeded> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/icmpv4-l4-protocol.cc ns-3.23/src/internet
/model/icmpv4-l4-protocol.cc
--- ns-3.22/src/internet/model/icmpv4-l4-protocol.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/icmpv4-l4-protocol.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -23,6 +23,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv4L4Protocol")
.SetParent<IpL4Protocol> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv4L4Protocol> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/icmpv6-header.cc ns-3.23/src/internet/mode
l/icmpv6-header.cc
--- ns-3.22/src/internet/model/icmpv6-header.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/icmpv6-header.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -37,6 +37,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv6Header")
.SetParent<Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv6Header> ()
;
return tid;
@@ -187,6 +188,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv6NS")
.SetParent<Icmpv6Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv6NS> ()
;

return tid;
@@ -300,6 +302,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv6NA")
.SetParent<Icmpv6Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv6NA> ()
;
return tid;
@@ -483,6 +486,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv6RA")
.SetParent<Icmpv6Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv6RA> ()
;
return tid;
@@ -702,6 +706,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv6RS")
.SetParent<Icmpv6Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv6RS> ()
;
return tid;
@@ -792,6 +797,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv6Redirection")
.SetParent<Icmpv6Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv6Redirection> ()
;
return tid;
@@ -922,6 +928,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv6Echo")
.SetParent<Icmpv6Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv6Echo> ()
;
return tid;
@@ -1039,6 +1046,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv6DestinationUnreachable")
.SetParent<Icmpv6Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv6DestinationUnreachable> ()
;
return tid;
@@ -1136,6 +1144,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv6TooBig")
.SetParent<Icmpv6Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv6TooBig> ()
;
return tid;
@@ -1246,6 +1255,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv6TimeExceeded")

.SetParent<Icmpv6Header> ()
.SetGroupName ("Internet")
.AddConstructor<Icmpv6TimeExceeded> ()

;
return tid;
@@ -1345,6 +1355,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv6ParameterError")
.SetParent<Icmpv6Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv6ParameterError> ()
;
return tid;
@@ -1455,6 +1466,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv6OptionHeader")
.SetParent<Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv6OptionHeader> ()
;
return tid;
@@ -1533,6 +1545,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv6OptionMtu")
.SetParent<Icmpv6OptionHeader> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv6OptionMtu> ()
;
return tid;
@@ -1629,6 +1642,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv6OptionPrefixInformation")
.SetParent<Icmpv6OptionHeader> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv6OptionPrefixInformation> ()
;
return tid;
@@ -1802,6 +1816,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv6OptionLinkLayerAddress")
.SetParent<Icmpv6OptionHeader> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv6OptionLinkLayerAddress> ()
;
return tid;
@@ -1910,6 +1925,7 @@
{
static TypeId tid = TypeId ("ns3::Icmpv6OptionRedirected")
.SetParent<Icmpv6OptionHeader> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv6OptionRedirected> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/icmpv6-l4-protocol.cc ns-3.23/src/internet
/model/icmpv6-l4-protocol.cc
--- ns-3.22/src/internet/model/icmpv6-l4-protocol.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/icmpv6-l4-protocol.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -69,6 +69,7 @@

static TypeId tid = TypeId ("ns3::Icmpv6L4Protocol")


.SetParent<IpL4Protocol> ()
+
.SetGroupName ("Internet")
.AddConstructor<Icmpv6L4Protocol> ()
.AddAttribute ("DAD", "Always do DAD check.",
BooleanValue (true),
@@ -379,10 +380,9 @@
std::list<Ptr<Packet> > waiting;
if (entry->IsIncomplete ())
{
entry->StopRetransmitTimer ();
+
entry->StopNudTimer ();
// mark it to reachable
waiting = entry->MarkReachable (lla.GetAddress ());
entry->StopReachableTimer ();
entry->StartReachableTimer ();
// send out waiting packet
for (std::list<Ptr<Packet> >::const_iterator it = waiting.begin (); i
t != waiting.end (); it++)
@@ -403,8 +403,7 @@
{
if (!entry->IsReachable ())
{
entry->StopProbeTimer ();
entry->StopDelayTimer ();
+
entry->StopNudTimer ();
waiting = entry->MarkReachable (lla.GetAddress ());
if (entry->IsProbe ())
{
@@ -413,7 +412,6 @@
cache->GetInterface ()->Send (*it, src);
}
}
entry->StopReachableTimer ();
entry->StartReachableTimer ();
}
}
@@ -664,13 +662,12 @@
if (entry->IsIncomplete ())
{
/* we receive a NA so stop the retransmission timer */
entry->StopRetransmitTimer ();
+
entry->StopNudTimer ();
if (naHeader.GetFlagS ())
{
/* mark it to reachable */
waiting = entry->MarkReachable (lla.GetAddress ());
entry->StopReachableTimer ();
entry->StartReachableTimer ();
/* send out waiting packet */
for (std::list<Ptr<Packet> >::const_iterator it = waiting.begin (); i
t != waiting.end (); it++)
@@ -692,8 +689,7 @@
else
{
/* we receive a NA so stop the probe timer or delay timer if any */
entry->StopProbeTimer ();
entry->StopDelayTimer ();

entry->StopNudTimer ();
/* if the Flag O is clear and mac address differs from the cache */
if (!naHeader.GetFlagO () && lla.GetAddress () != entry->GetMacAddress ()

)
@@ -728,7 +724,6 @@

entry->MarkReachable (lla.GetAddress ());

}
entry->StopReachableTimer ();
entry->StartReachableTimer ();

}
else if (lla.GetAddress () != entry->GetMacAddress ())
@@ -823,7 +818,7 @@
Ptr<Packet> origPkt = unreach.GetPacket ();
Ipv6Header ipHeader;
- if ( origPkt->GetSerializedSize () > ipHeader.GetSerializedSize () )
+ if ( origPkt->GetSize () > ipHeader.GetSerializedSize () )
{
origPkt->RemoveHeader (ipHeader);
uint8_t payload[8];
diff -Naur ns-3.22/src/internet/model/ip-l4-protocol.cc ns-3.23/src/internet/mod
el/ip-l4-protocol.cc
--- ns-3.22/src/internet/model/ip-l4-protocol.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ip-l4-protocol.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -36,7 +36,8 @@
{
static TypeId tid = TypeId ("ns3::IpL4Protocol")
.SetParent<Object> ()
.AddAttribute ("ProtocolNumber", "The Ip protocol number.",
+
.SetGroupName ("Internet")
+
.AddAttribute ("ProtocolNumber", "The IP protocol number.",
UintegerValue (0),
MakeUintegerAccessor (&IpL4Protocol::GetProtocolNumber),
MakeUintegerChecker<int> ())
diff -Naur ns-3.22/src/internet/model/ipv4.cc ns-3.23/src/internet/model/ipv4.cc
--- ns-3.22/src/internet/model/ipv4.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv4.cc 2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv4")
.SetParent<Object> ()
+
.SetGroupName ("Internet")
.AddAttribute ("IpForward", "Globally enable or disable IP forwarding for a
ll current and future Ipv4 devices.",
BooleanValue (true),
MakeBooleanAccessor (&Ipv4::SetIpForward,
diff -Naur ns-3.22/src/internet/model/ipv4-global-routing.cc ns-3.23/src/interne
t/model/ipv4-global-routing.cc
--- ns-3.22/src/internet/model/ipv4-global-routing.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv4-global-routing.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -41,6 +41,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv4GlobalRouting")
.SetParent<Object> ()

.SetGroupName ("Internet")
.AddAttribute ("RandomEcmpRouting",
"Set to true if packets are randomly routed among ECMP; set
to false for using only one route consistently",
BooleanValue (false),
diff -Naur ns-3.22/src/internet/model/ipv4-header.cc ns-3.23/src/internet/model/
ipv4-header.cc
--- ns-3.22/src/internet/model/ipv4-header.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/ipv4-header.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -320,6 +320,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv4Header")
.SetParent<Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv4Header> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/ipv4-l3-protocol.cc ns-3.23/src/internet/m
odel/ipv4-l3-protocol.cc
--- ns-3.22/src/internet/model/ipv4-l3-protocol.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv4-l3-protocol.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -53,6 +53,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv4L3Protocol")
.SetParent<Ipv4> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv4L3Protocol> ()
.AddAttribute ("DefaultTos",
"The TOS value set by default on "
diff -Naur ns-3.22/src/internet/model/ipv4-list-routing.cc ns-3.23/src/internet/
model/ipv4-list-routing.cc
--- ns-3.22/src/internet/model/ipv4-list-routing.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv4-list-routing.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -35,6 +35,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv4ListRouting")
.SetParent<Ipv4RoutingProtocol> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv4ListRouting> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/ipv4-list-routing.h ns-3.23/src/internet/m
odel/ipv4-list-routing.h
--- ns-3.22/src/internet/model/ipv4-list-routing.h
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv4-list-routing.h
2015-05-13 11:05:27.0000
00000 -0700
@@ -93,8 +93,8 @@
virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const;
protected:
- void DoDispose (void);
- void DoInitialize (void);
+ virtual void DoDispose (void);

+ virtual void DoInitialize (void);


private:
/**
* \brief Container identifying an IPv4 Routing Protocol entry in the list.
diff -Naur ns-3.22/src/internet/model/ipv4-packet-info-tag.cc ns-3.23/src/intern
et/model/ipv4-packet-info-tag.cc
--- ns-3.22/src/internet/model/ipv4-packet-info-tag.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv4-packet-info-tag.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -100,6 +100,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv4PacketInfoTag")
.SetParent<Tag> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv4PacketInfoTag> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/ipv4-packet-probe.cc ns-3.23/src/internet/
model/ipv4-packet-probe.cc
--- ns-3.22/src/internet/model/ipv4-packet-probe.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv4-packet-probe.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -39,6 +39,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv4PacketProbe")
.SetParent<Probe> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv4PacketProbe> ()
.AddTraceSource ( "Output",
"The packet plus its IPv4 object and interface "
diff -Naur ns-3.22/src/internet/model/ipv4-raw-socket-factory.cc ns-3.23/src/int
ernet/model/ipv4-raw-socket-factory.cc
--- ns-3.22/src/internet/model/ipv4-raw-socket-factory.cc
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv4-raw-socket-factory.cc
2015-05-13 11:05
:27.000000000 -0700
@@ -31,6 +31,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv4RawSocketFactory")
.SetParent<SocketFactory> ()
+
.SetGroupName ("Internet")
;
return tid;
}
diff -Naur ns-3.22/src/internet/model/ipv4-raw-socket-impl.cc ns-3.23/src/intern
et/model/ipv4-raw-socket-impl.cc
--- ns-3.22/src/internet/model/ipv4-raw-socket-impl.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv4-raw-socket-impl.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -24,6 +24,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv4RawSocketImpl")
.SetParent<Socket> ()
+
.SetGroupName ("Internet")
.AddAttribute ("Protocol", "Protocol number to match.",
UintegerValue (0),
MakeUintegerAccessor (&Ipv4RawSocketImpl::m_protocol),

diff -Naur ns-3.22/src/internet/model/ipv4-routing-protocol.cc ns-3.23/src/inter


net/model/ipv4-routing-protocol.cc
--- ns-3.22/src/internet/model/ipv4-routing-protocol.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv4-routing-protocol.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -31,6 +31,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv4RoutingProtocol")
.SetParent<Object> ()
+
.SetGroupName ("Internet")
;
return tid;
}
diff -Naur ns-3.22/src/internet/model/ipv4-static-routing.cc ns-3.23/src/interne
t/model/ipv4-static-routing.cc
--- ns-3.22/src/internet/model/ipv4-static-routing.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv4-static-routing.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -47,6 +47,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv4StaticRouting")
.SetParent<Ipv4RoutingProtocol> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv4StaticRouting> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/ipv6.cc ns-3.23/src/internet/model/ipv6.cc
--- ns-3.22/src/internet/model/ipv6.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6.cc 2015-05-13 11:05:27.000000000 -0700
@@ -35,6 +35,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6")
.SetParent<Object> ()
+
.SetGroupName ("Internet")
.AddAttribute ("IpForward", "Globally enable or disable IP forwarding for a
ll current and future IPv6 devices.",
BooleanValue (false),
MakeBooleanAccessor (&Ipv6::SetIpForward,
diff -Naur ns-3.22/src/internet/model/ipv6-extension.cc ns-3.23/src/internet/mod
el/ipv6-extension.cc
--- ns-3.22/src/internet/model/ipv6-extension.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv6-extension.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -50,6 +50,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6Extension")
.SetParent<Object> ()
+
.SetGroupName ("Internet")
.AddAttribute ("ExtensionNumber", "The IPv6 extension number.",
UintegerValue (0),
MakeUintegerAccessor (&Ipv6Extension::GetExtensionNumber),
@@ -192,6 +193,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6ExtensionHopByHop")
.SetParent<Ipv6Extension> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6ExtensionHopByHop> ()

;
return tid;
@@ -251,6 +253,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6ExtensionDestination")
.SetParent<Ipv6Extension> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6ExtensionDestination> ()
;
return tid;
@@ -310,6 +313,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6ExtensionFragment")
.SetParent<Ipv6Extension> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6ExtensionFragment> ()
;
return tid;
@@ -735,6 +739,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6ExtensionRouting")
.SetParent<Ipv6Extension> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6ExtensionRouting> ()
;
return tid;
@@ -828,6 +833,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6ExtensionRoutingDemux")
.SetParent<Object> ()
+
.SetGroupName ("Internet")
.AddAttribute ("Routing Extensions", "The set of IPv6 Routing extensions re
gistered with this demux.",
ObjectVectorValue (),
MakeObjectVectorAccessor (&Ipv6ExtensionRoutingDemux::m_exte
nsionsRouting),
@@ -890,6 +896,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6ExtensionLooseRouting")
.SetParent<Ipv6ExtensionRouting> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6ExtensionLooseRouting> ()
;
return tid;
@@ -1054,6 +1061,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6ExtensionESP")
.SetParent<Ipv6Extension> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6ExtensionESP> ()
;
return tid;
@@ -1099,6 +1107,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6ExtensionAH")
.SetParent<Ipv6Extension> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6ExtensionAH> ()
;
return tid;

diff -Naur ns-3.22/src/internet/model/ipv6-extension-demux.cc ns-3.23/src/intern


et/model/ipv6-extension-demux.cc
--- ns-3.22/src/internet/model/ipv6-extension-demux.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv6-extension-demux.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -34,6 +34,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6ExtensionDemux")
.SetParent<Object> ()
+
.SetGroupName ("Internet")
.AddAttribute ("Extensions", "The set of IPv6 extensions registered with th
is demux.",
ObjectVectorValue (),
MakeObjectVectorAccessor (&Ipv6ExtensionDemux::m_extensions)
,
diff -Naur ns-3.22/src/internet/model/ipv6-extension-header.cc ns-3.23/src/inter
net/model/ipv6-extension-header.cc
--- ns-3.22/src/internet/model/ipv6-extension-header.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv6-extension-header.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -35,6 +35,7 @@
static TypeId tid = TypeId ("ns3::Ipv6ExtensionHeader")
.AddConstructor<Ipv6ExtensionHeader> ()
.SetParent<Header> ()
+
.SetGroupName ("Internet")
;
return tid;
}
@@ -206,6 +207,7 @@
static TypeId tid = TypeId ("ns3::Ipv6ExtensionHopByHopHeader")
.AddConstructor<Ipv6ExtensionHopByHopHeader> ()
.SetParent<Ipv6ExtensionHeader> ()
+
.SetGroupName ("Internet")
;
return tid;
}
@@ -261,6 +263,7 @@
static TypeId tid = TypeId ("ns3::Ipv6ExtensionDestinationHeader")
.AddConstructor<Ipv6ExtensionDestinationHeader> ()
.SetParent<Ipv6ExtensionHeader> ()
+
.SetGroupName ("Internet")
;
return tid;
}
@@ -316,6 +319,7 @@
static TypeId tid = TypeId ("ns3::Ipv6ExtensionFragmentHeader")
.AddConstructor<Ipv6ExtensionFragmentHeader> ()
.SetParent<Ipv6ExtensionHeader> ()
+
.SetGroupName ("Internet")
;
return tid;
}
@@ -409,6 +413,7 @@
static TypeId tid = TypeId ("ns3::Ipv6ExtensionRoutingHeader")
.AddConstructor<Ipv6ExtensionRoutingHeader> ()
.SetParent<Ipv6ExtensionHeader> ()
+
.SetGroupName ("Internet")
;

return tid;
}
@@ -488,6 +493,7 @@
static TypeId tid = TypeId ("ns3::Ipv6ExtensionLooseRoutingHeader")
.AddConstructor<Ipv6ExtensionLooseRoutingHeader> ()
.SetParent<Ipv6ExtensionRoutingHeader> ()
+
.SetGroupName ("Internet")
;
return tid;
}
@@ -595,6 +601,7 @@
static TypeId tid = TypeId ("ns3::Ipv6ExtensionESPHeader")
.AddConstructor<Ipv6ExtensionESPHeader> ()
.SetParent<Ipv6ExtensionHeader> ()
+
.SetGroupName ("Internet")
;
return tid;
}
@@ -641,6 +648,7 @@
static TypeId tid = TypeId ("ns3::Ipv6ExtensionAHHeader")
.AddConstructor<Ipv6ExtensionAHHeader> ()
.SetParent<Ipv6ExtensionHeader> ()
+
.SetGroupName ("Internet")
;
return tid;
}
diff -Naur ns-3.22/src/internet/model/ipv6-header.cc ns-3.23/src/internet/model/
ipv6-header.cc
--- ns-3.22/src/internet/model/ipv6-header.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/ipv6-header.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -117,6 +117,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6Header")
.SetParent<Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6Header> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/ipv6-interface.cc ns-3.23/src/internet/mod
el/ipv6-interface.cc
--- ns-3.22/src/internet/model/ipv6-interface.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv6-interface.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -42,6 +42,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6Interface")
.SetParent<Object> ()
+
.SetGroupName ("Internet")
;
return tid;
}
diff -Naur ns-3.22/src/internet/model/ipv6-l3-protocol.cc ns-3.23/src/internet/m
odel/ipv6-l3-protocol.cc
--- ns-3.22/src/internet/model/ipv6-l3-protocol.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv6-l3-protocol.cc
2015-05-13 11:05:27.0000
00000 -0700

@@ -59,6 +59,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6L3Protocol")
.SetParent<Ipv6> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6L3Protocol> ()
.AddAttribute ("DefaultTtl",
"The TTL value set by default on all "
diff -Naur ns-3.22/src/internet/model/ipv6-list-routing.cc ns-3.23/src/internet/
model/ipv6-list-routing.cc
--- ns-3.22/src/internet/model/ipv6-list-routing.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv6-list-routing.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -36,6 +36,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6ListRouting")
.SetParent<Ipv6RoutingProtocol> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6ListRouting> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/ipv6-option.cc ns-3.23/src/internet/model/
ipv6-option.cc
--- ns-3.22/src/internet/model/ipv6-option.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/ipv6-option.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -35,6 +35,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6Option")
.SetParent<Object> ()
+
.SetGroupName ("Internet")
.AddAttribute ("OptionNumber", "The IPv6 option number.",
UintegerValue (0),
MakeUintegerAccessor (&Ipv6Option::GetOptionNumber),
@@ -61,6 +62,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6OptionPad1")
.SetParent<Ipv6Option> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6OptionPad1> ()
;
return tid;
@@ -105,6 +107,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6OptionPadn")
.SetParent<Ipv6Option> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6OptionPadn> ()
;
return tid;
@@ -149,6 +152,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6OptionJumbogram")
.SetParent<Ipv6Option> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6OptionJumbogram> ()
;
return tid;

@@ -193,6 +197,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6OptionRouterAlert")
.SetParent<Ipv6Option> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6OptionRouterAlert> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/ipv6-option-demux.cc ns-3.23/src/internet/
model/ipv6-option-demux.cc
--- ns-3.22/src/internet/model/ipv6-option-demux.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv6-option-demux.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -34,6 +34,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6OptionDemux")
.SetParent<Object> ()
+
.SetGroupName ("Internet")
.AddAttribute ("Options", "The set of IPv6 options registered with this dem
ux.",
ObjectVectorValue (),
MakeObjectVectorAccessor (&Ipv6OptionDemux::m_options),
diff -Naur ns-3.22/src/internet/model/ipv6-option-header.cc ns-3.23/src/internet
/model/ipv6-option-header.cc
--- ns-3.22/src/internet/model/ipv6-option-header.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv6-option-header.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -35,6 +35,7 @@
static TypeId tid = TypeId ("ns3::Ipv6OptionHeader")
.AddConstructor<Ipv6OptionHeader> ()
.SetParent<Header> ()
+
.SetGroupName ("Internet")
;
return tid;
}
@@ -123,6 +124,7 @@
static TypeId tid = TypeId ("ns3::Ipv6OptionPad1Header")
.AddConstructor<Ipv6OptionPad1Header> ()
.SetParent<Ipv6OptionHeader> ()
+
.SetGroupName ("Internet")
;
return tid;
}
@@ -174,6 +176,7 @@
static TypeId tid = TypeId ("ns3::Ipv6OptionPadnHeader")
.AddConstructor<Ipv6OptionPadnHeader> ()
.SetParent<Ipv6OptionHeader> ()
+
.SetGroupName ("Internet")
;
return tid;
}
@@ -234,6 +237,7 @@
static TypeId tid = TypeId ("ns3::Ipv6OptionJumbogramHeader")
.AddConstructor<Ipv6OptionJumbogramHeader> ()
.SetParent<Ipv6OptionHeader> ()
+
.SetGroupName ("Internet")
;
return tid;

}
@@ -247,6 +251,7 @@
{
SetType (0xC2);
SetLength (4);
+ m_dataLength = 0;
}
Ipv6OptionJumbogramHeader::~Ipv6OptionJumbogramHeader ()
@@ -305,6 +310,7 @@
static TypeId tid = TypeId ("ns3::Ipv6OptionRouterAlertHeader")
.AddConstructor<Ipv6OptionRouterAlertHeader> ()
.SetParent<Ipv6OptionHeader> ()
+
.SetGroupName ("Internet")
;
return tid;
}
diff -Naur ns-3.22/src/internet/model/ipv6-packet-info-tag.cc ns-3.23/src/intern
et/model/ipv6-packet-info-tag.cc
--- ns-3.22/src/internet/model/ipv6-packet-info-tag.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv6-packet-info-tag.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -87,6 +87,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6PacketInfoTag")
.SetParent<Tag> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6PacketInfoTag> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/ipv6-packet-probe.cc ns-3.23/src/internet/
model/ipv6-packet-probe.cc
--- ns-3.22/src/internet/model/ipv6-packet-probe.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv6-packet-probe.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -40,6 +40,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6PacketProbe")
.SetParent<Probe> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6PacketProbe> ()
.AddTraceSource ( "Output",
"The packet plus its IPv6 object and interface "
diff -Naur ns-3.22/src/internet/model/ipv6-pmtu-cache.cc ns-3.23/src/internet/mo
del/ipv6-pmtu-cache.cc
--- ns-3.22/src/internet/model/ipv6-pmtu-cache.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv6-pmtu-cache.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -32,6 +32,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6PmtuCache")
.SetParent<Object> ()
+
.SetGroupName ("Internet")
.AddAttribute ("CacheExpiryTime",
"Validity time for a Path MTU entry. Default is 10 minutes,
minimum is 5 minutes.",
TimeValue (Seconds (60 * 10)),

diff -Naur ns-3.22/src/internet/model/ipv6-raw-socket-factory.cc ns-3.23/src/int


ernet/model/ipv6-raw-socket-factory.cc
--- ns-3.22/src/internet/model/ipv6-raw-socket-factory.cc
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/internet/model/ipv6-raw-socket-factory.cc
2015-05-13 11:05
:27.000000000 -0700
@@ -30,6 +30,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6RawSocketFactory")
.SetParent<SocketFactory> ()
+
.SetGroupName ("Internet")
;
return tid;
}
diff -Naur ns-3.22/src/internet/model/ipv6-raw-socket-impl.cc ns-3.23/src/intern
et/model/ipv6-raw-socket-impl.cc
--- ns-3.22/src/internet/model/ipv6-raw-socket-impl.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv6-raw-socket-impl.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -46,6 +46,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6RawSocketImpl")
.SetParent<Socket> ()
+
.SetGroupName ("Internet")
.AddAttribute ("Protocol", "Protocol number to match.",
UintegerValue (0),
MakeUintegerAccessor (&Ipv6RawSocketImpl::m_protocol),
diff -Naur ns-3.22/src/internet/model/ipv6-routing-protocol.cc ns-3.23/src/inter
net/model/ipv6-routing-protocol.cc
--- ns-3.22/src/internet/model/ipv6-routing-protocol.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv6-routing-protocol.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -32,6 +32,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6RoutingProtocol")
.SetParent<Object> ()
+
.SetGroupName ("Internet")
;
return tid;
}
diff -Naur ns-3.22/src/internet/model/ipv6-static-routing.cc ns-3.23/src/interne
t/model/ipv6-static-routing.cc
--- ns-3.22/src/internet/model/ipv6-static-routing.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/ipv6-static-routing.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -40,6 +40,7 @@
{
static TypeId tid = TypeId ("ns3::Ipv6StaticRouting")
.SetParent<Ipv6RoutingProtocol> ()
+
.SetGroupName ("Internet")
.AddConstructor<Ipv6StaticRouting> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/loopback-net-device.cc ns-3.23/src/interne
t/model/loopback-net-device.cc
--- ns-3.22/src/internet/model/loopback-net-device.cc 2015-02-05 15:46:22.0000
00000 -0800

+++ ns-3.23/src/internet/model/loopback-net-device.cc 2015-05-13 11:05:27.0000


00000 -0700
@@ -35,6 +35,7 @@
{
static TypeId tid = TypeId ("ns3::LoopbackNetDevice")
.SetParent<NetDevice> ()
+
.SetGroupName ("Internet")
.AddConstructor<LoopbackNetDevice> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/ndisc-cache.cc ns-3.23/src/internet/model/
ndisc-cache.cc
--- ns-3.22/src/internet/model/ndisc-cache.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/ndisc-cache.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -39,6 +39,7 @@
{
static TypeId tid = TypeId ("ns3::NdiscCache")
.SetParent<Object> ()
+
.SetGroupName ("Internet")
.AddAttribute ("UnresolvedQueueSize",
"Size of the queue for packets pending an NA reply.",
UintegerValue (DEFAULT_UNRES_QLEN),
@@ -197,10 +198,7 @@
: m_ndCache (nd),
m_waiting (),
m_router (false),
m_reachableTimer (Timer::CANCEL_ON_DESTROY),
m_retransTimer (Timer::CANCEL_ON_DESTROY),
m_probeTimer (Timer::CANCEL_ON_DESTROY),
m_delayTimer (Timer::CANCEL_ON_DESTROY),
+
m_nudTimer (Timer::CANCEL_ON_DESTROY),
m_lastReachabilityConfirmation (Seconds (0.0)),
m_nsRetransmit (0)
{
@@ -268,9 +266,9 @@
}
}
- if (GetNSRetransmit () < icmpv6->MAX_MULTICAST_SOLICIT)
+ if (m_nsRetransmit < icmpv6->MAX_MULTICAST_SOLICIT)
{
IncNSRetransmit ();
+
m_nsRetransmit++;
icmpv6->SendNS (addr, Ipv6Address::MakeSolicitedAddress (m_ipv6Address),
m_ipv6Address, m_ndCache->GetDevice ()->GetAddress ());
/* arm the timer again */
@@ -323,8 +321,7 @@
Ptr<Packet> p = icmpv6->ForgeNS (addr, m_ipv6Address, m_ipv6Address, m_ndCach
e->GetDevice ()->GetAddress ());
m_ndCache->GetDevice ()->Send (p, this->GetMacAddress (), Ipv6L3Protocol::PRO
T_NUMBER);
- ResetNSRetransmit ();
- IncNSRetransmit ();
+ m_nsRetransmit = 1;
StartProbeTimer ();
}

@@ -334,8 +331,10 @@
Ptr<Ipv6L3Protocol> ipv6 = m_ndCache->GetDevice ()->GetNode ()->GetObject<Ipv
6L3Protocol> ();
Ptr<Icmpv6L4Protocol> icmpv6 = ipv6->GetIcmpv6 ();
- if (GetNSRetransmit () < icmpv6->MAX_UNICAST_SOLICIT)
+ if (m_nsRetransmit < icmpv6->MAX_UNICAST_SOLICIT)
{
+
m_nsRetransmit++;
+
Ipv6Address addr;
if (m_ipv6Address.IsLinkLocal ())
@@ -358,7 +357,6 @@
return;
}
-

IncNSRetransmit ();
/* icmpv6->SendNS (m_ndCache->GetInterface ()->GetLinkLocalAddress (), m_
ipv6Address, m_ipv6Address, m_ndCache->GetDevice ()->GetAddress ()); */
Ptr<Packet> p = icmpv6->ForgeNS (addr, m_ipv6Address, m_ipv6Address, m_nd
Cache->GetDevice ()->GetAddress ());
m_ndCache->GetDevice ()->Send (p, this->GetMacAddress (), Ipv6L3Protocol:
:PROT_NUMBER);
@@ -379,24 +377,6 @@
m_ipv6Address = ipv6Address;
}
-uint8_t NdiscCache::Entry::GetNSRetransmit () const
-{
- NS_LOG_FUNCTION_NOARGS ();
- return m_nsRetransmit;
-}
-void NdiscCache::Entry::IncNSRetransmit ()
-{
- NS_LOG_FUNCTION_NOARGS ();
- m_nsRetransmit++;
-}
-void NdiscCache::Entry::ResetNSRetransmit ()
-{
- NS_LOG_FUNCTION_NOARGS ();
- m_nsRetransmit = 0;
-}
Time NdiscCache::Entry::GetLastReachabilityConfirmation () const
{
NS_LOG_FUNCTION_NOARGS ();
@@ -411,77 +391,57 @@
void NdiscCache::Entry::StartReachableTimer ()
{
NS_LOG_FUNCTION_NOARGS ();
- if (m_reachableTimer.IsRunning ())
+ if (m_nudTimer.IsRunning ())
{
m_reachableTimer.Cancel ();
+
m_nudTimer.Cancel ();
}

- m_reachableTimer.SetFunction (&NdiscCache::Entry::FunctionReachableTimeout, t
his);
- m_reachableTimer.SetDelay (MilliSeconds (Icmpv6L4Protocol::REACHABLE_TIME));
- m_reachableTimer.Schedule ();
-}
-void NdiscCache::Entry::StopReachableTimer ()
-{
- NS_LOG_FUNCTION_NOARGS ();
- m_reachableTimer.Cancel ();
+ m_nudTimer.SetFunction (&NdiscCache::Entry::FunctionReachableTimeout, this);
+ m_nudTimer.SetDelay (MilliSeconds (Icmpv6L4Protocol::REACHABLE_TIME));
+ m_nudTimer.Schedule ();
}
void NdiscCache::Entry::StartProbeTimer ()
{
NS_LOG_FUNCTION_NOARGS ();
- if (m_probeTimer.IsRunning ())
+ if (m_nudTimer.IsRunning ())
{
m_probeTimer.Cancel ();
+
m_nudTimer.Cancel ();
}
- m_probeTimer.SetFunction (&NdiscCache::Entry::FunctionProbeTimeout, this);
- m_probeTimer.SetDelay (MilliSeconds (Icmpv6L4Protocol::RETRANS_TIMER));
- m_probeTimer.Schedule ();
-}
-void NdiscCache::Entry::StopProbeTimer ()
-{
- NS_LOG_FUNCTION_NOARGS ();
- m_probeTimer.Cancel ();
- ResetNSRetransmit ();
+ m_nudTimer.SetFunction (&NdiscCache::Entry::FunctionProbeTimeout, this);
+ m_nudTimer.SetDelay (MilliSeconds (Icmpv6L4Protocol::RETRANS_TIMER));
+ m_nudTimer.Schedule ();
}
-

void NdiscCache::Entry::StartDelayTimer ()
{
NS_LOG_FUNCTION_NOARGS ();
- if (m_delayTimer.IsRunning ())
+ if (m_nudTimer.IsRunning ())
{
m_delayTimer.Cancel ();
+
m_nudTimer.Cancel ();
}
- m_delayTimer.SetFunction (&NdiscCache::Entry::FunctionDelayTimeout, this);
- m_delayTimer.SetDelay (Seconds (Icmpv6L4Protocol::DELAY_FIRST_PROBE_TIME));
- m_delayTimer.Schedule ();
-}
-void NdiscCache::Entry::StopDelayTimer ()
-{
- NS_LOG_FUNCTION_NOARGS ();
- m_delayTimer.Cancel ();
- ResetNSRetransmit ();
+ m_nudTimer.SetFunction (&NdiscCache::Entry::FunctionDelayTimeout, this);

+ m_nudTimer.SetDelay (Seconds (Icmpv6L4Protocol::DELAY_FIRST_PROBE_TIME));


+ m_nudTimer.Schedule ();
}
void NdiscCache::Entry::StartRetransmitTimer ()
{
NS_LOG_FUNCTION_NOARGS ();
- if (m_retransTimer.IsRunning ())
+ if (m_nudTimer.IsRunning ())
{
m_retransTimer.Cancel ();
+
m_nudTimer.Cancel ();
}
- m_retransTimer.SetFunction (&NdiscCache::Entry::FunctionRetransmitTimeout, th
is);
- m_retransTimer.SetDelay (MilliSeconds (Icmpv6L4Protocol::RETRANS_TIMER));
- m_retransTimer.Schedule ();
+ m_nudTimer.SetFunction (&NdiscCache::Entry::FunctionRetransmitTimeout, this);
+ m_nudTimer.SetDelay (MilliSeconds (Icmpv6L4Protocol::RETRANS_TIMER));
+ m_nudTimer.Schedule ();
}
-void NdiscCache::Entry::StopRetransmitTimer ()
+void NdiscCache::Entry::StopNudTimer ()
{
NS_LOG_FUNCTION_NOARGS ();
- m_retransTimer.Cancel ();
- ResetNSRetransmit ();
+ m_nudTimer.Cancel ();
+ m_nsRetransmit = 0;
}
void NdiscCache::Entry::MarkIncomplete (Ptr<Packet> p)
@@ -573,7 +533,7 @@
void NdiscCache::Entry::SetMacAddress (Address mac)
{
- NS_LOG_FUNCTION (this << mac);
+ NS_LOG_FUNCTION (this << mac << int(m_state));
m_macAddress = mac;
}
diff -Naur ns-3.22/src/internet/model/ndisc-cache.h ns-3.23/src/internet/model/n
disc-cache.h
--- ns-3.22/src/internet/model/ndisc-cache.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/ndisc-cache.h
2015-05-13 11:05:27.000000000 -0
700
@@ -250,22 +250,6 @@
void SetRouter (bool router);
-

/**
* \brief Get the number of NS retransmit.
* \return number of NS that have been retransmit
*/
uint8_t GetNSRetransmit () const;
/**
* \brief Increment NS retransmit.
*/

void IncNSRetransmit ();


/**
* \brief Reset NS retransmit (=0).
*/
void ResetNSRetransmit ();

/**
* \brief Get the time of last reachability confirmation.
* \return time
*/
@@ -282,39 +266,24 @@
void StartReachableTimer ();
-

+
+

/**
* \brief Stop the reachable timer.
*/
void StopReachableTimer ();
/**
* \brief Start retransmit timer.
*/
void StartRetransmitTimer ();
/**
* \brief Stop retransmit timer.
*/
void StopRetransmitTimer ();
/**
* \brief Start probe timer.
*/
void StartProbeTimer ();
/**
* \brief Stop probe timer.
*/
void StopProbeTimer ();
/**
* \brief Start delay timer.
*/
void StartDelayTimer ();
/**
* \brief Stop delay timer.
* \brief Stop NUD timer and reset the NUD retransmission counter
*/
void StopDelayTimer ();
void StopNudTimer ();

/**
* \brief Function called when reachable timer timeout.
@@ -388,24 +357,9 @@
bool m_router;
-

/**
* \brief Reachable timer (used for NUD in REACHABLE state).
*/
Timer m_reachableTimer;

+
+

/**
* \brief Retransmission timer (used for NUD in INCOMPLETE state).
*/
Timer m_retransTimer;
/**
* \brief Probe timer (used for NUD in PROBE state).
*/
Timer m_probeTimer;
/**
* \brief Delay timer (used for NUD when in DELAY state).
* \brief Timer (used for NUD).
*/
Timer m_delayTimer;
Timer m_nudTimer;

/**
* \brief Last time we see a reachability confirmation.
diff -Naur ns-3.22/src/internet/model/nsc-tcp-l4-protocol.cc ns-3.23/src/interne
t/model/nsc-tcp-l4-protocol.cc
--- ns-3.22/src/internet/model/nsc-tcp-l4-protocol.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/nsc-tcp-l4-protocol.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -126,6 +126,7 @@
{
static TypeId tid = TypeId ("ns3::NscTcpL4Protocol")
.SetParent<IpL4Protocol> ()
+
.SetGroupName ("Internet")
.AddConstructor<NscTcpL4Protocol>()
.AddAttribute ("SocketList", "The list of sockets associated to this protoc
ol.",
ObjectVectorValue (),
diff -Naur ns-3.22/src/internet/model/nsc-tcp-socket-impl.cc ns-3.23/src/interne
t/model/nsc-tcp-socket-impl.cc
--- ns-3.22/src/internet/model/nsc-tcp-socket-impl.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/nsc-tcp-socket-impl.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -54,6 +54,7 @@
{
static TypeId tid = TypeId ("ns3::NscTcpSocketImpl")
.SetParent<TcpSocket> ()
+
.SetGroupName ("Internet")
.AddTraceSource ("CongestionWindow",
"The TCP connection's congestion window",
MakeTraceSourceAccessor (&NscTcpSocketImpl::m_cWnd),
diff -Naur ns-3.22/src/internet/model/ripng.cc ns-3.23/src/internet/model/ripng.
cc
--- ns-3.22/src/internet/model/ripng.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/internet/model/ripng.cc 2015-05-13 11:05:27.000000000 -0700
@@ -57,6 +57,7 @@
{
static TypeId tid = TypeId ("ns3::RipNg")
.SetParent<Ipv6RoutingProtocol> ()
+
.SetGroupName ("Internet")
.AddConstructor<RipNg> ()
.AddAttribute ("UnsolicitedRoutingUpdate", "The time between two Unsolicite

d Routing Updates.",

TimeValue (Seconds(30)),
@@ -246,6 +247,15 @@
NS_LOG_LOGIC ("Address " << addr << " not a match");
}
}
+
+ if (header.GetDestinationAddress ().IsLinkLocal () ||
+
header.GetSourceAddress ().IsLinkLocal ())
+
{
+
NS_LOG_LOGIC ("Dropping packet not for me and with src or dst LinkLocal")
;
+
ecb (p, header, Socket::ERROR_NOROUTETOHOST);
+
return false;
+
}
+
// Check if input device supports IP forwarding
if (m_ipv6->IsForwarding (iif) == false)
{
@@ -259,13 +269,13 @@

if (rtentry != 0)
{
NS_LOG_LOGIC ("Found unicast destination- calling unicast callback");
NS_LOG_LOGIC ("Found unicast destination - calling unicast callback");
ucb (idev, rtentry, p, header); // unicast forwarding callback
return true;
}
else
{
NS_LOG_LOGIC ("Did not find unicast destination- returning false");
NS_LOG_LOGIC ("Did not find unicast destination - returning false");
return false; // Let other routing protocols try to handle this
}

}
@@ -282,15 +292,7 @@

+
}

if (address != Ipv6Address () && networkMask != Ipv6Prefix ())


{
if (networkMask == Ipv6Prefix (128))
{
/* host route */
AddNetworkRouteTo (networkAddress, Ipv6Prefix::GetOnes (), 0);
}
else
{
AddNetworkRouteTo (networkAddress, networkMask, i);
}
AddNetworkRouteTo (networkAddress, networkMask, i);
}

@@ -320,10 +322,6 @@
{
Ipv6InterfaceAddress address = m_ipv6->GetAddress (i, j);
Ipv6Address networkAddress = address.GetAddress ().CombinePrefix (address
.GetPrefix ());
Ipv6Prefix networkMask = address.GetPrefix ();
AddNetworkRouteTo (networkAddress, networkMask, i);

if (address.GetScope() == Ipv6InterfaceAddress::LINKLOCAL && sendSocketFo


und == false && activeInterface == true)
{
NS_LOG_LOGIC ("RIPng: adding sending socket to " << address.GetAddres
s ());
diff -Naur ns-3.22/src/internet/model/ripng-header.cc ns-3.23/src/internet/model
/ripng-header.cc
--- ns-3.22/src/internet/model/ripng-header.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/ripng-header.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -35,7 +35,10 @@
TypeId RipNgRte::GetTypeId (void)
{
- static TypeId tid = TypeId ("ns3::RipNgRte").SetParent<Header> ().AddConstruc
tor<RipNgRte> ();
+ static TypeId tid = TypeId ("ns3::RipNgRte")
+
.SetParent<Header> ()
+
.SetGroupName ("Internet")
+
.AddConstructor<RipNgRte> ();
return tid;
}
@@ -139,7 +142,10 @@
TypeId RipNgHeader::GetTypeId (void)
{
- static TypeId tid = TypeId ("ns3::RipNgHeader").SetParent<Header> ().AddConst
ructor<RipNgHeader> ();
+ static TypeId tid = TypeId ("ns3::RipNgHeader")
+
.SetParent<Header> ()
+
.SetGroupName ("Internet")
+
.AddConstructor<RipNgHeader> ();
return tid;
}
diff -Naur ns-3.22/src/internet/model/rtt-estimator.cc ns-3.23/src/internet/mode
l/rtt-estimator.cc
--- ns-3.22/src/internet/model/rtt-estimator.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/rtt-estimator.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -45,6 +45,7 @@
{
static TypeId tid = TypeId ("ns3::RttEstimator")
.SetParent<Object> ()
+
.SetGroupName ("Internet")
.AddAttribute ("InitialEstimation",
"Initial RTT estimate",
TimeValue (Seconds (1.0)),
@@ -129,6 +130,7 @@
{
static TypeId tid = TypeId ("ns3::RttMeanDeviation")
.SetParent<RttEstimator> ()
+
.SetGroupName ("Internet")
.AddConstructor<RttMeanDeviation> ()
.AddAttribute ("Alpha",
"Gain used in estimating the RTT, must be 0 <= alpha <= 1",

@@ -170,23 +172,23 @@
return 0;
}
// supports 1/32, 1/16, 1/8, 1/4, 1/2
- if (abs (1/val - 8) < TOLERANCE)
+ if (std::abs (1/val - 8) < TOLERANCE)
{
return 3;
}
- if (abs (1/val - 4) < TOLERANCE)
+ if (std::abs (1/val - 4) < TOLERANCE)
{
return 2;
}
- if (abs (1/val - 32) < TOLERANCE)
+ if (std::abs (1/val - 32) < TOLERANCE)
{
return 5;
}
- if (abs (1/val - 16) < TOLERANCE)
+ if (std::abs (1/val - 16) < TOLERANCE)
{
return 4;
}
- if (abs (1/val - 2) < TOLERANCE)
+ if (std::abs (1/val - 2) < TOLERANCE)
{
return 1;
}
diff -Naur ns-3.22/src/internet/model/tcp-header.cc ns-3.23/src/internet/model/t
cp-header.cc
--- ns-3.22/src/internet/model/tcp-header.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-header.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -51,6 +51,34 @@
{
}
+std::string
+TcpHeader::FlagsToString (uint8_t flags, const std::string& delimiter)
+{
+ static const char* flagNames[8] = {
+
"FIN",
+
"SYN",
+
"RST",
+
"PSH",
+
"ACK",
+
"URG",
+
"ECE",
+
"CWR"
+ };
+ std::string flagsDescription = "";
+ for (uint8_t i = 0; i < 8; ++i)
+
{
+
if (flags & (1 << i))
+
{
+
if (flagsDescription.length() > 0)
+
{
+
flagsDescription += delimiter;

+
}
+
flagsDescription.append (flagNames[i]);
+
}
+
}
+ return flagsDescription;
+}
+
void
TcpHeader::EnableChecksums (void)
{
@@ -231,6 +259,7 @@
{
static TypeId tid = TypeId ("ns3::TcpHeader")
.SetParent<Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<TcpHeader> ()
;
return tid;
@@ -249,41 +278,7 @@

if (m_flags != 0)
{
os<<" [";
if ((m_flags & FIN)
{
os<<" FIN ";
}
if ((m_flags & SYN)
{
os<<" SYN ";
}
if ((m_flags & RST)
{
os<<" RST ";
}
if ((m_flags & PSH)
{
os<<" PSH ";
}
if ((m_flags & ACK)
{
os<<" ACK ";
}
if ((m_flags & URG)
{
os<<" URG ";
}
if ((m_flags & ECE)
{
os<<" ECE ";
}
if ((m_flags & CWR)
{
os<<" CWR ";
}

!= 0)

!= 0)

!= 0)

!= 0)

!= 0)

!= 0)

!= 0)

!= 0)

os<<"]";
os<<" [" << FlagsToString(m_flags) <<"]";

os<<" Seq="<<m_sequenceNumber<<" Ack="<<m_ackNumber<<" Win="<<m_windowSize;


diff -Naur ns-3.22/src/internet/model/tcp-header.h ns-3.23/src/internet/model/tc
p-header.h
--- ns-3.22/src/internet/model/tcp-header.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-header.h
2015-05-13 11:05:27.000000000 -0
700
@@ -41,13 +41,30 @@
* as methods for serialization to and deserialization from a byte buffer.
*/
-class TcpHeader : public Header
+class TcpHeader : public Header
{
public:
TcpHeader ();
virtual ~TcpHeader ();
/**
+ * \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
+ *
+ * FIN=0x1, SYN=0x2, RST=0x4, PSH=0x8, ACK=0x10, URG=0x20, ECE=0x40, CWR=0x80
+ * TcpHeader::FlagsToString (0x1) should return the following string;
+ *
"FIN"
+ *
+ * TcpHeader::FlagsToString (0xff) should return the following string;
+ *
"FIN|SYN|RST|PSH|ACK|URG|ECE|CWR";
+ *
+ * \return the generated string
+ **/
+ static std::string FlagsToString (uint8_t flags, const std::string& delimiter
= "|");
+
+ /**
* \brief Enable checksum calculation for TCP
*
* \todo currently has no effect
diff -Naur ns-3.22/src/internet/model/tcp-l4-protocol.cc ns-3.23/src/internet/mo
del/tcp-l4-protocol.cc
--- ns-3.22/src/internet/model/tcp-l4-protocol.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/tcp-l4-protocol.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -67,6 +67,7 @@
{
static TypeId tid = TypeId ("ns3::TcpL4Protocol")
.SetParent<IpL4Protocol> ()
+
.SetGroupName ("Internet")
.AddConstructor<TcpL4Protocol> ()
.AddAttribute ("RttEstimatorType",
"Type of RttEstimator objects.",
diff -Naur ns-3.22/src/internet/model/tcp-newreno.cc ns-3.23/src/internet/model/
tcp-newreno.cc
--- ns-3.22/src/internet/model/tcp-newreno.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-newreno.cc 2015-05-13 11:05:27.000000000 -0
700

@@ -39,6 +39,7 @@
{
static TypeId tid = TypeId ("ns3::TcpNewReno")
.SetParent<TcpSocketBase> ()
+
.SetGroupName ("Internet")
.AddConstructor<TcpNewReno> ()
.AddAttribute ("ReTxThreshold", "Threshold for fast retransmit",
UintegerValue (3),
@@ -182,7 +183,10 @@
{ // Increase cwnd for every additional dupack (RFC2582, sec.3 bullet #3)
m_cWnd += m_segmentSize;
NS_LOG_INFO ("Dupack in fast recovery mode. Increase cwnd to " << m_cWnd)
;
SendPendingData (m_connected);
+
if (!m_sendPendingDataEvent.IsRunning ())
+
{
+
SendPendingData (m_connected);
+
}
}
else if (!m_inFastRec && m_limitedTx && m_txBuffer->SizeFromSequence (m_nextT
xSequence) > 0)
{ // RFC3042 Limited transmit: Send a new packet for each duplicated ACK be
fore fast retransmit
@@ -261,4 +265,10 @@
m_ssThresh = m_initialSsThresh;
}
+void
+TcpNewReno::ScaleSsThresh (uint8_t scaleFactor)
+{
+ m_ssThresh <<= scaleFactor;
+}
+
} // namespace ns3
diff -Naur ns-3.22/src/internet/model/tcp-newreno.h ns-3.23/src/internet/model/t
cp-newreno.h
--- ns-3.22/src/internet/model/tcp-newreno.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-newreno.h
2015-05-13 11:05:27.000000000 -0
700
@@ -69,6 +69,8 @@
virtual uint32_t GetInitialSSThresh (void) const;
virtual void
SetInitialCwnd (uint32_t cwnd);
virtual uint32_t GetInitialCwnd (void) const;
+ virtual void ScaleSsThresh (uint8_t scaleFactor);
+
private:
/**
* \brief Set the congestion window when connection starts
diff -Naur ns-3.22/src/internet/model/tcp-option.cc ns-3.23/src/internet/model/t
cp-option.cc
--- ns-3.22/src/internet/model/tcp-option.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-option.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -48,6 +48,7 @@
{
static TypeId tid = TypeId ("ns3::TcpOption")
.SetParent<Object> ()
+
.SetGroupName ("Internet")

;
return tid;

}
@@ -125,6 +126,7 @@
{
static TypeId tid = TypeId ("ns3::TcpOptionUnknown")
.SetParent<TcpOption> ()
+
.SetGroupName ("Internet")
.AddConstructor<TcpOptionUnknown> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/tcp-option-rfc793.cc ns-3.23/src/internet/
model/tcp-option-rfc793.cc
--- ns-3.22/src/internet/model/tcp-option-rfc793.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/tcp-option-rfc793.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -43,6 +43,7 @@
{
static TypeId tid = TypeId ("ns3::TcpOptionEnd")
.SetParent<TcpOption> ()
+
.SetGroupName ("Internet")
.AddConstructor<TcpOptionEnd> ()
;
return tid;
@@ -114,6 +115,7 @@
{
static TypeId tid = TypeId ("ns3::TcpOptionNOP")
.SetParent<TcpOption> ()
+
.SetGroupName ("Internet")
.AddConstructor<TcpOptionNOP> ()
;
return tid;
@@ -184,6 +186,7 @@
{
static TypeId tid = TypeId ("ns3::TcpOptionMSS")
.SetParent<TcpOption> ()
+
.SetGroupName ("Internet")
.AddConstructor<TcpOptionMSS> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/tcp-option-ts.cc ns-3.23/src/internet/mode
l/tcp-option-ts.cc
--- ns-3.22/src/internet/model/tcp-option-ts.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-option-ts.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -43,6 +43,7 @@
{
static TypeId tid = TypeId ("ns3::TcpOptionTS")
.SetParent<TcpOption> ()
+
.SetGroupName ("Internet")
.AddConstructor<TcpOptionTS> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/tcp-option-winscale.cc ns-3.23/src/interne
t/model/tcp-option-winscale.cc
--- ns-3.22/src/internet/model/tcp-option-winscale.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/tcp-option-winscale.cc 2015-05-13 11:05:27.0000

00000 -0700
@@ -43,6 +43,7 @@
{
static TypeId tid = TypeId ("ns3::TcpOptionWinScale")
.SetParent<TcpOption> ()
+
.SetGroupName ("Internet")
.AddConstructor<TcpOptionWinScale> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/tcp-reno.cc ns-3.23/src/internet/model/tcp
-reno.cc
--- ns-3.22/src/internet/model/tcp-reno.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-reno.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -39,6 +39,7 @@
{
static TypeId tid = TypeId ("ns3::TcpReno")
.SetParent<TcpSocketBase> ()
+
.SetGroupName ("Internet")
.AddConstructor<TcpReno> ()
.AddAttribute ("ReTxThreshold", "Threshold for fast retransmit",
UintegerValue (3),
@@ -164,7 +165,10 @@
{ // In fast recovery, inc cwnd for every additional dupack (RFC2581, sec.3
.2)
m_cWnd += m_segmentSize;
NS_LOG_INFO ("Increased cwnd to " << m_cWnd);
SendPendingData (m_connected);
+
if (!m_sendPendingDataEvent.IsRunning ())
+
{
+
SendPendingData (m_connected);
+
}
};
}
@@ -236,4 +240,11 @@
m_ssThresh = m_initialSsThresh;
}
+void
+TcpReno::ScaleSsThresh (uint8_t scaleFactor)
+{
+ m_ssThresh <<= scaleFactor;
+}
+
+
} // namespace ns3
diff -Naur ns-3.22/src/internet/model/tcp-reno.h ns-3.23/src/internet/model/tcpreno.h
--- ns-3.22/src/internet/model/tcp-reno.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-reno.h
2015-05-13 11:05:27.000000000 -0
700
@@ -71,6 +71,8 @@
virtual uint32_t GetInitialSSThresh (void) const;
virtual void
SetInitialCwnd (uint32_t cwnd);
virtual uint32_t GetInitialCwnd (void) const;
+ virtual void ScaleSsThresh (uint8_t scaleFactor);
+

private:
/**
* \brief Set the congestion window when connection starts
diff -Naur ns-3.22/src/internet/model/tcp-rfc793.cc ns-3.23/src/internet/model/t
cp-rfc793.cc
--- ns-3.22/src/internet/model/tcp-rfc793.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-rfc793.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -32,6 +32,7 @@
{
static TypeId tid = TypeId ("ns3::TcpRfc793")
.SetParent<TcpSocketBase> ()
+
.SetGroupName ("Internet")
.AddConstructor<TcpRfc793> ()
;
return tid;
@@ -88,4 +89,19 @@
return 0;
}
+uint32_t
+TcpRfc793::Window ()
+{
+ NS_LOG_FUNCTION (this);
+ return m_rWnd;
+}
+
+void
+TcpRfc793::ScaleSsThresh (uint8_t scaleFactor)
+{
+ NS_LOG_WARN ("DoD TCP does not perform slow start");
+ return;
+}
+
+
} // namespace ns3
diff -Naur ns-3.22/src/internet/model/tcp-rfc793.h ns-3.23/src/internet/model/tc
p-rfc793.h
--- ns-3.22/src/internet/model/tcp-rfc793.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-rfc793.h
2015-05-13 11:05:27.000000000 -0
700
@@ -62,6 +62,10 @@
virtual uint32_t GetInitialSSThresh (void) const;
virtual void
SetInitialCwnd (uint32_t cwnd);
virtual uint32_t GetInitialCwnd (void) const;
+
+ virtual uint32_t Window (void);
+ virtual void ScaleSsThresh (uint8_t scaleFactor);
+
};
} // namespace ns3
diff -Naur ns-3.22/src/internet/model/tcp-rx-buffer.cc ns-3.23/src/internet/mode
l/tcp-rx-buffer.cc
--- ns-3.22/src/internet/model/tcp-rx-buffer.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-rx-buffer.cc 2015-05-13 11:05:27.000000000 -0
700

@@ -34,6 +34,7 @@
{
static TypeId tid = TypeId ("ns3::TcpRxBuffer")
.SetParent<Object> ()
+
.SetGroupName ("Internet")
.AddConstructor<TcpRxBuffer> ()
.AddTraceSource ("NextRxSequence",
"Next sequence number expected (RCV.NXT)",
diff -Naur ns-3.22/src/internet/model/tcp-socket-base.cc ns-3.23/src/internet/mo
del/tcp-socket-base.cc
--- ns-3.22/src/internet/model/tcp-socket-base.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/tcp-socket-base.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -65,6 +65,7 @@
{
static TypeId tid = TypeId ("ns3::TcpSocketBase")
.SetParent<TcpSocket> ()
+
.SetGroupName ("Internet")
//
.AddAttribute ("TcpState", "State in TCP state machine",
//
TypeId::ATTR_GET,
//
EnumValue (CLOSED),
@@ -97,7 +98,7 @@
MakeBooleanChecker ())
.AddAttribute ("MinRto",
"Minimum retransmit timeout value",
TimeValue (Seconds (0.2)), // RFC2988 says min RTO=1 sec, bu
t Linux uses 200ms. See http://www.postel.org/pipermail/end2end-interest/2004-No
vember/004402.html
+
TimeValue (Seconds (1.0)), // RFC 6298 says min RTO=1 sec, b
ut Linux uses 200ms. See http://www.postel.org/pipermail/end2end-interest/2004-N
ovember/004402.html
MakeTimeAccessor (&TcpSocketBase::SetMinRto,
&TcpSocketBase::GetMinRto),
MakeTimeChecker ())
@@ -141,6 +142,14 @@
"Remote side's flow control window",
MakeTraceSourceAccessor (&TcpSocketBase::m_rWnd),
"ns3::TracedValue::Uint32Callback")
+
.AddTraceSource ("HighestRxSequence",
+
"Highest sequence number received from peer",
+
MakeTraceSourceAccessor (&TcpSocketBase::m_highRxMark),
+
"ns3::SequenceNumber32TracedValueCallback")
+
.AddTraceSource ("HighestRxAck",
+
"Highest ack received from peer",
+
MakeTraceSourceAccessor (&TcpSocketBase::m_highRxAckMark),
+
"ns3::SequenceNumber32TracedValueCallback")
;
return tid;
}
@@ -168,6 +177,8 @@
m_segmentSize (0),
// For attribute initialization consistency (quiet valgrind)
m_rWnd (0),
+
m_highRxMark (0),
+
m_highRxAckMark (0),
m_sndScaleFactor (0),
m_rcvScaleFactor (0),
m_timestampEnabled (true),
@@ -208,6 +219,8 @@

m_segmentSize (sock.m_segmentSize),
m_maxWinSize (sock.m_maxWinSize),
m_rWnd (sock.m_rWnd),
+
m_highRxMark (sock.m_highRxMark),
+
m_highRxAckMark (sock.m_highRxAckMark),
m_winScalingEnabled (sock.m_winScalingEnabled),
m_sndScaleFactor (sock.m_sndScaleFactor),
m_rcvScaleFactor (sock.m_rcvScaleFactor),
@@ -600,7 +613,10 @@
NS_LOG_LOGIC ("txBufSize=" << m_txBuffer->Size () << " state " << TcpStat
eName[m_state]);
if (m_state == ESTABLISHED || m_state == CLOSE_WAIT)
{ // Try to send the data out
SendPendingData (m_connected);
+
if (!m_sendPendingDataEvent.IsRunning ())
+
{
+
m_sendPendingDataEvent = Simulator::Schedule ( TimeStep (1), &Tcp
SocketBase::SendPendingData, this, m_connected);
+
}
}
return p->GetSize ();
}
@@ -941,15 +957,6 @@
EstimateRtt (tcpHeader);
}
-

// Update Rx window size, i.e. the flow control window


if (m_rWnd.Get () == 0 && tcpHeader.GetWindowSize () != 0)
{ // persist probes end
NS_LOG_LOGIC (this << " Leaving zerowindow persist state");
m_persistEvent.Cancel ();
}
m_rWnd = tcpHeader.GetWindowSize ();
m_rWnd <<= m_rcvScaleFactor;

// Discard fully out of range data packets


if (packet->GetSize ()
&& OutOfRange (tcpHeader.GetSequenceNumber (), tcpHeader.GetSequenceNumbe
r () + packet->GetSize ()))
@@ -967,6 +974,17 @@
return;
}
+ // Update Rx window size, i.e. the flow control window
+ if (m_rWnd.Get () == 0 && tcpHeader.GetWindowSize () != 0 && m_persistEvent.I
sRunning ())
+
{ // persist probes end
+
NS_LOG_LOGIC (this << " Leaving zerowindow persist state");
+
m_persistEvent.Cancel ();
+
}
+ if (tcpHeader.GetFlags () & TcpHeader::ACK)
+
{
+
UpdateWindowSize (tcpHeader);
+
}
+
// TCP state machine code in different process functions
// C.f.: tcp_rcv_state_process() in tcp_input.c in Linux kernel
switch (m_state)
@@ -1045,15 +1063,6 @@
EstimateRtt (tcpHeader);

}
-

// Update Rx window size, i.e. the flow control window


if (m_rWnd.Get () == 0 && tcpHeader.GetWindowSize () != 0)
{ // persist probes end
NS_LOG_LOGIC (this << " Leaving zerowindow persist state");
m_persistEvent.Cancel ();
}
m_rWnd = tcpHeader.GetWindowSize ();
m_rWnd <<= m_rcvScaleFactor;

// Discard fully out of range packets


if (packet->GetSize ()
&& OutOfRange (tcpHeader.GetSequenceNumber (), tcpHeader.GetSequenceNumbe
r () + packet->GetSize ()))
@@ -1071,6 +1080,18 @@
return;
}
+ // Update Rx window size, i.e. the flow control window
+ if (m_rWnd.Get () == 0 && tcpHeader.GetWindowSize () != 0 && m_persistEvent.I
sRunning ())
+
{ // persist probes end
+
NS_LOG_LOGIC (this << " Leaving zerowindow persist state");
+
m_persistEvent.Cancel ();
+
}
+
+ if (tcpHeader.GetFlags () & TcpHeader::ACK)
+
{
+
UpdateWindowSize (tcpHeader);
+
}
+
// TCP state machine code in different process functions
// C.f.: tcp_rcv_state_process() in tcp_input.c in Linux kernel
switch (m_state)
@@ -1712,7 +1733,7 @@
header.SetWindowSize (AdvertisedWindowSize ());
// RFC 6298, clause 2.4
- m_rto = Max (m_rtt->GetEstimate () + Max (m_clockGranularity, m_rtt->GetVaria
tion ()*4), Time::FromDouble (1, Time::S));
+ m_rto = Max (m_rtt->GetEstimate () + Max (m_clockGranularity, m_rtt->GetVaria
tion ()*4), m_minRto);
bool hasSyn = flags & TcpHeader::SYN;
bool hasFin = flags & TcpHeader::FIN;
@@ -2063,7 +2084,6 @@
if (m_txBuffer->Size () == 0)
{
return false;
// Nothing to send
}
if (m_endPoint == 0 && m_endPoint6 == 0)
{
@@ -2074,17 +2094,10 @@
while (m_txBuffer->SizeFromSequence (m_nextTxSequence))
{
uint32_t w = AvailableWindow (); // Get available window size
NS_LOG_LOGIC ("TcpSocketBase " << this << " SendPendingData" <<
" w " << w <<

ce));

"
"
"
"
"
"

rxwin " << m_rWnd <<


segsize " << m_segmentSize <<
nextTxSeq " << m_nextTxSequence <<
highestRxAck " << m_txBuffer->HeadSequence () <<
pd->Size " << m_txBuffer->Size () <<
pd->SFS " << m_txBuffer->SizeFromSequence (m_nextTxSequen

// Stop sending if we need to wait for a larger Tx window (prevent silly


window syndrome)
if (w < m_segmentSize && m_txBuffer->SizeFromSequence (m_nextTxSequence)
> w)
{
+
NS_LOG_LOGIC ("Preventing Silly Window Syndrome. Wait to send.");
break; // No more
}
// Nagle's algorithm (RFC896): Hold off sending if there is unacked data
@@ -2095,6 +2108,14 @@
NS_LOG_LOGIC ("Invoking Nagle's algorithm. Wait to send.");
break;
}
+
NS_LOG_LOGIC ("TcpSocketBase " << this << " SendPendingData" <<
+
" w " << w <<
+
" rxwin " << m_rWnd <<
+
" segsize " << m_segmentSize <<
+
" nextTxSeq " << m_nextTxSequence <<
+
" highestRxAck " << m_txBuffer->HeadSequence () <<
+
" pd->Size " << m_txBuffer->Size () <<
+
" pd->SFS " << m_txBuffer->SizeFromSequence (m_nextTxSequen
ce));
uint32_t s = std::min (w, m_segmentSize); // Send no more than window
uint32_t sz = SendDataPacket (m_nextTxSequence, s, withAck);
nPacketsSent++;
// Count sent this loop
@@ -2119,13 +2140,6 @@
}
uint32_t
-TcpSocketBase::Window ()
-{
- NS_LOG_FUNCTION (this);
- return m_rWnd;
-}
-uint32_t
TcpSocketBase::AvailableWindow ()
{
NS_LOG_FUNCTION_NOARGS ();
@@ -2254,7 +2268,7 @@
{
m_rtt->Measurement (m);
// Log the measurement
// RFC 6298, clause 2.4
m_rto = Max (m_rtt->GetEstimate () + Max (m_clockGranularity, m_rtt->GetV
ariation ()*4), Time::FromDouble (1, Time::S));
+
m_rto = Max (m_rtt->GetEstimate () + Max (m_clockGranularity, m_rtt->GetV
ariation ()*4), m_minRto);
m_lastRtt = m_rtt->GetEstimate ();
NS_LOG_FUNCTION(this << m_lastRtt);
}
@@ -2275,7 +2289,7 @@
m_retxEvent.Cancel ();
// On receiving a "New" ack we restart retransmission timer .. RFC 6298

// RFC 6298, clause 2.4


m_rto = Max (m_rtt->GetEstimate () + Max (m_clockGranularity, m_rtt->GetV
ariation ()*4), Time::FromDouble (1, Time::S));
+
m_rto = Max (m_rtt->GetEstimate () + Max (m_clockGranularity, m_rtt->GetV
ariation ()*4), m_minRto);
NS_LOG_LOGIC (this << " Schedule ReTxTimeout at time " <<
Simulator::Now ().GetSeconds () << " to expire at time " <<
@@ -2313,7 +2327,10 @@
m_retxEvent.Cancel ();
}
// Try to send more data
- SendPendingData (m_connected);
+ if (!m_sendPendingDataEvent.IsRunning ())
+
{
+
m_sendPendingDataEvent = Simulator::Schedule ( TimeStep (1), &TcpSocketBa
se::SendPendingData, this, m_connected);
+
}
}
// Retransmit timeout
@@ -2450,6 +2467,7 @@
m_delAckEvent.Cancel ();
m_lastAckEvent.Cancel ();
m_timewaitEvent.Cancel ();
+ m_sendPendingDataEvent.Cancel ();
}
/* Move TCP to Time_Wait state and schedule a transition to Closed state */
@@ -2604,6 +2622,7 @@
{
m_winScalingEnabled = true;
ProcessOptionWScale (header.GetOption (TcpOption::WINSCALE));
+
ScaleSsThresh (m_sndScaleFactor);
}
}
}
@@ -2726,6 +2745,50 @@
option->GetTimestamp () << " echo=" << m_timestampToEcho);
}
+void TcpSocketBase::UpdateWindowSize (const TcpHeader &header)
+{
+ NS_LOG_FUNCTION (this << header);
+ // If the connection is not established, the window size is always
+ // updated
+ uint32_t receivedWindow = header.GetWindowSize ();
+ receivedWindow <<= m_rcvScaleFactor;
+ NS_LOG_DEBUG ("Received (scaled) window is " << receivedWindow << " bytes");
+ if (m_state < ESTABLISHED)
+
{
+
m_rWnd = receivedWindow;
+
NS_LOG_DEBUG ("State less than ESTABLISHED; updating rWnd to " << m_rWnd)
;
+
return;
+
}
+
+ // Test for conditions that allow updating of the window
+ // 1) segment contains new data (advancing the right edge of the receive
+ // buffer),

+ // 2) segment does not contain new data but the segment acks new data
+ // (highest sequence number acked advances), or
+ // 3) the advertised window is larger than the current send window
+ bool update = false;
+ if (header.GetAckNumber () == m_highRxAckMark && receivedWindow > m_rWnd)
+
{
+
// right edge of the send window is increased (window update)
+
update = true;
+
}
+ if (header.GetAckNumber () > m_highRxAckMark)
+
{
+
m_highRxAckMark = header.GetAckNumber ();
+
update = true;
+
}
+ if (header.GetSequenceNumber () > m_highRxMark)
+
{
+
m_highRxMark = header.GetSequenceNumber ();
+
update = true;
+
}
+ if (update == true)
+
{
+
m_rWnd = receivedWindow;
+
NS_LOG_DEBUG ("updating rWnd to " << m_rWnd);
+
}
+}
+
void
TcpSocketBase::SetMinRto (Time minRto)
{
diff -Naur ns-3.22/src/internet/model/tcp-socket-base.h ns-3.23/src/internet/mod
el/tcp-socket-base.h
--- ns-3.22/src/internet/model/tcp-socket-base.h
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/tcp-socket-base.h
2015-05-13 11:05:27.0000
00000 -0700
@@ -518,7 +518,7 @@
* \brief Return the max possible number of unacked bytes
* \returns the max possible number of unacked bytes
*/
- virtual uint32_t Window (void);
+ virtual uint32_t Window (void) = 0;
/**
* \brief Return unfilled portion of window
@@ -532,6 +532,20 @@
*/
virtual uint16_t AdvertisedWindowSize (void);
+ /**
+ * \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
+ * conditions holds: 1) segment contains new data (advancing the right
+ * edge of the receive buffer), 2) segment does not contain new data
+ * 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
+ */

+ void UpdateWindowSize (const TcpHeader& header);


+
// Manage data tx/rx
@@ -675,6 +689,15 @@
*/
void AddOptionTimestamp (TcpHeader& header);
+ /**
+ * \brief Scale the initial SsThresh value to the correct one
+ *
+ * Set the initial SsThresh to the largest possible advertised window
+ * according to the sender scale factor.
+ *
+ * \param scaleFactor the sender scale factor
+ */
+ virtual void ScaleSsThresh (uint8_t scaleFactor) = 0;
protected:
// Counters and events
@@ -727,7 +750,9 @@
// Window management
uint32_t
m_segmentSize; //!< Segment size
uint16_t
m_maxWinSize; //!< Maximum window size to advertise
- TracedValue<uint32_t> m_rWnd;
//!< Flow control window at remote side
+ TracedValue<uint32_t> m_rWnd;
//!< Receiver window (RCV.WND in RFC793)
+ TracedValue<SequenceNumber32> m_highRxMark;
//!< Highest seqno received
+ TracedValue<SequenceNumber32> m_highRxAckMark; //!< Highest ack received
// Options
bool
m_winScalingEnabled;
@@ -736,6 +761,8 @@
bool
m_timestampEnabled;
uint32_t m_timestampToEcho;

//!< Window Scale option enabled


//!< Timestamp option enabled
//!< Timestamp to echo

+
+ EventId m_sendPendingDataEvent; //!< micro-delay event to send pending data
};
} // namespace ns3
diff -Naur ns-3.22/src/internet/model/tcp-socket.cc ns-3.23/src/internet/model/t
cp-socket.cc
--- ns-3.22/src/internet/model/tcp-socket.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-socket.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -40,6 +40,7 @@
{
static TypeId tid = TypeId ("ns3::TcpSocket")
.SetParent<Socket> ()
+
.SetGroupName ("Internet")
.AddAttribute ("SndBufSize",
"TcpSocket maximum transmit buffer size (bytes)",
UintegerValue (131072), // 128k
diff -Naur ns-3.22/src/internet/model/tcp-socket-factory.cc ns-3.23/src/internet
/model/tcp-socket-factory.cc
--- ns-3.22/src/internet/model/tcp-socket-factory.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/tcp-socket-factory.cc
2015-05-13 11:05:27.0000

00000 -0700
@@ -30,6 +30,7 @@
{
static TypeId tid = TypeId ("ns3::TcpSocketFactory")
.SetParent<SocketFactory> ()
+
.SetGroupName ("Internet")
;
return tid;
}
diff -Naur ns-3.22/src/internet/model/tcp-tahoe.cc ns-3.23/src/internet/model/tc
p-tahoe.cc
--- ns-3.22/src/internet/model/tcp-tahoe.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-tahoe.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -39,6 +39,7 @@
{
static TypeId tid = TypeId ("ns3::TcpTahoe")
.SetParent<TcpSocketBase> ()
+
.SetGroupName ("Internet")
.AddConstructor<TcpTahoe> ()
.AddAttribute ("ReTxThreshold", "Threshold for fast retransmit",
UintegerValue (3),
@@ -214,4 +215,11 @@
m_ssThresh = m_initialSsThresh;
}
+void
+TcpTahoe::ScaleSsThresh (uint8_t scaleFactor)
+{
+ m_ssThresh <<= scaleFactor;
+}
+
+
} // namespace ns3
diff -Naur ns-3.22/src/internet/model/tcp-tahoe.h ns-3.23/src/internet/model/tcp
-tahoe.h
--- ns-3.22/src/internet/model/tcp-tahoe.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-tahoe.h
2015-05-13 11:05:27.000000000 -0
700
@@ -75,6 +75,7 @@
virtual uint32_t GetInitialSSThresh (void) const;
virtual void
SetInitialCwnd (uint32_t cwnd);
virtual uint32_t GetInitialCwnd (void) const;
+ virtual void ScaleSsThresh (uint8_t scaleFactor);
private:
/**
* \brief Set the congestion window when connection starts
diff -Naur ns-3.22/src/internet/model/tcp-tx-buffer.cc ns-3.23/src/internet/mode
l/tcp-tx-buffer.cc
--- ns-3.22/src/internet/model/tcp-tx-buffer.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-tx-buffer.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -39,6 +39,7 @@
{
static TypeId tid = TypeId ("ns3::TcpTxBuffer")
.SetParent<Object> ()
+
.SetGroupName ("Internet")

.AddConstructor<TcpTxBuffer> ()
.AddTraceSource ("UnackSequence",
"First unacknowledged sequence number (SND.UNA)",
diff -Naur ns-3.22/src/internet/model/tcp-westwood.cc ns-3.23/src/internet/model
/tcp-westwood.cc
--- ns-3.22/src/internet/model/tcp-westwood.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-westwood.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -53,6 +53,7 @@
{
static TypeId tid = TypeId("ns3::TcpWestwood")
.SetParent<TcpSocketBase>()
+
.SetGroupName ("Internet")
.AddConstructor<TcpWestwood>()
.AddTraceSource("CongestionWindow", "The TCP connection's congestion wind
ow",
MakeTraceSourceAccessor(&TcpWestwood::m_cWnd),
@@ -292,7 +293,10 @@
{// Increase cwnd for every additional DUPACK as in Reno
m_cWnd += m_segmentSize;
NS_LOG_INFO ("Dupack in fast recovery mode. Increase cwnd to " << m_cWnd)
;
SendPendingData (m_connected);
+
if (!m_sendPendingDataEvent.IsRunning ())
+
{
+
SendPendingData (m_connected);
+
}
}
}
@@ -425,4 +429,11 @@
m_ssThresh = m_initialSsThresh;
}
+void
+TcpWestwood::ScaleSsThresh (uint8_t scaleFactor)
+{
+ m_ssThresh <<= scaleFactor;
+}
+
+
} // namespace ns3
diff -Naur ns-3.22/src/internet/model/tcp-westwood.h ns-3.23/src/internet/model/
tcp-westwood.h
--- ns-3.22/src/internet/model/tcp-westwood.h 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/tcp-westwood.h 2015-05-13 11:05:27.000000000 -0
700
@@ -126,6 +126,7 @@
virtual uint32_t GetInitialSSThresh (void) const;
virtual void
SetInitialCwnd (uint32_t cwnd);
virtual uint32_t GetInitialCwnd (void) const;
+ virtual void ScaleSsThresh (uint8_t scaleFactor);
private:
/**
diff -Naur ns-3.22/src/internet/model/udp-header.cc ns-3.23/src/internet/model/u
dp-header.cc
--- ns-3.22/src/internet/model/udp-header.cc
2015-02-05 15:46:22.000000000 -0

800
+++ ns-3.23/src/internet/model/udp-header.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -155,6 +155,7 @@
{
static TypeId tid = TypeId ("ns3::UdpHeader")
.SetParent<Header> ()
+
.SetGroupName ("Internet")
.AddConstructor<UdpHeader> ()
;
return tid;
diff -Naur ns-3.22/src/internet/model/udp-l4-protocol.cc ns-3.23/src/internet/mo
del/udp-l4-protocol.cc
--- ns-3.22/src/internet/model/udp-l4-protocol.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/udp-l4-protocol.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -54,6 +54,7 @@
{
static TypeId tid = TypeId ("ns3::UdpL4Protocol")
.SetParent<IpL4Protocol> ()
+
.SetGroupName ("Internet")
.AddConstructor<UdpL4Protocol> ()
.AddAttribute ("SocketList", "The list of sockets associated to this protoc
ol.",
ObjectVectorValue (),
diff -Naur ns-3.22/src/internet/model/udp-socket.cc ns-3.23/src/internet/model/u
dp-socket.cc
--- ns-3.22/src/internet/model/udp-socket.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/internet/model/udp-socket.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -37,6 +37,7 @@
{
static TypeId tid = TypeId ("ns3::UdpSocket")
.SetParent<Socket> ()
+
.SetGroupName ("Internet")
.AddAttribute ("RcvBufSize",
"UdpSocket maximum receive buffer size (bytes)",
UintegerValue (131072),
diff -Naur ns-3.22/src/internet/model/udp-socket-factory.cc ns-3.23/src/internet
/model/udp-socket-factory.cc
--- ns-3.22/src/internet/model/udp-socket-factory.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/udp-socket-factory.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -28,6 +28,7 @@
{
static TypeId tid = TypeId ("ns3::UdpSocketFactory")
.SetParent<SocketFactory> ()
+
.SetGroupName ("Internet")
;
return tid;
}
diff -Naur ns-3.22/src/internet/model/udp-socket-impl.cc ns-3.23/src/internet/mo
del/udp-socket-impl.cc
--- ns-3.22/src/internet/model/udp-socket-impl.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/model/udp-socket-impl.cc
2015-05-13 11:05:27.0000
00000 -0700

@@ -56,6 +56,7 @@
{
static TypeId tid = TypeId ("ns3::UdpSocketImpl")
.SetParent<UdpSocket> ()
+
.SetGroupName ("Internet")
.AddConstructor<UdpSocketImpl> ()
.AddTraceSource ("Drop",
"Drop UDP packet due to receive buffer overflow",
diff -Naur ns-3.22/src/internet/test/codel-queue-test-suite.cc ns-3.23/src/inter
net/test/codel-queue-test-suite.cc
--- ns-3.22/src/internet/test/codel-queue-test-suite.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/test/codel-queue-test-suite.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -61,6 +61,21 @@
public:
CoDelQueueBasicEnqueueDequeue (std::string mode);
virtual void DoRun (void);
+
+ void QueueTestSize (Ptr<CoDelQueue> queue, uint32_t size, std::string error)
+ {
+
if (queue->GetMode () == CoDelQueue::QUEUE_MODE_BYTES)
+
{
+
NS_TEST_EXPECT_MSG_EQ (queue->GetNBytes (), size, error);
+
}
+
else if (queue->GetMode () == CoDelQueue::QUEUE_MODE_PACKETS)
+
{
+
NS_TEST_EXPECT_MSG_EQ (queue->GetNPackets (), size, error);
+
}
+
+
NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), size, error);
+ }
+
private:
StringValue m_mode;
};
@@ -109,19 +124,19 @@
p5 = Create<Packet> (pktSize);
p6 = Create<Packet> (pktSize);
- NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize
no packets in queue");
+ QueueTestSize (queue, 0 * modeSize, "There
queue->Enqueue (p1);
- NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize
one packet in queue");
+ QueueTestSize (queue, 1 * modeSize, "There
queue->Enqueue (p2);
- NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize
two packets in queue");
+ QueueTestSize (queue, 2 * modeSize, "There
queue->Enqueue (p3);
- NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize
three packets in queue");
+ QueueTestSize (queue, 3 * modeSize, "There
;
queue->Enqueue (p4);
- NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize
four packets in queue");
+ QueueTestSize (queue, 4 * modeSize, "There

(), 0 * modeSize, "There should be


should be no packets in queue");
(), 1 * modeSize, "There should be
should be one packet in queue");
(), 2 * modeSize, "There should be
should be two packets in queue");
(), 3 * modeSize, "There should be
should be three packets in queue")
(), 4 * modeSize, "There should be
should be four packets in queue");

queue->Enqueue (p5);
- NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize
five packets in queue");
+ QueueTestSize (queue, 5 * modeSize, "There
queue->Enqueue (p6);
- NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize
six packets in queue");
+ QueueTestSize (queue, 6 * modeSize, "There

(), 5 * modeSize, "There should be


should be five packets in queue");
(), 6 * modeSize, "There should be
should be six packets in queue");

NS_TEST_EXPECT_MSG_EQ (queue->GetDropOverLimit (), 0, "There should be no pac


kets being dropped due to full queue");
@@ -129,32 +144,32 @@
p = queue->Dequeue ();
NS_TEST_EXPECT_MSG_EQ ((p != 0), true, "I want to remove the first packet");
- NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 5 * modeSize, "There should be
five packets in queue");
+ QueueTestSize (queue, 5 * modeSize, "There should be five packets in queue");
NS_TEST_EXPECT_MSG_EQ (p->GetUid (), p1->GetUid (), "was this the first packe
t ?");
p = queue->Dequeue ();
NS_TEST_EXPECT_MSG_EQ ((p != 0), true, "I want to remove the second packet");
- NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 4 * modeSize, "There should be
four packets in queue");
+ QueueTestSize (queue, 4 * modeSize, "There should be four packets in queue");
NS_TEST_EXPECT_MSG_EQ (p->GetUid (), p2->GetUid (), "Was this the second pack
et ?");
p = queue->Dequeue ();
NS_TEST_EXPECT_MSG_EQ ((p != 0), true, "I want to remove the third packet");
- NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 3 * modeSize, "There should be
three packets in queue");
+ QueueTestSize (queue, 3 * modeSize, "There should be three packets in queue")
;
NS_TEST_EXPECT_MSG_EQ (p->GetUid (), p3->GetUid (), "Was this the third packe
t ?");
p = queue->Dequeue ();
NS_TEST_EXPECT_MSG_EQ ((p != 0), true, "I want to remove the forth packet");
- NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 2 * modeSize, "There should be
two packets in queue");
+ QueueTestSize (queue, 2 * modeSize, "There should be two packets in queue");
NS_TEST_EXPECT_MSG_EQ (p->GetUid (), p4->GetUid (), "Was this the fourth pack
et ?");
p = queue->Dequeue ();
NS_TEST_EXPECT_MSG_EQ ((p != 0), true, "I want to remove the fifth packet");
- NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 1 * modeSize, "There should be
one packet in queue");
+ QueueTestSize (queue, 1 * modeSize, "There should be one packet in queue");
NS_TEST_EXPECT_MSG_EQ (p->GetUid (), p5->GetUid (), "Was this the fifth packe
t ?");
p = queue->Dequeue ();
NS_TEST_EXPECT_MSG_EQ ((p != 0), true, "I want to remove the last packet");
- NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 0 * modeSize, "There should be
zero packet in queue");
+ QueueTestSize (queue, 0 * modeSize, "There should be zero packet in queue");

NS_TEST_EXPECT_MSG_EQ (p->GetUid (), p6->GetUid (), "Was this the sixth packe
t ?");
p = queue->Dequeue ();
@@ -169,6 +184,21 @@
public:
CoDelQueueBasicOverflow (std::string mode);
virtual void DoRun (void);
+
+ void QueueTestSize (Ptr<CoDelQueue> queue, uint32_t size, std::string error)
+ {
+
if (queue->GetMode () == CoDelQueue::QUEUE_MODE_BYTES)
+
{
+
NS_TEST_EXPECT_MSG_EQ (queue->GetNBytes (), size, error);
+
}
+
else if (queue->GetMode () == CoDelQueue::QUEUE_MODE_PACKETS)
+
{
+
NS_TEST_EXPECT_MSG_EQ (queue->GetNPackets (), size, error);
+
}
+
+
NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), size, error);
+ }
+
private:
void Enqueue (Ptr<CoDelQueue> queue, uint32_t size, uint32_t nPkt);
StringValue m_mode;
@@ -216,7 +246,7 @@
queue->Enqueue (p2);
queue->Enqueue (p3);
- NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), 500 * modeSize, "There should
be 500 packets in queue");
+ QueueTestSize (queue, 500 * modeSize, "There should be 500 packets in queue")
;
NS_TEST_EXPECT_MSG_EQ (queue->GetDropOverLimit (), 3, "There should be three
packets being dropped due to full queue");
}
@@ -321,6 +351,21 @@
public:
CoDelQueueBasicDrop (std::string mode);
virtual void DoRun (void);
+
+ void QueueTestSize (Ptr<CoDelQueue> queue, uint32_t size, std::string error)
+ {
+
if (queue->GetMode () == CoDelQueue::QUEUE_MODE_BYTES)
+
{
+
NS_TEST_EXPECT_MSG_EQ (queue->GetNBytes (), size, error);
+
}
+
else if (queue->GetMode () == CoDelQueue::QUEUE_MODE_PACKETS)
+
{
+
NS_TEST_EXPECT_MSG_EQ (queue->GetNPackets (), size, error);
+
}
+
+
NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), size, error);
+ }
+
private:
void Enqueue (Ptr<CoDelQueue> queue, uint32_t size, uint32_t nPkt);
void Dequeue (Ptr<CoDelQueue> queue, uint32_t modeSize);

@@ -419,13 +464,13 @@
NS_TEST_EXPECT_MSG_EQ (currentDropCount, 0, "We are not in droppi
ng state."
"Sojourn time has just gone above target f
rom below."
"Hence, there should be no packet drops");
NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), initialQSize - mod
eSize, "There should be 1 packet dequeued.");
+
QueueTestSize (queue, initialQSize - modeSize, "There should be 1
packet dequeued.");
}
else if (currentTime >= queue->GetInterval ())
{
currentDropCount = queue->GetDropCount ();
NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), initialQSize - 2 *
modeSize, "Sojourn time has been above target for at least interval."
+
QueueTestSize (queue, initialQSize - 2 * modeSize, "Sojourn time
has been above target for at least interval."
"We enter the dropping state, perform init
ial packet drop, and dequeue the next."
"So there should be 2 more packets dequeue
d.");
NS_TEST_EXPECT_MSG_EQ (currentDropCount, 1, "There should be 1 pa
cket drop");
@@ -436,7 +481,7 @@
if (currentTime.GetMicroSeconds () < initialDropNext)
{
currentDropCount = queue->GetDropCount ();
NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), initialQSize - mod
eSize, "We are in dropping state."
+
QueueTestSize (queue, initialQSize - modeSize, "We are in droppin
g state."
"Sojourn is still above target."
"However, it's not time for next drop."
"So there should be only 1 more packet deq
ueued");
@@ -446,7 +491,7 @@
else if (currentTime.GetMicroSeconds () >= initialDropNext)
{
currentDropCount = queue->GetDropCount ();
NS_TEST_EXPECT_MSG_EQ (queue->GetQueueSize (), initialQSize - (m_
dropNextCount + 1) * modeSize, "We are in dropping state."
+
QueueTestSize (queue, initialQSize - (m_dropNextCount + 1) * mode
Size, "We are in dropping state."
"It's time for next drop."
"The number of packets dequeued equals to
the number of times m_dropNext is updated plus initial dequeue");
NS_TEST_EXPECT_MSG_EQ (currentDropCount, 1 + m_dropNextCount, "Th
e number of drops equals to the number of times m_dropNext is updated plus 1 fro
m last dequeue");
diff -Naur ns-3.22/src/internet/test/tcp-header-test.cc ns-3.23/src/internet/tes
t/tcp-header-test.cc
--- ns-3.22/src/internet/test/tcp-header-test.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/test/tcp-header-test.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -27,97 +27,106 @@
namespace ns3 {

+#define GET_RANDOM_UINT32(RandomVariable) \
+ static_cast<uint32_t> (RandomVariable->GetInteger (0, UINT32_MAX))
+
+#define GET_RANDOM_UINT16(RandomVariable) \
+ static_cast<uint16_t> (RandomVariable->GetInteger (0, UINT16_MAX))
+
+#define GET_RANDOM_UINT8(RandomVariable) \
+ static_cast<uint8_t> (RandomVariable->GetInteger (0, UINT8_MAX))
+
+#define GET_RANDOM_UINT6(RandomVariable) \
+ static_cast<uint8_t> (RandomVariable->GetInteger (0, UINT8_MAX >> 2))
+
class TcpHeaderGetSetTestCase : public TestCase
{
public:
- TcpHeaderGetSetTestCase (uint16_t sourcePort, uint16_t destinationPort,
SequenceNumber32 sequenceNumber, SequenceNumber32 ac
kNumber,
uint8_t flags, uint16_t m_windowSize, uint16_t m_urg
entPointer,
std::string name);
+ TcpHeaderGetSetTestCase (std::string name);
protected:
- uint16_t m_sourcePort;
//!< Source port
- uint16_t m_destinationPort; //!< Destination port
- SequenceNumber32 m_sequenceNumber; //!< Sequence number
- SequenceNumber32 m_ackNumber;
//!< ACK number
- uint8_t m_flags;
//!< Flags (really a uint6_t)
- uint16_t m_windowSize;
//!< Window size
- uint16_t m_urgentPointer;
//!< Urgent pointer
private:
virtual void DoRun (void);
virtual void DoTeardown (void);
- TcpHeader m_header;
- Buffer m_buffer;
};
-TcpHeaderGetSetTestCase::TcpHeaderGetSetTestCase (
- uint16_t sourcePort, uint16_t destinationPort,
- SequenceNumber32 sequenceNumber, SequenceNumber32 ackNumber,
- uint8_t flags, uint16_t windowSize, uint16_t urgentPointer,
- std::string name) : TestCase (name)
-{
- m_sourcePort = sourcePort;
- m_destinationPort = destinationPort;
- m_sequenceNumber = sequenceNumber;
- m_ackNumber = ackNumber;
- m_flags = flags;
- m_windowSize = windowSize;
- m_urgentPointer = urgentPointer;
- m_header.SetSourcePort (m_sourcePort);
- m_header.SetDestinationPort (m_destinationPort);
- m_header.SetSequenceNumber (m_sequenceNumber);
- m_header.SetAckNumber (m_ackNumber);
- m_header.SetFlags (m_flags);
- m_header.SetWindowSize (m_windowSize);

- m_header.SetUrgentPointer (m_urgentPointer);
+TcpHeaderGetSetTestCase::TcpHeaderGetSetTestCase (std::string name) : TestCase
(name)
+{
+}
+void TcpHeaderGetSetTestCase::DoRun (void)
+{
+ uint16_t sourcePort;
//!< Source port
+ uint16_t destinationPort; //!< Destination port
+ SequenceNumber32 sequenceNumber; //!< Sequence number
+ SequenceNumber32 ackNumber;
//!< ACK number
+ uint8_t flags;
//!< Flags (really a uint6_t)
+ uint16_t windowSize;
//!< Window size
+ uint16_t urgentPointer;
//!< Urgent pointer
+ TcpHeader header;
+ Buffer buffer;
+
+ Ptr<UniformRandomVariable> x = CreateObject<UniformRandomVariable> ();
+ for (uint32_t i = 0; i < 1000; ++i)
+
{
+
sourcePort = GET_RANDOM_UINT16 (x);
+
destinationPort = GET_RANDOM_UINT16 (x);
+
sequenceNumber = SequenceNumber32 (GET_RANDOM_UINT32 (x));
+
ackNumber = SequenceNumber32 (GET_RANDOM_UINT32 (x));
+
flags = GET_RANDOM_UINT6 (x);
+
windowSize = GET_RANDOM_UINT16 (x);
+
urgentPointer = GET_RANDOM_UINT16 (x);
+
+
header.SetSourcePort (sourcePort);
+
header.SetDestinationPort (destinationPort);
+
header.SetSequenceNumber (sequenceNumber);
+
header.SetAckNumber (ackNumber);
+
header.SetFlags (flags);
+
header.SetWindowSize (windowSize);
+
header.SetUrgentPointer (urgentPointer);
- NS_TEST_ASSERT_MSG_EQ (m_header.GetLength (), 5, "TcpHeader without option is
"
+
NS_TEST_ASSERT_MSG_EQ (header.GetLength (), 5, "TcpHeader without option
is"
" not 5 word");
- m_buffer.AddAtStart (m_header.GetSerializedSize ());
- m_header.Serialize (m_buffer.Begin ());
-}
+
buffer.AddAtStart (header.GetSerializedSize ());
+
header.Serialize (buffer.Begin ());
-void TcpHeaderGetSetTestCase::DoRun (void)
-{
- NS_TEST_ASSERT_MSG_EQ (m_sourcePort, m_header.GetSourcePort (),
+
NS_TEST_ASSERT_MSG_EQ (sourcePort, header.GetSourcePort (),
"Different source port found");
- NS_TEST_ASSERT_MSG_EQ (m_destinationPort, m_header.GetDestinationPort (),
+
NS_TEST_ASSERT_MSG_EQ (destinationPort, header.GetDestinationPort (),
"Different destination port found");
- NS_TEST_ASSERT_MSG_EQ (m_sequenceNumber, m_header.GetSequenceNumber (),
+
NS_TEST_ASSERT_MSG_EQ (sequenceNumber, header.GetSequenceNumber (),
"Different sequence number found");
- NS_TEST_ASSERT_MSG_EQ (m_ackNumber, m_header.GetAckNumber (),

NS_TEST_ASSERT_MSG_EQ (ackNumber, header.GetAckNumber (),


"Different ack number found");
NS_TEST_ASSERT_MSG_EQ (m_flags, m_header.GetFlags (),
NS_TEST_ASSERT_MSG_EQ (flags, header.GetFlags (),
"Different flags found");
NS_TEST_ASSERT_MSG_EQ (m_windowSize, m_header.GetWindowSize (),
NS_TEST_ASSERT_MSG_EQ (windowSize, header.GetWindowSize (),
"Different window size found");
NS_TEST_ASSERT_MSG_EQ (m_urgentPointer, m_header.GetUrgentPointer (),
NS_TEST_ASSERT_MSG_EQ (urgentPointer, header.GetUrgentPointer (),
"Different urgent pointer found");

+
+
+

- NS_TEST_ASSERT_MSG_EQ (m_header.GetLength (), 5, "TcpHeader without option is


"
+
NS_TEST_ASSERT_MSG_EQ (header.GetLength (), 5, "TcpHeader without option
is"
" not 5 word");
- TcpHeader copyHeader;
+
TcpHeader copyHeader;
- copyHeader.Deserialize (m_buffer.Begin ());
+
copyHeader.Deserialize (buffer.Begin ());
- NS_TEST_ASSERT_MSG_EQ (m_sourcePort, copyHeader.GetSourcePort (),
+
NS_TEST_ASSERT_MSG_EQ (sourcePort, copyHeader.GetSourcePort (),
"Different source port found in deserialized header");
- NS_TEST_ASSERT_MSG_EQ (m_destinationPort, copyHeader.GetDestinationPort (),
+
NS_TEST_ASSERT_MSG_EQ (destinationPort, copyHeader.GetDestinationPort (),
"Different destination port found in deserialized head
er");
- NS_TEST_ASSERT_MSG_EQ (m_sequenceNumber, copyHeader.GetSequenceNumber (),
+
NS_TEST_ASSERT_MSG_EQ (sequenceNumber, copyHeader.GetSequenceNumber (),
"Different sequence number found in deserialized heade
r");
- NS_TEST_ASSERT_MSG_EQ (m_ackNumber, copyHeader.GetAckNumber (),
+
NS_TEST_ASSERT_MSG_EQ (ackNumber, copyHeader.GetAckNumber (),
"Different ack number found in deserialized header");
- NS_TEST_ASSERT_MSG_EQ (m_flags, copyHeader.GetFlags (),
+
NS_TEST_ASSERT_MSG_EQ (flags, copyHeader.GetFlags (),
"Different flags found in deserialized header");
- NS_TEST_ASSERT_MSG_EQ (m_windowSize, copyHeader.GetWindowSize (),
+
NS_TEST_ASSERT_MSG_EQ (windowSize, copyHeader.GetWindowSize (),
"Different window size found in deserialized header");
- NS_TEST_ASSERT_MSG_EQ (m_urgentPointer, copyHeader.GetUrgentPointer (),
+
NS_TEST_ASSERT_MSG_EQ (urgentPointer, copyHeader.GetUrgentPointer (),
"Different urgent pointer found in deserialized header
");
+
}
}
void TcpHeaderGetSetTestCase::DoTeardown (void)
@@ -313,17 +322,64 @@
}
-#define GET_RANDOM_UINT32(RandomVariable) \
- static_cast<uint32_t> (RandomVariable->GetInteger (0, UINT32_MAX))
+class TcpHeaderFlagsToString : public TestCase
+{

+public:
+ TcpHeaderFlagsToString (std::string name);
-#define GET_RANDOM_UINT16(RandomVariable) \
- static_cast<uint16_t> (RandomVariable->GetInteger (0, UINT16_MAX))
+private:
+ virtual void DoRun (void);
+};
-#define GET_RANDOM_UINT8(RandomVariable) \
- static_cast<uint8_t> (RandomVariable->GetInteger (0, UINT8_MAX))
+TcpHeaderFlagsToString::TcpHeaderFlagsToString (std::string name)
+ : TestCase (name)
+{
+}
-#define GET_RANDOM_UINT6(RandomVariable) \
- static_cast<uint8_t> (RandomVariable->GetInteger (0,
+void
+TcpHeaderFlagsToString::DoRun (void)
+{
+ std::string str, target;
+ str = TcpHeader::FlagsToString (0x0);
+ target = "";
+ NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<
" << target);
+ str = TcpHeader::FlagsToString (0x1);
+ target = "FIN";
+ NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<
" << target);
+ str = TcpHeader::FlagsToString (0x2);
+ target = "SYN";
+ NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<
" << target);
+ str = TcpHeader::FlagsToString (0x4);
+ target = "RST";
+ NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<
" << target);
+ str = TcpHeader::FlagsToString (0x8);
+ target = "PSH";
+ NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<
" << target);
+ str = TcpHeader::FlagsToString (0x10);
+ target = "ACK";
+ NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<
" << target);
+ str = TcpHeader::FlagsToString (0x20);
+ target = "URG";
+ NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<
" << target);
+ str = TcpHeader::FlagsToString (0x40);
+ target = "ECE";
+ NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<
" << target);
+ str = TcpHeader::FlagsToString (0x80);
+ target = "CWR";
+ NS_TEST_ASSERT_MSG_EQ (str, target, "str " << str <<
" << target);
+ str = TcpHeader::FlagsToString (0x3);
+ target = "FIN|SYN";

UINT8_MAX >> 2))

" does not equal target

" does not equal target

" does not equal target

" does not equal target

" does not equal target

" does not equal target

" does not equal target

" does not equal target

" does not equal target

+ NS_TEST_ASSERT_MSG_EQ (str, target, "str " <<


" << target);
+ str = TcpHeader::FlagsToString (0x5);
+ target = "FIN|RST";
+ NS_TEST_ASSERT_MSG_EQ (str, target, "str " <<
" << target);
+ str = TcpHeader::FlagsToString (0xff);
+ target = "FIN|SYN|RST|PSH|ACK|URG|ECE|CWR";
+ NS_TEST_ASSERT_MSG_EQ (str, target, "str " <<
" << target);
+ str = TcpHeader::FlagsToString (0xff, ":");
+ target = "FIN:SYN:RST:PSH:ACK:URG:ECE:CWR";
+ NS_TEST_ASSERT_MSG_EQ (str, target, "str " <<
" << target);
+}

str << " does not equal target

str << " does not equal target

str << " does not equal target

str << " does not equal target

static class TcpHeaderTestSuite : public TestSuite


{
@@ -331,26 +387,9 @@
TcpHeaderTestSuite ()
: TestSuite ("tcp-header", UNIT)
{
Ptr<UniformRandomVariable> x = CreateObject<UniformRandomVariable> ();
for (uint32_t i = 0; i < 1000; ++i)
{
std::stringstream ss;
ss << i;
AddTestCase (new TcpHeaderGetSetTestCase (GET_RANDOM_UINT16 (x),
GET_RANDOM_UINT16 (x),
SequenceNumber32 (GET_RANDOM_
UINT32 (x)),
SequenceNumber32 (GET_RANDOM_
UINT32 (x)),
GET_RANDOM_UINT6 (x),
GET_RANDOM_UINT16 (x),
GET_RANDOM_UINT16 (x),
"Case number " + ss.str ()),
TestCase::QUICK);
}
AddTestCase (new TcpHeaderWithRFC793OptionTestCase ("Test for options in RF
C 793"),
TestCase::QUICK);
+
AddTestCase (new TcpHeaderGetSetTestCase ("GetSet test cases"), TestCase::Q
UICK);
+
AddTestCase (new TcpHeaderWithRFC793OptionTestCase ("Test for options in RF
C 793"), TestCase::QUICK);
+
AddTestCase (new TcpHeaderFlagsToString ("Test flags to string function"),
TestCase::QUICK);
}
} g_TcpHeaderTestSuite;
diff -Naur ns-3.22/src/internet/test/tcp-option-test.cc ns-3.23/src/internet/tes
t/tcp-option-test.cc
--- ns-3.22/src/internet/test/tcp-option-test.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/internet/test/tcp-option-test.cc
2015-05-13 11:05:27.0000
00000 -0700

@@ -93,7 +93,7 @@
class TcpOptionTSTestCase : public TestCase
{
public:
- TcpOptionTSTestCase (std::string name, uint32_t timestamp, uint32_t echo);
+ TcpOptionTSTestCase (std::string name);
void TestSerialize ();
void TestDeserialize ();
@@ -108,19 +108,23 @@
};
-TcpOptionTSTestCase::TcpOptionTSTestCase (std::string name, uint32_t timestamp,
uint32_t echo)
+TcpOptionTSTestCase::TcpOptionTSTestCase (std::string name)
: TestCase (name)
{
- m_timestamp = timestamp;
- m_echo = echo;
}
void
TcpOptionTSTestCase::DoRun ()
{
- TestSerialize ();
- TestDeserialize ();
+ Ptr<UniformRandomVariable> x = CreateObject<UniformRandomVariable> ();
+
+ for (uint32_t i = 0; i < 1000; ++i)
+
{
+
m_timestamp = x->GetInteger ();
+
m_echo = x->GetInteger ();
+
TestSerialize ();
+
TestDeserialize ();
+
}
}
void
@@ -171,17 +175,7 @@
AddTestCase (new TcpOptionWSTestCase ("Testing window "
"scale value", i), TestCase::QUIC
K);
}
Ptr<UniformRandomVariable> x = CreateObject<UniformRandomVariable> ();
for (uint32_t i = 0; i < 1000; ++i)
{
AddTestCase (new TcpOptionTSTestCase ("Testing serialization of random
"
"values for timestamp",
x->GetInteger (),
x->GetInteger ()), TestCase::QUIC
K);
}
+
AddTestCase (new TcpOptionTSTestCase ("Testing serialization of random valu
es for timestamp"), TestCase::QUICK);
}

} g_TcpOptionTestSuite;
diff -Naur ns-3.22/src/lr-wpan/model/lr-wpan-csmaca.cc ns-3.23/src/lr-wpan/model
/lr-wpan-csmaca.cc
--- ns-3.22/src/lr-wpan/model/lr-wpan-csmaca.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lr-wpan/model/lr-wpan-csmaca.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -37,6 +37,7 @@
{
static TypeId tid = TypeId ("ns3::LrWpanCsmaCa")
.SetParent<Object> ()
+
.SetGroupName ("LrWpan")
.AddConstructor<LrWpanCsmaCa> ()
;
return tid;
@@ -239,7 +240,7 @@
symbolRate = (uint64_t) m_mac->GetPhy ()->GetDataOrSymbolRate (isData); //sym
bols per second
- backoffPeriod = (uint64_t)m_random->GetValue (0, upperBound); //num backoff p
eriods
+ backoffPeriod = (uint64_t)m_random->GetValue (0, upperBound+1); // num backof
f periods
randomBackoff = MicroSeconds (backoffPeriod * GetUnitBackoffPeriod () * 1000
* 1000 / symbolRate);
if (IsUnSlottedCsmaCa ())
diff -Naur ns-3.22/src/lr-wpan/model/lr-wpan-error-model.cc ns-3.23/src/lr-wpan/
model/lr-wpan-error-model.cc
--- ns-3.22/src/lr-wpan/model/lr-wpan-error-model.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lr-wpan/model/lr-wpan-error-model.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -33,6 +33,7 @@
{
static TypeId tid = TypeId ("ns3::LrWpanErrorModel")
.SetParent<Object> ()
+
.SetGroupName ("LrWpan")
.AddConstructor<LrWpanErrorModel> ()
;
return tid;
diff -Naur ns-3.22/src/lr-wpan/model/lr-wpan-lqi-tag.cc ns-3.23/src/lr-wpan/mode
l/lr-wpan-lqi-tag.cc
--- ns-3.22/src/lr-wpan/model/lr-wpan-lqi-tag.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lr-wpan/model/lr-wpan-lqi-tag.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -30,6 +30,7 @@
{
static TypeId tid = TypeId ("ns3::LrWpanLqiTag")
.SetParent<Tag> ()
+
.SetGroupName ("LrWpan")
.AddConstructor<LrWpanLqiTag> ()
.AddAttribute ("Lqi", "The lqi of the last packet received",
IntegerValue (0),
diff -Naur ns-3.22/src/lr-wpan/model/lr-wpan-mac.cc ns-3.23/src/lr-wpan/model/lr
-wpan-mac.cc
--- ns-3.22/src/lr-wpan/model/lr-wpan-mac.cc
2015-02-05 15:46:22.000000000 -0

800
+++ ns-3.23/src/lr-wpan/model/lr-wpan-mac.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -51,6 +51,7 @@
{
static TypeId tid = TypeId ("ns3::LrWpanMac")
.SetParent<Object> ()
+
.SetGroupName ("LrWpan")
.AddConstructor<LrWpanMac> ()
.AddAttribute ("PanId", "16-bit identifier of the associated PAN",
UintegerValue (),
diff -Naur ns-3.22/src/lr-wpan/model/lr-wpan-mac-header.cc ns-3.23/src/lr-wpan/m
odel/lr-wpan-mac-header.cc
--- ns-3.22/src/lr-wpan/model/lr-wpan-mac-header.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lr-wpan/model/lr-wpan-mac-header.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -485,6 +485,7 @@
{
static TypeId tid = TypeId ("ns3::LrWpanMacHeader")
.SetParent<Header> ()
+
.SetGroupName ("LrWpan")
.AddConstructor<LrWpanMacHeader> ();
return tid;
}
diff -Naur ns-3.22/src/lr-wpan/model/lr-wpan-mac-trailer.cc ns-3.23/src/lr-wpan/
model/lr-wpan-mac-trailer.cc
--- ns-3.22/src/lr-wpan/model/lr-wpan-mac-trailer.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lr-wpan/model/lr-wpan-mac-trailer.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -40,6 +40,7 @@
{
static TypeId tid = TypeId ("ns3::LrWpanMacTrailer")
.SetParent<Trailer> ()
+
.SetGroupName ("LrWpan")
.AddConstructor<LrWpanMacTrailer> ()
;
return tid;
diff -Naur ns-3.22/src/lr-wpan/model/lr-wpan-net-device.cc ns-3.23/src/lr-wpan/m
odel/lr-wpan-net-device.cc
--- ns-3.22/src/lr-wpan/model/lr-wpan-net-device.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lr-wpan/model/lr-wpan-net-device.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -45,6 +45,7 @@
{
static TypeId tid = TypeId ("ns3::LrWpanNetDevice")
.SetParent<NetDevice> ()
+
.SetGroupName ("LrWpan")
.AddConstructor<LrWpanNetDevice> ()
.AddAttribute ("Channel", "The channel attached to this device",
PointerValue (),
diff -Naur ns-3.22/src/lr-wpan/model/lr-wpan-phy.cc ns-3.23/src/lr-wpan/model/lr
-wpan-phy.cc
--- ns-3.22/src/lr-wpan/model/lr-wpan-phy.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lr-wpan/model/lr-wpan-phy.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -75,6 +75,7 @@

static TypeId tid = TypeId ("ns3::LrWpanPhy")


.SetParent<Object> ()
+
.SetGroupName ("LrWpan")
.AddConstructor<LrWpanPhy> ()
.AddTraceSource ("TrxState",
"The state of the transceiver",
@@ -284,7 +285,7 @@
Ptr<LrWpanSpectrumSignalParameters> lrWpanRxParams = DynamicCast<LrWpanSpectr
umSignalParameters> (spectrumRxParams);
- if ( lrWpanRxParams == 0)
+ if (lrWpanRxParams == 0)
{
CheckInterference ();
m_signal->AddSignal (spectrumRxParams->psd);
@@ -449,7 +450,11 @@
m_edPower.lastUpdate = now;
}
- CheckInterference ();
+ Ptr<LrWpanSpectrumSignalParameters> currentRxParams = m_currentRxPacket.first
;
+ if (currentRxParams == params)
+
{
+
CheckInterference ();
+
}
// Update the interference.
m_signal->RemoveSignal (par->psd);
@@ -461,7 +466,6 @@
}
// If this is the end of the currently received packet, check if reception wa
s successful.
- Ptr<LrWpanSpectrumSignalParameters> currentRxParams = m_currentRxPacket.first
;
if (currentRxParams == params)
{
Ptr<Packet> currentPacket = currentRxParams->packetBurst->GetPackets ().f
ront ();
@@ -898,7 +902,7 @@
}
if (m_phyPIBAttributes.phyCurrentChannel != attribute->phyCurrentChanne
l)
{
// Cancel a pending tranceiver state change.
+
// Cancel a pending transceiver state change.
// Switch off the transceiver.
// TODO: Is switching off the transceiver the right choice?
m_trxState = IEEE_802_15_4_PHY_TRX_OFF;
@@ -928,6 +932,8 @@
}
}
m_phyPIBAttributes.phyCurrentChannel = attribute->phyCurrentChannel
;
+
LrWpanSpectrumValueHelper psdHelper;
+
m_txPsd = psdHelper.CreateTxPowerSpectralDensity (m_phyPIBAttribute
s.phyTransmitPower, m_phyPIBAttributes.phyCurrentChannel);

}
break;

}
diff -Naur ns-3.22/src/lr-wpan/test/lr-wpan-collision-test.cc ns-3.23/src/lr-wpa
n/test/lr-wpan-collision-test.cc
--- ns-3.22/src/lr-wpan/test/lr-wpan-collision-test.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lr-wpan/test/lr-wpan-collision-test.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -189,7 +189,7 @@
Simulator::Run ();
std::cout << "m_rxPackets = " << int(m_rxPackets) << std::endl;
- NS_TEST_EXPECT_MSG_EQ (m_rxPackets, 0, "Received a packet (as expected)");
+ NS_TEST_EXPECT_MSG_EQ (m_rxPackets, 1, "Received a packet (as expected)");
// Fourth case: two concurrent tx and ACKs
std::cout << "*** Fourth test " << std::endl;
diff -Naur ns-3.22/src/lte/bindings/callbacks_list.py ns-3.23/src/lte/bindings/c
allbacks_list.py
--- ns-3.22/src/lte/bindings/callbacks_list.py 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/bindings/callbacks_list.py 2015-05-13 11:05:27.000000000 -0
700
@@ -1,5 +1,4 @@
callback_classes = [
['void', 'ns3::Ptr<ns3::Packet const>', 'ns3::empty', 'ns3::empty', 'ns3::e
mpty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
['void', 'ns3::Ptr<ns3::Packet>', 'ns3::empty', 'ns3::empty', 'ns3::empty',
'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
['void', 'unsigned short', 'ns3::Ptr<ns3::SpectrumValue>', 'ns3::empty', 'n
s3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'
],
['void', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empt
y', 'ns3::empty', 'ns3::empty', 'ns3::empty', 'ns3::empty'],
diff -Naur ns-3.22/src/lte/bindings/modulegen__gcc_ILP32.py ns-3.23/src/lte/bind
ings/modulegen__gcc_ILP32.py
--- ns-3.22/src/lte/bindings/modulegen__gcc_ILP32.py
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/bindings/modulegen__gcc_ILP32.py
2015-05-13 11:05:27.0000
00000 -0700
@@ -562,6 +562,8 @@
module.add_class('ThresholdEutra', outer_class=root_module['ns3::LteRrcSap'
])
## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::ThresholdEutra [enumeratio
n]
module.add_enum('', ['THRESHOLD_RSRP', 'THRESHOLD_RSRQ'], outer_class=root_
module['ns3::LteRrcSap::ThresholdEutra'])
+
## lte-chunk-processor.h (module 'lte'): ns3::LteSpectrumValueCatcher [clas
s]
+
module.add_class('LteSpectrumValueCatcher')
## lte-spectrum-value-helper.h (module 'lte'): ns3::LteSpectrumValueHelper
[class]
module.add_class('LteSpectrumValueHelper')
## lte-ue-cmac-sap.h (module 'lte'): ns3::LteUeCmacSapProvider [class]
@@ -1119,7 +1121,7 @@
## lte-spectrum-phy.h (module 'lte'): ns3::LteSpectrumPhy [class]
module.add_class('LteSpectrumPhy', parent=root_module['ns3::SpectrumPhy'])
## lte-spectrum-phy.h (module 'lte'): ns3::LteSpectrumPhy::State [enumerati
on]

module.add_enum('State', ['IDLE', 'TX', 'RX_DATA', 'RX_CTRL'], outer_class=


root_module['ns3::LteSpectrumPhy'])
+
module.add_enum('State', ['IDLE', 'TX_DL_CTRL', 'TX_DATA', 'TX_UL_SRS', 'RX
_DL_CTRL', 'RX_DATA', 'RX_UL_SRS'], outer_class=root_module['ns3::LteSpectrumPhy
'])
## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalP
arameters [struct]
module.add_class('LteSpectrumSignalParameters', parent=root_module['ns3::Sp
ectrumSignalParameters'])
## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalP
arametersDataFrame [struct]
@@ -1790,6 +1792,7 @@
register_Ns3LteRrcSapSystemInformationBlockType1_methods(root_module, root_
module['ns3::LteRrcSap::SystemInformationBlockType1'])
register_Ns3LteRrcSapSystemInformationBlockType2_methods(root_module, root_
module['ns3::LteRrcSap::SystemInformationBlockType2'])
register_Ns3LteRrcSapThresholdEutra_methods(root_module, root_module['ns3::
LteRrcSap::ThresholdEutra'])
+
register_Ns3LteSpectrumValueCatcher_methods(root_module, root_module['ns3::
LteSpectrumValueCatcher'])
register_Ns3LteSpectrumValueHelper_methods(root_module, root_module['ns3::L
teSpectrumValueHelper'])
register_Ns3LteUeCmacSapProvider_methods(root_module, root_module['ns3::Lte
UeCmacSapProvider'])
register_Ns3LteUeCmacSapProviderLogicalChannelConfig_methods(root_module, r
oot_module['ns3::LteUeCmacSapProvider::LogicalChannelConfig'])
@@ -2822,11 +2825,21 @@
cls.add_constructor([param('uint64_t', 'bps')])
## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate
) [constructor]
cls.add_constructor([param('std::string', 'rate')])
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTx
Time(uint32_t bits) const [member function]
+
cls.add_method('CalculateBitsTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bits')],
+
is_const=True)
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesT
xTime(uint32_t bytes) const [member function]
+
cls.add_method('CalculateBytesTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bytes')],
+
is_const=True)
## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(ui
nt32_t bytes) const [member function]
cls.add_method('CalculateTxTime',
'double',
[param('uint32_t', 'bytes')],
is_const=True)
+
deprecated=True, is_const=True)
## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() con
st [member function]
cls.add_method('GetBitRate',
'uint64_t',
@@ -6876,6 +6889,21 @@
cls.add_instance_attribute('range', 'uint8_t', is_const=False)
return
+def register_Ns3LteSpectrumValueCatcher_methods(root_module, cls):
+
## lte-chunk-processor.h (module 'lte'): ns3::LteSpectrumValueCatcher::LteS

pectrumValueCatcher() [constructor]
+
cls.add_constructor([])
+
## lte-chunk-processor.h (module 'lte'): ns3::LteSpectrumValueCatcher::LteS
pectrumValueCatcher(ns3::LteSpectrumValueCatcher const & arg0) [copy constructor
]
+
cls.add_constructor([param('ns3::LteSpectrumValueCatcher const &', 'arg0')]
)
+
## lte-chunk-processor.h (module 'lte'): ns3::Ptr<ns3::SpectrumValue> ns3::
LteSpectrumValueCatcher::GetValue() [member function]
+
cls.add_method('GetValue',
+
'ns3::Ptr< ns3::SpectrumValue >',
+
[])
+
## lte-chunk-processor.h (module 'lte'): void ns3::LteSpectrumValueCatcher:
:ReportValue(ns3::SpectrumValue const & value) [member function]
+
cls.add_method('ReportValue',
+
'void',
+
[param('ns3::SpectrumValue const &', 'value')])
+
return
+
def register_Ns3LteSpectrumValueHelper_methods(root_module, cls):
## lte-spectrum-value-helper.h (module 'lte'): ns3::LteSpectrumValueHelper:
:LteSpectrumValueHelper() [constructor]
cls.add_constructor([])
@@ -9699,6 +9727,14 @@
'bool',
[],
is_const=True)
+
## lte-rlc-am-header.h (module 'lte'): bool ns3::LteRlcAmHeader::IsNackPres
ent(ns3::SequenceNumber10 nack) [member function]
+
cls.add_method('IsNackPresent',
+
'bool',
+
[param('ns3::SequenceNumber10', 'nack')])
+
## lte-rlc-am-header.h (module 'lte'): bool ns3::LteRlcAmHeader::OneMoreNac
kWouldFitIn(uint16_t bytes) [member function]
+
cls.add_method('OneMoreNackWouldFitIn',
+
'bool',
+
[param('uint16_t', 'bytes')])
## lte-rlc-am-header.h (module 'lte'): uint8_t ns3::LteRlcAmHeader::PopExte
nsionBit() [member function]
cls.add_method('PopExtensionBit',
'uint8_t',
@@ -9707,6 +9743,10 @@
cls.add_method('PopLengthIndicator',
'uint16_t',
[])
+
## lte-rlc-am-header.h (module 'lte'): int ns3::LteRlcAmHeader::PopNack() [
member function]
+
cls.add_method('PopNack',
+
'int',
+
[])
## lte-rlc-am-header.h (module 'lte'): void ns3::LteRlcAmHeader::Print(std:
:ostream & os) const [member function]
cls.add_method('Print',
'void',
@@ -9720,6 +9760,10 @@
cls.add_method('PushLengthIndicator',
'void',
[param('uint16_t', 'lengthIndicator')])
+
## lte-rlc-am-header.h (module 'lte'): void ns3::LteRlcAmHeader::PushNack(i
nt nack) [member function]

+
+
+

cls.add_method('PushNack',
'void',
[param('int', 'nack')])
## lte-rlc-am-header.h (module 'lte'): void ns3::LteRlcAmHeader::Serialize(
ns3::Buffer::Iterator start) const [member function]
cls.add_method('Serialize',
'void',
@@ -16875,10 +16919,14 @@
cls.add_method('StartRxData',
'void',
[param('ns3::Ptr< ns3::LteSpectrumSignalParametersDataFrame
>', 'params')])
## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRxCtrl
(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
cls.add_method('StartRxCtrl',
+
## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRxDlCt
rl(ns3::Ptr<ns3::LteSpectrumSignalParametersDlCtrlFrame> lteDlCtrlRxParams) [mem
ber function]
+
cls.add_method('StartRxDlCtrl',
+
'void',
+
[param('ns3::Ptr< ns3::LteSpectrumSignalParametersDlCtrlFram
e >', 'lteDlCtrlRxParams')])
+
## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRxUlSr
s(ns3::Ptr<ns3::LteSpectrumSignalParametersUlSrsFrame> lteUlSrsRxParams) [member
function]
+
cls.add_method('StartRxUlSrs',
'void',
[param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'params'
)])
+
[param('ns3::Ptr< ns3::LteSpectrumSignalParametersUlSrsFrame
>', 'lteUlSrsRxParams')])
## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::SetHarqPhyM
odule(ns3::Ptr<ns3::LteHarqPhy> harq) [member function]
cls.add_method('SetHarqPhyModule',
'void',
diff -Naur ns-3.22/src/lte/bindings/modulegen__gcc_LP64.py ns-3.23/src/lte/bindi
ngs/modulegen__gcc_LP64.py
--- ns-3.22/src/lte/bindings/modulegen__gcc_LP64.py
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/bindings/modulegen__gcc_LP64.py
2015-05-13 11:05:27.0000
00000 -0700
@@ -562,6 +562,8 @@
module.add_class('ThresholdEutra', outer_class=root_module['ns3::LteRrcSap'
])
## lte-rrc-sap.h (module 'lte'): ns3::LteRrcSap::ThresholdEutra [enumeratio
n]
module.add_enum('', ['THRESHOLD_RSRP', 'THRESHOLD_RSRQ'], outer_class=root_
module['ns3::LteRrcSap::ThresholdEutra'])
+
## lte-chunk-processor.h (module 'lte'): ns3::LteSpectrumValueCatcher [clas
s]
+
module.add_class('LteSpectrumValueCatcher')
## lte-spectrum-value-helper.h (module 'lte'): ns3::LteSpectrumValueHelper
[class]
module.add_class('LteSpectrumValueHelper')
## lte-ue-cmac-sap.h (module 'lte'): ns3::LteUeCmacSapProvider [class]
@@ -1119,7 +1121,7 @@
## lte-spectrum-phy.h (module 'lte'): ns3::LteSpectrumPhy [class]
module.add_class('LteSpectrumPhy', parent=root_module['ns3::SpectrumPhy'])
## lte-spectrum-phy.h (module 'lte'): ns3::LteSpectrumPhy::State [enumerati
on]

module.add_enum('State', ['IDLE', 'TX', 'RX_DATA', 'RX_CTRL'], outer_class=


root_module['ns3::LteSpectrumPhy'])
+
module.add_enum('State', ['IDLE', 'TX_DL_CTRL', 'TX_DATA', 'TX_UL_SRS', 'RX
_DL_CTRL', 'RX_DATA', 'RX_UL_SRS'], outer_class=root_module['ns3::LteSpectrumPhy
'])
## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalP
arameters [struct]
module.add_class('LteSpectrumSignalParameters', parent=root_module['ns3::Sp
ectrumSignalParameters'])
## lte-spectrum-signal-parameters.h (module 'lte'): ns3::LteSpectrumSignalP
arametersDataFrame [struct]
@@ -1790,6 +1792,7 @@
register_Ns3LteRrcSapSystemInformationBlockType1_methods(root_module, root_
module['ns3::LteRrcSap::SystemInformationBlockType1'])
register_Ns3LteRrcSapSystemInformationBlockType2_methods(root_module, root_
module['ns3::LteRrcSap::SystemInformationBlockType2'])
register_Ns3LteRrcSapThresholdEutra_methods(root_module, root_module['ns3::
LteRrcSap::ThresholdEutra'])
+
register_Ns3LteSpectrumValueCatcher_methods(root_module, root_module['ns3::
LteSpectrumValueCatcher'])
register_Ns3LteSpectrumValueHelper_methods(root_module, root_module['ns3::L
teSpectrumValueHelper'])
register_Ns3LteUeCmacSapProvider_methods(root_module, root_module['ns3::Lte
UeCmacSapProvider'])
register_Ns3LteUeCmacSapProviderLogicalChannelConfig_methods(root_module, r
oot_module['ns3::LteUeCmacSapProvider::LogicalChannelConfig'])
@@ -2822,11 +2825,21 @@
cls.add_constructor([param('uint64_t', 'bps')])
## data-rate.h (module 'network'): ns3::DataRate::DataRate(std::string rate
) [constructor]
cls.add_constructor([param('std::string', 'rate')])
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBitsTx
Time(uint32_t bits) const [member function]
+
cls.add_method('CalculateBitsTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bits')],
+
is_const=True)
+
## data-rate.h (module 'network'): ns3::Time ns3::DataRate::CalculateBytesT
xTime(uint32_t bytes) const [member function]
+
cls.add_method('CalculateBytesTxTime',
+
'ns3::Time',
+
[param('uint32_t', 'bytes')],
+
is_const=True)
## data-rate.h (module 'network'): double ns3::DataRate::CalculateTxTime(ui
nt32_t bytes) const [member function]
cls.add_method('CalculateTxTime',
'double',
[param('uint32_t', 'bytes')],
is_const=True)
+
deprecated=True, is_const=True)
## data-rate.h (module 'network'): uint64_t ns3::DataRate::GetBitRate() con
st [member function]
cls.add_method('GetBitRate',
'uint64_t',
@@ -6876,6 +6889,21 @@
cls.add_instance_attribute('range', 'uint8_t', is_const=False)
return
+def register_Ns3LteSpectrumValueCatcher_methods(root_module, cls):
+
## lte-chunk-processor.h (module 'lte'): ns3::LteSpectrumValueCatcher::LteS

pectrumValueCatcher() [constructor]
+
cls.add_constructor([])
+
## lte-chunk-processor.h (module 'lte'): ns3::LteSpectrumValueCatcher::LteS
pectrumValueCatcher(ns3::LteSpectrumValueCatcher const & arg0) [copy constructor
]
+
cls.add_constructor([param('ns3::LteSpectrumValueCatcher const &', 'arg0')]
)
+
## lte-chunk-processor.h (module 'lte'): ns3::Ptr<ns3::SpectrumValue> ns3::
LteSpectrumValueCatcher::GetValue() [member function]
+
cls.add_method('GetValue',
+
'ns3::Ptr< ns3::SpectrumValue >',
+
[])
+
## lte-chunk-processor.h (module 'lte'): void ns3::LteSpectrumValueCatcher:
:ReportValue(ns3::SpectrumValue const & value) [member function]
+
cls.add_method('ReportValue',
+
'void',
+
[param('ns3::SpectrumValue const &', 'value')])
+
return
+
def register_Ns3LteSpectrumValueHelper_methods(root_module, cls):
## lte-spectrum-value-helper.h (module 'lte'): ns3::LteSpectrumValueHelper:
:LteSpectrumValueHelper() [constructor]
cls.add_constructor([])
@@ -9699,6 +9727,14 @@
'bool',
[],
is_const=True)
+
## lte-rlc-am-header.h (module 'lte'): bool ns3::LteRlcAmHeader::IsNackPres
ent(ns3::SequenceNumber10 nack) [member function]
+
cls.add_method('IsNackPresent',
+
'bool',
+
[param('ns3::SequenceNumber10', 'nack')])
+
## lte-rlc-am-header.h (module 'lte'): bool ns3::LteRlcAmHeader::OneMoreNac
kWouldFitIn(uint16_t bytes) [member function]
+
cls.add_method('OneMoreNackWouldFitIn',
+
'bool',
+
[param('uint16_t', 'bytes')])
## lte-rlc-am-header.h (module 'lte'): uint8_t ns3::LteRlcAmHeader::PopExte
nsionBit() [member function]
cls.add_method('PopExtensionBit',
'uint8_t',
@@ -9707,6 +9743,10 @@
cls.add_method('PopLengthIndicator',
'uint16_t',
[])
+
## lte-rlc-am-header.h (module 'lte'): int ns3::LteRlcAmHeader::PopNack() [
member function]
+
cls.add_method('PopNack',
+
'int',
+
[])
## lte-rlc-am-header.h (module 'lte'): void ns3::LteRlcAmHeader::Print(std:
:ostream & os) const [member function]
cls.add_method('Print',
'void',
@@ -9720,6 +9760,10 @@
cls.add_method('PushLengthIndicator',
'void',
[param('uint16_t', 'lengthIndicator')])
+
## lte-rlc-am-header.h (module 'lte'): void ns3::LteRlcAmHeader::PushNack(i
nt nack) [member function]

+
+
+

cls.add_method('PushNack',
'void',
[param('int', 'nack')])
## lte-rlc-am-header.h (module 'lte'): void ns3::LteRlcAmHeader::Serialize(
ns3::Buffer::Iterator start) const [member function]
cls.add_method('Serialize',
'void',
@@ -16875,10 +16919,14 @@
cls.add_method('StartRxData',
'void',
[param('ns3::Ptr< ns3::LteSpectrumSignalParametersDataFrame
>', 'params')])
## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRxCtrl
(ns3::Ptr<ns3::SpectrumSignalParameters> params) [member function]
cls.add_method('StartRxCtrl',
+
## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRxDlCt
rl(ns3::Ptr<ns3::LteSpectrumSignalParametersDlCtrlFrame> lteDlCtrlRxParams) [mem
ber function]
+
cls.add_method('StartRxDlCtrl',
+
'void',
+
[param('ns3::Ptr< ns3::LteSpectrumSignalParametersDlCtrlFram
e >', 'lteDlCtrlRxParams')])
+
## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::StartRxUlSr
s(ns3::Ptr<ns3::LteSpectrumSignalParametersUlSrsFrame> lteUlSrsRxParams) [member
function]
+
cls.add_method('StartRxUlSrs',
'void',
[param('ns3::Ptr< ns3::SpectrumSignalParameters >', 'params'
)])
+
[param('ns3::Ptr< ns3::LteSpectrumSignalParametersUlSrsFrame
>', 'lteUlSrsRxParams')])
## lte-spectrum-phy.h (module 'lte'): void ns3::LteSpectrumPhy::SetHarqPhyM
odule(ns3::Ptr<ns3::LteHarqPhy> harq) [member function]
cls.add_method('SetHarqPhyModule',
'void',
diff -Naur ns-3.22/src/lte/doc/source/lte-design.rst ns-3.23/src/lte/doc/source/
lte-design.rst
--- ns-3.22/src/lte/doc/source/lte-design.rst 2015-02-05 15:46:23.000000000 -0
800
+++ ns-3.23/src/lte/doc/source/lte-design.rst 2015-05-13 11:05:27.000000000 -0
700
@@ -503,7 +503,7 @@
of periodic wideband CQI (i.e., a single value of channel state that is deemed
representative of all RBs
in use) and inband CQIs (i.e., a set of value representing the channel state fo
r each RB).
-The CQI index to be reported is obtained by first obtaining a SINR measurement
and then passing this SINR measurement the :ref:`Adaptive Modulation and Coding
` which will map it to the CQI index.
+The CQI index to be reported is obtained by first obtaining a SINR measurement
and then passing this SINR measurement to the `Adaptive Modulation and Coding`_
module which will map it to the CQI index.
In downlink, the SINR used to generate CQI feedback can be calculated in two di
fferent ways:
diff -Naur ns-3.22/src/lte/doc/source/lte-testing.rst ns-3.23/src/lte/doc/source
/lte-testing.rst
--- ns-3.22/src/lte/doc/source/lte-testing.rst 2015-02-05 15:46:23.000000000 -0

800
+++ ns-3.23/src/lte/doc/source/lte-testing.rst 2015-05-13 11:05:27.000000000 -0
700
@@ -113,12 +113,6 @@
each element in the test vector.
-

System Tests
~~~~~~~~~~~~

@@ -130,25 +124,26 @@
Attach UE -> Create Default+Dedicated Bearer -> Deactivate one of the Dedicated
bearer
Test case further deactivates dedicated bearer having bearer ID 2(LCID=BearerId
+2) of First UE (UE_ID=1)
-User can schedule bearer deactivation after specific time delay using Simulator
::Schedule () method.
+User can schedule bearer deactivation after specific time delay using Simulator
::Schedule () method.
+
+Once the test case execution ends it will create ``DlRlcStats.txt`` and ``UlRlc
Stats.txt``. Key fields that need to be checked in statistics are:
-Once the test case execution ends it will create DlRlcStats.txt and UlRlcStats.
txt.
-Key fields that need to be checked in statistics are:
-|Start | end | Cell ID | IMSI | RNTI | LCID | TxBytes | RxBytes |
-Test case executes in three epoch s.
-1) In first Epoch (0.04s-1.04s) All UE s and corresponding bearers gets attached
- and packet flow over the dedicated bearers activated.
-2) In second Epoch (1.04s-2.04s), bearer deactivation is instantiated, hence Us
er can see
- relatively less number of TxBytes on UE_ID=1 and LCID=4 as compared to other
bearers.
-3) 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.
+::
+
+ |Start | end | Cell ID | IMSI | RNTI | LCID | TxBytes | RxBytes |
+
+Test case executes in three epochs:
+
+ #. In first Epoch (0.04s-1.04s) All UE s and corresponding bearers gets attached a
nd packet flow over the dedicated bearers activated.
+ #. In second Epoch (1.04s-2.04s), bearer deactivation is instantiated, hence U
ser 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.
Test case passes if and only if

-1) IMSI=1 and LCID=4 completely removed in third epoch


-2) No packets seen in TxBytes and RxBytes corresponding to IMSI=1 and LCID=4
-If above criterion does not match test case considered to be failed
+ #. IMSI=1 and LCID=4 completely removed in third epoch
+ #. No packets seen in TxBytes and RxBytes corresponding to IMSI=1 and LCID=4
+
+If above criteria do not match, the test case is considered to be failed
.. _sec-lte-amc-tests:
@@ -1025,6 +1020,17 @@
PDU are verified to check for an exact match with the test vector.
+The AM RLC implementation features an additional test suite,
+``lte-rlc-am-e2e``, which test the correct retransmission of RLC PDUs
+in presence of channel losses. The test instantiates an RLC AM
+transmitter and a receiver, and interposes a channel that randomly
+drops packet according to a fixed loss probability. Different test
+cases are instantiated using different ``RngRun`` values and different
+loss probability values. Each test case passes if at the end of the
+simulation all SDUs are correctly delivered to the upper layers of the
+receiving RLC AM entity.
+
+
RRC
--diff -Naur ns-3.22/src/lte/helper/emu-epc-helper.cc ns-3.23/src/lte/helper/emu-e
pc-helper.cc
--- ns-3.22/src/lte/helper/emu-epc-helper.cc
2015-02-05 15:46:23.000000000 -0
800
+++ ns-3.23/src/lte/helper/emu-epc-helper.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -69,6 +69,7 @@
{
static TypeId tid = TypeId ("ns3::EmuEpcHelper")
.SetParent<EpcHelper> ()
+
.SetGroupName("Lte")
.AddConstructor<EmuEpcHelper> ()
.AddAttribute ("sgwDeviceName",
"The name of the device used for the S1-U interface of the S
GW",
diff -Naur ns-3.22/src/lte/helper/epc-helper.cc ns-3.23/src/lte/helper/epc-helpe
r.cc
--- ns-3.22/src/lte/helper/epc-helper.cc
2015-02-05 15:46:23.000000000 -0
800
+++ ns-3.23/src/lte/helper/epc-helper.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -47,6 +47,7 @@
{
static TypeId tid = TypeId ("ns3::EpcHelper")
.SetParent<Object> ()
+
.SetGroupName("Lte")
;
return tid;
}
diff -Naur ns-3.22/src/lte/helper/lte-stats-calculator.cc ns-3.23/src/lte/helper
/lte-stats-calculator.cc

--- ns-3.22/src/lte/helper/lte-stats-calculator.cc
2015-02-05 15:46:23.0000
00000 -0800
+++ ns-3.23/src/lte/helper/lte-stats-calculator.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -52,6 +52,7 @@
{
static TypeId tid = TypeId ("ns3::LteStatsCalculator")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddConstructor<LteStatsCalculator> ()
;
return tid;
diff -Naur ns-3.22/src/lte/helper/mac-stats-calculator.cc ns-3.23/src/lte/helper
/mac-stats-calculator.cc
--- ns-3.22/src/lte/helper/mac-stats-calculator.cc
2015-02-05 15:46:23.0000
00000 -0800
+++ ns-3.23/src/lte/helper/mac-stats-calculator.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -47,6 +47,7 @@
{
static TypeId tid = TypeId ("ns3::MacStatsCalculator")
.SetParent<LteStatsCalculator> ()
+
.SetGroupName("Lte")
.AddConstructor<MacStatsCalculator> ()
.AddAttribute ("DlOutputFilename",
"Name of the file where the downlink results will be saved."
,
diff -Naur ns-3.22/src/lte/helper/phy-rx-stats-calculator.cc ns-3.23/src/lte/hel
per/phy-rx-stats-calculator.cc
--- ns-3.22/src/lte/helper/phy-rx-stats-calculator.cc 2015-02-05 15:46:23.0000
00000 -0800
+++ ns-3.23/src/lte/helper/phy-rx-stats-calculator.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -49,6 +49,7 @@
{
static TypeId tid = TypeId ("ns3::PhyRxStatsCalculator")
.SetParent<LteStatsCalculator> ()
+
.SetGroupName("Lte")
.AddConstructor<PhyRxStatsCalculator> ()
.AddAttribute ("DlRxOutputFilename",
"Name of the file where the downlink results will be saved."
,
diff -Naur ns-3.22/src/lte/helper/phy-stats-calculator.cc ns-3.23/src/lte/helper
/phy-stats-calculator.cc
--- ns-3.22/src/lte/helper/phy-stats-calculator.cc
2015-02-05 15:46:23.0000
00000 -0800
+++ ns-3.23/src/lte/helper/phy-stats-calculator.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -48,6 +48,7 @@
{
static TypeId tid = TypeId ("ns3::PhyStatsCalculator")
.SetParent<LteStatsCalculator> ()
+
.SetGroupName("Lte")
.AddConstructor<PhyStatsCalculator> ()
.AddAttribute ("DlRsrpSinrFilename",
"Name of the file where the RSRP/SINR statistics will be sav
ed.",
diff -Naur ns-3.22/src/lte/helper/phy-tx-stats-calculator.cc ns-3.23/src/lte/hel
per/phy-tx-stats-calculator.cc
--- ns-3.22/src/lte/helper/phy-tx-stats-calculator.cc 2015-02-05 15:46:23.0000

00000 -0800
+++ ns-3.23/src/lte/helper/phy-tx-stats-calculator.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -49,6 +49,7 @@
{
static TypeId tid = TypeId ("ns3::PhyTxStatsCalculator")
.SetParent<LteStatsCalculator> ()
+
.SetGroupName("Lte")
.AddConstructor<PhyTxStatsCalculator> ()
.AddAttribute ("DlTxOutputFilename",
"Name of the file where the downlink results will be saved."
,
diff -Naur ns-3.22/src/lte/helper/point-to-point-epc-helper.cc ns-3.23/src/lte/h
elper/point-to-point-epc-helper.cc
--- ns-3.22/src/lte/helper/point-to-point-epc-helper.cc 2015-02-05 15:46:23.0000
00000 -0800
+++ ns-3.23/src/lte/helper/point-to-point-epc-helper.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -112,6 +112,7 @@
{
static TypeId tid = TypeId ("ns3::PointToPointEpcHelper")
.SetParent<EpcHelper> ()
+
.SetGroupName("Lte")
.AddConstructor<PointToPointEpcHelper> ()
.AddAttribute ("S1uLinkDataRate",
"The data rate to be used for the next S1-U link to be creat
ed",
diff -Naur ns-3.22/src/lte/helper/radio-bearer-stats-calculator.cc ns-3.23/src/l
te/helper/radio-bearer-stats-calculator.cc
--- ns-3.22/src/lte/helper/radio-bearer-stats-calculator.cc
2015-02-05 15:46
:23.000000000 -0800
+++ ns-3.23/src/lte/helper/radio-bearer-stats-calculator.cc
2015-05-13 11:05
:27.000000000 -0700
@@ -59,6 +59,7 @@
static TypeId tid =
TypeId ("ns3::RadioBearerStatsCalculator")
.SetParent<LteStatsCalculator> ().AddConstructor<RadioBearerStatsCalculator
> ()
+
.SetGroupName("Lte")
.AddAttribute ("StartTime", "Start time of the on going epoch.",
TimeValue (Seconds (0.)),
MakeTimeAccessor (&RadioBearerStatsCalculator::SetStartTime,
diff -Naur ns-3.22/src/lte/helper/radio-environment-map-helper.cc ns-3.23/src/lt
e/helper/radio-environment-map-helper.cc
--- ns-3.22/src/lte/helper/radio-environment-map-helper.cc
2015-02-05 15:46
:23.000000000 -0800
+++ ns-3.23/src/lte/helper/radio-environment-map-helper.cc
2015-05-13 11:05
:27.000000000 -0700
@@ -70,6 +70,7 @@
NS_LOG_FUNCTION ("RadioEnvironmentMapHelper::GetTypeId");
static TypeId tid = TypeId ("ns3::RadioEnvironmentMapHelper")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddConstructor<RadioEnvironmentMapHelper> ()
.AddAttribute ("ChannelPath", "The path to the channel for which the Radio
Environment Map is to be generated",
StringValue ("/ChannelList/0"),
diff -Naur ns-3.22/src/lte/model/a2-a4-rsrq-handover-algorithm.cc ns-3.23/src/lt
e/model/a2-a4-rsrq-handover-algorithm.cc
--- ns-3.22/src/lte/model/a2-a4-rsrq-handover-algorithm.cc
2015-02-05 15:46

:23.000000000 -0800
+++ ns-3.23/src/lte/model/a2-a4-rsrq-handover-algorithm.cc
2015-05-13 11:05
:27.000000000 -0700
@@ -64,6 +64,7 @@
{
static TypeId tid = TypeId ("ns3::A2A4RsrqHandoverAlgorithm")
.SetParent<LteHandoverAlgorithm> ()
+
.SetGroupName("Lte")
.AddConstructor<A2A4RsrqHandoverAlgorithm> ()
.AddAttribute ("ServingCellThreshold",
"If the RSRQ of the serving cell is worse than this "
diff -Naur ns-3.22/src/lte/model/a3-rsrp-handover-algorithm.cc ns-3.23/src/lte/m
odel/a3-rsrp-handover-algorithm.cc
--- ns-3.22/src/lte/model/a3-rsrp-handover-algorithm.cc 2015-02-05 15:46:23.0000
00000 -0800
+++ ns-3.23/src/lte/model/a3-rsrp-handover-algorithm.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -51,6 +51,7 @@
{
static TypeId tid = TypeId ("ns3::A3RsrpHandoverAlgorithm")
.SetParent<LteHandoverAlgorithm> ()
+
.SetGroupName("Lte")
.AddConstructor<A3RsrpHandoverAlgorithm> ()
.AddAttribute ("Hysteresis",
"Handover margin (hysteresis) in dB "
diff -Naur ns-3.22/src/lte/model/cqa-ff-mac-scheduler.cc ns-3.23/src/lte/model/c
qa-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/cqa-ff-mac-scheduler.cc
2015-02-05 15:46:23.0000
00000 -0800
+++ ns-3.23/src/lte/model/cqa-ff-mac-scheduler.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -300,6 +300,7 @@
{
static TypeId tid = TypeId ("ns3::CqaFfMacScheduler")
.SetParent<FfMacScheduler> ()
+
.SetGroupName("Lte")
.AddConstructor<CqaFfMacScheduler>()
.AddAttribute ("CqiTimerThreshold",
"The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/epc-enb-application.cc ns-3.23/src/lte/model/ep
c-enb-application.cc
--- ns-3.22/src/lte/model/epc-enb-application.cc
2015-02-05 15:46:23.0000
00000 -0800
+++ ns-3.23/src/lte/model/epc-enb-application.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -62,7 +62,8 @@
EpcEnbApplication::GetTypeId (void)
{
static TypeId tid = TypeId ("ns3::EpcEnbApplication")
.SetParent<Object> ();
+
.SetParent<Object> ()
+
.SetGroupName("Lte");
return tid;
}
diff -Naur ns-3.22/src/lte/model/epc-gtpu-header.cc ns-3.23/src/lte/model/epc-gt
pu-header.cc
--- ns-3.22/src/lte/model/epc-gtpu-header.cc
2015-02-05 15:46:23.000000000 -0
800
+++ ns-3.23/src/lte/model/epc-gtpu-header.cc
2015-05-13 11:05:27.000000000 -0

700
@@ -35,9 +35,9 @@
TypeId
GtpuHeader::GetTypeId (void)
{
- static TypeId tid =
TypeId ("ns3::GtpuHeader")
+ static TypeId tid = TypeId ("ns3::GtpuHeader")
.SetParent<Header> ()
+
.SetGroupName("Lte")
.AddConstructor<GtpuHeader> ();
return tid;
}
diff -Naur ns-3.22/src/lte/model/epc-mme.cc ns-3.23/src/lte/model/epc-mme.cc
--- ns-3.22/src/lte/model/epc-mme.cc
2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/epc-mme.cc
2015-05-13 11:05:27.000000000 -0700
@@ -59,6 +59,7 @@
{
static TypeId tid = TypeId ("ns3::EpcMme")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddConstructor<EpcMme> ()
;
return tid;
diff -Naur ns-3.22/src/lte/model/epc-sgw-pgw-application.cc ns-3.23/src/lte/mode
l/epc-sgw-pgw-application.cc
--- ns-3.22/src/lte/model/epc-sgw-pgw-application.cc
2015-02-05 15:46:23.0000
00000 -0800
+++ ns-3.23/src/lte/model/epc-sgw-pgw-application.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -100,7 +100,8 @@
EpcSgwPgwApplication::GetTypeId (void)
{
static TypeId tid = TypeId ("ns3::EpcSgwPgwApplication")
.SetParent<Object> ();
+
.SetParent<Object> ()
+
.SetGroupName("Lte");
return tid;
}
diff -Naur ns-3.22/src/lte/model/epc-ue-nas.cc ns-3.23/src/lte/model/epc-ue-nas.
cc
--- ns-3.22/src/lte/model/epc-ue-nas.cc 2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/epc-ue-nas.cc 2015-05-13 11:05:27.000000000 -0700
@@ -85,6 +85,7 @@
{
static TypeId tid = TypeId ("ns3::EpcUeNas")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddConstructor<EpcUeNas> ()
.AddTraceSource ("StateTransition",
"fired upon every UE NAS state transition",
diff -Naur ns-3.22/src/lte/model/epc-x2.cc ns-3.23/src/lte/model/epc-x2.cc
--- ns-3.22/src/lte/model/epc-x2.cc
2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/epc-x2.cc
2015-05-13 11:05:27.000000000 -0700
@@ -109,7 +109,8 @@
EpcX2::GetTypeId (void)
{
static TypeId tid = TypeId ("ns3::EpcX2")
.SetParent<Object> ();

+
+
}

.SetParent<Object> ()
.SetGroupName("Lte");
return tid;

diff -Naur ns-3.22/src/lte/model/epc-x2-header.cc ns-3.23/src/lte/model/epc-x2-h


eader.cc
--- ns-3.22/src/lte/model/epc-x2-header.cc
2015-02-05 15:46:23.000000000 -0
800
+++ ns-3.23/src/lte/model/epc-x2-header.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -49,6 +49,7 @@
{
static TypeId tid = TypeId ("ns3::EpcX2Header")
.SetParent<Header> ()
+
.SetGroupName("Lte")
.AddConstructor<EpcX2Header> ()
;
return tid;
@@ -173,6 +174,7 @@
{
static TypeId tid = TypeId ("ns3::EpcX2HandoverRequestHeader")
.SetParent<Header> ()
+
.SetGroupName("Lte")
.AddConstructor<EpcX2HandoverRequestHeader> ()
;
return tid;
@@ -457,6 +459,7 @@
{
static TypeId tid = TypeId ("ns3::EpcX2HandoverRequestAckHeader")
.SetParent<Header> ()
+
.SetGroupName("Lte")
.AddConstructor<EpcX2HandoverRequestAckHeader> ()
;
return tid;
@@ -682,6 +685,7 @@
{
static TypeId tid = TypeId ("ns3::EpcX2HandoverPreparationFailureHeader")
.SetParent<Header> ()
+
.SetGroupName("Lte")
.AddConstructor<EpcX2HandoverPreparationFailureHeader> ()
;
return tid;
@@ -807,6 +811,7 @@
{
static TypeId tid = TypeId ("ns3::EpcX2SnStatusTransferHeader")
.SetParent<Header> ()
+
.SetGroupName("Lte")
.AddConstructor<EpcX2SnStatusTransferHeader> ()
;
return tid;
@@ -997,6 +1002,7 @@
{
static TypeId tid = TypeId ("ns3::EpcX2UeContextReleaseHeader")
.SetParent<Header> ()
+
.SetGroupName("Lte")
.AddConstructor<EpcX2UeContextReleaseHeader> ()
;
return tid;
@@ -1102,6 +1108,7 @@

static TypeId tid = TypeId ("ns3::EpcX2LoadInformationHeader")


.SetParent<Header> ()
+
.SetGroupName("Lte")
.AddConstructor<EpcX2LoadInformationHeader> ()
;
return tid;
@@ -1330,6 +1337,7 @@
{
static TypeId tid = TypeId ("ns3::EpcX2ResourceStatusUpdateHeader")
.SetParent<Header> ()
+
.SetGroupName("Lte")
.AddConstructor<EpcX2ResourceStatusUpdateHeader> ()
;
return tid;
diff -Naur ns-3.22/src/lte/model/eps-bearer-tag.cc ns-3.23/src/lte/model/eps-bea
rer-tag.cc
--- ns-3.22/src/lte/model/eps-bearer-tag.cc
2015-02-05 15:46:23.000000000 -0
800
+++ ns-3.23/src/lte/model/eps-bearer-tag.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -33,6 +33,7 @@
{
static TypeId tid = TypeId ("ns3::EpsBearerTag")
.SetParent<Tag> ()
+
.SetGroupName("Lte")
.AddConstructor<EpsBearerTag> ()
.AddAttribute ("rnti", "The rnti that indicates the UE which packet belongs
",
UintegerValue (0),
diff -Naur ns-3.22/src/lte/model/fdbet-ff-mac-scheduler.cc ns-3.23/src/lte/model
/fdbet-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/fdbet-ff-mac-scheduler.cc
2015-02-05 15:46:23.0000
00000 -0800
+++ ns-3.23/src/lte/model/fdbet-ff-mac-scheduler.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -249,6 +249,7 @@
{
static TypeId tid = TypeId ("ns3::FdBetFfMacScheduler")
.SetParent<FfMacScheduler> ()
+
.SetGroupName("Lte")
.AddConstructor<FdBetFfMacScheduler> ()
.AddAttribute ("CqiTimerThreshold",
"The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/fdmt-ff-mac-scheduler.cc ns-3.23/src/lte/model/
fdmt-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/fdmt-ff-mac-scheduler.cc
2015-02-05 15:46:23.0000
00000 -0800
+++ ns-3.23/src/lte/model/fdmt-ff-mac-scheduler.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -248,6 +248,7 @@
{
static TypeId tid = TypeId ("ns3::FdMtFfMacScheduler")
.SetParent<FfMacScheduler> ()
+
.SetGroupName("Lte")
.AddConstructor<FdMtFfMacScheduler> ()
.AddAttribute ("CqiTimerThreshold",
"The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/fdtbfq-ff-mac-scheduler.cc ns-3.23/src/lte/mode
l/fdtbfq-ff-mac-scheduler.cc

--- ns-3.22/src/lte/model/fdtbfq-ff-mac-scheduler.cc
2015-02-05 15:46:23.0000
00000 -0800
+++ ns-3.23/src/lte/model/fdtbfq-ff-mac-scheduler.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -253,6 +253,7 @@
{
static TypeId tid = TypeId ("ns3::FdTbfqFfMacScheduler")
.SetParent<FfMacScheduler> ()
+
.SetGroupName("Lte")
.AddConstructor<FdTbfqFfMacScheduler> ()
.AddAttribute ("CqiTimerThreshold",
"The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/ff-mac-scheduler.cc ns-3.23/src/lte/model/ff-ma
c-scheduler.cc
--- ns-3.22/src/lte/model/ff-mac-scheduler.cc 2015-02-05 15:46:23.000000000 -0
800
+++ ns-3.23/src/lte/model/ff-mac-scheduler.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -54,6 +54,7 @@
{
static TypeId tid = TypeId ("ns3::FfMacScheduler")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddAttribute ("UlCqiFilter",
"The filter to apply on UL CQIs received",
EnumValue (FfMacScheduler::ALL_UL_CQI),
diff -Naur ns-3.22/src/lte/model/lte-amc.cc ns-3.23/src/lte/model/lte-amc.cc
--- ns-3.22/src/lte/model/lte-amc.cc
2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/lte-amc.cc
2015-05-13 11:05:27.000000000 -0700
@@ -234,6 +234,7 @@
{
static TypeId tid = TypeId ("ns3::LteAmc")
.SetParent<Object> ()
+ .SetGroupName("Lte")
.AddConstructor<LteAmc> ()
.AddAttribute ("Ber",
"The requested BER in assigning MCS (default is 0.00005).",
diff -Naur ns-3.22/src/lte/model/lte-anr.cc ns-3.23/src/lte/model/lte-anr.cc
--- ns-3.22/src/lte/model/lte-anr.cc
2015-02-05 15:46:23.000000000 -0800
+++ ns-3.23/src/lte/model/lte-anr.cc
2015-05-13 11:05:27.000000000 -0700
@@ -58,6 +58,7 @@
{
static TypeId tid = TypeId ("ns3::LteAnr")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddAttribute ("Threshold",
"Minimum RSRQ range value required for detecting a neighbour
cell",
UintegerValue (0),
diff -Naur ns-3.22/src/lte/model/lte-asn1-header.cc ns-3.23/src/lte/model/lte-as
n1-header.cc
--- ns-3.22/src/lte/model/lte-asn1-header.cc
2015-02-05 15:46:23.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-asn1-header.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -36,6 +36,7 @@
{
static TypeId tid = TypeId ("ns3::Asn1Header")
.SetParent<Header> ()
+
.SetGroupName("Lte")

;
return tid;

}
diff -Naur ns-3.22/src/lte/model/lte-chunk-processor.cc ns-3.23/src/lte/model/lt
e-chunk-processor.cc
--- ns-3.22/src/lte/model/lte-chunk-processor.cc
2015-02-05 15:46:23.0000
00000 -0800
+++ ns-3.23/src/lte/model/lte-chunk-processor.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -86,4 +86,18 @@
}
+
+void
+LteSpectrumValueCatcher::ReportValue (const SpectrumValue& value)
+{
+ m_value = value.Copy ();
+}
+
+Ptr<SpectrumValue>
+LteSpectrumValueCatcher::GetValue ()
+{
+ return m_value;
+}
+
+
} // namespace ns3
diff -Naur ns-3.22/src/lte/model/lte-chunk-processor.h ns-3.23/src/lte/model/lte
-chunk-processor.h
--- ns-3.22/src/lte/model/lte-chunk-processor.h 2015-02-05 15:46:23.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-chunk-processor.h 2015-05-13 11:05:27.000000000 -0
700
@@ -88,6 +88,34 @@
std::vector<LteChunkProcessorCallback> m_lteChunkProcessorCallbacks;
};
+
+/**
+ * A sink to be plugged to the callback of LteChunkProcessor allowing
+ * to save and later retrieve the latest reported value
+ *
+ */
+class LteSpectrumValueCatcher
+{
+public:
+
+ /**
+ * function to be plugged to LteChunkProcessor::AddCallback ()
+ *
+ * \param value
+ */
+ void ReportValue (const SpectrumValue& value);
+
+ /**
+ *
+ *
+ * \return the latest value reported by the LteChunkProcessor
+ */

+ Ptr<SpectrumValue> GetValue ();


+
+private:
+ Ptr<SpectrumValue> m_value;
+};
+
} // namespace ns3
diff -Naur ns-3.22/src/lte/model/lte-enb-mac.cc ns-3.23/src/lte/model/lte-enb-ma
c.cc
--- ns-3.22/src/lte/model/lte-enb-mac.cc
2015-02-05 15:46:23.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-enb-mac.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -314,6 +314,7 @@
{
static TypeId tid = TypeId ("ns3::LteEnbMac")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddConstructor<LteEnbMac> ()
.AddAttribute ("NumberOfRaPreambles",
"how many random access preambles are available for the cont
ention based RACH process",
diff -Naur ns-3.22/src/lte/model/lte-enb-phy.cc ns-3.23/src/lte/model/lte-enb-ph
y.cc
--- ns-3.22/src/lte/model/lte-enb-phy.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-enb-phy.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -152,7 +152,6 @@
m_harqPhyModule = Create <LteHarqPhy> ();
m_downlinkSpectrumPhy->SetHarqPhyModule (m_harqPhyModule);
m_uplinkSpectrumPhy->SetHarqPhyModule (m_harqPhyModule);
- Simulator::ScheduleNow (&LteEnbPhy::StartFrame, this);
}
TypeId
@@ -160,6 +159,7 @@
{
static TypeId tid = TypeId ("ns3::LteEnbPhy")
.SetParent<LtePhy> ()
+
.SetGroupName("Lte")
.AddConstructor<LteEnbPhy> ()
.AddAttribute ("TxPower",
"Transmission power in dBm",
@@ -249,6 +249,25 @@
LteEnbPhy::DoInitialize ()
{
NS_LOG_FUNCTION (this);
+ bool haveNodeId = false;
+ uint32_t nodeId = 0;
+ if (m_netDevice != 0)
+
{
+
Ptr<Node> node = m_netDevice->GetNode ();
+
if (node != 0)
+
{
+
nodeId = node->GetId ();
+
haveNodeId = true;
+
}

+
}
+ if (haveNodeId)
+
{
+
Simulator::ScheduleWithContext (nodeId, Seconds (0), &LteEnbPhy::StartFra
me, this);
+
}
+ else
+
{
+
Simulator::ScheduleNow (&LteEnbPhy::StartFrame, this);
+
}
Ptr<SpectrumValue> noisePsd = LteSpectrumValueHelper::CreateNoisePowerSpectra
lDensity (m_ulEarfcn, m_ulBandwidth, m_noiseFigure);
m_uplinkSpectrumPhy->SetNoisePowerSpectralDensity (noisePsd);
LtePhy::DoInitialize ();
diff -Naur ns-3.22/src/lte/model/lte-enb-rrc.cc ns-3.23/src/lte/model/lte-enb-rr
c.cc
--- ns-3.22/src/lte/model/lte-enb-rrc.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-enb-rrc.cc
2015-05-13 11:05:26.000000000 -0
700
@@ -1344,6 +1344,7 @@
NS_LOG_FUNCTION ("LteEnbRrc::GetTypeId");
static TypeId tid = TypeId ("ns3::LteEnbRrc")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddConstructor<LteEnbRrc> ()
.AddAttribute ("UeMap", "List of UeManager by C-RNTI.",
ObjectMapValue (),
diff -Naur ns-3.22/src/lte/model/lte-ffr-algorithm.cc ns-3.23/src/lte/model/lteffr-algorithm.cc
--- ns-3.22/src/lte/model/lte-ffr-algorithm.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-ffr-algorithm.cc 2015-05-13 11:05:26.000000000 -0
700
@@ -54,6 +54,7 @@
{
static TypeId tid = TypeId ("ns3::LteFfrAlgorithm")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddAttribute ("FrCellTypeId",
"Downlink FR cell type ID for automatic configuration,"
"default value is 0 and it means that user needs to configur
e FR algorithm manually,"
diff -Naur ns-3.22/src/lte/model/lte-ffr-distributed-algorithm.cc ns-3.23/src/lt
e/model/lte-ffr-distributed-algorithm.cc
--- ns-3.22/src/lte/model/lte-ffr-distributed-algorithm.cc
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-ffr-distributed-algorithm.cc
2015-05-13 11:05
:26.000000000 -0700
@@ -59,6 +59,7 @@
{
static TypeId tid = TypeId ("ns3::LteFfrDistributedAlgorithm")
.SetParent<LteFfrAlgorithm> ()
+
.SetGroupName("Lte")
.AddConstructor<LteFfrDistributedAlgorithm> ()
.AddAttribute ("CalculationInterval",
"Time interval between calculation of Edge sub-band, Default
value 1 second",
diff -Naur ns-3.22/src/lte/model/lte-ffr-enhanced-algorithm.cc ns-3.23/src/lte/m
odel/lte-ffr-enhanced-algorithm.cc

--- ns-3.22/src/lte/model/lte-ffr-enhanced-algorithm.cc 2015-02-05 15:46:22.0000


00000 -0800
+++ ns-3.23/src/lte/model/lte-ffr-enhanced-algorithm.cc 2015-05-13 11:05:26.0000
00000 -0700
@@ -120,6 +120,7 @@
{
static TypeId tid = TypeId ("ns3::LteFfrEnhancedAlgorithm")
.SetParent<LteFfrAlgorithm> ()
+
.SetGroupName("Lte")
.AddConstructor<LteFfrEnhancedAlgorithm> ()
.AddAttribute ("UlSubBandOffset",
"Uplink SubBand Offset for this cell in number of Resource B
lock Groups",
diff -Naur ns-3.22/src/lte/model/lte-ffr-soft-algorithm.cc ns-3.23/src/lte/model
/lte-ffr-soft-algorithm.cc
--- ns-3.22/src/lte/model/lte-ffr-soft-algorithm.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/lte-ffr-soft-algorithm.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -118,6 +118,7 @@
{
static TypeId tid = TypeId ("ns3::LteFfrSoftAlgorithm")
.SetParent<LteFfrAlgorithm> ()
+
.SetGroupName("Lte")
.AddConstructor<LteFfrSoftAlgorithm> ()
.AddAttribute ("UlCommonSubBandwidth",
"Uplink Medium (Common) SubBandwidth Configuration in number
of Resource Block Groups",
diff -Naur ns-3.22/src/lte/model/lte-fr-hard-algorithm.cc ns-3.23/src/lte/model/
lte-fr-hard-algorithm.cc
--- ns-3.22/src/lte/model/lte-fr-hard-algorithm.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/lte-fr-hard-algorithm.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -113,6 +113,7 @@
{
static TypeId tid = TypeId ("ns3::LteFrHardAlgorithm")
.SetParent<LteFfrAlgorithm> ()
+
.SetGroupName("Lte")
.AddConstructor<LteFrHardAlgorithm> ()
.AddAttribute ("UlSubBandOffset",
"Uplink Offset in number of Resource Block Groups",
diff -Naur ns-3.22/src/lte/model/lte-fr-no-op-algorithm.cc ns-3.23/src/lte/model
/lte-fr-no-op-algorithm.cc
--- ns-3.22/src/lte/model/lte-fr-no-op-algorithm.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/lte-fr-no-op-algorithm.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -58,6 +58,7 @@
{
static TypeId tid = TypeId ("ns3::LteFrNoOpAlgorithm")
.SetParent<LteFfrAlgorithm> ()
+
.SetGroupName("Lte")
.AddConstructor<LteFrNoOpAlgorithm> ()
;
return tid;
diff -Naur ns-3.22/src/lte/model/lte-fr-soft-algorithm.cc ns-3.23/src/lte/model/
lte-fr-soft-algorithm.cc
--- ns-3.22/src/lte/model/lte-fr-soft-algorithm.cc
2015-02-05 15:46:22.0000
00000 -0800

+++ ns-3.23/src/lte/model/lte-fr-soft-algorithm.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -116,6 +116,7 @@
{
static TypeId tid = TypeId ("ns3::LteFrSoftAlgorithm")
.SetParent<LteFfrAlgorithm> ()
+
.SetGroupName("Lte")
.AddConstructor<LteFrSoftAlgorithm> ()
.AddAttribute ("UlEdgeSubBandOffset",
"Uplink Edge SubBand Offset in number of Resource Block Grou
ps",
diff -Naur ns-3.22/src/lte/model/lte-fr-strict-algorithm.cc ns-3.23/src/lte/mode
l/lte-fr-strict-algorithm.cc
--- ns-3.22/src/lte/model/lte-fr-strict-algorithm.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/lte-fr-strict-algorithm.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -118,6 +118,7 @@
{
static TypeId tid = TypeId ("ns3::LteFrStrictAlgorithm")
.SetParent<LteFfrAlgorithm> ()
+
.SetGroupName("Lte")
.AddConstructor<LteFrStrictAlgorithm> ()
.AddAttribute ("UlCommonSubBandwidth",
"Uplink Common SubBandwidth Configuration in number of Resou
rce Block Groups",
diff -Naur ns-3.22/src/lte/model/lte-handover-algorithm.cc ns-3.23/src/lte/model
/lte-handover-algorithm.cc
--- ns-3.22/src/lte/model/lte-handover-algorithm.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/lte-handover-algorithm.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -44,6 +44,7 @@
{
static TypeId tid = TypeId ("ns3::LteHandoverAlgorithm")
.SetParent<Object> ()
+
.SetGroupName("Lte")
;
return tid;
}
diff -Naur ns-3.22/src/lte/model/lte-interference.cc ns-3.23/src/lte/model/lte-i
nterference.cc
--- ns-3.22/src/lte/model/lte-interference.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-interference.cc 2015-05-13 11:05:26.000000000 -0
700
@@ -62,6 +62,7 @@
{
static TypeId tid = TypeId ("ns3::LteInterference")
.SetParent<Object> ()
+
.SetGroupName("Lte")
;
return tid;
}
diff -Naur ns-3.22/src/lte/model/lte-pdcp.cc ns-3.23/src/lte/model/lte-pdcp.cc
--- ns-3.22/src/lte/model/lte-pdcp.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-pdcp.cc 2015-05-13 11:05:26.000000000 -0700
@@ -85,6 +85,7 @@
{
static TypeId tid = TypeId ("ns3::LtePdcp")

.SetParent<Object> ()
.SetGroupName("Lte")
.AddTraceSource ("TxPDU",
"PDU transmission notified to the RLC.",
MakeTraceSourceAccessor (&LtePdcp::m_txPdu),
diff -Naur ns-3.22/src/lte/model/lte-pdcp-header.cc ns-3.23/src/lte/model/lte-pd
cp-header.cc
--- ns-3.22/src/lte/model/lte-pdcp-header.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-pdcp-header.cc
2015-05-13 11:05:26.000000000 -0
700
@@ -70,6 +70,7 @@
{
static TypeId tid = TypeId ("ns3::LtePdcpHeader")
.SetParent<Header> ()
+
.SetGroupName("Lte")
.AddConstructor<LtePdcpHeader> ()
;
return tid;
diff -Naur ns-3.22/src/lte/model/lte-pdcp-tag.cc ns-3.23/src/lte/model/lte-pdcptag.cc
--- ns-3.22/src/lte/model/lte-pdcp-tag.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-pdcp-tag.cc
2015-05-13 11:05:26.000000000 -0
700
@@ -46,6 +46,7 @@
{
static TypeId tid = TypeId ("ns3::PdcpTag")
.SetParent<Tag> ()
+
.SetGroupName("Lte")
.AddConstructor<PdcpTag> ();
return tid;
}
diff -Naur ns-3.22/src/lte/model/lte-phy.cc ns-3.23/src/lte/model/lte-phy.cc
--- ns-3.22/src/lte/model/lte-phy.cc
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-phy.cc
2015-05-13 11:05:26.000000000 -0700
@@ -60,6 +60,7 @@
{
static TypeId tid = TypeId ("ns3::LtePhy")
.SetParent<Object> ()
+
.SetGroupName("Lte")
;
return tid;
}
diff -Naur ns-3.22/src/lte/model/lte-phy-tag.cc ns-3.23/src/lte/model/lte-phy-ta
g.cc
--- ns-3.22/src/lte/model/lte-phy-tag.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-phy-tag.cc
2015-05-13 11:05:26.000000000 -0
700
@@ -33,6 +33,7 @@
{
static TypeId tid = TypeId ("ns3::LtePhyTag")
.SetParent<Tag> ()
+
.SetGroupName("Lte")
.AddConstructor<LtePhyTag> ()
;
return tid;
diff -Naur ns-3.22/src/lte/model/lte-radio-bearer-tag.cc ns-3.23/src/lte/model/l
te-radio-bearer-tag.cc
+

--- ns-3.22/src/lte/model/lte-radio-bearer-tag.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/lte-radio-bearer-tag.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -32,6 +32,7 @@
{
static TypeId tid = TypeId ("ns3::LteRadioBearerTag")
.SetParent<Tag> ()
+
.SetGroupName("Lte")
.AddConstructor<LteRadioBearerTag> ()
.AddAttribute ("rnti", "The rnti that indicates the UE to which packet belo
ngs",
UintegerValue (0),
diff -Naur ns-3.22/src/lte/model/lte-rlc-am.cc ns-3.23/src/lte/model/lte-rlc-am.
cc
--- ns-3.22/src/lte/model/lte-rlc-am.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rlc-am.cc 2015-05-13 11:05:26.000000000 -0700
@@ -16,6 +16,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Manuel Requena <manuel.requena@cttc.es>
+ *
Nicola Baldo <nbaldo@cttc.es>
*/
#include
@@ -26,12
#include
#include

"ns3/simulator.h"
+27,14 @@
"ns3/lte-rlc-sdu-status-tag.h"
"ns3/lte-rlc-tag.h"

namespace ns3 {
NS_LOG_COMPONENT_DEFINE ("LteRlcAm");
NS_OBJECT_ENSURE_REGISTERED (LteRlcAm);

LteRlcAm::LteRlcAm ()
{
NS_LOG_FUNCTION (this);
@@ -73,8 +76,7 @@
m_reassemblingState = WAITING_S0_FULL;
m_expectedSeqNumber = 0;
- // Timers
- m_pollRetransmitTimerValue = MilliSeconds (100);
+ m_pollRetransmitTimerJustExpired = false;
}
LteRlcAm::~LteRlcAm ()
@@ -87,12 +89,29 @@
{
static TypeId tid = TypeId ("ns3::LteRlcAm")
.SetParent<LteRlc> ()
+
.SetGroupName("Lte")
.AddConstructor<LteRlcAm> ()
.AddAttribute ("PollRetransmitTimer",
"Value of the t-PollRetransmit (See section 7.3 of 3GPP TS 3
6.322)",
TimeValue (MilliSeconds (100)),

+
P TS 36.322)",
+

"Value of the t-PollRetransmit timer (See section 7.3 of 3GP

TimeValue (MilliSeconds (20)),


MakeTimeAccessor (&LteRlcAm::m_pollRetransmitTimerValue),
MakeTimeChecker ())
+
.AddAttribute ("ReorderingTimer",
+
"Value of the t-Reordering timer (See section 7.3 of 3GPP TS
36.322)",
+
TimeValue (MilliSeconds (10)),
+
MakeTimeAccessor (&LteRlcAm::m_reorderingTimerValue),
+
MakeTimeChecker ())
+
.AddAttribute ("StatusProhibitTimer",
+
"Value of the t-StatusProhibit timer (See section 7.3 of 3GP
P TS 36.322)",
+
TimeValue (MilliSeconds (10)),
+
MakeTimeAccessor (&LteRlcAm::m_statusProhibitTimerValue),
+
MakeTimeChecker ())
+
.AddAttribute ("ReportBufferStatusTimer",
+
"How much to wait to issue a new Report Buffer Status since
the last time "
+
"a new SDU was received",
+
TimeValue (MilliSeconds (20)),
+
MakeTimeAccessor (&LteRlcAm::m_rbsTimerValue),
+
MakeTimeChecker ())
.AddAttribute ("TxOpportunityForRetxAlwaysBigEnough",
"If true, always pretend that the size of a TxOpportunity is
big enough "
"for retransmission. If false (default and realistic behavio
r), no retx "
@@ -112,6 +131,7 @@
m_pollRetransmitTimer.Cancel ();
m_reorderingTimer.Cancel ();
m_statusProhibitTimer.Cancel ();
+ m_rbsTimer.Cancel ();
m_txonBuffer.clear ();
m_txonBufferSize = 0;
@@ -156,6 +176,8 @@
/** Report Buffer Status */
DoReportBufferStatus ();
+ m_rbsTimer.Cancel ();
+ m_rbsTimer = Simulator::Schedule (m_rbsTimerValue, &LteRlcAm::ExpireRbsTimer,
this);
}
@@ -194,7 +216,42 @@
Ptr<Packet> packet = Create<Packet> ();
LteRlcAmHeader rlcAmHeader;
rlcAmHeader.SetControlPdu (LteRlcAmHeader::STATUS_PDU);
rlcAmHeader.SetAckSn (m_vrR);
+
+
NS_LOG_LOGIC ("Check for SNs to NACK from " << m_vrR.GetValue() << " to "
<< m_vrMs.GetValue());
+
SequenceNumber10 sn;
+
sn.SetModulusBase (m_vrR);
+
std::map<uint16_t, PduBuffer>::iterator pduIt;
+
for (sn = m_vrR; sn < m_vrMs; sn++)
+
{

+
NS_LOG_LOGIC ("SN = " << sn);
+
if (!rlcAmHeader.OneMoreNackWouldFitIn (bytes))
+
{
+
NS_LOG_LOGIC ("Can't fit more NACKs in STATUS PDU");
+
break;
+
}
+
pduIt = m_rxonBuffer.find (sn.GetValue ());
+
if (pduIt == m_rxonBuffer.end () || (!(pduIt->second.m_pduComplete)))
+
{
+
NS_LOG_LOGIC ("adding NACK_SN " << sn.GetValue ());
+
rlcAmHeader.PushNack (sn.GetValue ());
+
}
+
}
+
NS_LOG_LOGIC ("SN at end of NACK loop = " << sn);
+
// 3GPP TS 36.322 section 6.2.2.1.4 ACK SN
+
// find the SN of the next not received RLC Data PDU
+
// which is not reported as missing in the STATUS PDU.
+
pduIt = m_rxonBuffer.find (sn.GetValue ());
+
while ((sn < m_vrMs) && (pduIt != m_rxonBuffer.end ()) && (pduIt->second.
m_pduComplete))
+
{
+
NS_LOG_LOGIC ("SN = " << sn << " < " << m_vrMs << " = " << (sn < m_vr
Ms));
+
sn++;
+
NS_LOG_LOGIC ("SN = " << sn);
+
pduIt = m_rxonBuffer.find (sn.GetValue ());
+
}
+
+
NS_ASSERT_MSG (sn <= m_vrMs, "first SN not reported as missing = " << sn
<< ", VR(MS) = " << m_vrMs);
+
rlcAmHeader.SetAckSn (sn);
+
NS_LOG_LOGIC ("RLC header: " << rlcAmHeader);
packet->AddHeader (rlcAmHeader);
@@ -211,38 +268,114 @@
m_statusPduRequested = false;
m_statusPduBufferSize = 0;
+
m_statusProhibitTimer = Simulator::Schedule (m_statusProhibitTimerValue,
+
&LteRlcAm::ExpireStatusProhi
bitTimer, this);
return;
}
else if ( m_retxBufferSize > 0 )
{
+
NS_LOG_LOGIC ("retxBufferSize = " << m_retxBufferSize);
NS_LOG_LOGIC ("Sending data from Retransmission Buffer");
+
NS_ASSERT (m_vtA < m_vtS);
+
SequenceNumber10 sn;
+
sn.SetModulusBase (m_vtA);
+
bool found = false;
+
for (sn = m_vtA; sn < m_vtS; sn++)
+
{
+
uint16_t seqNumberValue = sn.GetValue ();
+
NS_LOG_LOGIC ("SN = " << seqNumberValue << " m_pdu " << m_retxBuffer.
at (seqNumberValue).m_pdu);
+
+
if (m_retxBuffer.at (seqNumberValue).m_pdu != 0)
+
{

+
+

();

Ptr<Packet> packet = m_retxBuffer.at (seqNumberValue).m_pdu->Copy

+
+
if (( packet->GetSize () <= bytes )
+
|| m_txOpportunityForRetxAlwaysBigEnough)
+
{
+
found = true;
+
// According to 5.2.1, the data field is left as is, but we r
ebuild the header
+
LteRlcAmHeader rlcAmHeader;
+
packet->RemoveHeader (rlcAmHeader);
+
NS_LOG_LOGIC ("old AM RLC header: " << rlcAmHeader);
+
+
// Calculate the Polling Bit (5.2.2.1)
+
rlcAmHeader.SetPollingBit (LteRlcAmHeader::STATUS_REPORT_NOT_
REQUESTED);
+
+
NS_LOG_LOGIC ("polling conditions: m_txonBuffer.empty=" << m_
txonBuffer.empty ()
+
<< " retxBufferSize=" << m_retxBufferSize
+
<< " packet->GetSize ()=" << packet->GetSize ()
);
+
if (((m_txonBuffer.empty ()) && (m_retxBufferSize == packet->
GetSize () + rlcAmHeader.GetSerializedSize ()))
+
|| (m_vtS >= m_vtMs)
+
|| m_pollRetransmitTimerJustExpired)
+
{
+
m_pollRetransmitTimerJustExpired = false;
+
rlcAmHeader.SetPollingBit (LteRlcAmHeader::STATUS_REPORT_
IS_REQUESTED);
+
m_pduWithoutPoll = 0;
+
m_byteWithoutPoll = 0;
+
+
m_pollSn = m_vtS - 1;
+
NS_LOG_LOGIC ("New POLL_SN = " << m_pollSn);
+
+
if (! m_pollRetransmitTimer.IsRunning () )
+
{
+
NS_LOG_LOGIC ("Start PollRetransmit timer");
+
+
m_pollRetransmitTimer = Simulator::Schedule (m_pollRe
transmitTimerValue,
+
&LteRlcA
m::ExpirePollRetransmitTimer, this);
+
}
+
else
+
{
+
NS_LOG_LOGIC ("Restart PollRetransmit timer");
+
+
m_pollRetransmitTimer.Cancel ();
+
m_pollRetransmitTimer = Simulator::Schedule (m_pollRe
transmitTimerValue,
+
&LteRlcA
m::ExpirePollRetransmitTimer, this);
+
}
+
}
+

Ptr<Packet> packet = m_retxBuffer.at (m_vtA.GetValue ()).m_pdu->Copy ();


packet->AddHeader (rlcAmHeader);

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Threshold)
+
+
);
+

NS_LOG_LOGIC ("new AM RLC header: " << rlcAmHeader);


// Send RLC PDU to MAC layer
LteMacSapProvider::TransmitPduParameters params;
params.pdu = packet;
params.rnti = m_rnti;
params.lcid = m_lcid;
params.layer = layer;
params.harqProcessId = harqId;
m_macSapProvider->TransmitPdu (params);
m_retxBuffer.at (seqNumberValue).m_retxCount++;
NS_LOG_INFO ("Incr RETX_COUNT for SN = " << seqNumberValue);
if (m_retxBuffer.at (seqNumberValue).m_retxCount >= m_maxRetx
{

NS_LOG_INFO ("Max RETX_COUNT for SN = " << seqNumberValue

if (( packet->GetSize () <= bytes )


|| m_txOpportunityForRetxAlwaysBigEnough)
{
LteRlcAmHeader rlcAmHeader;
packet->PeekHeader (rlcAmHeader);
NS_LOG_LOGIC ("RLC header: " << rlcAmHeader);
// Send RLC PDU to MAC layer
LteMacSapProvider::TransmitPduParameters params;
params.pdu = packet;
params.rnti = m_rnti;
params.lcid = m_lcid;
params.layer = layer;
params.harqProcessId = harqId;
+
NS_LOG_INFO ("Move SN = " << seqNumberValue << " back to txed
Buffer");
+
m_txedBuffer.at (seqNumberValue).m_pdu = m_retxBuffer.at (seq
NumberValue).m_pdu->Copy ();
+
m_txedBuffer.at (seqNumberValue).m_retxCount = m_retxBuffer.a
t (seqNumberValue).m_retxCount;
+
m_txedBufferSize += m_txedBuffer.at (seqNumberValue).m_pdu->G
etSize ();
+
+
m_retxBufferSize -= m_retxBuffer.at (seqNumberValue).m_pdu->G
etSize ();
+
m_retxBuffer.at (seqNumberValue).m_pdu = 0;
+
m_retxBuffer.at (seqNumberValue).m_retxCount = 0;
+
+
NS_LOG_LOGIC ("retxBufferSize = " << m_retxBufferSize);
m_macSapProvider->TransmitPdu (params);
return;
}
else
{
NS_LOG_LOGIC ("TxOpportunity (size = " << bytes << ") too small for r
etransmission of the packet (size = " << packet->GetSize () << ")");
NS_LOG_LOGIC ("Waiting for bigger TxOpportunity");
return;

+
return;
+
}
+
else
+
{
+
NS_LOG_LOGIC ("TxOpportunity (size = " << bytes << ") too sma
ll for retransmission of the packet (size = " << packet->GetSize () << ")");
+
NS_LOG_LOGIC ("Waiting for bigger TxOpportunity");
+
return;
+
}
+
}
}
+
NS_ASSERT_MSG (found, "m_retxBufferSize > 0, but no PDU considered for re
tx found");
}
else if ( m_txonBufferSize > 0 )
{
@@ -255,50 +388,14 @@
return;
}
NS_LOG_LOGIC ("Sending data from Transmission Buffer");
}
- else if ( m_txedBufferSize > 0 )
{
NS_LOG_LOGIC ("Sending data from Transmitted Buffer");
NS_LOG_INFO ("VT(A)
= " << m_vtA);
NS_LOG_INFO ("VT(S)
= " << m_vtS);
uint16_t vta = m_vtA.GetValue ();
Ptr<Packet> packet = m_txedBuffer.at (vta)->Copy ();
if (( packet->GetSize () <= bytes )
|| m_txOpportunityForRetxAlwaysBigEnough)
{
NS_LOG_INFO ("Move SN = " << vta << " to retxBuffer");
m_retxBuffer.at (vta).m_pdu = m_txedBuffer.at (vta)->Copy ();
m_retxBuffer.at (vta).m_retxCount = 1;
m_retxBufferSize += m_retxBuffer.at (vta).m_pdu->GetSize ();
m_txedBufferSize -= m_txedBuffer.at (vta)->GetSize ();
m_txedBuffer.at (vta) = 0;
LteRlcAmHeader rlcAmHeader;
packet->PeekHeader (rlcAmHeader);
NS_LOG_LOGIC ("RLC header: " << rlcAmHeader);
// Send RLC PDU to MAC layer
LteMacSapProvider::TransmitPduParameters params;
params.pdu = packet;
params.rnti = m_rnti;
params.lcid = m_lcid;
params.layer = layer;
params.harqProcessId = harqId;
m_macSapProvider->TransmitPdu (params);
return;
}
else
+
NS_ASSERT (m_vtS <= m_vtMs);

if (m_vtS == m_vtMs)
{
NS_LOG_LOGIC ("TxOpportunity (size = " << bytes << ") too small for r
etransmission of the packet (size = " << packet->GetSize () << ")");
NS_LOG_LOGIC ("Waiting for bigger TxOpportunity");
+
NS_LOG_INFO ("cannot transmit new RLC PDU due to window stalling");
return;
}
+
+
NS_LOG_LOGIC ("Sending data from Transmission Buffer");
}
else
{
@@ -430,7 +527,7 @@
to 2047)
+

// nextSegmentSize MUST be zero (only if segment is smaller or equal


// (NO more segments)
exit
// (NO more segments) ? exit
// break;

}
else if ( (nextSegmentSize - firstSegment->GetSize () <= 2) || (m_txonBuf
fer.size () == 0) )
@@ -461,7 +558,7 @@
// nextSegmentSize <= 2 (only if txBuffer is not empty)
+

// (NO more segments) exit


// (NO more segments) ? exit
// break;

}
else // (firstSegment->GetSize () < m_nextSegmentSize) && (m_txBuffer.siz
e () > 0)
@@ -508,6 +605,9 @@
rlcAmHeader.SetLastSegmentFlag (LteRlcAmHeader::LAST_PDU_SEGMENT);
rlcAmHeader.SetSegmentOffset (0);
+ NS_ASSERT_MSG(rlcAmHeader.GetSequenceNumber () < m_vtMs, "SN above TX window"
);
+ NS_ASSERT_MSG(rlcAmHeader.GetSequenceNumber () >= m_vtA, "SN below TX window"
);
+
// Calculate FramingInfo flag according the status of the SDUs in the DataFie
ld
uint8_t framingInfo = 0;
std::vector< Ptr<Packet> >::iterator it;
@@ -564,10 +664,12 @@
NS_LOG_LOGIC ("BYTE_WITHOUT_POLL = " << m_byteWithoutPoll);
if ( (m_pduWithoutPoll >= m_pollPdu) || (m_byteWithoutPoll >= m_pollByte) ||
( (m_txonBuffer.empty ()) && (m_retxBuffer.empty ()) ) ||
( (m_txonBuffer.empty ()) && (m_retxBufferSize == 0) ) ||
(m_vtS >= m_vtMs)
+
|| m_pollRetransmitTimerJustExpired
)
{
+
m_pollRetransmitTimerJustExpired = false;
rlcAmHeader.SetPollingBit (LteRlcAmHeader::STATUS_REPORT_IS_REQUESTED);
m_pduWithoutPoll = 0;
+

m_byteWithoutPoll = 0;
@@ -600,7 +702,8 @@
// Store new PDU into the Transmitted PDU Buffer
NS_LOG_LOGIC ("Put transmitted PDU in the txedBuffer");
m_txedBufferSize += packet->GetSize ();
- m_txedBuffer.at ( rlcAmHeader.GetSequenceNumber ().GetValue () ) = packet->Co
py ();
+ m_txedBuffer.at ( rlcAmHeader.GetSequenceNumber ().GetValue () ).m_pdu = pack
et->Copy ();
+ m_txedBuffer.at ( rlcAmHeader.GetSequenceNumber ().GetValue () ).m_retxCount
= 0;
// Sender timestamp
RlcTag rlcTag (Simulator::Now ());
@@ -624,6 +727,7 @@
NS_LOG_FUNCTION (this);
}
+

void
LteRlcAm::DoReceivePdu (Ptr<Packet> p)
{
@@ -697,6 +801,7 @@

SequenceNumber10 seqNumber = rlcAmHeader.GetSequenceNumber ();


seqNumber.SetModulusBase (m_vrR);

if ( rlcAmHeader.GetResegmentationFlag () == LteRlcAmHeader::SEGMENT )
{
@@ -751,12 +856,25 @@
}
else
{
NS_LOG_LOGIC ("Place PDU in the reception buffer ( SN = " << seqNumbe
r << " )");
m_rxonBuffer[ seqNumber.GetValue () ].m_byteSegments.push_back (p);
m_rxonBuffer[ seqNumber.GetValue () ].m_pduComplete = true;
// - if some byte segments of the AMD PDU contained in the RLC data P
DU have been received before:
//
- discard the duplicate byte segments.
+
// note: re-segmentation of AMD PDU is currently not supported,
+
// so we just check that the segment was not received before
+
std::map <uint16_t, PduBuffer>::iterator it = m_rxonBuffer.find (seqN
umber.GetValue ());
+
if (it != m_rxonBuffer.end () )
+
{
+
NS_ASSERT (it->second.m_byteSegments.size () > 0);
+
NS_ASSERT_MSG (it->second.m_byteSegments.size () == 1, "re-segmen
tation not supported");
+
NS_LOG_LOGIC ("PDU segment already received, discarded");
+
}
+
else
+
{
+
NS_LOG_LOGIC ("Place PDU in the reception buffer ( SN = " << seqN
umber << " )");
+
m_rxonBuffer[ seqNumber.GetValue () ].m_byteSegments.push_back (p
);
+
m_rxonBuffer[ seqNumber.GetValue () ].m_pduComplete = true;

+
+
+

}
}

// 5.1.3.2.3 Actions when a RLC data PDU is placed in the reception buffe
r
@@ -778,11 +896,11 @@
std::map <uint16_t, PduBuffer>::iterator it = m_rxonBuffer.find (m_vrMs.G
etValue ());
if ( it != m_rxonBuffer.end () &&
m_rxonBuffer[ m_vrMs.GetValue () ].m_pduComplete )
+
it->second.m_pduComplete )
{
int firstVrMs = m_vrMs.GetValue ();
while ( it != m_rxonBuffer.end () &&
m_rxonBuffer[ m_vrMs.GetValue () ].m_pduComplete )
+
it->second.m_pduComplete )
{
m_vrMs++;
it = m_rxonBuffer.find (m_vrMs.GetValue ());
@@ -803,34 +921,34 @@
{
std::map <uint16_t, PduBuffer>::iterator it = m_rxonBuffer.find (seqN
umber.GetValue ());
if ( it != m_rxonBuffer.end () &&
m_rxonBuffer[ seqNumber.GetValue () ].m_pduComplete )
+
it->second.m_pduComplete )
{
it = m_rxonBuffer.find (m_vrR.GetValue ());
int firstVrR = m_vrR.GetValue ();
while ( it != m_rxonBuffer.end () &&
m_rxonBuffer[ m_vrR.GetValue () ].m_pduComplete )
+
it->second.m_pduComplete )
{
NS_LOG_LOGIC ("Reassemble and Deliver ( SN = " << m_vrR << "
)");
NS_ASSERT_MSG (m_rxonBuffer[ m_vrR.GetValue () ].m_byteSegmen
ts.size () == 1,
+
NS_ASSERT_MSG (it->second.m_byteSegments.size () == 1,
"Too many segments. PDU Reassembly process didn
't work");
ReassembleAndDeliver (m_rxonBuffer[ m_vrR.GetValue () ].m_byt
eSegments.front ());
+
ReassembleAndDeliver (it->second.m_byteSegments.front ());
m_rxonBuffer.erase (m_vrR.GetValue ());
m_vrR++;
m_vrR.SetModulusBase (m_vrR);
m_vrX.SetModulusBase (m_vrR);
m_vrMs.SetModulusBase (m_vrR);
m_vrH.SetModulusBase (m_vrR);
it = m_rxonBuffer.find (m_vrR.GetValue ());

+
+
+
+

in RxonBuffer");

NS_ASSERT_MSG (firstVrR != m_vrR.GetValue (), "Infinite loop

}
NS_LOG_LOGIC ("New VR(R) = " << m_vrR);
m_vrMr = m_vrR + m_windowSize;

+
}

NS_LOG_LOGIC ("New VR(MR) = " << m_vrMr);

-//
NS_LOG_LOGIC ("Reassemble and Deliver ( SN = " << seqNumber << " )
");
-//
NS_ASSERT_MSG (m_rxonBuffer[ seqNumber.GetValue () ].m_byteSegment
s.size () == 1,
-//
"Too many segments. PDU Reassembly process didn't w
ork");
-//
ReassembleAndDeliver (m_rxonBuffer[ seqNumber.GetValue () ].m_byte
Segments.front ());
-//
m_rxonBuffer.erase (seqNumber.GetValue ());
}
// - if t-Reordering is running:
@@ -862,185 +980,109 @@
if ( m_vrH > m_vrR )
{
NS_LOG_LOGIC ("Start reordering timer");
m_reorderingTimer = Simulator::Schedule (Time ("0.1s"),
+
m_reorderingTimer = Simulator::Schedule (m_reorderingTimerValue,
&LteRlcAm::ExpireReorder
ingTimer ,this);
m_vrX = m_vrH;
NS_LOG_LOGIC ("New VR(X) = " << m_vrX);
}
}
/// \todo To remove
// 5.1.2.2.3 Actions when an UMD PDU is placed in the reception buffer
// When an UMD PDU with SN = x is placed in the reception buffer, the rec
eiving UM RLC entity shall:
// - if x falls outside of the reordering window:
//
- update VR(UH) to x + 1;
//
- reassemble RLC SDUs from any UMD PDUs with SN that falls outside
of the reordering window, remove
//
RLC headers when doing so and deliver the reassembled RLC SDUs to
upper layer in ascending order of the
//
RLC SN if not delivered before;
//
- if VR(UR) falls outside of the reordering window:
//
- set VR(UR) to (VR(UH) - UM_Window_Size);
-//
if ( ! IsInsideReorderingWindow (seqNumber))
-//
{
-//
NS_LOG_LOGIC ("SN outside the reordering window");
-//
-//
m_vrUh = seqNumber + 1;
-//
NS_LOG_LOGIC ("New VR(UH) = " << m_vrUh);
-//
-//
ReassembleOutsideWindow ();
-//
-//
if ( ! IsInsideReorderingWindow (m_vrUr) )
-//
{
-//
m_vrUr = m_vrUh - m_windowSize;
-//
NS_LOG_LOGIC ("VR(UR) outside the reordering window");

-//
NS_LOG_LOGIC ("New VR(UR) = " << m_vrUr);
-//
}
-//
}
// - if the reception buffer contains an UMD PDU with SN = VR(UR):
//
- update VR(UR) to the SN of the first UMD PDU with SN > current VR
(UR) that has not been received;
//
- reassemble RLC SDUs from any UMD PDUs with SN < updated VR(UR), r
emove RLC headers when doing
//
so and deliver the reassembled RLC SDUs to upper layer in ascendi
ng order of the RLC SN if not delivered
//
before;
-//
if ( m_rxBuffer.count (m_vrUr) > 0 )
-//
{
-//
NS_LOG_LOGIC ("Reception buffer contains SN = " << m_vrUr);
-//
-//
std::map <uint16_t, Ptr<Packet> >::iterator it;
-//
uint16_t newVrUr;
-//
-//
it = m_rxBuffer.find (m_vrUr);
-//
newVrUr = (it->first) + 1;
-//
while ( m_rxBuffer.count (newVrUr) > 0 )
-//
{
-//
newVrUr++;
-//
}
-//
m_vrUr = newVrUr;
-//
NS_LOG_LOGIC ("New VR(UR) = " << m_vrUr);
-//
-//
ReassembleSnLessThan (m_vrUr);
-//
}
// - if t-Reordering is running:
//
- if VR(UX) <= VR(UR); or
//
- if VR(UX) falls outside of the reordering window and VR(UX) is no
t equal to VR(UH)::
//
- stop and reset t-Reordering;
-//
if ( m_reorderingTimer.IsRunning () )
-//
{
-//
NS_LOG_LOGIC ("Reordering timer is running");
-//
-//
if ( (m_vrUx <= m_vrUr) ||
-//
((! IsInsideReorderingWindow (m_vrUx)) && (m_vrUx != m_vrUh))
)
-//
{
-//
NS_LOG_LOGIC ("Stop reordering timer");
-//
m_reorderingTimer.Cancel ();
-//
}
-//
}
// - if t-Reordering is not running (includes the case when t-Reordering
is stopped due to actions above):
//
- if VR(UH) > VR(UR):
//
- start t-Reordering;
//
- set VR(UX) to VR(UH).
-//
if ( ! m_reorderingTimer.IsRunning () )
-//
{
-//
NS_LOG_LOGIC ("Reordering timer is not running");
-//
-//
if ( m_vrUx > m_vrUr )

-//
{
-//
NS_LOG_LOGIC ("VR(UX) > VR(UR). " << m_vrUx << " > " << m_vrUr
);
-//
NS_LOG_LOGIC ("Start reordering timer");
-//
m_reorderingTimer = Simulator::Schedule (Time ("1.0s"),
-//
&LteRlcAm::ExpireReord
eringTimer ,this);
-//
m_vrUx = m_vrUh;
-//
NS_LOG_LOGIC ("New VR(UX) = " << m_vrUx);
-//
}
-//
}
}
else if ( rlcAmHeader.IsControlPdu () )
{
NS_LOG_INFO ("Control AM RLC PDU");
-//
+

SequenceNumber10 ackSn = rlcAmHeader.GetAckSn ();


SequenceNumber10 seqNumber = m_vtA;
SequenceNumber10 sn;

+
+

NS_LOG_INFO ("ackSn
= " << ackSn);
NS_LOG_INFO ("VT(A)
= " << m_vtA);
NS_LOG_INFO ("VT(S)
= " << m_vtS);
NS_LOG_LOGIC ("retxBufferSize = " << m_retxBufferSize);
NS_LOG_LOGIC ("txedBufferSize = " << m_txedBufferSize);

+
+
+
+
+
+
-//
-//
());
+
+
+
-

m_vtA.SetModulusBase (m_vtA);
m_vtS.SetModulusBase (m_vtA);
m_vtMs.SetModulusBase (m_vtA);
ackSn.SetModulusBase (m_vtA);
while (m_vtA < ackSn && m_vtA < m_vtS)
sn.SetModulusBase (m_vtA);
bool incrementVtA = true;
for (sn = m_vtA; sn < ackSn && sn < m_vtS; sn++)
{
NS_LOG_INFO ("seqNumber = " << seqNumber);
NS_LOG_INFO ("m_txedBuffer( VT(A) ).size = " << m_txedBuffer.size
NS_LOG_LOGIC ("sn = " << sn);
uint16_t seqNumberValue = sn.GetValue ();
uint16_t seqNumberValue = m_vtA.GetValue ();
if (m_pollRetransmitTimer.IsRunning ()
&& (seqNumberValue == m_pollSn.GetValue ()))
{
m_pollRetransmitTimer.Cancel ();
}

if (m_txedBuffer.at (seqNumberValue))
{
NS_LOG_INFO ("ACKed SN = " << seqNumberValue << " from txedBuffer
");
-//
NS_LOG_INFO ("m_txedBuffer( " << m_vtA << " )->GetSize = " <<
m_txedBuffer.at (m_vtA.GetValue ())->GetSize ());
m_txedBufferSize -= m_txedBuffer.at (seqNumberValue)->GetSize ();
m_txedBuffer.at (seqNumberValue) = 0;

}
if (m_retxBuffer.at (seqNumberValue).m_pdu)
if (rlcAmHeader.IsNackPresent (sn))
{
NS_LOG_INFO ("ACKed SN = " << seqNumberValue << " from retxBuffer

");
ze ();
+
+

m_retxBufferSize -= m_retxBuffer.at (seqNumberValue).m_pdu->GetSi

m_retxBuffer.at (seqNumberValue).m_pdu = 0;
m_retxBuffer.at (seqNumberValue).m_retxCount = 0;
NS_LOG_LOGIC ("sn " << sn << " is NACKed");

m_vtA++;
m_vtA.SetModulusBase (m_vtA);
m_vtS.SetModulusBase (m_vtA);
ackSn.SetModulusBase (m_vtA);
incrementVtA = false;

NS_LOG_INFO ("New VT(A) = " << m_vtA);


SequenceNumber10 seqNumber = m_vtA;
uint16_t seqNumberValue;
while (seqNumber < m_vtS)
{
seqNumberValue = seqNumber.GetValue ();
if (m_txedBuffer.at (seqNumberValue))
{
NS_LOG_INFO ("Move SN = " << seqNumberValue << " to retxBuffer");
m_retxBuffer.at (seqNumberValue).m_pdu = m_txedBuffer.at (seqNumb
erValue)->Copy ();
m_retxBuffer.at (seqNumberValue).m_retxCount = 0;
m_retxBufferSize += m_retxBuffer.at (seqNumberValue).m_pdu->GetSi
ze ();
+
if (m_txedBuffer.at (seqNumberValue).m_pdu != 0)
+
{
+
NS_LOG_INFO ("Move SN = " << seqNumberValue << " to retxBuffe
r");
+
m_retxBuffer.at (seqNumberValue).m_pdu = m_txedBuffer.at (seq
NumberValue).m_pdu->Copy ();
+
m_retxBuffer.at (seqNumberValue).m_retxCount = m_txedBuffer.a
t (seqNumberValue).m_retxCount;
+
m_retxBufferSize += m_retxBuffer.at (seqNumberValue).m_pdu->G
etSize ();
+
+
m_txedBufferSize -= m_txedBuffer.at (seqNumberValue).m_pdu->G
etSize ();
+
m_txedBuffer.at (seqNumberValue).m_pdu = 0;
+
m_txedBuffer.at (seqNumberValue).m_retxCount = 0;
+
}
+
+
+

m_txedBufferSize -= m_txedBuffer.at (seqNumberValue)->GetSize ();


m_txedBuffer.at (seqNumberValue) = 0;
NS_ASSERT (m_retxBuffer.at (seqNumberValue).m_pdu != 0);
}
else if (m_retxBuffer.at (seqNumberValue).m_pdu)
else

{
m_retxBuffer.at (seqNumberValue).m_retxCount++;
NS_LOG_INFO ("Incr RETX_COUNT for SN = " << seqNumberValue);
if (m_retxBuffer.at (seqNumberValue).m_retxCount >= m_maxRetxThre
shold)
+
NS_LOG_LOGIC ("sn " << sn << " is ACKed");
+
+
if (m_txedBuffer.at (seqNumberValue).m_pdu)
+
{
+
NS_LOG_INFO ("ACKed SN = " << seqNumberValue << " from txedBu
ffer");
+
//
NS_LOG_INFO ("m_txedBuffer( " << m_vtA << "
)->GetSize = " << m_txedBuffer.at (m_vtA.GetValue ())->GetSize ());
+
m_txedBufferSize -= m_txedBuffer.at (seqNumberValue).m_pdu->G
etSize ();
+
m_txedBuffer.at (seqNumberValue).m_pdu = 0;
+
NS_ASSERT (m_retxBuffer.at (seqNumberValue).m_pdu == 0);
+
}
+
+
if (m_retxBuffer.at (seqNumberValue).m_pdu)
{
NS_LOG_INFO ("Max RETX_COUNT for SN = " << seqNumberValue);
+
NS_LOG_INFO ("ACKed SN = " << seqNumberValue << " from retxBu
ffer");
+
m_retxBufferSize -= m_retxBuffer.at (seqNumberValue).m_pdu->G
etSize ();
+
m_retxBuffer.at (seqNumberValue).m_pdu = 0;
+
m_retxBuffer.at (seqNumberValue).m_retxCount = 0;
}
+
}
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+

seqNumber++;
NS_LOG_LOGIC ("retxBufferSize = " << m_retxBufferSize);
NS_LOG_LOGIC ("txedBufferSize = " << m_txedBufferSize);
if (incrementVtA)
{
m_vtA++;
m_vtMs = m_vtA + m_windowSize;
NS_LOG_INFO ("New VT(A) = " << m_vtA);
m_vtA.SetModulusBase (m_vtA);
m_vtMs.SetModulusBase (m_vtA);
m_vtS.SetModulusBase (m_vtA);
ackSn.SetModulusBase (m_vtA);
sn.SetModulusBase (m_vtA);
}

} // loop over SN : VT(A) <= SN < ACK SN


return;

}
else
{
@@ -1493,59 +1535,6 @@
}

-/// \todo To remove


-// void
-// LteRlcAm::ReassembleOutsideWindow (void)
-// {
-// NS_LOG_LOGIC ("Reassemble Outside Window");
-//
-// std::map <uint16_t, Ptr<Packet> >::iterator it;
-// it = m_rxBuffer.begin ();
-//
-// while ( (it != m_rxBuffer.end ()) && ! IsInsideReorderingWindow (it->first
) )
-//
{
-//
NS_LOG_LOGIC ("SN = " << it->first);
-//
-//
// Reassemble RLC SDUs and deliver the PDCP PDU to upper layer
-//
ReassembleAndDeliver (it->second);
-//
m_rxBuffer.erase (it);
-//
it++;
-//
}
-//
-// if (it != m_rxBuffer.end ())
-//
{
-//
NS_LOG_LOGIC ("(SN = " << it->first << ") is inside the reordering win
dow");
-//
}
-// }
-/// \todo To remove
-// void
-// LteRlcAm::ReassembleSnLessThan (uint16_t seqNumber)
-// {
-// NS_LOG_LOGIC ("Reassemble SN < updated VR(UR)" );
-//
-// std::map <uint16_t, Ptr<Packet> >::iterator it;
-// it = m_rxBuffer.begin ();
-//
-// while ( (it != m_rxBuffer.end ()) && (it->first < seqNumber) )
-//
{
-//
NS_LOG_LOGIC ("SN = " << it->first);
-//
-//
// Reassemble RLC SDUs and deliver the PDCP PDU to upper layer
-//
ReassembleAndDeliver (it->second);
-//
m_rxBuffer.erase (it);
-//
it++;
-//
}
-//
-// if (it != m_rxBuffer.end ())
-//
{
-//
NS_LOG_LOGIC ("(SN = " << it->first << ") >= " << m_vrUr);
-//
}
-// }
void
LteRlcAm::DoReportBufferStatus (void)
{
@@ -1569,17 +1558,23 @@
}

// Retransmission Queue HOL time


- Time retxQueueHolDelay (0);
+ Time retxQueueHolDelay;
RlcTag retxQueueHolTimeTag;
if ( m_retxBufferSize > 0 )
{
m_retxBuffer.at (m_vtA.GetValue ()).m_pdu->PeekPacketTag (retxQueueHolTim
eTag);
+
if (m_retxBuffer.at (m_vtA.GetValue ()).m_pdu != 0)
+
{
+
m_retxBuffer.at (m_vtA.GetValue ()).m_pdu->PeekPacketTag (retxQueueHo
lTimeTag);
+
}
+
else
+
{
+
m_txedBuffer.at (m_vtA.GetValue ()).m_pdu->PeekPacketTag (retxQueueHo
lTimeTag);
+
}
retxQueueHolDelay = now - retxQueueHolTimeTag.GetSenderTimestamp ();
}
- else if ( m_txedBufferSize > 0 )
{
m_txedBuffer.at (m_vtA.GetValue ())->PeekPacketTag (retxQueueHolTimeTag);
retxQueueHolDelay = now - retxQueueHolTimeTag.GetSenderTimestamp ();
+ else
+
{
+
retxQueueHolDelay = Seconds (0);
}
LteMacSapProvider::ReportBufferStatusParameters r;
@@ -1631,7 +1626,7 @@
int firstVrMs = m_vrMs.GetValue ();
std::map <uint16_t, PduBuffer>::iterator it = m_rxonBuffer.find (m_vrMs.GetVa
lue ());
while ( it != m_rxonBuffer.end () &&
m_rxonBuffer[ m_vrMs.GetValue () ].m_pduComplete )
+
it->second.m_pduComplete )
{
m_vrMs++;
it = m_rxonBuffer.find (m_vrMs.GetValue ());
@@ -1643,11 +1638,16 @@
if ( m_vrH > m_vrMs )
{
NS_LOG_LOGIC ("Start reordering timer");
m_reorderingTimer = Simulator::Schedule (Time ("0.1s"),
+
m_reorderingTimer = Simulator::Schedule (m_reorderingTimerValue,
&LteRlcAm::ExpireReorderingTimer
,this);
m_vrX = m_vrH;
NS_LOG_LOGIC ("New VR(MS) = " << m_vrMs);
}
+
+
// Section 5.2.3 Status Reporting:
+
// - The receiving side of an AM RLC entity shall trigger a
+
//
STATUS report when T_reordering expires.
+ m_statusPduRequested = true;
}
void

@@ -1661,9 +1661,54 @@
NS_LOG_LOGIC ("txedBufferSize = " << m_txedBufferSize);
NS_LOG_LOGIC ("statusPduRequested = " << m_statusPduRequested);
- DoReportBufferStatus ();
+ m_pollRetransmitTimerJustExpired = true;
+
+ // see section 5.2.2.3
+ // note the difference between Rel 8 and Rel 11 specs; we follow Rel 11 here
+ NS_ASSERT (m_vtS <= m_vtMs);
+ if ((m_txonBufferSize == 0 && m_retxBufferSize == 0)
+
|| (m_vtS == m_vtMs))
+
{
+
NS_LOG_INFO ("txonBuffer and retxBuffer empty. Move PDUs up to = " << m_v
tS.GetValue () - 1 << " to retxBuffer");
+
uint16_t sn = 0;
+
for ( sn = m_vtA.GetValue(); sn < m_vtS.GetValue (); sn++ )
+
{
+
bool pduAvailable = m_txedBuffer.at (sn).m_pdu != 0;
+
+
if ( pduAvailable )
+
{
+
NS_LOG_INFO ("Move PDU " << sn << " from txedBuffer to retxBuffe
r");
+
m_retxBuffer.at (sn).m_pdu = m_txedBuffer.at (sn).m_pdu->Copy ()
;
+
m_retxBuffer.at (sn).m_retxCount = m_txedBuffer.at (sn).m_retxCo
unt;
+
m_retxBufferSize += m_retxBuffer.at (sn).m_pdu->GetSize ();
+
+
m_txedBufferSize -= m_txedBuffer.at (sn).m_pdu->GetSize ();
+
m_txedBuffer.at (sn).m_pdu = 0;
+
m_txedBuffer.at (sn).m_retxCount = 0;
+
}
+
}
+
}
+
+ DoReportBufferStatus ();
}
+void
+LteRlcAm::ExpireStatusProhibitTimer (void)
+{
+ NS_LOG_FUNCTION (this);
+}
+
+void
+LteRlcAm::ExpireRbsTimer (void)
+{
+ NS_LOG_LOGIC ("RBS Timer expires");
+
+ if (m_txonBufferSize + m_txedBufferSize + m_retxBufferSize > 0)
+
{
+
DoReportBufferStatus ();
+
m_rbsTimer = Simulator::Schedule (m_rbsTimerValue, &LteRlcAm::ExpireRbsTi
mer, this);
+
}
+}

} // namespace ns3
diff -Naur ns-3.22/src/lte/model/lte-rlc-am.h ns-3.23/src/lte/model/lte-rlc-am.h
--- ns-3.22/src/lte/model/lte-rlc-am.h 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rlc-am.h 2015-05-13 11:05:26.000000000 -0700
@@ -61,6 +61,13 @@
*/
void ExpireReorderingTimer (void);
void ExpirePollRetransmitTimer (void);
+ void ExpireRbsTimer (void);
+
+ /**
+ * method called when the T_status_prohibit timer expires
+ *
+ */
+ void ExpireStatusProhibitTimer (void);
bool IsInsideReceivingWindow (SequenceNumber10 seqNumber);
//
@@ -73,15 +80,17 @@
private:
std::vector < Ptr<Packet> > m_txonBuffer;
std::vector < Ptr<Packet> > m_txedBuffer;
er
+

// Transmission buffer
// Transmitted packets buff

struct RetxBuffer
struct RetxPdu
{
Ptr<Packet> m_pdu;
uint16_t
m_retxCount;
};

std::vector < RetxBuffer > m_retxBuffer;


// Retransmission buffer
+ std::vector <RetxPdu> m_txedBuffer; ///< Buffer for transmitted and retransm
itted PDUs
+
///< that have not been acked but are no
t considered
+
///< for retransmission
+ std::vector <RetxPdu> m_retxBuffer; ///< Buffer for PDUs considered for retr
ansmission
uint32_t m_txonBufferSize;
uint32_t m_retxBufferSize;
@@ -96,8 +105,6 @@
std::list < Ptr<Packet> > m_byteSegments;
-

bool
m_pduComplete;
uint16_t m_totalSize;
uint16_t m_currSize;

};

std::map <uint16_t, PduBuffer > m_rxonBuffer; // Reception buffer


@@ -142,7 +149,11 @@
EventId m_pollRetransmitTimer;
Time
m_pollRetransmitTimerValue;
EventId m_reorderingTimer;
+ Time
m_reorderingTimerValue;
EventId m_statusProhibitTimer;
+ Time
m_statusProhibitTimerValue;
+ EventId m_rbsTimer;

+ Time

m_rbsTimerValue;

/**
* Configurable parameters. See section 7.4 in TS 36.322
@@ -152,6 +163,7 @@
uint16_t m_pollByte;
bool m_txOpportunityForRetxAlwaysBigEnough;
+ bool m_pollRetransmitTimerJustExpired;
/**
* SDU Reassembling state
diff -Naur ns-3.22/src/lte/model/lte-rlc-am-header.cc ns-3.23/src/lte/model/lterlc-am-header.cc
--- ns-3.22/src/lte/model/lte-rlc-am-header.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-rlc-am-header.cc 2015-05-13 11:05:26.000000000 -0
700
@@ -38,8 +38,7 @@
m_segmentOffset (0xffff),
m_lastOffset (0xffff),
m_controlPduType (0xff),
m_ackSn (0xffff),
m_nackSn (0xffff)
+
m_ackSn (0xffff)
{
}
@@ -55,7 +54,6 @@
m_lastOffset = 0xffff;
m_controlPduType = 0xff;
m_ackSn = 0xffff;
m_nackSn = 0xffff;
}
void
@@ -214,6 +212,76 @@
m_ackSn = ackSn;
}
+bool
+LteRlcAmHeader::OneMoreNackWouldFitIn (uint16_t bytes)
+{
+ NS_LOG_FUNCTION (this << bytes);
+ NS_ASSERT_MSG (m_dataControlBit == CONTROL_PDU && m_controlPduType == LteRlcA
mHeader::STATUS_PDU,
+
"method allowed only for STATUS PDUs");
+ if (m_nackSnList.size () % 2 == 0)
+
{
+
return (m_headerLength < bytes);
+
}
+ else
+
{
+
return (m_headerLength < (bytes - 1));
+
}
+}
+
+void
+LteRlcAmHeader::PushNack (int nack)
+{

+ NS_LOG_FUNCTION (this << nack);


+ NS_ASSERT_MSG (m_dataControlBit == CONTROL_PDU && m_controlPduType == LteRlcA
mHeader::STATUS_PDU,
+
"method allowed only for STATUS PDUs");
+ m_nackSnList.push_back (nack);
+
+ if (m_nackSnList.size () % 2 == 0)
+
{
+
m_headerLength++;
+
}
+ else
+
{
+
m_headerLength+=2;
+
}
+}
+
+bool
+LteRlcAmHeader::IsNackPresent (SequenceNumber10 nack)
+{
+ NS_LOG_FUNCTION (this);
+ NS_ASSERT_MSG (m_dataControlBit == CONTROL_PDU && m_controlPduType == LteRlcA
mHeader::STATUS_PDU,
+
"method allowed only for STATUS PDUs");
+ for (std::list<int>::iterator nackIt = m_nackSnList.begin ();
+
nackIt != m_nackSnList.end ();
+
++nackIt)
+
{
+
if ((*nackIt) == nack.GetValue ())
+
{
+
return true;
+
}
+
}
+ return false;
+}
+
+int
+LteRlcAmHeader::PopNack (void)
+{
+ NS_LOG_FUNCTION (this);
+ NS_ASSERT_MSG (m_dataControlBit == CONTROL_PDU && m_controlPduType == LteRlcA
mHeader::STATUS_PDU,
+
"method allowed only for STATUS PDUs");
+ if ( m_nackSnList.empty () )
+
{
+
return -1;
+
}
+
+ int nack = m_nackSnList.front ();
+ m_nackSnList.pop_front ();
+
+ return nack;
+}
+
+
SequenceNumber10
LteRlcAmHeader::GetAckSn (void) const
{
@@ -226,6 +294,7 @@
{
static TypeId tid = TypeId ("ns3::LteRlcAmHeader")

.SetParent<Header> ()
.SetGroupName("Lte")
.AddConstructor<LteRlcAmHeader> ()

;
return tid;
@@ -242,6 +311,7 @@
{
std::list <uint8_t>::const_iterator it1 = m_extensionBits.begin ();
std::list <uint16_t>::const_iterator it2 = m_lengthIndicators.begin ();
+ std::list <int>::const_iterator it3 = m_nackSnList.begin ();
os << "Len=" << m_headerLength;
os << " D/C=" << (uint16_t)m_dataControlBit;
@@ -280,7 +350,14 @@
else // if ( m_dataControlBit == CONTROL_PDU )
{
os << " ACK_SN=" << m_ackSn;
os << " NACK_SN=" << m_nackSn;
+
+
while ( it3 != m_nackSnList.end () )
+
{
+
os << " NACK_SN=" << (int)(*it3);
+
it3++;
+
}
+
+
}
}
@@ -295,6 +372,7 @@
std::list <uint8_t>::const_iterator it1 = m_extensionBits.begin ();
std::list <uint16_t>::const_iterator it2 = m_lengthIndicators.begin ();
+ std::list <int>::const_iterator it3 = m_nackSnList.begin ();
if ( m_dataControlBit == DATA_PDU )
{
@@ -347,7 +425,77 @@
i.WriteU8 ( ((CONTROL_PDU << 7) & 0x80) |
((m_controlPduType << 4) & 0x70) |
((m_ackSn.GetValue () >> 6) & 0x0F) );
i.WriteU8 ( ((m_ackSn.GetValue () << 2) & 0xFC) );
+
// note: second part of ackSn will be written later
+
+
// serialize the NACKs
+
if ( it3 == m_nackSnList.end () )
+
{
+
NS_LOG_LOGIC (this << " no NACKs");
+
// If there are no NACKs then this line adds the rest of the ACK
+
// along with 0x00, indicating an E1 value of 0 or no NACKs follow.
+
i.WriteU8 ( ((m_ackSn.GetValue () << 2) & 0xFC) );
+
}
+
else
+
{
+
int oddNack = *it3;
+
int evenNack = -1;
+
// Else write out a series of E1 = 1 and NACK values. Note since we
+
// are not supporting SO start/end the value of E2 will always be 0.
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

// First write out the ACK along with the very first NACK
// And the remaining NACK with 0x02 or 10 in binary to set
// E1 to 1, then Or in the first bit of the NACK
i.WriteU8 ( ((m_ackSn.GetValue () << 2) & 0xFC)
| (0x02)
| ((*it3 >> 9) & 0x01));
while ( it3 != m_nackSnList.end () )
{
// The variable oddNack has the current NACK value to write, also
// either the setup to enter this loop or the previous loop would
// have written the highest order bit to the previouse octet.
// Write the next set of bits (2 - 9) into the next octet
i.WriteU8( ((oddNack >> 1) & 0xFF) );
// Next check to see if there is going to be another NACK after
// this
it3++;
if ( it3 != m_nackSnList.end () )
{
// Yes there will be another NACK after this, so E1 will be 1
evenNack = *it3;
i.WriteU8( ((oddNack << 7) & 0x80)
| (0x40) // E1 = 1 E2 = 0, more NACKs
| ( (evenNack >> 5) & 0x1F) );
// The final octet of this loop will have the rest of the
// NACK and another E1, E2. Check to see if there will be
// one more NACK after this.
it3++;
if ( it3 != m_nackSnList.end () )
{
// Yes there is at least one more NACK. Finish writing
// this octet and the next iteration will do the rest.
oddNack = *it3;
i.WriteU8 ( ((evenNack << 3) & 0xF8)
| (0x04)
| ((oddNack >> 9) & 0x01));
}
else
{
// No, there are no more NACKs
i.WriteU8 ( ((evenNack << 3) & 0xF8) );
}

}
else
{

}
}

// No, this is the last NACK so E1 will be 0


i.WriteU8 ( ((oddNack << 7) & 0x80) );

@@ -431,7 +579,65 @@
m_controlPduType = (byte_1 & 0x70) >> 4;
m_ackSn = ((byte_1 & 0x0F) << 6 ) | ((byte_2 & 0xFC) >> 2);

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

m_headerLength++;
int moreNacks = (byte_2 & 0x02) >> 1;
// Get the first NACK outside the loop as it is not preceded by an E2
// field but all following NACKs will.
if ( moreNacks == 1 )
{
byte_3 = i.ReadU8 ();
byte_4 = i.ReadU8 ();
m_headerLength = 4;
m_nackSnList.push_back (
((byte_2 & 0x01) << 9)
| (byte_3 << 1)
| ((byte_4 & 0x80) >> 7)
);
// Loop until all NACKs are found
moreNacks = ((byte_4 & 0x40) >> 6);
uint8_t byte = byte_4;
uint8_t nextByte;
uint8_t finalByte;
while (moreNacks == 1)
{
// Ignore E2, read next NACK
nextByte = i.ReadU8 ();
m_nackSnList.push_back (
((byte & 0x1F) << 5)
| ((nextByte & 0xF8) >> 3)
);
// Check for another NACK, after this any following NACKs will
// be aligned properly for the next iteration of this loop.
moreNacks = (nextByte & 0x04) >> 2;
byte = nextByte;
if (moreNacks == 1)
{
nextByte = i.ReadU8 ();
finalByte = i.ReadU8 ();
m_nackSnList.push_back (
((byte & 0x01) << 9)
| (nextByte << 1)
| ((finalByte & 0x80) >> 7)
);
moreNacks = ((finalByte & 0x40) >> 6);
byte = finalByte;
m_headerLength+=3;

}
else
{
}
}

}
else
{
}

m_headerLength++;

m_headerLength++;

}
return GetSerializedSize ();
diff -Naur ns-3.22/src/lte/model/lte-rlc-am-header.h ns-3.23/src/lte/model/lte-r
lc-am-header.h
--- ns-3.22/src/lte/model/lte-rlc-am-header.h 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-rlc-am-header.h 2015-05-13 11:05:26.000000000 -0
700
@@ -136,6 +136,41 @@
virtual void Serialize (Buffer::Iterator start) const;
virtual uint32_t Deserialize (Buffer::Iterator start);
+
+
+
+
+
+
e
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

/**
*
*
* \param bytes max allowed CONTROL PDU size
*
* \return true if one more NACK would fit in the CONTROL PDU; false otherwis
*/
bool OneMoreNackWouldFitIn (uint16_t bytes);
/**
* Add one more NACK to the CONTROL PDU
*
* \param nack
*/
void PushNack (int nack);
/**
*
*
* \param nack SN of the NACK
*
* \return true if the NACK is present in the STATUS PDU, false otherwise
*/
bool IsNackPresent (SequenceNumber10 nack);
/**
* Retrieve one NACK from the CONTROL PDU
*
*
* \return the SN >= 0 of the next nack; returns -1 if no NACK is left
*/
int PopNack (void);

private:
uint16_t m_headerLength;
uint8_t m_dataControlBit;
@@ -157,7 +192,7 @@
// Status PDU fields
SequenceNumber10 m_ackSn;
- SequenceNumber10 m_nackSn;
+ std::list <int> m_nackSnList;
std::list <uint8_t> m_extensionBits1; // Includes E1 after ACK_SN

std::list <uint8_t> m_extensionBits2;


diff -Naur ns-3.22/src/lte/model/lte-rlc.cc ns-3.23/src/lte/model/lte-rlc.cc
--- ns-3.22/src/lte/model/lte-rlc.cc
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rlc.cc
2015-05-13 11:05:26.000000000 -0700
@@ -102,6 +102,7 @@
{
static TypeId tid = TypeId ("ns3::LteRlc")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddTraceSource ("TxPDU",
"PDU transmission notified to the MAC.",
MakeTraceSourceAccessor (&LteRlc::m_txPdu),
@@ -185,6 +186,7 @@
{
static TypeId tid = TypeId ("ns3::LteRlcSm")
.SetParent<LteRlc> ()
+
.SetGroupName("Lte")
.AddConstructor<LteRlcSm> ()
;
return tid;
diff -Naur ns-3.22/src/lte/model/lte-rlc-header.cc ns-3.23/src/lte/model/lte-rlc
-header.cc
--- ns-3.22/src/lte/model/lte-rlc-header.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-rlc-header.cc
2015-05-13 11:05:26.000000000 -0
700
@@ -116,6 +116,7 @@
{
static TypeId tid = TypeId ("ns3::LteRlcHeader")
.SetParent<Header> ()
+
.SetGroupName("Lte")
.AddConstructor<LteRlcHeader> ()
;
return tid;
diff -Naur ns-3.22/src/lte/model/lte-rlc-sdu-status-tag.cc ns-3.23/src/lte/model
/lte-rlc-sdu-status-tag.cc
--- ns-3.22/src/lte/model/lte-rlc-sdu-status-tag.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/lte-rlc-sdu-status-tag.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -45,6 +45,7 @@
{
static TypeId tid = TypeId ("ns3::LteRlcSduStatusTag")
.SetParent<Tag> ()
+
.SetGroupName("Lte")
.AddConstructor<LteRlcSduStatusTag> ()
;
return tid;
diff -Naur ns-3.22/src/lte/model/lte-rlc-sequence-number.h ns-3.23/src/lte/model
/lte-rlc-sequence-number.h
--- ns-3.22/src/lte/model/lte-rlc-sequence-number.h
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/lte-rlc-sequence-number.h
2015-05-13 11:05:26.0000
00000 -0700
@@ -79,6 +79,7 @@
{
SequenceNumber10 retval (m_value);
m_value = ((uint32_t)m_value + 1) % 1024;
+
retval.SetModulusBase (m_modulusBase);
return retval;

}
diff -Naur ns-3.22/src/lte/model/lte-rlc-tag.cc ns-3.23/src/lte/model/lte-rlc-ta
g.cc
--- ns-3.22/src/lte/model/lte-rlc-tag.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-rlc-tag.cc
2015-05-13 11:05:26.000000000 -0
700
@@ -45,6 +45,7 @@
{
static TypeId tid = TypeId ("ns3::RlcTag")
.SetParent<Tag> ()
+
.SetGroupName("Lte")
.AddConstructor<RlcTag> ();
return tid;
}
diff -Naur ns-3.22/src/lte/model/lte-rlc-tm.cc ns-3.23/src/lte/model/lte-rlc-tm.
cc
--- ns-3.22/src/lte/model/lte-rlc-tm.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rlc-tm.cc 2015-05-13 11:05:26.000000000 -0700
@@ -48,6 +48,7 @@
{
static TypeId tid = TypeId ("ns3::LteRlcTm")
.SetParent<LteRlc> ()
+
.SetGroupName("Lte")
.AddConstructor<LteRlcTm> ()
.AddAttribute ("MaxTxBufferSize",
"Maximum Size of the Transmission Buffer (in Bytes)",
diff -Naur ns-3.22/src/lte/model/lte-rlc-um.cc ns-3.23/src/lte/model/lte-rlc-um.
cc
--- ns-3.22/src/lte/model/lte-rlc-um.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-rlc-um.cc 2015-05-13 11:05:26.000000000 -0700
@@ -56,6 +56,7 @@
{
static TypeId tid = TypeId ("ns3::LteRlcUm")
.SetParent<LteRlc> ()
+
.SetGroupName("Lte")
.AddConstructor<LteRlcUm> ()
.AddAttribute ("MaxTxBufferSize",
"Maximum Size of the Transmission Buffer (in Bytes)",
diff -Naur ns-3.22/src/lte/model/lte-rrc-header.cc ns-3.23/src/lte/model/lte-rrc
-header.cc
--- ns-3.22/src/lte/model/lte-rrc-header.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-rrc-header.cc
2015-05-13 11:05:26.000000000 -0
700
@@ -50,6 +50,7 @@
{
static TypeId tid = TypeId ("ns3::RrcAsn1Header")
.SetParent<Header> ()
+
.SetGroupName("Lte")
;
return tid;
}
@@ -3905,6 +3906,7 @@
{
static TypeId tid = TypeId ("ns3::RrcConnectionRequestHeader")
.SetParent<Header> ()
+
.SetGroupName("Lte")
;

return tid;
}
diff -Naur ns-3.22/src/lte/model/lte-rrc-protocol-ideal.cc ns-3.23/src/lte/model
/lte-rrc-protocol-ideal.cc
--- ns-3.22/src/lte/model/lte-rrc-protocol-ideal.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/lte-rrc-protocol-ideal.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -63,6 +63,7 @@
{
static TypeId tid = TypeId ("ns3::LteUeRrcProtocolIdeal")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddConstructor<LteUeRrcProtocolIdeal> ()
;
return tid;
@@ -230,6 +231,7 @@
{
static TypeId tid = TypeId ("ns3::LteEnbRrcProtocolIdeal")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddConstructor<LteEnbRrcProtocolIdeal> ()
;
return tid;
@@ -459,6 +461,7 @@
{
static TypeId tid = TypeId ("ns3::IdealHandoverPreparationInfoHeader")
.SetParent<Header> ()
+
.SetGroupName("Lte")
.AddConstructor<IdealHandoverPreparationInfoHeader> ()
;
return tid;
@@ -565,6 +568,7 @@
{
static TypeId tid = TypeId ("ns3::IdealHandoverCommandHeader")
.SetParent<Header> ()
+
.SetGroupName("Lte")
.AddConstructor<IdealHandoverCommandHeader> ()
;
return tid;
diff -Naur ns-3.22/src/lte/model/lte-rrc-protocol-real.cc ns-3.23/src/lte/model/
lte-rrc-protocol-real.cc
--- ns-3.22/src/lte/model/lte-rrc-protocol-real.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/lte-rrc-protocol-real.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -68,6 +68,7 @@
{
static TypeId tid = TypeId ("ns3::LteUeRrcProtocolReal")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddConstructor<LteUeRrcProtocolReal> ()
;
return tid;
@@ -383,6 +384,7 @@
{
static TypeId tid = TypeId ("ns3::LteEnbRrcProtocolReal")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddConstructor<LteEnbRrcProtocolReal> ()

;
return tid;
diff -Naur ns-3.22/src/lte/model/lte-spectrum-phy.cc ns-3.23/src/lte/model/lte-s
pectrum-phy.cc
--- ns-3.22/src/lte/model/lte-spectrum-phy.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-spectrum-phy.cc 2015-05-13 11:05:26.000000000 -0
700
@@ -148,7 +148,6 @@
m_interferenceData = 0;
m_interferenceCtrl->Dispose ();
m_interferenceCtrl = 0;
- m_ltePhyTxEndCallback
= MakeNullCallback< void, Ptr<const Packet> > ();
m_ltePhyRxDataEndErrorCallback = MakeNullCallback< void > ();
m_ltePhyRxDataEndOkCallback
= MakeNullCallback< void, Ptr<Packet> > ();
m_ltePhyRxCtrlEndOkCallback = MakeNullCallback< void, std::list<Ptr<LteContro
lMessage> > > ();
@@ -169,11 +168,17 @@
case LteSpectrumPhy::RX_DATA:
os << "RX_DATA";
break;
case LteSpectrumPhy::RX_CTRL:
os << "RX_CTRL";
+
case LteSpectrumPhy::RX_DL_CTRL:
+
os << "RX_DL_CTRL";
break;
case LteSpectrumPhy::TX:
os << "TX";
+
case LteSpectrumPhy::TX_DATA:
+
os << "TX_DATA";
+
break;
+
case LteSpectrumPhy::TX_DL_CTRL:
+
os << "TX_DL_CTRL";
+
break;
+
case LteSpectrumPhy::TX_UL_SRS:
+
os << "TX_UL_SRS";
break;
default:
os << "UNKNOWN";
@@ -187,6 +192,7 @@
{
static TypeId tid = TypeId ("ns3::LteSpectrumPhy")
.SetParent<SpectrumPhy> ()
+
.SetGroupName("Lte")
.AddTraceSource ("TxStart",
"Trace fired when a new transmission is started",
MakeTraceSourceAccessor (&LteSpectrumPhy::m_phyTxStartTrac
e),
@@ -324,15 +330,6 @@
}
-void
-LteSpectrumPhy::SetLtePhyTxEndCallback (LtePhyTxEndCallback c)
-{
- NS_LOG_FUNCTION (this);
- m_ltePhyTxEndCallback = c;
-}
-

void
LteSpectrumPhy::SetLtePhyRxDataEndErrorCallback (LtePhyRxDataEndErrorCallback c

{
@@ -431,13 +428,16 @@
m_phyTxStartTrace (pb);
switch (m_state)
- {
+
{
case RX_DATA:
case RX_CTRL:
+
case RX_DL_CTRL:
+
case RX_UL_SRS:
NS_FATAL_ERROR ("cannot TX while RX: according to FDD channel acces, the
physical layer for transmission cannot be used for reception");
break;
case TX:
+
+
case TX_DATA:
+
case TX_DL_CTRL:
+
case TX_UL_SRS:
NS_FATAL_ERROR ("cannot TX while already TX: the MAC should avoid this");
break;
@@ -455,7 +455,7 @@
// to be used for simulation purposes (e.g., the CellId). This
// is done by setting the ctrlMsgList parameter of
// LteSpectrumSignalParametersDataFrame
ChangeState (TX);
+
ChangeState (TX_DATA);
NS_ASSERT (m_channel);
Ptr<LteSpectrumSignalParametersDataFrame> txParams = Create<LteSpectrumSi
gnalParametersDataFrame> ();
txParams->duration = duration;
@@ -466,7 +466,7 @@
txParams->ctrlMsgList = ctrlMsgList;
txParams->cellId = m_cellId;
m_channel->StartTx (txParams);
m_endTxEvent = Simulator::Schedule (duration, &LteSpectrumPhy::EndTx, thi
s);
+
m_endTxEvent = Simulator::Schedule (duration, &LteSpectrumPhy::EndTxData,
this);
}
return false;
break;
@@ -484,17 +484,17 @@
NS_LOG_FUNCTION (this << " PSS " << (uint16_t)pss);
NS_LOG_LOGIC (this << " state: " << m_state);
-//
-

m_phyTxStartTrace (pb);

switch
{
case
case
+
case

(m_state)
RX_DATA:
RX_CTRL:
RX_DL_CTRL:

case RX_UL_SRS:
NS_FATAL_ERROR ("cannot TX while RX: according to FDD channel acces, the
physical layer for transmission cannot be used for reception");
break;
+
+
+

case TX:
case TX_DATA:
case TX_DL_CTRL:
case TX_UL_SRS:
NS_FATAL_ERROR ("cannot TX while already TX: the MAC should avoid this");
break;

@@ -511,7 +511,7 @@
// to be used for simulation purposes (e.g., the CellId). This
// is done by setting the cellId parameter of
// LteSpectrumSignalParametersDlCtrlFrame
ChangeState (TX);
+
ChangeState (TX_DL_CTRL);
NS_ASSERT (m_channel);
Ptr<LteSpectrumSignalParametersDlCtrlFrame> txParams = Create<LteSpectrum
SignalParametersDlCtrlFrame> ();
@@ -523,7 +523,7 @@
txParams->pss = pss;
txParams->ctrlMsgList = ctrlMsgList;
m_channel->StartTx (txParams);
m_endTxEvent = Simulator::Schedule (DL_CTRL_DURATION, &LteSpectrumPhy::En
dTx, this);
+
m_endTxEvent = Simulator::Schedule (DL_CTRL_DURATION, &LteSpectrumPhy::En
dTxDlCtrl, this);
}
return false;
break;
@@ -542,16 +542,17 @@
NS_LOG_FUNCTION (this);
NS_LOG_LOGIC (this << " state: " << m_state);
- // m_phyTxStartTrace (pb);
switch (m_state)
- {
+
{
case RX_DATA:
case RX_CTRL:
+
case RX_DL_CTRL:
+
case RX_UL_SRS:
NS_FATAL_ERROR ("cannot TX while RX: according to FDD channel acces, the
physical layer for transmission cannot be used for reception");
break;
+
+
+

case TX:
case TX_DL_CTRL:
case TX_DATA:
case TX_UL_SRS:
NS_FATAL_ERROR ("cannot TX while already TX: the MAC should avoid this");
break;

@@ -569,7 +570,7 @@
// to be used for simulation purposes (e.g., the CellId). This
// is done by setting the cellId parameter of

// LteSpectrumSignalParametersDlCtrlFrame
ChangeState (TX);
ChangeState (TX_UL_SRS);
NS_ASSERT (m_channel);
Ptr<LteSpectrumSignalParametersUlSrsFrame> txParams = Create<LteSpectrumS
ignalParametersUlSrsFrame> ();
txParams->duration = UL_SRS_DURATION;
@@ -578,7 +579,7 @@
txParams->psd = m_txPsd;
txParams->cellId = m_cellId;
m_channel->StartTx (txParams);
m_endTxEvent = Simulator::Schedule (UL_SRS_DURATION, &LteSpectrumPhy::End
Tx, this);
+
m_endTxEvent = Simulator::Schedule (UL_SRS_DURATION, &LteSpectrumPhy::End
TxUlSrs, this);
}
return false;
break;
@@ -593,30 +594,42 @@
+

void
-LteSpectrumPhy::EndTx ()
+LteSpectrumPhy::EndTxData ()
{
NS_LOG_FUNCTION (this);
NS_LOG_LOGIC (this << " state: " << m_state);
- NS_ASSERT (m_state == TX);
+ NS_ASSERT (m_state == TX_DATA);
m_phyTxEndTrace (m_txPacketBurst);
+ m_txPacketBurst = 0;
+ ChangeState (IDLE);
+}
- if (!m_ltePhyTxEndCallback.IsNull ())
{
for (std::list<Ptr<Packet> >::const_iterator iter = m_txPacketBurst->Begi
n (); iter
!= m_txPacketBurst->End (); ++iter)
{
Ptr<Packet> packet = (*iter)->Copy ();
m_ltePhyTxEndCallback (packet);
}
}
+void
+LteSpectrumPhy::EndTxDlCtrl ()
+{
+ NS_LOG_FUNCTION (this);
+ NS_LOG_LOGIC (this << " state: " << m_state);
- m_txPacketBurst = 0;
+ NS_ASSERT (m_state == TX_DL_CTRL);
+ NS_ASSERT (m_txPacketBurst == 0);
+ ChangeState (IDLE);
+}
+
+void
+LteSpectrumPhy::EndTxUlSrs ()

+{
+
+
+
+
+
}
+
+

NS_LOG_FUNCTION (this);
NS_LOG_LOGIC (this << " state: " << m_state);
NS_ASSERT (m_state == TX_UL_SRS);
NS_ASSERT (m_txPacketBurst == 0);
ChangeState (IDLE);

void
LteSpectrumPhy::StartRx (Ptr<SpectrumSignalParameters> spectrumRxParams)
{
@@ -629,28 +642,29 @@
// the device might start RX only if the signal is of a type
// understood by this device - in this case, an LTE signal.
Ptr<LteSpectrumSignalParametersDataFrame> lteDataRxParams = DynamicCast<LteSp
ectrumSignalParametersDataFrame> (spectrumRxParams);
+ Ptr<LteSpectrumSignalParametersDlCtrlFrame> lteDlCtrlRxParams = DynamicCast<L
teSpectrumSignalParametersDlCtrlFrame> (spectrumRxParams);
+ Ptr<LteSpectrumSignalParametersUlSrsFrame> lteUlSrsRxParams = DynamicCast<Lte
SpectrumSignalParametersUlSrsFrame> (spectrumRxParams);
if (lteDataRxParams != 0)
{
m_interferenceData->AddSignal (rxPsd, duration);
StartRxData (lteDataRxParams);
}
- else
+ else if (lteDlCtrlRxParams!=0)
{
Ptr<LteSpectrumSignalParametersDlCtrlFrame> lteDlCtrlRxParams = DynamicCa
st<LteSpectrumSignalParametersDlCtrlFrame> (spectrumRxParams);
Ptr<LteSpectrumSignalParametersUlSrsFrame> lteUlSrsRxParams = DynamicCast
<LteSpectrumSignalParametersUlSrsFrame> (spectrumRxParams);
if ((lteDlCtrlRxParams!=0)||(lteUlSrsRxParams!=0))
{
m_interferenceCtrl->AddSignal (rxPsd, duration);
StartRxCtrl (spectrumRxParams);
}
else
{
// other type of signal (could be 3G, GSM, whatever) -> interference
m_interferenceData->AddSignal (rxPsd, duration);
m_interferenceCtrl->AddSignal (rxPsd, duration);
}
+
m_interferenceCtrl->AddSignal (rxPsd, duration);
+
StartRxDlCtrl (lteDlCtrlRxParams);
}
+ else if (lteUlSrsRxParams!=0)
+
{
+
m_interferenceCtrl->AddSignal (rxPsd, duration);
+
StartRxUlSrs (lteUlSrsRxParams);
+
}
+ else
+
{
+
// other type of signal (could be 3G, GSM, whatever) -> interference
+
m_interferenceData->AddSignal (rxPsd, duration);

+
+

m_interferenceCtrl->AddSignal (rxPsd, duration);

void
@@ -659,10 +673,12 @@
NS_LOG_FUNCTION (this);
switch (m_state)
{
case TX:
+
case TX_DATA:
+
case TX_DL_CTRL:
+
case TX_UL_SRS:
NS_FATAL_ERROR ("cannot RX while TX: according to FDD channel access, t
he physical layer for transmission cannot be used for reception");
break;
case RX_CTRL:
+
case RX_DL_CTRL:
NS_FATAL_ERROR ("cannot RX Data while receiving control");
break;
case IDLE:
@@ -730,101 +746,155 @@
void
-LteSpectrumPhy::StartRxCtrl (Ptr<SpectrumSignalParameters> params)
+LteSpectrumPhy::StartRxDlCtrl (Ptr<LteSpectrumSignalParametersDlCtrlFrame> lteD
lCtrlRxParams)
{
NS_LOG_FUNCTION (this);
+
+ // To check if we're synchronized to this signal, we check
+ // for the CellId which is reported in the
+ // LteSpectrumSignalParametersDlCtrlFrame
+ uint16_t cellId;
+ NS_ASSERT (lteDlCtrlRxParams != 0);
+ cellId = lteDlCtrlRxParams->cellId;
+
switch (m_state)
- {
case TX:
+
{
+
case TX_DATA:
+
case TX_DL_CTRL:
+
case TX_UL_SRS:
+
case RX_DATA:
+
case RX_UL_SRS:
+
NS_FATAL_ERROR ("unexpected event in state " << m_state);
+
break;
+
+
case RX_DL_CTRL:
+
case IDLE:
+
+
// common code for the two states
+
// check presence of PSS for UE measuerements
+
if (lteDlCtrlRxParams->pss == true)
+
{
+
if (!m_ltePhyRxPssCallback.IsNull ())
+
{
+
m_ltePhyRxPssCallback (cellId, lteDlCtrlRxParams->psd);

+
+
+
+
+
+
+
+

// differentiated code for the two states


switch (m_state)
{
case RX_DL_CTRL:
NS_ASSERT_MSG (m_cellId != cellId, "any other DlCtrl should be from a
different cell");
+
NS_LOG_LOGIC (this << " ignoring other DlCtrl (cellId="
+
<< cellId << ", m_cellId=" << m_cellId << ")");
+
break;
+
+
case IDLE:
+
if (cellId == m_cellId)
+
{
+
NS_LOG_LOGIC (this << " synchronized with this signal (cellId=" <
< cellId << ")");
+
+
NS_ASSERT (m_rxControlMessageList.empty ());
+
m_firstRxStart = Simulator::Now ();
+
m_firstRxDuration = lteDlCtrlRxParams->duration;
+
NS_LOG_LOGIC (this << " scheduling EndRx with delay " << lteDlCtr
lRxParams->duration);
+
+
// store the DCIs
+
m_rxControlMessageList = lteDlCtrlRxParams->ctrlMsgList;
+
m_endRxDlCtrlEvent = Simulator::Schedule (lteDlCtrlRxParams->dura
tion, &LteSpectrumPhy::EndRxDlCtrl, this);
+
ChangeState (RX_DL_CTRL);
+
m_interferenceCtrl->StartRx (lteDlCtrlRxParams->psd);
+
}
+
else
+
{
+
NS_LOG_LOGIC (this << " not synchronizing with this signal (cellI
d="
+
<< cellId << ", m_cellId=" << m_cellId << ")");
+
}
+
break;
+
+
default:
+
NS_FATAL_ERROR ("unexpected event in state " << m_state);
+
break;
+
}
+
break; // case RX_DL_CTRL or IDLE
+
+
default:
+
NS_FATAL_ERROR ("unknown state");
+
break;
+
}
+
+ NS_LOG_LOGIC (this << " state: " << m_state);
+}
+
+
+
+
+void
+LteSpectrumPhy::StartRxUlSrs (Ptr<LteSpectrumSignalParametersUlSrsFrame> lteUlS

rsRxParams)
+{
+ NS_LOG_FUNCTION (this);
+ switch (m_state)
+
{
+
case TX_DATA:
+
case TX_DL_CTRL:
+
case TX_UL_SRS:
NS_FATAL_ERROR ("cannot RX while TX: according to FDD channel access, the
physical layer for transmission cannot be used for reception");
break;
+
case RX_DATA:
NS_FATAL_ERROR ("cannot RX data while receing control");
+
case RX_DL_CTRL:
+
NS_FATAL_ERROR ("cannot RX SRS while receiving something else");
break;
+
case IDLE:
case RX_CTRL:
+
case RX_UL_SRS:
// the behavior is similar when
// we're IDLE or RX because we can receive more signals
// simultaneously (e.g., at the eNB).
+
// we're IDLE or RX_UL_SRS because we can receive more signals
+
// simultaneously at the eNB
{
// To check if we're synchronized to this signal, we check
// for the CellId which is reported in the
// LteSpectrumSignalParametersDlCtrlFrame
uint16_t cellId;
bool dl;
Ptr<LteSpectrumSignalParametersDlCtrlFrame> lteDlCtrlRxParams = Dynamic
Cast<LteSpectrumSignalParametersDlCtrlFrame> (params);
if (lteDlCtrlRxParams!=0)
{
cellId = lteDlCtrlRxParams->cellId;
dl = true;
}
else
{
Ptr<LteSpectrumSignalParametersUlSrsFrame> lteUlSrsRxParams = Dynam
icCast<LteSpectrumSignalParametersUlSrsFrame> (params);
cellId = lteUlSrsRxParams->cellId;
dl = false;
}
if (dl)
{
// check presence of PSS for UE measuerements
if (lteDlCtrlRxParams->pss == true)
{
SpectrumValue pssPsd = *params->psd;
if (!m_ltePhyRxPssCallback.IsNull ())
{
m_ltePhyRxPssCallback (cellId, params->psd);
}
}
}
+
cellId = lteUlSrsRxParams->cellId;
if (cellId == m_cellId)

{
NS_LOG_LOGIC (this << " synchronized with this signal (cellId=" << ce
llId << ")");
if (m_state == IDLE)
{
// first transmission, i.e., we're IDLE and we
// start RX
NS_ASSERT (m_rxControlMessageList.empty ());
m_firstRxStart = Simulator::Now ();
m_firstRxDuration = params->duration;
NS_LOG_LOGIC (this << " scheduling EndRx with delay " << params->du
ration);
if (dl==true)
+
NS_LOG_LOGIC (this << " synchronized with this signal (cellId=" <<
cellId << ")");
+
if (m_state == IDLE)
{
// store the DCIs
m_rxControlMessageList = lteDlCtrlRxParams->ctrlMsgList;
m_endRxDlCtrlEvent = Simulator::Schedule (params->duration, &Lt
eSpectrumPhy::EndRxDlCtrl, this);
+
// first transmission, i.e., we're IDLE and we
+
// start RX
+
NS_ASSERT (m_rxControlMessageList.empty ());
+
m_firstRxStart = Simulator::Now ();
+
m_firstRxDuration = lteUlSrsRxParams->duration;
+
NS_LOG_LOGIC (this << " scheduling EndRx with delay " << lteUlS
rsRxParams->duration);
+
+
m_endRxUlSrsEvent = Simulator::Schedule (lteUlSrsRxParams->dura
tion, &LteSpectrumPhy::EndRxUlSrs, this);
}
else
+
else if (m_state == RX_UL_SRS)
{
m_endRxUlSrsEvent = Simulator::Schedule (params->duration, &Lte
SpectrumPhy::EndRxUlSrs, this);
}
+
// sanity check: if there are multiple RX events, they
+
// should occur at the same time and have the same
+
// duration, otherwise the interference calculation
+
// won't be correct
+
NS_ASSERT ((m_firstRxStart == Simulator::Now ())
+
&& (m_firstRxDuration == lteUlSrsRxParams->duration)
);
+
}
+
ChangeState (RX_UL_SRS);
+
m_interferenceCtrl->StartRx (lteUlSrsRxParams->psd);
}
else if (m_state == RX_CTRL)
+
else
{
// sanity check: if there are multiple RX events, they
// should occur at the same time and have the same
// duration, otherwise the interference calculation
// won't be correct
NS_ASSERT ((m_firstRxStart == Simulator::Now ())
&& (m_firstRxDuration == params->duration));
+
NS_LOG_LOGIC (this << " not in sync with this signal (cellId="
+
<< cellId << ", m_cellId=" << m_cellId << ")");

}
ChangeState (RX_CTRL);
m_interferenceCtrl->StartRx (params->psd);
-//
NS_LOG_LOGIC (this << " numSimultaneousRxEvents = " << m_rxPacketB
urstList.size ());
}
else
{
NS_LOG_LOGIC (this << " not in sync with this signal (cellId="
<< cellId << ", m_cellId=" << m_cellId << ")");
}
}
break;
default:
NS_FATAL_ERROR ("unknown state");
break;
- }
+
default:
+
NS_FATAL_ERROR ("unknown state");
+
break;
+
}
NS_LOG_LOGIC (this << " state: " << m_state);
}
@@ -1062,7 +1132,7 @@
NS_LOG_FUNCTION (this);
NS_LOG_LOGIC (this << " state: " << m_state);
- NS_ASSERT (m_state == RX_CTRL);
+ NS_ASSERT (m_state == RX_DL_CTRL);
// this will trigger CQI calculation and Error Model evaluation
// as a side effect, the error model should update the error status of all TB

s
@@ -1108,7 +1178,7 @@
void
LteSpectrumPhy::EndRxUlSrs ()
{
- NS_ASSERT (m_state == RX_CTRL);
+ NS_ASSERT (m_state == RX_UL_SRS);
ChangeState (IDLE);
m_interferenceCtrl->EndRx ();
// nothing to do (used only for SRS at this stage)
diff -Naur ns-3.22/src/lte/model/lte-spectrum-phy.h ns-3.23/src/lte/model/lte-sp
ectrum-phy.h
--- ns-3.22/src/lte/model/lte-spectrum-phy.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/model/lte-spectrum-phy.h
2015-05-13 11:05:26.000000000 -0
700
@@ -162,7 +162,7 @@
*/
enum State
{
IDLE, TX, RX_DATA, RX_CTRL
+
IDLE, TX_DL_CTRL, TX_DATA, TX_UL_SRS, RX_DL_CTRL, RX_DATA, RX_UL_SRS
};

// inherited from Object


@@ -179,7 +179,8 @@
Ptr<AntennaModel> GetRxAntenna ();
void StartRx (Ptr<SpectrumSignalParameters> params);
void StartRxData (Ptr<LteSpectrumSignalParametersDataFrame> params);
- void StartRxCtrl (Ptr<SpectrumSignalParameters> params);
+ void StartRxDlCtrl (Ptr<LteSpectrumSignalParametersDlCtrlFrame> lteDlCtrlRxPa
rams);
+ void StartRxUlSrs (Ptr<LteSpectrumSignalParametersUlSrsFrame> lteUlSrsRxParam
s);
void SetHarqPhyModule (Ptr<LteHarqPhy> harq);
@@ -420,7 +421,9 @@
private:
void ChangeState (State newState);
- void EndTx ();
+ void EndTxData ();
+ void EndTxDlCtrl ();
+ void EndTxUlSrs ();
void EndRxData ();
void EndRxDlCtrl ();
void EndRxUlSrs ();
@@ -453,7 +456,6 @@
TracedCallback<Ptr<const Packet> > m_phyRxEndOkTrace;
TracedCallback<Ptr<const Packet> > m_phyRxEndErrorTrace;
- LtePhyTxEndCallback
m_ltePhyTxEndCallback;
LtePhyRxDataEndErrorCallback m_ltePhyRxDataEndErrorCallback;
LtePhyRxDataEndOkCallback
m_ltePhyRxDataEndOkCallback;
diff -Naur ns-3.22/src/lte/model/lte-ue-mac.cc ns-3.23/src/lte/model/lte-ue-mac.
cc
--- ns-3.22/src/lte/model/lte-ue-mac.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-ue-mac.cc 2015-05-13 11:05:26.000000000 -0700
@@ -195,6 +195,7 @@
{
static TypeId tid = TypeId ("ns3::LteUeMac")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddConstructor<LteUeMac> ();
return tid;
}
diff -Naur ns-3.22/src/lte/model/lte-ue-phy.cc ns-3.23/src/lte/model/lte-ue-phy.
cc
--- ns-3.22/src/lte/model/lte-ue-phy.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-ue-phy.cc 2015-05-13 11:05:26.000000000 -0700
@@ -22,6 +22,7 @@
#include
#include
+#include
#include
#include
#include
@@ -162,7

<ns3/object-factory.h>
<ns3/log.h>
<ns3/node.h>
<cfloat>
<cmath>
<ns3/simulator.h>
+163,6 @@

NS_ASSERT_MSG (Simulator::Now ().GetNanoSeconds () == 0,

"Cannot create UE devices after simulation started");


- Simulator::ScheduleNow (&LteUePhy::SubframeIndication, this, 1, 1);
Simulator::Schedule (m_ueMeasurementsFilterPeriod, &LteUePhy::ReportUeMeasure
ments, this);
DoReset ();
@@ -190,6 +190,7 @@
{
static TypeId tid = TypeId ("ns3::LteUePhy")
.SetParent<LtePhy> ()
+
.SetGroupName("Lte")
.AddConstructor<LteUePhy> ()
.AddAttribute ("TxPower",
"Transmission power in dBm",
@@ -301,6 +302,25 @@
LteUePhy::DoInitialize ()
{
NS_LOG_FUNCTION (this);
+ bool haveNodeId = false;
+ uint32_t nodeId = 0;
+ if (m_netDevice != 0)
+
{
+
Ptr<Node> node = m_netDevice->GetNode ();
+
if (node != 0)
+
{
+
nodeId = node->GetId ();
+
haveNodeId = true;
+
}
+
}
+ if (haveNodeId)
+
{
+
Simulator::ScheduleWithContext (nodeId, Seconds (0), &LteUePhy::SubframeI
ndication, this, 1, 1);
+
}
+ else
+
{
+
Simulator::ScheduleNow (&LteUePhy::SubframeIndication, this, 1, 1);
+
}
LtePhy::DoInitialize ();
}
@@ -558,9 +578,15 @@
// store measurements
std::map <uint16_t, UeMeasurementsElement>::iterator itMeasMap;
itMeasMap = m_ueMeasurementsMap.find ((*itPss).cellId);
NS_ASSERT (itMeasMap != m_ueMeasurementsMap.end ());
(*itMeasMap).second.rsrqSum += rsrq_dB;
(*itMeasMap).second.rsrqNum++;
+
if (itMeasMap != m_ueMeasurementsMap.end ())
+
{
+
(*itMeasMap).second.rsrqSum += rsrq_dB;
+
(*itMeasMap).second.rsrqNum++;
+
}
+
else
+
{
+
NS_LOG_WARN ("race condition of bug 2091 occurred");
+
}
}
itPss++;

diff -Naur ns-3.22/src/lte/model/lte-ue-power-control.cc ns-3.23/src/lte/model/l


te-ue-power-control.cc
--- ns-3.22/src/lte/model/lte-ue-power-control.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/lte-ue-power-control.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -72,6 +72,7 @@
{
static TypeId tid = TypeId ("ns3::LteUePowerControl")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddConstructor<LteUePowerControl> ()
.AddAttribute ("ClosedLoop",
"If true Closed Loop mode will be active, otherwise Open Loo
p",
diff -Naur ns-3.22/src/lte/model/lte-ue-rrc.cc ns-3.23/src/lte/model/lte-ue-rrc.
cc
--- ns-3.22/src/lte/model/lte-ue-rrc.cc 2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/model/lte-ue-rrc.cc 2015-05-13 11:05:26.000000000 -0700
@@ -169,6 +169,7 @@
{
static TypeId tid = TypeId ("ns3::LteUeRrc")
.SetParent<Object> ()
+
.SetGroupName("Lte")
.AddConstructor<LteUeRrc> ()
.AddAttribute ("DataRadioBearerMap", "List of UE RadioBearerInfo for Data R
adio Bearers by LCID.",
ObjectMapValue (),
diff -Naur ns-3.22/src/lte/model/no-op-handover-algorithm.cc ns-3.23/src/lte/mod
el/no-op-handover-algorithm.cc
--- ns-3.22/src/lte/model/no-op-handover-algorithm.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/no-op-handover-algorithm.cc 2015-05-13 11:05:26.0000
00000 -0700
@@ -56,6 +56,7 @@
{
static TypeId tid = TypeId ("ns3::NoOpHandoverAlgorithm")
.SetParent<LteHandoverAlgorithm> ()
+
.SetGroupName("Lte")
.AddConstructor<NoOpHandoverAlgorithm> ()
;
return tid;
diff -Naur ns-3.22/src/lte/model/pf-ff-mac-scheduler.cc ns-3.23/src/lte/model/pf
-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/pf-ff-mac-scheduler.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/pf-ff-mac-scheduler.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -252,6 +252,7 @@
{
static TypeId tid = TypeId ("ns3::PfFfMacScheduler")
.SetParent<FfMacScheduler> ()
+
.SetGroupName("Lte")
.AddConstructor<PfFfMacScheduler> ()
.AddAttribute ("CqiTimerThreshold",
"The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/pss-ff-mac-scheduler.cc ns-3.23/src/lte/model/p
ss-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/pss-ff-mac-scheduler.cc
2015-02-05 15:46:22.0000
00000 -0800

+++ ns-3.23/src/lte/model/pss-ff-mac-scheduler.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -255,6 +255,7 @@
{
static TypeId tid = TypeId ("ns3::PssFfMacScheduler")
.SetParent<FfMacScheduler> ()
+
.SetGroupName("Lte")
.AddConstructor<PssFfMacScheduler> ()
.AddAttribute ("CqiTimerThreshold",
"The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/rem-spectrum-phy.cc ns-3.23/src/lte/model/rem-s
pectrum-phy.cc
--- ns-3.22/src/lte/model/rem-spectrum-phy.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/model/rem-spectrum-phy.cc 2015-05-13 11:05:26.000000000 -0
700
@@ -68,6 +68,7 @@
{
static TypeId tid = TypeId ("ns3::RemSpectrumPhy")
.SetParent<SpectrumPhy> ()
+
.SetGroupName("Lte")
.AddConstructor<RemSpectrumPhy> ()
;
return tid;
diff -Naur ns-3.22/src/lte/model/rr-ff-mac-scheduler.cc ns-3.23/src/lte/model/rr
-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/rr-ff-mac-scheduler.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/rr-ff-mac-scheduler.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -251,6 +251,7 @@
{
static TypeId tid = TypeId ("ns3::RrFfMacScheduler")
.SetParent<FfMacScheduler> ()
+
.SetGroupName("Lte")
.AddConstructor<RrFfMacScheduler> ()
.AddAttribute ("CqiTimerThreshold",
"The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/tdbet-ff-mac-scheduler.cc ns-3.23/src/lte/model
/tdbet-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/tdbet-ff-mac-scheduler.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/tdbet-ff-mac-scheduler.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -249,6 +249,7 @@
{
static TypeId tid = TypeId ("ns3::TdBetFfMacScheduler")
.SetParent<FfMacScheduler> ()
+
.SetGroupName("Lte")
.AddConstructor<TdBetFfMacScheduler> ()
.AddAttribute ("CqiTimerThreshold",
"The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/tdmt-ff-mac-scheduler.cc ns-3.23/src/lte/model/
tdmt-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/tdmt-ff-mac-scheduler.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/tdmt-ff-mac-scheduler.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -248,6 +248,7 @@
{

static TypeId tid = TypeId ("ns3::TdMtFfMacScheduler")


.SetParent<FfMacScheduler> ()
+
.SetGroupName("Lte")
.AddConstructor<TdMtFfMacScheduler> ()
.AddAttribute ("CqiTimerThreshold",
"The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/tdtbfq-ff-mac-scheduler.cc ns-3.23/src/lte/mode
l/tdtbfq-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/tdtbfq-ff-mac-scheduler.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/tdtbfq-ff-mac-scheduler.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -253,6 +253,7 @@
{
static TypeId tid = TypeId ("ns3::TdTbfqFfMacScheduler")
.SetParent<FfMacScheduler> ()
+
.SetGroupName("Lte")
.AddConstructor<TdTbfqFfMacScheduler> ()
.AddAttribute ("CqiTimerThreshold",
"The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/model/trace-fading-loss-model.cc ns-3.23/src/lte/mode
l/trace-fading-loss-model.cc
--- ns-3.22/src/lte/model/trace-fading-loss-model.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/trace-fading-loss-model.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -59,6 +59,7 @@
{
static TypeId tid = TypeId ("ns3::TraceFadingLossModel")
.SetParent<SpectrumPropagationLossModel> ()
+
.SetGroupName("Lte")
.AddConstructor<TraceFadingLossModel> ()
.AddAttribute ("TraceFilename",
"Name of file to load a trace from.",
diff -Naur ns-3.22/src/lte/model/tta-ff-mac-scheduler.cc ns-3.23/src/lte/model/t
ta-ff-mac-scheduler.cc
--- ns-3.22/src/lte/model/tta-ff-mac-scheduler.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/model/tta-ff-mac-scheduler.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -248,6 +248,7 @@
{
static TypeId tid = TypeId ("ns3::TtaFfMacScheduler")
.SetParent<FfMacScheduler> ()
+
.SetGroupName("Lte")
.AddConstructor<TtaFfMacScheduler> ()
.AddAttribute ("CqiTimerThreshold",
"The number of TTIs a CQI is valid (default 1000 - 1 sec.)",
diff -Naur ns-3.22/src/lte/test/lte-simple-helper.cc ns-3.23/src/lte/test/lte-si
mple-helper.cc
--- ns-3.22/src/lte/test/lte-simple-helper.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/test/lte-simple-helper.cc 2015-05-13 11:05:26.000000000 -0
700
@@ -149,6 +149,8 @@
m_enbMac = CreateObject<LteTestMac> ();
m_enbMac->SetDevice (enbDev);
+ m_enbRrc->SetDevice (enbDev);
+

enbDev->SetReceiveCallback (MakeCallback (&LteTestMac::Receive, m_enbMac));


// Connect SAPs: RRC <-> PDCP <-> RLC <-> MAC
diff -Naur ns-3.22/src/lte/test/lte-test-downlink-power-control.cc ns-3.23/src/l
te/test/lte-test-downlink-power-control.cc
--- ns-3.22/src/lte/test/lte-test-downlink-power-control.cc
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-downlink-power-control.cc
2015-05-13 11:05
:26.000000000 -0700
@@ -41,9 +41,11 @@
#include <ns3/lte-ue-rrc.h>
#include "lte-ffr-simple.h"
-#include "lte-test-sinr-chunk-processor.h"
#include <ns3/lte-common.h>
+
+#include <ns3/lte-chunk-processor.h>
+
#include "lte-test-downlink-power-control.h"
#include <ns3/lte-rrc-sap.h>
@@ -441,17 +443,21 @@
Ptr<LtePhy> ue1Phy = ueDevs.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()>GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testDlDataPowerReceived = Create<LteTestSinrCh
unkProcessor> ();
+ Ptr<LteChunkProcessor> testDlDataPowerReceived = Create<LteChunkProcessor> ()
;
+ LteSpectrumValueCatcher dlDataPowerReceivedCatcher;
+ testDlDataPowerReceived->AddCallback (MakeCallback (&LteSpectrumValueCatcher:
:ReportValue, &dlDataPowerReceivedCatcher));
ue1Phy->GetDownlinkSpectrumPhy ()->AddDataPowerChunkProcessor (testDlDataPowe
rReceived);
- Ptr<LteTestSinrChunkProcessor> testDlCtrlPowerReceived = Create<LteTestSinrCh
unkProcessor> ();
+ Ptr<LteChunkProcessor> testDlCtrlPowerReceived = Create<LteChunkProcessor> ()
;
+ LteSpectrumValueCatcher dlCtrlPowerReceivedCatcher;
+ testDlCtrlPowerReceived->AddCallback (MakeCallback (&LteSpectrumValueCatcher:
:ReportValue, &dlCtrlPowerReceivedCatcher));
ue1Phy->GetDownlinkSpectrumPhy ()->AddRsPowerChunkProcessor (testDlCtrlPowerR
eceived);
Simulator::Stop (Seconds (0.400));
Simulator::Run ();
- double dataPower
erator[] (0));
- double ctrlPower
erator[] (0));
+ double dataPower
>operator[] (0));
+ double ctrlPower
>operator[] (0));
double powerDiff

= 10.0 * std::log10 (testDlDataPowerReceived->GetSinr ()->op


= 10.0 * std::log10 (testDlCtrlPowerReceived->GetSinr ()->op
= 10.0 * std::log10 (dlDataPowerReceivedCatcher.GetValue ()= 10.0 * std::log10 (dlCtrlPowerReceivedCatcher.GetValue ()= (-1.0)*ctrlPower + dataPower;

NS_LOG_DEBUG ("DataPower: " << dataPower);


diff -Naur ns-3.22/src/lte/test/lte-test-downlink-sinr.cc ns-3.23/src/lte/test/l
te-test-downlink-sinr.cc
--- ns-3.22/src/lte/test/lte-test-downlink-sinr.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/test/lte-test-downlink-sinr.cc
2015-05-13 11:05:26.0000
00000 -0700
@@ -28,12 +28,12 @@
#include "ns3/boolean.h"
#include "ns3/lte-phy-tag.h"
#include "lte-test-ue-phy.h"
-#include "lte-test-sinr-chunk-processor.h"
#include "ns3/lte-spectrum-signal-parameters.h"
#include
#include
#include
+#include

"lte-test-downlink-sinr.h"
<ns3/lte-control-messages.h>
"ns3/lte-helper.h"
<ns3/lte-chunk-processor.h>

using namespace ns3;


@@ -112,7 +112,7 @@
: TestCase ("SINR calculation in downlink Data frame: " + name),
m_sv (sv),
m_sm (sv->GetSpectrumModel ()),
m_sinr (sinr)
+
m_expectedSinr (sinr)
{
NS_LOG_INFO ("Creating LenaDownlinkSinrTestCase");
}
@@ -121,6 +121,7 @@
{
}
+

void
LteDownlinkDataSinrTestCase::DoRun (void)
{
@@ -135,7 +136,9 @@
dlPhy->SetCellId (cellId);
ulPhy->SetCellId (cellId);
- Ptr<LteTestSinrChunkProcessor> chunkProcessor = Create<LteTestSinrChunkProces
sor> ();
+ Ptr<LteChunkProcessor> chunkProcessor = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher actualSinrCatcher;
+ chunkProcessor->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportVa
lue, &actualSinrCatcher));
dlPhy->AddDataSinrChunkProcessor (chunkProcessor);
/**
@@ -260,16 +263,10 @@
Simulator::Stop (Seconds (5.0));
Simulator::Run ();
- /**
- * Check that the values passed to LteChunkProcessor::EvaluateChunk () corres
pond
- * to known values which have been calculated offline (with octave) for the g
enerated signals

+
+

*/
Ptr<SpectrumValue> calculatedSinr = chunkProcessor->GetSinr ();
NS_LOG_INFO
NS_LOG_INFO
NS_LOG_INFO
NS_LOG_INFO
()));

("Data
("Data
("Data
("Data

Frame
Frame
Frame
Frame

Theoretical SINR: " << *m_sinr);


Calculated SINR: " << *calculatedSinr);
Theoretical SINR: " << *m_expectedSinr);
Calculated SINR: " << *(actualSinrCatcher.GetValue

- NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL(*calculatedSinr, *m_sinr, 0.0000001,


"Data Frame - Wrong SINR !");
+ NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL(*(actualSinrCatcher.GetValue ()), *m
_expectedSinr, 0.0000001, "Data Frame - Wrong SINR !");
dlPhy->Dispose ();
Simulator::Destroy ();
}
@@ -284,7 +281,7 @@
: TestCase ("SINR calculation in downlink Ctrl Frame: " + name),
m_sv (sv),
m_sm (sv->GetSpectrumModel ()),
-m_sinr (sinr)
+m_expectedSinr (sinr)
{
NS_LOG_INFO ("Creating LenaDownlinkCtrlSinrTestCase");
}
@@ -307,9 +304,11 @@
dlPhy->SetCellId (cellId);
ulPhy->SetCellId (cellId);
- Ptr<LteTestSinrChunkProcessor> chunkProcessor = Create<LteTestSinrChunkProces
sor> ();
+ Ptr<LteChunkProcessor> chunkProcessor = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher actualSinrCatcher;
+ chunkProcessor->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportVa
lue, &actualSinrCatcher));
dlPhy->AddCtrlSinrChunkProcessor (chunkProcessor);
+
/**
* Generate 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
@@ -432,16 +431,10 @@
Simulator::Stop (Seconds (5.0));
Simulator::Run ();
- /**
- * Check that the values passed to LteChunkProcessor::EvaluateChunk () corresp
ond
- * to known values which have been calculated offline (with octave) for the ge
nerated signals
- */
- Ptr<SpectrumValue> calculatedSinr = chunkProcessor->GetSinr ();
- NS_LOG_INFO ("Ctrl Frame - Theoretical SINR: " << *m_sinr);
- NS_LOG_INFO ("Ctrl Frame - Calculated SINR: " << *calculatedSinr);
+ NS_LOG_INFO ("Ctrl Frame - Theoretical SINR: " << *m_expectedSinr);
+ NS_LOG_INFO ("Ctrl Frame - Calculated SINR: " << *(actualSinrCatcher.GetValue
()));

- NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL(*calculatedSinr, *m_sinr, 0.0000001,


"Data Frame - Wrong SINR !");
+ NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL(*(actualSinrCatcher.GetValue ()), *m
_expectedSinr, 0.0000001, "Data Frame - Wrong SINR !");
dlPhy->Dispose ();
Simulator::Destroy ();
}
diff -Naur ns-3.22/src/lte/test/lte-test-downlink-sinr.h ns-3.23/src/lte/test/lt
e-test-downlink-sinr.h
--- ns-3.22/src/lte/test/lte-test-downlink-sinr.h
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/test/lte-test-downlink-sinr.h
2015-05-13 11:05:27.0000
00000 -0700
@@ -50,7 +50,7 @@
Ptr<SpectrumValue> m_sv;
Ptr<const SpectrumModel> m_sm;
- Ptr<SpectrumValue> m_sinr;
+ Ptr<SpectrumValue> m_expectedSinr;
};
@@ -59,13 +59,13 @@
public:
LteDownlinkCtrlSinrTestCase (Ptr<SpectrumValue> sv, Ptr<SpectrumValue> sinr
, std::string name);
virtual ~LteDownlinkCtrlSinrTestCase ();
- private:
virtual void DoRun (void);
Ptr<SpectrumValue> m_sv;
Ptr<const SpectrumModel> m_sm;
Ptr<SpectrumValue> m_sinr;
+
+private:
+ virtual void DoRun (void);
+
+ Ptr<SpectrumValue> m_sv;
+ Ptr<const SpectrumModel> m_sm;
+ Ptr<SpectrumValue> m_expectedSinr;
};
#endif /* LTE_TEST_DOWNLINK_SINR_H */
diff -Naur ns-3.22/src/lte/test/lte-test-entities.cc ns-3.23/src/lte/test/lte-te
st-entities.cc
--- ns-3.22/src/lte/test/lte-test-entities.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/test/lte-test-entities.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -20,6 +20,7 @@
#include "ns3/simulator.h"
#include "ns3/log.h"
+#include "ns3/node.h"
#include "ns3/lte-rlc-header.h"
#include "ns3/lte-rlc-am-header.h"
@@ -72,6 +73,12 @@
}

void
+LteTestRrc::SetDevice (Ptr<NetDevice> device)
+{
+ m_device = device;
+}
+
+void
LteTestRrc::SetLtePdcpSapProvider (LtePdcpSapProvider* s)
{
m_pdcpSapProvider = s;
@@ -196,8 +203,26 @@
p.rnti = 1111;
p.lcid = 222;
p.pdcpSdu = Create<Packet> (m_pduSize);
+
+ bool haveContext = false;
+ Ptr<Node> node;
+ if (m_device != 0)
+
{
+
node = m_device->GetNode ();
+
if (node != 0)
+
{
+
haveContext = true;
+
}
+
}
+ if (haveContext)
+
{
+
Simulator::ScheduleWithContext (node->GetId (), Seconds (0), &LtePdcpSapP
rovider::TransmitPdcpSdu, m_pdcpSapProvider, p);
+
}
+ else
+
{
+
Simulator::Schedule (Seconds (0), &LtePdcpSapProvider::TransmitPdcpSdu, m
_pdcpSapProvider, p);
+
}
- Simulator::ScheduleNow (&LtePdcpSapProvider::TransmitPdcpSdu, m_pdcpSapProvid
er, p);
m_nextPdu = Simulator::Schedule (m_arrivalTime, &LteTestRrc::Start, this);
// Simulator::Run ();
}
@@ -449,7 +474,25 @@
LteTestMac::SendTxOpportunity (Time time, uint32_t bytes)
{
NS_LOG_FUNCTION (this << time << bytes);
- Simulator::Schedule (time, &LteMacSapUser::NotifyTxOpportunity, m_macSapUser,
bytes, 0, 0);
+ bool haveContext = false;
+ Ptr<Node> node;
+ if (m_device != 0)
+
{
+
node = m_device->GetNode ();
+
if (node != 0)
+
{
+
haveContext = true;
+
}
+
}
+ if (haveContext)
+
{

+
Simulator::ScheduleWithContext (node->GetId (), time, &LteMacSapUser::Not
ifyTxOpportunity, m_macSapUser, bytes, 0, 0);
+
}
+ else
+
{
+
Simulator::Schedule (time, &LteMacSapUser::NotifyTxOpportunity, m_macSapU
ser, bytes, 0, 0);
+
}
+
if (m_txOpportunityMode == RANDOM_MODE)
{
if (m_txOppTime != Seconds (0))
@@ -568,20 +611,25 @@
if (m_txOpportunityMode == AUTOMATIC_MODE)
{
if (params.statusPduSize)
{
Simulator::Schedule (Seconds (0.1), &LteMacSapUser::NotifyTxOpportuni
ty,
m_macSapUser, params.statusPduSize + 2, 0, 0);
+
// cancel all previously scheduled TxOpps
+
for (std::list<EventId>::iterator it = m_nextTxOppList.begin ();
+
it != m_nextTxOppList.end ();
+
++it)
+
{
+
it->Cancel ();
}
else if (params.txQueueSize)
{
Simulator::Schedule (Seconds (0.1), &LteMacSapUser::NotifyTxOpportuni
ty,
m_macSapUser, params.txQueueSize + 2, 0, 0);
}
else if (params.retxQueueSize)
+
m_nextTxOppList.clear ();
+
+
int32_t size = params.statusPduSize + params.txQueueSize + params.retxQu
eueSize;
+
Time time = m_txOppTime;
+
while (size > 0)
{
Simulator::Schedule (Seconds (0.1), &LteMacSapUser::NotifyTxOpportuni
ty,
m_macSapUser, params.retxQueueSize + 2, 0, 0);
+
EventId e = Simulator::Schedule (time,
+
&LteMacSapUser::NotifyTxOpportunity,
+
m_macSapUser, m_txOppSize, 0, 0);
+
m_nextTxOppList.push_back (e);
+
size -= m_txOppSize;
+
time += m_txOppTime;
}
}
}
diff -Naur ns-3.22/src/lte/test/lte-test-entities.h ns-3.23/src/lte/test/lte-tes
t-entities.h
--- ns-3.22/src/lte/test/lte-test-entities.h
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/test/lte-test-entities.h
2015-05-13 11:05:27.000000000 -0
700

@@ -82,6 +82,8 @@
void SetArrivalTime (Time arrivalTime);
void SetPduSize (uint32_t pduSize);
+ void SetDevice (Ptr<NetDevice> device);
+
private:
// Interface forwarded by LtePdcpSapUser
virtual void DoReceivePdcpSdu (LtePdcpSapUser::ReceivePdcpSduParameters par
ams);
@@ -101,6 +103,8 @@
EventId m_nextPdu;
Time m_arrivalTime;
uint32_t m_pduSize;
+
+
Ptr<NetDevice> m_device;
};
/////////////////////////////////////////////////////////////////////
@@ -246,6 +250,7 @@
EventId m_nextTxOpp;
Time m_txOppTime;
uint32_t m_txOppSize;
+
std::list<EventId> m_nextTxOppList;
// Stats
uint32_t m_txPdus;
diff -Naur ns-3.22/src/lte/test/lte-test-fading.cc ns-3.23/src/lte/test/lte-test
-fading.cc
--- ns-3.22/src/lte/test/lte-test-fading.cc
2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/test/lte-test-fading.cc
2015-05-13 11:05:27.000000000 -0
700
@@ -239,7 +239,7 @@
sum.at (i) = 0.;
sumSquared.at (i) = 0.;
}
- for (uint i = 0; i < m_fadingSamples.size (); i++)
+ for (std::vector<SpectrumValue>::size_type i = 0; i != m_fadingSamples.size (
); i++)
{
NS_LOG_INFO ("Sample time " << time << " : " << m_fadingSamples.at(i)[0] <<
" " << m_fadingSamples.at(i)[1]);
time += samplingInterval;
diff -Naur ns-3.22/src/lte/test/lte-test-frequency-reuse.cc ns-3.23/src/lte/test
/lte-test-frequency-reuse.cc
--- ns-3.22/src/lte/test/lte-test-frequency-reuse.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/test/lte-test-frequency-reuse.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -46,7 +46,6 @@
#include
#include
-#include
#include

"lte-ffr-simple.h"
"lte-simple-spectrum-phy.h"
"lte-test-sinr-chunk-processor.h"
<ns3/lte-common.h>

#include "lte-test-frequency-reuse.h"
diff -Naur ns-3.22/src/lte/test/lte-test-interference.cc ns-3.23/src/lte/test/lt
e-test-interference.cc

--- ns-3.22/src/lte/test/lte-test-interference.cc
00000 -0800
+++ ns-3.23/src/lte/test/lte-test-interference.cc
00000 -0700
@@ -35,9 +35,10 @@
#include "ns3/lte-ue-phy.h"
#include "ns3/lte-ue-net-device.h"

2015-02-05 15:46:22.0000
2015-05-13 11:05:27.0000

+#include <ns3/lte-chunk-processor.h>
+
#include "lte-test-interference.h"
-#include "lte-test-sinr-chunk-processor.h"
using namespace ns3;
@@ -67,9 +68,12 @@
LteInterferenceTestSuite::LteInterferenceTestSuite ()
: TestSuite ("lte-interference", SYSTEM)
{
+ // these two first test cases have a spectral efficiency that corresponds to
CQI=0 (out of range)
+ // TODO: update the test conditions to handle out-of-range correctly
+ // AddTestCase (new LteInterferenceTestCase ("d1=50, d2=10", 50.000000, 10.0
00000, 0.040000, 0.040000, 0.010399, 0.010399, 0, 0), TestCase::QUICK);
+ // AddTestCase (new LteInterferenceTestCase ("d1=50, d2=20", 50.000000, 20.0
00000, 0.160000, 0.159998, 0.041154, 0.041153, 0, 0), TestCase::QUICK);
+
AddTestCase (new LteInterferenceTestCase ("d1=3000, d2=6000", 3000.000000, 6
000.000000, 3.844681, 1.714583, 0.761558, 0.389662, 6, 4), TestCase::QUICK);
- AddTestCase (new LteInterferenceTestCase ("d1=50, d2=10", 50.000000, 10.0000
00, 0.040000, 0.040000, 0.010399, 0.010399, 0, 0), TestCase::QUICK);
- AddTestCase (new LteInterferenceTestCase ("d1=50, d2=20", 50.000000, 20.0000
00, 0.160000, 0.159998, 0.041154, 0.041153, 0, 0), TestCase::QUICK);
AddTestCase (new LteInterferenceTestCase ("d1=50, d2=50", 50.000000, 50.0000
00, 0.999997, 0.999907, 0.239828, 0.239808, 2, 2), TestCase::QUICK);
AddTestCase (new LteInterferenceTestCase ("d1=50, d2=100", 50.000000, 100.00
0000, 3.999955, 3.998520, 0.785259, 0.785042, 6, 6), TestCase::QUICK);
AddTestCase (new LteInterferenceTestCase ("d1=50, d2=200", 50.000000, 200.00
0000, 15.999282, 15.976339, 1.961072, 1.959533, 14, 14), TestCase::QUICK);
@@ -95,8 +99,8 @@
: TestCase (name),
m_d1 (d1),
m_d2 (d2),
m_dlSinrDb (10 * std::log10 (dlSinr)),
m_ulSinrDb (10 * std::log10 (ulSinr)),
+
m_expectedDlSinrDb (10 * std::log10 (dlSinr)),
+
m_expectedUlSinrDb (10 * std::log10 (ulSinr)),
m_dlMcs (dlMcs),
m_ulMcs (ulMcs)
{
@@ -174,11 +178,15 @@
// we plug in two instances, one for DL and one for UL
Ptr<LtePhy> ue1Phy = ueDevs1.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()
->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testDlSinr1 = Create<LteTestSinrChunkProcessor
> ();
+ Ptr<LteChunkProcessor> testDlSinr1 = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher dlSinr1Catcher;

+ testDlSinr1->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue


, &dlSinr1Catcher));
ue1Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr1);
Ptr<LtePhy> enb1phy = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetPhy
()->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testUlSinr1 = Create<LteTestSinrChunkProcessor
> ();
+ Ptr<LteChunkProcessor> testUlSinr1 = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher ulSinr1Catcher;
+ testUlSinr1->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue
, &ulSinr1Catcher));
enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr1);
Config::Connect ("/NodeList/0/DeviceList/0/LteEnbMac/DlScheduling",
@@ -191,11 +199,15 @@
// same as above for eNB2 and UE2
Ptr<LtePhy> ue2Phy = ueDevs2.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()
->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testDlSinr2 = Create<LteTestSinrChunkProcessor
> ();
+ Ptr<LteChunkProcessor> testDlSinr2 = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher dlSinr2Catcher;
+ testDlSinr2->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue
, &dlSinr2Catcher));
ue2Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr2);
Ptr<LtePhy> enb2phy = enbDevs.Get (1)->GetObject<LteEnbNetDevice> ()->GetPhy
()->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testUlSinr2 = Create<LteTestSinrChunkProcessor
> ();
+ Ptr<LteChunkProcessor> testUlSinr2 = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher ulSinr2Catcher;
+ testUlSinr2->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue
, &ulSinr2Catcher));
enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr2);
Config::Connect ("/NodeList/1/DeviceList/0/LteEnbMac/DlScheduling",
@@ -210,19 +222,19 @@
if (m_dlMcs > 0)
{
double dlSinr1Db = 10.0 *
(0));
NS_TEST_ASSERT_MSG_EQ_TOL
! (eNB1 --> UE1)");
+
double dlSinr1Db = 10.0 *
r[] (0));
+
NS_TEST_ASSERT_MSG_EQ_TOL
NR in DL! (eNB1 --> UE1)");
-

(0));

std::log10 (testDlSinr1->GetSinr ()->operator[]


(dlSinr1Db, m_dlSinrDb, 0.01, "Wrong SINR in DL
std::log10 (dlSinr1Catcher.GetValue ()->operato
(dlSinr1Db, m_expectedDlSinrDb, 0.01, "Wrong SI

double dlSinr2Db = 10.0 * std::log10 (testDlSinr2->GetSinr ()->operator[]

NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2Db, m_dlSinrDb, 0.01, "Wrong SINR in DL


! (eNB2 --> UE2)");
+
double dlSinr2Db = 10.0 * std::log10 (dlSinr2Catcher.GetValue ()->operato
r[] (0));
+
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2Db, m_expectedDlSinrDb, 0.01, "Wrong SI
NR in DL! (eNB2 --> UE2)");

}
if (m_ulMcs > 0)
{
double ulSinr1Db = 10.0 *
(0));
NS_TEST_ASSERT_MSG_EQ_TOL
! (UE1 --> eNB1)");
+
double ulSinr1Db = 10.0 *
r[] (0));
+
NS_TEST_ASSERT_MSG_EQ_TOL
NR in UL! (UE1 --> eNB1)");
-

(0));

std::log10 (testUlSinr1->GetSinr ()->operator[]


(ulSinr1Db, m_ulSinrDb, 0.01, "Wrong SINR in UL
std::log10 (ulSinr1Catcher.GetValue ()->operato
(ulSinr1Db, m_expectedUlSinrDb, 0.01, "Wrong SI

double ulSinr2Db = 10.0 * std::log10 (testUlSinr2->GetSinr ()->operator[]

NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_ulSinrDb, 0.01, "Wrong SINR in UL


! (UE2 --> eNB2)");
+
double ulSinr2Db = 10.0 * std::log10 (ulSinr2Catcher.GetValue ()->operato
r[] (0));
+
NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_expectedUlSinrDb, 0.01, "Wrong SI
NR in UL! (UE2 --> eNB2)");
}
Simulator::Destroy ();
diff -Naur ns-3.22/src/lte/test/lte-test-interference-fr.cc ns-3.23/src/lte/test
/lte-test-interference-fr.cc
--- ns-3.22/src/lte/test/lte-test-interference-fr.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/test/lte-test-interference-fr.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -39,7 +39,7 @@
#include "lte-test-interference-fr.h"
-#include "lte-test-sinr-chunk-processor.h"
+#include <ns3/lte-chunk-processor.h>
#include "lte-simple-spectrum-phy.h"
#include "ns3/spectrum-value.h"
@@ -50,6 +50,8 @@
NS_LOG_COMPONENT_DEFINE ("LteInterferenceFrTest");
+
+

/**
* TestSuite
*/
@@ -82,8 +84,8 @@
: TestCase ("Test: " + name),
m_d1 (d1),
m_d2 (d2),
m_dlSinrDb (10 * std::log10 (dlSinr)),
m_ulSinrDb (10 * std::log10 (ulSinr))
+
m_expectedDlSinrDb (10 * std::log10 (dlSinr)),
+
m_expectedUlSinrDb (10 * std::log10 (ulSinr))
{
NS_LOG_INFO ("Creating LteInterferenceFrTestCase");
}
@@ -174,21 +176,29 @@
// we plug in two instances, one for DL and one for UL

Ptr<LtePhy> ue1Phy = ueDevs1.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()


->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testDlSinr1 = Create<LteTestSinrChunkProcessor
> ();
+ Ptr<LteChunkProcessor> testDlSinr1 = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher dlSinr1Catcher;
+ testDlSinr1->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue
, &dlSinr1Catcher));
ue1Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr1);
Ptr<LtePhy> enb1phy = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetPhy
()->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testUlSinr1 = Create<LteTestSinrChunkProcessor
> ();
+ Ptr<LteChunkProcessor> testUlSinr1 = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher ulSinr1Catcher;
+ testUlSinr1->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue
, &ulSinr1Catcher));
enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr1);
// same as above for eNB2 and UE2
Ptr<LtePhy> ue2Phy = ueDevs2.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()
->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testDlSinr2 = Create<LteTestSinrChunkProcessor
> ();
+ Ptr<LteChunkProcessor> testDlSinr2 = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher dlSinr2Catcher;
+ testDlSinr2->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue
, &dlSinr2Catcher));
ue2Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr2);
Ptr<LtePhy> enb2phy = enbDevs.Get (1)->GetObject<LteEnbNetDevice> ()->GetPhy
()->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testUlSinr2 = Create<LteTestSinrChunkProcessor
> ();
+ Ptr<LteChunkProcessor> testUlSinr2 = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher ulSinr2Catcher;
+ testUlSinr2->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue
, &ulSinr2Catcher));
enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr2);
// need to allow for RRC connection establishment + SRS
@@ -198,33 +208,33 @@
for (uint32_t i = 0; i < 12; i++)
{
double dlSinr1 = testDlSinr1->GetSinr ()->operator[] (i);
+
double dlSinr1 = dlSinr1Catcher.GetValue ()->operator[] (i);
double dlSinr1Db = 10.0 * std::log10 (dlSinr1);
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1Db, m_dlSinrDb, 0.01, "Wrong SINR in DL
! (eNB1 --> UE1)");
+
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1Db, m_expectedDlSinrDb, 0.01, "Wrong SI
NR in DL! (eNB1 --> UE1)");
+

double dlSinr2 = testDlSinr2->GetSinr ()->operator[] (i);


double dlSinr2 = dlSinr2Catcher.GetValue ()->operator[] (i);
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2, 0, 0.01, "Wrong SINR in DL! (eNB2 -->

UE2)");
}
for (uint32_t i = 12; i < 24; i++)
{
double dlSinr1 = testDlSinr1->GetSinr ()->operator[] (i);
+
double dlSinr1 = dlSinr1Catcher.GetValue ()->operator[] (i);
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1, 0, 0.01, "Wrong SINR in DL! (eNB1 -->
UE1)");
+

double dlSinr2 = testDlSinr2->GetSinr ()->operator[] (i);


double dlSinr2 = dlSinr2Catcher.GetValue ()->operator[] (i);
double dlSinr2Db = 10.0 * std::log10 (dlSinr2);
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2Db, m_dlSinrDb, 0.01, "Wrong SINR in DL
! (eNB2 --> UE2)");
+
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2Db, m_expectedDlSinrDb, 0.01, "Wrong SI
NR in DL! (eNB2 --> UE2)");
}
//FR algorithms do not operate in uplink now, so we do not test it
-// double ulSinr1Db = 10.0 * std::log10 (testUlSinr1->GetSinr ()->operator[] (
0));
+// double ulSinr1Db = 10.0 * std::log10 (testUlSinr1->GetValue ()->operator[]
(0));
// NS_LOG_DEBUG("ulSinr1Db: "<< ulSinr1Db);
-// NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_ulSinrDb, 0.01, "Wrong SINR in UL!
(UE1 --> eNB1)");
+// NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_expectedUlSinrDb, 0.01, "Wrong SINR
in UL! (UE1 --> eNB1)");
//
-// double ulSinr2Db = 10.0 * std::log10 (testUlSinr2->GetSinr ()->operator[] (
0));
+// double ulSinr2Db = 10.0 * std::log10 (testUlSinr2->GetValue ()->operator[]
(0));
// NS_LOG_DEBUG("ulSinr2Db: "<< ulSinr2Db);
-// NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_ulSinrDb, 0.01, "Wrong SINR in UL!
(UE2 --> eNB2)");
+// NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_expectedUlSinrDb, 0.01, "Wrong SINR
in UL! (UE2 --> eNB2)");
Simulator::Destroy ();
}
@@ -344,21 +354,29 @@
// we plug in two instances, one for DL and one for UL
Ptr<LtePhy> ue1Phy = ueDevs1.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()
->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testDlSinr1 = Create<LteTestSinrChunkProcessor
> ();
+ Ptr<LteChunkProcessor> testDlSinr1 = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher dlSinr1Catcher;
+ testDlSinr1->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue
, &dlSinr1Catcher));
ue1Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr1);
Ptr<LtePhy> enb1phy = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetPhy
()->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testUlSinr1 = Create<LteTestSinrChunkProcessor
> ();
+ Ptr<LteChunkProcessor> testUlSinr1 = Create<LteChunkProcessor> ();

+ LteSpectrumValueCatcher ulSinr1Catcher;
+ testUlSinr1->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue
, &ulSinr1Catcher));
enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr1);
// same as above for eNB2 and UE2
Ptr<LtePhy> ue2Phy = ueDevs2.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()
->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testDlSinr2 = Create<LteTestSinrChunkProcessor
> ();
+ Ptr<LteChunkProcessor> testDlSinr2 = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher dlSinr2Catcher;
+ testDlSinr2->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue
, &dlSinr2Catcher));
ue2Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr2);
Ptr<LtePhy> enb2phy = enbDevs.Get (1)->GetObject<LteEnbNetDevice> ()->GetPhy
()->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testUlSinr2 = Create<LteTestSinrChunkProcessor
> ();
+ Ptr<LteChunkProcessor> testUlSinr2 = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher ulSinr2Catcher;
+ testUlSinr2->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue
, &ulSinr2Catcher));
enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr2);
// need to allow for UE Measurement report
@@ -368,46 +386,46 @@
for (uint32_t i = 0; i < 12; i++)
{
double dlSinr1 = testDlSinr1->GetSinr ()->operator[] (i);
+
double dlSinr1 = dlSinr1Catcher.GetValue ()->operator[] (i);
double dlSinr1Db = 10.0 * std::log10 (dlSinr1);
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1Db, m_commonDlSinrDb, 0.01, "Wrong SINR
in DL! (eNB1 --> UE1)");
+

double dlSinr2 = testDlSinr2->GetSinr ()->operator[] (i);


double dlSinr2 = dlSinr2Catcher.GetValue ()->operator[] (i);
double dlSinr2Db = 10.0 * std::log10 (dlSinr2);
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2Db, m_commonDlSinrDb, 0.01, "Wrong SINR
in DL! (eNB2 --> UE2)");
}

for (uint32_t i = 12; i < 18; i++)


{
double dlSinr1 = testDlSinr1->GetSinr ()->operator[] (i);
+
double dlSinr1 = dlSinr1Catcher.GetValue ()->operator[] (i);
double dlSinr1Db = 10.0 * std::log10 (dlSinr1);
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1Db, m_edgeDlSinrDb, 0.01, "Wrong SINR i
n DL! (eNB1 --> UE1)");
+

double dlSinr2 = testDlSinr2->GetSinr ()->operator[] (i);


double dlSinr2 = dlSinr2Catcher.GetValue ()->operator[] (i);
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2, 0, 0.01, "Wrong SINR in DL! (eNB2 -->
UE2)");
}

for (uint32_t i = 18; i < 24; i++)


{
double dlSinr1 = testDlSinr1->GetSinr ()->operator[] (i);
+
double dlSinr1 = dlSinr1Catcher.GetValue ()->operator[] (i);
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr1, 0, 0.01, "Wrong SINR in DL! (eNB1 -->
UE1)");
+

double dlSinr2 = testDlSinr2->GetSinr ()->operator[] (i);


double dlSinr2 = dlSinr2Catcher.GetValue ()->operator[] (i);
double dlSinr2Db = 10.0 * std::log10 (dlSinr2);
NS_TEST_ASSERT_MSG_EQ_TOL (dlSinr2Db, m_edgeDlSinrDb, 0.01, "Wrong SINR i
n DL! (eNB2 --> UE2)");
}
//FR algorithms do not operate in uplink now, so we do not test it
-// double ulSinr1Db = 10.0 * std::log10 (testUlSinr1->GetSinr ()->operator[] (
0));
+// double ulSinr1Db = 10.0 * std::log10 (testUlSinr1->GetValue ()->operator[]
(0));
// NS_LOG_DEBUG("ulSinr1Db: "<< ulSinr1Db);
-// NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_ulSinrDb, 0.01, "Wrong SINR in UL!
(UE1 --> eNB1)");
+// NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr1Db, m_expectedUlSinrDb, 0.01, "Wrong SINR
in UL! (UE1 --> eNB1)");
//
-// double ulSinr2Db = 10.0 * std::log10 (testUlSinr2->GetSinr ()->operator[] (
0));
+// double ulSinr2Db = 10.0 * std::log10 (testUlSinr2->GetValue ()->operator[]
(0));
// NS_LOG_DEBUG("ulSinr2Db: "<< ulSinr2Db);
-// NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_ulSinrDb, 0.01, "Wrong SINR in UL!
(UE2 --> eNB2)");
+// NS_TEST_ASSERT_MSG_EQ_TOL (ulSinr2Db, m_expectedUlSinrDb, 0.01, "Wrong SINR
in UL! (UE2 --> eNB2)");
Simulator::Destroy ();
}
diff -Naur ns-3.22/src/lte/test/lte-test-interference-fr.h ns-3.23/src/lte/test/
lte-test-interference-fr.h
--- ns-3.22/src/lte/test/lte-test-interference-fr.h
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/test/lte-test-interference-fr.h
2015-05-13 11:05:27.0000
00000 -0700
@@ -49,8 +49,8 @@

+
+

};

double
double
double
double
double
double

m_d1;
m_d2;
m_dlSinrDb;
m_ulSinrDb;
m_expectedDlSinrDb;
m_expectedUlSinrDb;

class LteInterferenceStrictFrTestCase : public TestCase


diff -Naur ns-3.22/src/lte/test/lte-test-interference.h ns-3.23/src/lte/test/lte
-test-interference.h
--- ns-3.22/src/lte/test/lte-test-interference.h
2015-02-05 15:46:22.0000
00000 -0800

+++ ns-3.23/src/lte/test/lte-test-interference.h
00000 -0700
@@ -56,8 +56,8 @@

2015-05-13 11:05:27.0000

+
+

double m_d1;
double m_d2;
double m_dlSinrDb;
double m_ulSinrDb;
double m_expectedDlSinrDb;
double m_expectedUlSinrDb;
uint16_t m_dlMcs;
uint16_t m_ulMcs;

};
diff -Naur ns-3.22/src/lte/test/lte-test-link-adaptation.cc ns-3.23/src/lte/test
/lte-test-link-adaptation.cc
--- ns-3.22/src/lte/test/lte-test-link-adaptation.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/test/lte-test-link-adaptation.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -31,9 +31,10 @@
#include "ns3/lte-ue-phy.h"
#include "ns3/lte-ue-net-device.h"
+#include <ns3/lte-chunk-processor.h>
+
#include "lte-test-link-adaptation.h"
-#include "lte-test-sinr-chunk-processor.h"
using namespace ns3;
@@ -206,7 +207,9 @@
// Use testing chunk processor in the PHY layer
// It will be used to test that the SNR is as intended
Ptr<LtePhy> uePhy = ueDevs.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->
GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testSinr = Create<LteTestSinrChunkProcessor> (
);
+ Ptr<LteChunkProcessor> testSinr = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher sinrCatcher;
+ testSinr->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &
sinrCatcher));
uePhy->GetDownlinkSpectrumPhy ()->AddCtrlSinrChunkProcessor (testSinr);
Config::Connect ("/NodeList/0/DeviceList/0/LteEnbMac/DlScheduling",
@@ -215,7 +218,7 @@
Simulator::Stop (Seconds (0.040));
Simulator::Run ();
- double calculatedSinrDb = 10.0 * std::log10 (testSinr->GetSinr ()->operator[]
(0));
+ double calculatedSinrDb = 10.0 * std::log10 (sinrCatcher.GetValue ()->operato
r[] (0));
NS_TEST_ASSERT_MSG_EQ_TOL (calculatedSinrDb, m_snrDb, 0.0000001, "Wrong SINR
!");
Simulator::Destroy ();
}
diff -Naur ns-3.22/src/lte/test/lte-test-pathloss-model.cc ns-3.23/src/lte/test/
lte-test-pathloss-model.cc
--- ns-3.22/src/lte/test/lte-test-pathloss-model.cc
2015-02-05 15:46:22.0000

00000 -0800
+++ ns-3.23/src/lte/test/lte-test-pathloss-model.cc
00000 -0700
@@ -47,7 +47,6 @@
#include <ns3/lte-enb-phy.h>
#include <ns3/lte-ue-phy.h>

2015-05-13 11:05:27.0000

-#include "lte-test-sinr-chunk-processor.h"
#include "lte-test-ue-phy.h"
#include "lte-test-pathloss-model.h"
@@ -271,7 +270,9 @@
// Use testing chunk processor in the PHY layer
// It will be used to test that the SNR is as intended
//Ptr<LtePhy> uePhy = ueDevs.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()
->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testSinr = Create<LteTestSinrChunkProcessor> (
);
+ Ptr<LteChunkProcessor> testSinr = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher sinrCatcher;
+ testSinr->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue, &
sinrCatcher));
uePhy->GetDownlinkSpectrumPhy ()->AddCtrlSinrChunkProcessor (testSinr);
// Config::Connect ("/NodeList/0/DeviceList/0/LteEnbMac/DlScheduling",
@@ -280,7 +281,7 @@
Simulator::Stop (Seconds (0.035));
Simulator::Run ();
- double calculatedSinrDb = 10.0 * std::log10 (testSinr->GetSinr ()->operator[]
(0));
+ double calculatedSinrDb = 10.0 * std::log10 (sinrCatcher.GetValue ()->operato
r[] (0));
NS_LOG_INFO ("Distance " << m_distance << " Calculated SINR " << calculatedSi
nrDb << " ref " << m_snrDb);
Simulator::Destroy ();
NS_TEST_ASSERT_MSG_EQ_TOL (calculatedSinrDb, m_snrDb, 0.001, "Wrong SINR !");
diff -Naur ns-3.22/src/lte/test/lte-test-rlc-am-e2e.cc ns-3.23/src/lte/test/ltetest-rlc-am-e2e.cc
--- ns-3.22/src/lte/test/lte-test-rlc-am-e2e.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/test/lte-test-rlc-am-e2e.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -16,6 +16,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Manuel Requena <manuel.requena@cttc.es>
+ *
Nicola Baldo <nbaldo@cttc.es>
*/
#include "ns3/config.h"
@@ -41,59 +42,71 @@
NS_LOG_COMPONENT_DEFINE ("LteRlcAmE2eTest");
-/**
- * Test x.x.x RLC AM: End-to-end flow
- */
-/**

- * TestSuite
- */
LteRlcAmE2eTestSuite::LteRlcAmE2eTestSuite ()
: TestSuite ("lte-rlc-am-e2e", SYSTEM)
{
// NS_LOG_INFO ("Creating LteRlcAmE2eTestSuite");
- double losses[] = {0.0, 0.10, 0.25, 0.50, 0.75, 0.90, 0.95};
- uint32_t seeds[] = {1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 9999, 101
01};
+ double losses[] = {0.0, 0.05, 0.10, 0.15, 0.25, 0.50, 0.75, 0.90, 0.95};
+ uint32_t runs[] = {1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 9999, 1111
0,
+
12221, 13332, 14443, 15554, 16665, 17776, 18887, 19998, 21
109, 22220,
+
23331, 24442, 25553, 26664, 27775, 28886, 29997, 31108, 32
219, 33330};

for ( uint32_t l = 0 ; l < (sizeof (losses) / sizeof (double)) ; l++ )


{
for ( uint32_t s = 0 ; s < (sizeof (seeds) / sizeof (uint32_t)) ; s++ )
for ( uint32_t s = 0 ; s < (sizeof (runs) / sizeof (uint32_t)) ; s++ )
{
std::ostringstream name;
name << " Losses = " << losses[l] * 100 << "%. Seed = " << seeds[s];
TestCase::TestDuration testDuration;
if (l == 1 && s == 0)
for (uint32_t sduArrivalType = 0; sduArrivalType <= 1; ++sduArrivalTy

+
pe)
+
+
;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

testDuration = TestCase::QUICK;
std::ostringstream name;
name << " losses = " << losses[l] * 100 << "%; run = " << runs[s]
bool bulkSduArrival;
switch (sduArrivalType)
{
case 0:
bulkSduArrival = false;
name << "; continuous SDU arrival";
break;
case 1:
bulkSduArrival = true;
name << "; bulk SDU arrival";
break;
default:
NS_FATAL_ERROR ("unsupported option");
break;
}
TestCase::TestDuration testDuration;
if (l == 1 && s == 0)
{
testDuration = TestCase::QUICK;
}
else if (s <= 4)
{
testDuration = TestCase::EXTENSIVE;

+
}
+
else
+
{
+
testDuration = TestCase::TAKES_FOREVER;
+
}
+
AddTestCase (new LteRlcAmE2eTestCase (name.str (), runs[s], losse
s[l], bulkSduArrival), testDuration);
}
else
{
testDuration = TestCase::EXTENSIVE;
}
AddTestCase (new LteRlcAmE2eTestCase (name.str (), seeds[s], losses[l
]), testDuration);
}
}
}
static LteRlcAmE2eTestSuite lteRlcAmE2eTestSuite;
-/**
- * TestCase
- */
-LteRlcAmE2eTestCase::LteRlcAmE2eTestCase (std::string name, uint32_t seed, doub
le losses)
- : TestCase (name)
+LteRlcAmE2eTestCase::LteRlcAmE2eTestCase (std::string name, uint32_t run, doubl
e losses, bool bulkSduArrival)
+ : TestCase (name),
+
m_run (run),
+
m_losses (losses),
+
m_bulkSduArrival (bulkSduArrival),
+
m_dlDrops (0),
+
m_ulDrops (0)
{
- // NS_LOG_UNCOND ("Creating LteRlcAmTestingTestCase: " + name);
- m_seed = seed;
- m_losses = losses;
- m_dlDrops = 0;
- m_ulDrops = 0;
+ NS_LOG_INFO ("Creating LteRlcAmTestingTestCase: " + name);
}
LteRlcAmE2eTestCase::~LteRlcAmE2eTestCase ()
@@ -133,7 +146,10 @@
// LogComponentEnable ("LteRlcUm", level);
// LogComponentEnable ("LteRlcAm", level);
- RngSeedManager::SetSeed (m_seed);
+ Config::SetGlobal ("RngRun", IntegerValue (m_run));
+ Config::SetDefault ("ns3::LteRlcAm::PollRetransmitTimer", TimeValue (MilliSec
onds (20)));
+ Config::SetDefault ("ns3::LteRlcAm::ReorderingTimer", TimeValue (MilliSeconds
(10)));
+ Config::SetDefault ("ns3::LteRlcAm::StatusProhibitTimer", TimeValue (MilliSec
onds (40)));

Ptr<LteSimpleHelper> lteSimpleHelper = CreateObject<LteSimpleHelper> ();


// lteSimpleHelper->EnableLogComponents ();
@@ -164,6 +180,9 @@
// Error models: downlink and uplink
Ptr<RateErrorModel> dlEm = CreateObject<RateErrorModel> ();
+ // fix the stream so that subsequent test cases get a number from the same st
ream
+ // if RngRun is different, the number shall then be different
+ dlEm->AssignStreams (3);
dlEm->SetAttribute ("ErrorRate", DoubleValue (m_losses));
dlEm->SetAttribute ("ErrorUnit", StringValue ("ERROR_UNIT_PACKET"));
@@ -177,43 +196,128 @@
// enbLteDevs.Get (0)->SetAttribute ("ReceiveErrorModel", PointerValue (enbEm
));
// enbLteDevs.Get (0)->TraceConnectWithoutContext ("PhyRxDrop", MakeCallback
(&LteRlcAmE2eTestCase::EnbDropEvent, this));
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

uint32_t sduSizeBytes = 100;


uint32_t numSdu = 1000;
double sduStartTimeSeconds = 0.100;
double sduStopTimeSeconds;
double sduArrivalTimeSeconds;
uint32_t dlTxOppSizeBytes = 150;
double dlTxOpprTimeSeconds = 0.003;
uint32_t ulTxOppSizeBytes = 140;
double ulTxOpprTimeSeconds = 0.003;
if (m_bulkSduArrival)
{
sduStopTimeSeconds = sduStartTimeSeconds + 0.010;
}
else
{
sduStopTimeSeconds = sduStartTimeSeconds + 10;
}
sduArrivalTimeSeconds = (sduStopTimeSeconds - sduStartTimeSeconds) / numSdu;

+
+

// Sending packets from RRC layer


lteSimpleHelper->m_enbRrc->SetArrivalTime (Seconds (0.010));
lteSimpleHelper->m_enbRrc->SetPduSize (100);
lteSimpleHelper->m_enbRrc->SetArrivalTime (Seconds (sduArrivalTimeSeconds));
lteSimpleHelper->m_enbRrc->SetPduSize (sduSizeBytes);

+
+
+

// MAC sends transmission opportunities (TxOpp)


lteSimpleHelper->m_enbMac->SetTxOppSize (150);
lteSimpleHelper->m_enbMac->SetTxOppTime (Seconds (0.005));
lteSimpleHelper->m_enbMac->SetTxOpportunityMode (LteTestMac::RANDOM_MODE);
lteSimpleHelper->m_enbMac->SetTxOppSize (dlTxOppSizeBytes);
lteSimpleHelper->m_enbMac->SetTxOppTime (Seconds (dlTxOpprTimeSeconds));
lteSimpleHelper->m_enbMac->SetTxOpportunityMode (LteTestMac::AUTOMATIC_MODE);

// MAC sends transmission opportunities (TxOpp)


- lteSimpleHelper->m_ueMac->SetTxOppSize (140);

+
+
+

lteSimpleHelper->m_ueMac->SetTxOppTime (Seconds (0.015));


lteSimpleHelper->m_ueMac->SetTxOpportunityMode (LteTestMac::RANDOM_MODE);
lteSimpleHelper->m_ueMac->SetTxOppSize (ulTxOppSizeBytes);
lteSimpleHelper->m_ueMac->SetTxOppTime (Seconds (ulTxOpprTimeSeconds));
lteSimpleHelper->m_ueMac->SetTxOpportunityMode (LteTestMac::AUTOMATIC_MODE);

// Start/Stop pseudo-application at RRC layer


- Simulator::Schedule (Seconds (0.100), &LteTestRrc::Start, lteSimpleHelper->m_
enbRrc);
- Simulator::Schedule (Seconds (10.100), &LteTestRrc::Stop, lteSimpleHelper->m_
enbRrc);
+ Simulator::Schedule (Seconds (sduStartTimeSeconds), &LteTestRrc::Start, lteSi
mpleHelper->m_enbRrc);
+ Simulator::Schedule (Seconds (sduStopTimeSeconds), &LteTestRrc::Stop, lteSimp
leHelper->m_enbRrc);
- Simulator::Stop (Seconds (100.000));
+
+ double maxDlThroughput = (dlTxOppSizeBytes/(dlTxOppSizeBytes+4.0))*(dlTxOppSi
zeBytes/dlTxOpprTimeSeconds) * (1.0-m_losses);
+ const double statusProhibitSeconds = 0.020;
+ double pollFrequency = (1.0/dlTxOpprTimeSeconds)*(1-m_losses);
+ double statusFrequency = std::min (pollFrequency, 1.0/statusProhibitSeconds);
+ const uint32_t numNackSnPerStatusPdu = (ulTxOppSizeBytes*8 - 14)/10;
+ double maxRetxThroughput = ((double)numNackSnPerStatusPdu*(double)dlTxOppSize
Bytes)*statusFrequency;
+ double throughput = std::min (maxDlThroughput, maxRetxThroughput);
+ double totBytes = ((sduSizeBytes) * (sduStopTimeSeconds - sduStartTimeSeconds
) / sduArrivalTimeSeconds);
+
+
+ // note: the throughput estimation is valid only for the full buffer
+ // case. However, the test sends a finite number of SDUs. Hence, the
+ // estimated throughput will only be effective at the beginning of
+ // the test. Towards the end of the test, two issues are present:
+ // 1) no new data is transmitted, hence less feedback is sent,
+ //
hence the transmission rate for the last PDUs to be
+ //
retransmitted is much lower. This effect can be best noteed
+ //
at very high loss rates, and can be adjusted by timers and
+ //
params.
+ // 2) throuhgput is not meaningful, you need to evaluate the time
+ //
it takes for all PDUs to be (re)transmitted successfully,
+ //
i.e., how long it takes for the TX and reTX queues to deplete.
+
+ // Estimating correctly this effect would require a complex stateful
+ // model (e.g., a Markov chain model) so to avoid the hassle we just
+ // use a margin here which we empirically determine as something we
+ // think reasonable based on the PDU loss rate
+ Time margin;
+ if (m_losses < 0.07)
+
{
+
margin = Seconds (0.500);
+
}
+ else if (m_losses < 0.20)
+
{
+
margin = Seconds (1);
+
}
+ else if (m_losses < 0.50)
+
{

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

margin = Seconds (2);


}
else if (m_losses < 0.70)
{
margin = Seconds (10);
}
else if (m_losses < 0.91)
{
margin = Seconds (20);
}
else // 0.95
{
margin = Seconds (30);
}
Time stopTime = Seconds (std::max (sduStartTimeSeconds + totBytes/throughput,
sduStopTimeSeconds)) + margin;

+
+ NS_LOG_INFO ("statusFrequency=" << statusFrequency << ", maxDlThroughput=" <<
maxDlThroughput << ", maxRetxThroughput=" << maxRetxThroughput << ", totBytes="
<< totBytes << ", stopTime=" << stopTime.GetSeconds () << "s");
+
+ Simulator::Stop (stopTime);
Simulator::Run ();
uint32_t txEnbRrcPdus = lteSimpleHelper->m_enbRrc->GetTxPdus ();
uint32_t rxUeRrcPdus = lteSimpleHelper->m_ueRrc->GetRxPdus ();
+
+

// NS_LOG_INFO ("Seed = " << m_seed);


// NS_LOG_INFO ("Losses (%) = " << uint32_t (m_losses * 100));
uint32_t txEnbRlcPdus = lteSimpleHelper->m_enbMac->GetTxPdus ();
uint32_t rxUeRlcPdus = lteSimpleHelper->m_ueMac->GetRxPdus ();

+
+

// NS_LOG_INFO ("dl dev drops = " << m_dlDrops);


// NS_LOG_INFO ("ul dev drops = " << m_ulDrops);
NS_LOG_INFO ("Run = " << m_run);
NS_LOG_INFO ("Loss rate (%) = " << uint32_t (m_losses * 100));

+
+
+
+
+
+
+

//
//
//
//

NS_LOG_INFO
NS_LOG_INFO
NS_LOG_INFO
NS_LOG_INFO

("eNB tx RRC count = " << txEnbRrcPdus);


("eNB rx RRC count = " << rxEnbRrcPdus);
("UE tx RRC count = " << txUeRrcPdus);
("UE rx RRC count = " << rxUeRrcPdus);

NS_LOG_INFO ("RLC PDUs TX: " << txEnbRlcPdus


<< " RX: " << rxUeRlcPdus
<< " LOST: " << m_dlDrops
<< " (" << (100.0 * (double) m_dlDrops)/txEnbRlcPdus << "%)");
NS_TEST_ASSERT_MSG_EQ (txEnbRlcPdus, rxUeRlcPdus + m_dlDrops, "lost RLC PDUs
don't match TX + RX");

+
+ NS_LOG_INFO ("eNB tx RRC count = " << txEnbRrcPdus);
+ NS_LOG_INFO ("UE rx RRC count = " << rxUeRrcPdus);

- NS_LOG_INFO (m_seed << "\t" << m_losses << "\t" << txEnbRrcPdus << "\t" << rx
UeRrcPdus << "\t" << m_dlDrops);
NS_TEST_ASSERT_MSG_EQ (txEnbRrcPdus, rxUeRrcPdus,
"TX PDUs (" << txEnbRrcPdus << ") != RX PDUs (" << rxU
eRrcPdus << ")");
diff -Naur ns-3.22/src/lte/test/lte-test-rlc-am-e2e.h ns-3.23/src/lte/test/lte-t

est-rlc-am-e2e.h
--- ns-3.22/src/lte/test/lte-test-rlc-am-e2e.h 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/test/lte-test-rlc-am-e2e.h 2015-05-13 11:05:27.000000000 -0
700
@@ -16,6 +16,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Manuel Requena <manuel.requena@cttc.es>
+ *
Nicola Baldo <nbaldo@cttc.es>
*/
#ifndef LTE_TEST_RLC_AM_E2E_H
@@ -28,7 +29,8 @@
/**
- * Test x.x.x RLC AM: End-to-end flow
+ * Provides the test suite lte-rlc-am-e2e. See the testing section of
+ * the LTE module documentation for details.
*/
class LteRlcAmE2eTestSuite : public TestSuite
{
@@ -36,11 +38,15 @@
LteRlcAmE2eTestSuite ();
};
+/**
+ * Test cases used for the test suite lte-rlc-am-e2e. See the testing section o
f
+ * the LTE module documentation for details.
+ *
+ */
class LteRlcAmE2eTestCase : public TestCase
{
public:
LteRlcAmE2eTestCase (std::string name, uint32_t seed, double losses);
+ LteRlcAmE2eTestCase (std::string name, uint32_t seed, double losses, bool bul
kSduArrival);
LteRlcAmE2eTestCase ();
virtual ~LteRlcAmE2eTestCase ();
@@ -50,11 +56,13 @@
void DlDropEvent (Ptr<const Packet> p);
void UlDropEvent (Ptr<const Packet> p);
+
+
+
+

uint32_t m_run;
double m_losses;
bool m_bulkSduArrival;

uint32_t m_seed;
double m_losses;

uint32_t m_dlDrops;
uint32_t m_ulDrops;

};

#endif // LTE_TEST_RLC_AM_E2E_H
diff -Naur ns-3.22/src/lte/test/lte-test-rlc-am-transmitter.cc ns-3.23/src/lte/t

est/lte-test-rlc-am-transmitter.cc
--- ns-3.22/src/lte/test/lte-test-rlc-am-transmitter.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/test/lte-test-rlc-am-transmitter.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -139,6 +139,7 @@
txMac->SendTxOpportunity (Seconds (0.150), 30);
CheckDataReceived (Seconds (0.200), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "SDU is not
OK");
+ Simulator::Stop (Seconds (0.3));
Simulator::Run ();
Simulator::Destroy ();
}
@@ -181,6 +182,7 @@
txMac->SendTxOpportunity (Seconds (0.450), 7);
CheckDataReceived (Seconds (0.500), "YZZ", "Segment #4 is not OK");
+ Simulator::Stop (Seconds (0.6));
Simulator::Run ();
Simulator::Destroy ();
}
@@ -217,6 +219,7 @@
txMac->SendTxOpportunity (Seconds (0.250), 33);
CheckDataReceived (Seconds (0.300), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "Concatenat
ion is not OK");
+ Simulator::Stop (Seconds (0.4));
Simulator::Run ();
Simulator::Destroy ();
}
@@ -293,6 +296,7 @@
txMac->SendTxOpportunity (Seconds (1.650), (4+2+1+2) + (3+10+10+7));
CheckDataReceived (Seconds (1.700), "XYZABCDEFGHIJKLMNOPQRSTUVWXYZ", "SDU #9
is not OK");
+ Simulator::Stop (Seconds (2));
Simulator::Run ();
Simulator::Destroy ();
}
diff -Naur ns-3.22/src/lte/test/lte-test-sinr-chunk-processor.cc ns-3.23/src/lte
/test/lte-test-sinr-chunk-processor.cc
--- ns-3.22/src/lte/test/lte-test-sinr-chunk-processor.cc
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-sinr-chunk-processor.cc
1969-12-31 16:00
:00.000000000 -0800
@@ -1,94 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC
)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.

- *
- * You should have received a copy of the GNU General Public 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: Manuel Requena <manuel.requena@cttc.es> : Based on lte-sinr-chunk-pr
ocessor code
- *
Nicola Baldo <nbaldo>@cttc.es>
- */
-#include <ns3/log.h>
-#include <ns3/spectrum-value.h>
-#include "lte-test-sinr-chunk-processor.h"
-namespace ns3 {
-NS_LOG_COMPONENT_DEFINE ("LteTestSinrChunkProcessor");
-LteTestSinrChunkProcessor::LteTestSinrChunkProcessor ()
-{
- NS_LOG_FUNCTION (this);
-}
-LteTestSinrChunkProcessor::~LteTestSinrChunkProcessor ()
-{
- NS_LOG_FUNCTION (this);
-}
-void
-LteTestSinrChunkProcessor::AddCallback (LteChunkProcessorCallback c)
-{
- NS_LOG_FUNCTION (this);
-}
-void
-LteTestSinrChunkProcessor::Start ()
-{
- NS_LOG_FUNCTION (this);
- m_sumSinr = 0;
- m_totDuration = MicroSeconds (0);
-}
-void
-LteTestSinrChunkProcessor::EvaluateChunk (const SpectrumValue& sinr, Time durat
ion)
-{
- NS_LOG_FUNCTION (this << sinr << duration);
- if (m_sumSinr == 0)
{
m_sumSinr = Create<SpectrumValue> (sinr.GetSpectrumModel ());
}
- (*m_sumSinr) += sinr * duration.GetSeconds ();
- m_totDuration += duration;
- NS_LOG_LOGIC (this << " m_sumSinr = " << *m_sumSinr);
- NS_LOG_LOGIC (this << " m_totDuration = " << m_totDuration);
-}
-void
-LteTestSinrChunkProcessor::End ()
-{

- NS_LOG_FUNCTION (this);
- if (m_totDuration.GetSeconds () > 0)
{
NS_LOG_LOGIC (this << " m_sumSinr = " << *m_sumSinr);
NS_LOG_LOGIC (this << " m_totDuration = " << m_totDuration);
m_sinr = Create<SpectrumValue> ((*m_sumSinr) / m_totDuration.GetSeconds (
));
NS_LOG_LOGIC (this << " m_sumSinr / m_totDuration = " << *m_sinr);
}
- else
{
NS_LOG_WARN ("m_numSinr == 0");
}
-}
-Ptr<SpectrumValue>
-LteTestSinrChunkProcessor::GetSinr ()
-{
- NS_LOG_FUNCTION (this);
- NS_ASSERT (m_sinr);
- return m_sinr;
-}
-} // namespace ns3
diff -Naur ns-3.22/src/lte/test/lte-test-sinr-chunk-processor.h ns-3.23/src/lte/
test/lte-test-sinr-chunk-processor.h
--- ns-3.22/src/lte/test/lte-test-sinr-chunk-processor.h
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-sinr-chunk-processor.h
1969-12-31 16:00
:00.000000000 -0800
@@ -1,56 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 Centre Tecnologic de Telecomunicacions de Catalunya (CTTC
)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public 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: Manuel Requena <manuel.requena@cttc.es> : Based on lte-sinr-chunk-pr
ocessor code
- *
Nicola Baldo <nbaldo@cttc.es>
- */
-#ifndef LTE_TEST_SINR_CHUNK_PROCESSOR_H
-#define LTE_TEST_SINR_CHUNK_PROCESSOR_H
-#include "ns3/lte-chunk-processor.h"
-

-namespace ns3 {
-/**
- * This custom LteTestSinrChunkProcessor averages the calculated SINR over time
.
- * It is plugged on the receiving SpectrumPhy and therefore
- * receives the SINR SpectrumValue calculated by the LteInterference module.
- */
-class LteTestSinrChunkProcessor : public LteChunkProcessor
-{
-public:
- LteTestSinrChunkProcessor ();
- virtual ~LteTestSinrChunkProcessor ();
- virtual void AddCallback (LteChunkProcessorCallback c);
- virtual void Start ();
- virtual void EvaluateChunk (const SpectrumValue& sinr, Time duration);
- virtual void End ();
- Ptr<SpectrumValue> GetSinr ();
-private:
- Ptr<SpectrumValue> m_sumSinr;
- Ptr<SpectrumValue> m_sinr;
- Time m_totDuration;
-};
-} // namespace ns3
-#endif /* LTE_TEST_SINR_CHUNK_PROCESSOR_H */
diff -Naur ns-3.22/src/lte/test/lte-test-ue-measurements.cc ns-3.23/src/lte/test
/lte-test-ue-measurements.cc
--- ns-3.22/src/lte/test/lte-test-ue-measurements.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/test/lte-test-ue-measurements.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -51,7 +51,6 @@
#include <ns3/lte-ue-rrc.h>
#include "lte-test-ue-measurements.h"
-#include "lte-test-sinr-chunk-processor.h"
#include <ns3/lte-common.h>
using namespace ns3;
@@ -198,33 +197,12 @@
lteHelper->ActivateDataRadioBearer (ueDevs1, bearer);
lteHelper->ActivateDataRadioBearer (ueDevs2, bearer);
- // Use testing chunk processor in the PHY layer
- // It will be used to test that the SNR is as intended
- // we plug in two instances, one for DL and one for UL
- Ptr<LtePhy> ue1Phy = ueDevs1.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()
->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testDlSinr1 = Create<LteTestSinrChunkProcessor
> ();
- ue1Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr1);
- Ptr<LtePhy> enb1phy = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetPhy

()->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testUlSinr1 = Create<LteTestSinrChunkProcessor
> ();
- enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr1);
Config::Connect ("/NodeList/2/DeviceList/0/LteUePhy/ReportUeMeasurements",
MakeBoundCallback (&ReportUeMeasurementsCallback, this));
Config::Connect ("/NodeList/0/DeviceList/0/LteEnbRrc/RecvMeasurementReport",
MakeBoundCallback (&RecvMeasurementReportCallback, this));
- // same as above for eNB2 and UE2
- Ptr<LtePhy> ue2Phy = ueDevs2.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()
->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testDlSinr2 = Create<LteTestSinrChunkProcessor
> ();
- ue2Phy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr2);
- Ptr<LtePhy> enb2phy = enbDevs.Get (1)->GetObject<LteEnbNetDevice> ()->GetPhy
()->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testUlSinr2 = Create<LteTestSinrChunkProcessor
> ();
- enb1phy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr2);
Config::Connect ("/NodeList/3/DeviceList/0/LteUePhy/ReportUeMeasurements",
MakeBoundCallback (&ReportUeMeasurementsCallback, this));
Config::Connect ("/NodeList/1/DeviceList/0/LteEnbRrc/RecvMeasurementReport",
diff -Naur ns-3.22/src/lte/test/lte-test-uplink-power-control.cc ns-3.23/src/lte
/test/lte-test-uplink-power-control.cc
--- ns-3.22/src/lte/test/lte-test-uplink-power-control.cc
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/lte/test/lte-test-uplink-power-control.cc
2015-05-13 11:05
:27.000000000 -0700
@@ -42,7 +42,6 @@
#include <ns3/lte-ue-rrc.h>
#include "lte-ffr-simple.h"
-#include "lte-test-sinr-chunk-processor.h"
#include <ns3/lte-common.h>
#include "lte-test-uplink-power-control.h"
diff -Naur ns-3.22/src/lte/test/lte-test-uplink-sinr.cc ns-3.23/src/lte/test/lte
-test-uplink-sinr.cc
--- ns-3.22/src/lte/test/lte-test-uplink-sinr.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/lte/test/lte-test-uplink-sinr.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -28,12 +28,12 @@
#include
#include
-#include
#include

"ns3/lte-phy-tag.h"
"lte-test-ue-phy.h"
"lte-test-sinr-chunk-processor.h"
"ns3/lte-spectrum-signal-parameters.h"

#include "lte-test-uplink-sinr.h"
#include <ns3/lte-helper.h>
+#include <ns3/lte-chunk-processor.h>
using namespace ns3;

@@ -121,7 +121,7 @@
m_sv1 (sv1),
m_sv2 (sv2),
m_sm (sv1->GetSpectrumModel ()),
m_sinr (sinr)
+
m_expectedSinr (sinr)
{
NS_LOG_INFO ("Creating LteUplinkDataSinrTestCase");
}
@@ -130,6 +130,7 @@
{
}
+

void
LteUplinkDataSinrTestCase::DoRun (void)
{
@@ -143,7 +144,9 @@
dlPhy->SetCellId (cellId);
ulPhy->SetCellId (cellId);
- Ptr<LteTestSinrChunkProcessor> chunkProcessor = Create<LteTestSinrChunkProces
sor> ();
+ Ptr<LteChunkProcessor> chunkProcessor = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher actualSinrCatcher;
+ chunkProcessor->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportVa
lue, &actualSinrCatcher));
ulPhy->AddDataSinrChunkProcessor (chunkProcessor);
/**
@@ -294,16 +297,12 @@
Simulator::Stop (Seconds (5.0));
Simulator::Run ();
- /**
- * Check that the values passed to LteChunkProcessor::EvaluateChunk () corres
pond
- * to known values which have been calculated offline (with octave) for the g
enerated signals
- */
- Ptr<SpectrumValue> calculatedSinr = chunkProcessor->GetSinr ();
+ NS_LOG_INFO ("Data Frame - Theoretical SINR: " << *m_expectedSinr);
+ NS_LOG_INFO ("Data Frame - Calculated SINR: " << *(actualSinrCatcher.GetValue
()));
- NS_LOG_INFO ("Data Frame - Theoretical SINR: " << *m_sinr);
- NS_LOG_INFO ("Data Frame - Calculated SINR: " << *calculatedSinr);
- NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL (*calculatedSinr, *m_sinr, 0.0000001
, "Data Frame - Wrong SINR !");
+ NS_TEST_EXPECT_MSG_NE (actualSinrCatcher.GetValue (), 0, "no actual SINR repo
rted");
+
+ NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL (*(actualSinrCatcher.GetValue ()), *
m_expectedSinr, 0.0000001, "Data Frame - Wrong SINR !");
ulPhy->Dispose ();
Simulator::Destroy ();
@@ -315,11 +314,11 @@

*/
LteUplinkSrsSinrTestCase::LteUplinkSrsSinrTestCase (Ptr<SpectrumValue> sv1, Ptr
<SpectrumValue> sv2, Ptr<SpectrumValue> sinr, std::string name)
-: TestCase ("SINR calculation in uplink srs frame: " + name),
-m_sv1 (sv1),
-m_sv2 (sv2),
-m_sm (sv1->GetSpectrumModel ()),
-m_sinr (sinr)
+ : TestCase ("SINR calculation in uplink srs frame: " + name),
+
m_sv1 (sv1),
+
m_sv2 (sv2),
+
m_sm (sv1->GetSpectrumModel ()),
+
m_expectedSinr (sinr)
{
NS_LOG_INFO ("Creating LteUplinkSrsSinrTestCase");
}
@@ -329,6 +328,12 @@
}
void
+LteUplinkSrsSinrTestCase::ReportSinr (const SpectrumValue& sinr)
+{
+ m_actualSinr = sinr.Copy ();
+}
+
+void
LteUplinkSrsSinrTestCase::DoRun (void)
{
/**
@@ -344,9 +349,10 @@
dlPhy->SetCellId (cellId);
ulPhy->SetCellId (cellId);
- Ptr<LteTestSinrChunkProcessor> chunkProcessor = Create<LteTestSinrChunkProces
sor> ();
+ Ptr<LteChunkProcessor> chunkProcessor = Create<LteChunkProcessor> ();
+ chunkProcessor->AddCallback (MakeCallback (&LteUplinkSrsSinrTestCase::ReportS
inr, this));
ulPhy->AddCtrlSinrChunkProcessor (chunkProcessor);
+
/**
* Generate several calls to LteSpectrumPhy::StartRx corresponding to
* several signals.
@@ -464,16 +470,12 @@
Simulator::Stop (Seconds (5.0));
Simulator::Run ();
- /**
- * Check that the values passed to
ond
- * to known values which have been
nerated signals
- */
- Ptr<SpectrumValue> calculatedSinr
+ NS_ASSERT_MSG (m_actualSinr != 0,

LteChunkProcessor::EvaluateChunk () corresp
calculated offline (with octave) for the ge
= chunkProcessor->GetSinr ();
"no actual SINR reported");

- NS_LOG_INFO ("SRS Frame - Theoretical SINR: " << *m_sinr);


- NS_LOG_INFO ("SRS Frame - Calculated SINR: " << *calculatedSinr);

- NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL (*calculatedSinr, *m_sinr, 0.0000001


, "Data Frame - Wrong SINR !");
+ NS_LOG_INFO ("SRS Frame - Theoretical SINR: " << *m_expectedSinr);
+ NS_LOG_INFO ("SRS Frame - Calculated SINR: " << *m_actualSinr);
+
+ NS_TEST_ASSERT_MSG_SPECTRUM_VALUE_EQ_TOL (*m_actualSinr, *m_expectedSinr, 0.0
000001, "Data Frame - Wrong SINR !");
ulPhy->Dispose ();
Simulator::Destroy ();
diff -Naur ns-3.22/src/lte/test/lte-test-uplink-sinr.h ns-3.23/src/lte/test/ltetest-uplink-sinr.h
--- ns-3.22/src/lte/test/lte-test-uplink-sinr.h 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/lte/test/lte-test-uplink-sinr.h 2015-05-13 11:05:27.000000000 -0
700
@@ -53,7 +53,7 @@
Ptr<SpectrumValue> m_sv1;
Ptr<SpectrumValue> m_sv2;
Ptr<const SpectrumModel> m_sm;
- Ptr<SpectrumValue> m_sinr;
+ Ptr<SpectrumValue> m_expectedSinr;
};
@@ -63,13 +63,22 @@
LteUplinkSrsSinrTestCase (Ptr<SpectrumValue> sv1, Ptr<SpectrumValue> sv2, P
tr<SpectrumValue> sinr, std::string name);
virtual ~LteUplinkSrsSinrTestCase ();
- private:
virtual void DoRun (void);
Ptr<SpectrumValue> m_sv1;
Ptr<SpectrumValue> m_sv2;
Ptr<const SpectrumModel> m_sm;
Ptr<SpectrumValue> m_sinr;
+ /**
+ * Callback to be connected to an LteChunkProcessor to collect the reported S
INR
+ *
+ * \param sinr
+ */
+ void ReportSinr (const SpectrumValue& sinr);
+
+private:
+ virtual void DoRun (void);
+
+ Ptr<SpectrumValue> m_sv1;
+ Ptr<SpectrumValue> m_sv2;
+ Ptr<const SpectrumModel> m_sm;
+
+ Ptr<SpectrumValue> m_expectedSinr;
+ Ptr<SpectrumValue> m_actualSinr;
};
diff -Naur ns-3.22/src/lte/test/test-lte-antenna.cc ns-3.23/src/lte/test/test-lt
e-antenna.cc

--- ns-3.22/src/lte/test/test-lte-antenna.cc
800
+++ ns-3.23/src/lte/test/test-lte-antenna.cc
700
@@ -37,7 +37,8 @@

2015-02-05 15:46:22.000000000 -0
2015-05-13 11:05:27.000000000 -0

#include "ns3/lte-global-pathloss-database.h"
-#include "lte-test-sinr-chunk-processor.h"
+#include <ns3/lte-chunk-processor.h>
+
using namespace ns3;
@@ -148,11 +149,15 @@
// Use testing chunk processor in the PHY layer
// It will be used to test that the SNR is as intended
Ptr<LtePhy> uePhy = ueDevs.Get (0)->GetObject<LteUeNetDevice> ()->GetPhy ()->
GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testDlSinr = Create<LteTestSinrChunkProcessor>
();
+ Ptr<LteChunkProcessor> testDlSinr = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher dlSinrCatcher;
+ testDlSinr->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue,
&dlSinrCatcher));
uePhy->GetDownlinkSpectrumPhy ()->AddDataSinrChunkProcessor (testDlSinr);
Ptr<LtePhy> enbphy = enbDevs.Get (0)->GetObject<LteEnbNetDevice> ()->GetPhy (
)->GetObject<LtePhy> ();
- Ptr<LteTestSinrChunkProcessor> testUlSinr = Create<LteTestSinrChunkProcessor>
();
+ Ptr<LteChunkProcessor> testUlSinr = Create<LteChunkProcessor> ();
+ LteSpectrumValueCatcher ulSinrCatcher;
+ testUlSinr->AddCallback (MakeCallback (&LteSpectrumValueCatcher::ReportValue,
&ulSinrCatcher));
enbphy->GetUplinkSpectrumPhy ()->AddDataSinrChunkProcessor (testUlSinr);
@@ -177,15 +182,15 @@
const double enbNoiseFigureDb = 5.0; // default eNB noise figure
double tolerance = (m_antennaGainDb != 0) ? std::abs (m_antennaGainDb) * 0.00
1 : 0.001;
- // first test with SINR from LteTestSinrChunkProcessor
+ // first test with SINR from LteChunkProcessor
// this can only be done for not-too-bad SINR otherwise the measurement won't
be available
double expectedSinrDl = enbTxPowerDbm + m_antennaGainDb - noisePowerDbm + ueN
oiseFigureDb;
if (expectedSinrDl > 0)
{
double calculatedSinrDbDl = -INFINITY;
if (testDlSinr->GetSinr () != 0)
+
if (dlSinrCatcher.GetValue () != 0)
{
calculatedSinrDbDl = 10.0 * std::log10 (testDlSinr->GetSinr ()->opera
tor[] (0));
+
calculatedSinrDbDl = 10.0 * std::log10 (dlSinrCatcher.GetValue ()->op
erator[] (0));
}

// remember that propagation loss is 0dB


double calculatedAntennaGainDbDl = - (enbTxPowerDbm - calculatedSinrDbDl
- noisePowerDbm - ueNoiseFigureDb);
@@ -195,9 +200,9 @@
if (expectedSinrUl > 0)
{
double calculatedSinrDbUl = -INFINITY;
if (testUlSinr->GetSinr () != 0)
+
if (ulSinrCatcher.GetValue () != 0)
{
calculatedSinrDbUl = 10.0 * std::log10 (testUlSinr->GetSinr ()->opera
tor[] (0));
+
calculatedSinrDbUl = 10.0 * std::log10 (ulSinrCatcher.GetValue ()->op
erator[] (0));
}
double calculatedAntennaGainDbUl = - (ueTxPowerDbm - calculatedSinrDbUl noisePowerDbm - enbNoiseFigureDb);
NS_TEST_ASSERT_MSG_EQ_TOL (calculatedAntennaGainDbUl, m_antennaGainDb, to
lerance, "Wrong UL antenna gain!");
diff -Naur ns-3.22/src/lte/test/test-lte-rlc-header.cc ns-3.23/src/lte/test/test
-lte-rlc-header.cc
--- ns-3.22/src/lte/test/test-lte-rlc-header.cc 1969-12-31 16:00:00.000000000 -0
800
+++ ns-3.23/src/lte/test/test-lte-rlc-header.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -0,0 +1,225 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011, 2012, 2013 Centre Tecnologic de Telecomunicacions de Cat
alunya (CTTC)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public 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: Lluis Parcerisa <lparcerisa@cttc.cat> (TestUtils from test-asn1-enco
ding.cc)
+ *
Nicola Baldo <nbaldo@cttc.es> (actual test)
+ */
+
+#include "ns3/log.h"
+#include "ns3/test.h"
+#include "ns3/ptr.h"
+#include "ns3/packet.h"
+
+#include "ns3/lte-rlc-am-header.h"
+
+#include <list>
+#include <bitset>
+#include <iomanip>
+

+
+NS_LOG_COMPONENT_DEFINE ("TestLteRlcHeader");
+
+namespace ns3 {
+
+class TestUtils
+{
+public:
+ // Function to convert packet contents in hex format
+ static std::string sprintPacketContentsHex (Ptr<Packet> pkt)
+ {
+
uint32_t psize = pkt->GetSize ();
+
uint8_t buffer[psize];
+
std::ostringstream oss (std::ostringstream::out);
+
pkt->CopyData (buffer, psize);
+
for (uint32_t i = 0; i < psize; i++)
+
{
+
oss << std::setfill ('0') << std::setw (2) << std::hex << (uint32_t) bu
ffer[i];
+
}
+
return oss.str ();
+ }
+
+ // Function to convert packet contents in binary format
+ static std::string sprintPacketContentsBin (Ptr<Packet> pkt)
+ {
+
uint32_t psize = pkt->GetSize ();
+
uint8_t buffer[psize];
+
std::ostringstream oss (std::ostringstream::out);
+
pkt->CopyData (buffer, psize);
+
for (uint32_t i = 0; i < psize; i++)
+
{
+
oss << (std::bitset<8> (buffer[i]));
+
}
+
return std::string (oss.str () + "\n");
+ }
+
+ // Function to log packet contents
+ static void LogPacketContents (Ptr<Packet> pkt)
+ {
+
NS_LOG_DEBUG ("---- SERIALIZED PACKET CONTENTS (HEX): -------");
+
NS_LOG_DEBUG ("Hex: " << TestUtils::sprintPacketContentsHex (pkt));
+
NS_LOG_DEBUG ("Bin: " << TestUtils::sprintPacketContentsBin (pkt));
+ }
+
+ template <class T>
+ static void LogPacketInfo (T source,std::string s)
+ {
+
NS_LOG_DEBUG ("--------- " << s.data () << " INFO: -------");
+
std::ostringstream oss (std::ostringstream::out);
+
source.Print (oss);
+
NS_LOG_DEBUG (oss.str ());
+ }
+};
+
+
+class RlcAmStatusPduTestCase : public TestCase
+{
+public:
+ RlcAmStatusPduTestCase (SequenceNumber10 ackSn,

+
std::list<SequenceNumber10> nackSnList,
+
std::string hex);
+
+protected:
+ virtual void DoRun (void);
+
+ SequenceNumber10 m_ackSn;
+ std::list<SequenceNumber10> m_nackSnList;
+ std::string m_hex;
+
+};
+
+
+RlcAmStatusPduTestCase::RlcAmStatusPduTestCase (SequenceNumber10 ackSn,
+
std::list<SequenceNumber10> nack
SnList ,
+
std::string hex)
+ : TestCase (hex),
+
m_ackSn (ackSn),
+
m_nackSnList (nackSnList),
+
m_hex (hex)
+{
+ NS_LOG_FUNCTION (this << hex);
+}
+
+void
+
+RlcAmStatusPduTestCase::DoRun ()
+{
+ NS_LOG_FUNCTION (this);
+
+ Ptr<Packet> p = Create<Packet> ();
+ LteRlcAmHeader h;
+ h.SetControlPdu (LteRlcAmHeader::STATUS_PDU);
+ h.SetAckSn (m_ackSn);
+ for (std::list<SequenceNumber10>::iterator it = m_nackSnList.begin ();
+
it != m_nackSnList.end ();
+
++it)
+
{
+
h.PushNack (it->GetValue ());
+
}
+ p->AddHeader (h);
+
+ TestUtils::LogPacketContents (p);
+ std::string hex = TestUtils::sprintPacketContentsHex (p);
+ NS_TEST_ASSERT_MSG_EQ (m_hex, hex, "serialized packet content " << hex << " d
iffers from test vector " << m_hex);
+
+ LteRlcAmHeader h2;
+ p->RemoveHeader (h2);
+ SequenceNumber10 ackSn = h2.GetAckSn ();
+ NS_TEST_ASSERT_MSG_EQ (ackSn, m_ackSn, "deserialized ACK SN differs from test
vector");
+
+ for (std::list<SequenceNumber10>::iterator it = m_nackSnList.begin ();
+
it != m_nackSnList.end ();
+
++it)
+
{
+
int nackSn = h2.PopNack ();
+
NS_TEST_ASSERT_MSG_GT (nackSn, -1, "not enough elements in deserialized N

ACK list");
+
NS_TEST_ASSERT_MSG_EQ (nackSn, it->GetValue (), "deserialized NACK SN di
ffers from test vector");
+
}
+ int retVal = h2.PopNack ();
+ NS_TEST_ASSERT_MSG_LT (retVal, 0, "too many elements in deserialized NACK lis
t");
+}
+
+
+class LteRlcHeaderTestSuite : public TestSuite
+{
+public:
+ LteRlcHeaderTestSuite ();
+} staticLteRlcHeaderTestSuiteInstance ;
+
+LteRlcHeaderTestSuite::LteRlcHeaderTestSuite ()
+ : TestSuite ("lte-rlc-header", UNIT)
+{
+ NS_LOG_FUNCTION (this);
+
+ {
+
SequenceNumber10 ackSn (8);
+
std::list<SequenceNumber10> nackSnList;
+
std::string hex ("0020");
+
AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase:
:QUICK);
+ }
+
+ {
+
SequenceNumber10 ackSn (873);
+
std::list<SequenceNumber10> nackSnList;
+
std::string hex ("0da4");
+
AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase:
:QUICK);
+ }
+
+ {
+
SequenceNumber10 ackSn (2);
+
std::list<SequenceNumber10> nackSnList;
+
nackSnList.push_back (SequenceNumber10 (873));
+
std::string hex ("000bb480");
+
AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase:
:QUICK);
+ }
+
+
+ {
+
SequenceNumber10 ackSn (2);
+
std::list<SequenceNumber10> nackSnList;
+
nackSnList.push_back (SequenceNumber10 (1021));
+
nackSnList.push_back (SequenceNumber10 (754));
+
std::string hex ("000bfed790");
+
AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase:
:QUICK);
+ }
+
+
+ {
+
SequenceNumber10 ackSn (2);

+
std::list<SequenceNumber10> nackSnList;
+
nackSnList.push_back (SequenceNumber10 (1021));
+
nackSnList.push_back (SequenceNumber10 (754));
+
nackSnList.push_back (SequenceNumber10 (947));
+
std::string hex ("000bfed795d980");
+
AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase:
:QUICK);
+ }
+
+
+ {
+
SequenceNumber10 ackSn (2);
+
std::list<SequenceNumber10> nackSnList;
+
nackSnList.push_back (SequenceNumber10 (1021));
+
nackSnList.push_back (SequenceNumber10 (754));
+
nackSnList.push_back (SequenceNumber10 (947));
+
nackSnList.push_back (SequenceNumber10 (347));
+
std::string hex ("000bfed795d9cad8");
+
AddTestCase (new RlcAmStatusPduTestCase (ackSn, nackSnList, hex), TestCase:
:QUICK);
+ }
+
+}
+
+
+} // namespace ns3
diff -Naur ns-3.22/src/lte/wscript ns-3.23/src/lte/wscript
--- ns-3.22/src/lte/wscript
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/lte/wscript
2015-05-13 11:05:27.000000000 -0700
@@ -129,7 +129,6 @@
'test/lte-test-uplink-sinr.cc',
'test/lte-test-link-adaptation.cc',
'test/lte-test-interference.cc',
'test/lte-test-sinr-chunk-processor.cc',
'test/lte-test-ue-phy.cc',
'test/lte-test-rr-ff-mac-scheduler.cc',
'test/lte-test-pf-ff-mac-scheduler.cc',
@@ -148,6 +147,7 @@
'test/lte-test-entities.cc',
'test/lte-simple-helper.cc',
'test/lte-simple-net-device.cc',
+
'test/test-lte-rlc-header.cc',
'test/lte-test-rlc-um-transmitter.cc',
'test/lte-test-rlc-am-transmitter.cc',
'test/lte-test-rlc-um-e2e.cc',
diff -Naur ns-3.22/src/mesh/bindings/modulegen__gcc_ILP32.py ns-3.23/src/mesh/bi
ndings/modulegen__gcc_ILP32.py
--- ns-3.22/src/mesh/bindings/modulegen__gcc_ILP32.py 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/mesh/bindings/modulegen__gcc_ILP32.py 2015-05-13 11:05:27.0000
00000 -0700
@@ -251,17 +251,13 @@
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
module.add_class('WifiActionHeader', import_from_module='ns.wifi', parent=r
oot_module['ns3::Header'])
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enu
meration]
module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LI
NK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINAT
ION', 'MESH_PROXY_FORWARDING', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_modul

e['ns3::WifiActionHeader'], import_from_module='ns.wifi')
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PeerLinkMgtActionV
alue [enumeration]
module.add_enum('PeerLinkMgtActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CON
FIRM', 'PEER_LINK_CLOSE'], outer_class=root_module['ns3::WifiActionHeader'], imp
ort_from_module='ns.wifi')
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::LinkMetricActionVa
lue [enumeration]
module.add_enum('LinkMetricActionValue', ['LINK_METRIC_REQUEST', 'LINK_METR
IC_REPORT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_modul
e='ns.wifi')
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PathSelectionActio
nValue [enumeration]
module.add_enum('PathSelectionActionValue', ['PATH_SELECTION'], outer_class
=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::InterworkActionVal
ue [enumeration]
module.add_enum('InterworkActionValue', ['PORTAL_ANNOUNCEMENT'], outer_clas
s=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ResourceCoordinati
onActionValue [enumeration]
module.add_enum('ResourceCoordinationActionValue', ['CONGESTION_CONTROL_NOT
IFICATION', 'MDA_SETUP_REQUEST', 'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST'
, 'MDAOP_ADVERTISMENTS', 'MDAOP_SET_TEARDOWN', 'BEACON_TIMING_REQUEST', 'BEACON_
TIMING_RESPONSE', 'TBTT_ADJUSTMENT_REQUEST', 'MESH_CHANNEL_SWITCH_ANNOUNCEMENT']
, outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi'
)
+
module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH', 'MULTIHOP', 'SELF_PR
OTECTED', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHea
der'], import_from_module='ns.wifi')
+
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::SelfProtectedActio
nValue [enumeration]
+
module.add_enum('SelfProtectedActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_C
ONFIRM', 'PEER_LINK_CLOSE', 'GROUP_KEY_INFORM', 'GROUP_KEY_ACK'], outer_class=ro
ot_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::MultihopActionValu
e [enumeration]
+
module.add_enum('MultihopActionValue', ['PROXY_UPDATE', 'PROXY_UPDATE_CONFI
RMATION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module=
'ns.wifi')
+
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::MeshActionValue [e
numeration]
+
module.add_enum('MeshActionValue', ['LINK_METRIC_REPORT', 'PATH_SELECTION',
'PORTAL_ANNOUNCEMENT', 'CONGESTION_CONTROL_NOTIFICATION', 'MDA_SETUP_REQUEST',
'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST', 'MDAOP_ADVERTISMENTS', 'MDAOP_S
ET_TEARDOWN', 'TBTT_ADJUSTMENT_REQUEST', 'TBTT_ADJUSTMENT_RESPONSE'], outer_clas
s=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::BlockAckActionValu
e [enumeration]
module.add_enum('BlockAckActionValue', ['BLOCK_ACK_ADDBA_REQUEST', 'BLOCK_A
CK_ADDBA_RESPONSE', 'BLOCK_ACK_DELBA'], outer_class=root_module['ns3::WifiAction
Header'], import_from_module='ns.wifi')
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue [union
]
@@ -507,7 +503,7 @@
## ie-dot11s-configuration.h (module 'mesh'): ns3::dot11s::dot11sCongestion
ControlMode [enumeration]
module.add_enum('dot11sCongestionControlMode', ['CONGESTION_SIGNALING', 'CO
NGESTION_NULL'])
## ie-dot11s-configuration.h (module 'mesh'): ns3::dot11s::dot11sAuthentica

tionProtocol [enumeration]
module.add_enum('dot11sAuthenticationProtocol', ['AUTH_NULL', 'AUTH_SAE'])
+
module.add_enum('dot11sAuthenticationProtocol', ['AUTH_NULL', 'AUTH_SAE', '
AUTH_IEEE'])
## ie-dot11s-configuration.h (module 'mesh'): ns3::dot11s::dot11sPathSelect
ionMetric [enumeration]
module.add_enum('dot11sPathSelectionMetric', ['METRIC_AIRTIME'])
## ie-dot11s-peer-management.h (module 'mesh'): ns3::dot11s::PmpReasonCode
[enumeration]
@@ -4986,16 +4982,12 @@
cls.add_constructor([param('ns3::WifiActionHeader::ActionValue const &', 'a
rg0')])
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::block
Ack [variable]
cls.add_instance_attribute('blockAck', 'ns3::WifiActionHeader::BlockAckActi
onValue', is_const=False)
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::inter
work [variable]
cls.add_instance_attribute('interwork', 'ns3::WifiActionHeader::InterworkAc
tionValue', is_const=False)
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::linkM
etrtic [variable]
cls.add_instance_attribute('linkMetrtic', 'ns3::WifiActionHeader::LinkMetri
cActionValue', is_const=False)
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::pathS
election [variable]
cls.add_instance_attribute('pathSelection', 'ns3::WifiActionHeader::PathSel
ectionActionValue', is_const=False)
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::peerL
ink [variable]
cls.add_instance_attribute('peerLink', 'ns3::WifiActionHeader::PeerLinkMgtA
ctionValue', is_const=False)
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::resou
rceCoordination [variable]
cls.add_instance_attribute('resourceCoordination', 'ns3::WifiActionHeader::
ResourceCoordinationActionValue', is_const=False)
+
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::meshA
ction [variable]
+
cls.add_instance_attribute('meshAction', 'ns3::WifiActionHeader::MeshAction
Value', is_const=False)
+
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::multi
hopAction [variable]
+
cls.add_instance_attribute('multihopAction', 'ns3::WifiActionHeader::Multih
opActionValue', is_const=False)
+
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::selfP
rotectedAction [variable]
+
cls.add_instance_attribute('selfProtectedAction', 'ns3::WifiActionHeader::S
elfProtectedActionValue', is_const=False)
return
def register_Ns3WifiInformationElement_methods(root_module, cls):
@@ -5791,6 +5783,10 @@
'int64_t',
[param('int64_t', 'stream')],
is_pure_virtual=True, is_virtual=True)
+
## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpDuratio
n(ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
+
cls.add_method('CalculatePlcpDuration',
+
'ns3::Time',
+
[param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPre

amble', 'preamble')])
## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiM
ode txMode, double ber) const [member function]
cls.add_method('CalculateSnr',
'double',
@@ -6264,10 +6260,10 @@
'ns3::WifiMode',
[param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPrea
mble', 'preamble')],
is_static=True)
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigH
eaderDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member fun
ction]
+
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigH
eaderDuration(ns3::WifiPreamble preamble) [member function]
cls.add_method('GetPlcpHtSigHeaderDuration',
'ns3::Time',
[param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPrea
mble', 'preamble')],
+
[param('ns3::WifiPreamble', 'preamble')],
is_static=True)
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrai
ningSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [memb
er function]
cls.add_method('GetPlcpHtTrainingSymbolDuration',
@@ -6441,10 +6437,10 @@
'void',
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >,
double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty,
ns3::empty >', 'callback')],
is_pure_virtual=True, is_virtual=True)
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3:
:Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiMode,ns3::WifiPreamble,ns3:
:empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3:
:Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiTxVector,ns3::WifiPreamble,
ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member functi
on]
cls.add_method('SetReceiveOkCallback',
'void',
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double
, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::emp
ty, ns3::empty >', 'callback')],
+
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double
, ns3::WifiTxVector, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3:
:empty, ns3::empty >', 'callback')],
is_pure_virtual=True, is_virtual=True)
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSleepMode() [member fu
nction]
cls.add_method('SetSleepMode',
@@ -10222,15 +10218,15 @@
'uint8_t',
[],
is_const=True)
## ie-dot11s-configuration.h (module 'mesh'): uint16_t ns3::dot11s::Dot11sM
eshCapability::GetUint16() const [member function]
cls.add_method('GetUint16',
'uint16_t',
+
## ie-dot11s-configuration.h (module 'mesh'): uint8_t ns3::dot11s::Dot11sMe
shCapability::GetUint8() const [member function]

+
+

cls.add_method('GetUint8',
'uint8_t',
[],
is_const=True)
## ie-dot11s-configuration.h (module 'mesh'): bool ns3::dot11s::Dot11sMeshC
apability::Is(uint16_t cap, uint8_t n) const [member function]
+
## ie-dot11s-configuration.h (module 'mesh'): bool ns3::dot11s::Dot11sMeshC
apability::Is(uint8_t cap, uint8_t n) const [member function]
cls.add_method('Is',
'bool',
[param('uint16_t', 'cap'), param('uint8_t', 'n')],
+
[param('uint8_t', 'cap'), param('uint8_t', 'n')],
is_const=True)
## ie-dot11s-configuration.h (module 'mesh'): ns3::Buffer::Iterator ns3::do
t11s::Dot11sMeshCapability::Serialize(ns3::Buffer::Iterator i) const [member fun
ction]
cls.add_method('Serialize',
diff -Naur ns-3.22/src/mesh/bindings/modulegen__gcc_LP64.py ns-3.23/src/mesh/bin
dings/modulegen__gcc_LP64.py
--- ns-3.22/src/mesh/bindings/modulegen__gcc_LP64.py
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/mesh/bindings/modulegen__gcc_LP64.py
2015-05-13 11:05:27.0000
00000 -0700
@@ -251,17 +251,13 @@
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader [class]
module.add_class('WifiActionHeader', import_from_module='ns.wifi', parent=r
oot_module['ns3::Header'])
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::CategoryValue [enu
meration]
module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH_PEERING_MGT', 'MESH_LI
NK_METRIC', 'MESH_PATH_SELECTION', 'MESH_INTERWORKING', 'MESH_RESOURCE_COORDINAT
ION', 'MESH_PROXY_FORWARDING', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_modul
e['ns3::WifiActionHeader'], import_from_module='ns.wifi')
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PeerLinkMgtActionV
alue [enumeration]
module.add_enum('PeerLinkMgtActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_CON
FIRM', 'PEER_LINK_CLOSE'], outer_class=root_module['ns3::WifiActionHeader'], imp
ort_from_module='ns.wifi')
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::LinkMetricActionVa
lue [enumeration]
module.add_enum('LinkMetricActionValue', ['LINK_METRIC_REQUEST', 'LINK_METR
IC_REPORT'], outer_class=root_module['ns3::WifiActionHeader'], import_from_modul
e='ns.wifi')
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::PathSelectionActio
nValue [enumeration]
module.add_enum('PathSelectionActionValue', ['PATH_SELECTION'], outer_class
=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::InterworkActionVal
ue [enumeration]
module.add_enum('InterworkActionValue', ['PORTAL_ANNOUNCEMENT'], outer_clas
s=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ResourceCoordinati
onActionValue [enumeration]
module.add_enum('ResourceCoordinationActionValue', ['CONGESTION_CONTROL_NOT
IFICATION', 'MDA_SETUP_REQUEST', 'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST'
, 'MDAOP_ADVERTISMENTS', 'MDAOP_SET_TEARDOWN', 'BEACON_TIMING_REQUEST', 'BEACON_
TIMING_RESPONSE', 'TBTT_ADJUSTMENT_REQUEST', 'MESH_CHANNEL_SWITCH_ANNOUNCEMENT']
, outer_class=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi'
)
+
module.add_enum('CategoryValue', ['BLOCK_ACK', 'MESH', 'MULTIHOP', 'SELF_PR

OTECTED', 'VENDOR_SPECIFIC_ACTION'], outer_class=root_module['ns3::WifiActionHea


der'], import_from_module='ns.wifi')
+
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::SelfProtectedActio
nValue [enumeration]
+
module.add_enum('SelfProtectedActionValue', ['PEER_LINK_OPEN', 'PEER_LINK_C
ONFIRM', 'PEER_LINK_CLOSE', 'GROUP_KEY_INFORM', 'GROUP_KEY_ACK'], outer_class=ro
ot_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
+
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::MultihopActionValu
e [enumeration]
+
module.add_enum('MultihopActionValue', ['PROXY_UPDATE', 'PROXY_UPDATE_CONFI
RMATION'], outer_class=root_module['ns3::WifiActionHeader'], import_from_module=
'ns.wifi')
+
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::MeshActionValue [e
numeration]
+
module.add_enum('MeshActionValue', ['LINK_METRIC_REPORT', 'PATH_SELECTION',
'PORTAL_ANNOUNCEMENT', 'CONGESTION_CONTROL_NOTIFICATION', 'MDA_SETUP_REQUEST',
'MDA_SETUP_REPLY', 'MDAOP_ADVERTISMENT_REQUEST', 'MDAOP_ADVERTISMENTS', 'MDAOP_S
ET_TEARDOWN', 'TBTT_ADJUSTMENT_REQUEST', 'TBTT_ADJUSTMENT_RESPONSE'], outer_clas
s=root_module['ns3::WifiActionHeader'], import_from_module='ns.wifi')
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::BlockAckActionValu
e [enumeration]
module.add_enum('BlockAckActionValue', ['BLOCK_ACK_ADDBA_REQUEST', 'BLOCK_A
CK_ADDBA_RESPONSE', 'BLOCK_ACK_DELBA'], outer_class=root_module['ns3::WifiAction
Header'], import_from_module='ns.wifi')
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue [union
]
@@ -505,7 +501,7 @@
## ie-dot11s-configuration.h (module 'mesh'): ns3::dot11s::dot11sCongestion
ControlMode [enumeration]
module.add_enum('dot11sCongestionControlMode', ['CONGESTION_SIGNALING', 'CO
NGESTION_NULL'])
## ie-dot11s-configuration.h (module 'mesh'): ns3::dot11s::dot11sAuthentica
tionProtocol [enumeration]
module.add_enum('dot11sAuthenticationProtocol', ['AUTH_NULL', 'AUTH_SAE'])
+
module.add_enum('dot11sAuthenticationProtocol', ['AUTH_NULL', 'AUTH_SAE', '
AUTH_IEEE'])
## ie-dot11s-configuration.h (module 'mesh'): ns3::dot11s::dot11sPathSelect
ionMetric [enumeration]
module.add_enum('dot11sPathSelectionMetric', ['METRIC_AIRTIME'])
## ie-dot11s-peer-management.h (module 'mesh'): ns3::dot11s::PmpReasonCode
[enumeration]
@@ -4986,16 +4982,12 @@
cls.add_constructor([param('ns3::WifiActionHeader::ActionValue const &', 'a
rg0')])
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::block
Ack [variable]
cls.add_instance_attribute('blockAck', 'ns3::WifiActionHeader::BlockAckActi
onValue', is_const=False)
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::inter
work [variable]
cls.add_instance_attribute('interwork', 'ns3::WifiActionHeader::InterworkAc
tionValue', is_const=False)
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::linkM
etrtic [variable]
cls.add_instance_attribute('linkMetrtic', 'ns3::WifiActionHeader::LinkMetri
cActionValue', is_const=False)
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::pathS
election [variable]
cls.add_instance_attribute('pathSelection', 'ns3::WifiActionHeader::PathSel
ectionActionValue', is_const=False)

## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::peerL


ink [variable]
cls.add_instance_attribute('peerLink', 'ns3::WifiActionHeader::PeerLinkMgtA
ctionValue', is_const=False)
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::resou
rceCoordination [variable]
cls.add_instance_attribute('resourceCoordination', 'ns3::WifiActionHeader::
ResourceCoordinationActionValue', is_const=False)
+
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::meshA
ction [variable]
+
cls.add_instance_attribute('meshAction', 'ns3::WifiActionHeader::MeshAction
Value', is_const=False)
+
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::multi
hopAction [variable]
+
cls.add_instance_attribute('multihopAction', 'ns3::WifiActionHeader::Multih
opActionValue', is_const=False)
+
## mgt-headers.h (module 'wifi'): ns3::WifiActionHeader::ActionValue::selfP
rotectedAction [variable]
+
cls.add_instance_attribute('selfProtectedAction', 'ns3::WifiActionHeader::S
elfProtectedActionValue', is_const=False)
return
def register_Ns3WifiInformationElement_methods(root_module, cls):
@@ -5791,6 +5783,10 @@
'int64_t',
[param('int64_t', 'stream')],
is_pure_virtual=True, is_virtual=True)
+
## wifi-phy.h (module 'wifi'): ns3::Time ns3::WifiPhy::CalculatePlcpDuratio
n(ns3::WifiTxVector txvector, ns3::WifiPreamble preamble) [member function]
+
cls.add_method('CalculatePlcpDuration',
+
'ns3::Time',
+
[param('ns3::WifiTxVector', 'txvector'), param('ns3::WifiPre
amble', 'preamble')])
## wifi-phy.h (module 'wifi'): double ns3::WifiPhy::CalculateSnr(ns3::WifiM
ode txMode, double ber) const [member function]
cls.add_method('CalculateSnr',
'double',
@@ -6264,10 +6260,10 @@
'ns3::WifiMode',
[param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPrea
mble', 'preamble')],
is_static=True)
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigH
eaderDuration(ns3::WifiMode payloadMode, ns3::WifiPreamble preamble) [member fun
ction]
+
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtSigH
eaderDuration(ns3::WifiPreamble preamble) [member function]
cls.add_method('GetPlcpHtSigHeaderDuration',
'ns3::Time',
[param('ns3::WifiMode', 'payloadMode'), param('ns3::WifiPrea
mble', 'preamble')],
+
[param('ns3::WifiPreamble', 'preamble')],
is_static=True)
## wifi-phy.h (module 'wifi'): static ns3::Time ns3::WifiPhy::GetPlcpHtTrai
ningSymbolDuration(ns3::WifiPreamble preamble, ns3::WifiTxVector txvector) [memb
er function]
cls.add_method('GetPlcpHtTrainingSymbolDuration',
@@ -6441,10 +6437,10 @@
'void',
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >,

double, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty,


ns3::empty >', 'callback')],
is_pure_virtual=True, is_virtual=True)
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3:
:Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiMode,ns3::WifiPreamble,ns3:
:empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member function]
+
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetReceiveOkCallback(ns3:
:Callback<void,ns3::Ptr<ns3::Packet>,double,ns3::WifiTxVector,ns3::WifiPreamble,
ns3::empty,ns3::empty,ns3::empty,ns3::empty,ns3::empty> callback) [member functi
on]
cls.add_method('SetReceiveOkCallback',
'void',
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double
, ns3::WifiMode, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3::emp
ty, ns3::empty >', 'callback')],
+
[param('ns3::Callback< void, ns3::Ptr< ns3::Packet >, double
, ns3::WifiTxVector, ns3::WifiPreamble, ns3::empty, ns3::empty, ns3::empty, ns3:
:empty, ns3::empty >', 'callback')],
is_pure_virtual=True, is_virtual=True)
## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::SetSleepMode() [member fu
nction]
cls.add_method('SetSleepMode',
@@ -10222,15 +10218,15 @@
'uint8_t',
[],
is_const=True)
## ie-dot11s-configuration.h (module 'mesh'): uint16_t ns3::dot11s::Dot11sM
eshCapability::GetUint16() const [member function]
cls.add_method('GetUint16',
'uint16_t',
+
## ie-dot11s-configuration.h (module 'mesh'): uint8_t ns3::dot11s::Dot11sMe
shCapability::GetUint8() const [member function]
+
cls.add_method('GetUint8',
+
'uint8_t',
[],
is_const=True)
## ie-dot11s-configuration.h (module 'mesh'): bool ns3::dot11s::Dot11sMeshC
apability::Is(uint16_t cap, uint8_t n) const [member function]
+
## ie-dot11s-configuration.h (module 'mesh'): bool ns3::dot11s::Dot11sMeshC
apability::Is(uint8_t cap, uint8_t n) const [member function]
cls.add_method('Is',
'bool',
[param('uint16_t', 'cap'), param('uint8_t', 'n')],
+
[param('uint8_t', 'cap'), param('uint8_t', 'n')],
is_const=True)
## ie-dot11s-configuration.h (module 'mesh'): ns3::Buffer::Iterator ns3::do
t11s::Dot11sMeshCapability::Serialize(ns3::Buffer::Iterator i) const [member fun
ction]
cls.add_method('Serialize',
diff -Naur ns-3.22/src/mesh/doc/mesh.rst ns-3.23/src/mesh/doc/mesh.rst
--- ns-3.22/src/mesh/doc/mesh.rst
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/doc/mesh.rst
2015-05-13 11:05:27.000000000 -0700
@@ -8,3 +8,9 @@
The Mesh NetDevice based on 802.11s was added in *ns-3.6*. An overview
presentation by Kirill Andreev was published at the wns-3 workshop
in 2009: `<http://www.nsnam.org/wiki/Wns3-2009>`_.
+
+An overview paper is available at:
+`<https://www.nsnam.org/workshops/wns3-2010/dot11s.pdf>`_.
+

+As of ns-3.23 release, the model has been slightly updated to the 802.11s-2012
+standard with regard to packet formats.
diff -Naur ns-3.22/src/mesh/model/dot11s/airtime-metric.cc ns-3.23/src/mesh/mode
l/dot11s/airtime-metric.cc
--- ns-3.22/src/mesh/model/dot11s/airtime-metric.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/mesh/model/dot11s/airtime-metric.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -32,6 +32,7 @@
{
static TypeId tid = TypeId ("ns3::dot11s::AirtimeLinkMetricCalculator")
.SetParent<Object> ()
+
.SetGroupName ("Mesh")
.AddConstructor<AirtimeLinkMetricCalculator> ()
.AddAttribute ( "TestLength",
"Rate should be estimated using test length.",
diff -Naur ns-3.22/src/mesh/model/dot11s/dot11s-mac-header.cc ns-3.23/src/mesh/m
odel/dot11s/dot11s-mac-header.cc
--- ns-3.22/src/mesh/model/dot11s/dot11s-mac-header.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/mesh/model/dot11s/dot11s-mac-header.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -33,6 +33,7 @@
{
static TypeId tid = TypeId ("ns3::Dot11sMacHeader")
.SetParent<Header> ()
+
.SetGroupName ("Mesh")
.AddConstructor<MeshHeader> ();
return tid;
}
diff -Naur ns-3.22/src/mesh/model/dot11s/hwmp-protocol.cc ns-3.23/src/mesh/model
/dot11s/hwmp-protocol.cc
--- ns-3.22/src/mesh/model/dot11s/hwmp-protocol.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/mesh/model/dot11s/hwmp-protocol.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -49,6 +49,7 @@
{
static TypeId tid = TypeId ("ns3::dot11s::HwmpProtocol")
.SetParent<MeshL2RoutingProtocol> ()
+
.SetGroupName ("Mesh")
.AddConstructor<HwmpProtocol> ()
.AddAttribute ( "RandomStart",
"Random delay at first proactive PREQ",
@@ -209,7 +210,8 @@
m_coefficient->SetAttribute ("Max", DoubleValue (m_randomStart.GetSeconds ())
);
if (m_isRoot)
{
SetRoot ();
+
Time randomStart = Seconds (m_coefficient->GetValue ());
+
m_proactivePreqTimer = Simulator::Schedule (randomStart, &HwmpProtocol::S
endProactivePreq, this);
}
}
@@ -1026,8 +1028,6 @@
void
HwmpProtocol::SetRoot ()
{

- Time randomStart = Seconds (m_coefficient->GetValue ());


- m_proactivePreqTimer = Simulator::Schedule (randomStart, &HwmpProtocol::SendP
roactivePreq, this);
NS_LOG_DEBUG ("ROOT IS: " << m_address);
m_isRoot = true;
}
diff -Naur ns-3.22/src/mesh/model/dot11s/hwmp-protocol.h ns-3.23/src/mesh/model/
dot11s/hwmp-protocol.h
--- ns-3.22/src/mesh/model/dot11s/hwmp-protocol.h
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/mesh/model/dot11s/hwmp-protocol.h
2015-05-13 11:05:27.0000
00000 -0700
@@ -156,7 +156,7 @@
/// \return list of addresses where a PERR should be sent to
std::vector<std::pair<uint32_t, Mac48Address> > GetPerrReceivers (std::vector
<FailedDestination> failedDest);
- /// \return list of addresses where a PERR should be sent to
+ /// \return list of addresses where a PREQ should be sent to
std::vector<Mac48Address> GetPreqReceivers (uint32_t interface);
/// \return list of addresses where a broadcast should be
//retransmitted
diff -Naur ns-3.22/src/mesh/model/dot11s/hwmp-protocol-mac.cc ns-3.23/src/mesh/m
odel/dot11s/hwmp-protocol-mac.cc
--- ns-3.22/src/mesh/model/dot11s/hwmp-protocol-mac.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/mesh/model/dot11s/hwmp-protocol-mac.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -99,7 +99,7 @@
m_stats.rxMgtBytes += packet->GetSize ();
WifiActionHeader actionHdr;
packet->RemoveHeader (actionHdr);
- if (actionHdr.GetCategory () != WifiActionHeader::MESH_PATH_SELECTION)
+ if (actionHdr.GetCategory () != WifiActionHeader::MESH)
{
return true;
}
@@ -210,8 +210,8 @@
{
WifiActionHeader actionHdr;
WifiActionHeader::ActionValue action;
- action.pathSelection = WifiActionHeader::PATH_SELECTION;
- actionHdr.SetAction (WifiActionHeader::MESH_PATH_SELECTION, action);
+ action.meshAction = WifiActionHeader::PATH_SELECTION;
+ actionHdr.SetAction (WifiActionHeader::MESH, action);
return actionHdr;
}
void
diff -Naur ns-3.22/src/mesh/model/dot11s/hwmp-rtable.cc ns-3.23/src/mesh/model/d
ot11s/hwmp-rtable.cc
--- ns-3.22/src/mesh/model/dot11s/hwmp-rtable.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/mesh/model/dot11s/hwmp-rtable.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -39,6 +39,7 @@
{
static TypeId tid = TypeId ("ns3::dot11s::HwmpRtable")
.SetParent<Object> ()
+
.SetGroupName ("Mesh")
.AddConstructor<HwmpRtable> ();

return tid;
}
diff -Naur ns-3.22/src/mesh/model/dot11s/hwmp-tag.cc ns-3.23/src/mesh/model/dot1
1s/hwmp-tag.cc
--- ns-3.22/src/mesh/model/dot11s/hwmp-tag.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/mesh/model/dot11s/hwmp-tag.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -86,7 +86,7 @@
TypeId
HwmpTag::GetTypeId ()
{
- static TypeId tid = TypeId ("ns3::dot11s::HwmpTag").SetParent<Tag> ().AddCons
tructor<HwmpTag> ();
+ static TypeId tid = TypeId ("ns3::dot11s::HwmpTag").SetParent<Tag> ().AddCons
tructor<HwmpTag> ().SetGroupName ("Mesh");
return tid;
}
diff -Naur ns-3.22/src/mesh/model/dot11s/ie-dot11s-configuration.cc ns-3.23/src/
mesh/model/dot11s/ie-dot11s-configuration.cc
--- ns-3.22/src/mesh/model/dot11s/ie-dot11s-configuration.cc
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/ie-dot11s-configuration.cc
2015-05-13 11:05
:27.000000000 -0700
@@ -32,17 +32,17 @@
uint8_t
Dot11sMeshCapability::GetSerializedSize () const
{
- return 2;
+ return 1;
}
-uint16_t
-Dot11sMeshCapability::GetUint16 () const
+uint8_t
+Dot11sMeshCapability::GetUint8 () const //IEEE 802.11-2012 8.4.2.100.8 Mesh Ca
pability
{
- uint16_t result = 0;
+ uint8_t result = 0;
if (acceptPeerLinks)
{
result |= 1 << 0;
+
result |= 1 << 0; //The Accepting Additional Mesh Peerings subfield is se
t to 1 if the mesh STA is willing to establish additional mesh peerings with o
ther mesh STAs and set to 0 otherwise
}
- if (MCCASupported)
+ if (MCCASupported) // The MCCA Supported subfield is set to 1 if the mesh STA
implements MCCA and set to 0 otherwise
{
result |= 1 << 1;
}
@@ -71,13 +71,13 @@
Buffer::Iterator
Dot11sMeshCapability::Serialize (Buffer::Iterator i) const
{
- i.WriteHtolsbU16 (GetUint16 ());
+ i.WriteU8 (GetUint8 ());
return i;

}
Buffer::Iterator
Dot11sMeshCapability::Deserialize (Buffer::Iterator i)
{
- uint16_t cap = i.ReadLsbtohU16 ();
+ uint8_t cap = i.ReadU8 ();
acceptPeerLinks = Is (cap, 0);
MCCASupported = Is (cap, 1);
MCCAEnabled = Is (cap, 2);
@@ -88,7 +88,7 @@
return i;
}
bool
-Dot11sMeshCapability::Is (uint16_t cap, uint8_t n) const
+Dot11sMeshCapability::Is (uint8_t cap, uint8_t n) const
{
uint16_t mask = 1 << n;
return (cap & mask);
@@ -107,29 +107,28 @@
uint8_t
IeConfiguration::GetInformationFieldSize () const
{
- return 1 // Version
+ 4 // APSPId
+ 4 // APSMId
+ 4 // CCMId
+ 4 // SPId
+ 4 // APId
+ return 0 // Version
+
+ 1 // APSPId
+
+ 1 // APSMId
+
+ 1 // CCMId
+
+ 1 // SPId
+
+ 1 // APId
+ 1 // Mesh formation info (see 7.3.2.86.6 of 802.11s draft 3.0)
+ m_meshCap.GetSerializedSize ();
}
void
IeConfiguration::SerializeInformationField (Buffer::Iterator i) const
{
- i.WriteU8 (1); //Version
// Active Path Selection Protocol ID:
- i.WriteHtolsbU32 (m_APSPId);
+ i.WriteU8 (m_APSPId);
// Active Path Metric ID:
- i.WriteHtolsbU32 (m_APSMId);
+ i.WriteU8 (m_APSMId);
// Congestion Control Mode ID:
- i.WriteHtolsbU32 (m_CCMId);
+ i.WriteU8 (m_CCMId);
// Sync:
- i.WriteHtolsbU32 (m_SPId);
+ i.WriteU8 (m_SPId);
// Auth:
- i.WriteHtolsbU32 (m_APId);
+ i.WriteU8 (m_APId);
i.WriteU8 (m_neighbors << 1);
m_meshCap.Serialize (i);
}
@@ -137,20 +136,14 @@

IeConfiguration::DeserializeInformationField (Buffer::Iterator i, uint8_t lengt


h)
{
Buffer::Iterator start = i;
- uint8_t version;
- version = i.ReadU8 ();
- if (version != 1)
{
NS_FATAL_ERROR ("Other versions not supported yet");
}
// Active Path Selection Protocol ID:
- m_APSPId = (dot11sPathSelectionProtocol) i.ReadLsbtohU32 ();
+ m_APSPId = (dot11sPathSelectionProtocol) i.ReadU8 ();
// Active Path Metric ID:
- m_APSMId = (dot11sPathSelectionMetric) i.ReadLsbtohU32 ();
+ m_APSMId = (dot11sPathSelectionMetric) i.ReadU8 ();
// Congestion Control Mode ID:
- m_CCMId = (dot11sCongestionControlMode) i.ReadLsbtohU32 ();
- m_SPId = (dot11sSynchronizationProtocolIdentifier) i.ReadLsbtohU32 ();
- m_APId = (dot11sAuthenticationProtocol) i.ReadLsbtohU32 ();
+ m_CCMId = (dot11sCongestionControlMode) i.ReadU8 ();
+ m_SPId = (dot11sSynchronizationProtocolIdentifier) i.ReadU8 ();
+ m_APId = (dot11sAuthenticationProtocol) i.ReadU8 ();
m_neighbors = (i.ReadU8 () >> 1) & 0xF;
i = m_meshCap.Deserialize (i);
return i.GetDistanceFrom (start);
@@ -165,7 +158,7 @@
<< std::endl << "Congestion Control Mode ID:
= " << (uint32_t) m_CC
MId
<< std::endl << "Synchronize protocol ID:
= " << (uint32_t) m_SP
Id
<< std::endl << "Authentication protocol ID:
= " << (uint32_t) m_AP
Id
<< std::endl << "Capabilities:
= " << m_meshCap.GetUi
nt16 () << std::endl;
+
<< std::endl << "Capabilities:
= " << m_meshCap.GetUi
nt8 () << std::endl;
os << "</information_element>" << std::endl;
}
void
diff -Naur ns-3.22/src/mesh/model/dot11s/ie-dot11s-configuration.h ns-3.23/src/m
esh/model/dot11s/ie-dot11s-configuration.h
--- ns-3.22/src/mesh/model/dot11s/ie-dot11s-configuration.h
2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/ie-dot11s-configuration.h
2015-05-13 11:05
:27.000000000 -0700
@@ -27,48 +27,41 @@
namespace ns3 {
namespace dot11s {
-/**
- * \ingroup dot11s
- * \brief See 7.3.2.86.1 in 802.11s draft 3.0
- */
+
+//according to IEEE 802.11 - 2012
+
+//in 7.3.2.98.2 Active Path Selection Protocol Identifier - 802.11s-2011
enum dot11sPathSelectionProtocol
{

- PROTOCOL_HWMP = 0x000fac00,
+ PROTOCOL_HWMP = 0x01,
};
-/**
- * \ingroup dot11s
- * \brief See 7.3.2.86.2 in 802.11s draft 3.0
- */
+
+//in 7.3.2.98.3 Active Path Selection Metric Identifier - 802.11s-2011
enum dot11sPathSelectionMetric
{
- METRIC_AIRTIME = 0x000fac00,
+ METRIC_AIRTIME = 0x01,
};
-/**
- * \ingroup dot11s
- * \brief See 7.3.2.86.3 in 802.11s draft 3.0
- */
+
+// in 7.3.2.98.4 Congestion Control Mode Identifier - 802.11s-2011
enum dot11sCongestionControlMode
{
- CONGESTION_SIGNALING = 0x000fac00,
- CONGESTION_NULL
= 0x000facff,
+ CONGESTION_SIGNALING = 0x01,
+ CONGESTION_NULL
= 0x00,
};
-/**
- * \ingroup dot11s
- * \brief See 7.3.2.86.4 in 802.11s draft 3.0
- */
+
+// in 7.3.2.98.5 Synchronization Method Identifier - 802.11s-2011
enum dot11sSynchronizationProtocolIdentifier
{
- SYNC_NEIGHBOUR_OFFSET = 0x000fac00,
- SYNC_NULL
= 0x000facff,
+ SYNC_NEIGHBOUR_OFFSET = 0x01, //Neighbor offset synchronization method
+ SYNC_NULL
= 0x00, //Reserved
};
-/**
- * \ingroup dot11s
- * \brief See 7.3.2.86.5 in 802.11s draft 3.0
- */
+
+// in 7.3.2.98.6 Authentication Protocol Identifier - 802.11s-2011
enum dot11sAuthenticationProtocol
{
- AUTH_NULL = 0x000fac00,
- AUTH_SAE = 0x000fac01,
+ AUTH_NULL = 0x00, //No authentication method is required to establish mesh p
eerings within the MBSS
+ AUTH_SAE = 0x01, //SAE defined in 8.2a
+ AUTH_IEEE = 0x02, //IEEE 802.1X authentication
};
/**
* \ingroup dot11s
@@ -81,7 +74,7 @@
uint8_t GetSerializedSize () const;
Buffer::Iterator Serialize (Buffer::Iterator i) const;

Buffer::Iterator Deserialize (Buffer::Iterator i);


- uint16_t GetUint16 () const;
+ uint8_t GetUint8 () const;
bool acceptPeerLinks;
bool MCCASupported;
bool MCCAEnabled;
@@ -89,7 +82,7 @@
bool beaconTimingReport;
bool TBTTAdjustment;
bool powerSaveLevel;
- bool Is (uint16_t cap,uint8_t n) const;
+ bool Is (uint8_t cap,uint8_t n) const;
friend bool operator== (const Dot11sMeshCapability & a, const Dot11sMeshCapab
ility & b);
};
diff -Naur ns-3.22/src/mesh/model/dot11s/ie-dot11s-peer-management.h ns-3.23/src
/mesh/model/dot11s/ie-dot11s-peer-management.h
--- ns-3.22/src/mesh/model/dot11s/ie-dot11s-peer-management.h 2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/ie-dot11s-peer-management.h 2015-05-13 11:05
:27.000000000 -0700
@@ -33,31 +33,30 @@
*/
enum PmpReasonCode
{
- REASON11S_PEERING_CANCELLED = 2, // according to open80211s
- REASON11S_MESH_MAX_PEERS,
- REASON11S_MESH_CAPABILITY_POLICY_VIOLATION,
- REASON11S_MESH_CLOSE_RCVD,
- REASON11S_MESH_MAX_RETRIES,
- REASON11S_MESH_CONFIRM_TIMEOUT,
- REASON11S_MESH_INVALID_GTK,
- REASON11S_MESH_INCONSISTENT_PARAMETERS,
- REASON11S_MESH_INVALID_SECURITY_CAPABILITY,
- REASON11S_RESERVED,
+ REASON11S_PEERING_CANCELLED = 52, // according to IEEE 802.11 - 2012
+ REASON11S_MESH_MAX_PEERS = 53,
+ REASON11S_MESH_CAPABILITY_POLICY_VIOLATION = 54,
+ REASON11S_MESH_CLOSE_RCVD = 55,
+ REASON11S_MESH_MAX_RETRIES = 56,
+ REASON11S_MESH_CONFIRM_TIMEOUT = 57,
+ REASON11S_MESH_INVALID_GTK = 58,
+ REASON11S_MESH_INCONSISTENT_PARAMETERS = 59,
+ REASON11S_MESH_INVALID_SECURITY_CAPABILITY =60,
+ REASON11S_RESERVED = 67,
};
-/**
- * \ingroup dot11s
- * \brief See 7.3.2.85 of draft 2.07
- */
+
+// according to IEEE 802.11 - 2012
+
class IePeerManagement : public WifiInformationElement
{
public:
IePeerManagement ();
enum Subtype

+
+
+

PEER_OPEN = 0,
PEER_CONFIRM,
PEER_CLOSE,
PEER_OPEN = 1,
PEER_CONFIRM = 2,
PEER_CLOSE = 3,

};
void SetPeerOpen (uint16_t localLinkId);
void SetPeerClose (uint16_t localLinkID, uint16_t peerLinkId, PmpReasonCode
reasonCode);
diff -Naur ns-3.22/src/mesh/model/dot11s/ie-dot11s-perr.cc ns-3.23/src/mesh/mode
l/dot11s/ie-dot11s-perr.cc
--- ns-3.22/src/mesh/model/dot11s/ie-dot11s-perr.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/mesh/model/dot11s/ie-dot11s-perr.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -54,28 +54,33 @@
void
IePerr::SerializeInformationField (Buffer::Iterator i) const
{
- i.WriteU8 (0);
- i.WriteU8 (m_addressUnits.size ());
+ i.WriteU8 (0);// TTL
+ i.WriteU8 (m_addressUnits.size ()); // number of Destinations
for (unsigned int j = 0; j < m_addressUnits.size (); j++)
{
+
i.WriteU8 (0); // not used // Bit 6: AE (Address Extension) subfield (1 =
destination external address is present, 0 = otherwise).
WriteTo (i, m_addressUnits[j].destination);
i.WriteHtolsbU32 (m_addressUnits[j].seqnum);
+
i.WriteU8 (0);
+
i.WriteU8 (0);
}
}
uint8_t
IePerr::DeserializeInformationField (Buffer::Iterator start, uint8_t length)
{
Buffer::Iterator i = start;
- i.Next (1); //Mode flags is not used now
+ i.Next (1); //TTL //Mode flags is not used now
uint8_t numOfDest = i.ReadU8 ();
- NS_ASSERT ((2 + 10 * numOfDest ) == length);
+ NS_ASSERT ((2 + 13 * numOfDest ) == length);
length = 0; //to avoid compiler warning in optimized builds
for (unsigned int j = 0; j < numOfDest; j++)
{
+
i.Next (1); // flags is not used now
HwmpProtocol::FailedDestination unit;
ReadFrom (i, unit.destination);
unit.seqnum = i.ReadLsbtohU32 ();
m_addressUnits.push_back (unit);
+
i.Next (2); // Reason
}
return i.GetDistanceFrom (start);
}
@@ -83,9 +88,11 @@
uint8_t
IePerr::GetInformationFieldSize () const
{

- uint8_t retval = 1 //ModeFlags


+ uint8_t retval = 1 //TTL //ModeFlags
+ 1 //NumOfDests
+ (6 + 4) * m_addressUnits.size ();
+
+ 1 * m_addressUnits.size () //ModeFlags
+
+ (6 + 4) * m_addressUnits.size ()
+
+ 2* m_addressUnits.size (); // Reason Code
return retval;
}
@@ -99,7 +106,7 @@
return;
}
}
- if ((m_addressUnits.size () + 1) * 10 + 2 > 255)
+ if ((m_addressUnits.size () + 1) * 13 + 2 > 255)
{
return;
}
@@ -112,7 +119,7 @@
return (GetInformationFieldSize ()
> 255
- 2 /* ID + LENGTH*/
- 10 /* Size of Mac48Address + uint32_t (one unit)*/
+
- 13// 10 /* Size of Mac48Address + uint32_t (one unit)*/
);
}
std::vector<HwmpProtocol::FailedDestination>
diff -Naur ns-3.22/src/mesh/model/dot11s/peer-link.cc ns-3.23/src/mesh/model/dot
11s/peer-link.cc
--- ns-3.22/src/mesh/model/dot11s/peer-link.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/mesh/model/dot11s/peer-link.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -39,6 +39,7 @@
{
static TypeId tid = TypeId ("ns3::dot11s::PeerLink")
.SetParent<Object> ()
+
.SetGroupName ("Mesh")
.AddConstructor<PeerLink> ()
.AddAttribute ( "RetryTimeout",
"Retry timeout",
diff -Naur ns-3.22/src/mesh/model/dot11s/peer-link-frame.cc ns-3.23/src/mesh/mod
el/dot11s/peer-link-frame.cc
--- ns-3.22/src/mesh/model/dot11s/peer-link-frame.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/mesh/model/dot11s/peer-link-frame.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -30,7 +30,7 @@
PeerLinkFrameStart::PeerLinkFrameStart () :
m_subtype (255), m_capability (0), m_aid (0), m_rates (SupportedRates ()), m_
meshId (),
- m_config (IeConfiguration ()), m_reasonCode ((uint16_t)REASON11S_RESERVED)
+ m_config (IeConfiguration ())
{
}
void
@@ -42,7 +42,7 @@
PeerLinkFrameStart::SetPlinkFrameStart (PeerLinkFrameStart::PlinkFrameStartFiel

ds fields)
{
m_subtype = fields.subtype;
- m_protocol = fields.protocol;
+
if (m_subtype != (uint8_t)(WifiActionHeader::PEER_LINK_CLOSE))
{
m_capability = fields.capability;
@@ -65,7 +65,7 @@
}
else
{
m_reasonCode = fields.reasonCode;
+
//reasonCode not used here
}
}
PeerLinkFrameStart::PlinkFrameStartFields
@@ -79,14 +79,17 @@
retval.rates = m_rates;
retval.meshId = m_meshId;
retval.config = m_config;
- retval.reasonCode = m_reasonCode;
+
return retval;
}
TypeId
PeerLinkFrameStart::GetTypeId ()
{
- static TypeId tid = TypeId ("ns3::dot11s::PeerLinkFrameStart").SetParent<Head
er> ().AddConstructor<
PeerLinkFrameStart> ();
+ static TypeId tid = TypeId ("ns3::dot11s::PeerLinkFrameStart")
+
.SetParent<Header> ()
+
.SetGroupName ("Mesh")
+
.AddConstructor<PeerLinkFrameStart> ()
+ ;
return tid;
}
TypeId
@@ -107,8 +110,8 @@
uint32_t
PeerLinkFrameStart::GetSerializedSize () const
{
- uint32_t size = 3; //Peering protocol
- NS_ASSERT (m_subtype < 3);
+ uint32_t size =0; //Peering protocol
+ NS_ASSERT (m_subtype < 4);
if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
{
size += 2; //capability
@@ -132,7 +135,7 @@
}
else
{
size += 2; //reasonCode
+
//reasonCode not used here
}
return size;
}
@@ -140,8 +143,8 @@

PeerLinkFrameStart::Serialize (Buffer::Iterator start) const


{
Buffer::Iterator i = start;
- NS_ASSERT (m_subtype < 3);
- i = m_protocol.Serialize (i);
+ NS_ASSERT (m_subtype < 4);
+
if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
{
i.WriteHtolsbU16 (m_capability);
@@ -165,24 +168,15 @@
}
else
{
i.WriteHtolsbU16 (m_reasonCode);
+
//reasonCode not used here
}
}
uint32_t
PeerLinkFrameStart::Deserialize (Buffer::Iterator start)
{
Buffer::Iterator i = start;
- NS_ASSERT (m_subtype < 3);
- {
uint8_t id = i.ReadU8 ();
uint8_t length = i.ReadU8 ();
m_protocol.DeserializeInformationField (i, length);
if ((m_protocol.ElementId () != (WifiInformationElementId) id) || (m_protoc
ol.GetInformationFieldSize () != length))
{
NS_FATAL_ERROR ("Broken frame: Element ID does not match IE itself!");
}
i.Next (m_protocol.GetInformationFieldSize ());
- }
+ NS_ASSERT (m_subtype < 4);
+
if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
{
m_capability = i.ReadLsbtohU16 ();
@@ -220,7 +214,7 @@
}
else
{
m_reasonCode = i.ReadLsbtohU16 ();
+
//reasonCode not used here
}
return i.GetDistanceFrom (start);
}
@@ -228,8 +222,8 @@
operator== (const PeerLinkFrameStart & a, const PeerLinkFrameStart & b)
{
return ((a.m_subtype == b.m_subtype) && (a.m_capability == b.m_capability) &&
(a.m_aid == b.m_aid)
&& (a.m_meshId.IsEqual (b.m_meshId)) && (a.m_config == b.m_config)
&& (a.m_reasonCode == b.m_reasonCode));
+
&& (a.m_meshId.IsEqual (b.m_meshId)) && (a.m_config == b.m_config));
+
}
} // namespace dot11s
} // namespace ns3

diff -Naur ns-3.22/src/mesh/model/dot11s/peer-management-protocol.cc ns-3.23/src


/mesh/model/dot11s/peer-management-protocol.cc
--- ns-3.22/src/mesh/model/dot11s/peer-management-protocol.cc 2015-02-05 15:46
:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/peer-management-protocol.cc 2015-05-13 11:05
:27.000000000 -0700
@@ -49,6 +49,7 @@
{
static TypeId tid = TypeId ("ns3::dot11s::PeerManagementProtocol")
.SetParent<Object> ()
+
.SetGroupName ("Mesh")
.AddConstructor<PeerManagementProtocol> ()
// maximum number of peer links. Now we calculate the total
// number of peer links on all interfaces
diff -Naur ns-3.22/src/mesh/model/dot11s/peer-management-protocol-mac.cc ns-3.23
/src/mesh/model/dot11s/peer-management-protocol-mac.cc
--- ns-3.22/src/mesh/model/dot11s/peer-management-protocol-mac.cc
2015-0205 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/model/dot11s/peer-management-protocol-mac.cc
2015-0513 11:05:27.000000000 -0700
@@ -88,7 +88,7 @@
packet->RemoveHeader (actionHdr);
WifiActionHeader::ActionValue actionValue = actionHdr.GetAction ();
// If can not handle - just return;
if (actionHdr.GetCategory () != WifiActionHeader::MESH_PEERING_MGT)
+
if (actionHdr.GetCategory () != WifiActionHeader::SELF_PROTECTED)
{
return m_protocol->IsActiveLink (m_ifIndex, header.GetAddr2 ());
}
@@ -99,20 +99,19 @@
PeerLinkFrameStart::PlinkFrameStartFields fields;
{
PeerLinkFrameStart peerFrame;
peerFrame.SetPlinkFrameSubtype ((uint8_t) actionValue.peerLink);
+
peerFrame.SetPlinkFrameSubtype ((uint8_t) actionValue.selfProtectedActi
on);
packet->RemoveHeader (peerFrame);
fields = peerFrame.GetFields ();
NS_ASSERT (fields.subtype == actionValue.peerLink);
+
NS_ASSERT (fields.subtype == actionValue.selfProtectedAction);
}
if ((actionValue.peerLink != WifiActionHeader::PEER_LINK_CLOSE) && !(m_pa
rent->CheckSupportedRates (
fi
elds.rates)))
+
if ((actionValue.selfProtectedAction != WifiActionHeader::PEER_LINK_CLOSE
) && !(m_parent->CheckSupportedRates (fields.rates)))
{
m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);
// Broken peer link frame - drop it
m_stats.brokenMgt++;
return false;
}
if ((actionValue.peerLink != WifiActionHeader::PEER_LINK_CONFIRM) && !fie
lds.meshId.IsEqual (
+
if ((actionValue.selfProtectedAction != WifiActionHeader::PEER_LINK_CONFIR
M) && !fields.meshId.IsEqual (
*(m_protocol->GetMeshId ())))
{
m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);

@@ -125,22 +124,23 @@
MeshInformationElementVector elements;
packet->RemoveHeader (elements);
peerElement = DynamicCast<IePeerManagement>(elements.FindFirst (IE11S_PEE
RING_MANAGEMENT));
+
NS_ASSERT (peerElement != 0);
//Check taht frame subtype corresponds peer link subtype
if (peerElement->SubtypeIsOpen ())
{
m_stats.rxOpen++;
NS_ASSERT (actionValue.peerLink == WifiActionHeader::PEER_LINK_OPEN);
+
NS_ASSERT (actionValue.selfProtectedAction == WifiActionHeader::PEER_L
INK_OPEN);
}
if (peerElement->SubtypeIsConfirm ())
{
m_stats.rxConfirm++;
NS_ASSERT (actionValue.peerLink == WifiActionHeader::PEER_LINK_CONFIR
M);
+
NS_ASSERT (actionValue.selfProtectedAction == WifiActionHeader::PEER_LIN
K_CONFIRM);
}
if (peerElement->SubtypeIsClose ())
{
m_stats.rxClose++;
NS_ASSERT (actionValue.peerLink == WifiActionHeader::PEER_LINK_CLOSE)
;
+
NS_ASSERT (actionValue.selfProtectedAction == WifiActionHeader::PEER
_LINK_CLOSE);
}
//Deliver Peer link management frame to protocol:
m_protocol->ReceivePeerLinkFrame (m_ifIndex, peerAddress, peerMpAddress,
fields.aid, *peerElement,
@@ -158,7 +158,7 @@
{
WifiActionHeader actionHdr;
packet->PeekHeader (actionHdr);
if (actionHdr.GetCategory () == WifiActionHeader::MESH_PEERING_MGT)
+
if (actionHdr.GetCategory () == WifiActionHeader::SELF_PROTECTED)
{
return true;
}
@@ -215,27 +215,27 @@
{
m_stats.txOpen++;
WifiActionHeader::ActionValue action;
action.peerLink = WifiActionHeader::PEER_LINK_OPEN;
+
action.selfProtectedAction = WifiActionHeader::PEER_LINK_OPEN;
fields.subtype = WifiActionHeader::PEER_LINK_OPEN;
actionHdr.SetAction (WifiActionHeader::MESH_PEERING_MGT, action);
+
actionHdr.SetAction (WifiActionHeader::SELF_PROTECTED, action);
}
if (peerElement.SubtypeIsConfirm ())
{
m_stats.txConfirm++;
WifiActionHeader::ActionValue action;
action.peerLink = WifiActionHeader::PEER_LINK_CONFIRM;
+
action.selfProtectedAction = WifiActionHeader::PEER_LINK_CONFIRM;
fields.aid = aid;

fields.subtype = WifiActionHeader::PEER_LINK_CONFIRM;
actionHdr.SetAction (WifiActionHeader::MESH_PEERING_MGT, action);
actionHdr.SetAction (WifiActionHeader::SELF_PROTECTED, action);

}
if (peerElement.SubtypeIsClose ())
{
m_stats.txClose++;
WifiActionHeader::ActionValue action;
action.peerLink = WifiActionHeader::PEER_LINK_CLOSE;
+
action.selfProtectedAction = WifiActionHeader::PEER_LINK_CLOSE;
fields.subtype = WifiActionHeader::PEER_LINK_CLOSE;
fields.reasonCode = peerElement.GetReasonCode ();
actionHdr.SetAction (WifiActionHeader::MESH_PEERING_MGT, action);
+
actionHdr.SetAction (WifiActionHeader::SELF_PROTECTED, action);
}
plinkFrame.SetPlinkFrameStart (fields);
packet->AddHeader (plinkFrame);
diff -Naur ns-3.22/src/mesh/model/flame/flame-header.cc ns-3.23/src/mesh/model/f
lame/flame-header.cc
--- ns-3.22/src/mesh/model/flame/flame-header.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/mesh/model/flame/flame-header.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -40,6 +40,7 @@
{
static TypeId tid = TypeId ("ns3::flame::FlameHeader")
.SetParent<Header> ()
+
.SetGroupName ("Mesh")
.AddConstructor<FlameHeader> ();
return tid;
}
diff -Naur ns-3.22/src/mesh/model/flame/flame-protocol.cc ns-3.23/src/mesh/model
/flame/flame-protocol.cc
--- ns-3.22/src/mesh/model/flame/flame-protocol.cc
2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/mesh/model/flame/flame-protocol.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -46,7 +46,7 @@
TypeId
FlameTag::GetTypeId ()
{
- static TypeId tid = TypeId ("ns3::flame::FlameTag").SetParent<Tag> ().AddCons
tructor<FlameTag> ();
+ static TypeId tid = TypeId ("ns3::flame::FlameTag").SetParent<Tag> ().AddCons
tructor<FlameTag> ().SetGroupName ("Mesh");
return tid;
}
@@ -110,6 +110,7 @@
{
static TypeId tid = TypeId ("ns3::flame::FlameProtocol")
.SetParent<MeshL2RoutingProtocol> ()
+
.SetGroupName ("Mesh")
.AddConstructor<FlameProtocol> ()
.AddAttribute ( "BroadcastInterval",
"How often we must send broadcast packets",
diff -Naur ns-3.22/src/mesh/model/flame/flame-rtable.cc ns-3.23/src/mesh/model/f
lame/flame-rtable.cc
--- ns-3.22/src/mesh/model/flame/flame-rtable.cc
2015-02-05 15:46:22.0000
00000 -0800

+++ ns-3.23/src/mesh/model/flame/flame-rtable.cc
2015-05-13 11:05:27.0000
00000 -0700
@@ -38,6 +38,7 @@
static TypeId tid =
TypeId ("ns3::flame::FlameRtable")
.SetParent<Object> ().AddConstructor<FlameRtable> ()
+
.SetGroupName ("Mesh")
.AddAttribute ( "Lifetime",
"The lifetime of the routing enrty",
TimeValue (Seconds (120)), MakeTimeAccessor (
diff -Naur ns-3.22/src/mesh/model/mesh-information-element.h ns-3.23/src/mesh/mo
del/mesh-information-element.h
--- ns-3.22/src/mesh/model/mesh-information-element.h 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/mesh/model/mesh-information-element.h 2015-05-13 11:05:27.0000
00000 -0700
@@ -25,31 +25,31 @@
namespace ns3 {
-#define IE11S_LINK_METRIC_REPORT
-#define IE11S_CONGESTION_NOTIFICATION
+#define IE11S_LINK_METRIC_REPORT
+#define IE11S_CONGESTION_NOTIFICATION
#define IE11S_SUPP_MBSS_REG_CLASSES_CHANNELS
#define IE11S_MESH_CHANNEL_SWITCH_ANNOUNCEMENT
#define IE11S_MESH_TIM
-#define IE11S_AWAKE_WINDOW
-#define IE11S_BEACON_TIMING
-#define IE11S_MCCAOP_SETUP_REQUEST
-#define IE11S_MCCAOP_SETUP_REPLY
-#define IE11S_MCCAOP_ADVERTISEMENT
+#define IE11S_AWAKE_WINDOW
+#define IE11S_BEACON_TIMING
+#define IE11S_MCCAOP_SETUP_REQUEST
+#define IE11S_MCCAOP_SETUP_REPLY
+#define IE11S_MCCAOP_ADVERTISEMENT
#define IE11S_MCCAOP_RESERVATION_TEARDOWN
#define IE11S_PORTAL_ANNOUNCEMENT
-#define IE11S_PROXY_UPDATE
-#define IE11S_PROXY_UPDATE_CONFIRMATION
+#define IE11S_PROXY_UPDATE
+#define IE11S_PROXY_UPDATE_CONFIRMATION
#define IE11S_ABBREVIATED_HANDSHAKE
/* begin of open80211s-compatible IDs */
-#define IE11S_MESH_CONFIGURATION
-#define IE11S_MESH_ID
-#define IE11S_PEERING_MANAGEMENT
+#define IE11S_MESH_CONFIGURATION
+#define IE11S_MESH_ID
+#define IE11S_PEERING_MANAGEMENT
/* end of open80211s-compatible IDs */
-#define IE11S_RANN
+#define IE11S_RANN
/* begin of open80211s-compatible IDs */
-#define IE11S_PREQ
-#define IE11S_PREP
-#define IE11S_PERR
+#define IE11S_PREQ
+#define IE11S_PREP

((WifiInformationElementId)20)
((WifiInformationElementId)21)
((WifiInformationElementId)115)
((WifiInformationElementId)116)
((WifiInformationElementId)23)
((WifiInformationElementId)24)
((WifiInformationElementId)25)
((WifiInformationElementId)26)
((WifiInformationElementId)27)
((WifiInformationElementId)28)
((WifiInformationElementId)29)
((WifiInformationElementId)30)
((WifiInformationElementId)119)
((WifiInformationElementId)120)
((WifiInformationElementId)121)
((WifiInformationElementId)122)
((WifiInformationElementId)123)
((WifiInformationElementId)31)
((WifiInformationElementId)32)
((WifiInformationElementId)37)
((WifiInformationElementId)38)
((WifiInformationElementId)137)
((WifiInformationElementId)138)
((WifiInformationElementId)39)
((WifiInformationElementId)51)
((WifiInformationElementId)52)
((WifiInformationElementId)55)
((WifiInformationElementId)113)
((WifiInformationElementId)114)
((WifiInformationElementId)117)
((WifiInformationElementId)67)
((WifiInformationElementId)126)
((WifiInformationElementId)68)
((WifiInformationElementId)69)
((WifiInformationElementId)70)
((WifiInformationElementId)130)
((WifiInformationElementId)131)

+#define IE11S_PERR
/* end of open80211s-compatible IDs */
#define IE11S_MESH_PEERING_PROTOCOL_VERSION

((WifiInformationElementId)132)
((WifiInformationElementId)74)

diff -Naur ns-3.22/src/mesh/model/mesh-l2-routing-protocol.cc ns-3.23/src/mesh/m


odel/mesh-l2-routing-protocol.cc
--- ns-3.22/src/mesh/model/mesh-l2-routing-protocol.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/mesh/model/mesh-l2-routing-protocol.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -33,7 +33,9 @@
MeshL2RoutingProtocol::GetTypeId (void)
{
static TypeId tid = TypeId ("ns3::MeshL2RoutingProtocol")
.SetParent<Object> ();
+
.SetParent<Object> ()
+
.SetGroupName ("Mesh")
+ ;
return tid;
}
diff -Naur ns-3.22/src/mesh/model/mesh-point-device.cc ns-3.23/src/mesh/model/me
sh-point-device.cc
--- ns-3.22/src/mesh/model/mesh-point-device.cc 2015-02-05 15:46:22.000000000 -0
800
+++ ns-3.23/src/mesh/model/mesh-point-device.cc 2015-05-13 11:05:27.000000000 -0
700
@@ -38,6 +38,7 @@
{
static TypeId tid = TypeId ("ns3::MeshPointDevice")
.SetParent<NetDevice> ()
+
.SetGroupName ("Dsr")
.AddConstructor<MeshPointDevice> ()
.AddAttribute ("Mtu", "The MAC-level Maximum Transmission Unit",
UintegerValue (0xffff),
diff -Naur ns-3.22/src/mesh/model/mesh-wifi-interface-mac.cc ns-3.23/src/mesh/mo
del/mesh-wifi-interface-mac.cc
--- ns-3.22/src/mesh/model/mesh-wifi-interface-mac.cc 2015-02-05 15:46:22.0000
00000 -0800
+++ ns-3.23/src/mesh/model/mesh-wifi-interface-mac.cc 2015-05-13 11:05:27.0000
00000 -0700
@@ -47,6 +47,7 @@
{
static TypeId tid = TypeId ("ns3::MeshWifiInterfaceMac")
.SetParent<RegularWifiMac> ()
+
.SetGroupName ("Mesh")
.AddConstructor<MeshWifiInterfaceMac> ()
.AddAttribute ( "BeaconInterval",
"Beacon Interval",
diff -Naur ns-3.22/src/mesh/test/dot11s/hwmp-proactive-regression-test-0-1.pcap
ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-0-1.pcap
--- ns-3.22/src/mesh/test/dot11s/hwmp-proactive-regression-test-0-1.pcap
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-0-1.pcap
2015-05-13 11:05:27.000000000 -0700
@@ -1,62 +1,55 @@

iB R R <
-

HJP$0H`l4
P < mesh397a  

J$0H`l397AA 

 $0H`l  4mesh%RR <

J$0H`l4mesh397  PP <

0J$0H`l397 

 RR <

@J$0H`l4mesh397 

PP <

J$0H`l397 JOAA

 JO$0H`l4mesh+FbF 

Pa$0H`l
-7O4meshjAA  0j$0H`lb4mesh
-?? <

` E 

a
-EE 

p D
%

-?? <

@,E 
- 
-?? <

  E
-?? <

  :E
- ,E E
 
FFP D
%


$0H`l
-4meshJOAA  ` $0H`l4mesh+bFF  

$0H`l
-z 4meshjAA  p2$0H`l4mesh?? <

 E 

 FF  

E$0H`l
- 34mesh?? <

 E 

EE 

 D
%
A?? <

 
E ?? <

,OE
 EE JO

AA 
 D% $0H`lF4mesh[LL

 
+

i& > > <

$0H`lr
<< <
meshq

9u)  

$0H`lq9uAA



 $0H`lx rmesh%>> <

$0H`lrmeshq9u X<< <

0$0H`lq9uh 

>>> <

@$0H`lrmeshq9uN 

 << <

$0H`lq9u@ J OAA  JO$0H`lxrmesh+FbF 

Pa$0H`lx
+7OrmeshjAA  0j$0H`lxbrmeshFF  

`$0H`lx
+rmeshJOAA  @ $0H`lxrmesh+FbF 

p$0H`lx
+z rmeshjAA  P2$0H`lxrmesh?? <

  

zFF  

E$0H`lx
+3rmesh
EE 

%*?? <

`
  b?? <

  V ?? <

,%
EE JO

AA p

 $0H`lxErmesh[LL

 

- LL<

  
+ LL<

   

-B mLL 
+B mLL 

-LL<

 
+LL<

 

-
<

E @
+
<


E  @

-

l 

LL  
+
l 

LL  

-GLL

 
+GLL

 

-LY
L< 

0 
+LY
L< 

 

- 

k<

 E @
+ 

k<

 E @

-

l  <

@
E  @
+

l  <

E @

-

l+bFF 

P3&$0H`l
-&4meshjAA t'$0H`l&4meshk?? <

` E 

lEE 

pD
%
*l?? <

 El
  jm?? <

F YE
m<EE 

 D%

 
E  @
+

l+bFF 

3&$0H`lx
F+&
<rmeshjAA t'$0H`lx&rmesh 

0
E  @

-

lV 

<

  E @
+

lV 

<

 E @

-

l [<


E  @
+

l [<

@
E  @

-

lFF  

S .$0H`l
-].u'4meshJOAA 0
f-/$0H`l
<  .4mesh7 


E  @
+

lFF  

PS .$0H`lx
+].u'rmeshJOAA 
f+/$0H`lx
<
 .rmesh7 

`
E  @

-

lv 

<

@ E @


+

lv 

<

 
E  @

- {<l



E  @
+ {<l


p
E  @

-

l+bFF 

s(6$0H`l
F-5
</4meshjAA P*6$0H`l(64mesh 


E  @
+

l+bFF 

s(6$0H`lx
F+5
</rmeshjAA *6$0H`lx(6rmesh 

 
E  @

-

lV 

<

` E @


+

lV 

<

  E @

-

l <

E @
+

l <


E  @

-

lFF  

 =$0H`l
- =64meshJOAA pJX>$0H`l=4mesh|?? <

  E 

}?? <

  E 

~EE 

0mD
%
/~?? <

 ~
E J ?? <

@E
<EE 

    D%

P
E  @
+

lFF  

 =$0H`lx
+ = 6rmeshJOAA 0JX>$0H`lx=rmesh,|?? <

 

}?? <

 

~EE 

%0~?? <

@~
   ?? <

f,%>
<EE 7

  P


E  @

-

l& 

}<

 E @
+

lv 

<

` E @



- 

lm<

`
E  @
+ <l


E @

-

l+bFF 

pjE$0H`l
-@EX>4meshjAA

jE$0H`lkE4mesh &

?? <

  E 

 '

EE 

 D
%
'

?? <

7(E 

  (

?? <

 vE)

E
E 

 D%
\ No newline at end of file
+
l+bFF 

jE$0H`lx
+@EX>rmeshjAA pjE$0H`lxkErmesh
\ No newline at end of file
diff -Naur ns-3.22/src/mesh/test/dot11s/hwmp-proactive-regression-test-1-1.pcap
ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-1-1.pcap
--- ns-3.22/src/mesh/test/dot11s/hwmp-proactive-regression-test-1-1.pcap
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-1-1.pcap
2015-05-13 11:05:27.000000000 -0700
@@ -1,107 +1,95 @@
0J-
(J$D0H`l4
%

$0H`l3
$0H`l
m%iResh3
$REE4m<esh
9
7RA9RA7>&<

 7 ' 'PP <

J$0H`l4mesh397  

% P P <

@RJR$0H`l3
 < 975  

{PJP$0H`l4
P < mesh397  

J$0H`l397<  

 AA  

 $0H`l  4meshRR <

J$0H`l4mesh397 

PP <

0J$0H`l397 

RR <

@J$0H`l4mesh397 

tPP <

`JH$70H`l3
$0H`l97  OAA
-4meshaFF  

 JO$0H`l4meshF7F 

Pa$0H`l
-7O4meshAA 0j$0H`lb4mesh
p-E
DE% 


-?? <

` E 


- 


- 
-EE 

p D
%

-?? <

@E 
- N
-?? <

  E
- B
-?? <

  E
- 


-h,E
E
$0H`l

 F FP D%


-fb4mesh FF 

$0H`l
-
y$40H`l
meshOAA  ` $0H`l4mesh7FF  
-4meshaFF 

$0H`l
-z$0H`l
4meshAA  p2$0H`l4mesh FF
-
D%4mesh
@??EE< 



 E 

FF



E$0H`l
-34mesh?? <

 E 

\ 

EE  

 D
%
?? <

 
E 5 W?? <

 E 

,E

E  
   O AD%A $0H`lF4meshLL
0$+
0H`lr
($%0H`lq

 $0H`lx

meshq
9%i>u>E$EA9rA<
umwt(

)
*
esh
>>
#,><>,<<< <

$0H`lrmeshq9uc  

 < < <

@$0H`lq
> > <9u  

'P$0H`lr
< < <meshq9u  

$0H`lq9u  

 AA  

 $0H`lx rmesh >> <

$0H`lrmeshq9u << <

0$0H`lq9u  

>> <

@$0H`lrmeshq9uz 

<< <

`$0H`lq
H7$0H`lx
9u OAA  JO$0H`lxrmesh7FF
+rmeshaFF  



Pa$0H`lx
p+h7
O$r0H`lx
meshAA 0j$0H`lxbrmesh FF  
+fbrmesh FF 

`$0H`lx
+
y$r0H`lx
meshOAA  @ $0H`lxrmeshF7F 
+rmeshaFF 

p$0H`lx
+z$0H`lx
rmeshAA  P2$0H`lxrmesh F F 
+%
rmesh
@??EE< 

  

 

FF



E$0H`lx
+3rmeshE  EE 

% ?? <

`
  ?? <

     ?? <

    


V,%E
E  
O AAp  $0H`lxErmeshLL

-LL

 
+LL

 

-LL<

  
+LL<

   

- LL 
+ LL 

-XLL<

 
+XLL<

 

- 


LL<
+ 


LL<

-/ p<


E  @
+/ p<


E  @

-<

l  

E @
+<

l  


E  @

-

l 

 LL  
+
l 

 LL  

-LL

 
+LL

 


-LL
  
+LL

  

-r LL<

 
+r LL<

 

--
LL<

0 
+-
LL<

 

-A 

p<

 E @
+A 

p<

 E @

-

l   <

@
E  @
+

l   <

E @

-

l) 


E@<
+

l) 


E@<

- &$0H`l
l7FF  
-J&F4meshFaF 

P3&$0H`l
0-
&
D%4mj
esh
??A<A t'$0H`l&4meshzjEE  

` E 

Ek 

 kEE  

pD
%
 l?? <

 El
  l?? <

  Em  

jnY E
E  
o  D%<

@
E  @
+ &
 $0H`lx
l7FF  
+J&ErmeshFaF 

3&$0H`lx
+&rmeshAA t'$0H`lx&rmesh  <

 
E  @

A- <

l 

 
E  @
A+ <

l 

0
E  @

-

l  

<

  E @
+

l  

<

 E @

- 

l W<


E  @
+ 

l W<

@
E  @

-

l 

P
E  @
+

<
l 

0
E  @ <

`-\.$0H`l
l F F 
--&4mesh FF 

S .$0H`l
-].u'4meshOAA 0
-/$0H`l .4mesh  <

p
E  @
@+\.$0H`lx
l F F 
+-&rmesh FF 

PS .$0H`lx
+].u'rmeshOAA 
+/$0H`lx .rmesh <

P
E  @


a-
<

l


E  @
a+
<

`
E  @

-

l 

<

@ E @


+

l 

<

 
E  @

-

l w <


E  @
+

l w <

p
E  @

-

l 

&
E@<
+

l 

`&
E@<

-  $0H`ll7FF  
5
- 5 .4meshaFF 

s(6$0H`l
-5/4meshAA P*6$0H`l(64mesh <


E  @
p+ 5$0H`lx
l7FF  
+ 5 .rmeshaFF 

s(6$0H`lx
+5/rmeshAA *6$0H`lx(6rmesh <

 
E  @

A- <

l 


E  @
A+ <

l 

 
E  @

-

l  

<

` E @


+

l  

<

  E @

- 

l  <

E @
+ 

l  <


E  @



l 

-
E<@
+
E<@

-( =$0H`l
l F F 
--=(64mesh FF 

 =$0H`l
-
D=
%6
 4m{esh
??O<AA pJX>$0H`l=4mesh {EE  

  E 

|?? <

  E 

J} 

 }EE  

0mD
%
 ~?? <

  ~
E ~?? <

@ E  

JE
E  
&  {  D% <


E  @
+( =$0H`lx
l F F 
+-=(6rmesh FF 

 =$0H`lx
+%
= 6rm{esh
??O<AA 0JX>$0H`lx=rmesh {EE 

 

|?? <

 

K} 

 }EE  

% ~?? <

@~
  $  F ?? <

    

,%E
E  
  P   <


E  @

-<

l 

P
E  @
+
a+
<

l


E  @

-

lR 

1<

 E @
+

l 

<

` E @



- 

lA  <

`
E  @
+

l  <

E @

-

lE 

t
E@<
+

l 


E<@

H- @E
 $0H`l
l7FF  
-D=4meshaFF 

pjE$0H`l
-@EX>4meshAA

jE$0H`lkE4mesh%

EDE
%
 
& 

?? <

  E 

&

 

'

EE 

 D
%
'

?? <

 E 
-(

 ~ (

?? <

 'E)

 

)

E
E 
c+  D%

 
\ No newline at end of file
+ H@E$0H`lx
l7FF  
+D=rmeshaFF 

jE$0H`lx
+@EX>rmeshAA pjE$0H`lxkErmesh
\ No newline at end of file
diff -Naur ns-3.22/src/mesh/test/dot11s/hwmp-proactive-regression-test-2-1.pcap
ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-2-1.pcap
--- ns-3.22/src/mesh/test/dot11s/hwmp-proactive-regression-test-2-1.pcap
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-2-1.pcap
2015-05-13 11:05:27.000000000 -0700
@@ -1,126 +1,114 @@
J&$
-
J$PD0H`l3
%

0H`l4
$P0H`l4
0H`l
 <
 m4uim*esh3
$esh3
esh
<E<E9$7R
&R9<&977R\%R <
 
0$-'
)(J$0H`l3
$a0H`l
'PP$<
)
40mJesh
$90H`l3
7B"(RR<
97*RR <@J$0H`l4mesh397+ ( AA  

J$0H`l4mesh397R  

 P P <

@JR$0H`l3
R < 97a  

PPJP$0H`l4
 < mesh397H  

J$0H`l397  

AA



 $0H`l  4mesh  PP <

0J$0H`l397 RR <

@J$0H`l4mesh397 FF  P-$0H`l


`- H7$0H`l
4meshH7FF  
-4mesh+bFF  

Pa$0H`l
-7O4mesh
p-E
DE% 
 
-?? <

` E 


- 

a
`-q?E? <
- a
- E E
 
, p D%
- 
-?E? <
- 
-?? <

  E
- 

 $FF   Mf$0H`l
- h7 
J$40H`l
mesh( FF  
-fb4meshFF  

$0H`l
-4meshFF  m$0H`l
-  
y$0H`l
4meshH7FF  
-4mesh+bFF 

$0H`l
-z 4mesh $FF  $0H`l
-z$0H`l
4mesh( F F 
-
D%4mesh
 FF EE
 
 

E$0H`l
- 34mesh?? <

 E 

/ 

EE 

 ED
% 
????< <


 E  

AE
E  

 D%

E
 ?s?LL< 
0(@;$$
+
0H`lr
*
($%0H`lq

0H`lr
A<$0H`lx
A<$0H`lx

m 
<
eshq
9muir*u
$Km<E$<E,
eshq
esh
*
9r9)
uumG>F>$

&
)
+
esh
+>>&<E+
&,><<><<<<
$0H`lq

9u'>> < $0H`lrmeshq9u(>> <

$0H`lrmeshq9u6  

 < < <

]@$0H`lq
> > <9u)  

P$0H`lr
< < <meshq9u  

$0H`lq9u  

AA



 $0H`lx rmesh X<< <

0$0H`lq9u>>> <

@$0H`lrmeshq9u@  FF P-$0H`lx


`+H7$0H`lx
rmeshH7FF  
+rmesh+bFF  

Pa$0H`lx
+7Ormesh $FF  `Mf$0H`lx
p+hJ
7$0H`lx
rmesh( F F 
+fbrmeshFF  

`$0H`lx
+rmeshFF  pm$0H`lx
+ y
$0H`lx
rmeshH7FF  
+rmesh+bFF 

p$0H`lx
+z rmesh $FF   $0H`lx
+$z0H`lx
rmesh( F F 
+%
rmesh
??E<E  

  

 

zFF  

E$0H`lx
+r3rmesh
V?b???<
 < ?? <

  f  

sLL  

-FF  I&$0H`l
--&4mesh

  /LL 
+FF  I&$0H`lx

+-&rmesh
  /LL 

-[LL

 
+[LL

 

-B LL<

 
+B LL<

 

- 

u
LL <
+ 

u
LL <

-2
LL< 
+2
LL< 

-
E @<
+
E @<

-
l k <


E  @
+

l k <


E  @

-<

l 

E @
+<

l 


E  @

-

lGLL

 
+
l GLL

 


-rLL
  
+rLL

  

- LL0 
+ LL 

@-
  6LL<
+  6LL<

-F  LL<

 
+F  LL<

 

-LY
L< 

0 
+LY
L< 

 

- <

@
E  @
+ <

E @

-

l 


E@<
+

l 


E@<

'-  <PE@l 
'+  < E@l 

-&$0H`l
lH7FF 
-J&F4mesh+FbF 

P3&$0H`l
0-
&
D%k
4?m?esh
 <jEE  

` E 

k 

lEE 

`pl
ED
% jm??l?<? <

  zEm  

jn
Eo

E@ @ 
5oo<
po ?D%? <
+&
 $0H`lx
lH7FF 
+J&Ermesh+FbF 

3&$0H`lx
0+
&
E  @rmesh@ o <

-
l   <

@
E  @
+

l   <

 
E  @

F-<

l 

 
E  @
F+<

l 

0
E  @

- 

l [<


E  @
+ 

l [<

@
E  @

-

lk 

P
E< @
+

lk 

0
E< @


l
2-<
E  @ 
2+<@
E  @ 

-
l $FF -$0H`l
`-\.
&-
$0H`l
4mesh( F F 
--&4meshFF 

S .$0H`l
- ]
.
E  @u'
 4mesh`  <
+
l $FF P-$0H`lx
@+\.
-&
$0H`lx
rmesh( F F 
+-&rmeshFF 

PS .$0H`lx
`+]
.
E  @u'
 rmesh`  <

-
l  <

p
E  @
+

l  <

P
E  @

f-<

l7 


E  @
f+<

l7 

`
E  @

- {<l



E  @
+ {<l


p
E  @

-

l  

!
E@<
+

l  

`!
E@<

-  <E@lb 
+  <pE@lb 

-
lFF  5$0H`l
-].
5
$0H`l
o54meshH7FF 
- 5 .4mesh+bFF 

s(6$0H`l
- 
5
E  @/ 4mesh@ o <
+
lFF   5$0H`lx
p+o5
5$]0H`lx
.rmeshH7FF 
+ 5 .rmesh+bFF 

s(6$0H`lx
+
5
E  @/ rmesh@ o <

-
l   <


E  @
+

l   <

 
E  @

F-<

l 


E  @
F+<

l 

 
E  @

- 

l  <

E @
+ 

l  <


E  @

-

l 


E  @
+

<
l 

  
E  @ <


lB
q-<E @
q+<
E  @ 

- $0H`ll $FF 
-=
-(5==$0H`l
4mesh( FF 
--=(64meshFF 

 =$0H`l
}
-?
?D=
%6
<  4mesh*{EE  

  E 

} 

~EE 

0mD
%
~ J ? ? <

@ ZE  

P@&6
E?
?@<
 E\E? 
<??0<
 D%
+ $0H`lxl $FF 
-=
+(==5
$0H`lx
rmesh( FF 
+-=(6rmeshFF 

 =$0H`lx
+%
= 6}r?mesh
? <
*{ EE  

 

} 

~EE 

%~

  ??~?<? <

    

0%
E
E@ ` 

  <
?? <

-
lO <


E  @
+

l  <


E  @

-<

l 

P
E  @
f+<

l7 


E  @

-

lm<

`
E  @
+ <l


E @

-

l 

o
E@<
+

l 


E<@

-  <`E@l 
+  <
E  @ lY 

-
lFF p-D$0H`l
H-@E
=$0H`l
D4meshH7FF 
-D=4mesh+bFF 

pjE$0H`l
-@EX>4mesh %

EDE
%
 
 & 

?? <

  E 

 &

 

 '

EE 

 D
%
 (

?0?(E <

  (

?? <

 E(

 

)

EE

 *  D%

 ' +

??7E+ <

 
\ No newline at end of file
+
lFF -D$0H`lx
+H@E
D$=
0H`lx
rmeshH7FF 
+D=rmesh+bFF 

jE$0H`lx
+@EX>rmesh
\ No newline at end of file
diff -Naur ns-3.22/src/mesh/test/dot11s/hwmp-proactive-regression-test-3-1.pcap
ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-3-1.pcap
--- ns-3.22/src/mesh/test/dot11s/hwmp-proactive-regression-test-3-1.pcap
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-3-1.pcap
2015-05-13 11:05:27.000000000 -0700
@@ -1,107 +1,95 @@
0J}$
-
%(J$<D0H`l3
(
%

0H`l4
R$P<0H`l3
0H`l
0H`l4
RP$0H`l


<Jm4i$mesh3
esh
esh3
0H`l4
$EE4m%esh
9Rm97R
7>
esh3
&'<99r77/&%7RR
'9<7'PP( E<)PP <0J$0H`l397* C*RR <@J$0H`l4mesh39+
7 +PP

% P P <

@J$0H`l397 RR <

PJ$0H`l4mesh397<  

AA  0 $0H`l$4mesh-FF P-$0H`l


`- H7$0H`l
4mesh7FF  
-4mesh
p-E
DE% 


`-?E? <
- 


`-?E? <
- 
- E E
 
 p D %
-?? <@ E 
- N
-?E? <
- 
- -E E
 
 P D %
- 

$FAFA `Mf
I$0H`l4mesh
- h7 
J$40H`l
mesh FF  
-fb4meshAA p$0H`lf4mesh-FF m$0H`l
-  
y$0H`l
4mesh7FF  
-FF4mesh
$

AA 
$0H`l   $0H`l4mesh
-z$0H`l
4mesh F F 
-\

ED%4mesh
@??EE< 

5
???<< 
E

^
E
E.
 
?E?
EA?A<?
 <
D
%  E D%-&$0H`l4meshLL  
$
+
<%
$<0H`lx
 
ir mEEesh
 
&>> <$0H`lrmeshq9u& g &<< <$0H`lq9u

0@$'?
0H`lr
)
($0H`lq
0H`lr
A<A<@'$0H`lx
><
m>
eshq
9mu
eshq
w<$,
*9$r9u
0H`lr
umk+#<)
?,<$0H`lx
esh
cm<
eshq
 ,$<0H`lq
<$9ur<
'm9esh
u+t) {>+A>A>>< <




 < < <

@$0H`lq9u >> <

P$0H`lrmeshq9u  

AA  0 $0H`lx$rmesh-FF  P-$0H`lx


`+H7$0H`lx
rmesh7FF  
$+FFr
mesh`AMAf $0H`lx
@I$0H`lxrmesh
p+hJ
7$0H`lx
rmesh F F 
+fbrmeshAA P$0H`lxfrmesh-FF pm$0H`lx
+ y
$0H`lx
rmesh7FF  
$+FFrmesh

AA  
$0H`lx
`  $0H`lxrmesh
+$z0H`lx
rmesh F F 
+%

rmesh
@??EE< 

-%E

?
?
<
b
 ?EE?E?<?

<p  

AA   -&$0H`lxrmeshLL  



-LL 
+LL 

- FF I&$0H`l
--&4mesh

  LL
+ FF I&$0H`lx

+-&rmesh
  LL

- 


LL<
+ 


LL<

\-LL < 
\+LL < 

- H< E  @ 
+ H< E  @ 

- 
E  @ lX <
+ 
E  @ lX <

-
l/ p<


E  @
+

l/ p<


E  @

-

lLL
+

lLL

-LL0 
+LL 

-ILL<  
+ILL<  

-Y TLL 
+Y TLL 

@-
 LL<
+
 LL<

-r LL<

 
+r LL<

 

-) 


E@<
+) 


E@<

"-  <PE@l 
"+  < E@l 

-&$0H`l
lc  7FF  
`0-EJk
&

ED%F4mj
esh
??zj<EE 

`3ll
E??m
< 

o
m}E
o
VEo??p

EnE<<
??p
E<
D% @E  D %
+&
 $0H`lx
lc  7FF  
+J&Ermesh< E @

- 
E  @ l k<
0+ 
E  @ l k<

-
l  <

@
E  @
+

l  <

 
E  @

-

lAA 0+-$0H`lJ&4mesh 

P
E  @
+

<
lAA +-$0H`lxJ&rmesh 

0
E  @ <

. 
l
 
-<
E  @ 
+<@
E  @ 

-FF 
$
ln-
 $0H`l
`-\.
&-
$0H`l
4mesh F F 
--&4mesh$<@ E  @ 
+FF 
$
lnP-
 $0H`lx
@+\.
-&
$0H`lx
rmesh F F 
+-&rmesh$< E @

- 
E  @ l4  <
`+ 
E  @ l4  <

-
l <

p
E  @
+

l <

P
E  @

-

lAA  PKo5$0H`l-4mesh 

&
E@<
+

lAA  Ko5$0H`lx-rmesh 

`&
E@<

-  <E@l6 
+  <pE@l6 

-
l - FF  5$0H`l
-].
5
$0H`l
o54mesh7FF 
- 5 .4mesh<` E  @ 
+
l - FF   5$0H`lx
p+o5
5$]0H`lx
.rmesh7FF 
+ 5 .rmesh<  E  @ 

- 
E  @ l k<
+ 
E  @ l k<

-
l  <


E  @
+

l  <

 
E  @

-

lAA pk=$0H`l 54mesh 

-
E<@
+

lAA 0k=$0H`lx 5rmesh 

+
E<@


l
m 
-<E @
+<
E  @ 

-FF$0H`l
$
-=

l 
-(5==$0H`l
4mesh FF 
-J-}
=

ED%(6
 4m{esh
?? {<EE  

 }E?? <

@/c
&E?
?}9<
 ?EE?E??<

<EE@0 DD%% 
+FF$0H`lx
$
-=

l 
+(==5
$0H`lx
rmesh FF 
+K%-}
=

 (6
 rm{esh
?? <{EE  

$|}~
???<< 

6%E
E ? 
?$EE<
??<

`<@E @P

P- 
E  @ l ;<
+ 
E  @ l4  <

-
l{ <


E  @
+

l <


E  @

-

lAA   D$0H`l-=4meshE 

t
E@<
+

lAA  p D$0H`lx-=rmesh 


E<@

-  <`E@l  
+  <
E  @ l- 

-
l -FF  p-D$0H`l
H-@E
=$0H`l
D4mesh7FF 
-D=4mesh%

EDE
%
 
& 

??&E <

 

'

?\?(E <

 ' )

 

v)

EE

\*  D%

?l?* < E 

  *

??cE+ <

 ' ,

EE
 
  D%
\ No newline at end of file
+
l - FF -D$0H`lx
+H@E
D$=
0H`lx
rmesh7FF 
+D=rmesh
\ No newline at end of file
diff -Naur ns-3.22/src/mesh/test/dot11s/hwmp-proactive-regression-test-4-1.pcap
ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-4-1.pcap
--- ns-3.22/src/mesh/test/dot11s/hwmp-proactive-regression-test-4-1.pcap
2015-02-05 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-proactive-regression-test-4-1.pcap
2015-05-13 11:05:27.000000000 -0700
@@ -1,63 +1,56 @@
_J&$
-
(J$P0H`l3
R$P0H`l4
0H`l
R<
 J4imuesh3
<
$$<0H`l4
esh
<9$7R
mResh3
&RR<9J7"<$(

0H`l4
97m$esh3
) )PP<
907J\%$0H`l3
 97) *RR <@J$0H`l4mesh397* )+
-  4mesh
`-a?E? <
`-a?E? <
- E E
 
 p D%
-,?? <@ E 
- 
-?FE? <
- -E E
 
kAAP D
%
`I$0H`l4mesh $FF   M f$0H`l
-7J4mesh AA  p$0H`lf4meshFF m$0H`l
-4meshkAA     $0H`l4mesh $FF  $0H`l
-Az

E?
E?E?4<
mesh
<c
????<
D<
%
 E 

^&E

 EE??
<AA 
 D% -&$0H`l4meshHLL  
+
k@0;$
*$0H`lr
?
0H`lq
A<$0H`lx
A<
<
 
m9irueshq
u$m<*
esh
<9<uk$
?,

<>$>0H`lx
0H`lq
 <$0H`lr
$9urG+mmesh
eshq
 + 
>A>9Au <
%>>
 <$0H`lr
0 $m0H`lx
eshq$9urFm&esh
 &<F<F <$
0H`lqP9u-&$0H`lx
 '>> < $0H`lrmes
+ rmeshkAA  @I$0H`lxrmesh $FF `Mf$0H`lx
+J7rmesh AA P$0H`lxfrmeshFF pm$0H`lx
+rmeshkAA  `  $0H`lxrmesh $FF   $0H`lx
+-%E
E
zEEbr

mesh
??*
?A?A<??<?<

p<  -&$0H`lxrmeshHLL  

-sLL 
+sLL 

-FF  I&$0H`l
- L-&
L<4
mesh
 2 
+FF  I&$0H`lx
+-&
LL<rm
esh
  2 

- D< E @
+ D< E @

- 
E  @ l  <
+ 
E  @ l  <

-
l LL0 
+
l LL 

-LL<  
+LL<  

-  LL 
+  LL 

@-6
 LL<
+6
 LL<

'-
<PE @
'+
< E @

`-}5jo
l
n
NE
pE?E?Eo
?<?


nl<
?7<?pkE<
?D?@E% <
+
l7  < E  @ 

-
E  @ l@ o <
0+
E  @ l@ o <

-
lkAA 0+-$0H`lJ&4mesh
2-<
E  @ 
+
lkAA +-$0H`lxJ&rmesh
2+<@
E  @ 

-
lB  $FF  -$0H`l
-&-4mesh <@ E  @ 
+
lB  $FF  P-$0H`lx
+-&rmesh < E @

- 
E  @ l`  <
`+ 
E  @ l`  <

-<El@AA  PKo5$0H`l-4meshb 
+<pEl@AA  Ko5$0H`lx-rmeshb 

-
l  FF  5$0H`l
-].o54mesh<` E  @ 

+
l  FF   5$0H`lx
+o5].rmesh<  E  @ 

-
E  @ l@ o <
+
E  @ l@ o <

-
lkAA pk=$0H`l 54meshB
q-<E @
+
lkAA 0k=$0H`lx 5rmeshB
q+<
E  @ 

- $0H`ll   $FF  
-=
@-\&~
5
uE?
E?E?=E<
4?<m?
esh


?<?,|0?<
?EDD%%@E< 
+ $0H`lxl   $FF  
-=
+6%0~=~

?
E?5
E?<
r?<m?R
esh
?<?,<
|`P?<
?@E<@ 

P- 
E  @ l ? <
+ 
E  @ l`  <

-<`El@AA   D$0H`l-=4mesh 
+<
E  @l AA  p D$0H`lx-=rmeshY 

-
l  FF p-D$0H`l
- =D4mesh &

??(E <

??)E <

EE

   D%

??* < E 

 ' +

??E+ <

EE
 
  D%
\ No newline at end of file
+
l   FF -D$0H`lx
+D =rmesh
\ No newline at end of file
diff -Naur ns-3.22/src/mesh/test/dot11s/hwmp-reactive-regression-test-0-1.pcap n
s-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-0-1.pcap
--- ns-3.22/src/mesh/test/dot11s/hwmp-reactive-regression-test-0-1.pcap 2015-0205 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-0-1.pcap 2015-0513 11:05:27.000000000 -0700
@@ -1,76 +1,126 @@
-iC R R <J$0H`l4mesh397b  [   PP <J$0H`l397AA   $0H`l 4mesh%
-7O4meshjAA  0j$0H`lb4meshFF `$0H`l
-4meshJOAA  @ $0H`l4mesh+bFF  p$0H`l
-z 4meshjAA  P2$0H`l4meshFF  E$0H`l
-z34meshJOAA `$0H`lE4mesh+bFF  3 &$0H`l
-K4meshjAA  pt'$0H`l&4mesh.LL
- 
+i' > > <$0H`lrmeshq9u- > > <$0H`lrmeshq9u AA  $0H`lx  rmesh>> <$0H`lrmesh
+rmeshJ/AA  P q$0H`lxrmesh+FbF  $0H`lx
+qrmeshjAA  `$0H`lxrmeshaLL 
+ 

-YLL 
- 
+ L Lp
+ 

-(EE    D%  
-`EE   D%  
-
- c?? < E 
-s LL<
-  
+[

E%E  
E+ %E 
+  x?? <
+  LL<
+   

L-Lb<
-  
+wLL<
+   

- LL<
- 
+4 LL<
+ 

- ``<
+2   ``<

E 0@

-
  c ``<
+
! }4LL  
+
+5LL 
+
+<= =LL<
+ 
+
+
+= N>``<
+ E0@
+
+
#? ?``<
+
E 0@
+
+
FF E$0H`lx
+rmeshJ/AA  $0H`lxErmesh  ``< 

E 0@

-
s   ``<
+
  ``<
+ E0@
+
+
 ``<
+0E0@
+
+
+FbF @3&$0H`lx
+srmeshjAA  T'$0H`lx&rmeshd// <P
+t FF `S .$0H`lx
+'U'rmeshJ/AA 
+.
% $0H`lx .rmesh%EE p
+ 9%?? <
+ &?? <
+  '?? <
+ Y ( ) ?? < 
+   * ?? < 
+  2 +?? < 

+   0 1``< 



E 0@

-
 **LL  
-
-V+LL 
-
-FF   S .$0H`l
-&u'4meshJOAA 
-/$0H`l .4meshR  ``<0
+
1 ) 2``<
+ E0@
+
+
2 4``<
+E0@
+
+
M5``<
+E0@
+
+
 ``<

E 0@

-
% + bFF @s(6$0H`l
- ./4meshjAA *6$0H`l(64mesh3 {3,, <P F

- 3 LL  


-
-LL` 
-
-FF  p =$0H`l
- ./4mesh22 < J4mesh7 K RR < J $0H`l4mesh397B  22 <J4mesh7M22 <J4mesh7
-
-<< 0M$0H`l4meshRR < J $0H`l4mesh3976RR < J $0H`l4mesh3974RR < J $0

M4mesh+FF  T$0H`l


- TM4meshjAA CU$0H`lT4meshLL  
-
-LL  
-
-FF  v\$0H`l
-<\DU4meshJWAA \$0H`lv\4mesh+FF 3d$0H`l
-cDU4mesh22 <J4mesh7 U22 <J4mesh7 jAA  d$0H`ld4mesh RR <J$0H`l4mesh3
-  RR <J$0H`l4mesh397
-  PP < J$0H`l397
- J7AA 0
-l$0H`lk4mesh+FF  sYs$0H`l
-s
l4meshjAA @*s$0H`lYs4meshJ7AA  PJI{$0H`lYs4mesh
 22 <`J4mesh7
-  22 <@J4mesh7
- FF P $0H`l
-a 
I{4meshRR <pJ$0H`l4mesh397422 <`J4mesh7
D-  22 < J4mesh7
-R+Rj<AAJ$0H`l4


mesh3
 j $0H`l
974mesh
 RR <pJx$
0H`l4
PP <
mesh3
J$0H`l3
979272 <J4mesh|722 < J 4mesh7 

  

 AA  ?  $0H`l= 4mesh

RR <J$0H`l4mesh397

- 

aPP <J$0H`l397

" 
+ FF  $0H`l
- @ 4mesh
j A A   $0H`l 4mesh
\ No newline at end of file
+
  ``<
+  E0@
+
+
 3``<
+E0@
+
+
+FbF s(6$0H`lx
+.
AAU'
 
rmesh0*//6$<0H`lx

(6rmesh%-- <rmeshu45  -- <@rmeshu7-- <@rmeshu7-- <@rmeshu79


E%E 
+  AA  =$0H`lxV6rmesh%>> <P$0H`lrmeshq9u H<< < $0H`lq9uX .>> <0$0H`lrme
+%=
 `>rmeshjAA  j F$0H`lxkErmeshB
EE  P
+  d
?? < 
+ 
 
?? <`
+  
 
``<p
+
E 0@
+
+

 
``<
+ E0@
+
+

 
``<
+  E0@
+
+
n
``<
+  E0@
+
+

``<
+  E0@
+
+

 F
``<
+  E0@
+
+

``< 
+
E 0@
+
+
)
 
``<
+ E0@
+
+

``<
+ E0@
+
+

 
``<
+E0@
+
+
JWAA   M$0H`lxkErmesh_-- <rmeshu4|` -`- <rmeshu7a +FbF T$0H`
+*9=
MM
AArmesh
 
Mb>> N<\$$0H`lr
0H`lxm9eshq
Mrm9esh
uAc>%>>><$<
0H`lr
 $0H`lr
meshq
meshq
9uc9u`-
d-X<
<<rmeshu
<0$40H`lq
pd  d9--uh<5rmeshu
>> <7@ae$0H`lr
jAA
+k$0H`lxrmesh#AbA s1s$0H`lxkrmeshE>b> < $ 0H`lrmeshq9u8>c> < $ 0H`lrmeshq9uc k d<<
+kdsrmeshJAA J{$0H`lxzrmesh-- <rmeshu4'>> <$0H`lrmeshq9u  -- <rmeshu#7AbA 
+  rmesh
J AA  _ $0H`lx rmesh + bFF ` $0H`lx
+_ V rmesh
j AA  $0H`lx rmesh
\ No newline at end of file
diff -Naur ns-3.22/src/mesh/test/dot11s/hwmp-reactive-regression-test-1-1.pcap n
s-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-1-1.pcap
--- ns-3.22/src/mesh/test/dot11s/hwmp-reactive-regression-test-1-1.pcap 2015-0205 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-1-1.pcap 2015-0513 11:05:27.000000000 -0700
@@ -1,112 +1,206 @@
-i %RR J< $0H`l4mesh397?&8' ' PP J< $0H`l397(PP J<$0H`l397 AA 

PP <0J$0H`l397 
-RR <@J$0H`l4mesh397 u PP <J$0H`l397   OAA  JO$0H`l4mesh7FF 
-4meshaFF  Pa$0H`l
-7O4meshAA 0j$0H`lb4mesh F F `h$0H`l
-6b4mesh FF `$0H`l
-4meshOAA  @ $0H`l4mesh6 622 p< J4mesh77L8FF    y$0H`l
-4mesh39922 <J4mesh7:FaF p$0H`l
-z 4meshAA  P2$0H`l4mesh(-RR <J$0H`l4mesh397G.I/ / PP < J$0H`l397
-z34meshFF J$0H`l
-E4meshOAA `$0H`lE4meshaFF  3 &$0H`l
-K4meshgFF  &$0H`l
-&R&4meshAA pt'$0H`l&4mesh L L
- 
+i%>> $<0H`lrmeshq9u'>> $<0H`lrmeshq9u'>> $< 0H`lr

meshq9u(>> $<0H`lrmeshq9u)>> $< 0H`l

+b rmesh hi-- <rmeshu4jAA @j$0H`lxbrmesh

->> <$0H`lrmeshq9u..  /<< < $0H`lq9uFF h$0H`lx


+bnrmesh FF  p$0H`lx
+rmesh/AA  P q$0H`lxrmeshFaF  $0H`lx
+qrmeshgFF   $0H`lx
+rmeshAA  `$0H`lxrmesh
+LL
+ 

-LL
- 
+
+LL 
+ 

-LL 
- 
+

LLp
+ 

- E E    D %  
-EE   D %  
-$EE   D % ,
-
- 
-?? < E )
-
- 
-?? < E  
L-L<
 
-  
+

E%E  
E+ %E 
+  ?? <
+ 

?? <
+ LL<
+   

-J LL<
- 
+  _ LL<
+ 

- ``< 
+ LL<
+  
+
+
+3``<0

E 0@

-
 
-``<
+
  ] ``<

E 0@

-
 d``<0
+
2!  4LL  
+
+)5LL 
+
+U6LL@ 
+
+l:=LL<P
+ 
+
+
+= g=LL<
+ 
+
+
+$> >``<
+ E0@
+
+
> `?``<
+
E 0@
+
+
5@ @``<
+`E0@
+
+
 FF  E$0H`lx
+rmeshFF  pr$0H`lx
+Ermesh/AA $0H`lxErmesh ``< 

E 0@

-
t ``<
+
  ``< 

E 0@

-
 ``<@
+
  ``<
+ E0@

+
+
 \``<
+0E0@
+
+
1 ``<
+  E0@
+
+
``<
+  E0@
+
+
FaF @3&$0H`lx
+srmeshF F  '$0H`lx
+&
+&
 rmeshAA T'$0H`lx&rmesh4// <
+ 

// <P
+  FF  `S .$0H`lx
+'U'rmeshFF .$0H`lx
+%.-rmeshT$EE  
+ % $EE  p
+  &?? <
+   &  &?? < 
+   ( ?? <
+  - (  (?? < 
+   )?? < 
+   *?? < 
+   o + +?? <
+ - 00
 ``<

E 0@

-
 %``<
+
0 * 1``< 

E 0@

-
 *LL  
-
-*LL 
-
-,LLP 
-
- FF  S .$0H`l
-&u'4meshFF ` .$0H`l
- .-4meshOAA 
-/$0H`l .4meshS``<p
+
1  2``<
+ E0@
+
+
2 h3``<
+E0@
+
+
4``<
+E0@
+
+
 5 8``<
+
E 0@
+
+
 ``<

E 0@

-
& } ``<0
+
  ``<

E 0@

-
R  aFF @s(6$0H`l
- ./4meshR22 ,, <  F

-2 &3,, <P F

-3 #LL  


-
-NLL` 
-
-zLL 
-
- FF p =$0H`l
- ./4mesh`22 < J4mesh7 w 22 <J4mesh7  FF (=$0H`l
-=
=4meshRR < J$0H`l4mesh397  22 <J4mesh7 c 22 <J4mesh7 {M22 <J4
- D?E4meshgRR <J$0H`l4mesh397h MPiP <J$0H`l397]i AA 0jE$0H`l?E4m
-
- << 0M$0H`l4mesh RR <@J$0H`l4mesh397 PP <@J$0H`l397 b RR <

M4meshFOF p
-/L

T$0H`l

M4mesh FF   T$0H`l


- TM4meshAA CU$0H`lT4mesh$22 <J4mesh7%22 <J4mesh7&22 <J4mesh7'22 <J4m
-
-NLL  
-
-zLL  
-
- AA ;\$0H`lT4mesh FF v\$0H`l
-<\DU4meshOAA c$0H`lv\4meshFF 3d$0H`l
-cDU4mesh 22 <J4mesh47  22 <J4mesh7  AA   d$0H`ld4meshRR <J$0H`l4mesh3

PP <J $ 0H`l397


- RR <J$0H`l4mesh397
- lPP < J$0H`l397
-| 7AA 0
-l$0H`lk4meshOAA s$0H`lk4meshFF  sYs$0H`l
-s
l4meshAA @*s$0H`lYs4mesh 
 AA  (z$0H`lYs4mesh  FF 0 z$0H`
-z
s4mesh7AA PJI{$0H`lYs4mesh
 OAA  Ha $0H`lz4mesh
H 22 <`J4mesh7
-X 22 <@J4mesh7
- 22 <@J4mesh7
,- EFF P $0H`l
-a 
I{4meshhRR <pJ$0H`l4mesh39x722 <`J4mesh7
q- 22 < J4mesh7
-AA  j  $0H`l 4meshRR <pJ$0H`l4mesh397@22 <J4meshP722 < J4meshj722 <

 

> AA  ?  $0H`l= 4mesh

rRR <J$0H`l4mesh397

7 

 PP <J$0H`l397

 
 OAA   $0H`l= 4mesh
- @ 4mesh
AA  $0H`l 4mesh
\ No newline at end of file
+
  ``<
+  E0@
+
+
  ``<
+E0@
+
+
p 3``<
+ E0@
+
+



FF

 $0H`l

`` <
+ E0@
+
+
FaF s(6$0H`lx
+.U'rmeshFF V6
0 $0H`lx
+#0(6
--p5
/<
/rrmesh
m@<eshu
 4//--<<
 rmeshu4b  -- <@rmeshu7 -- <@rmeshu7

E%E P
+ 

E%E 
+   AA  =$0H`lxV6rmesh >> <P$0H`lrmeshq9u  << < $0H`lq9u<< < $0H`lq9u 
+==rmeshWAA pJ`>$0H`lx=rmeshaFF @jE$0H`lx
+=`>rmeshFF pH E$0H`lx
+%kE
 DrmeshAA  j F$0H`lxkErmesh
EE   
+% 
EE  P
+  
?? < 
+ 
 /
?? <`
+   
 f
?? < 
+ T 
F
``<
+
E 0@
+
+
V
 
``<p
+
E 0@
+
+

``<p
+
E 0@
+
+

 
``<
+ E0@
+
+

 w
``<
+  E0@
+
+

``<
+  E0@
+
+

``<
+  E0@
+
+
@
``<
+  E0@
+
+


``<
+
E 0@
+
+

 
``<
+  E0@
+
+

 F
``<
+E0@
+
+

``< 
+
E 0@
+
+

``< 
+
E 0@
+
+
V
 
``<
+ E0@
+
+

 
``<
+E0@
+
+

 
``<
+E0@
+
+
 FF  M$0H`lx
+ EFrmeshFF h9M$0H`lx
+

MGLrmeshWAA  M$0H`lxkErmesh@-`- <rmeshu4P`  `-- <rmeshu7/a FaF T$0


+9MMrmeshc>> <$0H`lrmeshq9uc 

d-)-<
<<<r<m/eshu
/* <
4 d /% e/--< <rmeshu75e AA #U$0H`lxTrmesh>> <$0H`lrmeshq9u -- <rme
+< =-- <rmeshu4 >-- <rmeshu4P?-- <rmeshu4@-- < rmeshu4A-- <rmeshu4A-- <rmeshu4 AA

 `-- <Prmeshu4 g -- <0rmeshu7w #AA @\$0H`lxN\rmeshaAA `3c$0H`l


+dMdrmesh<< p
+k$0H`lxrmesh A A  k$0H`lx krmeshAaA s1s$0H`lxkrmesh>c> < $ 0H`lrmeshq
+kdsrmeshAA J{$0H`lxzrmeshX-- <rmeshu4_-- <rmeshuo7 A A (0{$0H`lxz
+  rmesh
 AA hV  $0H`lx rmesh
AA  _ $0H`lx rmesh  aFF `
+_ V rmesh
 AA   $0H`lx rmesh  AA   $0H`lx rmesh
\ No newline at end of file
diff -Naur ns-3.22/src/mesh/test/dot11s/hwmp-reactive-regression-test-2-1.pcap n
s-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-2-1.pcap
--- ns-3.22/src/mesh/test/dot11s/hwmp-reactive-regression-test-2-1.pcap 2015-0205 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-2-1.pcap 2015-0513 11:05:27.000000000 -0700
@@ -1,137 +1,222 @@
-
$
$0H`l
4imuesh
$<< $R
R J<
 $0H`l4mesh397\% & PPJ$<0H`l397&& RR J<$0H`l4mesh397'b'
-  4mesh   2 PP <  J$0H`l397H7FF PH7$0H`l
-4mesh|IRR <
 J$0H`l4mesh397zRJR <
 J $0H`l4mesh397 KRR <
 J$0H
-7O4meshg  Ih22 <
 J4mesh7RR < J$0H`l4mesh397RR <
 J$0H`l4mesh397
-74mesh7 
R 8PP 
<J$0H`l397\|RR <  J$0H`l4mesh397Q}RR <
J$0H`l4mesh3
-6b4mesh    22 < J4mesh7FF `$0H`l
-4mesh URR <
J$0H`l4mesh397V 
 W 
\ XPP < J $0H`l397FF
-7 4mesh2520J<4mesh75;262 p< J4mesh76  7220J<4mesh7 7F7F   y$0H`l
-4mesh8RR@J<$0H`l4mesh3979U922 <J4mesh79 u :22PJ<4mesh7 :+bFF p$0H`l
-z 4mesh
LL`


- 
+
$
$0H`lx
iru$m<esh
<  $

>> <$0H`lrmeshq9u%>> $<0H`lrmeshq9u&>> <$0H`lrmeshq9u|'>> <$0H`lrmeshq9u
+b rmeshO>h> $< 0H`lr

meshq9u_h-h- < rmeshu4>i -i- r< meshu7ij>> <
$0H`lrmeshq9um
 
+ 

+<< <
 $0H`lq9u},AA 
M n $0H`lxJrmesh ,>> < $0H`lrmeshq9uH-  -<<$<0H`lq

9u- .
 >>$<0H`
+bnrmeshFF p$0H`lx
+rmesh AA  
m  $0H`lxJrmesh+bFF    $0H`lx
+qrmeshHgFF  $0H`lx
+rmesh
-
-},AA 
p  $0H`l84mesh ,RR <J$0H`l4mesh397d- 
-.PP J< $0H`l397. 

/RR <J$0H`l4mesh397/j/ PP < J$0H`l397+0  FF


-z34mesh(FF J$0H`l
-E4meshFF 
Q&$0H`l
-%K4mesh+bFF  3 &$0H`l
-K4meshHgFF  &$0H`l
-&R&4meshLL  


- 
+LL



+ 

-LL
- 
+5
+LL
+ 

-.LL
- 
+aLL 
+ 

-`EE   D%  
-EE   D% ,
-EE  
 D% 
-
?? < E  
-
,
-?? < E )
-
- c?? < E 
- LL<
- 
E+ %E 
E+%E3
+%EE 
 
+ s- 
??0<
+ A?? <
+  x?? <
+4 LL<
+ 

- 1LL<
- 
+ FLL<
+  

-  LL<
- 
+ LL< 
+@ 

- 
+3 

E 0@


``<
``P<

 

 E $0H`l

-
 
-``< 
+
]``<0

E 0@

-
 ``<
+
2   ``<

E 0@

-
 
d``<
+
5LL  
+
+5LL@ 
+
+7LL 
`

 
+
+ 9  /:LLp<
+ 
+
+
+?: : LL<P
+ 
+
+
+ <LL<P
+ 
+
+
+<= =LL<
+ 
+
+
+#? ?``<
+
E 0@
+
+
 _@``<
@
+`E0@
+
+
4A FF E$0H`lx
+rmesh(FF  pr$0H`lx
+Ermesh F F  &$0H`lx
+  srmesh   ``<

E 0@

-
t``<0
+
 ``< 

E 0@

-
 c``<
+
  ``< 

E 0@

-
 
``<
+
  ``<
+0E0@
+
+
 [ ``<
+  E0@
+
+
n``<

+  E0@
+
+
#``<
+  E0@
+
+
 +FbF @3&$0H`lx
+srmeshHF F  '$0H`lx
+&
+&
  rmesh} 
//<
+ U// <
+  d// <P
+&FF 
 -
 $0H`lx
+  'rmesh-- <
rmeshu4 
d
+>> <
 $0H`lrmeshq9uH>> < $ 0H`lr
 
meshq9uK   
+'U'rmesh(FF .$0H`lx
+ .-rmesh!?? <
 
+ % #EE 
0 
+% 8#EE 
+ % %EE p
+   & 2+?? < 
+   B +  +?? <
+  - 9, ,?? <P
  
+  /``@<

E 0@

-
%``<@
+
/* 0 ``<

E 0@

-
 ``<
+
0  1``< 

E 0@

-
V+LL 
-
- +LLP 
-
-,FF 
-
 $0H`l
-z-&4meshFF  S .$0H`l
-&u'4mesh(FF ` .$0H`l
- .-4meshS 
 ``0<
+
2 M 5``<
+E0@
+
+
]5 5``<
+
E 0@
+
+
 7``<
+
E 0@
+
+
T8 9``<
 
+`E0@
+
+
  ``p<

E 0@

-
&}  ``<p
+
 ``<

E 0@


<< < $ 0H`lq9u

FF

`S

-
R  ``<0
+
  ``<

E 0@

-
FF 
@ 5$0H`l
-z- .4mesh+bFF @s(6$0H`l
- ./4meshHFgF .6
  $0H`l
-(6 54mesh@22 < PJ4mesh7 
-&2t2 ,, <  F

2 RR < ` J$0H`l4mesh39;7  

 22 p
<J4mesh

-3 {3,, <P F

- F F  
=$0H`l
 
-.6<4meshLL  ` 
-
-LL 
-
-%LL

 
-
-FF  p =$0H`l
- ./4mesh22 < J4mesh7  22 <J4mesh7 ( FF (=$0H`l
-=
=4meshKRR < J$0H`l4mesh397[ 22 <J4mesh7B  22 <J4mesh7 M22 <
-=^D4mesh   , P P <  $J0H`l397 RR <
 J$0H`l4mesh397
 RR 
<J$0H`l4mesh3
- D?E4meshkhRR <J$0H`l4mesh397{h  hPP <J$0H`l397 i  RR <J$0H`l4mesh397
22 <0J4mesh7
22 <0J4mesh7s   r
22 < J4mesh7s   RR <
J $0H`l4

mesh397
-   
 PP < J 
$ 0H`l397
-
-&FF 
M/L
 $0H`l
-=
K4mesh<< 0M$0H`l4meshRR <@J$0H`l4mesh397$RR <@J$0H`l4mesh3
-/L

M4meshRR <@J$0H`l4mesh397 r PP <@J$0H`l397    ZRR <PJ$0H`l4mesh3


-/L

M4mesh+FF  T$0H`l


- TM4mesh $22 < J4mesh7 %22 < J4mesh7 &22 < J4mesh7^'22 < J4mesh7K(22 < J4mesh78)22 < J4me
-
-LL  
-
-(AA ;\$0H`lT4meshFF v\$0H`l
-<\DU4meshHOAA c$0H`lv\4mesh+FF 3d$0H`l
-cDU4mesh22 <J4mesh7  RR <J$0H`l4mesh397 |  22 <J4mesh7
 22 <J4mesh
- RR <J$0H`l4mesh397
- HOAA  s$0H`lk4mesh+FF  sYs$0H`l
-s
l4mesh
(  AA (z$0H`lYs4meshFF 0 z$0H`l
-z
s4meshHAOA Ha  $0H`lz4mesh 22 <@J4mesh7
- 22 <@J4mesh7
- FF P  $0H`l
-a 
I{4mesh422 <`J4mesh7
+-  RR <pJ$0H`l4mesh39|722 < J4mesh7
(AA h  $0H`l 4mesh
AA  

RR <J$0H`l4mesh397

" 
H OAA   $0H`l= 4mesh
- @ 4mesh
\ No newline at end of file
+
 3 ``<
+E0@
+
+
C  ``<
+ E0@
+
+
FF o5$0H`lx
+.-rmeshs``<
+ E0@
+
+
H ``<
 
+  E0@
+
+
+FbF s(6$0H`lx
+.U'rmeshHFF V6
0 $0H`lx
+(6
Q%/p5
-/-r@<
mesh
< rmeshu
//4<9  


+ F F   $0H`l

E%E 
 
+ > J

E%E P
+ 

E%E 
=+ $0H`lx
>FF 
 
+V6<rmeshAA  =$0H`lxV6rmesh X<< < $0H`lq9uH<< < $0H`lq9u.>> <0$0H`lrme
+==rmesh FF 
- D
 $0H`lx
+= Drmesh+bFF @jE$0H`lx
+=`>rmeshHFF pH E$0H`lx
+%kE
 Drmesh EE  
 
+ > 
+
 %
EE   
+% B
EE  P
+  
 
?? <`
+   
 
?? < 
+ T 
 0
?? <  
+ + 
 
F
``<
+
E 0@
+
+
V

``<
+
E 0@
+
+

 
``<p
+
E 0@
+
+

``<
+
E 0@
+
+

 


``<
+
E 0@
+
+

 F
``<
+  E0@
+
+
V
 
``<
+E0@
+
+

 
``< 
+
E 0@
+
+

 
``<
+E0@
+
+

 
``<
+E0@
+
+

 
``<
 
+0E0@
+
+
>FF  
@M GL
 $0H`lx
+ E'LrmeshFF M$0H`lx
+ EFrmesh(FF h9M$0H`lx
+

MGLrmesh|` -`- <rmeshu7+FbF T$0H`lx


+9MMrmeshc `-d- <rmeshu4ae H F F  T$0H`lx
+PpT
<<<GL
 <r/mesh
/ <
X  / /--< <rmeshu7s // <
+*= L=-- <rmeshu4:>-- <rmeshu4>-- <rmeshu4?-- <rmeshu4@-- <rmeshu4A-- <rmeshu4O--
+dMdrmesh(AA  k$0H`lx krmesh#AbA s1s$0H`lxkrmeshc k d<< <$0H`lq9u!>f>
+kdsrmesh-- <rmeshu4-- <rmeshu7(AA (0{$0H`lxzrmesh'>> <$0H`lrmeshq79u --
+  rmesh
( AA hV  $0H`lx rmesh
+bFF ` $0H`lx
+_ V rmesh
H AA  $0H`lx rmesh
\ No newline at end of file
diff -Naur ns-3.22/src/mesh/test/dot11s/hwmp-reactive-regression-test-3-1.pcap n
s-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-3-1.pcap
--- ns-3.22/src/mesh/test/dot11s/hwmp-reactive-regression-test-3-1.pcap 2015-0205 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-3-1.pcap 2015-0513 11:05:27.000000000 -0700
@@ -1,153 +1,267 @@
-
$
<$<0H`l
 
4imesh
    %RR J<  $ 0H`l4mesh3970% ~%PPJ$<0H`l397?&s& RR J<$0H`l4mesh3978
-

J $0H`l4mesh397RR <
-

J $0H`l4mesh397 
-RR <
@J$0H`l4mesh397RR <
@J$0H`l4mesh397RR <
@J$0H`l4mesh3
-k22 <
-

J4mesh7k 
-<<  
0 $0H`l4meshRR < `J$0H`l4mesh397JRR <
`J$0H`l4mesh3
-  4meshPRR < 

@J$0H`l4mesh397` 
PP <J$0H`l397oF7F
-4meshHRR <
 J$0H`l4mesh397RIR <
 J $0H`l4mesh397KRR <
 J$0H
- g22 <  
PJ4mesh7 g 
g22 <
 J4mesh7 hRR <
-

`J$0H`l4mesh397 
-K22 <
-

pJ4mesh7<< 

$0H`l4mesh6RR < J$0H`l4mesh397OR
-74meshp7RR <  
J$0H`l4mesh397 7 
7PP 
<J$0H`l397 8{ RR <
-J 22 <
J4mesh7Z  
 2 2 
<J4mesh7A  
 RR <
-

J$0H`l4mesh397  
-"22 <
-

J4mesh7T<< 

 $0H`l4meshURR < J$0H`l4mesh397U
-7 4mesh 5220J<4mesh7 622 p< J4mesh76 "2720J<4mesh77LF8F   y$0H`l
-4meshn8RR@J<$0H`l4mesh39739292 < J4mesh79 :22PJ<4mesh7:AA 

 7$0
-PP <
-

J $0H`l397RR <
-

J$0H`l4mesh397 
-LL 
0
+
$
D><>$<0H`lx
 <

$0H`lr
irmesh
  meshq
?AA9uD

>> < 
$0H`lr
 
meshq
k ?9u$E
0H`lx
>> <$rmesh
$0H`lr
 ?>>meshq
$< 0H`lr
  9u meshq
AA 9
uA>>(<$0H`lx
$ 0H`lr
 $rmme
+<< <
+

P$0H`lq9uA7 7<< <P $ 0H`lq9u- < < 
P- $0H`lxrmeshFF 

+ rmesh&>> <
` $0H`lrmeshq9uY
 << <
$0H`lq9ui   <-- <rmeshu4< Y J--
+b rmesh>g> $< 0H`lr

meshq9u hi-- <rmeshu4i q-i- r< meshu7jAA 

I$0H`lxr
+>> < 
$0H`lrmeshq9u
+ 
l
,+A<A< <
 $0H`lq

M n $90H`lx
u  Jrmesh

->> <$0H`lrmeshq9u- j -<<$<0H`lq



9u.1. >>$<0H`lr

meshq9u. /<< < $0H`lq9u / }-- <
+

rmeshu4l 
+ >> <
+

$0H`lrmeshq9uw 
+-- <
+

r meshu7-AA 
m  $0H`lxJrmeshAA  
 $ 0H`lxrmesh
+.>> <
+

0$0H`lrmeshq9u1 
+M&AA 
 h $0H`lxrmeshFF  
@ $0H`lx
+hrmesh_
LL
P
 

-'
LL`


+
L L


 


,-AA 
p  $0H`l84mesh(-RR <J$0H`l4mesh3978-  -PP J< $0H`l397G. .RR J< $0H`l4
-E4meshUFF   
@%$0H`l
- 4mesh-FF 
Q&$0H`l
-%K4meshFgF &$0H`l
-&R&4mesh$FF 

P+z-$0H`l
-R&!'4mesh,LL `
- 
+
+LL
+ 

-WLL


- 
-
- L L
- 
+%WE3E  
+ %EE   
+%EE  

+ 
+ 7?? <  
p
+ G- 
 ??0<
+w-??0< 
+  ?? <
+ LL<
+  
+
-
-$EE   D% ,
-sEE  
 D% 
-EE  

-v 
-
? ? <  
-
 
b
-
- 
-?? < E )
- LL<
- 

`

p D%  
 E  
??< E  

+ .LL<
+@ 


 

- LL< 
- 
+ LL<
+

+   

- LL<
+LL<


-   
+   

- 
-`` < 
+ 
+`` <  

E 0@

-
 
``<
+
 
^ ``P<

E 0@

-
``< 
+
3``<0

E 0@

-
 
-e``< 
+
U6LL@ 
+
+ 6LL
`

 
+
+7LL
 
+
+ 8 
+H9LL< 
+ 
+
+
+X9  9LLp<
+ 
+
+
+l:;LL<P
+ 
+
+
+=LL <P
+ 
+
+
+5@ @``<
+`E0@
+

+
 _A``<
A

+  E0@
+
+
B``< 
+  E0@
+
+
 CDD ``<
+

+E0@
+
+
K 
+FF pr$0H`lx
+Ermesh- F F  &$0H`lx
+  srmesh 
+``< 

E 0@

-
u 
``<
+
 
 ``<

E 0@

-
 
-`` < 
+
  ``< 
+
E 0@
+
+
1  ``<
+  E0@
+
+
 #``<
 
+E0@
+
+
.-- <
+

r meshu4 
+>> <
+

$ 0H`lrmeshq9u  
-+ - <
+

rmeshu7FF '$0H`lx
+&
+&
 rmeshA// < 
0
+ Q 
 //<
+4// <
+M&FF 
 -
 $0H`lx
+  'rmesh-- <
rmeshu45-- <

@rmeshu7 

AA




P+-

>> < $0H`lrmeshq9u<< <


+

`$0H`lq9u >> <
+

p$0H`lrmeshq9u>> <
+

p$0H`lrmeshq9u 
+>> <
$0H`lrmeshq9u << <
+ .-rmesh << <
8+!% EE  




+  Z!?? <
 
+" "
 ?? <
+ 


+ %f#EE  
0 
+% 8T$EE 
+ ( ``< 

E 0@

-
 
&``<
+
-( 
 (`` @<
+
E 0@
+
+
)``@<

E 0@

-
``<@
+
o+  +?? < 
+ - [,?? <
,
P
+  - -
 ?? <
+ 


+  + /``@<
+
E 0@
+
+
00
 ``<

E 0@

-
W,FF -$0H`l
-z-&4meshFF ` .$0H`l
- .-4meshT 
-``< 
+
 5  6 
+8``<
+
E 0@
+
+
(8  8``<
 
+`E0@
+
+
T9:``<
+

+E0@
+
+
<``<
+

+E0@
+
+
 
+``< 

E 0@

-
' 
~ `` 0<
+
 
 ``p<

E 0@



$0H`lq

9u

 

>> <  

$0H`

-
S ``<p
+
  ``<

E 0@

-
-FF 
@ 5$0H`l
-z- .4meshgFF .6
  $0H`l
-(6 54mesh22 <
P J4mesh7} 66 <
-

 F 22 < 

J 4mesh7 
- 5c64meshRR <
` J$0H`l4mesh39o7  22 <
-166 <F

-R22 ,, <  F

 FF 


J4mesh7 

k<$0H`l
] 22 p
<J4mesh

F F 
-
=$0H`l
-.6<4meshzLL 
-
-LL

 
-
- w22 <J4mesh7FF (=$0H`l
-=
=4mesh   } 66 < F  8 !EE  

0 D%
- h ]S 
-S22 <
-

@J4mesh7 T22 <
-

@J4mesh7RUAA 

P ]D$0H`l>4meshtURR <
J$0H`l4mesh3
-=^D4meshJ RR <

`J$0H`l4mesh39Z7  
 P P 
<J$0H`l397 i  R
- (22 <
pJ4mesh7 ( 
(22 <
 J4mesh7  )R7R <J$0H`l4mesh3979RR <J$0H`l4mes
-

J$0H`l4mesh397  f 
R-Rh
<MiJP$P0H`l4
<J$0H`l3
mesh397RR < J$0H`l4mesh3
d
97 RR < J$0H`l4mesh397RR < J$0H`l
22 <0J4mesh7<< 

K$0H`l4mesh6RR <J$0H`l4mesh397
- PP < 

J
$0H`l397
-
-  RR <  
J$0H`l4mesh397
-  PP < J
$ 0H`l397
-
-M& FF  M/L$0H`l
-=
K4mesh`22 0< J4mesh7D220J<4mesh7C220J<4mesh7220J<4mesh7220J<4mesh7220J<4mesh7
-
-22 <
PJ4mesh7
-
- 22 <
PJ4mesh7
-
- 22 <
PJ4mesh7
-
-v22 <
PJ4mesh7
-
-Q22 <
PJ4mesh7
-
-Y22 <
PJ4mesh7
-
-yM>
$A0H`l
A 4
mesh
`-  <[ <$0H`l

 -K
$4m0H`l
esh4-im<esh
<M * <
< p
b
M$<0H`l
 $40H`l
mesh
4mMesh
><< -
 q<<j
 
$0H`l
m4mesh
$0H`l
- 4<m<esh


\ No newline at end of file
+
p  FF o5$0H`lx
+.-rmesh

`` <
+ E0@
+
+
 s ``<
 
+  E0@
+
+
H``<
+

+ E0@
+
+
FF V6
0 $0H`lx
+( 6
//p5
 <rmesh0// @< 
+ // < 
0
+ // < 
0
+ 8

0

E%E 
+  


@

E%E 
 
+ > $FF  
Pk<$0H`lx
=+W6
$0H`lx
p5rmeshM>FF 
 
+V6<rmeshFF `(=$0H`lx
+==rmesh}FF  
` D$0H`lx
+==rmesh- F F 
-D$0H`lx
+= DrmeshFF pH E$0H`lx
+%kE
 Drmesh EE  

p
+ % G
EE  
 
+ % >
EE   
+  
 f
?? < 
+ T v
 
?? <  
+ + m

?? <
+ 


+  7
 
+G
``<
 
+
E 0@
+
+
W
 

``<
+
E 0@
+
+

F
``<
+
E 0@
+
+

 
+
``<
 
+
E 0@
+
+

 

``<
+
E 0@
+
+
V
``<
+
E 0@
+
+

``<
+
E 0@
+
+
``<
+
E 0@
+
+

 
 F
``<
+E0@
+
+
V
 
``<
 
+ E0@
+
+

E
``<
+

+E0@
+
+

``<
+

+E0@
+
+

 
``<
+E0@
+
+

 
``<
 
+0E0@
+

+

$FF 

&L$0H`lx
+ EDrmeshM>FF 
@M GL
 $0H`lx
+ E'Lrmesh- F F 
PmS$0H`lx
y
+<!CAQs-<E$-<0H`lx
'L
<<
 rmeshu
p
esh
rmesh
 --<<4`r<-meshu
-
<r4-mAeshu
--$`0H`lx
r<meshu
4 r-m-48esh
-M<
-*r<m`eshu
<r<meshu

 4
4/M--<-`$r<<
m0H`lx
eshu
rmeshu
r4m-esh
-`4r<xm-eshu
- <
4-qr-<meshu
<`r<meshu

 4 Km4---$0H`lx
<`r<mesh
r
\ No newline at end of file
diff -Naur ns-3.22/src/mesh/test/dot11s/hwmp-reactive-regression-test-4-1.pcap n
s-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-4-1.pcap
--- ns-3.22/src/mesh/test/dot11s/hwmp-reactive-regression-test-4-1.pcap 2015-0205 15:46:22.000000000 -0800
+++ ns-3.23/src/mesh/test/dot11s/hwmp-reactive-regression-test-4-1.pcap 2015-0513 11:05:27.000000000 -0700
@@ -1,260 +1,439 @@
-i\% & PPJ$<0H`l397&RR J<$0H`l4mesh397/) k?<< 

k ?$0
$+
$0H`lx
iru$m<esh
<  $

>> <

$0H`lrmeshq9u %>> <

$0H`lrmeshq9u&>> <

$0H`lrmeshq9u]>> <  
$0H`lrmeshq9u6>> <  
$0H`lrmeshq9uhAA 

- $0H`l?4meshRR <
-

J $0H`l4mesh397=RR <
-

J $0H`l4mesh397  PP < 
-
- J$0H`l397 
-22 <
PJ4mesh7j 22 <
-

J4mesh7Ak 
 k22 < 
-
-@J4mesh7k 
- <<  
0 $0H`l4meshFF 
p-$0H`l
-  4meshRR < 

@J$0H`l4mesh397  
2PP <J$0H`l397B2P2
-
-pJ4mesh7Q 
-2g22 <  
PJ4mesh7g 
Ih22 <
 J4mesh7YhAA 
-
-  $0H`l4mesh;RR <
-

`J$0H`l4mesh397  ~22 < 
-
- J 4mesh7  
-22 <
-

pJ4mesh7  
<< 

 $0H`l4mesh6FF 
M 6 $0H`l
-74mesh6RR < 
J$0H`l4mesh3977 
R8PP 
<J$0H`l397b8O 22 <
-
-J4mesh7_  
- 2 2 <  
J4mesh7 2 2 <  
J4mesh7  
 2 2 <
 J4mesh7  AA 
-
-1$0H`l4meshRR <
-

J$0H`l4mesh397 
^22 < 
-
-J4mesh7n 
-22 <
-

J4mesh7^ 
 T<< 

 $0H`l4mesh URR < J $0H`l4

mesh3
-7 4mesh2520J<4mesh76  7220J<4mesh78RR@J<$0H`l4mesh3979 u :22PJ<4mesh7AA 
-
-J$0H`l4mesh397 
-$PP <
-

J $0H`l397 
RR <
-

J$0H`l4mesh397 
 PP < 
-
-J$0H`l397  
-PLL
- 
+ $0H`lx?rmesh >> <
$0H`lrmeshq9uu>> <  
$0H`lrmeshq9u{>> <  
+

0$0H`lrmeshq9u 
 << < 

+
+  $0H`lq9u  
+-- <

@rmeshu4-- <  
@rmeshu4-- <  
@rmeshu4 -- <  
@rmeshu41-- <  
@rmeshu4 
8 -- 0
<rmeshu7H
  [--@r<meshu7H>> <

+
+0 $0H`lrmeshq9uX 
+<< <
+

P$0H`lq9uK   << 
P- $0H`lxrmesh >> <
`$0H`lrmeshq9u > > <
+ rmesh >> <
` $0H`lrmeshq9u
 << <
$0H`lq9u    5>> < 
$0H`
+ 

+<< <
 $0H`lq9u
+},
 AA 
Mn$0H`lxJrmeshH- -<<$<0H`lq9u .>>$<0H`lrmeshq9u/ ( -- <
+

rmeshu4 
/ -- < 
+
+Prmeshu7? 
+AA 
+
+`
$0H`lxJrmesh>> <
+

$0H`lrmeshq9u 
: -- < 
+
+prmeshu4J 
+-- <
+

r meshu72 
 AA 
m$0H`lxJrmesh AA   
  $ 0H`lxr
+
+ $ 0H`lrmeshq9u  
+<< <
+

$0H`lq9u   >> <
+

0$0H`lrmeshq9uj 
 << < 
+
+ $ 0H`lq9u 
+AA 
+
+$0H`lxrmesh&AA 
 h$0H`lxrmeshkFF   
@ $0H`lx
+hrmeshLL
+
  

-{LL
+LL
 

0
P


-
LL`


- 
+
-
-},AA 
p  $0H`l84meshd- 
-.PP J< $0H`l397

/RR <J$0H`l4mesh397+0  AA 


-
-0
$0H`l84mesh TFF 

@%$0H`l
- 4meshFF 
Q&$0H`l
-%K4meshA A  
-
-@)!'$0H`l%4meshFF  
P+z- $ 0H`l
-R&!'4mesh LL
-P
-  
+LL



+ 

-LL
- 
+%EE 
 
+%iEE  
+l?? < 
+
+  
+| 
+ ?? <  
+s- 
??0< 
+ LL< 
+@ 
+

`
`


p

-
-EE  
 D% 
-6EE  

-9?? < 
-
-` E  
-I 
-?? < 
 E  
-@
 

-  LL<
 
- 
+LL<
+

+   

-LL<
+SLL<

-   
+   

- 
-p
+ 
+
 E0@

-
-`` <
+

 ``<


``<


  

 

p D%  

??< E  

+^``<  

E 0@

-
 
e``<

- 
+
3 
``P<
+
E 0@
+
+
7LL
`

 
+
++7LL
 
+
+W8LL< 
+
+  
+
+
+g8 
+8LL< 
+ 
+
+
+ 9  4A D C``<

+  E0@
+
+
TCC ``<
+

+E0@
+
+
 D   KLL< 
+
+  
+
+
+K 
+LLL
+ 
+
+ FF 
  &$0H`lx
+  srmesh``< 
+
 E0@

-
u 
-`` < 
+
 
+``< 

E 0@

-
 
``<

- 
+
 
 ``<
+
E 0@
+
+
 FF 

+
+&rmesh  ``<
 
+E0@
+
+
" ``<

-&$0H`lx

+

+E0@
+
+
  -- <
+

r meshu4j 
 - - <
+
+ rmeshu7 
+AA 
+
+0)'$0H`lx  rmesh;>> <
+

$ 0H`lrmeshq9u 
+
+@rmeshu4j 
+-- <
+

rmeshu7I 
// <
+ } 
//<
+&FF 
 -
 $0H`lx
+  'rmeshtEE 
+
+P% 
+  -- <
rmeshu4V-- < 
+
+`$0H`lrmeshq9u 
+z<< <
+

`$0H`lq9u  
\ >> <
+

p$0H`lrmeshq9uO>> <
+

p$0H`lrmeshq9u 
+
+p$0H`lq9u  
+H>> <
$0H`lr
 
meshq9uX << < 
+
+ I .$0H`lx-rmesh < < <
M+   
t EE  
 
+
+ % 
+%  EE   

+  !?? <
 
+!$"
 ?? <
+ 


+f"  '``<

+
 E0@

-
 
-&``< 
+
-' 
+ '``< 

E 0@

-
 
``<
+
Y( 
) `` @< 

E 0@

-
,FF -$0H`l
-z-&4meshAA 
-
-I.$0H`lz-4mesh TFF  
--.4mesh``<

+
9,  ,?? <
P 
+  ,%-
 ?? <


Z -- <


0

@rmeshu7 

 < < <




$ 0H`lq

9u

kAA

K5$0H`l



K 

P+-$0H`lx

 >> <  

$0H`

+ 


+   -  /``@<
+
E 0@
+
+
D6``< 
+
+ E0@
+
+
T6 
+T8 9``<

+`E0@
+
+
'9~9 ``<
+

+E0@
+
+
v;``<
+

+E0@
+
+
K<