X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d0d164cd894ef7a55ed4a319c896519bc97416c0..59f29c7c6a9e5518c9d1faf8b3e1333b2a5bfcd1:/src/surf/surf_routing_generic.c diff --git a/src/surf/surf_routing_generic.c b/src/surf/surf_routing_generic.c index aeaaf11ed5..55be68eca0 100644 --- a/src/surf/surf_routing_generic.c +++ b/src/surf/surf_routing_generic.c @@ -14,93 +14,101 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_routing_generic, surf_route, "Generic implementation of the surf routing"); -extern routing_component_t current_routing; - +static int having_set_bypassroute = 0; + +AS_t model_generic_create_sized(size_t childsize) { + AS_t new_component = model_none_create_sized(childsize); + + new_component->parse_PU = generic_parse_PU; + new_component->parse_AS = generic_parse_AS; + new_component->parse_route = NULL; + new_component->parse_ASroute = NULL; + new_component->parse_bypassroute = generic_parse_bypassroute; + new_component->get_route_and_latency = NULL; + new_component->get_onelink_routes = NULL; + 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_set_processing_unit(routing_component_t rc, const char *name) +void generic_parse_PU(AS_t as, const char *name) { XBT_DEBUG("Load process unit \"%s\"", name); int *id = xbt_new0(int, 1); xbt_dict_t _to_index; - _to_index = current_routing->to_index; + _to_index = as->to_index; *id = xbt_dict_length(_to_index); - xbt_dict_set(_to_index, name, id, xbt_free); + xbt_dict_set(_to_index, name, id, NULL); } -void generic_set_autonomous_system(routing_component_t rc, const char *name) +void generic_parse_AS(AS_t as, const char *name) { XBT_DEBUG("Load Autonomous system \"%s\"", name); int *id = xbt_new0(int, 1); xbt_dict_t _to_index; - _to_index = current_routing->to_index; + _to_index = as->to_index; *id = xbt_dict_length(_to_index); - xbt_dict_set(_to_index, name, id, xbt_free); + xbt_dict_set(_to_index, name, id, NULL); } -void generic_set_bypassroute(routing_component_t rc, +void generic_parse_bypassroute(AS_t rc, const char *src, const char *dst, - route_extended_t e_route) + route_t e_route) { 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_length(e_route->generic_route.link_list) > 0, + xbt_assert(!xbt_dynar_is_empty(e_route->link_list), "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, dst, e_route->dst_gateway); - route_extended_t new_e_route = + route_t new_e_route = generic_new_extended_route(SURF_ROUTING_RECURSIVE, e_route, 0); - xbt_dynar_free(&(e_route->generic_route.link_list)); + xbt_dynar_free(&(e_route->link_list)); xbt_free(e_route); - xbt_dict_set(dict_bypassRoutes, route_name, new_e_route, - (void (*)(void *)) generic_free_extended_route); + xbt_dict_set(dict_bypassRoutes, route_name, new_e_route, NULL); + having_set_bypassroute = 1; xbt_free(route_name); } /* ************************************************************************** */ /* *********************** GENERIC BUSINESS METHODS ************************* */ -double generic_get_link_latency(routing_component_t rc, - const char *src, const char *dst, - route_extended_t route) -{ - int need_to_clean = route ? 0 : 1; - void *link; - unsigned int i; - double latency = 0.0; - - route = route ? route : rc->get_route(rc, src, dst); - - xbt_dynar_foreach(route->generic_route.link_list, i, link) { - latency += surf_network_model->extension.network.get_link_latency(link); - } - if (need_to_clean) - generic_free_extended_route(route); - return latency; -} - -xbt_dynar_t generic_get_onelink_routes(routing_component_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_extended_t generic_get_bypassroute(routing_component_t rc, - const char *src, const char *dst) +route_t generic_get_bypassroute(AS_t rc, const char *src, const char *dst) { + // If never set a bypass route return NULL + if(!having_set_bypassroute) + return NULL; + xbt_dict_t dict_bypassRoutes = rc->bypassRoutes; - routing_component_t src_as, dst_as; + AS_t src_as, dst_as; int index_src, index_dst; xbt_dynar_t path_src = NULL; xbt_dynar_t path_dst = NULL; - routing_component_t current = NULL; - routing_component_t *current_src = NULL; - routing_component_t *current_dst = NULL; + AS_t current = NULL; + 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); @@ -118,13 +126,13 @@ route_extended_t generic_get_bypassroute(routing_component_t rc, dst_as = ((network_element_info_t) dst_data)->rc_component; /* (2) find the path to the root routing component */ - path_src = xbt_dynar_new(sizeof(routing_component_t), NULL); + 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(routing_component_t), NULL); + path_dst = xbt_dynar_new(sizeof(AS_t), NULL); current = dst_as; while (current != NULL) { xbt_dynar_push(path_dst, ¤t); @@ -151,15 +159,15 @@ route_extended_t generic_get_bypassroute(routing_component_t rc, int max_index = max(max_index_src, max_index_dst); int i, max; - route_extended_t e_route_bypass = NULL; + route_t e_route_bypass = NULL; 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", - (*(routing_component_t *) + (*(AS_t *) (xbt_dynar_get_ptr(path_src, i)))->name, - (*(routing_component_t *) + (*(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); @@ -168,9 +176,9 @@ route_extended_t generic_get_bypassroute(routing_component_t rc, break; if (max <= max_index_src && i <= max_index_dst) { char *route_name = bprintf("%s#%s", - (*(routing_component_t *) + (*(AS_t *) (xbt_dynar_get_ptr(path_src, max)))->name, - (*(routing_component_t *) + (*(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); @@ -184,9 +192,9 @@ route_extended_t generic_get_bypassroute(routing_component_t rc, if (max <= max_index_src && max <= max_index_dst) { char *route_name = bprintf("%s#%s", - (*(routing_component_t *) + (*(AS_t *) (xbt_dynar_get_ptr(path_src, max)))->name, - (*(routing_component_t *) + (*(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); @@ -198,18 +206,18 @@ route_extended_t generic_get_bypassroute(routing_component_t rc, xbt_dynar_free(&path_src); xbt_dynar_free(&path_dst); - route_extended_t new_e_route = NULL; + route_t new_e_route = NULL; if (e_route_bypass) { void *link; unsigned int cpt = 0; - new_e_route = xbt_new0(s_route_extended_t, 1); + 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->generic_route.link_list = + new_e_route->link_list = xbt_dynar_new(global_routing->size_of_link, NULL); - xbt_dynar_foreach(e_route_bypass->generic_route.link_list, cpt, link) { - xbt_dynar_push(new_e_route->generic_route.link_list, &link); + xbt_dynar_foreach(e_route_bypass->link_list, cpt, link) { + xbt_dynar_push(new_e_route->link_list, &link); } } @@ -254,22 +262,19 @@ generic_new_route(e_surf_routing_hierarchy_t hierarchy, void *data, int order) return new_route; } -route_extended_t +route_t generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy, void *data, int order) { char *link_name; - route_extended_t e_route, new_e_route; + 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_extended_t, 1); - new_e_route->generic_route.link_list = - xbt_dynar_new(global_routing->size_of_link, NULL); - new_e_route->src_gateway = NULL; - new_e_route->dst_gateway = NULL; + new_e_route = xbt_new0(s_route_t, 1); + new_e_route->link_list = xbt_dynar_new(global_routing->size_of_link, NULL); xbt_assert(hierarchy == SURF_ROUTING_BASE || hierarchy == SURF_ROUTING_RECURSIVE, @@ -282,17 +287,17 @@ generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy, } else if (hierarchy == SURF_ROUTING_RECURSIVE) { - e_route = (route_extended_t) data; + e_route = (route_t) data; xbt_assert(e_route->src_gateway && e_route->dst_gateway, "bad gateway, is null"); - links = e_route->generic_route.link_list; + 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); } - links_id = new_e_route->generic_route.link_list; + links_id = new_e_route->link_list; xbt_dynar_foreach(links, cpt, link_name) { @@ -312,29 +317,21 @@ generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy, void generic_free_route(route_t route) { if (route) { - xbt_dynar_free(&(route->link_list)); + xbt_dynar_free(&route->link_list); + xbt_free(route->src_gateway); + xbt_free(route->dst_gateway); xbt_free(route); } } -void generic_free_extended_route(route_extended_t e_route) -{ - if (e_route) { - xbt_dynar_free(&(e_route->generic_route.link_list)); - xbt_free(e_route->src_gateway); - xbt_free(e_route->dst_gateway); - xbt_free(e_route); - } -} - -static routing_component_t generic_as_exist(routing_component_t find_from, - routing_component_t to_find) +static AS_t generic_as_exist(AS_t find_from, + AS_t to_find) { //return to_find; // FIXME: BYPASSERROR OF FOREACH WITH BREAK xbt_dict_cursor_t cursor = NULL; char *key; int found = 0; - routing_component_t elem; + AS_t elem; xbt_dict_foreach(find_from->routing_sons, cursor, key, elem) { if (to_find == elem || generic_as_exist(elem, to_find)) { found = 1; @@ -346,17 +343,17 @@ static routing_component_t generic_as_exist(routing_component_t find_from, return NULL; } -routing_component_t -generic_autonomous_system_exist(routing_component_t rc, char *element) +AS_t +generic_autonomous_system_exist(AS_t rc, char *element) { //return rc; // FIXME: BYPASSERROR OF FOREACH WITH BREAK - routing_component_t element_as, result, elem; + AS_t element_as, result, elem; xbt_dict_cursor_t cursor = NULL; char *key; element_as = ((network_element_info_t) xbt_lib_get_or_null(as_router_lib, element, ROUTING_ASR_LEVEL))->rc_component; - result = ((routing_component_t) - 1); + result = ((AS_t) - 1); if (element_as != rc) result = generic_as_exist(rc, element_as); @@ -373,10 +370,10 @@ generic_autonomous_system_exist(routing_component_t rc, char *element) return NULL; } -routing_component_t -generic_processing_units_exist(routing_component_t rc, char *element) +AS_t +generic_processing_units_exist(AS_t rc, char *element) { - routing_component_t element_as; + AS_t element_as; element_as = ((network_element_info_t) xbt_lib_get_or_null(host_lib, element, ROUTING_HOST_LEVEL))->rc_component; @@ -385,7 +382,7 @@ generic_processing_units_exist(routing_component_t rc, char *element) return generic_as_exist(rc, element_as); } -void generic_src_dst_check(routing_component_t rc, const char *src, +void generic_src_dst_check(AS_t rc, const char *src, const char *dst) { @@ -400,9 +397,9 @@ void generic_src_dst_check(routing_component_t rc, const char *src, xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"", src, dst, rc->name); - routing_component_t src_as = + AS_t src_as = ((network_element_info_t) src_data)->rc_component; - routing_component_t dst_as = + AS_t dst_as = ((network_element_info_t) dst_data)->rc_component; if (src_as != dst_as)