A Discrete-Event Network Simulator
API
red-vs-fengadaptive.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2016 NITK Surathkal
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Sourabh Jain <sourabhjain560@outlook.com>
19 * Mohit P. Tahiliani <tahiliani@nitk.edu.in>
20 */
21
22#include "ns3/core-module.h"
23#include "ns3/network-module.h"
24#include "ns3/internet-module.h"
25#include "ns3/point-to-point-module.h"
26#include "ns3/applications-module.h"
27#include "ns3/point-to-point-layout-module.h"
28#include "ns3/traffic-control-module.h"
29
30#include <iostream>
31#include <iomanip>
32#include <map>
33
34using namespace ns3;
35
36int main (int argc, char *argv[])
37{
38 uint32_t nLeaf = 10;
39 uint32_t maxPackets = 100;
40 bool modeBytes = false;
41 uint32_t queueDiscLimitPackets = 1000;
42 double minTh = 5;
43 double maxTh = 15;
44 uint32_t pktSize = 512;
45 std::string appDataRate = "10Mbps";
46 std::string queueDiscType = "RED";
47 uint16_t port = 5001;
48 std::string bottleNeckLinkBw = "1Mbps";
49 std::string bottleNeckLinkDelay = "50ms";
50
51 CommandLine cmd (__FILE__);
52 cmd.AddValue ("nLeaf", "Number of left and right side leaf nodes", nLeaf);
53 cmd.AddValue ("maxPackets","Max Packets allowed in the device queue", maxPackets);
54 cmd.AddValue ("queueDiscLimitPackets","Max Packets allowed in the queue disc", queueDiscLimitPackets);
55 cmd.AddValue ("queueDiscType", "Set Queue disc type to RED or FengAdaptive", queueDiscType);
56 cmd.AddValue ("appPktSize", "Set OnOff App Packet Size", pktSize);
57 cmd.AddValue ("appDataRate", "Set OnOff App DataRate", appDataRate);
58 cmd.AddValue ("modeBytes", "Set Queue disc mode to Packets (false) or bytes (true)", modeBytes);
59
60 cmd.AddValue ("redMinTh", "RED queue minimum threshold", minTh);
61 cmd.AddValue ("redMaxTh", "RED queue maximum threshold", maxTh);
62 cmd.Parse (argc,argv);
63
64 if ((queueDiscType != "RED") && (queueDiscType != "FengAdaptive"))
65 {
66 std::cout << "Invalid queue disc type: Use --queueDiscType=RED or --queueDiscType=FengAdaptive" << std::endl;
67 exit (1);
68 }
69
70 Config::SetDefault ("ns3::OnOffApplication::PacketSize", UintegerValue (pktSize));
71 Config::SetDefault ("ns3::OnOffApplication::DataRate", StringValue (appDataRate));
72
73 Config::SetDefault ("ns3::DropTailQueue<Packet>::MaxSize",
75
76 if (!modeBytes)
77 {
78 Config::SetDefault ("ns3::RedQueueDisc::MaxSize",
79 QueueSizeValue (QueueSize (QueueSizeUnit::PACKETS, queueDiscLimitPackets)));
80 }
81 else
82 {
83 Config::SetDefault ("ns3::RedQueueDisc::MaxSize",
84 QueueSizeValue (QueueSize (QueueSizeUnit::BYTES, queueDiscLimitPackets * pktSize)));
85 minTh *= pktSize;
86 maxTh *= pktSize;
87 }
88
89 Config::SetDefault ("ns3::RedQueueDisc::MinTh", DoubleValue (minTh));
90 Config::SetDefault ("ns3::RedQueueDisc::MaxTh", DoubleValue (maxTh));
91 Config::SetDefault ("ns3::RedQueueDisc::LinkBandwidth", StringValue (bottleNeckLinkBw));
92 Config::SetDefault ("ns3::RedQueueDisc::LinkDelay", StringValue (bottleNeckLinkDelay));
93 Config::SetDefault ("ns3::RedQueueDisc::MeanPktSize", UintegerValue (pktSize));
94
95 if (queueDiscType == "FengAdaptive")
96 {
97 // Turn on Feng's Adaptive RED
98 Config::SetDefault ("ns3::RedQueueDisc::FengAdaptive", BooleanValue (true));
99 }
100
101 // Create the point-to-point link helpers
102 PointToPointHelper bottleNeckLink;
103 bottleNeckLink.SetDeviceAttribute ("DataRate", StringValue (bottleNeckLinkBw));
104 bottleNeckLink.SetChannelAttribute ("Delay", StringValue (bottleNeckLinkDelay));
105
106 PointToPointHelper pointToPointLeaf;
107 pointToPointLeaf.SetDeviceAttribute ("DataRate", StringValue ("10Mbps"));
108 pointToPointLeaf.SetChannelAttribute ("Delay", StringValue ("1ms"));
109
110 PointToPointDumbbellHelper d (nLeaf, pointToPointLeaf,
111 nLeaf, pointToPointLeaf,
112 bottleNeckLink);
113
114 // Install Stack
116 for (uint32_t i = 0; i < d.LeftCount (); ++i)
117 {
118 stack.Install (d.GetLeft (i));
119 }
120 for (uint32_t i = 0; i < d.RightCount (); ++i)
121 {
122 stack.Install (d.GetRight (i));
123 }
124
125 stack.Install (d.GetLeft ());
126 stack.Install (d.GetRight ());
127 TrafficControlHelper tchBottleneck;
128 QueueDiscContainer queueDiscs;
129 tchBottleneck.SetRootQueueDisc ("ns3::RedQueueDisc");
130 tchBottleneck.Install (d.GetLeft ()->GetDevice (0));
131 queueDiscs = tchBottleneck.Install (d.GetRight ()->GetDevice (0));
132
133 // Assign IP Addresses
134 d.AssignIpv4Addresses (Ipv4AddressHelper ("10.1.1.0", "255.255.255.0"),
135 Ipv4AddressHelper ("10.2.1.0", "255.255.255.0"),
136 Ipv4AddressHelper ("10.3.1.0", "255.255.255.0"));
137
138 // Install on/off app on all right side nodes
139 OnOffHelper clientHelper ("ns3::TcpSocketFactory", Address ());
140 clientHelper.SetAttribute ("OnTime", StringValue ("ns3::UniformRandomVariable[Min=0.|Max=1.]"));
141 clientHelper.SetAttribute ("OffTime", StringValue ("ns3::UniformRandomVariable[Min=0.|Max=1.]"));
142 Address sinkLocalAddress (InetSocketAddress (Ipv4Address::GetAny (), port));
143 PacketSinkHelper packetSinkHelper ("ns3::TcpSocketFactory", sinkLocalAddress);
144 ApplicationContainer sinkApps;
145 for (uint32_t i = 0; i < d.LeftCount (); ++i)
146 {
147 sinkApps.Add (packetSinkHelper.Install (d.GetLeft (i)));
148 }
149 sinkApps.Start (Seconds (0.0));
150 sinkApps.Stop (Seconds (30.0));
151
153 for (uint32_t i = 0; i < d.RightCount (); ++i)
154 {
155 // Create an on/off app sending packets to the left side
156 AddressValue remoteAddress (InetSocketAddress (d.GetLeftIpv4Address (i), port));
157 clientHelper.SetAttribute ("Remote", remoteAddress);
158 clientApps.Add (clientHelper.Install (d.GetRight (i)));
159 }
160 clientApps.Start (Seconds (1.0)); // Start 1 second after sink
161 clientApps.Stop (Seconds (15.0)); // Stop before the sink
162
163 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
164
165 std::cout << "Running the simulation" << std::endl;
166 Simulator::Run ();
167
168 QueueDisc::Stats st = queueDiscs.Get (0)->GetStats ();
169
170 if (st.GetNDroppedPackets (RedQueueDisc::UNFORCED_DROP) == 0)
171 {
172 std::cout << "There should be some unforced drops" << std::endl;
173 exit (1);
174 }
175
176 if (st.GetNDroppedPackets (QueueDisc::INTERNAL_QUEUE_DROP) != 0)
177 {
178 std::cout << "There should be zero drops due to queue full" << std::endl;
179 exit (1);
180 }
181
182 std::cout << "*** Stats from the bottleneck queue disc ***" << std::endl;
183 std::cout << st << std::endl;
184 std::cout << "Destroying the simulation" << std::endl;
185
186 Simulator::Destroy ();
187 return 0;
188}
a polymophic address class
Definition: address.h:91
AttributeValue implementation for Address.
holds a vector of ns3::Application pointers.
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter.
void Add(ApplicationContainer other)
Append the contents of another ApplicationContainer to the end of this container.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
Parse command-line arguments.
Definition: command-line.h:229
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:41
an Inet address class
aggregate IP/TCP/UDP functionality to existing Nodes.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:43
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
A helper to make it easier to create a dumbbell topology with p2p links.
Build a set of PointToPointNetDevice objects.
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
Holds a vector of ns3::QueueDisc pointers.
Ptr< QueueDisc > Get(std::size_t i) const
Get the Ptr<QueueDisc> stored in this container at a given index.
const Stats & GetStats(void)
Retrieve all the collected statistics.
Definition: queue-disc.cc:419
Class for representing queue sizes.
Definition: queue-size.h:95
AttributeValue implementation for QueueSize.
Hold variables of type string.
Definition: string.h:41
Build a set of QueueDisc objects.
QueueDiscContainer Install(NetDeviceContainer c)
uint16_t SetRootQueueDisc(const std::string &type, Args &&... args)
Helper function used to set a root queue disc of the given type and with the given attributes.
Hold an unsigned integer type.
Definition: uinteger.h:44
uint16_t port
Definition: dsdv-manet.cc:45
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:849
@ BYTES
Use number of bytes for queue size.
Definition: queue-size.h:45
@ PACKETS
Use number of packets for queue size.
Definition: queue-size.h:44
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
clientApps
Definition: first.py:61
stack
Definition: first.py:41
Every class exported by the ns3 library is enclosed in the ns3 namespace.
cmd
Definition: second.py:35
Structure that keeps the queue disc statistics.
Definition: queue-disc.h:186
uint32_t GetNDroppedPackets(std::string reason) const
Get the number of packets dropped for the given reason.
Definition: queue-disc.cc:109
uint32_t pktSize
packet size used for the simulation (in bytes)
Definition: wifi-bianchi.cc:89