41 #include "ns3/core-module.h"
42 #include "ns3/internet-module.h"
43 #include "ns3/network-module.h"
44 #include "ns3/on-off-helper.h"
45 #include "ns3/packet-sink-helper.h"
46 #include "ns3/point-to-point-helper.h"
47 #include "ns3/mpi-interface.h"
48 #include "ns3/ipv4-static-routing-helper.h"
49 #include "ns3/ipv4-list-routing-helper.h"
50 #include "ns3/ipv4-nix-vector-helper.h"
59 #define TIMER_NOW(_t) gettimeofday (&_t,NULL);
60 #define TIMER_SECONDS(_t) ((double)(_t).tv_sec + (_t).tv_usec * 1e-6)
61 #define TIMER_DIFF(_t1, _t2) (TIMER_SECONDS (_t1) - TIMER_SECONDS (_t2))
71 main (
int argc,
char *argv[])
79 std::cout <<
" ==== DARPA NMS CAMPUS NETWORK SIMULATION ====" << std::endl;
89 #define nLANClients (42)
98 cmd.
AddValue (
"single",
"1 if use single flow", single);
99 cmd.
AddValue (
"nBytes",
"Number of bytes for each on/off app", nBytes);
100 cmd.
AddValue (
"nix",
"Toggle the use of nix-vector or global routing", nix);
101 cmd.
Parse (argc,argv);
105 std::cout <<
"Number of total CNs (" << nCN <<
") lower than minimum of 2"
109 if (systemCount > nCN)
111 std::cout <<
"Number of total CNs (" << nCN <<
") should be >= systemCount ("
112 << systemCount <<
")." << std::endl;
116 std::cout <<
"Number of CNs: " << nCN <<
", LAN nodes: " << nLANClients << std::endl;
118 NodeContainer nodes_net0[nCN][3], nodes_net1[nCN][6], nodes_netLR[nCN],
119 nodes_net2[nCN][14], nodes_net2LAN[nCN][7][nLANClients],
120 nodes_net3[nCN][9], nodes_net3LAN[nCN][5][nLANClients];
124 ifs3[nCN][9], ifs2LAN[nCN][7][nLANClients],
125 ifs3LAN[nCN][5][nLANClients];
127 std::ostringstream oss;
139 list.
Add (staticRouting, 0);
140 list.
Add (nixRouting, 10);
148 for (uint32_t z = 0; z < nCN; ++z)
150 std::cout <<
"Creating Campus Network " << z <<
":" << std::endl;
152 std::cout <<
" SubNet [ 0";
153 for (
int i = 0; i < 3; ++i)
155 Ptr<Node> node = CreateObject<Node> (z % systemCount);
156 nodes_net0[z][i].
Add (node);
157 stack.
Install (nodes_net0[z][i]);
159 nodes_net0[z][0].
Add (nodes_net0[z][1].Get (0));
160 nodes_net0[z][1].
Add (nodes_net0[z][2].Get (0));
161 nodes_net0[z][2].
Add (nodes_net0[z][0].Get (0));
163 for (
int i = 0; i < 3; ++i)
165 ndc0[i] = p2p_1gb5ms.
Install (nodes_net0[z][i]);
169 for (
int i = 0; i < 6; ++i)
171 Ptr<Node> node = CreateObject<Node> (z % systemCount);
172 nodes_net1[z][i].
Add (node);
173 stack.
Install (nodes_net1[z][i]);
175 nodes_net1[z][0].
Add (nodes_net1[z][1].Get (0));
176 nodes_net1[z][2].
Add (nodes_net1[z][0].Get (0));
177 nodes_net1[z][3].
Add (nodes_net1[z][0].Get (0));
178 nodes_net1[z][4].
Add (nodes_net1[z][1].Get (0));
179 nodes_net1[z][5].
Add (nodes_net1[z][1].Get (0));
181 for (
int i = 0; i < 6; ++i)
187 ndc1[i] = p2p_1gb5ms.
Install (nodes_net1[z][i]);
191 net0_1.
Add (nodes_net0[z][2].Get (0));
192 net0_1.
Add (nodes_net1[z][0].Get (0));
194 ndc0_1 = p2p_1gb5ms.
Install (net0_1);
196 oss << 10 + z <<
".1.252.0";
197 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
198 ifs = address.
Assign (ndc0_1);
201 for (
int i = 0; i < 14; ++i)
203 Ptr<Node> node = CreateObject<Node> (z % systemCount);
204 nodes_net2[z][i].
Add (node);
205 stack.
Install (nodes_net2[z][i]);
207 nodes_net2[z][0].
Add (nodes_net2[z][1].Get (0));
208 nodes_net2[z][2].
Add (nodes_net2[z][0].Get (0));
209 nodes_net2[z][1].
Add (nodes_net2[z][3].Get (0));
210 nodes_net2[z][3].
Add (nodes_net2[z][2].Get (0));
211 nodes_net2[z][4].
Add (nodes_net2[z][2].Get (0));
212 nodes_net2[z][5].
Add (nodes_net2[z][3].Get (0));
213 nodes_net2[z][6].
Add (nodes_net2[z][5].Get (0));
214 nodes_net2[z][7].
Add (nodes_net2[z][2].Get (0));
215 nodes_net2[z][8].
Add (nodes_net2[z][3].Get (0));
216 nodes_net2[z][9].
Add (nodes_net2[z][4].Get (0));
217 nodes_net2[z][10].
Add (nodes_net2[z][5].Get (0));
218 nodes_net2[z][11].
Add (nodes_net2[z][6].Get (0));
219 nodes_net2[z][12].
Add (nodes_net2[z][6].Get (0));
220 nodes_net2[z][13].
Add (nodes_net2[z][6].Get (0));
222 for (
int i = 0; i < 14; ++i)
224 ndc2[i] = p2p_1gb5ms.
Install (nodes_net2[z][i]);
227 for (
int i = 0; i < 7; ++i)
230 oss << 10 + z <<
".4." << 15 + i <<
".0";
231 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
232 for (uint32_t j = 0; j < nLANClients; ++j)
234 Ptr<Node> node = CreateObject<Node> (z % systemCount);
235 nodes_net2LAN[z][i][j].
Add (node);
236 stack.
Install (nodes_net2LAN[z][i][j]);
237 nodes_net2LAN[z][i][j].
Add (nodes_net2[z][i + 7].Get (0));
238 ndc2LAN[i][j] = p2p_100mb1ms.
Install (nodes_net2LAN[z][i][j]);
239 ifs2LAN[z][i][j] = address.
Assign (ndc2LAN[i][j]);
243 std::cout <<
" 3 ]" << std::endl;
244 for (
int i = 0; i < 9; ++i)
246 Ptr<Node> node = CreateObject<Node> (z % systemCount);
247 nodes_net3[z][i].
Add (node);
248 stack.
Install (nodes_net3[z][i]);
250 nodes_net3[z][0].
Add (nodes_net3[z][1].Get (0));
251 nodes_net3[z][1].
Add (nodes_net3[z][2].Get (0));
252 nodes_net3[z][2].
Add (nodes_net3[z][3].Get (0));
253 nodes_net3[z][3].
Add (nodes_net3[z][1].Get (0));
254 nodes_net3[z][4].
Add (nodes_net3[z][0].Get (0));
255 nodes_net3[z][5].
Add (nodes_net3[z][0].Get (0));
256 nodes_net3[z][6].
Add (nodes_net3[z][2].Get (0));
257 nodes_net3[z][7].
Add (nodes_net3[z][3].Get (0));
258 nodes_net3[z][8].
Add (nodes_net3[z][3].Get (0));
260 for (
int i = 0; i < 9; ++i)
262 ndc3[i] = p2p_1gb5ms.
Install (nodes_net3[z][i]);
265 for (
int i = 0; i < 5; ++i)
268 oss << 10 + z <<
".5." << 10 + i <<
".0";
269 address.
SetBase (oss.str ().c_str (),
"255.255.255.255");
270 for (uint32_t j = 0; j < nLANClients; ++j)
272 Ptr<Node> node = CreateObject<Node> (z % systemCount);
273 nodes_net3LAN[z][i][j].
Add (node);
274 stack.
Install (nodes_net3LAN[z][i][j]);
275 nodes_net3LAN[z][i][j].
Add (nodes_net3[z][i + 4].Get (0));
276 ndc3LAN[i][j] = p2p_100mb1ms.
Install (nodes_net3LAN[z][i][j]);
277 ifs3LAN[z][i][j] = address.
Assign (ndc3LAN[i][j]);
280 std::cout <<
" Connecting Subnets..." << std::endl;
282 Ptr<Node> node1 = CreateObject<Node> (z % systemCount);
283 Ptr<Node> node2 = CreateObject<Node> (z % systemCount);
284 nodes_netLR[z].
Add (node1);
285 nodes_netLR[z].
Add (node2);
286 stack.
Install (nodes_netLR[z]);
288 ndcLR = p2p_1gb5ms.
Install (nodes_netLR[z]);
290 NodeContainer net0_4, net0_5, net2_4a, net2_4b, net3_5a, net3_5b;
291 net0_4.
Add (nodes_netLR[z].Get (0));
292 net0_4.
Add (nodes_net0[z][0].Get (0));
293 net0_5.
Add (nodes_netLR[z].Get (1));
294 net0_5.
Add (nodes_net0[z][1].Get (0));
295 net2_4a.
Add (nodes_netLR[z].Get (0));
296 net2_4a.
Add (nodes_net2[z][0].Get (0));
297 net2_4b.
Add (nodes_netLR[z].Get (1));
298 net2_4b.
Add (nodes_net2[z][1].Get (0));
299 net3_5a.
Add (nodes_netLR[z].Get (1));
300 net3_5a.
Add (nodes_net3[z][0].Get (0));
301 net3_5b.
Add (nodes_netLR[z].Get (1));
302 net3_5b.
Add (nodes_net3[z][1].Get (0));
304 ndc0_4 = p2p_1gb5ms.
Install (net0_4);
306 oss << 10 + z <<
".1.253.0";
307 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
308 ifs = address.
Assign (ndc0_4);
309 ndc0_5 = p2p_1gb5ms.
Install (net0_5);
311 oss << 10 + z <<
".1.254.0";
312 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
313 ifs = address.
Assign (ndc0_5);
314 ndc2_4a = p2p_1gb5ms.
Install (net2_4a);
316 oss << 10 + z <<
".4.253.0";
317 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
318 ifs = address.
Assign (ndc2_4a);
319 ndc2_4b = p2p_1gb5ms.
Install (net2_4b);
321 oss << 10 + z <<
".4.254.0";
322 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
323 ifs = address.
Assign (ndc2_4b);
324 ndc3_5a = p2p_1gb5ms.
Install (net3_5a);
326 oss << 10 + z <<
".5.253.0";
327 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
328 ifs = address.
Assign (ndc3_5a);
329 ndc3_5b = p2p_1gb5ms.
Install (net3_5b);
331 oss << 10 + z <<
".5.254.0";
332 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
333 ifs = address.
Assign (ndc3_5b);
335 std::cout <<
" Assigning IP addresses..." << std::endl;
336 for (
int i = 0; i < 3; ++i)
339 oss << 10 + z <<
".1." << 1 + i <<
".0";
340 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
341 ifs0[z][i] = address.
Assign (ndc0[i]);
343 for (
int i = 0; i < 6; ++i)
350 oss << 10 + z <<
".2." << 1 + i <<
".0";
351 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
352 ifs1[z][i] = address.
Assign (ndc1[i]);
355 oss << 10 + z <<
".3.1.0";
356 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
357 ifs = address.
Assign (ndcLR);
358 for (
int i = 0; i < 14; ++i)
361 oss << 10 + z <<
".4." << 1 + i <<
".0";
362 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
363 ifs2[z][i] = address.
Assign (ndc2[i]);
365 for (
int i = 0; i < 9; ++i)
368 oss << 10 + z <<
".5." << 1 + i <<
".0";
369 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
370 ifs3[z][i] = address.
Assign (ndc3[i]);
376 std::cout <<
"Forming Ring Topology..." << std::endl;
378 for (uint32_t z = 0; z < nCN - 1; ++z)
380 nodes_ring[z].
Add (nodes_net0[z][0].Get (0));
381 nodes_ring[z].
Add (nodes_net0[z + 1][0].Get (0));
383 nodes_ring[nCN - 1].
Add (nodes_net0[nCN - 1][0].Get (0));
384 nodes_ring[nCN - 1].
Add (nodes_net0[0][0].Get (0));
386 for (uint32_t z = 0; z < nCN; ++z)
388 ndc_ring[z] = p2p_2gb200ms.
Install (nodes_ring[z]);
390 oss <<
"254.1." << z + 1 <<
".0";
391 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
392 ifs = address.
Assign (ndc_ring[z]);
397 std::cout <<
"Creating UDP Traffic Flows:" << std::endl;
401 StringValue (
"ns3::ConstantRandomVariable[Constant=1]"));
403 StringValue (
"ns3::ConstantRandomVariable[Constant=0]"));
408 if (systemCount == 1)
414 sinkApp.
Start (Seconds (0.0));
418 std::cout <<
"Remote Address is " << ifs1[0][2].
GetAddress (0) << std::endl;
422 clientApp.
Add (client.
Install (nodes_net2LAN[0][0][0].
Get (0)));
423 clientApp.
Start (Seconds (0));
425 else if (systemId == 1)
431 sinkHelper.
Install (nodes_net1[1][0].Get (0));
433 sinkApp.
Start (Seconds (0.0));
435 else if (systemId == 0)
441 std::cout <<
"Remote Address is " << ifs1[1][0].
GetAddress (0) << std::endl;
445 clientApp.
Add (client.
Install (nodes_net2LAN[0][0][0].
Get (0)));
446 clientApp.
Start (Seconds (0));
454 for (uint32_t z = 0; z < nCN; ++z)
462 std::cout <<
" Campus Network " << z <<
" Flows [ Net2 ";
463 for (
int i = 0; i < 7; ++i)
465 for (uint32_t j = 0; j < nLANClients; ++j)
468 if (systemCount == 1)
471 (
"ns3::UdpSocketFactory",
475 sinkHelper.
Install (nodes_net2LAN[z][i][j].Get (0));
477 sinkApp.
Start (Seconds (0.0));
479 else if (systemId == z % systemCount)
482 (
"ns3::UdpSocketFactory",
486 sinkHelper.
Install (nodes_net2LAN[z][i][j].Get (0));
488 sinkApp.
Start (Seconds (0.0));
491 if (systemCount == 1)
493 r1 = 2 + (int)(4 * urng->
GetValue ());
503 clientApp.
Start (Seconds (r2));
505 else if (systemId == x % systemCount)
507 r1 = 2 + (int)(4 * urng->
GetValue ());
517 clientApp.
Start (Seconds (r2));
522 std::cout <<
"Net3 ]" << std::endl;
523 for (
int i = 0; i < 5; ++i)
525 for (uint32_t j = 0; j < nLANClients; ++j)
528 if (systemCount == 1)
531 (
"ns3::UdpSocketFactory",
535 sinkHelper.
Install (nodes_net3LAN[z][i][j].Get (0));
537 sinkApp.
Start (Seconds (0.0));
539 else if (systemId == z % systemCount)
542 (
"ns3::UdpSocketFactory",
546 sinkHelper.
Install (nodes_net3LAN[z][i][j].Get (0));
548 sinkApp.
Start (Seconds (0.0));
551 if (systemCount == 1)
553 r1 = 2 + (int)(4 * urng->
GetValue ());
563 clientApp.
Start (Seconds (r2));
565 else if (systemId == x % systemCount)
567 r1 = 2 + (int)(4 * urng->
GetValue ());
577 clientApp.
Start (Seconds (r2));
590 std::cout <<
"Using Nix-vectors..." << std::endl;
595 std::cout <<
"Populating Routing tables..." << std::endl;
601 std::cout <<
"Routing tables population took "
602 <<
TIMER_DIFF (routingEnd, routingStart) << std::endl;
604 std::cout <<
"Running simulator..." << std::endl;
609 std::cout <<
"Simulator finished." << std::endl;
614 std::cout <<
"-----" << std::endl <<
"Runtime Stats:" << std::endl;
615 std::cout <<
"Simulator init time: " << d1 << std::endl;
616 std::cout <<
"Simulator run time: " << d2 << std::endl;
617 std::cout <<
"Total elapsed time: " << d1 + d2 << std::endl;
620 NS_FATAL_ERROR (
"Can't use distributed simulator without MPI compiled in");