40 #include "ns3/core-module.h"
41 #include "ns3/network-module.h"
42 #include "ns3/internet-module.h"
43 #include "ns3/flow-monitor-helper.h"
44 #include "ns3/point-to-point-module.h"
45 #include "ns3/applications-module.h"
55 double global_start_time;
56 double global_stop_time;
57 double sink_start_time;
58 double sink_stop_time;
59 double client_start_time;
60 double client_stop_time;
74 std::stringstream filePlotQueue;
75 std::stringstream filePlotQueueAvg;
80 uint32_t qSize = StaticCast<RedQueue> (queue)->GetQueueSize ();
82 avgQueueSize += qSize;
88 std::ofstream fPlotQueue (filePlotQueue.str ().c_str (), std::ios::out|std::ios::app);
92 std::ofstream fPlotQueueAvg (filePlotQueueAvg.str ().c_str (), std::ios::out|std::ios::app);
94 fPlotQueueAvg.close ();
98 BuildAppsTest (uint32_t test)
100 if ( (test == 1) || (test == 3) )
103 uint16_t port = 50000;
117 clientHelper1.SetAttribute (
"OnTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=1]"));
118 clientHelper1.SetAttribute (
"OffTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=0]"));
119 clientHelper1.SetAttribute
121 clientHelper1.SetAttribute
127 clientHelper1.SetAttribute (
"Remote", remoteAddress);
128 clientApps1.
Add (clientHelper1.Install (n0n2.
Get (0)));
134 clientHelper2.SetAttribute (
"OnTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=1]"));
135 clientHelper2.SetAttribute (
"OffTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=0]"));
136 clientHelper2.SetAttribute
138 clientHelper2.SetAttribute
142 clientHelper2.SetAttribute (
"Remote", remoteAddress);
143 clientApps2.
Add (clientHelper2.Install (n1n2.
Get (0)));
151 uint16_t port1 = 50001;
158 uint16_t port2 = 50002;
165 uint16_t port3 = 50003;
172 uint16_t port4 = 50004;
185 clientHelper1.SetAttribute (
"OnTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=1]"));
186 clientHelper1.SetAttribute (
"OffTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=0]"));
187 clientHelper1.SetAttribute
189 clientHelper1.SetAttribute
195 clientHelper1.SetAttribute (
"Remote", remoteAddress1);
196 clientApps1.
Add (clientHelper1.Install (n0n2.
Get (0)));
202 clientHelper2.SetAttribute (
"OnTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=1]"));
203 clientHelper2.SetAttribute (
"OffTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=0]"));
204 clientHelper2.SetAttribute
206 clientHelper2.SetAttribute
212 clientHelper2.SetAttribute (
"Remote", remoteAddress2);
213 clientApps2.
Add (clientHelper2.Install (n1n2.
Get (0)));
219 clientHelper3.SetAttribute (
"OnTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=1]"));
220 clientHelper3.SetAttribute (
"OffTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=0]"));
221 clientHelper3.SetAttribute
223 clientHelper3.SetAttribute
229 clientHelper3.SetAttribute (
"Remote", remoteAddress3);
230 clientApps3.
Add (clientHelper3.Install (n3n4.
Get (1)));
236 clientHelper4.SetAttribute (
"OnTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=1]"));
237 clientHelper4.SetAttribute (
"OffTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=0]"));
238 clientHelper4.SetAttribute
240 clientHelper4.SetAttribute
246 clientHelper4.SetAttribute (
"Remote", remoteAddress4);
247 clientApps4.
Add (clientHelper4.Install (n3n5.
Get (1)));
254 main (
int argc,
char *argv[])
262 std::string redLinkDataRate =
"1.5Mbps";
263 std::string redLinkDelay =
"20ms";
266 bool writeForPlot =
false;
267 bool writePcap =
false;
268 bool flowMonitor =
false;
270 bool printRedStats =
true;
272 global_start_time = 0.0;
273 global_stop_time = 11;
274 sink_start_time = global_start_time;
275 sink_stop_time = global_stop_time + 3.0;
276 client_start_time = sink_start_time + 0.2;
277 client_stop_time = global_stop_time - 2.0;
284 cmd.
AddValue (
"testNumber",
"Run test 1, 3, 4 or 5", redTest);
285 cmd.
AddValue (
"pathOut",
"Path to save results from --writeForPlot/--writePcap/--writeFlowMonitor", pathOut);
286 cmd.
AddValue (
"writeForPlot",
"<0/1> to write results for plot (gnuplot)", writeForPlot);
287 cmd.
AddValue (
"writePcap",
"<0/1> to write results in pcapfile", writePcap);
288 cmd.
AddValue (
"writeFlowMonitor",
"<0/1> to enable Flow Monitor and write their results", flowMonitor);
290 cmd.
Parse (argc, argv);
291 if ( (redTest != 1) && (redTest != 3) && (redTest != 4) && (redTest != 5) )
293 NS_ABORT_MSG (
"Invalid test number. Supported tests are 1, 3, 4 or 5");
317 uint32_t meanPktSize = 500;
335 else if (redTest == 5)
344 NS_LOG_INFO (
"Install internet stack on all nodes.");
351 p2p.
SetQueue (
"ns3::DropTailQueue");
356 p2p.
SetQueue (
"ns3::DropTailQueue");
368 p2p.
SetQueue (
"ns3::DropTailQueue");
373 p2p.
SetQueue (
"ns3::DropTailQueue");
381 ipv4.
SetBase (
"10.1.1.0",
"255.255.255.0");
382 i0i2 = ipv4.
Assign (devn0n2);
384 ipv4.
SetBase (
"10.1.2.0",
"255.255.255.0");
385 i1i2 = ipv4.
Assign (devn1n2);
387 ipv4.
SetBase (
"10.1.3.0",
"255.255.255.0");
388 i2i3 = ipv4.
Assign (devn2n3);
390 ipv4.
SetBase (
"10.1.4.0",
"255.255.255.0");
391 i3i4 = ipv4.
Assign (devn3n4);
393 ipv4.
SetBase (
"10.1.5.0",
"255.255.255.0");
394 i3i5 = ipv4.
Assign (devn3n5);
406 StaticCast<RedQueue> (queue)->SetTh (5, 15);
407 StaticCast<RedQueue> (queue)->SetQueueLimit (25);
410 BuildAppsTest (redTest);
415 std::stringstream stmp;
416 stmp << pathOut <<
"/red";
429 filePlotQueue << pathOut <<
"/" <<
"red-queue.plotme";
430 filePlotQueueAvg << pathOut <<
"/" <<
"red-queue_avg.plotme";
432 remove (filePlotQueue.str ().c_str ());
433 remove (filePlotQueueAvg.str ().c_str ());
444 std::stringstream stmp;
445 stmp << pathOut <<
"/red.flowmon";
454 std::cout <<
"*** RED stats from Node 2 queue ***" << std::endl;
455 std::cout <<
"\t " << st.unforcedDrop <<
" drops due prob mark" << std::endl;
456 std::cout <<
"\t " << st.forcedDrop <<
" drops due hard mark" << std::endl;
457 std::cout <<
"\t " << st.qLimDrop <<
" drops due queue full" << std::endl;
459 nd = StaticCast<PointToPointNetDevice> (devn2n3.
Get (1));
460 st = StaticCast<RedQueue> (nd->
GetQueue ())->GetStats ();
461 std::cout <<
"*** RED stats from Node 3 queue ***" << std::endl;
462 std::cout <<
"\t " << st.unforcedDrop <<
" drops due prob mark" << std::endl;
463 std::cout <<
"\t " << st.forcedDrop <<
" drops due hard mark" << std::endl;
464 std::cout <<
"\t " << st.qLimDrop <<
" drops due queue full" << std::endl;
holds a vector of ns3::Application pointers.
static Ipv4Address GetAny(void)
smart pointer class similar to boost::intrusive_ptr
Ptr< Queue > GetQueue(void) const
holds a vector of std::pair of Ptr<Ipv4> and interface index.
static void PopulateRoutingTables(void)
Build a routing database and initialize the routing tables of the nodes in the simulation. Makes all nodes in the simulation into routers.
hold variables of type string
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
NetDeviceContainer Install(NodeContainer c)
void Add(ApplicationContainer other)
Append the contents of another ApplicationContainer to the end of this container. ...
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())
#define NS_LOG_COMPONENT_DEFINE(name)
aggregate IP/TCP/UDP functionality to existing Nodes.
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes...
Build a set of PointToPointNetDevice objects.
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
void SetDeviceAttribute(std::string name, const AttributeValue &value)
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
a polymophic address class
static void Add(std::string name, Ptr< Object > object)
Add the association between the string "name" and the Ptr<Object> obj.
Class for representing data rates.
double GetSeconds(void) const
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 ...
Hold an unsigned integer type.
holds a vector of ns3::NetDevice pointers
static void Bind(std::string name, const AttributeValue &value)
Ptr< FlowMonitor > InstallAll()
Enable flow monitoring on all nodes.
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter...
parse command-line argumentsInstances of this class can be used to parse command-line arguments: user...
static void Destroy(void)
void SetDefault(std::string name, const AttributeValue &value)
keep track of a set of node pointers.
void Install(std::string nodeName) const
Helper to enable IPv4 flow monitoring on a set of Nodes.
static EventId ScheduleNow(MEM mem_ptr, OBJ obj)
void SetChannelAttribute(std::string name, const AttributeValue &value)
#define NS_ABORT_MSG(msg)
Abnormal program termination.
hold objects of type ns3::Address
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter...
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
hold objects of type ns3::DataRate
void AddValue(const std::string &name, const std::string &help, T &value)
void SerializeToXmlFile(std::string fileName, bool enableHistograms, bool enableProbes)
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
void Parse(int argc, char *argv[]) const
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Hold an floating point type.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
void LogComponentEnable(char const *name, enum LogLevel level)
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const