X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c5898c7bb61800b2ffac463d79738309dcc6170b..8cc10e99f53995bc7486e4467b4e6ad8d7be3460:/src/surf/surf_routing_dijkstra.c diff --git a/src/surf/surf_routing_dijkstra.c b/src/surf/surf_routing_dijkstra.c index 60e055bed0..341012c730 100644 --- a/src/surf/surf_routing_dijkstra.c +++ b/src/surf/surf_routing_dijkstra.c @@ -11,7 +11,7 @@ extern routing_global_t global_routing; extern routing_component_t current_routing; extern model_type_t current_routing_model; -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_dijkstra, surf, "Routing part of surf"); +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_dijkstra, surf, "Routing part of surf -- dijkstra routing logic"); typedef struct { s_routing_component_t generic_routing; @@ -50,9 +50,7 @@ static void route_cache_elem_free(void *e) static void graph_node_map_elem_free(void *e) { graph_node_map_element_t elm = (graph_node_map_element_t) e; - if (elm) { - xbt_free(elm); - } + xbt_free(elm); } static void graph_edge_data_free(void *e) @@ -60,10 +58,8 @@ static void graph_edge_data_free(void *e) route_extended_t e_route = (route_extended_t) e; if (e_route) { xbt_dynar_free(&(e_route->generic_route.link_list)); - if (e_route->src_gateway) - xbt_free(e_route->src_gateway); - if (e_route->dst_gateway) - xbt_free(e_route->dst_gateway); + xbt_free(e_route->src_gateway); + xbt_free(e_route->dst_gateway); xbt_free(e_route); } } @@ -180,10 +176,43 @@ static void add_loopback_dijkstra(routing_component_dijkstra_t rc) } } -/* Business methods */ +static route_extended_t dijkstra_get_route(routing_component_t rc, + const char *src, + const char *dst); + static xbt_dynar_t dijkstra_get_onelink_routes(routing_component_t rc) { - xbt_die("\"dijkstra_get_onelink_routes\" function not implemented yet"); + // xbt_die("\"dijkstra_get_onelink_routes\" function not implemented yet"); + xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free); + + routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; + //size_t table_size = xbt_dict_length(routing->generic_routing.to_index); + xbt_dict_cursor_t c1 = NULL, c2 = NULL; + char *k1, *d1, *k2, *d2; + xbt_dict_foreach(routing->generic_routing.to_index, c1, k1, d1) { + xbt_dict_foreach(routing->generic_routing.to_index, c2, k2, d2) { + route_extended_t route = dijkstra_get_route(rc, k1, k2); + if (route) { + if (xbt_dynar_length(route->generic_route.link_list) == 1) { + void *link = + *(void **) xbt_dynar_get_ptr(route->generic_route.link_list, + 0); + onelink_t onelink = xbt_new0(s_onelink_t, 1); + onelink->link_ptr = link; + if (routing->generic_routing.hierarchy == SURF_ROUTING_BASE) { + onelink->src = xbt_strdup(k1); + onelink->dst = xbt_strdup(k2); + } else if (routing->generic_routing.hierarchy == + SURF_ROUTING_RECURSIVE) { + onelink->src = xbt_strdup(route->src_gateway); + onelink->dst = xbt_strdup(route->dst_gateway); + } + xbt_dynar_push(ret, &onelink); + } + } + } + } + return ret; } static route_extended_t dijkstra_get_route(routing_component_t rc, @@ -330,8 +359,7 @@ static route_extended_t dijkstra_get_route(routing_component_t rc, } /* compose route path with links */ - char *gw_src = NULL, *gw_dst = - NULL, *prev_gw_src, *prev_gw_dst, *first_gw = NULL; + char *gw_src = NULL, *gw_dst = NULL, *prev_gw_src, *first_gw = NULL; for (v = dst_node_id; v != src_node_id; v = pred_arr[v]) { xbt_node_t node_pred_v = @@ -344,7 +372,6 @@ static route_extended_t dijkstra_get_route(routing_component_t rc, *dst_id); prev_gw_src = gw_src; - prev_gw_dst = gw_dst; e_route = (route_extended_t) xbt_graph_edge_get_data(edge); gw_src = e_route->src_gateway; @@ -416,51 +443,32 @@ static void dijkstra_finalize(routing_component_t rc) /* Creation routing model functions */ -void *model_dijkstra_both_create(int cached) +routing_component_t model_dijkstra_both_create(int cached) { - routing_component_dijkstra_t new_component = - xbt_new0(s_routing_component_dijkstra_t, 1); - new_component->generic_routing.set_processing_unit = - generic_set_processing_unit; - 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 = model_dijkstra_both_set_route; - new_component->generic_routing.set_bypassroute = generic_set_bypassroute; + routing_component_dijkstra_t new_component = (routing_component_dijkstra_t) + routmod_generic_create(sizeof(s_routing_component_dijkstra_t)); + + new_component->generic_routing.parse_route = model_dijkstra_both_parse_route; + new_component->generic_routing.parse_ASroute = model_dijkstra_both_parse_route; 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 = - generic_get_bypassroute; new_component->generic_routing.finalize = dijkstra_finalize; 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.get_network_element_type = get_network_element_type; - return new_component; + + return (routing_component_t)new_component; } -void *model_dijkstra_create(void) +routing_component_t model_dijkstra_create(void) { return model_dijkstra_both_create(0); } -void *model_dijkstracache_create(void) +routing_component_t model_dijkstracache_create(void) { return model_dijkstra_both_create(1); } -void model_dijkstra_both_load(void) -{ - /* use "surfxml_add_callback" to add a parse function call */ -} - -void model_dijkstra_both_unload(void) -{ - /* use "surfxml_del_callback" to remove a parse function call */ -} - void model_dijkstra_both_end(void) { routing_component_dijkstra_t routing = @@ -492,7 +500,7 @@ void model_dijkstra_both_end(void) } } -void model_dijkstra_both_set_route (routing_component_t rc, const char *src, +void model_dijkstra_both_parse_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;