1 /* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
2 * All rights reserved. */
4 /* This program is free software; you can redistribute it and/or modify it
5 * under the terms of the license (GNU LGPL) which comes with this package. */
7 #include "ns3_interface.h"
8 #include "ns3/core-module.h"
9 #include "ns3/simulator-module.h"
10 #include "ns3/node-module.h"
11 #include "ns3/helper-module.h"
12 #include "ns3/global-route-manager.h"
13 #include "ns3/global-route-manager.h"
14 #include "ns3/ipv4-global-routing-helper.h"
18 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(interface_ns3, surf,
19 "Logging specific to the SURF network NS3 module");
21 InternetStackHelper stack;
23 NodeContainer Cluster_nodes;
24 Ipv4InterfaceContainer interfaces;
26 int number_of_nodes = 0;
27 int number_of_clusters_nodes = 0;
28 int number_of_links = 1;
29 int number_of_networks = 1;
31 void * ns3_add_host(char * id)
33 ns3_nodes_t host = xbt_new0(s_ns3_nodes_t,1);
34 XBT_INFO("Interface ns3 add host[%d] '%s'",number_of_nodes,id);
35 Ptr<Node> node = CreateObject<Node> (0);
38 host->node_num = number_of_nodes;
39 host->type = NS3_NETWORK_ELEMENT_HOST;
45 void * ns3_add_host_cluster(char * id)
47 ns3_nodes_t host = xbt_new0(s_ns3_nodes_t,1);
48 XBT_INFO("Interface ns3 add host[%d] '%s'",number_of_nodes,id);
49 Ptr<Node> node = CreateObject<Node> (0);
51 Cluster_nodes.Add(node);
53 host->node_num = number_of_nodes;
54 host->type = NS3_NETWORK_ELEMENT_HOST;
60 void * ns3_add_router(char * id)
62 ns3_nodes_t router = xbt_new0(s_ns3_nodes_t,1);
63 XBT_INFO("Interface ns3 add router[%d] '%s'",number_of_nodes,id);
64 Ptr<Node> node = CreateObject<Node> (0);
67 router->node_num = number_of_nodes;
68 router->type = NS3_NETWORK_ELEMENT_ROUTER;
74 void * ns3_add_cluster(char * bw,char * lat,char *id)
77 XBT_DEBUG("cluster_id: %s",id);
78 XBT_DEBUG("bw: %s lat: %s",bw,lat);
79 XBT_DEBUG("Number of %s nodes: %d",id,Cluster_nodes.GetN() - number_of_clusters_nodes);
84 for(i = number_of_clusters_nodes; i < Cluster_nodes.GetN() ; i++){
85 Nodes.Add(Cluster_nodes.Get(i));
86 XBT_DEBUG("Add node %d to cluster",i);
88 number_of_clusters_nodes = Cluster_nodes.GetN();
90 XBT_DEBUG("Add router %d to cluster",nodes.GetN()-Nodes.GetN()-1);
91 Nodes.Add(nodes.Get(nodes.GetN()-Nodes.GetN()-1));
93 if(Nodes.GetN() > 65000)
94 xbt_die("Cluster with NS3 is limited to 65000 nodes");
96 csma.SetChannelAttribute ("DataRate", StringValue (bw));
97 csma.SetChannelAttribute ("Delay", StringValue (lat));
98 NetDeviceContainer devices = csma.Install (Nodes);
99 XBT_DEBUG("Create CSMA");
101 char * adr = bprintf("%d.%d.0.0",number_of_networks,number_of_links);
102 XBT_DEBUG("Assign IP Addresses %s to CSMA.",adr);
103 Ipv4AddressHelper ipv4;
104 ipv4.SetBase (adr, "255.255.0.0");
105 interfaces.Add(ipv4.Assign (devices));
107 if(number_of_links == 255){
108 if(number_of_networks == 255)
109 xbt_die("Number of links and networks exceed 255*255");
111 number_of_networks++;
115 XBT_DEBUG("Number of nodes in Cluster_nodes: %d",Cluster_nodes.GetN());
119 void * ns3_add_AS(char * id)
121 XBT_INFO("Interface ns3 add AS '%s'",id);
125 void * ns3_add_link(int src,int dst,char * bw,char * lat)
127 if(number_of_links == 1 ) {
128 LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
129 LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
132 PointToPointHelper pointToPoint;
133 NetDeviceContainer netA;
134 Ipv4AddressHelper address;
136 Ptr<Node> a = nodes.Get(src);
137 Ptr<Node> b = nodes.Get(dst);
139 XBT_DEBUG("\tAdd PTP from %d to %d bw:'%s' lat:'%s'",src,dst,bw,lat);
140 pointToPoint.SetDeviceAttribute ("DataRate", StringValue (bw));
141 pointToPoint.SetChannelAttribute ("Delay", StringValue (lat));
142 //pointToPoint.EnablePcapAll("test_ns3_trace"); //DEBUG
144 netA.Add(pointToPoint.Install (a, b));
146 char * adr = bprintf("%d.%d.0.0",number_of_networks,number_of_links);
147 address.SetBase (adr, "255.255.0.0");
148 XBT_DEBUG("\tInterface stack '%s'",adr);
149 interfaces.Add(address.Assign (netA));
152 if(number_of_links == 255){
153 if(number_of_networks == 255)
154 xbt_die("Number of links and networks exceed 255*255");
156 number_of_networks++;
162 void * ns3_end_platform(void)
164 XBT_INFO("InitializeRoutes");
165 GlobalRouteManager::BuildGlobalRoutingDatabase();
166 GlobalRouteManager::InitializeRoutes();
169 Ptr<Node> a = nodes.Get(0);
170 Ptr<Node> b = nodes.Get(1);
171 Ptr<Node> c = nodes.Get(2);
172 Ptr<Node> d = nodes.Get(3);
174 UdpEchoServerHelper echoServer (9);
176 ApplicationContainer serverApps = echoServer.Install (a);
177 serverApps.Start (Seconds (1.0));
178 serverApps.Stop (Seconds (20.0));
180 UdpEchoClientHelper echoClient (interfaces.GetAddress (0), 9);
181 echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
182 echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.)));
183 echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
184 ApplicationContainer clientApps_b = echoClient.Install (b);
185 clientApps_b.Start (Seconds (2.0));
186 clientApps_b.Stop (Seconds (10.0));
188 UdpEchoClientHelper echoClient2 (interfaces.GetAddress (0), 9);
189 echoClient2.SetAttribute ("MaxPackets", UintegerValue (1));
190 echoClient2.SetAttribute ("Interval", TimeValue (Seconds (1.)));
191 echoClient2.SetAttribute ("PacketSize", UintegerValue (512));
192 ApplicationContainer clientApps_c = echoClient2.Install (c);
193 clientApps_c.Start (Seconds (3.0));
194 clientApps_c.Stop (Seconds (10.0));
196 UdpEchoClientHelper echoClient3 (interfaces.GetAddress (0), 9);
197 echoClient3.SetAttribute ("MaxPackets", UintegerValue (1));
198 echoClient3.SetAttribute ("Interval", TimeValue (Seconds (1.)));
199 echoClient3.SetAttribute ("PacketSize", UintegerValue (256));
200 ApplicationContainer clientApps_d = echoClient3.Install (d);
201 clientApps_d.Start (Seconds (4.0));
202 clientApps_d.Stop (Seconds (10.0));
205 Simulator::Destroy ();