Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
a954739
AQM Evaluation Suite module
adeepkit01 Apr 15, 2017
63498c5
Added prerequisite packages
aqm-eval-suite Apr 19, 2017
715fb82
Corrected the folder structure in drop-process
aqm-eval-suite Apr 19, 2017
8e34e49
Update Readme
mohittahiliani Apr 29, 2017
7a303e2
Update Readme
mohittahiliani Apr 29, 2017
972011e
updated python script
adeepkit01 May 5, 2017
f5b43f9
Rtt Fixes
adeepkit01 May 30, 2017
8bf4d16
Bug fixes and feature extensions
Viyom Sep 12, 2017
02371b9
Add BQL support and RemoveAqm method
indu98 Nov 29, 2017
f19f5b0
Modified n_flow value
AparnaR16 Mar 18, 2018
6f71f64
Deleted Bidirectional Traffic Scenario
AparnaR16 Mar 18, 2018
062cdd5
Modify bottleneck delay in Rtt-fairness scenario
AparnaR16 Jun 5, 2018
4debc89
Remove deprecated QueueDisc attribute dependency
ShefaliGups11 Jun 5, 2018
1ada9e6
Update Readme test
ajupazhamayil Sep 12, 2018
75c8699
Create README.md
ajupazhamayil Sep 12, 2018
ef54e6f
Update README
ajupazhamayil Sep 12, 2018
f4c521f
Starting new example for ECN enabling
ajupazhamayil Oct 19, 2018
3f1f796
changed name of the file to interaction-with-ECN.cc
ajupazhamayil Oct 19, 2018
1af6090
ecn option given in interaction-with-ECN.cc and helper
ajupazhamayil Oct 20, 2018
6af2c05
testing rtt fairness
ajupazhamayil Oct 21, 2018
07bb6d8
new scenario added called interaction with ECN and rectifying the errors
ajupazhamayil Oct 23, 2018
d21b0ec
changed wscript to make understand waf that new scenario named intera…
ajupazhamayil Oct 23, 2018
5b99efc
changed loop to 15 for rttfairness
ajupazhamayil Oct 23, 2018
29d71bb
Made changes to enable ECN in aqm-eval-suite. There are still some er…
ananthu-dev Oct 25, 2018
5b550e7
Forgot to add wscript in previous commit
ananthu-dev Oct 25, 2018
8487054
Rttfairness and EcnInteraction still not working
ananthu-dev Oct 27, 2018
6b2b35e
testing with UseHardDrop false to make RED to stop dropping even afte…
ajupazhamayil Oct 31, 2018
c7d3425
Merge branch 'master' of https://github.com/ajupazhamayil/aqm-eval-su…
ajupazhamayil Oct 31, 2018
9248079
added TcpSocketBase::EcnMode as classic ECN and fixed the bug
ajupazhamayil Oct 31, 2018
87321cc
Update README.md
ajupazhamayil Oct 31, 2018
8dd323b
code cleanup1
ajupazhamayil Nov 3, 2018
24e9489
testAj branch is working with expected results,, so merge branch 'tes…
ajupazhamayil Nov 3, 2018
13619a4
reverting the red-tests.cc file to its old form
ajupazhamayil Nov 3, 2018
fd3ee66
added output file in gitignore file
ananthu-dev Nov 3, 2018
1efa4e5
Merge branch 'master' of https://github.com/ajupazhamayil/aqm-eval-su…
ananthu-dev Nov 3, 2018
fb5daf2
updated gitignore file
ananthu-dev Nov 3, 2018
81f43fa
Cleaned up branch
ananthu-dev Nov 3, 2018
4940e54
Changed function call parameters of ConfigureQueueDisc in all scenari…
ananthu-dev Nov 3, 2018
9db7fef
Cleaned up code by running check-style.py on modified files
ananthu-dev Nov 5, 2018
685510f
resolved the folder creation problem
ajupazhamayil Nov 6, 2018
4659f9c
Merge branch 'master' of https://github.com/ajupazhamayil/aqm-eval-su…
ajupazhamayil Nov 6, 2018
9d044a0
code cleanup done
ajupazhamayil Nov 6, 2018
b25d2a7
error with scratch folder has been solved
ajupazhamayil Nov 6, 2018
ecef55d
Code cleanup review has done
ajupazhamayil Nov 9, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,8 @@ TAGS

build-dir/
build/
aqm-eval-output/
aqm-eval-output1/
/.cproject
/.project
aqm-eval-output-1/
1 change: 0 additions & 1 deletion README
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

The Network Simulator, Version 3
--------------------------------

Expand Down
16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Extend implementation of AQM Evaluation Suite in ns-3

## Course Code: CS738

## Assignment: #GP3

### Overview
AQM Evaluation Suite for ns-3 has been designed and developed at NITK based on the recommendations provided in RFC 7928. This implementation needs to be extended to add
more features that are crucial for evaluating AQM algorithms.

Our Assignment is to enable ECN for RED, ARED, Feng Adaptive RED and NLRED.

### References
● RFC 7928 (Link: https://tools.ietf.org/html/rfc7928)

● AQM Evaluation Suite for ns-3 (Link: https://aqm-eval-suite.github.io/)
5 changes: 4 additions & 1 deletion scratch/scratch-simulator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
*/

#include "ns3/core-module.h"

using namespace ns3;

NS_LOG_COMPONENT_DEFINE ("ScratchSimulator");
Expand All @@ -25,6 +24,10 @@ main (int argc, char *argv[])
{
NS_LOG_UNCOND ("Scratch Simulator");


for(int i=0; i<5; i++)
NS_LOG_UNCOND ("Scratch Simulator");

Simulator::Run ();
Simulator::Destroy ();
}
178 changes: 178 additions & 0 deletions src/aqm-eval-suite/doc/aqm-eval-suite.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
AQM Evaluation Suite
--------------------

.. include:: replace.txt
.. highlight:: cpp

.. heading hierarchy:
------------- Chapter
************* Section (#.#)
============= Subsection (#.#.#)
############# Paragraph (no number)


The AQM Evaluation Suite is an automated framework for comparing the performance of
ns-3 queue disciplines based on the scenarios mentioned in RFC 7928. It includes
simulation setup, topology creation, traffic generation, program execution, results
collection and their graphical representation.


Introducing the AQM Evaluation Suite
************************************

AQM Evaluation Suite automates the cycle of simulation setup to results collection
in ns-3. It closely follows the recommendations provided in RFC 7928 to setup the
simulation scenarios and collects results in the suggested formats. A user can
choose to either run an individual scenario from the set of scenarios provided in
the suite, or run all scenarios at once. Results for each scenario are systematically
stored in text and graphical formats.

The following provides more details about the architecture of the suite, users
interaction with the suite, its scope and limitations, and steps to extend the
suite for evaluating new AQM algorithms.

Architecture of AQM Evaluation Suite
************************************

The suite is implemented in ``src/aqm-eval-suite`` directory.

Model
=====

``src/aqm-eval-suite/model`` contains an implementation of the following three
primary classes:

* class :cpp:class:`EvaluationTopology`: This class has three major functionalities:

* Creating the topology: It sets up a point-to-point dumbbell topology by using
:cpp:class:`PointToPointDumbbellHelper`: with required number of nodes, and
configures the data rate and for all the links. It also installs the desired queue
discipline on the router node.

* Installing application on nodes: it provides an API for configuration of
applications. This API takes the application parameters such as data rate,
packet size, transport protocol, initial congestion window in case of TCP,
maximum bandwidth and one way delay of the channels.

* Getting the metrics of interest from the experiment: It uses the traces
sources provided by different classes of ns-3 for the calculation of metrics.
The metrics recommended in the RFC are queue-delay, goodput, throughput and
number of drops.

* class :cpp:class:`EvalApp`: This class is based on :cpp:class:`OnOffApplication`:
and is used for generating TCP and UDP traffic in the suite. The native class
:cpp:class:`OnOffApplication`: in ns-3 creates sockets at the start time of an
application. Thus, to configure different values for parameters like initial
congestion window in TCP is non-trivial, since they cannot be configured before
the socket is created and after the application starts. To overcome this,
:cpp:class:`EvalApp`: is implemented on the same principles as that of the
:cpp:class:`OnOffApplication`: in which a socket is created and the application
is started only after its parameters are configured.

* class :cpp:class:`EvalTimestampTag`: This is a subclass of :cpp:class:`Tag`: and
has been developed to fetch the queue delay information from :cpp:class:`QueueDisc`:.
When a packet is enqueued by the QueueDisc, this tag is added with a timestamp
(as the enqueue time) and when the packet is dequeued, the queue delay is computed
as the difference between the dequeue time and the enqueue time.

Helper
======

``src/aqm-eval-suite/helper`` contains an implementation of the following class:

* class :cpp:class:`ScenarioImpl`: This class implements the following two methods:

* ``ScenarioImpl::CreateScenario ()``: This is a virtual function implemented by
each scenario according to the topology and traffic profiles mentioned in the RFC.

* ``ScenarioImpl::RunSimulation ()``: This method takes the scenario created by
each subclass and runs them with all the queue disciplines available in ns-3.

Utils
=====

``src/aqm-eval-suite/utils`` directory provides four Python scripts that take
performance metrics computed in the suite as input, and generate a graph with
Queuing Delay as the X-axis against Goodput as the Y-axis. The graph depicts an
ellipse which is plotted as per the guidelines mentioned in the RFC and [Remy].
The co-variance between the queuing delay and goodput is determined by the
orientation of the ellipse, and helps to analyze the effect of traffic load on
Goodput and Queuing Delay.

Examples
========

``src/aqm-eval-suite/examples`` directory provides a set of programs, each
corresponding to a specific scenario listed in RFC 7928. Each program can be
run individually. Alternatively, `aqm-eval-suite-runner.cc` allows the user
to run all scenarios at once.

User interaction with the suite
*******************************

Users can learn about the list of scenarios available in the suite from
``src/aqm-eval/examples`` directory. The programs can be run in a usual way.
For example, ``aggressive-transport-sender.cc`` is equivalent to the scenario
described in Section 5.2 of the RFC. Assuming examples have been enabled
during configure, the following commands would run ``aggressive-transport-sender.cc``

::

$ ./waf --run "aqm-eval-suite-runner --number=5.2"

or

::

$ ./waf --run "aqm-eval-suite-runner --name=AggressiveTransportSender"

To run all scenarios at once, the following command could be used:

::

$ ./waf --run "aqm-eval-suite-runner --name=All"

Simulating additional AQM algorithms using this suite
*****************************************************

* By default, the suite evaluates AQM algorithms implemented in |ns3|. To
simulate additional AQM algorithms, such as the ones designed by the user,
the ``addAQM`` method of ``ScenarioImpl`` can be used in the scenarios
available in ``src/aqm-eval-suite/examples``. For example, to add a new AQM
of typeId ``ns3::ExampleQueueDisc`` in ``aggressive-transport-sender.cc``,
``CreateScenario`` method can be modified as shown in the code below:

.. code-block:: c++

EvaluationTopology
AggressiveTransportSender::CreateScenario (std::string aqm)
{
.
.
addAQM ("ns3::ExampleQueueDisc");
EvaluationTopology et ("AggressiveTransportSender", nflow, pointToPoint, aqm, 1460);
.
.
}

Scope and limitations of the suite
**********************************

* All scenarios described in Section 5, 6 and 8 of RFC 7928 are supported.

* Scenarios listed in Section 7 and 9 are not yet supported.

* Multi-AQM scenarios are not yet supported.

Packages Required for Processing Metrics and Graphing
*****************************************************

Following are the packages required for the suite and their installation instruction in Ubuntu

* python-pip: apt-get install python-pip

* python numpy: pip install numpy

* gnuplot: apt-get install gnuplot-qt

* imagemagick (optional package for ns-3): apt-get install imagemagick
97 changes: 97 additions & 0 deletions src/aqm-eval-suite/examples/LBE-transport-sender.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2017 NITK Surathkal
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Authors: Ankit Deepak <adadeepak8@gmail.com>
* Shravya K. S. <shravya.ks0@gmail.com>
* Mohit P. Tahiliani <tahiliani@nitk.edu.in>
*/

/*
* This example is equivalent to the scenario described in Section 5.1.2
* of RFC 7928 (https://tools.ietf.org/html/rfc7928#section-5.1).
*/

#include "ns3/log.h"
#include "ns3/simulator.h"
#include "ns3/aqm-eval-suite-module.h"

using namespace ns3;

NS_LOG_COMPONENT_DEFINE ("LbeTransportSender");

class LbeTransportSender : public ScenarioImpl
{
public:
LbeTransportSender ();
~LbeTransportSender ();

protected:
virtual EvaluationTopology CreateScenario (std::string aqm, bool isBql);
};

LbeTransportSender::LbeTransportSender ()
{
}

LbeTransportSender::~LbeTransportSender ()
{
}

EvaluationTopology
LbeTransportSender::CreateScenario (std::string aqm, bool isBql)
{
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("1Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("48ms"));
uint32_t nflow = 2;

EvaluationTopology et ("LbeTransportSender", nflow, pointToPoint, aqm, 698, isBql);
ApplicationContainer ac1 = et.CreateFlow (StringValue ("1ms"),
StringValue ("1ms"),
StringValue ("10Mbps"),
StringValue ("10Mbps"),
"ns3::TcpLedbat", 0, DataRate ("10Mb/s"), 3);

ApplicationContainer ac2 = et.CreateFlow (StringValue ("1ms"),
StringValue ("1ms"),
StringValue ("10Mbps"),
StringValue ("10Mbps"),
"ns3::TcpNewReno", 0, DataRate ("10Mb/s"), 3);

ac1.Start (Seconds (0));
ac1.Stop (Seconds (300));

ac2.Start (Seconds (0));
ac2.Stop (Seconds (300));
return et;
}

int
main (int argc, char *argv[])
{
std::string QueueDiscMode = "";
std::string isBql = "";
bool ecn = false;
CommandLine cmd;
cmd.AddValue ("QueueDiscMode", "Determines the unit for QueueLimit", QueueDiscMode);
cmd.AddValue ("isBql", "Enables/Disables Byte Queue Limits", isBql);
cmd.Parse (argc, argv);

LbeTransportSender sce;
sce.ConfigureQueueDisc (45, 750, "1Mbps", "48ms", QueueDiscMode,ecn);
sce.RunSimulation (Seconds (310), isBql == "true");
}
Loading