Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
d961c69556deca0f96fd581d36908b86e59c37d0
[simgrid.git] / src / surf / ns3 / ns3_interface.cc
1 /* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
2  * All rights reserved.                                                     */
3
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. */
6
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"
15
16 using namespace ns3;
17
18 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(interface_ns3, surf,
19                                 "Logging specific to the SURF network NS3 module");
20
21 InternetStackHelper stack;
22 NodeContainer nodes;
23 NodeContainer Cluster_nodes;
24 Ipv4InterfaceContainer interfaces;
25
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;
30
31 void * ns3_add_host(char * id)
32 {
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);
36         stack.Install(node);
37         nodes.Add(node);
38         host->node_num = number_of_nodes;
39         host->type = NS3_NETWORK_ELEMENT_HOST;
40         host->data = node;
41         number_of_nodes++;
42         return host;
43 }
44
45 void * ns3_add_host_cluster(char * id)
46 {
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);
50         stack.Install(node);
51         Cluster_nodes.Add(node);
52         nodes.Add(node);
53         host->node_num = number_of_nodes;
54         host->type = NS3_NETWORK_ELEMENT_HOST;
55         host->data = node;
56         number_of_nodes++;
57         return host;
58 }
59
60 void * ns3_add_router(char * id)
61 {
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);
65         stack.Install(node);
66         nodes.Add(node);
67         router->node_num = number_of_nodes;
68         router->type = NS3_NETWORK_ELEMENT_ROUTER;
69         router->data = node;
70         number_of_nodes++;
71         return router;
72 }
73
74 void * ns3_add_cluster(char * bw,char * lat,char *id)
75 {
76
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);
80
81         NodeContainer Nodes;
82         int i;
83
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);
87         }
88         number_of_clusters_nodes = Cluster_nodes.GetN();
89
90         XBT_DEBUG("Add router %d to cluster",nodes.GetN()-Nodes.GetN()-1);
91         Nodes.Add(nodes.Get(nodes.GetN()-Nodes.GetN()-1));
92
93         if(Nodes.GetN() > 254)
94                 xbt_die("Cluster with NS3 is limited to 254 nodes");
95         CsmaHelper csma;
96         csma.SetChannelAttribute ("DataRate", StringValue (bw));
97         csma.SetChannelAttribute ("Delay", StringValue (lat));
98         NetDeviceContainer devices = csma.Install (Nodes);
99         XBT_DEBUG("Create CSMA");
100
101
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));
107
108         if(number_of_links == 255){
109                 if(number_of_networks == 255)
110                         xbt_die("Number of links and networks exceed 255*255");
111                 number_of_links = 1;
112                 number_of_networks++;
113         }else{
114                 number_of_links++;
115         }
116         XBT_DEBUG("Number of nodes in Cluster_nodes: %d",Cluster_nodes.GetN());
117 }
118
119 void * ns3_add_AS(char * id)
120 {
121         XBT_INFO("Interface ns3 add AS '%s'",id);
122         return NULL;
123 }
124
125 void * ns3_add_link(int src,int dst,char * bw,char * lat)
126 {
127         if(number_of_links == 1 ) {
128                 LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
129                 LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
130         }
131
132         PointToPointHelper pointToPoint;
133         NetDeviceContainer netA;
134         Ipv4AddressHelper address;
135
136         Ptr<Node> a = nodes.Get(src);
137         Ptr<Node> b = nodes.Get(dst);
138
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
143
144         netA.Add(pointToPoint.Install (a, b));
145
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));
150
151         XBT_DEBUG(" ");
152         if(number_of_links == 255){
153                 if(number_of_networks == 255)
154                         xbt_die("Number of links and networks exceed 255*255");
155                 number_of_links = 1;
156                 number_of_networks++;
157         }else{
158                 number_of_links++;
159         }
160 }
161
162 void * ns3_end_platform(void)
163 {
164         XBT_INFO("InitializeRoutes");
165         GlobalRouteManager::BuildGlobalRoutingDatabase();
166         GlobalRouteManager::InitializeRoutes();
167         //TODO REMOVE ;)
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);
172
173         UdpEchoServerHelper echoServer (9);
174
175         ApplicationContainer serverApps = echoServer.Install (a);
176         serverApps.Start (Seconds (1.0));
177         serverApps.Stop (Seconds (20.0));
178
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));
186
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));
194
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));
202
203         Simulator::Run ();
204         Simulator::Destroy ();
205
206         //HEEEEEEE
207 }