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-static-routing-helper.h"
48 #include "ns3/ipv4-list-routing-helper.h"
49 #include "ns3/ipv4-nix-vector-helper.h"
54 #define TIMER_NOW(_t) gettimeofday (&_t,NULL);
55 #define TIMER_SECONDS(_t) ((double)(_t).tv_sec + (_t).tv_usec*1e-6)
56 #define TIMER_DIFF(_t1, _t2) (TIMER_SECONDS (_t1)-TIMER_SECONDS (_t2))
69 Array2D (
const size_t x,
const size_t y) : p (new T*[x]), m_xMax (x)
71 for (
size_t i = 0; i < m_xMax; i++)
77 for (
size_t i = 0; i < m_xMax; i++)
83 T* operator[] (
const size_t i)
96 Array3D (
const size_t x,
const size_t y,
const size_t z)
97 : p (new
Array2D<T>*[x]), m_xMax (x)
99 for (
size_t i = 0; i < m_xMax; i++)
105 for (
size_t i = 0; i < m_xMax; i++)
128 std::cout <<
" ==== DARPA NMS CAMPUS NETWORK SIMULATION ====" << std::endl;
131 int nCN = 2, nLANClients = 42;
135 cmd.
AddValue (
"CN",
"Number of total CNs [2]", nCN);
136 cmd.
AddValue (
"LAN",
"Number of nodes per LAN [42]", nLANClients);
137 cmd.
AddValue (
"NIX",
"Toggle nix-vector routing", nix);
138 cmd.
Parse (argc,argv);
142 std::cout <<
"Number of total CNs (" << nCN <<
") lower than minimum of 2"
147 std::cout <<
"Number of CNs: " << nCN <<
", LAN nodes: " << nLANClients << std::endl;
168 std::ostringstream oss;
181 list.
Add (staticRouting, 0);
182 list.
Add (nixRouting, 10);
190 for (
int z = 0; z < nCN; ++z)
192 std::cout <<
"Creating Campus Network " << z <<
":" << std::endl;
194 std::cout <<
" SubNet [ 0";
195 for (
int i = 0; i < 3; ++i)
197 nodes_net0[z][i].Create (1);
198 stack.
Install (nodes_net0[z][i]);
200 nodes_net0[z][0].Add (nodes_net0[z][1].Get (0));
201 nodes_net0[z][1].Add (nodes_net0[z][2].Get (0));
202 nodes_net0[z][2].Add (nodes_net0[z][0].Get (0));
204 for (
int i = 0; i < 3; ++i)
206 ndc0[i] = p2p_1gb5ms.
Install (nodes_net0[z][i]);
210 for (
int i = 0; i < 6; ++i)
212 nodes_net1[z][i].Create (1);
213 stack.
Install (nodes_net1[z][i]);
215 nodes_net1[z][0].Add (nodes_net1[z][1].Get (0));
216 nodes_net1[z][2].Add (nodes_net1[z][0].Get (0));
217 nodes_net1[z][3].Add (nodes_net1[z][0].Get (0));
218 nodes_net1[z][4].Add (nodes_net1[z][1].Get (0));
219 nodes_net1[z][5].Add (nodes_net1[z][1].Get (0));
221 for (
int i = 0; i < 6; ++i)
227 ndc1[i] = p2p_1gb5ms.
Install (nodes_net1[z][i]);
231 net0_1.
Add (nodes_net0[z][2].Get (0));
232 net0_1.
Add (nodes_net1[z][0].Get (0));
234 ndc0_1 = p2p_1gb5ms.
Install (net0_1);
236 oss << 10 + z <<
".1.252.0";
237 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
238 ifs = address.
Assign (ndc0_1);
241 for (
int i = 0; i < 14; ++i)
243 nodes_net2[z][i].Create (1);
244 stack.
Install (nodes_net2[z][i]);
246 nodes_net2[z][0].Add (nodes_net2[z][1].Get (0));
247 nodes_net2[z][2].Add (nodes_net2[z][0].Get (0));
248 nodes_net2[z][1].Add (nodes_net2[z][3].Get (0));
249 nodes_net2[z][3].Add (nodes_net2[z][2].Get (0));
250 nodes_net2[z][4].Add (nodes_net2[z][2].Get (0));
251 nodes_net2[z][5].Add (nodes_net2[z][3].Get (0));
252 nodes_net2[z][6].Add (nodes_net2[z][5].Get (0));
253 nodes_net2[z][7].Add (nodes_net2[z][2].Get (0));
254 nodes_net2[z][8].Add (nodes_net2[z][3].Get (0));
255 nodes_net2[z][9].Add (nodes_net2[z][4].Get (0));
256 nodes_net2[z][10].Add (nodes_net2[z][5].Get (0));
257 nodes_net2[z][11].Add (nodes_net2[z][6].Get (0));
258 nodes_net2[z][12].Add (nodes_net2[z][6].Get (0));
259 nodes_net2[z][13].Add (nodes_net2[z][6].Get (0));
261 for (
int i = 0; i < 14; ++i)
263 ndc2[i] = p2p_1gb5ms.
Install (nodes_net2[z][i]);
267 for (
int i = 0; i < 7; ++i)
270 oss << 10 + z <<
".4." << 15 + i <<
".0";
271 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
272 for (
int j = 0; j < nLANClients; ++j)
274 nodes_net2LAN[z][i][j].Create (1);
275 stack.
Install (nodes_net2LAN[z][i][j]);
276 nodes_net2LAN[z][i][j].Add (nodes_net2[z][i+7].Get (0));
277 ndc2LAN[i][j] = p2p_100mb1ms.
Install (nodes_net2LAN[z][i][j]);
278 ifs2LAN[z][i][j] = address.
Assign (ndc2LAN[i][j]);
282 std::cout <<
" 3 ]" << std::endl;
283 for (
int i = 0; i < 9; ++i)
285 nodes_net3[z][i].Create (1);
286 stack.
Install (nodes_net3[z][i]);
288 nodes_net3[z][0].Add (nodes_net3[z][1].Get (0));
289 nodes_net3[z][1].Add (nodes_net3[z][2].Get (0));
290 nodes_net3[z][2].Add (nodes_net3[z][3].Get (0));
291 nodes_net3[z][3].Add (nodes_net3[z][1].Get (0));
292 nodes_net3[z][4].Add (nodes_net3[z][0].Get (0));
293 nodes_net3[z][5].Add (nodes_net3[z][0].Get (0));
294 nodes_net3[z][6].Add (nodes_net3[z][2].Get (0));
295 nodes_net3[z][7].Add (nodes_net3[z][3].Get (0));
296 nodes_net3[z][8].Add (nodes_net3[z][3].Get (0));
298 for (
int i = 0; i < 9; ++i)
300 ndc3[i] = p2p_1gb5ms.
Install (nodes_net3[z][i]);
304 for (
int i = 0; i < 5; ++i)
307 oss << 10 + z <<
".5." << 10 + i <<
".0";
308 address.
SetBase (oss.str ().c_str (),
"255.255.255.255");
309 for (
int j = 0; j < nLANClients; ++j)
311 nodes_net3LAN[z][i][j].Create (1);
312 stack.
Install (nodes_net3LAN[z][i][j]);
313 nodes_net3LAN[z][i][j].Add (nodes_net3[z][i+4].Get (0));
314 ndc3LAN[i][j] = p2p_100mb1ms.
Install (nodes_net3LAN[z][i][j]);
315 ifs3LAN[z][i][j] = address.
Assign (ndc3LAN[i][j]);
318 std::cout <<
" Connecting Subnets..." << std::endl;
320 nodes_netLR[z].
Create (2);
321 stack.
Install (nodes_netLR[z]);
323 ndcLR = p2p_1gb5ms.
Install (nodes_netLR[z]);
325 NodeContainer net0_4, net0_5, net2_4a, net2_4b, net3_5a, net3_5b;
326 net0_4.
Add (nodes_netLR[z].Get (0));
327 net0_4.
Add (nodes_net0[z][0].Get (0));
328 net0_5.
Add (nodes_netLR[z].Get (1));
329 net0_5.
Add (nodes_net0[z][1].Get (0));
330 net2_4a.
Add (nodes_netLR[z].Get (0));
331 net2_4a.
Add (nodes_net2[z][0].Get (0));
332 net2_4b.
Add (nodes_netLR[z].Get (1));
333 net2_4b.
Add (nodes_net2[z][1].Get (0));
334 net3_5a.
Add (nodes_netLR[z].Get (1));
335 net3_5a.
Add (nodes_net3[z][0].Get (0));
336 net3_5b.
Add (nodes_netLR[z].Get (1));
337 net3_5b.
Add (nodes_net3[z][1].Get (0));
339 ndc0_4 = p2p_1gb5ms.
Install (net0_4);
341 oss << 10 + z <<
".1.253.0";
342 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
343 ifs = address.
Assign (ndc0_4);
344 ndc0_5 = p2p_1gb5ms.
Install (net0_5);
346 oss << 10 + z <<
".1.254.0";
347 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
348 ifs = address.
Assign (ndc0_5);
349 ndc2_4a = p2p_1gb5ms.
Install (net2_4a);
351 oss << 10 + z <<
".4.253.0";
352 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
353 ifs = address.
Assign (ndc2_4a);
354 ndc2_4b = p2p_1gb5ms.
Install (net2_4b);
356 oss << 10 + z <<
".4.254.0";
357 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
358 ifs = address.
Assign (ndc2_4b);
359 ndc3_5a = p2p_1gb5ms.
Install (net3_5a);
361 oss << 10 + z <<
".5.253.0";
362 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
363 ifs = address.
Assign (ndc3_5a);
364 ndc3_5b = p2p_1gb5ms.
Install (net3_5b);
366 oss << 10 + z <<
".5.254.0";
367 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
368 ifs = address.
Assign (ndc3_5b);
370 std::cout <<
" Assigning IP addresses..." << std::endl;
371 for (
int i = 0; i < 3; ++i)
374 oss << 10 + z <<
".1." << 1 + i <<
".0";
375 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
376 ifs0[z][i] = address.
Assign (ndc0[i]);
378 for (
int i = 0; i < 6; ++i)
385 oss << 10 + z <<
".2." << 1 + i <<
".0";
386 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
387 ifs1[z][i] = address.
Assign (ndc1[i]);
390 oss << 10 + z <<
".3.1.0";
391 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
392 ifs = address.
Assign (ndcLR);
393 for (
int i = 0; i < 14; ++i)
396 oss << 10 + z <<
".4." << 1 + i <<
".0";
397 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
398 ifs2[z][i] = address.
Assign (ndc2[i]);
400 for (
int i = 0; i < 9; ++i)
403 oss << 10 + z <<
".5." << 1 + i <<
".0";
404 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
405 ifs3[z][i] = address.
Assign (ndc3[i]);
411 std::cout <<
"Forming Ring Topology..." << std::endl;
413 for (
int z = 0; z < nCN-1; ++z)
415 nodes_ring[z].
Add (nodes_net0[z][0].Get (0));
416 nodes_ring[z].
Add (nodes_net0[z+1][0].Get (0));
418 nodes_ring[nCN-1].
Add (nodes_net0[nCN-1][0].Get (0));
419 nodes_ring[nCN-1].
Add (nodes_net0[0][0].Get (0));
421 for (
int z = 0; z < nCN; ++z)
423 ndc_ring[z] = p2p_2gb200ms.
Install (nodes_ring[z]);
425 oss <<
"254.1." << z + 1 <<
".0";
426 address.
SetBase (oss.str ().c_str (),
"255.255.255.0");
427 ifs = address.
Assign (ndc_ring[z]);
434 std::cout <<
"Creating TCP Traffic Flows:" << std::endl;
437 StringValue (
"ns3::ConstantRandomVariable[Constant=1.0]"));
439 StringValue (
"ns3::ConstantRandomVariable[Constant=0.0]"));
445 for (
int z = 0; z < nCN; ++z)
453 std::cout <<
" Campus Network " << z <<
" Flows [ Net2 ";
454 for (
int i = 0; i < 7; ++i)
456 for (
int j = 0; j < nLANClients; ++j)
462 nodes_net2LAN[z][i][j].Get (0));
463 sinkApp.
Start (Seconds (0.0));
465 r1 = 2 + (int)(4 * urng->
GetValue ());
469 ifs2LAN[z][i][j].GetAddress (0), 9999));
472 clientApp.
Add (client.
Install (nodes_net1[x][r1].Get (0)));
473 clientApp.
Start (Seconds (r2));
477 std::cout <<
"Net3 ]" << std::endl;
478 for (
int i = 0; i < 5; ++i)
480 for (
int j = 0; j < nLANClients; ++j)
486 nodes_net3LAN[z][i][j].Get (0));
487 sinkApp.
Start (Seconds (0.0));
489 r1 = 2 + (int)(4 * urng->
GetValue ());
493 ifs3LAN[z][i][j].GetAddress (0), 9999));
496 clientApp.
Add (client.
Install (nodes_net1[x][r1].Get (0)));
497 clientApp.
Start (Seconds (r2));
509 std::cout <<
"Using Nix-vectors..." << std::endl;
514 std::cout <<
"Populating Global Static Routing Tables..." << std::endl;
520 std::cout <<
"Routing tables population took "
521 <<
TIMER_DIFF (routingEnd, routingStart) << std::endl;
524 std::cout <<
"Running simulator..." << std::endl;
529 std::cout <<
"Simulator finished." << std::endl;
533 std::cout <<
"-----" << std::endl <<
"Runtime Stats:" << std::endl;
534 std::cout <<
"Simulator init time: " << d1 << std::endl;
535 std::cout <<
"Simulator run time: " << d2 << std::endl;
536 std::cout <<
"Total elapsed time: " << d1+d2 << std::endl;
538 delete[] nodes_netLR;
holds a vector of ns3::Application pointers.
static Ipv4Address GetAny(void)
int main(int argc, char *argv[])
static uint32_t GetNNodes(void)
NS_LOG_COMPONENT_DEFINE("GrantedTimeWindowMpiInterface")
holds a vector of std::pair of Ptr 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
NetDeviceContainer Install(NodeContainer c)
Array2D(const size_t x, const size_t y)
void Add(ApplicationContainer other)
Append the contents of another ApplicationContainer to the end of this container. ...
static void Run(void)
Run the simulation until one of:
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.
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached.
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)
Hold an unsigned integer type.
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)
Every event scheduled by the Simulator::insertAtDestroy method is invoked.
void SetDefault(std::string name, const AttributeValue &value)
keep track of a set of node pointers.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
static EventId ScheduleNow(MEM mem_ptr, OBJ obj)
Schedule an event to expire Now.
void Add(const Ipv4RoutingHelper &routing, int16_t priority)
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
hold objects of type ns3::Address
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
struct timeval TIMER_TYPE
void Add(NodeContainer other)
Append the contents of another NodeContainer to the end of this container.
Helper class that adds ns3::Ipv4StaticRouting objects.
void AddValue(const std::string &name, const std::string &help, T &value)
Add a program argument, assigning to POD.
static void Stop(void)
If an event invokes this method, it will be the last event scheduled by the Simulator::run method bef...
Helper class that adds ns3::Ipv4ListRouting objects.
ApplicationContainer Install(NodeContainer c) const
Install an ns3::PacketSinkApplication on each node of the input container configured with all the att...
void Parse(int argc, char *argv[])
Parse the program arguments.
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.
ApplicationContainer Install(NodeContainer c) const
Install an ns3::OnOffApplication on each node of the input container configured with all the attribut...
void SetRoutingHelper(const Ipv4RoutingHelper &routing)
void SetAttribute(std::string name, const AttributeValue &value)
Helper function used to set the underlying application attributes.
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)