X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c93a420f2f61da48ace7828257e97b593ae76251..87bd0aa1c5b983d9e0c24ad77186a96d0f39023e:/src/surf/surf_routing_generic.c diff --git a/src/surf/surf_routing_generic.c b/src/surf/surf_routing_generic.c index 0fbcc94e8d..0660db8160 100644 --- a/src/surf/surf_routing_generic.c +++ b/src/surf/surf_routing_generic.c @@ -53,29 +53,29 @@ int generic_parse_AS(AS_t as, network_element_t elm) } void generic_parse_bypassroute(AS_t rc, - const char *src, const char *dst, - route_t e_route) + const char *src, const char *dst, + route_t e_route) { if(e_route->dst_gateway) - XBT_INFO("Load bypassASroute from \"%s\" to \"%s\"", src, dst); + XBT_DEBUG("Load bypassASroute from \"%s\" to \"%s\"", src, dst); else - XBT_INFO("Load bypassRoute from \"%s\" to \"%s\"", src, dst); + XBT_DEBUG("Load bypassRoute from \"%s\" to \"%s\"", src, dst); xbt_dict_t dict_bypassRoutes = rc->bypassRoutes; char *route_name; route_name = bprintf("%s#%s", src, dst); xbt_assert(!xbt_dynar_is_empty(e_route->link_list), - "Invalid count of links, must be greater than zero (%s,%s)", - src, dst); + "Invalid count of links, must be greater than zero (%s,%s)", + src, dst); xbt_assert(!xbt_dict_get_or_null(dict_bypassRoutes, route_name), - "The bypass route between \"%s\"(\"%s\") and \"%s\"(\"%s\") already exists", - src, e_route->src_gateway->name, dst, e_route->dst_gateway->name); + "The bypass route between \"%s\"(\"%s\") and \"%s\"(\"%s\") already exists", + src, e_route->src_gateway->name, dst, e_route->dst_gateway->name); route_t new_e_route = NULL; if(e_route->dst_gateway) new_e_route = generic_new_extended_route(SURF_ROUTING_RECURSIVE, e_route, 1); else - new_e_route = generic_new_route(SURF_ROUTING_BASE, e_route, 1); + new_e_route = generic_new_extended_route(SURF_ROUTING_BASE, e_route, 1); xbt_dynar_free(&(e_route->link_list)); xbt_free(e_route); @@ -100,17 +100,111 @@ route_t generic_get_bypassroute(AS_t rc, network_element_t src, network_element_ if(no_bypassroute_declared) return NULL; + route_t e_route_bypass = NULL; xbt_dict_t dict_bypassRoutes = rc->bypassRoutes; - if (src == NULL || dst == NULL) - xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"", - src->name, dst->name, rc->name); + if(dst->rc_component == rc && src->rc_component == rc ){ + char *route_name = bprintf("%s#%s", src->name, dst->name); + e_route_bypass = xbt_dict_get_or_null(dict_bypassRoutes, route_name); + if(e_route_bypass) + XBT_DEBUG("Find bypass route with %ld links",xbt_dynar_length(e_route_bypass->link_list)); + free(route_name); + } + else{ + AS_t src_as, dst_as; + int index_src, index_dst; + xbt_dynar_t path_src = NULL; + xbt_dynar_t path_dst = NULL; + AS_t current = NULL; + AS_t *current_src = NULL; + AS_t *current_dst = NULL; + + if (src == NULL || dst == NULL) + xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"", + src->name, dst->name, rc->name); + + src_as = src->rc_component; + dst_as = dst->rc_component; + + /* (2) find the path to the root routing component */ + path_src = xbt_dynar_new(sizeof(AS_t), NULL); + current = src_as; + while (current != NULL) { + xbt_dynar_push(path_src, ¤t); + current = current->routing_father; + } + path_dst = xbt_dynar_new(sizeof(AS_t), NULL); + current = dst_as; + while (current != NULL) { + xbt_dynar_push(path_dst, ¤t); + current = current->routing_father; + } - char *route_name = bprintf("%s#%s", src->name, dst->name); - route_t e_route_bypass = xbt_dict_get_or_null(dict_bypassRoutes, route_name); - if(e_route_bypass) - XBT_DEBUG("Find bypass route with %ld links",xbt_dynar_length(e_route_bypass->link_list)); - free(route_name); + /* (3) find the common father */ + 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) { + xbt_dynar_pop_ptr(path_src); + xbt_dynar_pop_ptr(path_dst); + index_src--; + index_dst--; + current_src = xbt_dynar_get_ptr(path_src, index_src); + 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 = max(max_index_src, max_index_dst); + int i, max; + + for (max = 0; max <= max_index; max++) { + for (i = 0; i < max; i++) { + if (i <= max_index_src && max <= max_index_dst) { + char *route_name = bprintf("%s#%s", + (*(AS_t *) + (xbt_dynar_get_ptr(path_src, i)))->name, + (*(AS_t *) + (xbt_dynar_get_ptr(path_dst, max)))->name); + e_route_bypass = xbt_dict_get_or_null(dict_bypassRoutes, route_name); + xbt_free(route_name); + } + if (e_route_bypass) + break; + if (max <= max_index_src && i <= max_index_dst) { + char *route_name = bprintf("%s#%s", + (*(AS_t *) + (xbt_dynar_get_ptr(path_src, max)))->name, + (*(AS_t *) + (xbt_dynar_get_ptr(path_dst, i)))->name); + e_route_bypass = xbt_dict_get_or_null(dict_bypassRoutes, route_name); + xbt_free(route_name); + } + if (e_route_bypass) + break; + } + + if (e_route_bypass) + break; + + if (max <= max_index_src && max <= max_index_dst) { + char *route_name = bprintf("%s#%s", + (*(AS_t *) + (xbt_dynar_get_ptr(path_src, max)))->name, + (*(AS_t *) + (xbt_dynar_get_ptr(path_dst, max)))->name); + e_route_bypass = xbt_dict_get_or_null(dict_bypassRoutes, route_name); + xbt_free(route_name); + } + if (e_route_bypass) + break; + } + + xbt_dynar_free(&path_src); + xbt_dynar_free(&path_dst); + } route_t new_e_route = NULL; if (e_route_bypass) { @@ -120,7 +214,7 @@ route_t generic_get_bypassroute(AS_t rc, network_element_t src, network_element_ new_e_route->src_gateway = e_route_bypass->src_gateway; new_e_route->dst_gateway = e_route_bypass->dst_gateway; new_e_route->link_list = - xbt_dynar_new(global_routing->size_of_link, NULL); + xbt_dynar_new(sizeof(sg_routing_link_t), NULL); xbt_dynar_foreach(e_route_bypass->link_list, cpt, link) { xbt_dynar_push(new_e_route->link_list, &link); if (lat) @@ -133,92 +227,45 @@ route_t generic_get_bypassroute(AS_t rc, network_element_t src, network_element_ /* ************************************************************************** */ /* ************************* GENERIC AUX FUNCTIONS ************************** */ - -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_assert(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_lib_get_or_null(link_lib, link_name, SURF_LINK_LEVEL); - if (link) { - if (order) - xbt_dynar_push(links_id, &link); - else - xbt_dynar_unshift(links_id, &link); - } else - THROWF(mismatch_error, 0, "Link %s not found", link_name); - } - - return new_route; -} - +/* change a route containing link names into a route containing link entities */ route_t generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy, - void *data, int order) -{ + route_t routearg, int change_order) { + route_t result; char *link_name; - route_t e_route, new_e_route; - route_t route; unsigned int cpt; - xbt_dynar_t links = NULL, links_id = NULL; - new_e_route = xbt_new0(s_route_t, 1); - new_e_route->link_list = xbt_dynar_new(global_routing->size_of_link, NULL); + result = xbt_new0(s_route_t, 1); + result->link_list = xbt_dynar_new(sizeof(sg_routing_link_t), NULL); xbt_assert(hierarchy == SURF_ROUTING_BASE - || hierarchy == SURF_ROUTING_RECURSIVE, - "the hierarchy type is not defined"); - - if (hierarchy == SURF_ROUTING_BASE) { - - route = (route_t) data; - links = route->link_list; + || hierarchy == SURF_ROUTING_RECURSIVE, + "The hierarchy of this AS is neither BASIC nor RECURSIVE, I'm lost here."); - } else if (hierarchy == SURF_ROUTING_RECURSIVE) { + if (hierarchy == SURF_ROUTING_RECURSIVE) { - e_route = (route_t) data; - xbt_assert(e_route->src_gateway - && e_route->dst_gateway, "bad gateway, is null"); - links = e_route->link_list; + xbt_assert(routearg->src_gateway && routearg->dst_gateway, + "NULL is obviously a bad gateway"); /* remeber not erase the gateway names */ - new_e_route->src_gateway = e_route->src_gateway; - new_e_route->dst_gateway = e_route->dst_gateway; + result->src_gateway = routearg->src_gateway; + result->dst_gateway = routearg->dst_gateway; } - links_id = new_e_route->link_list; - - xbt_dynar_foreach(links, cpt, link_name) { + xbt_dynar_foreach(routearg->link_list, cpt, link_name) { void *link = xbt_lib_get_or_null(link_lib, link_name, SURF_LINK_LEVEL); if (link) { - if (order) - xbt_dynar_push(links_id, &link); + if (change_order) + xbt_dynar_push(result->link_list, &link); else - xbt_dynar_unshift(links_id, &link); + xbt_dynar_unshift(result->link_list, &link); } else THROWF(mismatch_error, 0, "Link %s not found", link_name); } - return new_e_route; + return result; } void generic_free_route(route_t route) @@ -230,7 +277,7 @@ void generic_free_route(route_t route) } static AS_t generic_as_exist(AS_t find_from, - AS_t to_find) + AS_t to_find) { //return to_find; // FIXME: BYPASSERROR OF FOREACH WITH BREAK xbt_dict_cursor_t cursor = NULL; @@ -256,8 +303,8 @@ generic_autonomous_system_exist(AS_t rc, char *element) xbt_dict_cursor_t cursor = NULL; char *key; element_as = ((network_element_t) - xbt_lib_get_or_null(as_router_lib, element, - ROUTING_ASR_LEVEL))->rc_component; + xbt_lib_get_or_null(as_router_lib, element, + ROUTING_ASR_LEVEL))->rc_component; result = ((AS_t) - 1); if (element_as != rc) result = generic_as_exist(rc, element_as); @@ -280,8 +327,8 @@ generic_processing_units_exist(AS_t rc, char *element) { AS_t element_as; element_as = ((network_element_t) - xbt_lib_get_or_null(host_lib, - element, ROUTING_HOST_LEVEL))->rc_component; + xbt_lib_get_or_null(host_lib, + element, ROUTING_HOST_LEVEL))->rc_component; if (element_as == rc) return element_as; return generic_as_exist(rc, element_as); @@ -312,10 +359,10 @@ void generic_src_dst_check(AS_t rc, network_element_t src, if (rc != dst_as) xbt_die - ("The routing component of src'%s' and dst'%s' is not the same as the network elements belong (%s?=%s?=%s)", - src->name, - dst->name, - src_as->name, - dst_as->name, - rc->name); + ("The routing component of src'%s' and dst'%s' is not the same as the network elements belong (%s?=%s?=%s)", + src->name, + dst->name, + src_as->name, + dst_as->name, + rc->name); }