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 
43 using namespace ns3;
44 
45 NS_LOG_COMPONENT_DEFINE ("PieExample");
46 
47 uint32_t checkTimes;
49 
50 // The times
57 
63 
69 
70 std::stringstream filePlotQueueDisc;
71 std::stringstream filePlotQueueDiscAvg;
72 
73 void
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
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 
93 void
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 
137 int
138 main (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");
171  NodeContainer c;
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 
209  TrafficControlHelper tchPie;
210  tchPie.SetRootQueueDisc ("ns3::PieQueueDisc");
211 
212  NS_LOG_INFO ("Create channels");
213  PointToPointHelper p2p;
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");
255  Ipv4AddressHelper ipv4;
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
274 
275  BuildAppsTest ();
276 
277  if (writePcap)
278  {
279  PointToPointHelper ptp;
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);
301  }
302 
304  Simulator::Run ();
305 
306  QueueDisc::Stats st = queueDiscs.Get (0)->GetStats ();
307 
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 
332 
333  return 0;
334 }
a polymophic address class
Definition: address.h:91
AttributeValue implementation for Address.
Definition: address.h:278
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.
Definition: data-rate.h:298
Helper to enable IP flow monitoring on a set of Nodes.
Ptr< FlowMonitor > InstallAll()
Enable flow monitoring on all nodes.
static void Bind(std::string name, const AttributeValue &value)
Iterate over the set of GlobalValues until a matching name is found and then set its value with Globa...
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...
static Ipv4Address GetAny(void)
static void PopulateRoutingTables(void)
Build a routing database and initialize the routing tables of the nodes in the simulation.
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
static void Add(std::string name, Ptr< Object > object)
Add the association between the string "name" and the Ptr<Object> obj.
Definition: names.cc:768
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 ...
static constexpr const char * UNFORCED_DROP
Early probability drops: proactive.
static constexpr const char * FORCED_DROP
Drops due to queue limit: reactive.
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
static void Stop(void)
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:180
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:136
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition: simulator.h:556
static void Run(void)
Run the simulation.
Definition: simulator.cc:172
static EventId ScheduleNow(FUNC f, Ts &&... args)
Schedule an event to expire Now.
Definition: simulator.h:587
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:195
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 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