X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1c956954c1fd024c0f7ee2b015827a7b4e33fe72..919edbcd087b9ad979957ea49c05d1453bab8e69:/src/surf/surf_routing.c diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 0330b295b4..f607a184cb 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_pvoid_t get_link_latency = NULL; /* Prototypes of each model */ static void *model_full_create(void); /* create structures for full routing model */ @@ -113,10 +114,6 @@ static void generic_set_processing_unit(routing_component_t rc, const char *name); static void generic_set_autonomous_system(routing_component_t rc, const char *name); -static void generic_set_route(routing_component_t rc, const char *src, - const char *dst, name_route_t route); -static void generic_set_ASroute(routing_component_t rc, const char *src, - const char *dst, route_extended_t e_route); static void generic_set_bypassroute(routing_component_t rc, const char *src, const char *dst, route_extended_t e_route); @@ -127,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, @@ -138,6 +136,9 @@ static route_extended_t generic_get_bypassroute(routing_component_t rc, static route_extended_t generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy, void *data, int order); +static route_t +generic_new_route(e_surf_routing_hierarchy_t hierarchy, + void *data, int order); static void generic_free_route(route_t route); static void generic_free_extended_route(route_extended_t e_route); static routing_component_t @@ -151,8 +152,8 @@ static void generic_src_dst_check(routing_component_t rc, const char *src, /* **************************** GLOBAL FUNCTIONS **************************** */ /* global parse functions */ -static char *src = NULL; /* temporary store the source name of a route */ -static char *dst = NULL; /* temporary store the destination name of a route */ +static const char *src = NULL; /* temporary store the source name of a route */ +static const char *dst = NULL; /* temporary store the destination name of a route */ static char *gw_src = NULL; /* temporary store the gateway source name of a route */ static char *gw_dst = NULL; /* temporary store the gateway destination name of a route */ static xbt_dynar_t link_list = NULL; /* temporary store of current list link of a route */ @@ -166,7 +167,7 @@ static void parse_S_host(char *host_id) current_routing->hierarchy = SURF_ROUTING_BASE; xbt_assert1(!xbt_dict_get_or_null (global_routing->where_network_elements, host_id), - "Reading a host, processing unit \"%s\" already exist", + "Reading a host, processing unit \"%s\" already exists", host_id); xbt_assert1(current_routing->set_processing_unit, "no defined method \"set_processing_unit\" in \"%s\"", @@ -208,7 +209,7 @@ static void parse_S_router(void) xbt_assert1(!xbt_dict_get_or_null (global_routing->where_network_elements, A_surfxml_router_id), - "Reading a router, processing unit \"%s\" already exist", + "Reading a router, processing unit \"%s\" already exists", A_surfxml_router_id); xbt_assert1(current_routing->set_processing_unit, "no defined method \"set_processing_unit\" in \"%s\"", @@ -228,7 +229,7 @@ static void parse_S_router(void) /** * \brief Set the endponints for a route */ -static void parse_S_route_new_and_endpoints(char *src_id, char *dst_id) +static void parse_S_route_new_and_endpoints(const char *src_id, const char *dst_id) { if (src != NULL && dst != NULL && link_list != NULL) THROW2(arg_error, 0, "Route between %s to %s can not be defined", @@ -253,7 +254,7 @@ static void parse_S_route_new_and_endpoints_XML(void) /** * \breif Set the endpoints for a route from lua */ -static void parse_S_route_new_and_endpoints_lua(char *id_src, char *id_dst) +static void parse_S_route_new_and_endpoints_lua(const char *id_src, const char *id_dst) { parse_S_route_new_and_endpoints(id_src, id_dst); } @@ -430,7 +431,7 @@ static void parse_S_AS(char *AS_id, char *AS_routing) xbt_assert1(!xbt_dict_get_or_null (current_routing->routing_sons, AS_id), - "The AS \"%s\" already exist", AS_id); + "The AS \"%s\" already exists", AS_id); /* it is a part of the tree */ new_routing->routing_father = current_routing; /* set the father behavior */ @@ -485,7 +486,7 @@ static void parse_E_AS(char *AS_id) network_element_info_t info = NULL; xbt_assert1(!xbt_dict_get_or_null (global_routing->where_network_elements, - current_routing->name), "The AS \"%s\" already exist", + current_routing->name), "The AS \"%s\" already exists", current_routing->name); info = xbt_new0(s_network_element_info_t, 1); info->rc_component = current_routing->routing_father; @@ -715,6 +716,121 @@ 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) +{ + + void *link; + unsigned int cpt = 0; + 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, e_route_src = NULL, e_route_dst = + NULL; + + 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 * @@ -775,6 +891,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 * @@ -866,7 +1001,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_pvoid_t get_link_latency_fun ) { /* config the uniq global routing */ @@ -874,6 +1009,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; @@ -881,7 +1017,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; @@ -1045,6 +1181,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 = @@ -1131,7 +1268,7 @@ static void model_full_set_route(routing_component_t rc, const char *src, (void*)TO_ROUTE_FULL(*src_id, *dst_id)->generic_route.link_list, (void*)link_route_to_test, (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp), - "The route between \"%s\" and \"%s\" already exist", src,dst); + "The route between \"%s\" and \"%s\" already exists", src,dst); xbt_free(link_route_to_test); } else @@ -1145,8 +1282,8 @@ 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) { @@ -1171,7 +1308,7 @@ static void model_full_set_route(routing_component_t rc, const char *src, (void*)TO_ROUTE_FULL(*dst_id, *src_id)->generic_route.link_list, (void*)link_route_to_test, (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp), - "The route between \"%s\" and \"%s\" already exist", src,dst); + "The route between \"%s\" and \"%s\" already exists", src,dst); xbt_free(link_route_to_test); } else @@ -1366,6 +1503,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 = @@ -1373,7 +1511,6 @@ static void *model_floyd_create(void) new_component->generic_routing.finalize = floyd_finalize; new_component->generic_routing.to_index = xbt_dict_new(); new_component->generic_routing.bypassRoutes = xbt_dict_new(); - new_component->generic_routing.parse_routes = xbt_dict_new(); return new_component; } @@ -1499,7 +1636,7 @@ static void model_floyd_set_route(routing_component_t rc, const char *src, (void*)TO_FLOYD_LINK(*src_id, *dst_id)->generic_route.link_list, (void*)link_route_to_test, (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp), - "The route between \"%s\" and \"%s\" already exist", src,dst); + "The route between \"%s\" and \"%s\" already exists", src,dst); xbt_free(link_route_to_test); } else @@ -1517,8 +1654,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)) { @@ -1541,7 +1678,7 @@ static void model_floyd_set_route(routing_component_t rc, const char *src, (void*)TO_FLOYD_LINK(*dst_id, *src_id)->generic_route.link_list, (void*)link_route_to_test, (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp), - "The route between \"%s\" and \"%s\" already exist", src,dst); + "The route between \"%s\" and \"%s\" already exists", src,dst); xbt_free(link_route_to_test); } else @@ -1982,9 +2119,10 @@ static void *model_dijkstra_both_create(int cached) new_component->generic_routing.set_autonomous_system = generic_set_autonomous_system; new_component->generic_routing.set_route = model_dijkstra_both_set_route; - new_component->generic_routing.set_ASroute = NULL; //TODO + 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 = @@ -1993,7 +2131,6 @@ static void *model_dijkstra_both_create(int cached) new_component->cached = cached; new_component->generic_routing.to_index = xbt_dict_new(); new_component->generic_routing.bypassRoutes = xbt_dict_new(); - new_component->generic_routing.parse_routes = xbt_dict_new(); return new_component; } @@ -2021,44 +2158,18 @@ static void model_dijkstra_both_end(void) { routing_component_dijkstra_t routing = (routing_component_dijkstra_t) current_routing; - xbt_dict_cursor_t cursor = NULL; - char *key, *data, *end; - const char *sep = "#"; - xbt_dynar_t keys; + xbt_node_t node = NULL; unsigned int cursor2; xbt_dynar_t nodes = NULL; - int src_id, dst_id; - route_t route; /* Create the topology graph */ routing->route_graph = xbt_graph_new_graph(1, NULL); routing->graph_node_map = xbt_dict_new(); - if (routing->cached) + if (routing->cached && !routing->route_cache) routing->route_cache = xbt_dict_new(); - /* Put the routes in position */ - xbt_dict_foreach(routing->generic_routing.parse_routes, cursor, key, data) { - keys = xbt_str_split_str(key, sep); - src_id = strtol(xbt_dynar_get_as(keys, 0, char *), &end, 10); - dst_id = strtol(xbt_dynar_get_as(keys, 1, char *), &end, 10); - route_extended_t e_route = - generic_new_extended_route(current_routing->hierarchy, data, 0); - route_new_dijkstra(routing, src_id, dst_id, e_route); - xbt_dynar_free(&keys); - } - - /* delete the parse table */ - xbt_dict_foreach(routing->generic_routing.parse_routes, cursor, key, data) { - route = (route_t) data; - xbt_dynar_free(&(route->link_list)); - xbt_free(data); - } - - /* delete parse dict */ - xbt_dict_free(&(routing->generic_routing.parse_routes)); - /* Add the loopback if needed */ if (current_routing->hierarchy == SURF_ROUTING_BASE) add_loopback_dijkstra(routing); @@ -2075,8 +2186,27 @@ static void model_dijkstra_both_end(void) static void model_dijkstra_both_set_route (routing_component_t rc, const char *src, const char *dst, name_route_extended_t route) { + routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; + int *src_id, *dst_id; + src_id = xbt_dict_get_or_null(rc->to_index, src); + dst_id = xbt_dict_get_or_null(rc->to_index, dst); + + if (routing->cached && !routing->route_cache) + routing->route_cache = xbt_dict_new(); + 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) + DEBUG2("Load Route from \"%s\" to \"%s\"", src, dst); + else + DEBUG4("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src, + route->src_gateway, dst, route->dst_gateway); + + route_extended_t e_route = + generic_new_extended_route(current_routing->hierarchy, route, 1); + route_new_dijkstra(routing, *src_id, *dst_id, e_route); } #ifdef HAVE_PCRE_LIB @@ -2659,146 +2789,6 @@ static int surf_link_resource_cmp(const void *a, const void *b) { return 1; } -static void generic_set_route(routing_component_t rc, const char *src, - const char *dst, name_route_t route) -{ - DEBUG2("Load Route from \"%s\" to \"%s\"", src, dst); - xbt_dict_t _parse_routes; - xbt_dict_t _to_index; - char *route_name; - int *src_id, *dst_id,i; - unsigned long nb_links = xbt_dynar_length(route->link_name_list); - - _to_index = current_routing->to_index; - _parse_routes = current_routing->parse_routes; - - src_id = xbt_dict_get_or_null(_to_index, src); - dst_id = xbt_dict_get_or_null(_to_index, dst); - route_name = bprintf("%d#%d", *src_id, *dst_id); - - route_t route_to_test; - route_t route_sym = xbt_new0(s_route_t, 1); - - xbt_assert2(src_id - && dst_id, "Network elements %s or %s not found", src, dst); - - xbt_assert2(xbt_dynar_length(route->link_name_list) > 0, - "Invalid count of links, must be greater than zero (%s,%s)", - src, dst); - - route_to_test = xbt_dict_get_or_null(_parse_routes, route_name); - - if(route_to_test) - xbt_assert2(!xbt_dynar_compare( - (void*)route->link_name_list, - (void*)route_to_test->link_list, - (int_f_cpvoid_cpvoid_t) surf_link_resource_cmp), - "The route between \"%s\" and \"%s\" already exist", src,dst); - else - { - xbt_dict_set(_parse_routes, bprintf("%d#%d", *src_id, *dst_id), route, NULL); - } - - if(A_surfxml_route_symetrical == A_surfxml_route_symetrical_YES) - { - route_sym->link_list = xbt_dynar_new(sizeof(char *),NULL); - - for(i=nb_links ; i>0 ; i--) - { - char *link_name = xbt_new0(char,strlen(xbt_dynar_get_as(route->link_name_list, i-1, char *))); - link_name = xbt_strdup(xbt_dynar_get_as(route->link_name_list, i-1, char *)); - xbt_dynar_push_as(route_sym->link_list ,char *, link_name); - } - DEBUG2("Load Route from \"%s\" to \"%s\"", dst, src); - - route_to_test = xbt_dict_get_or_null(_parse_routes, bprintf("%d#%d",*dst_id, *src_id)); - - if(route_to_test) - xbt_assert2(!xbt_dynar_compare( - (void*)route_sym->link_list, - (void*)route_to_test->link_list, - (int_f_cpvoid_cpvoid_t) strcmp), - "The route between \"%s\" and \"%s\" already exist", dst,src); - else - { - xbt_dict_set(_parse_routes, bprintf("%d#%d",*dst_id, *src_id), route_sym, NULL); - } - } - - xbt_free(route_name); -} - -static void generic_set_ASroute(routing_component_t rc, const char *src, - const char *dst, route_extended_t e_route) -{ - DEBUG4("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src, - e_route->src_gateway, dst, e_route->dst_gateway); - - xbt_dict_t _parse_routes; - xbt_dict_t _to_index; - char *route_name; - int *src_id, *dst_id; - _to_index = current_routing->to_index; - _parse_routes = current_routing->parse_routes; - - src_id = xbt_dict_get_or_null(_to_index, src); - dst_id = xbt_dict_get_or_null(_to_index, dst); - route_name = bprintf("%d#%d", *src_id, *dst_id); - route_t route_to_test; - - xbt_assert2(src_id - && dst_id, "Network elements %s or %s not found", src, dst); - - xbt_assert2(xbt_dynar_length(e_route->generic_route.link_list) > 0, - "Invalid count of links, must be greater than zero (%s,%s)", - src, dst); - - route_to_test = xbt_dict_get_or_null(_parse_routes, route_name); - - if(route_to_test) - xbt_assert4(!xbt_dynar_compare( - (void*) (&e_route->generic_route)->link_list, - (void*) route_to_test->link_list, - (int_f_cpvoid_cpvoid_t) strcmp), - "The route between \"%s\"(\"%s\") and \"%s\"(\"%s\") already exist", - src, e_route->src_gateway, dst, e_route->dst_gateway); - - route_name = bprintf("%d#%d", *src_id, *dst_id); - xbt_dict_set(_parse_routes, route_name, e_route, NULL); - xbt_free(route_name); - - unsigned long nb_links = xbt_dynar_length(e_route->generic_route.link_list); - - if(A_surfxml_ASroute_symetrical == A_surfxml_ASroute_symetrical_YES) - { - int i; - route_extended_t route_sym = xbt_new0(s_route_extended_t, 1); - route_sym->generic_route.link_list = xbt_dynar_new(sizeof(char *),NULL); - for(i=nb_links ; i>0 ; i--) - { - char *link_name = xbt_new0(char,strlen(xbt_dynar_get_as(e_route->generic_route.link_list, i-1, char *))); - link_name = bprintf("%s",xbt_dynar_get_as(e_route->generic_route.link_list, i-1, char *)); - xbt_dynar_push_as(route_sym->generic_route.link_list ,char *, link_name); - } - route_sym->src_gateway = xbt_new0( char,strlen(e_route->dst_gateway) ); - route_sym->src_gateway = bprintf("%s",e_route->dst_gateway); - route_sym->dst_gateway = xbt_new0( char,strlen(e_route->src_gateway) ); - route_sym->dst_gateway = bprintf("%s",e_route->src_gateway); - DEBUG4("Load ASroute from \"%s(%s)\" to \"%s(%s)\"",dst, route_sym->src_gateway,src,route_sym->dst_gateway); - - route_to_test = xbt_dict_get_or_null(_parse_routes, bprintf("%d#%d", *dst_id, *src_id)); - if(route_to_test) - xbt_assert4(!xbt_dynar_compare( - (void*) (&route_sym->generic_route)->link_list, - (void*) route_to_test->link_list, - (int_f_cpvoid_cpvoid_t) strcmp), - "The route between \"%s\"(\"%s\") and \"%s\"(\"%s\") already exist", - dst, route_sym->src_gateway, src, route_sym->dst_gateway); - xbt_dict_set(_parse_routes, bprintf("%d#%d", *dst_id, *src_id), route_sym, NULL); - - } -} - static void generic_set_bypassroute(routing_component_t rc, const char *src, const char *dst, route_extended_t e_route) @@ -2812,7 +2802,7 @@ static void generic_set_bypassroute(routing_component_t rc, "Invalid count of links, must be greater than zero (%s,%s)", src, dst); xbt_assert4(!xbt_dict_get_or_null(dict_bypassRoutes, route_name), - "The bypass route between \"%s\"(\"%s\") and \"%s\"(\"%s\") already exist", + "The bypass route between \"%s\"(\"%s\") and \"%s\"(\"%s\") already exists", src, e_route->src_gateway, dst, e_route->dst_gateway); route_extended_t new_e_route = @@ -2828,6 +2818,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"); @@ -2969,6 +2973,44 @@ static route_extended_t generic_get_bypassroute(routing_component_t rc, /* ************************************************************************** */ /* ************************* GENERIC AUX FUNCTIONS ************************** */ +static route_t +generic_new_route(e_surf_routing_hierarchy_t hierarchy, + void *data, int order) +{ + + char *link_name; + route_t new_route; + unsigned int cpt; + xbt_dynar_t links = NULL, links_id = NULL; + + new_route = xbt_new0(s_route_t, 1); + new_route->link_list = + xbt_dynar_new(global_routing->size_of_link, NULL); + + xbt_assert0(hierarchy == SURF_ROUTING_BASE, + "the hierarchy type is not SURF_ROUTING_BASE"); + + links = ((route_t) data)->link_list; + + + links_id = new_route->link_list; + + xbt_dynar_foreach(links, cpt, link_name) { + + void *link = + xbt_dict_get_or_null(surf_network_model->resource_set, link_name); + if (link) { + if (order) + xbt_dynar_push(links_id, &link); + else + xbt_dynar_unshift(links_id, &link); + } else + THROW1(mismatch_error, 0, "Link %s not found", link_name); + } + + return new_route; +} + static route_extended_t generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy, void *data, int order) @@ -3161,7 +3203,10 @@ static void routing_parse_Scluster(void) char *cluster_bb_bw = A_surfxml_cluster_bb_bw; char *cluster_bb_lat = A_surfxml_cluster_bb_lat; char *host_id, *groups, *link_id = NULL; - char *router_id, *link_router, *link_backbone, *route_src_dst; + char *router_id, *link_router, *link_backbone; +#ifdef HAVE_PCRE_LIB + char *route_src_dst; +#endif unsigned int iter; int start, end, i; xbt_dynar_t radical_elements; @@ -3323,6 +3368,9 @@ static void routing_parse_Scluster(void) SURFXML_START_TAG(link); SURFXML_END_TAG(link); + DEBUG0(" "); + +#ifdef HAVE_PCRE_LIB char *new_suffix = bprintf("%s", ""); radical_elements = xbt_str_split(cluster_suffix, "."); @@ -3333,15 +3381,11 @@ static void routing_parse_Scluster(void) } route_src_dst = bprintf("%s(.*)%s", cluster_prefix, new_suffix); - DEBUG0(" "); - -#ifdef HAVE_PCRE_LIB - 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); @@ -3390,10 +3434,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)) { @@ -3490,7 +3534,7 @@ void routing_add_link(const char *link_id) */ void routing_set_route(const char *src_id, const char *dst_id) { - parse_S_route_new_and_endpoints_lua((char *) src_id, (char *) dst_id); + parse_S_route_new_and_endpoints_lua(src_id, dst_id); } /*