1 /* Copyright (c) 2007, 2008, 2009, 2010, 2011. 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 "surf_private.h"
8 #include "surf/ns3/ns3_interface.h"
10 #include "surf/network_ns3_private.h"
13 extern xbt_lib_t host_lib;
14 extern xbt_lib_t link_lib;
15 extern xbt_lib_t as_router_lib;
17 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_ns3, surf,
18 "Logging specific to the SURF network NS3 module");
20 extern routing_global_t global_routing;
22 static void replace_str(char *str, const char *orig, const char *rep)
27 if(!(p = strstr(str, orig))) // Is 'orig' even in 'str'?
30 strncpy(buffer, str, p-str); // Copy characters from 'str' start to 'orig' st$
33 sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig));
35 str = xbt_strdup(buffer);
38 static void replace_bdw_ns3(char * bdw)
40 // replace_str(bdw,".00","");
41 // char *temp = xbt_strdup(bdw);
43 // replace_str(bdw,"000000000","Gbps");
44 // if(strcmp(bdw,temp)) {xbt_free(temp);return;}
45 // replace_str(bdw,"00000000","00Mbps");
46 // if(strcmp(bdw,temp)) {xbt_free(temp);return;}
47 // replace_str(bdw,"0000000","0Mbps");
48 // if(strcmp(bdw,temp)) {xbt_free(temp);return;}
49 // replace_str(bdw,"000000","Mbps");
50 // if(strcmp(bdw,temp)) {xbt_free(temp);return;}
51 // replace_str(bdw,"00000","00Kbps");
52 // if(strcmp(bdw,temp)) {xbt_free(temp);return;}
53 // replace_str(bdw,"0000","0Kbps");
54 // if(strcmp(bdw,temp)) {xbt_free(temp);return;}
55 // replace_str(bdw,"000","Kbps");
56 // if(strcmp(bdw,temp)) {xbt_free(temp);return;}
59 // bdw = bprintf("%s%s",temp,"bps");
62 char *temp = xbt_strdup(bdw);
64 bdw = bprintf("%fbps",atof(temp));
69 static void replace_lat_ns3(char * lat)
71 char *temp = xbt_strdup(lat);
73 lat = bprintf("%fs",atof(temp));
77 void parse_ns3_add_host(void)
79 XBT_DEBUG("NS3_ADD_HOST '%s'",A_surfxml_host_id);
83 ns3_add_host(A_surfxml_host_id)
86 void parse_ns3_add_link(void)
88 XBT_DEBUG("NS3_ADD_LINK '%s'",A_surfxml_link_id);
90 tmgr_trace_t bw_trace;
91 tmgr_trace_t state_trace;
92 tmgr_trace_t lat_trace;
94 bw_trace = tmgr_trace_new(A_surfxml_link_bandwidth_file);
95 lat_trace = tmgr_trace_new(A_surfxml_link_latency_file);
96 state_trace = tmgr_trace_new(A_surfxml_link_state_file);
99 XBT_INFO("The NS3 network model doesn't support bandwidth state traces");
101 XBT_INFO("The NS3 network model doesn't support latency state traces");
103 XBT_INFO("The NS3 network model doesn't support link state traces");
105 ns3_link_t link_ns3 = xbt_new0(s_ns3_link_t,1);;
106 link_ns3->id = xbt_strdup(A_surfxml_link_id);
107 link_ns3->bdw = xbt_strdup(A_surfxml_link_bandwidth);
108 link_ns3->lat = xbt_strdup(A_surfxml_link_latency);
110 surf_ns3_link_t link = xbt_new0(s_surf_ns3_link_t,1);
111 link->generic_resource.name = xbt_strdup(A_surfxml_link_id);
112 link->generic_resource.properties = current_property_set;
113 link->data = link_ns3;
116 xbt_lib_set(link_lib,A_surfxml_link_id,NS3_LINK_LEVEL,link_ns3);
117 xbt_lib_set(link_lib,A_surfxml_link_id,SURF_LINK_LEVEL,link);
119 void parse_ns3_add_router(void)
121 XBT_DEBUG("NS3_ADD_ROUTER '%s'",A_surfxml_router_id);
122 xbt_lib_set(as_router_lib,
125 ns3_add_router(A_surfxml_router_id)
128 void parse_ns3_add_AS(void)
130 XBT_DEBUG("NS3_ADD_AS '%s'",A_surfxml_AS_id);
131 xbt_lib_set(as_router_lib,
134 ns3_add_AS(A_surfxml_AS_id)
137 void parse_ns3_add_cluster(void)
139 char *cluster_prefix = A_surfxml_cluster_prefix;
140 char *cluster_suffix = A_surfxml_cluster_suffix;
141 char *cluster_radical = A_surfxml_cluster_radical;
142 char *cluster_bb_bw = A_surfxml_cluster_bb_bw;
143 char *cluster_bb_lat = A_surfxml_cluster_bb_lat;
144 char *cluster_bw = A_surfxml_cluster_bw;
145 char *cluster_lat = A_surfxml_cluster_lat;
151 xbt_dynar_t radical_elements;
152 xbt_dynar_t radical_ends;
153 xbt_dynar_t tab_elements_num = xbt_dynar_new(sizeof(int), NULL);
155 char *router_id,*host_id;
157 radical_elements = xbt_str_split(cluster_radical, ",");
158 xbt_dynar_foreach(radical_elements, iter, groups) {
159 radical_ends = xbt_str_split(groups, "-");
161 switch (xbt_dynar_length(radical_ends)) {
163 surf_parse_get_int(&start,xbt_dynar_get_as(radical_ends, 0, char *));
164 xbt_dynar_push_as(tab_elements_num, int, start);
165 router_id = bprintf("ns3_%s%d%s", cluster_prefix, start, cluster_suffix);
166 xbt_lib_set(host_lib,
169 ns3_add_host_cluster(router_id)
171 XBT_DEBUG("NS3_ADD_ROUTER '%s'",router_id);
176 surf_parse_get_int(&start,xbt_dynar_get_as(radical_ends, 0, char *));
177 surf_parse_get_int(&end, xbt_dynar_get_as(radical_ends, 1, char *));
178 for (i = start; i <= end; i++){
179 xbt_dynar_push_as(tab_elements_num, int, i);
180 router_id = bprintf("ns3_%s%d%s", cluster_prefix, i, cluster_suffix);
181 xbt_lib_set(host_lib,
184 ns3_add_host_cluster(router_id)
186 XBT_DEBUG("NS3_ADD_ROUTER '%s'",router_id);
192 XBT_DEBUG("Malformed radical");
201 char * lat = xbt_strdup(cluster_lat);
202 char * bw = xbt_strdup(cluster_bw);
203 replace_lat_ns3(lat);
206 xbt_dynar_foreach(tab_elements_num,cpt,elmts)
208 host_id = bprintf("%s%d%s", cluster_prefix, elmts, cluster_suffix);
209 router_id = bprintf("ns3_%s%d%s", cluster_prefix, elmts, cluster_suffix);
210 XBT_DEBUG("Create link from '%s' to '%s'",host_id,router_id);
212 ns3_nodes_t host_src = xbt_lib_get_or_null(host_lib,host_id, NS3_HOST_LEVEL);
213 ns3_nodes_t host_dst = xbt_lib_get_or_null(host_lib,router_id,NS3_HOST_LEVEL);
215 if(host_src && host_dst){}
216 else xbt_die("\tns3_add_link from %d to %d",host_src->node_num,host_dst->node_num);
218 ns3_add_link(host_src->node_num,host_dst->node_num,bw,lat);
223 xbt_dynar_free(&tab_elements_num);
226 //Create link backbone
227 lat = xbt_strdup(cluster_bb_lat);
228 bw = xbt_strdup(cluster_bb_bw);
229 replace_lat_ns3(lat);
231 ns3_add_cluster(bw,lat,A_surfxml_cluster_id);
236 double ns3_get_link_latency (const void *link)
239 //XBT_DEBUG("link_id:%s link_lat:%s link_bdw:%s",((surf_ns3_link_t)link)->data->id,((surf_ns3_link_t)link)->data->lat,((surf_ns3_link_t)link)->data->bdw);
240 sscanf(((surf_ns3_link_t)link)->data->lat,"%lg",&lat);
243 double ns3_get_link_bandwidth (const void *link)
246 //XBT_DEBUG("link_id:%s link_lat:%s link_bdw:%s",((surf_ns3_link_t)link)->data->id,((surf_ns3_link_t)link)->data->lat,((surf_ns3_link_t)link)->data->bdw);
247 sscanf(((surf_ns3_link_t)link)->data->bdw,"%lg",&bdw);
251 static xbt_dynar_t ns3_get_route(const char *src, const char *dst)
253 return global_routing->get_route(src, dst);
256 void parse_ns3_end_platform(void)
260 // xbt_lib_cursor_t cursor = NULL;
261 // char *name = NULL;
262 // void **data = NULL;
263 // XBT_INFO("link_lib");
264 // xbt_lib_foreach(link_lib, cursor, name, data) {
265 // XBT_INFO("\tSee link '%s'\t--> NS3_LEVEL %p",
267 // data[NS3_LINK_LEVEL]);
270 // XBT_INFO("host_lib");
271 // xbt_lib_foreach(host_lib, cursor, name, data) {
272 // XBT_INFO("\tSee host '%s'\t--> NS3_LEVEL %p",
274 // data[NS3_HOST_LEVEL]);
277 // XBT_INFO("as_router_lib");
278 // xbt_lib_foreach(as_router_lib, cursor, name, data) {
279 // XBT_INFO("\tSee ASR '%s'\t--> NS3_LEVEL %p",
281 // data[NS3_ASR_LEVEL]);
287 /* Create the ns3 topology based on routing strategy */
288 void create_ns3_topology()
290 // int src_id,dst_id;
292 XBT_INFO("Starting topology generation");
294 //get the onelinks from the parsed platform
295 xbt_dynar_t onelink_routes = global_routing->get_onelink_routes();
297 xbt_die("There is no routes!");
298 XBT_INFO("Have get_onelink_routes, found %ld routes",onelink_routes->used);
299 //save them in trace file
302 xbt_dynar_foreach(onelink_routes, iter, onelink) {
303 char *src = onelink->src;
304 char *dst = onelink->dst;
305 void *link = onelink->link_ptr;
307 //TODO need to uncomment those two line
308 // src_id = *((int *) xbt_dict_get_or_null(global_routing->root->to_index,src));
309 // dst_id = *((int *) xbt_dict_get_or_null(global_routing->root->to_index,dst));
311 // if( (src_id != dst_id) && ((surf_ns3_link_t)link)->created){
312 if( strcmp(src,dst) && ((surf_ns3_link_t)link)->created){
313 XBT_INFO("Route from '%s' to '%s' with link '%s'",src,dst,((surf_ns3_link_t)link)->data->id);
314 char * link_bdw = xbt_strdup(((surf_ns3_link_t)link)->data->bdw);
315 char * link_lat = xbt_strdup(((surf_ns3_link_t)link)->data->lat);
316 ((surf_ns3_link_t)link)->created = 0;
318 replace_bdw_ns3(link_bdw);
319 replace_lat_ns3(link_lat);
320 // XBT_INFO("src (%s), dst (%s), src_id = %d, dst_id = %d",src,dst, src_id, dst_id);
321 XBT_INFO("\tLink (%s) bdw:%s->%s lat:%s->%s",((surf_ns3_link_t)link)->data->id,
322 ((surf_ns3_link_t)link)->data->bdw,link_bdw,
323 ((surf_ns3_link_t)link)->data->lat,link_lat
327 ns3_nodes_t host_src = xbt_lib_get_or_null(host_lib,src,NS3_HOST_LEVEL);
328 if(!host_src) host_src = xbt_lib_get_or_null(as_router_lib,src,NS3_ASR_LEVEL);
329 ns3_nodes_t host_dst = xbt_lib_get_or_null(host_lib,dst,NS3_HOST_LEVEL);
330 if(!host_dst) host_dst = xbt_lib_get_or_null(as_router_lib,dst,NS3_ASR_LEVEL);
332 if(host_src && host_dst){}
333 else xbt_die("\tns3_add_link from %d to %d",host_src->node_num,host_dst->node_num);
335 ns3_add_link(host_src->node_num,host_dst->node_num,link_bdw,link_lat);
343 static void define_callbacks_ns3(const char *filename)
345 surfxml_add_callback(STag_surfxml_host_cb_list, &parse_ns3_add_host); //HOST
346 surfxml_add_callback(STag_surfxml_router_cb_list, &parse_ns3_add_router); //ROUTER
347 surfxml_add_callback(STag_surfxml_link_cb_list, &parse_ns3_add_link); //LINK
348 surfxml_add_callback(STag_surfxml_AS_cb_list, &parse_ns3_add_AS); //AS
349 surfxml_add_callback(STag_surfxml_cluster_cb_list, &parse_ns3_add_cluster); //CLUSTER
351 surfxml_add_callback(ETag_surfxml_platform_cb_list, &create_ns3_topology); //get_one_link_routes
352 surfxml_add_callback(ETag_surfxml_platform_cb_list, &parse_ns3_end_platform); //InitializeRoutes
355 static void free_ns3_elmts(void * elmts)
359 static void free_ns3_link(void * elmts)
361 ns3_link_t link = elmts;
368 static void free_ns3_host(void * elmts)
370 ns3_nodes_t host = elmts;
374 void surf_network_model_init_NS3(const char *filename)
376 surf_network_model = surf_model_init();
377 surf_network_model->name = "network NS3";
378 surf_network_model->extension.network.get_link_latency = ns3_get_link_latency;
379 surf_network_model->extension.network.get_link_bandwidth = ns3_get_link_bandwidth;
380 surf_network_model->extension.network.get_route = ns3_get_route;
381 routing_model_create(sizeof(s_surf_ns3_link_t), NULL, NULL);
382 define_callbacks_ns3(filename);
384 NS3_HOST_LEVEL = xbt_lib_add_level(host_lib,(void_f_pvoid_t)free_ns3_host);
385 NS3_ASR_LEVEL = xbt_lib_add_level(as_router_lib,(void_f_pvoid_t)free_ns3_host);
386 NS3_LINK_LEVEL = xbt_lib_add_level(link_lib,(void_f_pvoid_t)free_ns3_link);
388 update_model_description(surf_network_model_description,
389 "NS3", surf_network_model);