Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge back master branch.
[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() > 65000)
94                 xbt_die("Cluster with NS3 is limited to 65000 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         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));
106
107         if(number_of_links == 255){
108                 if(number_of_networks == 255)
109                         xbt_die("Number of links and networks exceed 255*255");
110                 number_of_links = 1;
111                 number_of_networks++;
112         }else{
113                 number_of_links++;
114         }
115         XBT_DEBUG("Number of nodes in Cluster_nodes: %d",Cluster_nodes.GetN());
116
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("%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));
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
168         //TODO REMOVE ;)
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);
173
174         UdpEchoServerHelper echoServer (9);
175
176         ApplicationContainer serverApps = echoServer.Install (a);
177         serverApps.Start (Seconds (1.0));
178         serverApps.Stop (Seconds (20.0));
179
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));
187
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));
195
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));
203
204         Simulator::Run ();
205         Simulator::Destroy ();
206
207         //HEEEEEEE
208 }