39 #include "ns3/core-module.h" 40 #include "ns3/internet-module.h" 41 #include "ns3/network-module.h" 42 #include "ns3/point-to-point-module.h" 43 #include "ns3/applications-module.h" 44 #include "ns3/onoff-application.h" 45 #include "ns3/packet-sink.h" 46 #include "ns3/simulator.h" 47 #include "ns3/ipv4-nix-vector-helper.h" 52 #define TIMER_NOW(_t) gettimeofday (&_t,NULL); 53 #define TIMER_SECONDS(_t) ((double)(_t).tv_sec + (_t).tv_usec*1e-6) 54 #define TIMER_DIFF(_t1, _t2) (TIMER_SECONDS (_t1)-TIMER_SECONDS (_t2)) 77 p (new T*[
x]), m_xMax (
x)
79 for (
size_t i = 0; i < m_xMax; i++)
85 for (
size_t i = 0; i < m_xMax; i++)
96 T* operator[] (
const size_t i)
109 template <
typename T>
121 for (
size_t i = 0; i < m_xMax; i++)
127 for (
size_t i = 0; i < m_xMax; i++)
151 main (
int argc,
char *argv[])
155 std::cout <<
" ==== DARPA NMS CAMPUS NETWORK SIMULATION ====" << std::endl;
158 int nCN = 2, nLANClients = 42;
162 cmd.AddValue (
"CN",
"Number of total CNs [2]", nCN);
163 cmd.AddValue (
"LAN",
"Number of nodes per LAN [42]", nLANClients);
164 cmd.AddValue (
"NIX",
"Toggle nix-vector routing", nix);
165 cmd.Parse (argc,argv);
169 std::cout <<
"Number of total CNs (" << nCN <<
") lower than minimum of 2" 174 std::cout <<
"Number of CNs: " << nCN <<
", LAN nodes: " << nLANClients << std::endl;
195 std::ostringstream oss;
207 stack.SetRoutingHelper (nixRouting);
211 for (
int z = 0; z < nCN; ++z)
213 std::cout <<
"Creating Campus Network " << z <<
":" << std::endl;
215 std::cout <<
" SubNet [ 0";
216 for (
int i = 0; i < 3; ++i)
218 nodes_net0[z][i].Create (1);
219 stack.Install (nodes_net0[z][i]);
221 nodes_net0[z][0].Add (nodes_net0[z][1].Get (0));
222 nodes_net0[z][1].Add (nodes_net0[z][2].Get (0));
223 nodes_net0[z][2].Add (nodes_net0[z][0].Get (0));
225 for (
int i = 0; i < 3; ++i)
227 ndc0[i] = p2p_1gb5ms.
Install (nodes_net0[z][i]);
231 for (
int i = 0; i < 6; ++i)
233 nodes_net1[z][i].Create (1);
234 stack.Install (nodes_net1[z][i]);
236 nodes_net1[z][0].Add (nodes_net1[z][1].Get (0));
237 nodes_net1[z][2].Add (nodes_net1[z][0].Get (0));
238 nodes_net1[z][3].Add (nodes_net1[z][0].Get (0));
239 nodes_net1[z][4].Add (nodes_net1[z][1].Get (0));
240 nodes_net1[z][5].Add (nodes_net1[z][1].Get (0));
242 for (
int i = 0; i < 6; ++i)
248 ndc1[i] = p2p_1gb5ms.
Install (nodes_net1[z][i]);
252 net0_1.
Add (nodes_net0[z][2].Get (0));
253 net0_1.
Add (nodes_net1[z][0].Get (0));
255 ndc0_1 = p2p_1gb5ms.
Install (net0_1);
257 oss << 10 + z <<
".1.252.0";
258 address.SetBase (oss.str ().c_str (),
"255.255.255.0");
262 for (
int i = 0; i < 14; ++i)
264 nodes_net2[z][i].Create (1);
265 stack.Install (nodes_net2[z][i]);
267 nodes_net2[z][0].Add (nodes_net2[z][1].Get (0));
268 nodes_net2[z][2].Add (nodes_net2[z][0].Get (0));
269 nodes_net2[z][1].Add (nodes_net2[z][3].Get (0));
270 nodes_net2[z][3].Add (nodes_net2[z][2].Get (0));
271 nodes_net2[z][4].Add (nodes_net2[z][2].Get (0));
272 nodes_net2[z][5].Add (nodes_net2[z][3].Get (0));
273 nodes_net2[z][6].Add (nodes_net2[z][5].Get (0));
274 nodes_net2[z][7].Add (nodes_net2[z][2].Get (0));
275 nodes_net2[z][8].Add (nodes_net2[z][3].Get (0));
276 nodes_net2[z][9].Add (nodes_net2[z][4].Get (0));
277 nodes_net2[z][10].Add (nodes_net2[z][5].Get (0));
278 nodes_net2[z][11].Add (nodes_net2[z][6].Get (0));
279 nodes_net2[z][12].Add (nodes_net2[z][6].Get (0));
280 nodes_net2[z][13].Add (nodes_net2[z][6].Get (0));
282 for (
int i = 0; i < 14; ++i)
284 ndc2[i] = p2p_1gb5ms.
Install (nodes_net2[z][i]);
288 for (
int i = 0; i < 7; ++i)
291 oss << 10 + z <<
".4." << 15 + i <<
".0";
292 address.SetBase (oss.str ().c_str (),
"255.255.255.0");
293 for (
int j = 0; j < nLANClients; ++j)
295 nodes_net2LAN[z][i][j].Create (1);
296 stack.Install (nodes_net2LAN[z][i][j]);
297 nodes_net2LAN[z][i][j].Add (nodes_net2[z][i+7].Get (0));
298 ndc2LAN[i][j] = p2p_100mb1ms.
Install (nodes_net2LAN[z][i][j]);
299 ifs2LAN[z][i][j] =
address.Assign (ndc2LAN[i][j]);
303 std::cout <<
" 3 ]" << std::endl;
304 for (
int i = 0; i < 9; ++i)
306 nodes_net3[z][i].Create (1);
307 stack.Install (nodes_net3[z][i]);
309 nodes_net3[z][0].Add (nodes_net3[z][1].Get (0));
310 nodes_net3[z][1].Add (nodes_net3[z][2].Get (0));
311 nodes_net3[z][2].Add (nodes_net3[z][3].Get (0));
312 nodes_net3[z][3].Add (nodes_net3[z][1].Get (0));
313 nodes_net3[z][4].Add (nodes_net3[z][0].Get (0));
314 nodes_net3[z][5].Add (nodes_net3[z][0].Get (0));
315 nodes_net3[z][6].Add (nodes_net3[z][2].Get (0));
316 nodes_net3[z][7].Add (nodes_net3[z][3].Get (0));
317 nodes_net3[z][8].Add (nodes_net3[z][3].Get (0));
319 for (
int i = 0; i < 9; ++i)
321 ndc3[i] = p2p_1gb5ms.
Install (nodes_net3[z][i]);
325 for (
int i = 0; i < 5; ++i)
328 oss << 10 + z <<
".5." << 10 + i <<
".0";
329 address.SetBase (oss.str ().c_str (),
"255.255.255.255");
330 for (
int j = 0; j < nLANClients; ++j)
332 nodes_net3LAN[z][i][j].Create (1);
333 stack.Install (nodes_net3LAN[z][i][j]);
334 nodes_net3LAN[z][i][j].Add (nodes_net3[z][i+4].Get (0));
335 ndc3LAN[i][j] = p2p_100mb1ms.
Install (nodes_net3LAN[z][i][j]);
336 ifs3LAN[z][i][j] =
address.Assign (ndc3LAN[i][j]);
339 std::cout <<
" Connecting Subnets..." << std::endl;
341 nodes_netLR[z].
Create (2);
342 stack.Install (nodes_netLR[z]);
344 ndcLR = p2p_1gb5ms.
Install (nodes_netLR[z]);
346 NodeContainer net0_4, net0_5, net2_4a, net2_4b, net3_5a, net3_5b;
347 net0_4.
Add (nodes_netLR[z].Get (0));
348 net0_4.
Add (nodes_net0[z][0].Get (0));
349 net0_5.
Add (nodes_netLR[z].Get (1));
350 net0_5.
Add (nodes_net0[z][1].Get (0));
351 net2_4a.
Add (nodes_netLR[z].Get (0));
352 net2_4a.
Add (nodes_net2[z][0].Get (0));
353 net2_4b.
Add (nodes_netLR[z].Get (1));
354 net2_4b.
Add (nodes_net2[z][1].Get (0));
355 net3_5a.
Add (nodes_netLR[z].Get (1));
356 net3_5a.
Add (nodes_net3[z][0].Get (0));
357 net3_5b.
Add (nodes_netLR[z].Get (1));
358 net3_5b.
Add (nodes_net3[z][1].Get (0));
360 ndc0_4 = p2p_1gb5ms.
Install (net0_4);
362 oss << 10 + z <<
".1.253.0";
363 address.SetBase (oss.str ().c_str (),
"255.255.255.0");
365 ndc0_5 = p2p_1gb5ms.
Install (net0_5);
367 oss << 10 + z <<
".1.254.0";
368 address.SetBase (oss.str ().c_str (),
"255.255.255.0");
370 ndc2_4a = p2p_1gb5ms.
Install (net2_4a);
372 oss << 10 + z <<
".4.253.0";
373 address.SetBase (oss.str ().c_str (),
"255.255.255.0");
374 ifs =
address.Assign (ndc2_4a);
375 ndc2_4b = p2p_1gb5ms.
Install (net2_4b);
377 oss << 10 + z <<
".4.254.0";
378 address.SetBase (oss.str ().c_str (),
"255.255.255.0");
379 ifs =
address.Assign (ndc2_4b);
380 ndc3_5a = p2p_1gb5ms.
Install (net3_5a);
382 oss << 10 + z <<
".5.253.0";
383 address.SetBase (oss.str ().c_str (),
"255.255.255.0");
384 ifs =
address.Assign (ndc3_5a);
385 ndc3_5b = p2p_1gb5ms.
Install (net3_5b);
387 oss << 10 + z <<
".5.254.0";
388 address.SetBase (oss.str ().c_str (),
"255.255.255.0");
389 ifs =
address.Assign (ndc3_5b);
391 std::cout <<
" Assigning IP addresses..." << std::endl;
392 for (
int i = 0; i < 3; ++i)
395 oss << 10 + z <<
".1." << 1 + i <<
".0";
396 address.SetBase (oss.str ().c_str (),
"255.255.255.0");
397 ifs0[z][i] =
address.Assign (ndc0[i]);
399 for (
int i = 0; i < 6; ++i)
406 oss << 10 + z <<
".2." << 1 + i <<
".0";
407 address.SetBase (oss.str ().c_str (),
"255.255.255.0");
408 ifs1[z][i] =
address.Assign (ndc1[i]);
411 oss << 10 + z <<
".3.1.0";
412 address.SetBase (oss.str ().c_str (),
"255.255.255.0");
414 for (
int i = 0; i < 14; ++i)
417 oss << 10 + z <<
".4." << 1 + i <<
".0";
418 address.SetBase (oss.str ().c_str (),
"255.255.255.0");
419 ifs2[z][i] =
address.Assign (ndc2[i]);
421 for (
int i = 0; i < 9; ++i)
424 oss << 10 + z <<
".5." << 1 + i <<
".0";
425 address.SetBase (oss.str ().c_str (),
"255.255.255.0");
426 ifs3[z][i] =
address.Assign (ndc3[i]);
432 std::cout <<
"Forming Ring Topology..." << std::endl;
434 for (
int z = 0; z < nCN-1; ++z)
436 nodes_ring[z].
Add (nodes_net0[z][0].Get (0));
437 nodes_ring[z].
Add (nodes_net0[z+1][0].Get (0));
439 nodes_ring[nCN-1].
Add (nodes_net0[nCN-1][0].Get (0));
440 nodes_ring[nCN-1].
Add (nodes_net0[0][0].Get (0));
442 for (
int z = 0; z < nCN; ++z)
444 ndc_ring[z] = p2p_2gb200ms.
Install (nodes_ring[z]);
446 oss <<
"254.1." << z + 1 <<
".0";
447 address.SetBase (oss.str ().c_str (),
"255.255.255.0");
448 ifs =
address.Assign (ndc_ring[z]);
455 std::cout <<
"Creating TCP Traffic Flows:" << std::endl;
458 StringValue (
"ns3::ConstantRandomVariable[Constant=1.0]"));
460 StringValue (
"ns3::ConstantRandomVariable[Constant=0.0]"));
466 for (
int z = 0; z < nCN; ++z)
474 std::cout <<
" Campus Network " << z <<
" Flows [ Net2 ";
475 for (
int i = 0; i < 7; ++i)
477 for (
int j = 0; j < nLANClients; ++j)
483 nodes_net2LAN[z][i][j].Get (0));
486 r1 = 2 + (int)(4 * urng->
GetValue ());
490 ifs2LAN[z][i][j].GetAddress (0), 9999));
491 client.SetAttribute (
"Remote", remoteAddress);
493 clientApp.
Add (client.Install (nodes_net1[
x][r1].Get (0)));
498 std::cout <<
"Net3 ]" << std::endl;
499 for (
int i = 0; i < 5; ++i)
501 for (
int j = 0; j < nLANClients; ++j)
507 nodes_net3LAN[z][i][j].Get (0));
510 r1 = 2 + (int)(4 * urng->
GetValue ());
514 ifs3LAN[z][i][j].GetAddress (0), 9999));
515 client.SetAttribute (
"Remote", remoteAddress);
517 clientApp.
Add (client.Install (nodes_net1[
x][r1].Get (0)));
530 std::cout <<
"Using Nix-vectors..." << std::endl;
535 std::cout <<
"Populating Global Static Routing Tables..." << std::endl;
541 std::cout <<
"Routing tables population took " 542 <<
TIMER_DIFF (routingEnd, routingStart) << std::endl;
545 std::cout <<
"Running simulator..." << std::endl;
550 std::cout <<
"Simulator finished." << std::endl;
554 std::cout <<
"-----" << std::endl <<
"Runtime Stats:" << std::endl;
555 std::cout <<
"Simulator init time: " << d1 << std::endl;
556 std::cout <<
"Simulator run time: " << d2 << std::endl;
557 std::cout <<
"Total elapsed time: " << d1+d2 << std::endl;
559 delete[] nodes_netLR;
holds a vector of ns3::Application pointers.
static Ipv4Address GetAny(void)
static uint32_t GetNNodes(void)
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.
Hold variables of type string.
const size_t m_xMax
maximum number of rows
NetDeviceContainer Install(NodeContainer c)
Array2D(const size_t x, const size_t y)
Constructor.
void Add(ApplicationContainer other)
Append the contents of another ApplicationContainer to the end of this container. ...
static void Run(void)
Run the simulation.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
const size_t m_xMax
maximum number of rows
Helper class that adds Nix-vector routing to nodes.
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.
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
a polymophic address class
Array3D(const size_t x, const size_t y, const size_t z)
Constructor.
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
Hold an unsigned integer type.
Array2D< T > ** p
Stored elements.
holds a vector of ns3::NetDevice pointers
#define TIMER_DIFF(_t1, _t2)
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 arguments.
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
static EventId ScheduleNow(MEM mem_ptr, OBJ obj)
Schedule an event to expire Now.
2D array used in nix-vector-routing example "nms-p2p-nix.cc"
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
3D array used in nix-vector-routing example "nms-p2p-nix.cc"
AttributeValue implementation for Address.
struct timeval TIMER_TYPE
void Add(NodeContainer other)
Append the contents of another NodeContainer to the end of this container.
static void Stop(void)
Tell the Simulator the calling event should be the last one executed.
Time Seconds(double value)
Construct a Time in the indicated unit.
void SetDefault(std::string name, const AttributeValue &value)
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.