A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
red-vs-fengadaptive.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2016 NITK Surathkal
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Sourabh Jain <sourabhjain560@outlook.com>
7 * Mohit P. Tahiliani <tahiliani@nitk.edu.in>
8 */
9
10#include "ns3/applications-module.h"
11#include "ns3/core-module.h"
12#include "ns3/internet-module.h"
13#include "ns3/network-module.h"
14#include "ns3/point-to-point-layout-module.h"
15#include "ns3/point-to-point-module.h"
16#include "ns3/traffic-control-module.h"
17
18#include <iomanip>
19#include <iostream>
20#include <map>
21
22using namespace ns3;
23
24int
25main(int argc, char* argv[])
26{
27 uint32_t nLeaf = 10;
28 uint32_t maxPackets = 100;
29 bool modeBytes = false;
30 uint32_t queueDiscLimitPackets = 1000;
31 double minTh = 5;
32 double maxTh = 15;
33 uint32_t pktSize = 512;
34 std::string appDataRate = "10Mbps";
35 std::string queueDiscType = "RED";
36 uint16_t port = 5001;
37 std::string bottleNeckLinkBw = "1Mbps";
38 std::string bottleNeckLinkDelay = "50ms";
39
40 CommandLine cmd(__FILE__);
41 cmd.AddValue("nLeaf", "Number of left and right side leaf nodes", nLeaf);
42 cmd.AddValue("maxPackets", "Max Packets allowed in the device queue", maxPackets);
43 cmd.AddValue("queueDiscLimitPackets",
44 "Max Packets allowed in the queue disc",
45 queueDiscLimitPackets);
46 cmd.AddValue("queueDiscType", "Set Queue disc type to RED or FengAdaptive", queueDiscType);
47 cmd.AddValue("appPktSize", "Set OnOff App Packet Size", pktSize);
48 cmd.AddValue("appDataRate", "Set OnOff App DataRate", appDataRate);
49 cmd.AddValue("modeBytes", "Set Queue disc mode to Packets (false) or bytes (true)", modeBytes);
50
51 cmd.AddValue("redMinTh", "RED queue minimum threshold", minTh);
52 cmd.AddValue("redMaxTh", "RED queue maximum threshold", maxTh);
53 cmd.Parse(argc, argv);
54
55 if ((queueDiscType != "RED") && (queueDiscType != "FengAdaptive"))
56 {
57 std::cout
58 << "Invalid queue disc type: Use --queueDiscType=RED or --queueDiscType=FengAdaptive"
59 << std::endl;
60 exit(1);
61 }
62
63 Config::SetDefault("ns3::OnOffApplication::PacketSize", UintegerValue(pktSize));
64 Config::SetDefault("ns3::OnOffApplication::DataRate", StringValue(appDataRate));
65
66 Config::SetDefault("ns3::DropTailQueue<Packet>::MaxSize",
67 QueueSizeValue(QueueSize(QueueSizeUnit::PACKETS, maxPackets)));
68
69 if (!modeBytes)
70 {
72 "ns3::RedQueueDisc::MaxSize",
73 QueueSizeValue(QueueSize(QueueSizeUnit::PACKETS, queueDiscLimitPackets)));
74 }
75 else
76 {
78 "ns3::RedQueueDisc::MaxSize",
79 QueueSizeValue(QueueSize(QueueSizeUnit::BYTES, queueDiscLimitPackets * pktSize)));
80 minTh *= pktSize;
81 maxTh *= pktSize;
82 }
83
84 Config::SetDefault("ns3::RedQueueDisc::MinTh", DoubleValue(minTh));
85 Config::SetDefault("ns3::RedQueueDisc::MaxTh", DoubleValue(maxTh));
86 Config::SetDefault("ns3::RedQueueDisc::LinkBandwidth", StringValue(bottleNeckLinkBw));
87 Config::SetDefault("ns3::RedQueueDisc::LinkDelay", StringValue(bottleNeckLinkDelay));
88 Config::SetDefault("ns3::RedQueueDisc::MeanPktSize", UintegerValue(pktSize));
89
90 if (queueDiscType == "FengAdaptive")
91 {
92 // Turn on Feng's Adaptive RED
93 Config::SetDefault("ns3::RedQueueDisc::FengAdaptive", BooleanValue(true));
94 }
95
96 // Create the point-to-point link helpers
97 PointToPointHelper bottleNeckLink;
98 bottleNeckLink.SetDeviceAttribute("DataRate", StringValue(bottleNeckLinkBw));
99 bottleNeckLink.SetChannelAttribute("Delay", StringValue(bottleNeckLinkDelay));
100
101 PointToPointHelper pointToPointLeaf;
102 pointToPointLeaf.SetDeviceAttribute("DataRate", StringValue("10Mbps"));
103 pointToPointLeaf.SetChannelAttribute("Delay", StringValue("1ms"));
104
105 PointToPointDumbbellHelper d(nLeaf, pointToPointLeaf, nLeaf, pointToPointLeaf, bottleNeckLink);
106
107 // Install Stack
109 for (uint32_t i = 0; i < d.LeftCount(); ++i)
110 {
111 stack.Install(d.GetLeft(i));
112 }
113 for (uint32_t i = 0; i < d.RightCount(); ++i)
114 {
115 stack.Install(d.GetRight(i));
116 }
117
118 stack.Install(d.GetLeft());
119 stack.Install(d.GetRight());
120 TrafficControlHelper tchBottleneck;
121 QueueDiscContainer queueDiscs;
122 tchBottleneck.SetRootQueueDisc("ns3::RedQueueDisc");
123 tchBottleneck.Install(d.GetLeft()->GetDevice(0));
124 queueDiscs = tchBottleneck.Install(d.GetRight()->GetDevice(0));
125
126 // Assign IP Addresses
127 d.AssignIpv4Addresses(Ipv4AddressHelper("10.1.1.0", "255.255.255.0"),
128 Ipv4AddressHelper("10.2.1.0", "255.255.255.0"),
129 Ipv4AddressHelper("10.3.1.0", "255.255.255.0"));
130
131 // Install on/off app on all right side nodes
132 OnOffHelper clientHelper("ns3::TcpSocketFactory", Address());
133 clientHelper.SetAttribute("OnTime", StringValue("ns3::UniformRandomVariable[Min=0.|Max=1.]"));
134 clientHelper.SetAttribute("OffTime", StringValue("ns3::UniformRandomVariable[Min=0.|Max=1.]"));
136 PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory", sinkLocalAddress);
137 ApplicationContainer sinkApps;
138 for (uint32_t i = 0; i < d.LeftCount(); ++i)
139 {
140 sinkApps.Add(packetSinkHelper.Install(d.GetLeft(i)));
141 }
142 sinkApps.Start(Seconds(0.0));
143 sinkApps.Stop(Seconds(30.0));
144
146 for (uint32_t i = 0; i < d.RightCount(); ++i)
147 {
148 // Create an on/off app sending packets to the left side
149 AddressValue remoteAddress(InetSocketAddress(d.GetLeftIpv4Address(i), port));
150 clientHelper.SetAttribute("Remote", remoteAddress);
151 clientApps.Add(clientHelper.Install(d.GetRight(i)));
152 }
153 clientApps.Start(Seconds(1.0)); // Start 1 second after sink
154 clientApps.Stop(Seconds(15.0)); // Stop before the sink
155
157
158 std::cout << "Running the simulation" << std::endl;
160
161 QueueDisc::Stats st = queueDiscs.Get(0)->GetStats();
162
164 {
165 std::cout << "There should be some unforced drops" << std::endl;
166 exit(1);
167 }
168
170 {
171 std::cout << "There should be zero drops due to queue full" << std::endl;
172 exit(1);
173 }
174
175 std::cout << "*** Stats from the bottleneck queue disc ***" << std::endl;
176 std::cout << st << std::endl;
177 std::cout << "Destroying the simulation" << std::endl;
178
180 return 0;
181}
a polymophic address class
Definition address.h:90
holds a vector of ns3::Application pointers.
void Start(Time start) const
Start all of the Applications in this container at the start time given as a parameter.
void Stop(Time stop) const
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
void Add(ApplicationContainer other)
Append the contents of another ApplicationContainer to the end of this container.
Parse command-line arguments.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition double.h:31
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.
static Ipv4Address GetAny()
static void PopulateRoutingTables()
Build a routing database and initialize the routing tables of the nodes in the simulation.
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
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.
static constexpr const char * INTERNAL_QUEUE_DROP
Packet dropped by an internal queue.
Definition queue-disc.h:511
const Stats & GetStats()
Retrieve all the collected statistics.
Class for representing queue sizes.
Definition queue-size.h:85
static constexpr const char * UNFORCED_DROP
Early probability drops.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition simulator.cc:131
static void Run()
Run the simulation.
Definition simulator.cc:167
Hold variables of type string.
Definition string.h:45
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:34
uint16_t port
Definition dsdv-manet.cc:33
void SetDefault(std::string name, const AttributeValue &value)
Definition config.cc:883
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition nstime.h:1308
clientApps
Definition first.py:53
stack
Definition first.py:33
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Structure that keeps the queue disc statistics.
Definition queue-disc.h:177
uint32_t GetNDroppedPackets(std::string reason) const
Get the number of packets dropped for the given reason.
uint32_t pktSize
packet size used for the simulation (in bytes)