X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4a18fb7c6c81b1f58a9f8111fcf0ade106c4746b..40dffe1f6c370e36f3e20ad82539e69b25cdcecd:/src/surf/surf_routing_generic.c diff --git a/src/surf/surf_routing_generic.c b/src/surf/surf_routing_generic.c index 414bdd7380..38cc16d09e 100644 --- a/src/surf/surf_routing_generic.c +++ b/src/surf/surf_routing_generic.c @@ -14,6 +14,8 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_routing_generic, surf_route, "Generic implementation of the surf routing"); +static int no_bypassroute_declared = 1; + AS_t model_generic_create_sized(size_t childsize) { AS_t new_component = model_none_create_sized(childsize); @@ -27,36 +29,27 @@ 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->to_index = xbt_dict_new_homogeneous(xbt_free); new_component->bypassRoutes = xbt_dict_new_homogeneous((void (*)(void *)) generic_free_route); return new_component; } void model_generic_finalize(AS_t as) { - xbt_dict_free(&as->to_index); xbt_dict_free(&as->bypassRoutes); model_none_finalize(as); } -void 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 = xbt_new0(int, 1); - xbt_dict_t _to_index; - _to_index = as->to_index; - *id = xbt_dict_length(_to_index); - xbt_dict_set(_to_index, name, id, NULL); + 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; } -void 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 = xbt_new0(int, 1); - xbt_dict_t _to_index; - _to_index = as->to_index; - *id = xbt_dict_length(_to_index); - xbt_dict_set(_to_index, name, id, NULL); + 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, @@ -73,7 +66,7 @@ void generic_parse_bypassroute(AS_t rc, 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, dst, e_route->dst_gateway); + 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); @@ -81,6 +74,7 @@ void generic_parse_bypassroute(AS_t rc, xbt_free(e_route); xbt_dict_set(dict_bypassRoutes, route_name, new_e_route, NULL); + no_bypassroute_declared = 0; xbt_free(route_name); } @@ -89,10 +83,15 @@ void generic_parse_bypassroute(AS_t rc, xbt_dynar_t generic_get_onelink_routes(AS_t rc) { // FIXME: kill that stub xbt_die("\"generic_get_onelink_routes\" not implemented yet"); + return NULL; } -route_t generic_get_bypassroute(AS_t rc, const char *src, const char *dst) +route_t generic_get_bypassroute(AS_t rc, network_element_t src, network_element_t dst) { + // If never set a bypass route return NULL without any further computations + if(no_bypassroute_declared) + return NULL; + xbt_dict_t dict_bypassRoutes = rc->bypassRoutes; AS_t src_as, dst_as; int index_src, index_dst; @@ -102,20 +101,15 @@ route_t generic_get_bypassroute(AS_t rc, const char *src, const char *dst) AS_t *current_src = NULL; AS_t *current_dst = NULL; - /* (1) find the as where the src and dst are located */ - void *src_data = xbt_lib_get_or_null(host_lib, src, ROUTING_HOST_LEVEL); - void *dst_data = xbt_lib_get_or_null(host_lib, dst, ROUTING_HOST_LEVEL); - if (!src_data) - src_data = xbt_lib_get_or_null(as_router_lib, src, ROUTING_ASR_LEVEL); - if (!dst_data) - dst_data = xbt_lib_get_or_null(as_router_lib, dst, ROUTING_ASR_LEVEL); + char* src_name = src->name; + char* dst_name = dst->name; - if (src_data == NULL || dst_data == NULL) + if (src == NULL || dst == NULL) xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"", - src, dst, rc->name); + src_name, dst_name, rc->name); - src_as = ((network_element_info_t) src_data)->rc_component; - dst_as = ((network_element_info_t) dst_data)->rc_component; + 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); @@ -204,8 +198,8 @@ route_t generic_get_bypassroute(AS_t rc, const char *src, const char *dst) void *link; unsigned int cpt = 0; new_e_route = xbt_new0(s_route_t, 1); - new_e_route->src_gateway = xbt_strdup(e_route_bypass->src_gateway); - new_e_route->dst_gateway = xbt_strdup(e_route_bypass->dst_gateway); + 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_foreach(e_route_bypass->link_list, cpt, link) { @@ -285,8 +279,8 @@ generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy, links = e_route->link_list; /* remeber not erase the gateway names */ - new_e_route->src_gateway = strdup(e_route->src_gateway); - new_e_route->dst_gateway = strdup(e_route->dst_gateway); + new_e_route->src_gateway = e_route->src_gateway; + new_e_route->dst_gateway = e_route->dst_gateway; } links_id = new_e_route->link_list; @@ -310,8 +304,6 @@ void generic_free_route(route_t route) { if (route) { xbt_dynar_free(&route->link_list); - xbt_free(route->src_gateway); - xbt_free(route->dst_gateway); xbt_free(route); } } @@ -342,7 +334,7 @@ generic_autonomous_system_exist(AS_t rc, char *element) AS_t element_as, result, elem; xbt_dict_cursor_t cursor = NULL; char *key; - element_as = ((network_element_info_t) + element_as = ((network_element_t) xbt_lib_get_or_null(as_router_lib, element, ROUTING_ASR_LEVEL))->rc_component; result = ((AS_t) - 1); @@ -366,7 +358,7 @@ AS_t generic_processing_units_exist(AS_t rc, char *element) { AS_t element_as; - element_as = ((network_element_info_t) + element_as = ((network_element_t) xbt_lib_get_or_null(host_lib, element, ROUTING_HOST_LEVEL))->rc_component; if (element_as == rc) @@ -374,31 +366,35 @@ generic_processing_units_exist(AS_t rc, char *element) return generic_as_exist(rc, element_as); } -void generic_src_dst_check(AS_t rc, const char *src, - const char *dst) +void generic_src_dst_check(AS_t rc, network_element_t src, + network_element_t dst) { - void *src_data = xbt_lib_get_or_null(host_lib, src, ROUTING_HOST_LEVEL); - void *dst_data = xbt_lib_get_or_null(host_lib, dst, ROUTING_HOST_LEVEL); - if (!src_data) - src_data = xbt_lib_get_or_null(as_router_lib, src, ROUTING_ASR_LEVEL); - if (!dst_data) - dst_data = xbt_lib_get_or_null(as_router_lib, dst, ROUTING_ASR_LEVEL); + network_element_t src_data = src; + network_element_t dst_data = dst; if (src_data == NULL || dst_data == NULL) xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"", - src, dst, rc->name); + src->name, + dst->name, + rc->name); AS_t src_as = - ((network_element_info_t) src_data)->rc_component; + (src_data)->rc_component; AS_t dst_as = - ((network_element_info_t) dst_data)->rc_component; + (dst_data)->rc_component; if (src_as != dst_as) xbt_die("The src(%s in %s) and dst(%s in %s) are in differents AS", - src, src_as->name, dst, dst_as->name); + src->name, src_as->name, + dst->name, dst_as->name); + 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, dst, src_as->name, dst_as->name, rc->name); + src->name, + dst->name, + src_as->name, + dst_as->name, + rc->name); }