X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e93257dad9c24c211ccdfcb64e36c8805f0ff832..7e5ab0d2140f17598ab7f8ca86c2c38022bd954b:/src/surf/surf_routing.c diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 5d1e078eb4..15cf032c06 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -8,6 +8,27 @@ #include /* regular expression library */ #endif #include "surf_routing_private.h" +#include "surf/surf_routing.h" + +xbt_lib_t host_lib; +int ROUTING_HOST_LEVEL; //Routing level +int SURF_CPU_LEVEL; //Surf cpu level +int SURF_WKS_LEVEL; //Surf workstation level +int SIMIX_HOST_LEVEL; //Simix level +int MSG_HOST_LEVEL; //Msg level +int SD_HOST_LEVEL; //Simdag level +int COORD_HOST_LEVEL; //Coordinates level +int NS3_HOST_LEVEL; //host node for ns3 + +xbt_lib_t link_lib; +int SD_LINK_LEVEL; //Simdag level +int SURF_LINK_LEVEL; //Surf level +int NS3_LINK_LEVEL; //link for ns3 + +xbt_lib_t as_router_lib; +int ROUTING_ASR_LEVEL; //Routing level +int COORD_ASR_LEVEL; //Coordinates level +int NS3_ASR_LEVEL; //host node for ns3 static xbt_dict_t patterns = NULL; static xbt_dict_t random_value = NULL; @@ -555,83 +576,68 @@ static char* elements_As_name(const char *name) * Get the common father of the to processing units, and the first different * father in the chain */ -static xbt_dynar_t elements_father(const char *src, const char *dst) +static void elements_father(const char *src, const char *dst, + routing_component_t *res_father, + routing_component_t *res_src, + routing_component_t *res_dst) { - xbt_assert(src && dst, "bad parameters for \"elements_father\" method"); - - xbt_dynar_t result = xbt_dynar_new(sizeof(char *), NULL); - +#define ELEMENTS_FATHER_MAXDEPTH 16 /* increase if it is not enough */ routing_component_t src_as, dst_as; - int index_src, index_dst, index_father_src, index_father_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; - routing_component_t *father = NULL; + routing_component_t path_src[ELEMENTS_FATHER_MAXDEPTH]; + routing_component_t path_dst[ELEMENTS_FATHER_MAXDEPTH]; + int index_src = 0; + int index_dst = 0; + routing_component_t current; + routing_component_t current_src; + routing_component_t current_dst; + routing_component_t father; /* (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); - src_as = ((network_element_info_t)src_data)->rc_component; - dst_as = ((network_element_info_t)dst_data)->rc_component; - - xbt_assert(src_as - && dst_as, - "Ask for route \"from\"(%s) or \"to\"(%s) no found", src, - dst); + network_element_info_t src_data = xbt_lib_get_or_null(host_lib, src, + ROUTING_HOST_LEVEL); + network_element_info_t 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); + src_as = src_data->rc_component; + dst_as = dst_data->rc_component; + + xbt_assert(src_as && dst_as, + "Ask for route \"from\"(%s) or \"to\"(%s) no found", src, dst); /* (2) find the path to the root routing component */ - path_src = xbt_dynar_new(sizeof(routing_component_t), NULL); - current = src_as; - while (current != NULL) { - xbt_dynar_push(path_src, ¤t); - current = current->routing_father; + for (current = src_as ; current != NULL ; current = current->routing_father) { + path_src[index_src++] = current; + xbt_assert(index_src <= ELEMENTS_FATHER_MAXDEPTH, + "ELEMENTS_FATHER_MAXDEPTH should be increased for path_src"); } - path_dst = xbt_dynar_new(sizeof(routing_component_t), NULL); - current = dst_as; - while (current != NULL) { - xbt_dynar_push(path_dst, ¤t); - current = current->routing_father; + for (current = dst_as ; current != NULL ; current = current->routing_father) { + path_dst[index_dst++] = current; + xbt_assert(index_dst <= ELEMENTS_FATHER_MAXDEPTH, + "ELEMENTS_FATHER_MAXDEPTH should be increased for path_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); - while (index_src >= 0 && index_dst >= 0 && *current_src == *current_dst) { - current_src = xbt_dynar_get_ptr(path_src, index_src); - current_dst = xbt_dynar_get_ptr(path_dst, index_dst); - index_src--; - index_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); + do { + current_src = path_src[--index_src]; + current_dst = path_dst[--index_dst]; + } while (index_src > 0 && index_dst > 0 && current_src == current_dst); /* (4) they are not in the same routing component, make the path */ - index_father_src = index_src + 1; - index_father_dst = index_dst + 1; - - if (*current_src == *current_dst) + if (current_src == current_dst) father = current_src; else - father = xbt_dynar_get_ptr(path_src, index_father_src); + father = path_src[index_src + 1]; /* (5) result generation */ - xbt_dynar_push(result, father); /* first same the father of src and dst */ - xbt_dynar_push(result, current_src); /* second the first different father of src */ - xbt_dynar_push(result, current_dst); /* three the first different father of dst */ + *res_father = father; /* first the common father of src and dst */ + *res_src = current_src; /* second the first different father of src */ + *res_dst = current_dst; /* three the first different father of dst */ - xbt_dynar_free(&path_src); - xbt_dynar_free(&path_dst); - - return result; +#undef ELEMENTS_FATHER_MAXDEPTH } /* Global Business methods */ @@ -641,54 +647,44 @@ static xbt_dynar_t elements_father(const char *src, const char *dst) * * \param src the source host name * \param dst the destination host name + * \param *e_route the route where the links are stored * * This function is called by "get_route". It allows to walk recursively * through the routing components tree. */ -static route_extended_t _get_route(const char *src, const char *dst) +static void _get_route(const char *src, const char *dst,route_extended_t *e_route) { - - void *link; - unsigned int cpt = 0; - XBT_DEBUG("Solve route \"%s\" to \"%s\"", src, dst); - xbt_assert(src && dst, "bad parameters for \"_get_route\" method"); - route_extended_t e_route, e_route_cnt, e_route_src = NULL, e_route_dst = - NULL; - - xbt_dynar_t elem_father_list = elements_father(src, dst); - - routing_component_t common_father = - xbt_dynar_get_as(elem_father_list, 0, routing_component_t); - routing_component_t src_father = - xbt_dynar_get_as(elem_father_list, 1, routing_component_t); - routing_component_t dst_father = - xbt_dynar_get_as(elem_father_list, 2, routing_component_t); - - e_route = xbt_new0(s_route_extended_t, 1); - e_route->src_gateway = NULL; - e_route->dst_gateway = NULL; - e_route->generic_route.link_list = - xbt_dynar_new(global_routing->size_of_link, NULL); + routing_component_t common_father; + routing_component_t src_father; + routing_component_t dst_father; + elements_father(src, dst, &common_father, &src_father, &dst_father); if (src_father == dst_father) { /* SURF_ROUTING_BASE */ - e_route_cnt = + (*e_route) = (*(common_father->get_route)) (common_father, src, dst); - xbt_assert(e_route_cnt, "no route between \"%s\" and \"%s\"", src, + xbt_assert((*e_route), "no route between \"%s\" and \"%s\"", src, dst); - // FIXME (optim): faire une copie et pas une série de push - xbt_dynar_foreach(e_route_cnt->generic_route.link_list, cpt, link) { - xbt_dynar_push(e_route->generic_route.link_list, &link); - } - generic_free_extended_route(e_route_cnt); } else { /* SURF_ROUTING_RECURSIVE */ + void *link; + unsigned int cpt = 0; + + route_extended_t e_route_cnt = NULL; + route_extended_t e_route_src = NULL; + route_extended_t e_route_dst = NULL; route_extended_t e_route_bypass = NULL; + (*e_route) = xbt_new0(s_route_extended_t, 1); + (*e_route)->src_gateway = NULL; + (*e_route)->dst_gateway = NULL; + (*e_route)->generic_route.link_list = + xbt_dynar_new(global_routing->size_of_link, NULL); + if (common_father->get_bypass_route) e_route_bypass = (*(common_father->get_bypass_route)) (common_father, src, dst); @@ -709,38 +705,34 @@ static route_extended_t _get_route(const char *src, const char *dst) dst); if (strcmp(src, e_route_cnt->src_gateway)) { - e_route_src = _get_route(src, e_route_cnt->src_gateway); + _get_route(src, e_route_cnt->src_gateway, &e_route_src); xbt_assert(e_route_src, "no route between \"%s\" and \"%s\"", src, e_route_cnt->src_gateway); xbt_dynar_foreach(e_route_src->generic_route.link_list, cpt, link) { - xbt_dynar_push(e_route->generic_route.link_list, &link); + xbt_dynar_push((*e_route)->generic_route.link_list, &link); } } xbt_dynar_foreach(e_route_cnt->generic_route.link_list, cpt, link) { - xbt_dynar_push(e_route->generic_route.link_list, &link); + xbt_dynar_push((*e_route)->generic_route.link_list, &link); } if (strcmp(e_route_cnt->dst_gateway, dst)) { - e_route_dst = _get_route(e_route_cnt->dst_gateway, dst); + _get_route(e_route_cnt->dst_gateway, dst, &e_route_dst); xbt_assert(e_route_dst, "no route between \"%s\" and \"%s\"", e_route_cnt->dst_gateway, dst); xbt_dynar_foreach(e_route_dst->generic_route.link_list, cpt, link) { - xbt_dynar_push(e_route->generic_route.link_list, &link); + xbt_dynar_push((*e_route)->generic_route.link_list, &link); } } - e_route->src_gateway = xbt_strdup(e_route_cnt->src_gateway); - e_route->dst_gateway = xbt_strdup(e_route_cnt->dst_gateway); + (*e_route)->src_gateway = xbt_strdup(e_route_cnt->src_gateway); + (*e_route)->dst_gateway = xbt_strdup(e_route_cnt->dst_gateway); generic_free_extended_route(e_route_src); generic_free_extended_route(e_route_cnt); generic_free_extended_route(e_route_dst); } - - xbt_dynar_free(&elem_father_list); - - return e_route; } static double _get_latency(const char *src, const char *dst) @@ -752,14 +744,10 @@ static double _get_latency(const char *src, const char *dst) route_extended_t e_route_cnt; - xbt_dynar_t elem_father_list = elements_father(src, dst); - - routing_component_t common_father = - xbt_dynar_get_as(elem_father_list, 0, routing_component_t); - routing_component_t src_father = - xbt_dynar_get_as(elem_father_list, 1, routing_component_t); - routing_component_t dst_father = - xbt_dynar_get_as(elem_father_list, 2, routing_component_t); + routing_component_t common_father; + routing_component_t src_father; + routing_component_t dst_father; + elements_father(src, dst, &common_father, &src_father, &dst_father); if (src_father == dst_father) { /* SURF_ROUTING_BASE */ @@ -811,8 +799,6 @@ static double _get_latency(const char *src, const char *dst) } - xbt_dynar_free(&elem_father_list); - return latency; } @@ -829,9 +815,9 @@ static double _get_latency(const char *src, const char *dst) static xbt_dynar_t get_route(const char *src, const char *dst) { - route_extended_t e_route; + route_extended_t e_route = NULL; - e_route = _get_route(src, dst); + _get_route(src, dst, &e_route); xbt_assert(e_route, "no route between \"%s\" and \"%s\"", src, dst); if (global_routing->last_route)