X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c87c7201f47679626bdce5214c1c914f13c973ae..b23f76c819d776be7e164c27102a3dd969ca2880:/src/surf/surf_routing.c diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 3f576f50d3..3428327e5f 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -25,6 +25,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route, surf, "Routing part of surf"); routing_global_t global_routing = NULL; routing_component_t current_routing = NULL; model_type_t current_routing_model = NULL; +static double_f_cpvoid_t get_link_latency = NULL; /* Prototypes of each model */ static void *model_full_create(void); /* create structures for full routing model */ @@ -123,6 +124,7 @@ static int surf_pointer_resource_cmp(const void *a, const void *b); /* ************************************************************************** */ /* *************** GENERIC BUSINESS METHODS (declarations) ****************** */ +static double generic_get_link_latency(routing_component_t rc, const char *src, const char *dst); static xbt_dynar_t generic_get_onelink_routes(routing_component_t rc); static route_extended_t generic_get_bypassroute(routing_component_t rc, const char *src, @@ -241,7 +243,7 @@ static void parse_S_route_new_and_endpoints(const char *src_id, const char *dst_ } /** - * \breif Set the endpoints for a route from XML + * \brief Set the endpoints for a route from XML */ static void parse_S_route_new_and_endpoints_XML(void) { @@ -250,7 +252,7 @@ static void parse_S_route_new_and_endpoints_XML(void) } /** - * \breif Set the endpoints for a route from lua + * \brief Set the endpoints for a route from lua */ static void parse_S_route_new_and_endpoints_lua(const char *id_src, const char *id_dst) { @@ -312,12 +314,18 @@ static void parse_E_link_ctn_new_elem(char *link_id) static void parse_E_link_ctn_new_elem_XML(void) { - if( A_surfxml_link_ctn_direction == A_surfxml_link_ctn_direction_NONE) - parse_E_link_ctn_new_elem(A_surfxml_link_ctn_id); - if( A_surfxml_link_ctn_direction == A_surfxml_link_ctn_direction_UP) - parse_E_link_ctn_new_elem(bprintf("%s_UP",A_surfxml_link_ctn_id)); - if( A_surfxml_link_ctn_direction == A_surfxml_link_ctn_direction_DOWN) - parse_E_link_ctn_new_elem(bprintf("%s_DOWN",A_surfxml_link_ctn_id)); + if (A_surfxml_link_ctn_direction == A_surfxml_link_ctn_direction_NONE) + parse_E_link_ctn_new_elem(A_surfxml_link_ctn_id); + if (A_surfxml_link_ctn_direction == A_surfxml_link_ctn_direction_UP) { + char *link_id = bprintf("%s_UP", A_surfxml_link_ctn_id); + parse_E_link_ctn_new_elem(link_id); + free(link_id); + } + if (A_surfxml_link_ctn_direction == A_surfxml_link_ctn_direction_DOWN) { + char *link_id = bprintf("%s_DOWN", A_surfxml_link_ctn_id); + parse_E_link_ctn_new_elem(link_id); + free(link_id); + } } /** @@ -569,8 +577,8 @@ static xbt_dynar_t elements_father(const char *src, const char *dst) } /* (3) find the common father */ - index_src = (path_src->used) - 1; - index_dst = (path_dst->used) - 1; + index_src = path_src->used - 1; + index_dst = path_dst->used - 1; current_src = xbt_dynar_get_ptr(path_src, index_src); current_dst = xbt_dynar_get_ptr(path_dst, index_dst); while (index_src >= 0 && index_dst >= 0 && *current_src == *current_dst) { @@ -714,6 +722,118 @@ static route_extended_t _get_route(const char *src, const char *dst) return e_route; } +static double _get_latency(const char *src, const char *dst) +{ + + double latency, latency_src, latency_dst = 0.0; + + DEBUG2("Solve route \"%s\" to \"%s\"", src, dst); + + xbt_assert0(src && dst, "bad parameters for \"_get_route\" method"); + + route_extended_t e_route, e_route_cnt; + + xbt_dynar_t elem_father_list = elements_father(src, dst); + + routing_component_t common_father = + xbt_dynar_get_as(elem_father_list, 0, routing_component_t); + routing_component_t src_father = + xbt_dynar_get_as(elem_father_list, 1, routing_component_t); + routing_component_t dst_father = + xbt_dynar_get_as(elem_father_list, 2, routing_component_t); + + e_route = xbt_new0(s_route_extended_t, 1); + e_route->src_gateway = NULL; + e_route->dst_gateway = NULL; + e_route->generic_route.link_list = + xbt_dynar_new(global_routing->size_of_link, NULL); + + if (src_father == dst_father) { /* SURF_ROUTING_BASE */ + + if (strcmp(src, dst)) { + latency = + (*(common_father->get_latency)) (common_father, src, dst); + xbt_assert2(latency>=0, "no route between \"%s\" and \"%s\"", src, + dst); + } else latency = 0; + } else { /* SURF_ROUTING_RECURSIVE */ + route_extended_t e_route_bypass = NULL; + + if (common_father->get_bypass_route) + e_route_bypass = + (*(common_father->get_bypass_route)) (common_father, src, dst); + + xbt_assert0(!e_route_bypass,"Bypass cannot work yet with get_latency"); + + e_route_cnt = + (*(common_father->get_route)) (common_father, src_father->name, + dst_father->name); + + xbt_assert2(e_route_cnt, "no route between \"%s\" and \"%s\"", + src_father->name, dst_father->name); + + xbt_assert2((e_route_cnt->src_gateway == NULL) == + (e_route_cnt->dst_gateway == NULL), + "bad gateway for route between \"%s\" and \"%s\"", src, + dst); + latency = + (*(common_father->get_latency)) (common_father, src_father->name, + dst_father->name); + xbt_assert2(latency>=0, "no route between \"%s\" and \"%s\"", + src_father->name, dst_father->name); + + + if (src != e_route_cnt->src_gateway) { + /* + e_route_src = _get_route(src, e_route_cnt->src_gateway); + xbt_assert2(e_route_src, "no route between \"%s\" and \"%s\"", src, + e_route_cnt->src_gateway); + xbt_dynar_foreach(e_route_src->generic_route.link_list, cpt, link) { + xbt_dynar_push(e_route->generic_route.link_list, &link); + } + */ + latency_src = _get_latency(src, e_route_cnt->src_gateway); + xbt_assert2(latency_src>=0, "no route between \"%s\" and \"%s\"", src, + e_route_cnt->src_gateway); + latency += latency_src; + } + + /* + xbt_dynar_foreach(e_route_cnt->generic_route.link_list, cpt, link) { + xbt_dynar_push(e_route->generic_route.link_list, &link); + } + */ + + if (e_route_cnt->dst_gateway != dst) { + /* + e_route_dst = _get_route(e_route_cnt->dst_gateway, dst); + xbt_assert2(e_route_dst, "no route between \"%s\" and \"%s\"", + e_route_cnt->dst_gateway, dst); + xbt_dynar_foreach(e_route_dst->generic_route.link_list, cpt, link) { + xbt_dynar_push(e_route->generic_route.link_list, &link); + } + */ + latency_dst = _get_latency(e_route_cnt->dst_gateway, dst); + xbt_assert2(latency_dst>=0, "no route between \"%s\" and \"%s\"", + e_route_cnt->dst_gateway, dst); + latency += latency_dst; + } + + /* + e_route->src_gateway = xbt_strdup(e_route_cnt->src_gateway); + e_route->dst_gateway = xbt_strdup(e_route_cnt->dst_gateway); + + generic_free_extended_route(e_route_src); + generic_free_extended_route(e_route_cnt); + generic_free_extended_route(e_route_dst); + */ + } + + xbt_dynar_free(&elem_father_list); + + return latency; +} + /** * \brief Generic method: find a route between hosts * @@ -774,6 +894,25 @@ static xbt_dynar_t get_route_no_cleanup(const char *src, const char *dst) return d; } +/*Get Latency*/ +static double get_latency(const char *src, const char *dst) +{ + + double latency = -1.0; + xbt_dynar_t elem_father_list = elements_father(src, dst); + routing_component_t common_father = + xbt_dynar_get_as(elem_father_list, 0, routing_component_t); + + if (strcmp(src, dst)) + latency = _get_latency(src, dst); + else + latency = (*(common_father->get_latency)) (common_father, src, dst); + + xbt_assert2(latency>=0.0, "no route between \"%s\" and \"%s\"", src, dst); + + return latency; +} + /** * \brief Recursive function for finalize * @@ -865,7 +1004,7 @@ static e_surf_network_element_type_t get_network_element_type(const char * * Make a global routing structure and set all the parsing functions. */ -void routing_model_create(size_t size_of_links, void *loopback) +void routing_model_create(size_t size_of_links, void *loopback, double_f_cpvoid_t get_link_latency_fun) { /* config the uniq global routing */ @@ -873,6 +1012,7 @@ void routing_model_create(size_t size_of_links, void *loopback) global_routing->where_network_elements = xbt_dict_new(); global_routing->root = NULL; global_routing->get_route = get_route; + global_routing->get_latency = get_latency; global_routing->get_route_no_cleanup = get_route_no_cleanup; global_routing->get_onelink_routes = get_onelink_routes; global_routing->get_network_element_type = get_network_element_type; @@ -880,7 +1020,7 @@ void routing_model_create(size_t size_of_links, void *loopback) global_routing->loopback = loopback; global_routing->size_of_link = size_of_links; global_routing->last_route = NULL; - + get_link_latency = get_link_latency_fun; /* no current routing at moment */ current_routing = NULL; @@ -1044,6 +1184,7 @@ static void *model_full_create(void) new_component->generic_routing.set_ASroute = model_full_set_route; new_component->generic_routing.set_bypassroute = generic_set_bypassroute; new_component->generic_routing.get_route = full_get_route; + new_component->generic_routing.get_latency = generic_get_link_latency; new_component->generic_routing.get_onelink_routes = full_get_onelink_routes; new_component->generic_routing.get_bypass_route = @@ -1144,15 +1285,15 @@ static void model_full_set_route(routing_component_t rc, const char *src, xbt_dynar_shrink(TO_ROUTE_FULL(*src_id, *dst_id)->generic_route.link_list, 0); } - if( A_surfxml_route_symetrical == A_surfxml_route_symetrical_YES - || A_surfxml_ASroute_symetrical == A_surfxml_ASroute_symetrical_YES ) + if( A_surfxml_route_symmetrical == A_surfxml_route_symmetrical_YES + || A_surfxml_ASroute_symmetrical == A_surfxml_ASroute_symmetrical_YES ) { if(route->dst_gateway && route->src_gateway) { - char * gw_src = bprintf("%s",route->src_gateway); - char * gw_dst = bprintf("%s",route->dst_gateway); - route->src_gateway = bprintf("%s",gw_dst); - route->dst_gateway = bprintf("%s",gw_src); + char *gw_src = xbt_strdup(route->src_gateway); + char *gw_dst = xbt_strdup(route->dst_gateway); + route->src_gateway = gw_dst; + route->dst_gateway = gw_src; } if(TO_ROUTE_FULL(*dst_id, *src_id)) { @@ -1365,6 +1506,7 @@ static void *model_floyd_create(void) new_component->generic_routing.set_ASroute = model_floyd_set_route; new_component->generic_routing.set_bypassroute = generic_set_bypassroute; new_component->generic_routing.get_route = floyd_get_route; + new_component->generic_routing.get_latency = generic_get_link_latency; new_component->generic_routing.get_onelink_routes = floyd_get_onelink_routes; new_component->generic_routing.get_bypass_route = @@ -1515,8 +1657,8 @@ static void model_floyd_set_route(routing_component_t rc, const char *src, ((TO_FLOYD_LINK(*src_id, *dst_id))->generic_route.link_list)->used; /* count of links, old model assume 1 */ } - if( A_surfxml_route_symetrical == A_surfxml_route_symetrical_YES - || A_surfxml_ASroute_symetrical == A_surfxml_ASroute_symetrical_YES ) + if( A_surfxml_route_symmetrical == A_surfxml_route_symmetrical_YES + || A_surfxml_ASroute_symmetrical == A_surfxml_ASroute_symmetrical_YES ) { if(TO_FLOYD_LINK(*dst_id, *src_id)) { @@ -1546,10 +1688,10 @@ static void model_floyd_set_route(routing_component_t rc, const char *src, { if(route->dst_gateway && route->src_gateway) { - char * gw_src = bprintf("%s",route->src_gateway); - char * gw_dst = bprintf("%s",route->dst_gateway); - route->src_gateway = bprintf("%s",gw_dst); - route->dst_gateway = bprintf("%s",gw_src); + char *gw_src = xbt_strdup(route->src_gateway); + char *gw_dst = xbt_strdup(route->dst_gateway); + route->src_gateway = gw_dst; + route->dst_gateway = gw_src; } if(!route->dst_gateway && !route->src_gateway) @@ -1983,6 +2125,7 @@ static void *model_dijkstra_both_create(int cached) new_component->generic_routing.set_ASroute = model_dijkstra_both_set_route; //TODO new_component->generic_routing.set_bypassroute = generic_set_bypassroute; new_component->generic_routing.get_route = dijkstra_get_route; + new_component->generic_routing.get_latency = generic_get_link_latency; new_component->generic_routing.get_onelink_routes = dijkstra_get_onelink_routes; new_component->generic_routing.get_bypass_route = @@ -2054,8 +2197,8 @@ static void model_dijkstra_both_set_route (routing_component_t rc, const char *s if (routing->cached && !routing->route_cache) routing->route_cache = xbt_dict_new(); - if( A_surfxml_route_symetrical == A_surfxml_route_symetrical_YES - || A_surfxml_ASroute_symetrical == A_surfxml_ASroute_symetrical_YES ) + if( A_surfxml_route_symmetrical == A_surfxml_route_symmetrical_YES + || A_surfxml_ASroute_symmetrical == A_surfxml_ASroute_symmetrical_YES ) xbt_die("Route symmetrical not supported on model dijkstra"); if(!route->dst_gateway && !route->src_gateway) @@ -2106,9 +2249,9 @@ static void rule_route_free(void *e) xbt_dynar_free(&(*elem)->re_str_link); pcre_free((*elem)->re_src); pcre_free((*elem)->re_dst); - xbt_free((*elem)); + xbt_free(*elem); } - (*elem) = NULL; + *elem = NULL; } static void rule_route_extended_free(void *e) @@ -2120,7 +2263,7 @@ static void rule_route_extended_free(void *e) pcre_free((*elem)->generic_rule_route.re_dst); xbt_free((*elem)->re_src_gateway); xbt_free((*elem)->re_dst_gateway); - xbt_free((*elem)); + xbt_free(*elem); } } @@ -2637,16 +2780,14 @@ static void generic_set_autonomous_system(routing_component_t rc, xbt_dict_set(_to_index, name, id, xbt_free); } -static int surf_pointer_resource_cmp(const void *a, const void *b) { - if(a == b) - return 0; - return 1; +static int surf_pointer_resource_cmp(const void *a, const void *b) +{ + return a != b; } -static int surf_link_resource_cmp(const void *a, const void *b) { - if( memcmp(a,b,global_routing->size_of_link) == 0 ); - return 0; - return 1; +static int surf_link_resource_cmp(const void *a, const void *b) +{ + return !!memcmp(a,b,global_routing->size_of_link); } static void generic_set_bypassroute(routing_component_t rc, @@ -2678,6 +2819,20 @@ static void generic_set_bypassroute(routing_component_t rc, /* ************************************************************************** */ /* *********************** GENERIC BUSINESS METHODS ************************* */ +static double generic_get_link_latency(routing_component_t rc, + const char *src, const char *dst) +{ + route_extended_t route = rc->get_route(rc,src,dst); + void * link; + unsigned int i; + double latency = 0.0; + + xbt_dynar_foreach(route->generic_route.link_list,i,link) { + latency += get_link_latency(link); + } + return latency; +} + static xbt_dynar_t generic_get_onelink_routes(routing_component_t rc) { xbt_die("\"generic_get_onelink_routes\" not implemented yet"); @@ -2723,8 +2878,8 @@ static route_extended_t generic_get_bypassroute(routing_component_t rc, } /* (3) find the common father */ - index_src = (path_src->used) - 1; - index_dst = (path_dst->used) - 1; + index_src = path_src->used - 1; + index_dst = path_dst->used - 1; current_src = xbt_dynar_get_ptr(path_src, index_src); current_dst = xbt_dynar_get_ptr(path_dst, index_dst); while (index_src >= 0 && index_dst >= 0 && *current_src == *current_dst) { @@ -2737,8 +2892,8 @@ static route_extended_t generic_get_bypassroute(routing_component_t rc, current_dst = xbt_dynar_get_ptr(path_dst, index_dst); } - int max_index_src = (path_src->used) - 1; - int max_index_dst = (path_dst->used) - 1; + int max_index_src = path_src->used - 1; + int max_index_dst = path_dst->used - 1; int max_index = max(max_index_src, max_index_dst); int i, max; @@ -3122,6 +3277,8 @@ static void routing_parse_Scluster(void) SURFXML_START_TAG(link); SURFXML_END_TAG(link); + free(link_id); + free(host_id); break; case 2: @@ -3162,6 +3319,9 @@ static void routing_parse_Scluster(void) SURFXML_BUFFER_SET(link_state_file, ""); SURFXML_START_TAG(link); SURFXML_END_TAG(link); + + free(link_id); + free(host_id); } break; @@ -3171,6 +3331,7 @@ static void routing_parse_Scluster(void) xbt_dynar_free(&radical_ends); } + xbt_dynar_free(&radical_elements); DEBUG0(" "); router_id = @@ -3217,39 +3378,47 @@ static void routing_parse_Scluster(void) DEBUG0(" "); #ifdef HAVE_PCRE_LIB - char *new_suffix = bprintf("%s", ""); + char *new_suffix = xbt_strdup(""); radical_elements = xbt_str_split(cluster_suffix, "."); xbt_dynar_foreach(radical_elements, iter, groups) { if (strcmp(groups, "")) { - new_suffix = bprintf("%s\\.%s", new_suffix, groups); + char *old_suffix = new_suffix; + new_suffix = bprintf("%s\\.%s", old_suffix, groups); + free(old_suffix); } } route_src_dst = bprintf("%s(.*)%s", cluster_prefix, new_suffix); + xbt_dynar_free(&radical_elements); + free(new_suffix); + + char *pcre_link_src = bprintf("%s_link_$1src", cluster_id); + char *pcre_link_backbone = bprintf("%s_backbone", cluster_id); + char *pcre_link_dst = bprintf("%s_link_$1dst", cluster_id); DEBUG2(""); + DEBUG0("symmetrical=\"NO\">"); SURFXML_BUFFER_SET(route_src, route_src_dst); SURFXML_BUFFER_SET(route_dst, route_src_dst); - A_surfxml_route_symetrical = A_surfxml_route_symetrical_NO; + A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; SURFXML_START_TAG(route); - DEBUG1("", cluster_id); - SURFXML_BUFFER_SET(link_ctn_id, bprintf("%s_link_$1src", cluster_id)); + DEBUG1("", pcre_link_src); + SURFXML_BUFFER_SET(link_ctn_id, pcre_link_src); A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX) {A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_UP;} SURFXML_START_TAG(link_ctn); SURFXML_END_TAG(link_ctn); - DEBUG1("", cluster_id); - SURFXML_BUFFER_SET(link_ctn_id, bprintf("%s_backbone", cluster_id)); + DEBUG1("", pcre_link_backbone); + SURFXML_BUFFER_SET(link_ctn_id, pcre_link_backbone); A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; SURFXML_START_TAG(link_ctn); SURFXML_END_TAG(link_ctn); - DEBUG1("", cluster_id); - SURFXML_BUFFER_SET(link_ctn_id, bprintf("%s_link_$1dst", cluster_id)); + DEBUG1("", pcre_link_dst); + SURFXML_BUFFER_SET(link_ctn_id, pcre_link_dst); A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX) {A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_DOWN;} @@ -3258,6 +3427,11 @@ static void routing_parse_Scluster(void) DEBUG0(""); SURFXML_END_TAG(route); + + free(pcre_link_dst); + free(pcre_link_backbone); + free(pcre_link_src); + free(route_src_dst); #else for (i = 0; i <= xbt_dynar_length(tab_elements_num); i++) { for (j = 0; j <= xbt_dynar_length(tab_elements_num); j++) { @@ -3280,10 +3454,10 @@ static void routing_parse_Scluster(void) } DEBUG2(""); + DEBUG0("symmetrical=\"NO\">"); SURFXML_BUFFER_SET(route_src, route_src); SURFXML_BUFFER_SET(route_dst, route_dst); - A_surfxml_route_symetrical = A_surfxml_route_symetrical_NO; + A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; SURFXML_START_TAG(route); if (i == xbt_dynar_length(tab_elements_num)) { @@ -3329,8 +3503,13 @@ static void routing_parse_Scluster(void) } } xbt_dynar_free(&tab_elements_num); + free(router_id); + #endif + free(link_backbone); + free(link_router); + DEBUG0(""); SURFXML_END_TAG(AS); DEBUG0(" ");