From: navarro Date: Fri, 16 Mar 2012 13:51:44 +0000 (+0100) Subject: Reimplement function get_onelink_route. X-Git-Tag: v3_7~307 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/f55ebe8f51eaa911242266638068e2c91e958db9?hp=445590fd865f35e74be34955931c97b8956f6d7f Reimplement function get_onelink_route. --- diff --git a/src/surf/surf_private.h b/src/surf/surf_private.h index bfd298c686..dafbfc4c47 100644 --- a/src/surf/surf_private.h +++ b/src/surf/surf_private.h @@ -144,7 +144,7 @@ typedef enum { } e_surf_routing_hierarchy_t; typedef struct s_as { - int nb_index; + xbt_dynar_t index_network_elm; xbt_dict_t bypassRoutes; /* store bypass routes */ routing_model_description_t model_desc; e_surf_routing_hierarchy_t hierarchy; @@ -164,8 +164,8 @@ typedef struct s_as { * that a new element is added to the AS currently built. * * Of course, only the routing model of this AS is informed, not every ones */ - int (*parse_PU) (AS_t as, const char *name); /* A host or a router, whatever */ - int (*parse_AS) (AS_t as, const char *name); + int (*parse_PU) (AS_t as, network_element_t elm); /* A host or a router, whatever */ + int (*parse_AS) (AS_t as, network_element_t elm); void (*parse_route) (AS_t as, const char *src, const char *dst, route_t route); void (*parse_ASroute) (AS_t as, const char *src, diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index b2e27e885e..e93f8fad0f 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -112,7 +112,7 @@ static void parse_S_host(sg_platf_host_cbarg_t host) info->rc_component = current_routing; info->rc_type = SURF_NETWORK_ELEMENT_HOST; info->name = xbt_strdup(host->id); - info->id = current_routing->parse_PU(current_routing, host->id); + info->id = current_routing->parse_PU(current_routing, (void *) info); xbt_lib_set(host_lib, host->id, ROUTING_HOST_LEVEL, (void *) info); XBT_DEBUG("Having set name '%s' id '%d'",host->id,info->id); @@ -157,7 +157,7 @@ static void parse_S_router(sg_platf_router_cbarg_t router) info->rc_component = current_routing; info->rc_type = SURF_NETWORK_ELEMENT_ROUTER; info->name = xbt_strdup(router->id); - info->id = current_routing->parse_PU(current_routing, router->id); + info->id = current_routing->parse_PU(current_routing, (void *) info); xbt_lib_set(as_router_lib, router->id, ROUTING_ASR_LEVEL, (void *) info); XBT_DEBUG("Having set name '%s' id '%d'",router->id,info->id); @@ -398,7 +398,7 @@ void routing_AS_begin(const char *AS_id, const char *wanted_routing_type) xbt_dict_set(current_routing->routing_sons, AS_id, (void *) new_as, NULL); /* add to the father element list */ - info->id = current_routing->parse_AS(current_routing, AS_id); + info->id = current_routing->parse_AS(current_routing, (void *) info); } else { THROWF(arg_error, 0, "All defined components must be belong to a AS"); } diff --git a/src/surf/surf_routing_dijkstra.c b/src/surf/surf_routing_dijkstra.c index e6a11c338d..764e845bcd 100644 --- a/src/surf/surf_routing_dijkstra.c +++ b/src/surf/surf_routing_dijkstra.c @@ -171,33 +171,34 @@ static void dijkstra_get_route_and_latency(AS_t as_generic, static xbt_dynar_t dijkstra_get_onelink_routes(AS_t as) { xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free); - THROW_UNIMPLEMENTED; -// //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(as->to_index, c1, k1, d1) { -// xbt_dict_foreach(as->to_index, c2, k2, d2) { -// route_t route = xbt_new0(s_route_t,1); -// route->link_list = xbt_dynar_new(global_routing->size_of_link,NULL); -// dijkstra_get_route_and_latency(as, k1, k2,route, NULL); -// -// if (xbt_dynar_length(route->link_list) == 1) { -// void *link = -// *(void **) xbt_dynar_get_ptr(route->link_list, 0); -// onelink_t onelink = xbt_new0(s_onelink_t, 1); -// onelink->link_ptr = link; -// if (as->hierarchy == SURF_ROUTING_BASE) { -// onelink->src = xbt_strdup(k1); -// onelink->dst = xbt_strdup(k2); -// } else if (as->hierarchy == -// SURF_ROUTING_RECURSIVE) { -// onelink->src = route->src_gateway; -// onelink->dst = route->dst_gateway; -// } -// xbt_dynar_push(ret, &onelink); -// } -// } -// } + route_t route = xbt_new0(s_route_t,1); + route->link_list = xbt_dynar_new(global_routing->size_of_link,NULL); + + int src,dst; + network_element_t src_elm, dst_elm; + size_t table_size = xbt_dynar_length(as->index_network_elm); + for(src=0; src < table_size; src++) { + for(dst=0; dst< table_size; dst++) { + xbt_dynar_reset(route->link_list); + src_elm = xbt_dynar_get_as(as->index_network_elm,src,network_element_t); + dst_elm = xbt_dynar_get_as(as->index_network_elm,dst,network_element_t); + dijkstra_get_route_and_latency(as, src_elm, dst_elm,route, NULL); + + if (xbt_dynar_length(route->link_list) == 1) { + void *link = *(void **) xbt_dynar_get_ptr(route->link_list, 0); + onelink_t onelink = xbt_new0(s_onelink_t, 1); + onelink->link_ptr = link; + if (as->hierarchy == SURF_ROUTING_BASE) { + onelink->src = src_elm; + onelink->dst = dst_elm; + } else if (as->hierarchy == SURF_ROUTING_RECURSIVE) { + onelink->src = route->src_gateway; + onelink->dst = route->dst_gateway; + } + xbt_dynar_push(ret, &onelink); + } + } + } return ret; } diff --git a/src/surf/surf_routing_floyd.c b/src/surf/surf_routing_floyd.c index 28f4f6c4c2..d2624082fd 100644 --- a/src/surf/surf_routing_floyd.c +++ b/src/surf/surf_routing_floyd.c @@ -32,31 +32,35 @@ static void floyd_get_route_and_latency(AS_t asg, network_element_t src, network static xbt_dynar_t floyd_get_onelink_routes(AS_t asg) { xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free); - THROW_UNIMPLEMENTED; -// route_t route = xbt_new0(s_route_t, 1); -// route->link_list = xbt_dynar_new(global_routing->size_of_link, NULL); -// -// xbt_dict_cursor_t c1 = NULL, c2 = NULL; -// char *k1, *d1, *k2, *d2; -// xbt_dict_foreach(asg->to_index, c1, k1, d1) { -// xbt_dict_foreach(asg->to_index, c2, k2, d2) { -// xbt_dynar_reset(route->link_list); -// floyd_get_route_and_latency(asg, k1, k2, route, NULL); -// if (xbt_dynar_length(route->link_list) == 1) { -// void *link = *(void **) xbt_dynar_get_ptr(route->link_list, 0); -// onelink_t onelink = xbt_new0(s_onelink_t, 1); -// onelink->link_ptr = link; -// if (asg->hierarchy == SURF_ROUTING_BASE) { -// onelink->src = xbt_strdup(k1); -// onelink->dst = xbt_strdup(k2); -// } else if (asg->hierarchy == SURF_ROUTING_RECURSIVE) { -// onelink->src = route->src_gateway; -// onelink->dst = route->dst_gateway; -// } -// xbt_dynar_push(ret, &onelink); -// } -// } -// } + route_t route = xbt_new0(s_route_t, 1); + route->link_list = xbt_dynar_new(global_routing->size_of_link, NULL); + + int src,dst; + network_element_t src_elm, dst_elm; + int table_size = xbt_dynar_length(asg->index_network_elm); + for(src=0; src < table_size; src++) { + for(dst=0; dst< table_size; dst++) { + xbt_dynar_reset(route->link_list); + src_elm = xbt_dynar_get_as(asg->index_network_elm,src,network_element_t); + dst_elm = xbt_dynar_get_as(asg->index_network_elm,dst,network_element_t); + floyd_get_route_and_latency(asg, src_elm, dst_elm, route, NULL); + + if (xbt_dynar_length(route->link_list) == 1) { + void *link = *(void **) xbt_dynar_get_ptr(route->link_list, 0); + onelink_t onelink = xbt_new0(s_onelink_t, 1); + onelink->link_ptr = link; + if (asg->hierarchy == SURF_ROUTING_BASE) { + onelink->src = src_elm; + onelink->dst = dst_elm; + } else if (asg->hierarchy == SURF_ROUTING_RECURSIVE) { + onelink->src = route->src_gateway; + onelink->dst = route->dst_gateway; + } + xbt_dynar_push(ret, &onelink); + } + } + } + return ret; } @@ -66,7 +70,7 @@ static void floyd_get_route_and_latency(AS_t asg, network_element_t src, network /* set utils vars */ as_floyd_t as = (as_floyd_t)asg; - size_t table_size = asg->nb_index; + size_t table_size = xbt_dynar_length(asg->index_network_elm); generic_src_dst_check(asg, src, dst); int *src_id = &(src->id); @@ -147,7 +151,7 @@ static void floyd_finalize(AS_t rc) int i, j; size_t table_size; if (as) { - table_size = as->generic_routing.nb_index; + table_size = xbt_dynar_length(as->generic_routing.index_network_elm); /* Delete link_table */ for (i = 0; i < table_size; i++) for (j = 0; j < table_size; j++) @@ -184,7 +188,7 @@ void model_floyd_end(AS_t current_routing) unsigned int i, j, a, b, c; /* set the size of table routing */ - size_t table_size = as->generic_routing.nb_index; + size_t table_size = xbt_dynar_length(as->generic_routing.index_network_elm); if(!as->link_table) { @@ -249,7 +253,7 @@ void model_floyd_parse_route(AS_t rc, const char *src, as_floyd_t as = (as_floyd_t) rc; /* set the size of table routing */ - size_t table_size = rc->nb_index; + size_t table_size = xbt_dynar_length(rc->index_network_elm); network_element_t src_net_elm, dst_net_elm; src_net_elm = (network_element_t)xbt_lib_get_or_null(host_lib, src, ROUTING_HOST_LEVEL); diff --git a/src/surf/surf_routing_full.c b/src/surf/surf_routing_full.c index 2f7af5ee92..1ac2f26306 100644 --- a/src/surf/surf_routing_full.c +++ b/src/surf/surf_routing_full.c @@ -25,39 +25,34 @@ typedef struct s_routing_component_full { static xbt_dynar_t full_get_onelink_routes(AS_t rc) { xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free); -THROW_UNIMPLEMENTED; -// routing_component_full_t routing = (routing_component_full_t) rc; -// size_t table_size = routing->generic_routing.nb_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) { -// int *src_id = xbt_dict_get_or_null(routing->generic_routing.to_index, k1); -// int *dst_id = xbt_dict_get_or_null(routing->generic_routing.to_index, k2); -// xbt_assert(src_id && dst_id, -// "Ask for route \"from\"(%s) or \"to\"(%s) " -// "no found in the local table", k1, k2); -// route_t route = TO_ROUTE_FULL(*src_id, *dst_id); -// if (route) { -// if (xbt_dynar_length(route->link_list) == 1) { -// void *link = *(void **) xbt_dynar_get_ptr(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->routing_obj->name = xbt_strdup(k1); -// onelink->src->routing_obj->id = atoi(k1); -// onelink->dst->routing_obj->name = xbt_strdup(k2); -// onelink->dst->routing_obj->id = atoi(k2); -// } else if (routing->generic_routing.hierarchy == -// SURF_ROUTING_RECURSIVE) { -// onelink->src = route->src_gateway; -// onelink->dst = route->dst_gateway; -// } -// xbt_dynar_push(ret, &onelink); -// } -// } -// } -// } + routing_component_full_t routing = (routing_component_full_t) rc; + + int src,dst; + int table_size = xbt_dynar_length(rc->index_network_elm); + + for(src=0; src < table_size; src++) { + for(dst=0; dst< table_size; dst++) { + route_t route = TO_ROUTE_FULL(src, dst); + if (route) { + if (xbt_dynar_length(route->link_list) == 1) { + void *link = *(void **) xbt_dynar_get_ptr(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_dynar_get_as(routing->generic_routing.index_network_elm,src,network_element_t); + onelink->src->id = src; + onelink->dst = xbt_dynar_get_as(routing->generic_routing.index_network_elm,dst,network_element_t); + onelink->dst->id = dst; + } else if (routing->generic_routing.hierarchy == + SURF_ROUTING_RECURSIVE) { + onelink->src = route->src_gateway; + onelink->dst = route->dst_gateway; + } + xbt_dynar_push(ret, &onelink); + } + } + } + } return ret; } @@ -73,7 +68,7 @@ static void full_get_route_and_latency(AS_t rc, /* set utils vars */ routing_component_full_t routing = (routing_component_full_t) rc; - size_t table_size = routing->generic_routing.nb_index; + size_t table_size = xbt_dynar_length(routing->generic_routing.index_network_elm); route_t e_route = NULL; void *link; @@ -95,7 +90,7 @@ static void full_get_route_and_latency(AS_t rc, static void full_finalize(AS_t rc) { routing_component_full_t routing = (routing_component_full_t) rc; - size_t table_size = routing->generic_routing.nb_index; + size_t table_size = xbt_dynar_length(routing->generic_routing.index_network_elm); int i, j; if (routing) { /* Delete routing table */ @@ -132,7 +127,7 @@ void model_full_end(AS_t current_routing) /* set utils vars */ routing_component_full_t routing = ((routing_component_full_t) current_routing); - size_t table_size = routing->generic_routing.nb_index; + size_t table_size = xbt_dynar_length(routing->generic_routing.index_network_elm); /* Create table if necessary */ if (!routing->routing_table) @@ -173,7 +168,7 @@ void model_full_set_route(AS_t rc, const char *src, xbt_assert(dst_net_elm, "Network elements %s not found", dst); routing_component_full_t routing = (routing_component_full_t) rc; - size_t table_size = routing->generic_routing.nb_index; + size_t table_size = xbt_dynar_length(routing->generic_routing.index_network_elm); xbt_assert(!xbt_dynar_is_empty(route->link_list), "Invalid count of links, must be greater than zero (%s,%s)", diff --git a/src/surf/surf_routing_generic.c b/src/surf/surf_routing_generic.c index c3d6d9a7c8..f89383fc05 100644 --- a/src/surf/surf_routing_generic.c +++ b/src/surf/surf_routing_generic.c @@ -29,10 +29,9 @@ 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); + new_component->index_network_elm = xbt_dynar_new(sizeof(char*),NULL); return new_component; } void model_generic_finalize(AS_t as) { @@ -40,20 +39,18 @@ 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->index_network_elm, 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->index_network_elm, elm); + return xbt_dynar_length(as->index_network_elm)-1; } void generic_parse_bypassroute(AS_t rc, diff --git a/src/surf/surf_routing_none.c b/src/surf/surf_routing_none.c index 75d295b977..e4e187caef 100644 --- a/src/surf/surf_routing_none.c +++ b/src/surf/surf_routing_none.c @@ -23,12 +23,14 @@ static route_t none_get_bypass_route(AS_t rc, return NULL; } -static int none_parse_PU(AS_t rc, const char *name) { +static int none_parse_PU(AS_t rc, network_element_t elm) { + xbt_dynar_push(rc->index_network_elm, (void *)elm); /* don't care about PUs */ return -1; } -static int none_parse_AS(AS_t rc, const char *name) { +static int none_parse_AS(AS_t rc, network_element_t elm) { + xbt_dynar_push(rc->index_network_elm, (void *)elm); /* even don't care about sub-ASes -- I'm as nihilist as an old punk*/ return -1; } @@ -50,7 +52,7 @@ AS_t model_none_create_sized(size_t childsize) { new_component->finalize = model_none_finalize; new_component->routing_sons = xbt_dict_new_homogeneous(NULL); - + new_component->index_network_elm = xbt_dynar_new(sizeof(char*),NULL); return new_component; } diff --git a/src/surf/surf_routing_private.h b/src/surf/surf_routing_private.h index fe451e37a4..9b356ddefd 100644 --- a/src/surf/surf_routing_private.h +++ b/src/surf/surf_routing_private.h @@ -29,8 +29,8 @@ void model_none_finalize(AS_t as); AS_t model_generic_create_sized(size_t childsize); void model_generic_finalize(AS_t as); -int generic_parse_PU(AS_t rc, const char *name); -int generic_parse_AS(AS_t rc, const char *name); +int generic_parse_PU(AS_t rc, network_element_t elm); +int generic_parse_AS(AS_t rc, network_element_t elm); void generic_parse_bypassroute(AS_t rc, const char *src, const char *dst, route_t e_route); diff --git a/src/surf/surf_routing_rulebased.c b/src/surf/surf_routing_rulebased.c index 5481859007..d12f459559 100644 --- a/src/surf/surf_routing_rulebased.c +++ b/src/surf/surf_routing_rulebased.c @@ -15,8 +15,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_rulebased, surf, "Routing part of sur typedef struct { s_as_t generic_routing; - int nb_processing_units; - int nb_autonomous_systems; xbt_dynar_t list_route; xbt_dynar_t list_ASroute; } s_AS_rulebased_t, *AS_rulebased_t; @@ -64,17 +62,17 @@ static void rule_route_extended_free(void *e) /* Parse routing model functions */ -static int model_rulebased_parse_PU(AS_t rc, const char *name) +static int model_rulebased_parse_PU(AS_t rc, network_element_t elm) { AS_rulebased_t routing = (AS_rulebased_t) rc; - routing->nb_processing_units++; + xbt_dynar_push(routing->generic_routing.index_network_elm,(void *)elm); return -1; } -static int model_rulebased_parse_AS(AS_t rc, const char *name) +static int model_rulebased_parse_AS(AS_t rc, network_element_t elm) { AS_rulebased_t routing = (AS_rulebased_t) rc; - routing->nb_autonomous_systems++; + xbt_dynar_push(routing->generic_routing.index_network_elm,(void *)elm); return -1; } @@ -214,52 +212,49 @@ static void rulebased_get_route_and_latency(AS_t rc, static xbt_dynar_t rulebased_get_onelink_routes(AS_t rc) { xbt_dynar_t ret = xbt_dynar_new (sizeof(onelink_t), xbt_free); - THROW_UNIMPLEMENTED; -// //We have already bypass cluster routes with network NS3 -// if(!strcmp(surf_network_model->name,"network NS3")) -// return ret; -// -// AS_rulebased_t routing = (AS_rulebased_t)rc; -// -// xbt_dict_cursor_t c1 = NULL; -// char *k1, *d1; -// -// //find router -// char *router = NULL; -// xbt_dict_foreach(routing->dict_processing_units, c1, k1, d1) { -// if (routing_get_network_element_type(k1) == SURF_NETWORK_ELEMENT_ROUTER){ -// router = k1; -// break; -// } -// } -// -// if (!router) -// xbt_die ("rulebased_get_onelink_routes works only if the AS is a cluster, sorry."); -// -// xbt_dict_foreach(routing->dict_processing_units, c1, k1, d1) { -// route_t route = xbt_new0(s_route_t,1); -// route->link_list = xbt_dynar_new(global_routing->size_of_link,NULL); -// rulebased_get_route_and_latency (rc, router, k1, route,NULL); -// -// int number_of_links = xbt_dynar_length(route->link_list); -// -// if(number_of_links == 1) { -// //loopback -// } -// else{ -// if (number_of_links != 2) { -// xbt_die ("rulebased_get_onelink_routes works only if the AS is a cluster, sorry."); -// } -// -// void *link_ptr; -// xbt_dynar_get_cpy (route->link_list, 1, &link_ptr); -// onelink_t onelink = xbt_new0 (s_onelink_t, 1); -// onelink->src = xbt_strdup (k1); -// onelink->dst = xbt_strdup (router); -// onelink->link_ptr = link_ptr; -// xbt_dynar_push (ret, &onelink); -// } -// } + //We have already bypass cluster routes with network NS3 + if(!strcmp(surf_network_model->name,"network NS3")) + return ret; + + char *k1; + + //find router + network_element_t router = NULL; + xbt_lib_cursor_t cursor; + xbt_lib_foreach(as_router_lib, cursor, k1, router) + { + if (router->rc_type == SURF_NETWORK_ELEMENT_ROUTER) + break; + } + + if (!router) + xbt_die ("rulebased_get_onelink_routes works only if the AS is a cluster, sorry."); + + network_element_t host = NULL; + xbt_lib_foreach(as_router_lib, cursor, k1, host){ + route_t route = xbt_new0(s_route_t,1); + route->link_list = xbt_dynar_new(global_routing->size_of_link,NULL); + rulebased_get_route_and_latency (rc, router, host, route,NULL); + + int number_of_links = xbt_dynar_length(route->link_list); + + if(number_of_links == 1) { + //loopback + } + else{ + if (number_of_links != 2) { + xbt_die ("rulebased_get_onelink_routes works only if the AS is a cluster, sorry."); + } + + void *link_ptr; + xbt_dynar_get_cpy (route->link_list, 1, &link_ptr); + onelink_t onelink = xbt_new0 (s_onelink_t, 1); + onelink->src = host; + onelink->dst = router; + onelink->link_ptr = link_ptr; + xbt_dynar_push (ret, &onelink); + } + } return ret; }