X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/445590fd865f35e74be34955931c97b8956f6d7f..57c155c5ac08e57c81d145012425045a439b002b:/src/surf/surf_routing_generic.c diff --git a/src/surf/surf_routing_generic.c b/src/surf/surf_routing_generic.c index c3d6d9a7c8..e627a7b2ac 100644 --- a/src/surf/surf_routing_generic.c +++ b/src/surf/surf_routing_generic.c @@ -29,8 +29,6 @@ AS_t model_generic_create_sized(size_t childsize) { new_component->get_bypass_route = generic_get_bypassroute; new_component->finalize = model_generic_finalize; - - new_component->nb_index = 0; new_component->bypassRoutes = xbt_dict_new_homogeneous((void (*)(void *)) generic_free_route); return new_component; @@ -40,27 +38,28 @@ void model_generic_finalize(AS_t as) { model_none_finalize(as); } -int generic_parse_PU(AS_t as, const char *name) +int generic_parse_PU(AS_t as, network_element_t elm) { - XBT_DEBUG("Load process unit \"%s\"", name); - int id = as->nb_index; - (as->nb_index)++; - return id; + XBT_DEBUG("Load process unit \"%s\"", elm->name); + xbt_dynar_push_as(as->index_network_elm,network_element_t,elm); + return xbt_dynar_length(as->index_network_elm)-1; } -int generic_parse_AS(AS_t as, const char *name) +int generic_parse_AS(AS_t as, network_element_t elm) { - XBT_DEBUG("Load Autonomous system \"%s\"", name); - int id = as->nb_index; - as->nb_index++; - return id; + XBT_DEBUG("Load Autonomous system \"%s\"", elm->name); + xbt_dynar_push_as(as->index_network_elm,network_element_t,elm); + return xbt_dynar_length(as->index_network_elm)-1; } void generic_parse_bypassroute(AS_t rc, const char *src, const char *dst, route_t e_route) { - XBT_DEBUG("Load bypassRoute from \"%s\" to \"%s\"", src, dst); + if(e_route->dst_gateway) + XBT_DEBUG("Load bypassASroute from \"%s\" to \"%s\"", src, dst); + else + XBT_DEBUG("Load bypassRoute from \"%s\" to \"%s\"", src, dst); xbt_dict_t dict_bypassRoutes = rc->bypassRoutes; char *route_name; @@ -72,8 +71,12 @@ void generic_parse_bypassroute(AS_t rc, "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 = - generic_new_extended_route(SURF_ROUTING_RECURSIVE, e_route, 0); + 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); + xbt_dynar_free(&(e_route->link_list)); xbt_free(e_route); @@ -90,86 +93,108 @@ xbt_dynar_t generic_get_onelink_routes(AS_t rc) { // FIXME: kill that stub return NULL; } -route_t generic_get_bypassroute(AS_t rc, network_element_t src, network_element_t dst) +route_t generic_get_bypassroute(AS_t rc, network_element_t src, network_element_t dst, double *lat) { // If never set a bypass route return NULL without any further computations + XBT_DEBUG("generic_get_bypassroute from %s to %s",src->name,dst->name); if(no_bypassroute_declared) return NULL; + route_t e_route_bypass = NULL; xbt_dict_t dict_bypassRoutes = rc->bypassRoutes; - 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; - - char* src_name = src->name; - char* dst_name = dst->name; - - 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; + 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; + } - /* (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--; + /* (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); - } - - 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; - - route_t e_route_bypass = NULL; + 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); + } - 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); + 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 && i <= max_index_dst) { + + 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, i)))->name); + (xbt_dynar_get_ptr(path_dst, max)))->name); e_route_bypass = xbt_dict_get_or_null(dict_bypassRoutes, route_name); xbt_free(route_name); } @@ -177,27 +202,11 @@ route_t generic_get_bypassroute(AS_t rc, network_element_t src, network_element_ 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); } - xbt_dynar_free(&path_src); - xbt_dynar_free(&path_dst); - route_t new_e_route = NULL; - if (e_route_bypass) { void *link; unsigned int cpt = 0; @@ -208,6 +217,8 @@ route_t generic_get_bypassroute(AS_t rc, network_element_t src, network_element_ xbt_dynar_new(global_routing->size_of_link, NULL); xbt_dynar_foreach(e_route_bypass->link_list, cpt, link) { xbt_dynar_push(new_e_route->link_list, &link); + if (lat) + *lat += surf_network_model->extension.network.get_link_latency(link); } }