X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/79fd65da851a00fe5be321bfe645af2d8183fe49..8353ca761ac086a2dffa56a6b1c862f19b803879:/src/surf/network_ns3.c diff --git a/src/surf/network_ns3.c b/src/surf/network_ns3.c index 0d18ffd378..595dfc5da3 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; @@ -52,20 +51,20 @@ static void replace_str(char *str, const char *orig, const char *rep) str = xbt_strdup(buffer); } -static void replace_bdw_ns3(char * bdw) +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); } @@ -89,7 +88,7 @@ void parse_ns3_add_link(void) { 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; @@ -202,8 +201,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 +216,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,8 +229,8 @@ 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); @@ -284,8 +285,8 @@ void create_ns3_topology() 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); + 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 +304,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); @@ -349,6 +350,13 @@ static int ns3_get_link_latency_limited(surf_action_t action) } #endif +#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(const char *filename) { if (surf_network_model) @@ -370,8 +378,13 @@ 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"); } @@ -395,6 +408,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 +419,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; + 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); - 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()); - - 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,16 +441,24 @@ 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 @@ -462,10 +483,21 @@ static void ns3_update_actions_state(double now, double delta) #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_length(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; } @@ -519,7 +551,7 @@ static int action_unref(surf_action_t action) if (action->category) xbt_free(action->category); #endif - + XBT_DEBUG ("Removing action %p", action); surf_action_free(&action); return 1; }