46 #include "ns3/core-module.h"
47 #include "ns3/internet-module.h"
48 #include "ns3/network-module.h"
49 #include "ns3/point-to-point-module.h"
50 #include "ns3/applications-module.h"
51 #include "ns3/onoff-application.h"
52 #include "ns3/packet-sink.h"
53 #include "ns3/simulator.h"
54 #include "ns3/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))
84 p (new T*[
x]), m_xMax (
x)
86 for (
size_t i = 0; i < m_xMax; i++)
92 for (
size_t i = 0; i < m_xMax; i++)
103 T* operator[] (
const size_t i)
116 template <
typename T>
128 for (
size_t i = 0; i < m_xMax; i++)
134 for (
size_t i = 0; i < m_xMax; i++)
158 main (
int argc,
char *argv[])
162 std::cout <<
" ==== DARPA NMS CAMPUS NETWORK SIMULATION ====" << std::endl;
165 int nCN = 2, nLANClients = 42;
167 bool useIpv6 =
false;
170 cmd.AddValue (
"useIPv6",
"Use IPv6 instead of IPv4", useIpv6);
171 cmd.AddValue (
"CN",
"Number of total CNs [2]", nCN);
172 cmd.AddValue (
"LAN",
"Number of nodes per LAN [42]", nLANClients);
173 cmd.AddValue (
"NIX",
"Toggle nix-vector routing", nix);
174 cmd.Parse (argc,argv);
178 std::cout <<
"This script can work in IPv6 only by using NIX"
184 std::cout <<
"Number of total CNs (" << nCN <<
") lower than minimum of 2"
189 std::cout <<
"Number of CNs: " << nCN <<
", LAN nodes: " << nLANClients << std::endl;
206 std::ostringstream oss;
220 stack.SetRoutingHelper (nixRouting);
225 stack.SetRoutingHelper (nixRouting);
230 for (
int z = 0; z < nCN; ++z)
232 std::cout <<
"Creating Campus Network " << z <<
":" << std::endl;
234 std::cout <<
" SubNet [ 0";
235 for (
int i = 0; i < 3; ++i)
237 nodes_net0[z][i].Create (1);
238 stack.Install (nodes_net0[z][i]);
240 nodes_net0[z][0].Add (nodes_net0[z][1].Get (0));
241 nodes_net0[z][1].Add (nodes_net0[z][2].Get (0));
242 nodes_net0[z][2].Add (nodes_net0[z][0].Get (0));
244 for (
int i = 0; i < 3; ++i)
246 ndc0[i] = p2p_1gb5ms.
Install (nodes_net0[z][i]);
250 for (
int i = 0; i < 6; ++i)
252 nodes_net1[z][i].Create (1);
253 stack.Install (nodes_net1[z][i]);
255 nodes_net1[z][0].Add (nodes_net1[z][1].Get (0));
256 nodes_net1[z][2].Add (nodes_net1[z][0].Get (0));
257 nodes_net1[z][3].Add (nodes_net1[z][0].Get (0));
258 nodes_net1[z][4].Add (nodes_net1[z][1].Get (0));
259 nodes_net1[z][5].Add (nodes_net1[z][1].Get (0));
261 for (
int i = 0; i < 6; ++i)
267 ndc1[i] = p2p_1gb5ms.
Install (nodes_net1[z][i]);
271 net0_1.
Add (nodes_net0[z][2].Get (0));
272 net0_1.
Add (nodes_net1[z][0].Get (0));
274 ndc0_1 = p2p_1gb5ms.
Install (net0_1);
278 oss << 10 + z <<
".1.252.0";
279 addressHelperv4.
SetBase (oss.str ().c_str (),
"255.255.255.0");
280 addressHelperv4.
Assign (ndc0_1);
284 oss << 2001 + z <<
":1:252::";
286 addressHelperv6.
Assign (ndc0_1);
290 for (
int i = 0; i < 14; ++i)
292 nodes_net2[z][i].Create (1);
293 stack.Install (nodes_net2[z][i]);
295 nodes_net2[z][0].Add (nodes_net2[z][1].Get (0));
296 nodes_net2[z][2].Add (nodes_net2[z][0].Get (0));
297 nodes_net2[z][1].Add (nodes_net2[z][3].Get (0));
298 nodes_net2[z][3].Add (nodes_net2[z][2].Get (0));
299 nodes_net2[z][4].Add (nodes_net2[z][2].Get (0));
300 nodes_net2[z][5].Add (nodes_net2[z][3].Get (0));
301 nodes_net2[z][6].Add (nodes_net2[z][5].Get (0));
302 nodes_net2[z][7].Add (nodes_net2[z][2].Get (0));
303 nodes_net2[z][8].Add (nodes_net2[z][3].Get (0));
304 nodes_net2[z][9].Add (nodes_net2[z][4].Get (0));
305 nodes_net2[z][10].Add (nodes_net2[z][5].Get (0));
306 nodes_net2[z][11].Add (nodes_net2[z][6].Get (0));
307 nodes_net2[z][12].Add (nodes_net2[z][6].Get (0));
308 nodes_net2[z][13].Add (nodes_net2[z][6].Get (0));
310 for (
int i = 0; i < 14; ++i)
312 ndc2[i] = p2p_1gb5ms.
Install (nodes_net2[z][i]);
315 for (
int i = 0; i < 7; ++i)
320 oss << 10 + z <<
".4." << 15 + i <<
".0";
321 addressHelperv4.
SetBase (oss.str ().c_str (),
"255.255.255.0");
325 oss << 2001 + z <<
":4:" << 15 + i <<
"::";
328 for (
int j = 0; j < nLANClients; ++j)
330 nodes_net2LAN[z][i][j].Create (1);
331 stack.Install (nodes_net2LAN[z][i][j]);
332 nodes_net2LAN[z][i][j].Add (nodes_net2[z][i+7].Get (0));
333 ndc2LAN[i][j] = p2p_100mb1ms.
Install (nodes_net2LAN[z][i][j]);
345 std::cout <<
" 3 ]" << std::endl;
346 for (
int i = 0; i < 9; ++i)
348 nodes_net3[z][i].Create (1);
349 stack.Install (nodes_net3[z][i]);
351 nodes_net3[z][0].Add (nodes_net3[z][1].Get (0));
352 nodes_net3[z][1].Add (nodes_net3[z][2].Get (0));
353 nodes_net3[z][2].Add (nodes_net3[z][3].Get (0));
354 nodes_net3[z][3].Add (nodes_net3[z][1].Get (0));
355 nodes_net3[z][4].Add (nodes_net3[z][0].Get (0));
356 nodes_net3[z][5].Add (nodes_net3[z][0].Get (0));
357 nodes_net3[z][6].Add (nodes_net3[z][2].Get (0));
358 nodes_net3[z][7].Add (nodes_net3[z][3].Get (0));
359 nodes_net3[z][8].Add (nodes_net3[z][3].Get (0));
361 for (
int i = 0; i < 9; ++i)
363 ndc3[i] = p2p_1gb5ms.
Install (nodes_net3[z][i]);
366 for (
int i = 0; i < 5; ++i)
371 oss << 10 + z <<
".5." << 10 + i <<
".0";
372 addressHelperv4.
SetBase (oss.str ().c_str (),
"255.255.255.0");
376 oss << 2001 + z <<
":5:" << 10 + i <<
"::";
380 for (
int j = 0; j < nLANClients; ++j)
382 nodes_net3LAN[z][i][j].Create (1);
383 stack.Install (nodes_net3LAN[z][i][j]);
384 nodes_net3LAN[z][i][j].Add (nodes_net3[z][i+4].Get (0));
385 ndc3LAN[i][j] = p2p_100mb1ms.
Install (nodes_net3LAN[z][i][j]);
396 std::cout <<
" Connecting Subnets..." << std::endl;
398 nodes_netLR[z].
Create (2);
399 stack.Install (nodes_netLR[z]);
401 ndcLR = p2p_1gb5ms.
Install (nodes_netLR[z]);
403 NodeContainer net0_4, net0_5, net2_4a, net2_4b, net3_5a, net3_5b;
404 net0_4.
Add (nodes_netLR[z].Get (0));
405 net0_4.
Add (nodes_net0[z][0].Get (0));
406 net0_5.
Add (nodes_netLR[z].Get (1));
407 net0_5.
Add (nodes_net0[z][1].Get (0));
408 net2_4a.
Add (nodes_netLR[z].Get (0));
409 net2_4a.
Add (nodes_net2[z][0].Get (0));
410 net2_4b.
Add (nodes_netLR[z].Get (1));
411 net2_4b.
Add (nodes_net2[z][1].Get (0));
412 net3_5a.
Add (nodes_netLR[z].Get (1));
413 net3_5a.
Add (nodes_net3[z][0].Get (0));
414 net3_5b.
Add (nodes_netLR[z].Get (1));
415 net3_5b.
Add (nodes_net3[z][1].Get (0));
417 ndc0_4 = p2p_1gb5ms.
Install (net0_4);
418 ndc0_5 = p2p_1gb5ms.
Install (net0_5);
419 ndc2_4a = p2p_1gb5ms.
Install (net2_4a);
420 ndc2_4b = p2p_1gb5ms.
Install (net2_4b);
421 ndc3_5a = p2p_1gb5ms.
Install (net3_5a);
422 ndc3_5b = p2p_1gb5ms.
Install (net3_5b);
430 oss << 10 + z <<
".1.253.0";
431 addressHelperv4.
SetBase (oss.str ().c_str (),
"255.255.255.0");
432 addressHelperv4.
Assign (ndc0_4);
435 oss << 10 + z <<
".1.254.0";
436 addressHelperv4.
SetBase (oss.str ().c_str (),
"255.255.255.0");
437 addressHelperv4.
Assign (ndc0_5);
440 oss << 10 + z <<
".4.253.0";
441 addressHelperv4.
SetBase (oss.str ().c_str (),
"255.255.255.0");
442 addressHelperv4.
Assign (ndc2_4a);
445 oss << 10 + z <<
".4.254.0";
446 addressHelperv4.
SetBase (oss.str ().c_str (),
"255.255.255.0");
447 addressHelperv4.
Assign (ndc2_4b);
450 oss << 10 + z <<
".5.253.0";
451 addressHelperv4.
SetBase (oss.str ().c_str (),
"255.255.255.0");
452 addressHelperv4.
Assign (ndc3_5a);
455 oss << 10 + z <<
".5.254.0";
456 addressHelperv4.
SetBase (oss.str ().c_str (),
"255.255.255.0");
457 addressHelperv4.
Assign (ndc3_5b);
463 oss << 2001 + z <<
":1:253::";
465 addressHelperv6.
Assign (ndc0_4);
468 oss << 2001 + z <<
":1:254::";
470 addressHelperv6.
Assign (ndc0_5);
473 oss << 2001 + z <<
":4:253::";
475 addressHelperv6.
Assign (ndc2_4a);
478 oss << 2001 + z <<
":4:254::";
480 addressHelperv6.
Assign (ndc2_4b);
483 oss << 2001 + z <<
":5:253::";
485 addressHelperv6.
Assign (ndc3_5a);
488 oss << 2001 + z <<
":5:254::";
490 addressHelperv6.
Assign (ndc3_5b);
494 std::cout <<
" Assigning IP addresses..." << std::endl;
495 for (
int i = 0; i < 3; ++i)
500 oss << 10 + z <<
".1." << 1 + i <<
".0";
501 addressHelperv4.
SetBase (oss.str ().c_str (),
"255.255.255.0");
502 addressHelperv4.
Assign (ndc0[i]);
506 oss << 2001 + z <<
":1:" << 1 + i <<
"::";
508 addressHelperv6.
Assign (ndc0[i]);
511 for (
int i = 0; i < 6; ++i)
520 oss << 10 + z <<
".2." << 1 + i <<
".0";
521 addressHelperv4.
SetBase (oss.str ().c_str (),
"255.255.255.0");
522 addressHelperv4.
Assign (ndc1[i]);
526 oss << 2001 + z <<
":2:" << 1 + i <<
"::";
528 addressHelperv6.
Assign (ndc1[i]);
534 oss << 10 + z <<
".3.1.0";
535 addressHelperv4.
SetBase (oss.str ().c_str (),
"255.255.255.0");
536 addressHelperv4.
Assign (ndcLR);
540 oss << 2001 + z <<
":3:1::";
542 addressHelperv6.
Assign (ndcLR);
545 for (
int i = 0; i < 14; ++i)
550 oss << 10 + z <<
".4." << 1 + i <<
".0";
551 addressHelperv4.
SetBase (oss.str ().c_str (),
"255.255.255.0");
552 addressHelperv4.
Assign (ndc2[i]);
556 oss << 2001 + z <<
":4:" << 1 + i <<
"::";
558 addressHelperv6.
Assign (ndc2[i]);
562 for (
int i = 0; i < 9; ++i)
567 oss << 10 + z <<
".5." << 1 + i <<
".0";
568 addressHelperv4.
SetBase (oss.str ().c_str (),
"255.255.255.0");
569 addressHelperv4.
Assign (ndc3[i]);
573 oss << 2001 + z <<
":5:" << 1 + i <<
"::";
575 addressHelperv6.
Assign (ndc3[i]);
582 std::cout <<
"Forming Ring Topology..." << std::endl;
584 for (
int z = 0; z < nCN-1; ++z)
586 nodes_ring[z].
Add (nodes_net0[z][0].Get (0));
587 nodes_ring[z].
Add (nodes_net0[z+1][0].Get (0));
589 nodes_ring[nCN-1].
Add (nodes_net0[nCN-1][0].Get (0));
590 nodes_ring[nCN-1].
Add (nodes_net0[0][0].Get (0));
592 for (
int z = 0; z < nCN; ++z)
594 ndc_ring[z] = p2p_2gb200ms.
Install (nodes_ring[z]);
598 oss <<
"254.1." << z + 1 <<
".0";
599 addressHelperv4.
SetBase (oss.str ().c_str (),
"255.255.255.0");
600 addressHelperv4.
Assign (ndc_ring[z]);
604 oss <<
"254:1:" << z + 1 <<
"::";
606 addressHelperv6.
Assign (ndc_ring[z]);
614 std::cout <<
"Creating TCP Traffic Flows:" << std::endl;
617 StringValue (
"ns3::ConstantRandomVariable[Constant=1.0]"));
619 StringValue (
"ns3::ConstantRandomVariable[Constant=0.0]"));
636 for (
int z = 0; z < nCN; ++z)
644 std::cout <<
" Campus Network " << z <<
" Flows [ Net2 ";
645 for (
int i = 0; i < 7; ++i)
647 for (
int j = 0; j < nLANClients; ++j)
652 nodes_net2LAN[z][i][j].Get (0));
655 r1 = 2 + (int)(4 * urng->
GetValue ());
658 AddressValue remoteAddress (ifs2LanRemoteAddress[z][i][j]);
659 client.SetAttribute (
"Remote", remoteAddress);
661 clientApp.
Add (client.Install (nodes_net1[
x][r1].Get (0)));
666 std::cout <<
"Net3 ]" << std::endl;
667 for (
int i = 0; i < 5; ++i)
669 for (
int j = 0; j < nLANClients; ++j)
674 nodes_net3LAN[z][i][j].Get (0));
677 r1 = 2 + (int)(4 * urng->
GetValue ());
680 AddressValue remoteAddress (ifs3LanRemoteAddress[z][i][j]);
681 client.SetAttribute (
"Remote", remoteAddress);
683 clientApp.
Add (client.Install (nodes_net1[
x][r1].Get (0)));
696 std::cout <<
"Using Nix-vectors..." << std::endl;
701 std::cout <<
"Populating Global Static Routing Tables..." << std::endl;
707 std::cout <<
"Routing tables population took "
708 <<
TIMER_DIFF (routingEnd, routingStart) << std::endl;
711 std::cout <<
"Running simulator..." << std::endl;
716 std::cout <<
"Simulator finished." << std::endl;
720 std::cout <<
"-----" << std::endl <<
"Runtime Stats:" << std::endl;
721 std::cout <<
"Simulator init time: " << d1 << std::endl;
722 std::cout <<
"Simulator run time: " << d2 << std::endl;
723 std::cout <<
"Total elapsed time: " << d1+d2 << std::endl;
725 delete[] nodes_netLR;