A Discrete-Event Network Simulator
API
pie-example.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 * Authors: Shravya Ks <shravya.ks0@gmail.com>
19 * Smriti Murali <m.smriti.95@gmail.com>
20 * Mohit P. Tahiliani <tahiliani@nitk.edu.in>
21 *
22 */
23
35#include "ns3/core-module.h"
36#include "ns3/network-module.h"
37#include "ns3/internet-module.h"
38#include "ns3/flow-monitor-helper.h"
39#include "ns3/point-to-point-module.h"
40#include "ns3/applications-module.h"
41#include "ns3/traffic-control-module.h"
42
43using namespace ns3;
44
45NS_LOG_COMPONENT_DEFINE ("PieExample");
46
49
50// The times
57
63
69
70std::stringstream filePlotQueueDisc;
71std::stringstream filePlotQueueDiscAvg;
72
73void
75{
76 uint32_t qSize = queue->GetCurrentSize ().GetValue ();
77
78 avgQueueDiscSize += qSize;
79 checkTimes++;
80
81 // check queue disc size every 1/100 of a second
82 Simulator::Schedule (Seconds (0.01), &CheckQueueDiscSize, queue);
83
84 std::ofstream fPlotQueueDisc (filePlotQueueDisc.str ().c_str (), std::ios::out | std::ios::app);
85 fPlotQueueDisc << Simulator::Now ().GetSeconds () << " " << qSize << std::endl;
86 fPlotQueueDisc.close ();
87
88 std::ofstream fPlotQueueDiscAvg (filePlotQueueDiscAvg.str ().c_str (), std::ios::out | std::ios::app);
89 fPlotQueueDiscAvg << Simulator::Now ().GetSeconds () << " " << avgQueueDiscSize / checkTimes << std::endl;
90 fPlotQueueDiscAvg.close ();
91}
92
93void
95{
96 // SINK is in the right side
97 uint16_t port = 50000;
98 Address sinkLocalAddress (InetSocketAddress (Ipv4Address::GetAny (), port));
99 PacketSinkHelper sinkHelper ("ns3::TcpSocketFactory", sinkLocalAddress);
100 ApplicationContainer sinkApp = sinkHelper.Install (n3n4.Get (1));
101 sinkApp.Start (Seconds (sink_start_time));
102 sinkApp.Stop (Seconds (sink_stop_time));
103
104 // Connection one
105 // Clients are in left side
106 /*
107 * Create the OnOff applications to send TCP to the server
108 * onoffhelper is a client that send data to TCP destination
109 */
110 OnOffHelper clientHelper1 ("ns3::TcpSocketFactory", Address ());
111 clientHelper1.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
112 clientHelper1.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
113 clientHelper1.SetAttribute ("PacketSize", UintegerValue (1000));
114 clientHelper1.SetAttribute ("DataRate", DataRateValue (DataRate ("10Mb/s")));
115
116 // Connection two
117 OnOffHelper clientHelper2 ("ns3::TcpSocketFactory", Address ());
118 clientHelper2.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
119 clientHelper2.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
120 clientHelper2.SetAttribute ("PacketSize", UintegerValue (1000));
121 clientHelper2.SetAttribute ("DataRate", DataRateValue (DataRate ("10Mb/s")));
122
123 ApplicationContainer clientApps1;
124 AddressValue remoteAddress (InetSocketAddress (i3i4.GetAddress (1), port));
125 clientHelper1.SetAttribute ("Remote", remoteAddress);
126 clientApps1.Add (clientHelper1.Install (n0n2.Get (0)));
127 clientApps1.Start (Seconds (client_start_time));
128 clientApps1.Stop (Seconds (client_stop_time));
129
130 ApplicationContainer clientApps2;
131 clientHelper2.SetAttribute ("Remote", remoteAddress);
132 clientApps2.Add (clientHelper2.Install (n1n2.Get (0)));
133 clientApps2.Start (Seconds (client_start_time));
134 clientApps2.Stop (Seconds (client_stop_time));
135}
136
137int
138main (int argc, char *argv[])
139{
140 LogComponentEnable ("PieQueueDisc", LOG_LEVEL_INFO);
141
142 std::string pieLinkDataRate = "1.5Mbps";
143 std::string pieLinkDelay = "20ms";
144
145 std::string pathOut;
146 bool writeForPlot = false;
147 bool writePcap = false;
148 bool flowMonitor = false;
149
150 bool printPieStats = true;
151
152 global_start_time = 0.0;
155 global_stop_time = 7.0;
158
159 // Configuration and command line parameter parsing
160 // Will only save in the directory if enable opts below
161 pathOut = "."; // Current directory
162 CommandLine cmd (__FILE__);
163 cmd.AddValue ("pathOut", "Path to save results from --writeForPlot/--writePcap/--writeFlowMonitor", pathOut);
164 cmd.AddValue ("writeForPlot", "<0/1> to write results for plot (gnuplot)", writeForPlot);
165 cmd.AddValue ("writePcap", "<0/1> to write results in pcapfile", writePcap);
166 cmd.AddValue ("writeFlowMonitor", "<0/1> to enable Flow Monitor and write their results", flowMonitor);
167
168 cmd.Parse (argc, argv);
169
170 NS_LOG_INFO ("Create nodes");
172 c.Create (6);
173 Names::Add ( "N0", c.Get (0));
174 Names::Add ( "N1", c.Get (1));
175 Names::Add ( "N2", c.Get (2));
176 Names::Add ( "N3", c.Get (3));
177 Names::Add ( "N4", c.Get (4));
178 Names::Add ( "N5", c.Get (5));
179 n0n2 = NodeContainer (c.Get (0), c.Get (2));
180 n1n2 = NodeContainer (c.Get (1), c.Get (2));
181 n2n3 = NodeContainer (c.Get (2), c.Get (3));
182 n3n4 = NodeContainer (c.Get (3), c.Get (4));
183 n3n5 = NodeContainer (c.Get (3), c.Get (5));
184
185 Config::SetDefault ("ns3::TcpL4Protocol::SocketType", StringValue ("ns3::TcpNewReno"));
186 // 42 = headers size
187 Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (1000 - 42));
188 Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (1));
189 GlobalValue::Bind ("ChecksumEnabled", BooleanValue (false));
190
191 uint32_t meanPktSize = 1000;
192
193 // PIE params
194 NS_LOG_INFO ("Set PIE params");
195 Config::SetDefault ("ns3::PieQueueDisc::MaxSize", StringValue ("100p"));
196 Config::SetDefault ("ns3::PieQueueDisc::MeanPktSize", UintegerValue (meanPktSize));
197 Config::SetDefault ("ns3::PieQueueDisc::DequeueThreshold", UintegerValue (10000));
198 Config::SetDefault ("ns3::PieQueueDisc::QueueDelayReference", TimeValue (Seconds (0.02)));
199 Config::SetDefault ("ns3::PieQueueDisc::MaxBurstAllowance", TimeValue (Seconds (0.1)));
200
201 NS_LOG_INFO ("Install internet stack on all nodes.");
202 InternetStackHelper internet;
203 internet.Install (c);
204
205 TrafficControlHelper tchPfifo;
206 uint16_t handle = tchPfifo.SetRootQueueDisc ("ns3::PfifoFastQueueDisc");
207 tchPfifo.AddInternalQueues (handle, 3, "ns3::DropTailQueue", "MaxSize", StringValue ("1000p"));
208
210 tchPie.SetRootQueueDisc ("ns3::PieQueueDisc");
211
212 NS_LOG_INFO ("Create channels");
214
215 NetDeviceContainer devn0n2;
216 NetDeviceContainer devn1n2;
217 NetDeviceContainer devn2n3;
218 NetDeviceContainer devn3n4;
219 NetDeviceContainer devn3n5;
220
221 QueueDiscContainer queueDiscs;
222
223 p2p.SetQueue ("ns3::DropTailQueue");
224 p2p.SetDeviceAttribute ("DataRate", StringValue ("10Mbps"));
225 p2p.SetChannelAttribute ("Delay", StringValue ("2ms"));
226 devn0n2 = p2p.Install (n0n2);
227 tchPfifo.Install (devn0n2);
228
229 p2p.SetQueue ("ns3::DropTailQueue");
230 p2p.SetDeviceAttribute ("DataRate", StringValue ("10Mbps"));
231 p2p.SetChannelAttribute ("Delay", StringValue ("3ms"));
232 devn1n2 = p2p.Install (n1n2);
233 tchPfifo.Install (devn1n2);
234
235 p2p.SetQueue ("ns3::DropTailQueue");
236 p2p.SetDeviceAttribute ("DataRate", StringValue (pieLinkDataRate));
237 p2p.SetChannelAttribute ("Delay", StringValue (pieLinkDelay));
238 devn2n3 = p2p.Install (n2n3);
239 // only backbone link has PIE queue disc
240 queueDiscs = tchPie.Install (devn2n3);
241
242 p2p.SetQueue ("ns3::DropTailQueue");
243 p2p.SetDeviceAttribute ("DataRate", StringValue ("10Mbps"));
244 p2p.SetChannelAttribute ("Delay", StringValue ("4ms"));
245 devn3n4 = p2p.Install (n3n4);
246 tchPfifo.Install (devn3n4);
247
248 p2p.SetQueue ("ns3::DropTailQueue");
249 p2p.SetDeviceAttribute ("DataRate", StringValue ("10Mbps"));
250 p2p.SetChannelAttribute ("Delay", StringValue ("5ms"));
251 devn3n5 = p2p.Install (n3n5);
252 tchPfifo.Install (devn3n5);
253
254 NS_LOG_INFO ("Assign IP Addresses");
256
257 ipv4.SetBase ("10.1.1.0", "255.255.255.0");
258 i0i2 = ipv4.Assign (devn0n2);
259
260 ipv4.SetBase ("10.1.2.0", "255.255.255.0");
261 i1i2 = ipv4.Assign (devn1n2);
262
263 ipv4.SetBase ("10.1.3.0", "255.255.255.0");
264 i2i3 = ipv4.Assign (devn2n3);
265
266 ipv4.SetBase ("10.1.4.0", "255.255.255.0");
267 i3i4 = ipv4.Assign (devn3n4);
268
269 ipv4.SetBase ("10.1.5.0", "255.255.255.0");
270 i3i5 = ipv4.Assign (devn3n5);
271
272 // Set up the routing
273 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
274
275 BuildAppsTest ();
276
277 if (writePcap)
278 {
280 std::stringstream stmp;
281 stmp << pathOut << "/pie";
282 ptp.EnablePcapAll (stmp.str ().c_str ());
283 }
284
285 Ptr<FlowMonitor> flowmon;
286 if (flowMonitor)
287 {
288 FlowMonitorHelper flowmonHelper;
289 flowmon = flowmonHelper.InstallAll ();
290 }
291
292 if (writeForPlot)
293 {
294 filePlotQueueDisc << pathOut << "/" << "pie-queue-disc.plotme";
295 filePlotQueueDiscAvg << pathOut << "/" << "pie-queue-disc_avg.plotme";
296
297 remove (filePlotQueueDisc.str ().c_str ());
298 remove (filePlotQueueDiscAvg.str ().c_str ());
299 Ptr<QueueDisc> queue = queueDiscs.Get (0);
300 Simulator::ScheduleNow (&CheckQueueDiscSize, queue);
301 }
302
303 Simulator::Stop (Seconds (sink_stop_time));
304 Simulator::Run ();
305
306 QueueDisc::Stats st = queueDiscs.Get (0)->GetStats ();
307
308 if (st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP) != 0)
309 {
310 std::cout << "There should be no drops due to queue full." << std::endl;
311 exit (1);
312 }
313
314 if (flowMonitor)
315 {
316 std::stringstream stmp;
317 stmp << pathOut << "/pie.flowmon";
318
319 flowmon->SerializeToXmlFile (stmp.str ().c_str (), false, false);
320 }
321
322 if (printPieStats)
323 {
324 std::cout << "*** PIE stats from Node 2 queue ***" << std::endl;
325 std::cout << "\t " << st.GetNDroppedPackets (PieQueueDisc::UNFORCED_DROP)
326 << " drops due to prob mark" << std::endl;
327 std::cout << "\t " << st.GetNDroppedPackets (PieQueueDisc::FORCED_DROP)
328 << " drops due to queue limits" << std::endl;
329 }
330
331 Simulator::Destroy ();
332
333 return 0;
334}
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
Class for representing data rates.
Definition: data-rate.h:89
AttributeValue implementation for DataRate.
Helper to enable IP flow monitoring on a set of Nodes.
Ptr< FlowMonitor > InstallAll()
Enable flow monitoring on all nodes.
an Inet address class
aggregate IP/TCP/UDP functionality to existing Nodes.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
holds a vector of ns3::NetDevice pointers
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:43
ApplicationContainer Install(NodeContainer c) const
Install an ns3::OnOffApplication on each node of the input container configured with all the attribut...
void SetAttribute(std::string name, const AttributeValue &value)
Helper function used to set the underlying application attributes.
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
ApplicationContainer Install(NodeContainer c) const
Install an ns3::PacketSinkApplication on each node of the input container configured with all the att...
void EnablePcapAll(std::string prefix, bool promiscuous=false)
Enable pcap output on each device (which is of the appropriate type) in the set of all nodes created ...
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 SetQueue(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue())
Each point to point net device must have a queue to pass packets through.
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
NetDeviceContainer Install(NodeContainer c)
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.
QueueSize GetCurrentSize(void)
Get the current size of the queue disc in bytes, if operating in bytes mode, or packets,...
Definition: queue-disc.cc:521
const Stats & GetStats(void)
Retrieve all the collected statistics.
Definition: queue-disc.cc:419
uint32_t GetValue() const
Get the underlying value.
Definition: queue-size.cc:174
Hold variables of type string.
Definition: string.h:41
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:379
AttributeValue implementation for Time.
Definition: nstime.h:1308
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.
void AddInternalQueues(uint16_t handle, uint16_t count, std::string type, Args &&... args)
Helper function used to add the given number of internal queues (of the given type and with the given...
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
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
Every class exported by the ns3 library is enclosed in the ns3 namespace.
@ LOG_LEVEL_INFO
LOG_INFO and above.
Definition: log.h:107
void LogComponentEnable(char const *name, enum LogLevel level)
Enable the logging output associated with that log component.
Definition: log.cc:361
cmd
Definition: second.py:35
Ipv4InterfaceContainer i0i2
Definition: pie-example.cc:64
std::stringstream filePlotQueueDisc
Definition: pie-example.cc:70
void BuildAppsTest()
Definition: pie-example.cc:94
double client_start_time
Definition: pie-example.cc:55
double sink_stop_time
Definition: pie-example.cc:54
double sink_start_time
Definition: pie-example.cc:53
double global_stop_time
Definition: pie-example.cc:52
std::stringstream filePlotQueueDiscAvg
Definition: pie-example.cc:71
NodeContainer n2n3
Definition: pie-example.cc:60
void CheckQueueDiscSize(Ptr< QueueDisc > queue)
Definition: pie-example.cc:74
NodeContainer n1n2
Definition: pie-example.cc:59
double avgQueueDiscSize
Definition: pie-example.cc:48
NodeContainer n3n4
Definition: pie-example.cc:61
double global_start_time
Definition: pie-example.cc:51
Ipv4InterfaceContainer i1i2
Definition: pie-example.cc:65
Ipv4InterfaceContainer i3i4
Definition: pie-example.cc:67
NodeContainer n0n2
Definition: pie-example.cc:58
double client_stop_time
Definition: pie-example.cc:56
uint32_t checkTimes
Definition: pie-example.cc:45
NodeContainer n3n5
Definition: pie-example.cc:62
Ipv4InterfaceContainer i3i5
Definition: pie-example.cc:68
Ipv4InterfaceContainer i2i3
Definition: pie-example.cc:66
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