X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/396ff07474b90b815131052dc33447e31c0bb337..55a57d141e37d5d7227db3af478dbdd2bdc58020:/src/surf/network_ns3.c diff --git a/src/surf/network_ns3.c b/src/surf/network_ns3.c index 16f4cc1a5c..032e099b4b 100644 --- a/src/surf/network_ns3.c +++ b/src/surf/network_ns3.c @@ -5,6 +5,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "surf_private.h" +#include "surf/maxmin.h" #include "surf/ns3/ns3_interface.h" #include "xbt/lib.h" #include "surf/network_ns3_private.h" @@ -17,8 +18,6 @@ extern xbt_lib_t as_router_lib; XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_ns3, surf, "Logging specific to the SURF network NS3 module"); -#define MAX_LENGHT_IPV4 16 //255.255.255.255\0 - extern routing_global_t global_routing; extern xbt_dict_t dict_socket; @@ -36,40 +35,24 @@ static int action_unref(surf_action_t action); xbt_dynar_t IPV4addr; -static void replace_str(char *str, const char *orig, const char *rep) +static void replace_bdw_ns3(char ** bdw) { - char buffer[30]; - char *p; - - if(!(p = strstr(str, orig))) // Is 'orig' even in 'str'? - return; - - strncpy(buffer, str, p-str); // Copy characters from 'str' start to 'orig' st$ - buffer[p-str] = '\0'; - - sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig)); - xbt_free(str); - str = xbt_strdup(buffer); -} - -static void replace_bdw_ns3(char * bdw) -{ - char *temp = xbt_strdup(bdw); - xbt_free(bdw); - bdw = bprintf("%fBps",atof(temp)); + char *temp = xbt_strdup(*bdw); + xbt_free(*bdw); + *bdw = bprintf("%fBps",atof(temp)); xbt_free(temp); } -static void replace_lat_ns3(char * lat) +static void replace_lat_ns3(char ** lat) { - char *temp = xbt_strdup(lat); - xbt_free(lat); - lat = bprintf("%fs",atof(temp)); + char *temp = xbt_strdup(*lat); + xbt_free(*lat); + *lat = bprintf("%fs",atof(temp)); xbt_free(temp); } -void parse_ns3_add_host(void) +static void parse_ns3_add_host(sg_platf_host_cbarg_t host) { XBT_DEBUG("NS3_ADD_HOST '%s'",A_surfxml_host_id); xbt_lib_set(host_lib, @@ -80,16 +63,15 @@ void parse_ns3_add_host(void) } static void ns3_free_dynar(void * elmts){ - if(elmts) - free(elmts); + free(elmts); return; } -void parse_ns3_add_link(void) +static void parse_ns3_add_link(sg_platf_link_cbarg_t l) { XBT_DEBUG("NS3_ADD_LINK '%s'",A_surfxml_link_id); - if(!IPV4addr) IPV4addr = xbt_dynar_new(MAX_LENGHT_IPV4*sizeof(char),ns3_free_dynar); + if(!IPV4addr) IPV4addr = xbt_dynar_new(sizeof(char*),ns3_free_dynar); tmgr_trace_t bw_trace; tmgr_trace_t state_trace; @@ -120,7 +102,8 @@ void parse_ns3_add_link(void) xbt_lib_set(link_lib,A_surfxml_link_id,NS3_LINK_LEVEL,link_ns3); xbt_lib_set(link_lib,A_surfxml_link_id,SURF_LINK_LEVEL,link); } -void parse_ns3_add_router(void) + +static void parse_ns3_add_router(sg_platf_router_cbarg_t router) { XBT_DEBUG("NS3_ADD_ROUTER '%s'",A_surfxml_router_id); xbt_lib_set(as_router_lib, @@ -129,7 +112,8 @@ void parse_ns3_add_router(void) ns3_add_router(A_surfxml_router_id) ); } -void parse_ns3_add_AS(void) + +static void parse_ns3_add_AS(const char*id, const char*routing) { XBT_DEBUG("NS3_ADD_AS '%s'",A_surfxml_AS_id); xbt_lib_set(as_router_lib, @@ -138,7 +122,8 @@ void parse_ns3_add_AS(void) ns3_add_AS(A_surfxml_AS_id) ); } -void parse_ns3_add_cluster(void) + +static void parse_ns3_add_cluster(sg_platf_cluster_cbarg_t cluster) { char *cluster_prefix = A_surfxml_cluster_prefix; char *cluster_suffix = A_surfxml_cluster_suffix; @@ -164,7 +149,7 @@ void parse_ns3_add_cluster(void) switch (xbt_dynar_length(radical_ends)) { case 1: - surf_parse_get_int(&start,xbt_dynar_get_as(radical_ends, 0, char *)); + start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *)); xbt_dynar_push_as(tab_elements_num, int, start); router_id = bprintf("ns3_%s%d%s", cluster_prefix, start, cluster_suffix); xbt_lib_set(host_lib, @@ -177,8 +162,8 @@ void parse_ns3_add_cluster(void) break; case 2: - surf_parse_get_int(&start,xbt_dynar_get_as(radical_ends, 0, char *)); - surf_parse_get_int(&end, xbt_dynar_get_as(radical_ends, 1, char *)); + start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *)); + end = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char *)); for (i = start; i <= end; i++){ xbt_dynar_push_as(tab_elements_num, int, i); router_id = bprintf("ns3_%s%d%s", cluster_prefix, i, cluster_suffix); @@ -202,8 +187,8 @@ void parse_ns3_add_cluster(void) int elmts; char * lat = xbt_strdup(cluster_lat); char * bw = xbt_strdup(cluster_bw); - replace_lat_ns3(lat); - replace_bdw_ns3(bw); + replace_lat_ns3(&lat); + replace_bdw_ns3(&bw); xbt_dynar_foreach(tab_elements_num,cpt,elmts) { @@ -217,7 +202,9 @@ void parse_ns3_add_cluster(void) if(host_src && host_dst){} else xbt_die("\tns3_add_link from %d to %d",host_src->node_num,host_dst->node_num); - ns3_add_link(host_src->node_num,host_dst->node_num,bw,lat); + ns3_add_link(host_src->node_num,host_src->type, + host_dst->node_num,host_dst->type, + bw,lat); free(router_id); free(host_id); @@ -228,21 +215,21 @@ void parse_ns3_add_cluster(void) //Create link backbone lat = xbt_strdup(cluster_bb_lat); bw = xbt_strdup(cluster_bb_bw); - replace_lat_ns3(lat); - replace_bdw_ns3(bw); + replace_lat_ns3(&lat); + replace_bdw_ns3(&bw); ns3_add_cluster(bw,lat,A_surfxml_cluster_id); xbt_free(lat); xbt_free(bw); } -double ns3_get_link_latency (const void *link) +static double ns3_get_link_latency (const void *link) { double lat; //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); sscanf(((surf_ns3_link_t)link)->data->lat,"%lg",&lat); return lat; } -double ns3_get_link_bandwidth (const void *link) +static double ns3_get_link_bandwidth (const void *link) { double bdw; //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); @@ -252,16 +239,18 @@ double ns3_get_link_bandwidth (const void *link) static xbt_dynar_t ns3_get_route(const char *src, const char *dst) { - return global_routing->get_route(src, dst); + xbt_dynar_t route = NULL; + routing_get_route_and_latency(src, dst, &route, NULL); + return route; } -void parse_ns3_end_platform(void) +static void parse_ns3_end_platform(void) { ns3_end_platform(); } /* Create the ns3 topology based on routing strategy */ -void create_ns3_topology() +static void create_ns3_topology(void) { XBT_DEBUG("Starting topology generation"); @@ -282,10 +271,10 @@ void create_ns3_topology() if( strcmp(src,dst) && ((surf_ns3_link_t)link)->created){ XBT_DEBUG("Route from '%s' to '%s' with link '%s'",src,dst,((surf_ns3_link_t)link)->data->id); - char * link_bdw = bprintf("%s",((surf_ns3_link_t)link)->data->bdw); - char * link_lat = bprintf("%s",(((surf_ns3_link_t)link)->data->lat)); - replace_lat_ns3(link_lat); - replace_bdw_ns3(link_bdw); + char * link_bdw = xbt_strdup(((surf_ns3_link_t)link)->data->bdw); + char * link_lat = xbt_strdup(((surf_ns3_link_t)link)->data->lat); + replace_lat_ns3(&link_lat); + replace_bdw_ns3(&link_bdw); ((surf_ns3_link_t)link)->created = 0; // XBT_DEBUG("src (%s), dst (%s), src_id = %d, dst_id = %d",src,dst, src_id, dst_id); @@ -303,7 +292,7 @@ void create_ns3_topology() if(host_src && host_dst){} else xbt_die("\tns3_add_link from %d to %d",host_src->node_num,host_dst->node_num); - ns3_add_link(host_src->node_num,host_dst->node_num,link_bdw,link_lat); + ns3_add_link(host_src->node_num,host_src->type,host_dst->node_num,host_dst->type,link_bdw,link_lat); xbt_free(link_bdw); xbt_free(link_lat); @@ -311,20 +300,15 @@ void create_ns3_topology() } } -static void define_callbacks_ns3(const char *filename) -{ - surfxml_add_callback(STag_surfxml_host_cb_list, &parse_ns3_add_host); //HOST - surfxml_add_callback(STag_surfxml_router_cb_list, &parse_ns3_add_router); //ROUTER - surfxml_add_callback(STag_surfxml_link_cb_list, &parse_ns3_add_link); //LINK - surfxml_add_callback(STag_surfxml_AS_cb_list, &parse_ns3_add_AS); //AS - surfxml_add_callback(STag_surfxml_cluster_cb_list, &parse_ns3_add_cluster); //CLUSTER - - surfxml_add_callback(ETag_surfxml_platform_cb_list, &create_ns3_topology); //get_one_link_routes - surfxml_add_callback(ETag_surfxml_platform_cb_list, &parse_ns3_end_platform); //InitializeRoutes -} - -static void free_ns3_elmts(void * elmts) +static void define_callbacks_ns3(void) { + sg_platf_host_add_cb (&parse_ns3_add_host); + sg_platf_router_add_cb (&parse_ns3_add_router); + sg_platf_link_add_cb (&parse_ns3_add_link); + sg_platf_cluster_add_cb (&parse_ns3_add_cluster); + sg_platf_AS_begin_add_cb (&parse_ns3_add_AS); + sg_platf_postparse_add_cb(&create_ns3_topology); //get_one_link_routes + sg_platf_postparse_add_cb(&parse_ns3_end_platform); //InitializeRoutes } static void free_ns3_link(void * elmts) @@ -349,7 +333,14 @@ static int ns3_get_link_latency_limited(surf_action_t action) } #endif -void surf_network_model_init_NS3(const char *filename) +#ifdef HAVE_TRACING +static void ns3_action_set_category(surf_action_t action, const char *category) +{ + action->category = xbt_strdup (category); +} +#endif + +void surf_network_model_init_NS3() { if (surf_network_model) return; @@ -370,21 +361,24 @@ void surf_network_model_init_NS3(const char *filename) surf_network_model->action_unref = action_unref; surf_network_model->extension.network.communicate = ns3_communicate; +#ifdef HAVE_TRACING + surf_network_model->set_category = ns3_action_set_category; +#endif + /* Added the initialization for NS3 interface */ - if (ns3_initialize()) { + + if (ns3_initialize(xbt_cfg_get_string(_surf_cfg_set,"ns3/TcpModel"))) { xbt_die("Impossible to initialize NS3 interface"); } - routing_model_create(sizeof(s_surf_ns3_link_t), NULL, NULL); - define_callbacks_ns3(filename); + routing_model_create(sizeof(s_surf_ns3_link_t), NULL); + define_callbacks_ns3(); NS3_HOST_LEVEL = xbt_lib_add_level(host_lib,(void_f_pvoid_t)free_ns3_host); NS3_ASR_LEVEL = xbt_lib_add_level(as_router_lib,(void_f_pvoid_t)free_ns3_host); NS3_LINK_LEVEL = xbt_lib_add_level(link_lib,(void_f_pvoid_t)free_ns3_link); xbt_dynar_push(model_list, &surf_network_model); - update_model_description(surf_network_model_description, - "NS3", surf_network_model); #ifdef HAVE_LATENCY_BOUND_TRACKING surf_network_model->get_latency_limited = ns3_get_link_latency_limited; @@ -395,6 +389,7 @@ static void finalize(void) { ns3_finalize(); xbt_dynar_free_container(&IPV4addr); + xbt_dict_free(&dict_socket); } static double ns3_share_resources(double min) @@ -405,20 +400,19 @@ static double ns3_share_resources(double min) surf_network_model->states.running_action_set; //get the first relevant value from the running_actions list - if (!xbt_swag_size(running_actions)) - return -1.0; - - ns3_simulator(min); - time_to_next_flow_completion = ns3_time() - surf_get_clock(); - -// XBT_INFO("min : %f",min); -// XBT_INFO("ns3 time : %f",ns3_time()); -// XBT_INFO("surf time : %f",surf_get_clock()); + if (!xbt_swag_size(running_actions) || min == 0.0) + return -1.0; + else + do { + ns3_simulator(min); + time_to_next_flow_completion = ns3_time() - surf_get_clock(); + } while(double_equals(time_to_next_flow_completion,0)); + + XBT_DEBUG("min : %f",min); + XBT_DEBUG("ns3 time : %f",ns3_time()); + XBT_DEBUG("surf time : %f",surf_get_clock()); + XBT_DEBUG("Next completion %f :",time_to_next_flow_completion); - xbt_assert(time_to_next_flow_completion, - "Time to next flow completion not initialized!\n"); - - XBT_DEBUG("ns3_share_resources return %f",time_to_next_flow_completion); return time_to_next_flow_completion; } @@ -428,31 +422,63 @@ static void ns3_update_actions_state(double now, double delta) char *key; void *data; + static xbt_dynar_t socket_to_destroy = NULL; + if(!socket_to_destroy) socket_to_destroy = xbt_dynar_new(sizeof(char*),NULL); + surf_action_network_ns3_t action = NULL; xbt_swag_t running_actions = surf_network_model->states.running_action_set; /* If there are no running flows, just return */ - if (!xbt_swag_size(running_actions)) - return; + if (!xbt_swag_size(running_actions)) { + while(double_positive(now-ns3_time())) { + ns3_simulator(now-ns3_time()); + } + return; + } xbt_dict_foreach(dict_socket,cursor,key,data){ action = (surf_action_network_ns3_t)ns3_get_socket_action(data); + XBT_DEBUG("Processing socket %p (action %p)",data,action); action->generic_action.remains = action->generic_action.cost - ns3_get_socket_sent(data); #ifdef HAVE_TRACING - if (surf_action_state_get(&(action->generic_action)) == SURF_ACTION_RUNNING){ -// double data_sent = ns3_get_socket_sent(data) - action->last_sent; - //TRACE here using data_sent/delta as data rate -// action->last_sent = ns3_get_socket_sent(data); + if (TRACE_is_enabled() && + surf_action_state_get(&(action->generic_action)) == SURF_ACTION_RUNNING){ + double data_sent = ns3_get_socket_sent(data); + double data_delta_sent = data_sent - action->last_sent; + + xbt_dynar_t route = NULL; + routing_get_route_and_latency (action->src_name, action->dst_name, &route, NULL); + unsigned int i; + for (i = 0; i < xbt_dynar_length (route); i++){ + surf_ns3_link_t *link = ((surf_ns3_link_t*)xbt_dynar_get_ptr (route, i)); + TRACE_surf_link_set_utilization ((*link)->generic_resource.name, + ((surf_action_t) action)->category, + (data_delta_sent)/delta, + now-delta, + delta); + } + action->last_sent = data_sent; } #endif if(ns3_get_socket_is_finished(data) == 1){ + xbt_dynar_push(socket_to_destroy,&key); + XBT_DEBUG("Destroy socket %p of action %p", key, action); action->generic_action.finish = now; surf_action_state_set(&(action->generic_action), SURF_ACTION_DONE); } } + + while (!xbt_dynar_is_empty(socket_to_destroy)){ + xbt_dynar_pop(socket_to_destroy,&key); + + void *data = xbt_dict_get (dict_socket, key); + surf_action_network_ns3_t action = (surf_action_network_ns3_t)ns3_get_socket_action(data); + XBT_DEBUG ("Removing socket %p of action %p", key, action); + xbt_dict_remove(dict_socket,key); + } return; } @@ -503,10 +529,9 @@ static int action_unref(surf_action_t action) #ifdef HAVE_TRACING xbt_free(((surf_action_network_ns3_t)action)->src_name); xbt_free(((surf_action_network_ns3_t)action)->dst_name); - if (action->category) - xbt_free(action->category); + xbt_free(action->category); #endif - + XBT_DEBUG ("Removing action %p", action); surf_action_free(&action); return 1; }