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() > 254)
94 xbt_die("Cluster with NS3 is limited to 254 nodes");
96 csma.SetChannelAttribute ("DataRate", StringValue (bw));
97 csma.SetChannelAttribute ("Delay", StringValue (lat));
98 NetDeviceContainer devices = csma.Install (Nodes);
99 XBT_DEBUG("Create CSMA");
102 char * adr = bprintf("10.%d.%d.0",number_of_networks,number_of_links);
103 XBT_DEBUG("Assign IP Addresses %s to CSMA.",adr);
104 Ipv4AddressHelper ipv4;
105 ipv4.SetBase (adr, "255.255.255.0");
106 interfaces.Add(ipv4.Assign (devices));
108 if(number_of_links == 255){
109 if(number_of_networks == 255)
110 xbt_die("Number of links and networks exceed 255*255");
112 number_of_networks++;
116 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("10.%d.%d.0",number_of_networks,number_of_links);
147 address.SetBase (adr, "255.255.255.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();
168 Ptr<Node> a = nodes.Get(0);
169 Ptr<Node> b = nodes.Get(11);
170 Ptr<Node> c = nodes.Get(12);
171 Ptr<Node> d = nodes.Get(13);
173 UdpEchoServerHelper echoServer (9);
175 ApplicationContainer serverApps = echoServer.Install (a);
176 serverApps.Start (Seconds (1.0));
177 serverApps.Stop (Seconds (20.0));
179 UdpEchoClientHelper echoClient (interfaces.GetAddress (0), 9);
180 echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
181 echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.)));
182 echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
183 ApplicationContainer clientApps_b = echoClient.Install (b);
184 clientApps_b.Start (Seconds (2.0));
185 clientApps_b.Stop (Seconds (10.0));
187 UdpEchoClientHelper echoClient2 (interfaces.GetAddress (0), 9);
188 echoClient2.SetAttribute ("MaxPackets", UintegerValue (1));
189 echoClient2.SetAttribute ("Interval", TimeValue (Seconds (1.)));
190 echoClient2.SetAttribute ("PacketSize", UintegerValue (512));
191 ApplicationContainer clientApps_c = echoClient2.Install (c);
192 clientApps_c.Start (Seconds (3.0));
193 clientApps_c.Stop (Seconds (10.0));
195 UdpEchoClientHelper echoClient3 (interfaces.GetAddress (0), 9);
196 echoClient3.SetAttribute ("MaxPackets", UintegerValue (1));
197 echoClient3.SetAttribute ("Interval", TimeValue (Seconds (1.)));
198 echoClient3.SetAttribute ("PacketSize", UintegerValue (256));
199 ApplicationContainer clientApps_d = echoClient3.Install (d);
200 clientApps_d.Start (Seconds (4.0));
201 clientApps_d.Stop (Seconds (10.0));
204 Simulator::Destroy ();