|
1 |
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
1 |
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
2 |
/* |
2 |
/* |
3 |
* Copyright (c) 2013 ResiliNets, ITTC, University of Kansas |
3 |
* Copyright (c) 2013 ResiliNets, ITTC, University of Kansas |
4 |
* |
4 |
* |
5 |
* This program is free software; you can redistribute it and/or modify |
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 |
6 |
* it under the terms of the GNU General Public License version 2 as |
|
54 |
|
54 |
|
55 |
NS_LOG_COMPONENT_DEFINE ("TcpVariantsComparison"); |
55 |
NS_LOG_COMPONENT_DEFINE ("TcpVariantsComparison"); |
56 |
|
56 |
|
57 |
double old_time = 0.0; |
57 |
bool firstCwnd = true; |
58 |
EventId output; |
58 |
bool firstSshThr = true; |
59 |
Time current = Time::FromInteger(3, Time::S); //Only record cwnd and ssthresh values every 3 seconds |
|
|
60 |
bool first = true; |
61 |
|
62 |
static void |
63 |
OutputTrace () |
64 |
{ |
65 |
// *stream->GetStream() << newtime << " " << newval << std::endl; |
66 |
// old_time = newval; |
67 |
} |
68 |
|
59 |
|
69 |
static void |
60 |
static void |
70 |
CwndTracer (Ptr<OutputStreamWrapper>stream, uint32_t oldval, uint32_t newval) |
61 |
CwndTracer (Ptr<OutputStreamWrapper>stream, uint32_t oldval, uint32_t newval) |
71 |
{ |
62 |
{ |
72 |
double new_time = Simulator::Now().GetSeconds(); |
63 |
if (firstCwnd) |
73 |
if (old_time == 0 && first) |
|
|
74 |
{ |
75 |
double mycurrent = current.GetSeconds(); |
76 |
*stream->GetStream() << new_time << " " << mycurrent << " " << newval << std::endl; |
77 |
first = false; |
78 |
output = Simulator::Schedule(current,&OutputTrace); |
79 |
} |
80 |
else |
81 |
{ |
82 |
if (output.IsExpired()) |
83 |
{ |
64 |
{ |
84 |
*stream->GetStream() << new_time << " " << newval << std::endl; |
65 |
*stream->GetStream () << "0.0 " << oldval << std::endl; |
85 |
output.Cancel(); |
66 |
firstCwnd = false; |
86 |
output = Simulator::Schedule(current,&OutputTrace); |
|
|
87 |
} |
67 |
} |
88 |
} |
68 |
*stream->GetStream () << Simulator::Now ().GetSeconds () << " " << newval << std::endl; |
89 |
} |
69 |
} |
90 |
|
70 |
|
91 |
static void |
71 |
static void |
92 |
SsThreshTracer (Ptr<OutputStreamWrapper>stream, uint32_t oldval, uint32_t newval) |
72 |
SsThreshTracer (Ptr<OutputStreamWrapper>stream, uint32_t oldval, uint32_t newval) |
93 |
{ |
73 |
{ |
94 |
double new_time = Simulator::Now().GetSeconds(); |
74 |
if (firstCwnd) |
95 |
if (old_time == 0 && first) |
|
|
96 |
{ |
97 |
double mycurrent = current.GetSeconds(); |
98 |
*stream->GetStream() << new_time << " " << mycurrent << " " << newval << std::endl; |
99 |
first = false; |
100 |
output = Simulator::Schedule(current,&OutputTrace); |
101 |
} |
102 |
else |
103 |
{ |
104 |
if (output.IsExpired()) |
105 |
{ |
75 |
{ |
106 |
*stream->GetStream() << new_time << " " << newval << std::endl; |
76 |
*stream->GetStream () << "0.0 " << oldval << std::endl; |
107 |
output.Cancel(); |
77 |
firstSshThr = false; |
108 |
output = Simulator::Schedule(current,&OutputTrace); |
|
|
109 |
} |
78 |
} |
110 |
} |
79 |
*stream->GetStream () << Simulator::Now ().GetSeconds () << " " << newval << std::endl; |
111 |
} |
80 |
} |
112 |
|
81 |
|
|
|
82 |
|
113 |
static void |
83 |
static void |
114 |
TraceCwnd (std::string cwnd_tr_file_name) |
84 |
TraceCwnd (std::string cwnd_tr_file_name) |
115 |
{ |
85 |
{ |
116 |
AsciiTraceHelper ascii; |
86 |
AsciiTraceHelper ascii; |
117 |
if (cwnd_tr_file_name.compare("") == 0) |
87 |
if (cwnd_tr_file_name.compare ("") == 0) |
118 |
{ |
88 |
{ |
119 |
NS_LOG_DEBUG ("No trace file for cwnd provided"); |
89 |
NS_LOG_DEBUG ("No trace file for cwnd provided"); |
120 |
return; |
90 |
return; |
121 |
} |
91 |
} |
122 |
else |
92 |
else |
123 |
{ |
93 |
{ |
124 |
Ptr<OutputStreamWrapper> stream = ascii.CreateFileStream(cwnd_tr_file_name.c_str()); |
94 |
Ptr<OutputStreamWrapper> stream = ascii.CreateFileStream (cwnd_tr_file_name.c_str ()); |
125 |
Config::ConnectWithoutContext ("/NodeList/1/$ns3::TcpL4Protocol/SocketList/0/CongestionWindow",MakeBoundCallback (&CwndTracer, stream)); |
95 |
Config::ConnectWithoutContext ("/NodeList/1/$ns3::TcpL4Protocol/SocketList/0/CongestionWindow",MakeBoundCallback (&CwndTracer, stream)); |
126 |
} |
96 |
} |
127 |
} |
97 |
} |
128 |
|
98 |
|
129 |
static void |
99 |
static void |
130 |
TraceSsThresh(std::string ssthresh_tr_file_name) |
100 |
TraceSsThresh (std::string ssthresh_tr_file_name) |
131 |
{ |
101 |
{ |
132 |
AsciiTraceHelper ascii; |
102 |
AsciiTraceHelper ascii; |
133 |
if (ssthresh_tr_file_name.compare("") == 0) |
103 |
if (ssthresh_tr_file_name.compare ("") == 0) |
134 |
{ |
104 |
{ |
135 |
NS_LOG_DEBUG ("No trace file for ssthresh provided"); |
105 |
NS_LOG_DEBUG ("No trace file for ssthresh provided"); |
136 |
return; |
106 |
return; |
137 |
} |
107 |
} |
138 |
else |
108 |
else |
139 |
{ |
109 |
{ |
140 |
Ptr<OutputStreamWrapper> stream = ascii.CreateFileStream(ssthresh_tr_file_name.c_str()); |
110 |
Ptr<OutputStreamWrapper> stream = ascii.CreateFileStream (ssthresh_tr_file_name.c_str ()); |
141 |
Config::ConnectWithoutContext ("/NodeList/1/$ns3::TcpL4Protocol/SocketList/0/SlowStartThreshold",MakeBoundCallback (&SsThreshTracer, stream)); |
111 |
Config::ConnectWithoutContext ("/NodeList/1/$ns3::TcpL4Protocol/SocketList/0/SlowStartThreshold",MakeBoundCallback (&SsThreshTracer, stream)); |
142 |
} |
112 |
} |
143 |
} |
113 |
} |
|
162 |
|
132 |
|
163 |
|
133 |
|
164 |
CommandLine cmd; |
134 |
CommandLine cmd; |
165 |
cmd.AddValue("transport_prot", "Transport protocol to use: TcpTahoe, TcpReno, TcpNewReno, TcpWestwood, TcpWestwoodPlus ", transport_prot); |
135 |
cmd.AddValue ("transport_prot", "Transport protocol to use: TcpTahoe, TcpReno, TcpNewReno, TcpWestwood, TcpWestwoodPlus ", transport_prot); |
166 |
cmd.AddValue("error_p", "Packet error rate", error_p); |
136 |
cmd.AddValue ("error_p", "Packet error rate", error_p); |
167 |
cmd.AddValue("bandwidth", "Bottleneck bandwidth", bandwidth); |
137 |
cmd.AddValue ("bandwidth", "Bottleneck bandwidth", bandwidth); |
168 |
cmd.AddValue("access_bandwidth", "Access link bandwidth", access_bandwidth); |
138 |
cmd.AddValue ("access_bandwidth", "Access link bandwidth", access_bandwidth); |
169 |
cmd.AddValue("delay", "Access link delay", access_delay); |
139 |
cmd.AddValue ("delay", "Access link delay", access_delay); |
170 |
cmd.AddValue("tracing", "Flag to enable/disable tracing", tracing); |
140 |
cmd.AddValue ("tracing", "Flag to enable/disable tracing", tracing); |
171 |
cmd.AddValue("tr_name", "Name of output trace file", tr_file_name); |
141 |
cmd.AddValue ("tr_name", "Name of output trace file", tr_file_name); |
172 |
cmd.AddValue("cwnd_tr_name", "Name of output trace file", cwnd_tr_file_name); |
142 |
cmd.AddValue ("cwnd_tr_name", "Name of output trace file", cwnd_tr_file_name); |
173 |
cmd.AddValue("ssthresh_tr_name", "Name of output trace file", ssthresh_tr_file_name); |
143 |
cmd.AddValue ("ssthresh_tr_name", "Name of output trace file", ssthresh_tr_file_name); |
174 |
cmd.AddValue("data", "Number of Megabytes of data to transmit", data_mbytes); |
144 |
cmd.AddValue ("data", "Number of Megabytes of data to transmit", data_mbytes); |
175 |
cmd.AddValue("mtu", "Size of IP packets to send in bytes", mtu_bytes); |
145 |
cmd.AddValue ("mtu", "Size of IP packets to send in bytes", mtu_bytes); |
176 |
cmd.AddValue("num_flows", "Number of flows", num_flows); |
146 |
cmd.AddValue ("num_flows", "Number of flows", num_flows); |
177 |
cmd.AddValue("duration", "Time to allow flows to run in seconds", duration); |
147 |
cmd.AddValue ("duration", "Time to allow flows to run in seconds", duration); |
178 |
cmd.AddValue("run", "Run index (for setting repeatable seeds)", run); |
148 |
cmd.AddValue ("run", "Run index (for setting repeatable seeds)", run); |
179 |
cmd.AddValue("flow_monitor", "Enable flow monitor", flow_monitor); |
149 |
cmd.AddValue ("flow_monitor", "Enable flow monitor", flow_monitor); |
180 |
cmd.Parse (argc, argv); |
150 |
cmd.Parse (argc, argv); |
181 |
|
151 |
|
182 |
SeedManager::SetSeed(1); |
152 |
SeedManager::SetSeed (1); |
183 |
SeedManager::SetRun(run); |
153 |
SeedManager::SetRun (run); |
184 |
|
154 |
|
185 |
// User may find it convenient to enable logging |
155 |
// User may find it convenient to enable logging |
186 |
//LogComponentEnable("TcpVariantsComparison", LOG_LEVEL_ALL); |
156 |
//LogComponentEnable("TcpVariantsComparison", LOG_LEVEL_ALL); |
|
188 |
//LogComponentEnable("DropTailQueue", LOG_LEVEL_ALL); |
158 |
//LogComponentEnable("DropTailQueue", LOG_LEVEL_ALL); |
189 |
|
159 |
|
190 |
// Calculate the ADU size |
160 |
// Calculate the ADU size |
191 |
Header* temp_header = new Ipv4Header(); |
161 |
Header* temp_header = new Ipv4Header (); |
192 |
uint32_t ip_header = temp_header->GetSerializedSize(); |
162 |
uint32_t ip_header = temp_header->GetSerializedSize (); |
193 |
NS_LOG_LOGIC ("IP Header size is: " << ip_header); |
163 |
NS_LOG_LOGIC ("IP Header size is: " << ip_header); |
194 |
delete temp_header; |
164 |
delete temp_header; |
195 |
temp_header = new TcpHeader(); |
165 |
temp_header = new TcpHeader (); |
196 |
uint32_t tcp_header = temp_header->GetSerializedSize(); |
166 |
uint32_t tcp_header = temp_header->GetSerializedSize (); |
197 |
NS_LOG_LOGIC ("TCP Header size is: " << tcp_header); |
167 |
NS_LOG_LOGIC ("TCP Header size is: " << tcp_header); |
198 |
delete temp_header; |
168 |
delete temp_header; |
199 |
uint32_t tcp_adu_size = mtu_bytes - (ip_header + tcp_header); |
169 |
uint32_t tcp_adu_size = mtu_bytes - (ip_header + tcp_header); |
|
204 |
float stop_time = start_time + duration; |
174 |
float stop_time = start_time + duration; |
205 |
|
175 |
|
206 |
// Select TCP variant |
176 |
// Select TCP variant |
207 |
if (transport_prot.compare("TcpTahoe") == 0) |
177 |
if (transport_prot.compare ("TcpTahoe") == 0) |
208 |
Config::SetDefault("ns3::TcpL4Protocol::SocketType", TypeIdValue (TcpTahoe::GetTypeId())); |
178 |
{ |
209 |
else if (transport_prot.compare("TcpReno") == 0) |
179 |
Config::SetDefault ("ns3::TcpL4Protocol::SocketType", TypeIdValue (TcpTahoe::GetTypeId ())); |
210 |
Config::SetDefault("ns3::TcpL4Protocol::SocketType", TypeIdValue (TcpReno::GetTypeId())); |
|
|
211 |
else if (transport_prot.compare("TcpNewReno") == 0) |
212 |
Config::SetDefault("ns3::TcpL4Protocol::SocketType", TypeIdValue (TcpNewReno::GetTypeId())); |
213 |
else if (transport_prot.compare("TcpWestwood") == 0) |
214 |
{// the default protocol type in ns3::TcpWestwood is WESTWOOD |
215 |
Config::SetDefault("ns3::TcpL4Protocol::SocketType", TypeIdValue (TcpWestwood::GetTypeId())); |
216 |
Config::SetDefault("ns3::TcpWestwood::FilterType", EnumValue(TcpWestwood::TUSTIN)); |
217 |
} |
180 |
} |
218 |
else if (transport_prot.compare("TcpWestwoodPlus") == 0) |
181 |
else if (transport_prot.compare ("TcpReno") == 0) |
219 |
{ |
182 |
{ |
220 |
Config::SetDefault("ns3::TcpL4Protocol::SocketType", TypeIdValue (TcpWestwood::GetTypeId())); |
183 |
Config::SetDefault ("ns3::TcpL4Protocol::SocketType", TypeIdValue (TcpReno::GetTypeId ())); |
221 |
Config::SetDefault("ns3::TcpWestwood::ProtocolType", EnumValue(TcpWestwood::WESTWOODPLUS)); |
184 |
} |
222 |
Config::SetDefault("ns3::TcpWestwood::FilterType", EnumValue(TcpWestwood::TUSTIN)); |
185 |
else if (transport_prot.compare ("TcpNewReno") == 0) |
|
|
186 |
{ |
187 |
Config::SetDefault ("ns3::TcpL4Protocol::SocketType", TypeIdValue (TcpNewReno::GetTypeId ())); |
188 |
} |
189 |
else if (transport_prot.compare ("TcpWestwood") == 0) |
190 |
{ // the default protocol type in ns3::TcpWestwood is WESTWOOD |
191 |
Config::SetDefault ("ns3::TcpL4Protocol::SocketType", TypeIdValue (TcpWestwood::GetTypeId ())); |
192 |
Config::SetDefault ("ns3::TcpWestwood::FilterType", EnumValue (TcpWestwood::TUSTIN)); |
193 |
} |
194 |
else if (transport_prot.compare ("TcpWestwoodPlus") == 0) |
195 |
{ |
196 |
Config::SetDefault ("ns3::TcpL4Protocol::SocketType", TypeIdValue (TcpWestwood::GetTypeId ())); |
197 |
Config::SetDefault ("ns3::TcpWestwood::ProtocolType", EnumValue (TcpWestwood::WESTWOODPLUS)); |
198 |
Config::SetDefault ("ns3::TcpWestwood::FilterType", EnumValue (TcpWestwood::TUSTIN)); |
223 |
} |
199 |
} |
224 |
else |
200 |
else |
225 |
{ |
201 |
{ |
|
231 |
NodeContainer gateways; |
207 |
NodeContainer gateways; |
232 |
gateways.Create (1); |
208 |
gateways.Create (1); |
233 |
NodeContainer sources; |
209 |
NodeContainer sources; |
234 |
sources.Create(num_flows); |
210 |
sources.Create (num_flows); |
235 |
NodeContainer sinks; |
211 |
NodeContainer sinks; |
236 |
sinks.Create(num_flows); |
212 |
sinks.Create (num_flows); |
237 |
|
213 |
|
238 |
// Configure the error model |
214 |
// Configure the error model |
239 |
// Here we use RateErrorModel with packet error rate |
215 |
// Here we use RateErrorModel with packet error rate |
240 |
Ptr<UniformRandomVariable> uv = CreateObject<UniformRandomVariable>(); |
216 |
Ptr<UniformRandomVariable> uv = CreateObject<UniformRandomVariable> (); |
241 |
uv->SetStream (50); |
217 |
uv->SetStream (50); |
242 |
RateErrorModel error_model; |
218 |
RateErrorModel error_model; |
243 |
error_model.SetRandomVariable(uv); |
219 |
error_model.SetRandomVariable (uv); |
244 |
error_model.SetUnit(RateErrorModel::ERROR_UNIT_PACKET); |
220 |
error_model.SetUnit (RateErrorModel::ERROR_UNIT_PACKET); |
245 |
error_model.SetRate(error_p); |
221 |
error_model.SetRate (error_p); |
246 |
|
222 |
|
247 |
PointToPointHelper UnReLink; |
223 |
PointToPointHelper UnReLink; |
248 |
UnReLink.SetDeviceAttribute ("DataRate", StringValue (bandwidth)); |
224 |
UnReLink.SetDeviceAttribute ("DataRate", StringValue (bandwidth)); |
|
262 |
LocalLink.SetDeviceAttribute ("DataRate", StringValue (access_bandwidth)); |
238 |
LocalLink.SetDeviceAttribute ("DataRate", StringValue (access_bandwidth)); |
263 |
LocalLink.SetChannelAttribute ("Delay", StringValue (access_delay)); |
239 |
LocalLink.SetChannelAttribute ("Delay", StringValue (access_delay)); |
264 |
Ipv4InterfaceContainer sink_interfaces; |
240 |
Ipv4InterfaceContainer sink_interfaces; |
265 |
for (int i=0; i<num_flows; i++) |
241 |
for (int i = 0; i < num_flows; i++) |
266 |
{ |
242 |
{ |
267 |
NetDeviceContainer devices; |
243 |
NetDeviceContainer devices; |
268 |
devices = LocalLink.Install(sources.Get(i), gateways.Get(0)); |
244 |
devices = LocalLink.Install (sources.Get (i), gateways.Get (0)); |
269 |
address.NewNetwork(); |
245 |
address.NewNetwork (); |
270 |
Ipv4InterfaceContainer interfaces = address.Assign (devices); |
246 |
Ipv4InterfaceContainer interfaces = address.Assign (devices); |
271 |
devices = UnReLink.Install(gateways.Get(0), sinks.Get(i)); |
247 |
devices = UnReLink.Install (gateways.Get (0), sinks.Get (i)); |
272 |
address.NewNetwork(); |
248 |
address.NewNetwork (); |
273 |
interfaces = address.Assign (devices); |
249 |
interfaces = address.Assign (devices); |
274 |
sink_interfaces.Add(interfaces.Get(1)); |
250 |
sink_interfaces.Add (interfaces.Get (1)); |
275 |
} |
251 |
} |
276 |
|
252 |
|
277 |
NS_LOG_INFO ("Initialize Global Routing."); |
253 |
NS_LOG_INFO ("Initialize Global Routing."); |
|
281 |
Address sinkLocalAddress (InetSocketAddress (Ipv4Address::GetAny (), port)); |
257 |
Address sinkLocalAddress (InetSocketAddress (Ipv4Address::GetAny (), port)); |
282 |
PacketSinkHelper sinkHelper ("ns3::TcpSocketFactory", sinkLocalAddress); |
258 |
PacketSinkHelper sinkHelper ("ns3::TcpSocketFactory", sinkLocalAddress); |
283 |
|
259 |
|
284 |
for(uint16_t i=0; i<sources.GetN(); i++) |
260 |
for (uint16_t i = 0; i < sources.GetN (); i++) |
285 |
{ |
261 |
{ |
286 |
AddressValue remoteAddress (InetSocketAddress (sink_interfaces.GetAddress(i, 0), port)); |
262 |
AddressValue remoteAddress (InetSocketAddress (sink_interfaces.GetAddress (i, 0), port)); |
287 |
|
263 |
|
288 |
if (transport_prot.compare("TcpTahoe") == 0 |
264 |
if (transport_prot.compare ("TcpTahoe") == 0 |
289 |
|| transport_prot.compare("TcpReno") == 0 |
265 |
|| transport_prot.compare ("TcpReno") == 0 |
290 |
|| transport_prot.compare("TcpNewReno") == 0 |
266 |
|| transport_prot.compare ("TcpNewReno") == 0 |
291 |
|| transport_prot.compare("TcpWestwood") == 0 |
267 |
|| transport_prot.compare ("TcpWestwood") == 0 |
292 |
|| transport_prot.compare("TcpWestwoodPlus") == 0) |
268 |
|| transport_prot.compare ("TcpWestwoodPlus") == 0) |
293 |
{ |
269 |
{ |
294 |
Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (tcp_adu_size)); |
270 |
Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (tcp_adu_size)); |
295 |
BulkSendHelper ftp("ns3::TcpSocketFactory", Address()); |
271 |
BulkSendHelper ftp ("ns3::TcpSocketFactory", Address ()); |
296 |
ftp.SetAttribute ("Remote", remoteAddress); |
272 |
ftp.SetAttribute ("Remote", remoteAddress); |
297 |
ftp.SetAttribute ("SendSize", UintegerValue (tcp_adu_size)); |
273 |
ftp.SetAttribute ("SendSize", UintegerValue (tcp_adu_size)); |
298 |
ftp.SetAttribute ("MaxBytes", UintegerValue (int(data_mbytes*1000000))); |
274 |
ftp.SetAttribute ("MaxBytes", UintegerValue (int(data_mbytes * 1000000))); |
299 |
|
275 |
|
300 |
ApplicationContainer sourceApp = ftp.Install (sources.Get(i)); |
276 |
ApplicationContainer sourceApp = ftp.Install (sources.Get (i)); |
301 |
sourceApp.Start (Seconds (start_time*i)); |
277 |
sourceApp.Start (Seconds (start_time * i)); |
302 |
sourceApp.Stop (Seconds (stop_time - 3)); |
278 |
sourceApp.Stop (Seconds (stop_time - 3)); |
303 |
|
279 |
|
304 |
sinkHelper.SetAttribute ("Protocol", TypeIdValue (TcpSocketFactory::GetTypeId ())); |
280 |
sinkHelper.SetAttribute ("Protocol", TypeIdValue (TcpSocketFactory::GetTypeId ())); |
305 |
ApplicationContainer sinkApp = sinkHelper.Install (sinks); |
281 |
ApplicationContainer sinkApp = sinkHelper.Install (sinks); |
306 |
sinkApp.Start (Seconds (start_time*i)); |
282 |
sinkApp.Start (Seconds (start_time * i)); |
307 |
sinkApp.Stop (Seconds (stop_time)); |
283 |
sinkApp.Stop (Seconds (stop_time)); |
308 |
} |
284 |
} |
309 |
else |
285 |
else |
|
318 |
{ |
294 |
{ |
319 |
std::ofstream ascii; |
295 |
std::ofstream ascii; |
320 |
Ptr<OutputStreamWrapper> ascii_wrap; |
296 |
Ptr<OutputStreamWrapper> ascii_wrap; |
321 |
if (tr_file_name.compare("") == 0) |
297 |
if (tr_file_name.compare ("") == 0) |
322 |
{ |
298 |
{ |
323 |
NS_LOG_DEBUG ("No trace file provided"); |
299 |
NS_LOG_DEBUG ("No trace file provided"); |
324 |
exit (1); |
300 |
exit (1); |
325 |
} |
301 |
} |
326 |
else |
302 |
else |
327 |
{ |
303 |
{ |
328 |
ascii.open (tr_file_name.c_str()); |
304 |
ascii.open (tr_file_name.c_str ()); |
329 |
ascii_wrap = new OutputStreamWrapper(tr_file_name.c_str(), std::ios::out); |
305 |
ascii_wrap = new OutputStreamWrapper (tr_file_name.c_str (), std::ios::out); |
330 |
} |
306 |
} |
331 |
|
307 |
|
332 |
stack.EnableAsciiIpv4All (ascii_wrap); |
308 |
stack.EnableAsciiIpv4All (ascii_wrap); |
333 |
|
309 |
|
334 |
Simulator::Schedule(Seconds(0.00001), &TraceCwnd, cwnd_tr_file_name); |
310 |
Simulator::Schedule (Seconds (0.00001), &TraceCwnd, cwnd_tr_file_name); |
335 |
Simulator::Schedule(Seconds(0.00001), &TraceSsThresh, ssthresh_tr_file_name); |
311 |
Simulator::Schedule (Seconds (0.00001), &TraceSsThresh, ssthresh_tr_file_name); |
336 |
} |
312 |
} |
337 |
|
313 |
|
338 |
UnReLink.EnablePcapAll("TcpVariantsComparison", true); |
314 |
UnReLink.EnablePcapAll ("TcpVariantsComparison", true); |
339 |
LocalLink.EnablePcapAll("TcpVariantsComparison", true); |
315 |
LocalLink.EnablePcapAll ("TcpVariantsComparison", true); |
340 |
|
316 |
|
341 |
// Flow monitor |
317 |
// Flow monitor |
342 |
FlowMonitorHelper flowHelper; |
318 |
FlowMonitorHelper flowHelper; |
343 |
if (flow_monitor) |
319 |
if (flow_monitor) |
344 |
{ |
320 |
{ |
345 |
flowHelper.InstallAll(); |
321 |
flowHelper.InstallAll (); |
346 |
} |
322 |
} |
347 |
|
323 |
|
348 |
Simulator::Stop (Seconds(stop_time)); |
324 |
Simulator::Stop (Seconds (stop_time)); |
349 |
Simulator::Run (); |
325 |
Simulator::Run (); |
350 |
|
326 |
|
351 |
if (flow_monitor) |
327 |
if (flow_monitor) |
352 |
{ |
328 |
{ |
353 |
flowHelper.SerializeToXmlFile("TcpVariantsComparison.flowmonitor", true, true); |
329 |
flowHelper.SerializeToXmlFile ("TcpVariantsComparison.flowmonitor", true, true); |
354 |
} |
330 |
} |
355 |
|
331 |
|
356 |
Simulator::Destroy (); |
332 |
Simulator::Destroy (); |