X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a94f7f81e51eac626e42f38a56ef32978b232a08..0de7df8a3bc351fdff4c4a3e106608b15c842143:/src/surf/surf_routing.c diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 520f40356f..b0f6d7ed45 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -18,6 +18,7 @@ #include "xbt/config.h" #include "xbt/graph.h" #include "xbt/set.h" +#include "surf/surfxml_parse.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route, surf, "Routing part of surf"); @@ -25,6 +26,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route, surf, "Routing part of surf"); routing_global_t global_routing = NULL; routing_component_t current_routing = NULL; model_type_t current_routing_model = NULL; +static double_f_cpvoid_t get_link_latency = NULL; /* Prototypes of each model */ static void *model_full_create(void); /* create structures for full routing model */ @@ -61,6 +63,7 @@ static void model_none_unload(void); /* none routing model */ static void model_none_end(void); /* none routing model */ static void routing_parse_Scluster(void); /*cluster bypass */ +static void routing_parse_Speer(void); /*peer bypass */ static void routing_parse_Sconfig(void); /*config Tag */ static void routing_parse_Econfig(void); /*config Tag */ @@ -102,6 +105,8 @@ struct s_model_type routing_models[] = { {"Full", #ifdef HAVE_PCRE_LIB {"RuleBased", "Rule-Based routing data (...)", model_rulebased_create, model_rulebased_load, model_rulebased_unload, model_rulebased_end}, +{"Vivaldi", "Vivaldi routing", model_rulebased_create, + model_rulebased_load, model_rulebased_unload, model_rulebased_end}, #endif {NULL, NULL, NULL, NULL, NULL, NULL} }; @@ -113,10 +118,6 @@ static void generic_set_processing_unit(routing_component_t rc, const char *name); static void generic_set_autonomous_system(routing_component_t rc, const char *name); -static void generic_set_route(routing_component_t rc, const char *src, - const char *dst, name_route_t route); -static void generic_set_ASroute(routing_component_t rc, const char *src, - const char *dst, route_extended_t e_route); static void generic_set_bypassroute(routing_component_t rc, const char *src, const char *dst, route_extended_t e_route); @@ -127,6 +128,7 @@ static int surf_pointer_resource_cmp(const void *a, const void *b); /* ************************************************************************** */ /* *************** GENERIC BUSINESS METHODS (declarations) ****************** */ +static double generic_get_link_latency(routing_component_t rc, const char *src, const char *dst); static xbt_dynar_t generic_get_onelink_routes(routing_component_t rc); static route_extended_t generic_get_bypassroute(routing_component_t rc, const char *src, @@ -138,6 +140,9 @@ static route_extended_t generic_get_bypassroute(routing_component_t rc, static route_extended_t generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy, void *data, int order); +static route_t +generic_new_route(e_surf_routing_hierarchy_t hierarchy, + void *data, int order); static void generic_free_route(route_t route); static void generic_free_extended_route(route_extended_t e_route); static routing_component_t @@ -151,22 +156,65 @@ static void generic_src_dst_check(routing_component_t rc, const char *src, /* **************************** GLOBAL FUNCTIONS **************************** */ /* global parse functions */ -static char *src = NULL; /* temporary store the source name of a route */ -static char *dst = NULL; /* temporary store the destination name of a route */ +static const char *src = NULL; /* temporary store the source name of a route */ +static const char *dst = NULL; /* temporary store the destination name of a route */ static char *gw_src = NULL; /* temporary store the gateway source name of a route */ static char *gw_dst = NULL; /* temporary store the gateway destination name of a route */ static xbt_dynar_t link_list = NULL; /* temporary store of current list link of a route */ + +static xbt_dict_t coordinates = NULL; + + +static double eculidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t dst) +{ + double src_coord, dst_coord; + + src_coord = atof(xbt_dynar_get_as(src, index, char *)); + dst_coord = atof(xbt_dynar_get_as(dst, index, char *)); + + return (src_coord-dst_coord)*(src_coord-dst_coord); + +} + +static double vivaldi_get_link_latency (routing_component_t rc,const char *src, const char *dst) +{ + double euclidean_dist; + xbt_dynar_t src_ctn, dst_ctn; + src_ctn = xbt_dict_get(coordinates, src); + dst_ctn = xbt_dict_get(coordinates, dst); + + euclidean_dist = sqrt (eculidean_dist_comp(0,src_ctn,dst_ctn)+eculidean_dist_comp(1,src_ctn,dst_ctn)) + +fabs(atof(xbt_dynar_get_as(src_ctn, 2, char *)))+fabs(atof(xbt_dynar_get_as(dst_ctn, 2, char *))); + + xbt_assert2(euclidean_dist>=0, "Euclidean Dist is less than 0\"%s\" and \"%.2f\"", src, euclidean_dist); + + return euclidean_dist; + + /* + x = atof(xbt_dynar_get_as(src_ctn, 0, char *))-atof(xbt_dynar_get_as(dst_ctn, 0, char *)); + y = atof(xbt_dynar_get_as(src_ctn, 1, char *)); + h = atof(xbt_dynar_get_as(ctn, 2, char *)); + sqrt((c1->x - c2->x) * (c1->x - c2->x) + (c1->y - c2->y) * (c1->y - c2->y)) + fabs(c1->h) + fabs(c2->h); + + if (strcmp(coord,"")) { + xbt_dynar_t ctn = xbt_str_split_str(coord, " "); + xbt_dynar_shrink(ctn,0); + xbt_dict_set (coordinates,host_id,ctn,NULL); + } + */ +} + /** * \brief Add a "host" to the network element list */ -static void parse_S_host(char *host_id) +static void parse_S_host(const char *host_id, const char* coord) { network_element_info_t info = NULL; if (current_routing->hierarchy == SURF_ROUTING_NULL) current_routing->hierarchy = SURF_ROUTING_BASE; xbt_assert1(!xbt_dict_get_or_null (global_routing->where_network_elements, host_id), - "Reading a host, processing unit \"%s\" already exist", + "Reading a host, processing unit \"%s\" already exists", host_id); xbt_assert1(current_routing->set_processing_unit, "no defined method \"set_processing_unit\" in \"%s\"", @@ -176,7 +224,24 @@ static void parse_S_host(char *host_id) info->rc_component = current_routing; info->rc_type = SURF_NETWORK_ELEMENT_HOST; xbt_dict_set(global_routing->where_network_elements, host_id, - (void *) info, NULL); + (void *) info, xbt_free); + + if (strcmp(coord,"")) { + xbt_dynar_t ctn = xbt_str_split_str(coord, " "); + xbt_dynar_shrink(ctn,0); + xbt_dict_set (coordinates,host_id,ctn,NULL); + } +} + +static void parse_E_host(void) +{ + xbt_dict_cursor_t cursor = NULL; + char *key; + char *elem; + + xbt_dict_foreach(current_property_set, cursor, key, elem) { + DEBUG2("property : %s = %s",key,elem); + } } /* @@ -184,15 +249,19 @@ static void parse_S_host(char *host_id) */ static void parse_S_host_XML(void) { - parse_S_host(A_surfxml_host_id); + parse_S_host(A_surfxml_host_id, A_surfxml_host_coordinates); +} +static void parse_E_host_XML(void) +{ + parse_E_host(); } /* * \brief Add a host to the network element list from lua script */ -static void parse_S_host_lua(char *host_id) +static void parse_S_host_lua(const char *host_id, const char *coord) { - parse_S_host(host_id); + parse_S_host(host_id, coord); } @@ -208,7 +277,7 @@ static void parse_S_router(void) xbt_assert1(!xbt_dict_get_or_null (global_routing->where_network_elements, A_surfxml_router_id), - "Reading a router, processing unit \"%s\" already exist", + "Reading a router, processing unit \"%s\" already exists", A_surfxml_router_id); xbt_assert1(current_routing->set_processing_unit, "no defined method \"set_processing_unit\" in \"%s\"", @@ -219,16 +288,18 @@ static void parse_S_router(void) info->rc_component = current_routing; info->rc_type = SURF_NETWORK_ELEMENT_ROUTER; xbt_dict_set(global_routing->where_network_elements, A_surfxml_router_id, - (void *) info, NULL); -#ifdef HAVE_TRACING - TRACE_surf_host_declaration(A_surfxml_router_id, 0); -#endif + (void *) info, xbt_free); + if (strcmp(A_surfxml_router_coordinates,"")) { + xbt_dynar_t ctn = xbt_str_split_str(A_surfxml_router_coordinates, " "); + xbt_dynar_shrink(ctn,0); + xbt_dict_set (coordinates,A_surfxml_router_id,ctn,NULL); + } } /** * \brief Set the endponints for a route */ -static void parse_S_route_new_and_endpoints(char *src_id, char *dst_id) +static void parse_S_route_new_and_endpoints(const char *src_id, const char *dst_id) { if (src != NULL && dst != NULL && link_list != NULL) THROW2(arg_error, 0, "Route between %s to %s can not be defined", @@ -242,7 +313,7 @@ static void parse_S_route_new_and_endpoints(char *src_id, char *dst_id) } /** - * \breif Set the endpoints for a route from XML + * \brief Set the endpoints for a route from XML */ static void parse_S_route_new_and_endpoints_XML(void) { @@ -251,9 +322,9 @@ static void parse_S_route_new_and_endpoints_XML(void) } /** - * \breif Set the endpoints for a route from lua + * \brief Set the endpoints for a route from lua */ -static void parse_S_route_new_and_endpoints_lua(char *id_src, char *id_dst) +static void parse_S_route_new_and_endpoints_lua(const char *id_src, const char *id_dst) { parse_S_route_new_and_endpoints(id_src, id_dst); } @@ -300,7 +371,7 @@ static void parse_S_bypassRoute_new_and_endpoints(void) /** * \brief Set a new link on the actual list of link for a route or ASroute */ -static void parse_E_link_ctn_new_elem(char *link_id) +static void parse_E_link_ctn_new_elem(const char *link_id) { char *val; val = xbt_strdup(link_id); @@ -313,18 +384,24 @@ static void parse_E_link_ctn_new_elem(char *link_id) static void parse_E_link_ctn_new_elem_XML(void) { - if( A_surfxml_link_ctn_direction == A_surfxml_link_ctn_direction_NONE) - parse_E_link_ctn_new_elem(A_surfxml_link_ctn_id); - if( A_surfxml_link_ctn_direction == A_surfxml_link_ctn_direction_UP) - parse_E_link_ctn_new_elem(bprintf("%s_UP",A_surfxml_link_ctn_id)); - if( A_surfxml_link_ctn_direction == A_surfxml_link_ctn_direction_DOWN) - parse_E_link_ctn_new_elem(bprintf("%s_DOWN",A_surfxml_link_ctn_id)); + if (A_surfxml_link_ctn_direction == A_surfxml_link_ctn_direction_NONE) + parse_E_link_ctn_new_elem(A_surfxml_link_ctn_id); + if (A_surfxml_link_ctn_direction == A_surfxml_link_ctn_direction_UP) { + char *link_id = bprintf("%s_UP", A_surfxml_link_ctn_id); + parse_E_link_ctn_new_elem(link_id); + free(link_id); + } + if (A_surfxml_link_ctn_direction == A_surfxml_link_ctn_direction_DOWN) { + char *link_id = bprintf("%s_DOWN", A_surfxml_link_ctn_id); + parse_E_link_ctn_new_elem(link_id); + free(link_id); + } } /** * \brief Set a new link on the actual list of link for a route or ASroute from lua */ -static void parse_E_link_c_ctn_new_elem_lua(char *link_id) +static void parse_E_link_c_ctn_new_elem_lua(const char *link_id) { parse_E_link_ctn_new_elem(link_id); } @@ -420,6 +497,10 @@ static void parse_S_AS(char *AS_id, char *AS_routing) new_routing->name = xbt_strdup(AS_id); new_routing->routing_sons = xbt_dict_new(); + /* Hack for Vivaldi */ + if(!strcmp(model->name,"Vivaldi")) + new_routing->get_latency = vivaldi_get_link_latency; + if (current_routing == NULL && global_routing->root == NULL) { /* it is the first one */ @@ -430,7 +511,7 @@ static void parse_S_AS(char *AS_id, char *AS_routing) xbt_assert1(!xbt_dict_get_or_null (current_routing->routing_sons, AS_id), - "The AS \"%s\" already exist", AS_id); + "The AS \"%s\" already exists", AS_id); /* it is a part of the tree */ new_routing->routing_father = current_routing; /* set the father behavior */ @@ -459,6 +540,13 @@ static void parse_S_AS(char *AS_id, char *AS_routing) static void parse_S_AS_XML(void) { parse_S_AS(A_surfxml_AS_id, A_surfxml_AS_routing); + + if (strcmp(A_surfxml_AS_coordinates,"")) { + DEBUG2("%s coordinates : %s",A_surfxml_AS_id,A_surfxml_AS_coordinates); + xbt_dynar_t ctn = xbt_str_split_str(A_surfxml_AS_coordinates, " "); + xbt_dynar_shrink(ctn,0); + xbt_dict_set (coordinates,A_surfxml_AS_id,ctn,NULL); + } } /* @@ -476,7 +564,7 @@ static void parse_S_AS_lua(char *id, char *mode) * When you finish to read the routing component, other structures must be created. * the "end" method allow to do that for any routing model type */ -static void parse_E_AS(char *AS_id) +static void parse_E_AS(const char *AS_id) { if (current_routing == NULL) { @@ -485,13 +573,13 @@ static void parse_E_AS(char *AS_id) network_element_info_t info = NULL; xbt_assert1(!xbt_dict_get_or_null (global_routing->where_network_elements, - current_routing->name), "The AS \"%s\" already exist", + current_routing->name), "The AS \"%s\" already exists", current_routing->name); info = xbt_new0(s_network_element_info_t, 1); info->rc_component = current_routing->routing_father; info->rc_type = SURF_NETWORK_ELEMENT_AS; xbt_dict_set(global_routing->where_network_elements, - current_routing->name, info, NULL); + current_routing->name, info, xbt_free); (*(current_routing->routing->unload)) (); (*(current_routing->routing->end)) (); current_routing = current_routing->routing_father; @@ -511,13 +599,31 @@ static void parse_E_AS_XML(void) /* * \brief Finish the creation of a new routing component from lua */ -static void parse_E_AS_lua(char *id) +static void parse_E_AS_lua(const char *id) { parse_E_AS(id); } /* Aux Business methods */ +/** + * \brief Get the AS name of the element + * + * \param name the host name + * + */ +static char* elements_As_name(const char *name) +{ + routing_component_t as_comp; + + /* (1) find the as where the host is located */ + as_comp = ((network_element_info_t) + xbt_dict_get_or_null(global_routing->where_network_elements, + name))->rc_component; + return as_comp->name; +} + + /** * \brief Get the AS father and the first elements of the chain * @@ -570,8 +676,8 @@ static xbt_dynar_t elements_father(const char *src, const char *dst) } /* (3) find the common father */ - index_src = (path_src->used) - 1; - index_dst = (path_dst->used) - 1; + 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) { @@ -680,7 +786,7 @@ static route_extended_t _get_route(const char *src, const char *dst) "bad gateway for route between \"%s\" and \"%s\"", src, dst); - if (src != e_route_cnt->src_gateway) { + if (strcmp(src, e_route_cnt->src_gateway)) { e_route_src = _get_route(src, e_route_cnt->src_gateway); xbt_assert2(e_route_src, "no route between \"%s\" and \"%s\"", src, e_route_cnt->src_gateway); @@ -693,7 +799,7 @@ static route_extended_t _get_route(const char *src, const char *dst) xbt_dynar_push(e_route->generic_route.link_list, &link); } - if (e_route_cnt->dst_gateway != dst) { + if (strcmp(e_route_cnt->dst_gateway, dst)) { e_route_dst = _get_route(e_route_cnt->dst_gateway, dst); xbt_assert2(e_route_dst, "no route between \"%s\" and \"%s\"", e_route_cnt->dst_gateway, dst); @@ -715,6 +821,82 @@ static route_extended_t _get_route(const char *src, const char *dst) return e_route; } +static double _get_latency(const char *src, const char *dst) +{ + double latency, latency_src, latency_dst = 0.0; + + DEBUG2("Solve route \"%s\" to \"%s\"", src, dst); + xbt_assert0(src && dst, "bad parameters for \"_get_route\" method"); + + 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); + + if (src_father == dst_father) { /* SURF_ROUTING_BASE */ + + if (strcmp(src, dst)) { + latency = + (*(common_father->get_latency)) (common_father, src, dst); + xbt_assert2(latency>=0, "no route between \"%s\" and \"%s\"", src, + dst); + } else latency = 0; + } else { /* SURF_ROUTING_RECURSIVE */ + route_extended_t e_route_bypass = NULL; + if (common_father->get_bypass_route) + e_route_bypass = + (*(common_father->get_bypass_route)) (common_father, src, dst); + + xbt_assert0(!e_route_bypass,"Bypass cannot work yet with get_latency"); + + e_route_cnt = + (*(common_father->get_route)) (common_father, src_father->name, + dst_father->name); + + xbt_assert2(e_route_cnt, "no route between \"%s\" and \"%s\"", + src_father->name, dst_father->name); + + xbt_assert2((e_route_cnt->src_gateway == NULL) == + (e_route_cnt->dst_gateway == NULL), + "bad gateway for route between \"%s\" and \"%s\"", src, + dst); + latency = + (*(common_father->get_latency)) (common_father, elements_As_name(src), + elements_As_name(dst)); + + xbt_assert2(latency>=0, "no route between \"%s\" and \"%s\"", + src_father->name, dst_father->name); + + + if (src != e_route_cnt->src_gateway) { + + latency_src = _get_latency(src, e_route_cnt->src_gateway); + xbt_assert2(latency_src>=0, "no route between \"%s\" and \"%s\"", src, + e_route_cnt->src_gateway); + latency += latency_src; + } + + if (e_route_cnt->dst_gateway != dst) { + + latency_dst = _get_latency(e_route_cnt->dst_gateway, dst); + xbt_assert2(latency_dst>=0, "no route between \"%s\" and \"%s\"", + e_route_cnt->dst_gateway, dst); + latency += latency_dst; + } + + } + + xbt_dynar_free(&elem_father_list); + + return latency; +} + /** * \brief Generic method: find a route between hosts * @@ -729,14 +911,19 @@ static xbt_dynar_t get_route(const char *src, const char *dst) { route_extended_t e_route; - 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); + xbt_dynar_t elem_father_list = NULL; + routing_component_t common_father = NULL; if (strcmp(src, dst)) e_route = _get_route(src, dst); - else + else { + elem_father_list = elements_father(src, dst); + common_father = + xbt_dynar_get_as(elem_father_list, 0, routing_component_t); + e_route = (*(common_father->get_route)) (common_father, src, dst); + xbt_dynar_free(&elem_father_list); + } xbt_assert2(e_route, "no route between \"%s\" and \"%s\"", src, dst); @@ -750,11 +937,12 @@ static xbt_dynar_t get_route(const char *src, const char *dst) xbt_free(e_route->dst_gateway); xbt_free(e_route); - xbt_dynar_free(&elem_father_list); +/* if (xbt_dynar_length(global_routing->last_route) == 0) return NULL; else +*/ return global_routing->last_route; } @@ -775,6 +963,26 @@ static xbt_dynar_t get_route_no_cleanup(const char *src, const char *dst) return d; } +/*Get Latency*/ +static double get_latency(const char *src, const char *dst) +{ + + double latency = -1.0; + 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); + + if (strcmp(src, dst)) + latency = _get_latency(src, dst); + else + latency = (*(common_father->get_latency)) (common_father, src, dst); + + xbt_assert2(latency>=0.0, "no route between \"%s\" and \"%s\"", src, dst); + xbt_dynar_free(&elem_father_list); + + return latency; +} + /** * \brief Recursive function for finalize * @@ -814,6 +1022,7 @@ static void finalize(void) _finalize(global_routing->root); /* delete "where" dict */ xbt_dict_free(&(global_routing->where_network_elements)); + xbt_dict_free(&(coordinates)); /* delete last_route */ xbt_dynar_free(&(global_routing->last_route)); /* delete global routing structure */ @@ -866,14 +1075,14 @@ static e_surf_network_element_type_t get_network_element_type(const char * * Make a global routing structure and set all the parsing functions. */ -void routing_model_create(size_t size_of_links, void *loopback) +void routing_model_create(size_t size_of_links, void *loopback, double_f_cpvoid_t get_link_latency_fun) { - /* config the uniq global routing */ global_routing = xbt_new0(s_routing_global_t, 1); global_routing->where_network_elements = xbt_dict_new(); global_routing->root = NULL; global_routing->get_route = get_route; + global_routing->get_latency = get_latency; global_routing->get_route_no_cleanup = get_route_no_cleanup; global_routing->get_onelink_routes = get_onelink_routes; global_routing->get_network_element_type = get_network_element_type; @@ -881,12 +1090,15 @@ void routing_model_create(size_t size_of_links, void *loopback) global_routing->loopback = loopback; global_routing->size_of_link = size_of_links; global_routing->last_route = NULL; - + get_link_latency = get_link_latency_fun; /* no current routing at moment */ current_routing = NULL; + coordinates = xbt_dict_new(); + /* parse generic elements */ surfxml_add_callback(STag_surfxml_host_cb_list, &parse_S_host_XML); + surfxml_add_callback(ETag_surfxml_host_cb_list, &parse_E_host_XML); surfxml_add_callback(STag_surfxml_router_cb_list, &parse_S_router); surfxml_add_callback(STag_surfxml_route_cb_list, @@ -912,10 +1124,27 @@ void routing_model_create(size_t size_of_links, void *loopback) surfxml_add_callback(STag_surfxml_cluster_cb_list, &routing_parse_Scluster); - surfxml_add_callback(STag_surfxml_config_cb_list, - &routing_parse_Sconfig); - surfxml_add_callback(ETag_surfxml_config_cb_list, - &routing_parse_Econfig); + surfxml_add_callback(STag_surfxml_peer_cb_list, + &routing_parse_Speer); + +#ifdef HAVE_TRACING + instr_routing_define_callbacks(); +#endif +} + +void surf_parse_add_callback_config(void) +{ + surfxml_add_callback(STag_surfxml_config_cb_list, &routing_parse_Sconfig); + surfxml_add_callback(ETag_surfxml_config_cb_list, &routing_parse_Econfig); + surfxml_add_callback(STag_surfxml_prop_cb_list, &parse_properties); + surfxml_add_callback(STag_surfxml_AS_cb_list, &surf_parse_models_setup); +} + +void surf_parse_models_setup() +{ + surfxml_del_callback(STag_surfxml_AS_cb_list, surf_parse_models_setup); + surf_config_models_setup(platform_filename); + free(platform_filename); } /* ************************************************************************** */ @@ -1045,6 +1274,7 @@ static void *model_full_create(void) new_component->generic_routing.set_ASroute = model_full_set_route; new_component->generic_routing.set_bypassroute = generic_set_bypassroute; new_component->generic_routing.get_route = full_get_route; + new_component->generic_routing.get_latency = generic_get_link_latency; new_component->generic_routing.get_onelink_routes = full_get_onelink_routes; new_component->generic_routing.get_bypass_route = @@ -1052,6 +1282,7 @@ static void *model_full_create(void) new_component->generic_routing.finalize = full_finalize; 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; } @@ -1115,6 +1346,7 @@ static void model_full_set_route(routing_component_t rc, const char *src, if(!routing->routing_table) routing->routing_table = xbt_new0(route_extended_t, table_size * table_size); + if(TO_ROUTE_FULL(*src_id, *dst_id)) { char * link_name; @@ -1130,8 +1362,8 @@ static void model_full_set_route(routing_component_t rc, const char *src, (void*)TO_ROUTE_FULL(*src_id, *dst_id)->generic_route.link_list, (void*)link_route_to_test, (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp), - "The route between \"%s\" and \"%s\" already exist", src,dst); - xbt_free(link_route_to_test); + "The route between \"%s\" and \"%s\" already exists. If you are trying to define a reverse route, you must set the symmetrical=no attribute to your routes tags.", src,dst); + xbt_dynar_free(&link_route_to_test); } else { @@ -1144,15 +1376,15 @@ static void model_full_set_route(routing_component_t rc, const char *src, xbt_dynar_shrink(TO_ROUTE_FULL(*src_id, *dst_id)->generic_route.link_list, 0); } - if( A_surfxml_route_symetrical == A_surfxml_route_symetrical_YES - || A_surfxml_ASroute_symetrical == A_surfxml_ASroute_symetrical_YES ) + if( A_surfxml_route_symmetrical == A_surfxml_route_symmetrical_YES + || A_surfxml_ASroute_symmetrical == A_surfxml_ASroute_symmetrical_YES ) { if(route->dst_gateway && route->src_gateway) { - char * gw_src = bprintf("%s",route->src_gateway); - char * gw_dst = bprintf("%s",route->dst_gateway); - route->src_gateway = bprintf("%s",gw_dst); - route->dst_gateway = bprintf("%s",gw_src); + char *gw_src = xbt_strdup(route->src_gateway); + char *gw_dst = xbt_strdup(route->dst_gateway); + route->src_gateway = gw_dst; + route->dst_gateway = gw_src; } if(TO_ROUTE_FULL(*dst_id, *src_id)) { @@ -1170,8 +1402,8 @@ static void model_full_set_route(routing_component_t rc, const char *src, (void*)TO_ROUTE_FULL(*dst_id, *src_id)->generic_route.link_list, (void*)link_route_to_test, (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp), - "The route between \"%s\" and \"%s\" already exist", src,dst); - xbt_free(link_route_to_test); + "The route between \"%s\" and \"%s\" already exists", src,dst); + xbt_dynar_free(&link_route_to_test); } else { @@ -1190,7 +1422,7 @@ static void model_full_set_route(routing_component_t rc, const char *src, /* ************************************************************************** */ /* *************************** FLOYD ROUTING ******************************** */ -#define TO_FLOYD_COST(i,j) cost_table[(i)+(j)*table_size] +#define TO_FLOYD_COST(i,j) (routing->cost_table)[(i)+(j)*table_size] #define TO_FLOYD_PRED(i,j) (routing->predecessor_table)[(i)+(j)*table_size] #define TO_FLOYD_LINK(i,j) (routing->link_table)[(i)+(j)*table_size] @@ -1200,6 +1432,7 @@ typedef struct { s_routing_component_t generic_routing; /* vars for calculate the floyd algorith. */ int *predecessor_table; + double *cost_table; route_extended_t *link_table; /* char* -> int* */ } s_routing_component_floyd_t, *routing_component_floyd_t; @@ -1361,9 +1594,10 @@ static void *model_floyd_create(void) new_component->generic_routing.set_autonomous_system = generic_set_autonomous_system; new_component->generic_routing.set_route = model_floyd_set_route; - new_component->generic_routing.set_ASroute = NULL ; //TODO + new_component->generic_routing.set_ASroute = model_floyd_set_route; new_component->generic_routing.set_bypassroute = generic_set_bypassroute; new_component->generic_routing.get_route = floyd_get_route; + new_component->generic_routing.get_latency = generic_get_link_latency; new_component->generic_routing.get_onelink_routes = floyd_get_onelink_routes; new_component->generic_routing.get_bypass_route = @@ -1371,7 +1605,7 @@ static void *model_floyd_create(void) new_component->generic_routing.finalize = floyd_finalize; new_component->generic_routing.to_index = xbt_dict_new(); new_component->generic_routing.bypassRoutes = xbt_dict_new(); - new_component->generic_routing.parse_routes = xbt_dict_new(); + new_component->generic_routing.get_network_element_type = get_network_element_type; return new_component; } @@ -1388,96 +1622,184 @@ static void model_floyd_unload(void) static void model_floyd_end(void) { - routing_component_floyd_t routing = - ((routing_component_floyd_t) current_routing); - xbt_dict_cursor_t cursor = NULL; - double *cost_table; - char *key, *data, *end; - const char *sep = "#"; - xbt_dynar_t keys; - int src_id, dst_id; - unsigned int i, j, a, b, c; + routing_component_floyd_t routing = + ((routing_component_floyd_t) current_routing); - /* set the size of inicial table */ - size_t table_size = xbt_dict_length(routing->generic_routing.to_index); + unsigned int i, j, a, b, c; - /* Create Cost, Predecessor and Link tables */ - cost_table = xbt_new0(double, table_size * table_size); /* link cost from host to host */ - routing->predecessor_table = xbt_new0(int, table_size * table_size); /* predecessor host numbers */ - routing->link_table = xbt_new0(route_extended_t, table_size * table_size); /* actual link between src and dst */ - - /* Initialize costs and predecessors */ - for (i = 0; i < table_size; i++) - for (j = 0; j < table_size; j++) { - TO_FLOYD_COST(i, j) = DBL_MAX; - TO_FLOYD_PRED(i, j) = -1; - TO_FLOYD_LINK(i, j) = NULL; /* fixed, missing in the previous version */ - } + /* set the size of table routing */ + size_t table_size = xbt_dict_length(routing->generic_routing.to_index); - /* Put the routes in position */ - xbt_dict_foreach(routing->generic_routing.parse_routes, cursor, key, data) { - keys = xbt_str_split_str(key, sep); - src_id = strtol(xbt_dynar_get_as(keys, 0, char *), &end, 10); - dst_id = strtol(xbt_dynar_get_as(keys, 1, char *), &end, 10); - TO_FLOYD_LINK(src_id, dst_id) = - generic_new_extended_route(current_routing->hierarchy, data, 0); - TO_FLOYD_PRED(src_id, dst_id) = src_id; - /* set link cost */ - TO_FLOYD_COST(src_id, dst_id) = ((TO_FLOYD_LINK(src_id, dst_id))->generic_route.link_list)->used; /* count of links, old model assume 1 */ - xbt_dynar_free(&keys); - } + if(!routing->link_table) + { + /* Create Cost, Predecessor and Link tables */ + routing->cost_table = xbt_new0(double, table_size * table_size); /* link cost from host to host */ + routing->predecessor_table = xbt_new0(int, table_size * table_size); /* predecessor host numbers */ + routing->link_table = xbt_new0(route_extended_t, table_size * table_size); /* actual link between src and dst */ + + /* Initialize costs and predecessors */ + for (i = 0; i < table_size; i++) + for (j = 0; j < table_size; j++) { + TO_FLOYD_COST(i, j) = DBL_MAX; + TO_FLOYD_PRED(i, j) = -1; + TO_FLOYD_LINK(i, j) = NULL; /* fixed, missing in the previous version */ + } + } - /* Add the loopback if needed */ - if (current_routing->hierarchy == SURF_ROUTING_BASE) { - for (i = 0; i < table_size; i++) { - route_extended_t e_route = TO_FLOYD_LINK(i, i); - if (!e_route) { - 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); - xbt_dynar_push(e_route->generic_route.link_list, - &global_routing->loopback); - TO_FLOYD_LINK(i, i) = e_route; - TO_FLOYD_PRED(i, i) = i; - TO_FLOYD_COST(i, i) = 1; - } - } - } - /* Calculate path costs */ - for (c = 0; c < table_size; c++) { - for (a = 0; a < table_size; a++) { - for (b = 0; b < table_size; b++) { - if (TO_FLOYD_COST(a, c) < DBL_MAX && TO_FLOYD_COST(c, b) < DBL_MAX) { - if (TO_FLOYD_COST(a, b) == DBL_MAX || - (TO_FLOYD_COST(a, c) + TO_FLOYD_COST(c, b) < - TO_FLOYD_COST(a, b))) { - TO_FLOYD_COST(a, b) = - TO_FLOYD_COST(a, c) + TO_FLOYD_COST(c, b); - TO_FLOYD_PRED(a, b) = TO_FLOYD_PRED(c, b); - } - } - } - } - } + /* Add the loopback if needed */ + if (current_routing->hierarchy == SURF_ROUTING_BASE) { + for (i = 0; i < table_size; i++) { + route_extended_t e_route = TO_FLOYD_LINK(i, i); + if (!e_route) { + 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); + xbt_dynar_push(e_route->generic_route.link_list, + &global_routing->loopback); + TO_FLOYD_LINK(i, i) = e_route; + TO_FLOYD_PRED(i, i) = i; + TO_FLOYD_COST(i, i) = 1; + } + } + } + /* Calculate path costs */ + for (c = 0; c < table_size; c++) { + for (a = 0; a < table_size; a++) { + for (b = 0; b < table_size; b++) { + if (TO_FLOYD_COST(a, c) < DBL_MAX && TO_FLOYD_COST(c, b) < DBL_MAX) { + if (TO_FLOYD_COST(a, b) == DBL_MAX || + (TO_FLOYD_COST(a, c) + TO_FLOYD_COST(c, b) < + TO_FLOYD_COST(a, b))) { + TO_FLOYD_COST(a, b) = + TO_FLOYD_COST(a, c) + TO_FLOYD_COST(c, b); + TO_FLOYD_PRED(a, b) = TO_FLOYD_PRED(c, b); + } + } + } + } + } +} - /* delete the parse table */ - xbt_dict_foreach(routing->generic_routing.parse_routes, cursor, key, data) { - route_t route = (route_t) data; - xbt_dynar_free(&(route->link_list)); - xbt_free(data); - } +static void model_floyd_set_route(routing_component_t rc, const char *src, + const char *dst, name_route_extended_t route) +{ + routing_component_floyd_t routing = (routing_component_floyd_t) rc; - /* delete parse dict */ - xbt_dict_free(&(routing->generic_routing.parse_routes)); + /* set the size of table routing */ + size_t table_size = xbt_dict_length(rc->to_index); + int *src_id, *dst_id; + int i,j; - /* cleanup */ - xbt_free(cost_table); -} + src_id = xbt_dict_get_or_null(rc->to_index, src); + dst_id = xbt_dict_get_or_null(rc->to_index, dst); -static void model_floyd_set_route(routing_component_t rc, const char *src, - const char *dst, name_route_extended_t route){} + if(!routing->link_table) + { + /* Create Cost, Predecessor and Link tables */ + routing->cost_table = xbt_new0(double, table_size * table_size); /* link cost from host to host */ + routing->predecessor_table = xbt_new0(int, table_size * table_size); /* predecessor host numbers */ + routing->link_table = xbt_new0(route_extended_t, table_size * table_size); /* actual link between src and dst */ + + /* Initialize costs and predecessors */ + for (i = 0; i < table_size; i++) + for (j = 0; j < table_size; j++) { + TO_FLOYD_COST(i, j) = DBL_MAX; + TO_FLOYD_PRED(i, j) = -1; + TO_FLOYD_LINK(i, j) = NULL; /* fixed, missing in the previous version */ + } + } + + if(TO_FLOYD_LINK(*src_id, *dst_id)) + { + if(!route->dst_gateway && !route->src_gateway) + DEBUG2("See Route from \"%s\" to \"%s\"", src, dst); + else + DEBUG4("See ASroute from \"%s(%s)\" to \"%s(%s)\"", src, + route->src_gateway, dst, route->dst_gateway); + char * link_name; + unsigned int cpt; + xbt_dynar_t link_route_to_test = xbt_dynar_new(global_routing->size_of_link, NULL); + xbt_dynar_foreach(route->generic_route.link_list,cpt,link_name) + { + void *link = xbt_dict_get_or_null(surf_network_model->resource_set, link_name); + xbt_assert1(link,"Link : '%s' doesn't exists.",link_name); + xbt_dynar_push(link_route_to_test,&link); + } + xbt_assert2(!xbt_dynar_compare( + (void*)TO_FLOYD_LINK(*src_id, *dst_id)->generic_route.link_list, + (void*)link_route_to_test, + (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp), + "The route between \"%s\" and \"%s\" already exists", src,dst); + xbt_free(link_route_to_test); + } + else + { + if(!route->dst_gateway && !route->src_gateway) + DEBUG2("Load Route from \"%s\" to \"%s\"", src, dst); + else + DEBUG4("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src, + route->src_gateway, dst, route->dst_gateway); + + TO_FLOYD_LINK(*src_id, *dst_id) = + generic_new_extended_route(rc->hierarchy, route, 1); + TO_FLOYD_PRED(*src_id, *dst_id) = *src_id; + TO_FLOYD_COST(*src_id, *dst_id) = + ((TO_FLOYD_LINK(*src_id, *dst_id))->generic_route.link_list)->used; /* count of links, old model assume 1 */ + } + + if( A_surfxml_route_symmetrical == A_surfxml_route_symmetrical_YES + || A_surfxml_ASroute_symmetrical == A_surfxml_ASroute_symmetrical_YES ) + { + if(TO_FLOYD_LINK(*dst_id, *src_id)) + { + if(!route->dst_gateway && !route->src_gateway) + DEBUG2("See Route from \"%s\" to \"%s\"", dst, src); + else + DEBUG4("See ASroute from \"%s(%s)\" to \"%s(%s)\"", dst, + route->src_gateway, src, route->dst_gateway); + char * link_name; + unsigned int i; + xbt_dynar_t link_route_to_test = xbt_dynar_new(global_routing->size_of_link, NULL); + for(i=xbt_dynar_length(route->generic_route.link_list) ;i>0 ;i--) + { + link_name = xbt_dynar_get_as(route->generic_route.link_list,i-1,void *); + void *link = xbt_dict_get_or_null(surf_network_model->resource_set, link_name); + xbt_assert1(link,"Link : '%s' doesn't exists.",link_name); + xbt_dynar_push(link_route_to_test,&link); + } + xbt_assert2(!xbt_dynar_compare( + (void*)TO_FLOYD_LINK(*dst_id, *src_id)->generic_route.link_list, + (void*)link_route_to_test, + (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp), + "The route between \"%s\" and \"%s\" already exists", src,dst); + xbt_free(link_route_to_test); + } + else + { + if(route->dst_gateway && route->src_gateway) + { + char *gw_src = xbt_strdup(route->src_gateway); + char *gw_dst = xbt_strdup(route->dst_gateway); + route->src_gateway = gw_dst; + route->dst_gateway = gw_src; + } + + if(!route->dst_gateway && !route->src_gateway) + DEBUG2("Load Route from \"%s\" to \"%s\"", dst, src); + else + DEBUG4("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", dst, + route->src_gateway, src, route->dst_gateway); + + TO_FLOYD_LINK(*dst_id, *src_id) = + generic_new_extended_route(rc->hierarchy, route, 0); + TO_FLOYD_PRED(*dst_id, *src_id) = *dst_id; + TO_FLOYD_COST(*dst_id, *src_id) = + ((TO_FLOYD_LINK(*dst_id, *src_id))->generic_route.link_list)->used; /* count of links, old model assume 1 */ + } + } +} /* ************************************************************************** */ /* ********** Dijkstra & Dijkstra Cached ROUTING **************************** */ @@ -1577,9 +1899,10 @@ static void route_new_dijkstra(routing_component_dijkstra_t rc, int src_id, int dst_id, route_extended_t e_route) { routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; - + DEBUG2("Load Route from \"%d\" to \"%d\"", src_id, dst_id); xbt_node_t src = NULL; xbt_node_t dst = NULL; + graph_node_map_element_t src_elm = (graph_node_map_element_t) xbt_dict_get_or_null_ext(routing->graph_node_map, (char *) (&src_id), @@ -1589,6 +1912,7 @@ static void route_new_dijkstra(routing_component_dijkstra_t rc, int src_id, (char *) (&dst_id), sizeof(int)); + if (src_elm) src = src_elm->node; @@ -1892,9 +2216,10 @@ static void *model_dijkstra_both_create(int cached) 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 = NULL; //TODO + new_component->generic_routing.set_ASroute = model_dijkstra_both_set_route; //TODO new_component->generic_routing.set_bypassroute = generic_set_bypassroute; 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 = @@ -1903,7 +2228,7 @@ static void *model_dijkstra_both_create(int cached) 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.parse_routes = xbt_dict_new(); + new_component->generic_routing.get_network_element_type = get_network_element_type; return new_component; } @@ -1931,43 +2256,19 @@ static void model_dijkstra_both_end(void) { routing_component_dijkstra_t routing = (routing_component_dijkstra_t) current_routing; - xbt_dict_cursor_t cursor = NULL; - char *key, *data, *end; - const char *sep = "#"; - xbt_dynar_t keys; + xbt_node_t node = NULL; unsigned int cursor2; xbt_dynar_t nodes = NULL; - int src_id, dst_id; - route_t route; /* Create the topology graph */ + if(!routing->route_graph) routing->route_graph = xbt_graph_new_graph(1, NULL); + if(!routing->graph_node_map) routing->graph_node_map = xbt_dict_new(); - if (routing->cached) - routing->route_cache = xbt_dict_new(); - - /* Put the routes in position */ - xbt_dict_foreach(routing->generic_routing.parse_routes, cursor, key, data) { - keys = xbt_str_split_str(key, sep); - src_id = strtol(xbt_dynar_get_as(keys, 0, char *), &end, 10); - dst_id = strtol(xbt_dynar_get_as(keys, 1, char *), &end, 10); - route_extended_t e_route = - generic_new_extended_route(current_routing->hierarchy, data, 0); - route_new_dijkstra(routing, src_id, dst_id, e_route); - xbt_dynar_free(&keys); - } - - /* delete the parse table */ - xbt_dict_foreach(routing->generic_routing.parse_routes, cursor, key, data) { - route = (route_t) data; - xbt_dynar_free(&(route->link_list)); - xbt_free(data); - } - - /* delete parse dict */ - xbt_dict_free(&(routing->generic_routing.parse_routes)); + if (routing->cached && !routing->route_cache) + routing->route_cache = xbt_dict_new(); /* Add the loopback if needed */ if (current_routing->hierarchy == SURF_ROUTING_BASE) @@ -1983,7 +2284,36 @@ static void model_dijkstra_both_end(void) } static void model_dijkstra_both_set_route (routing_component_t rc, const char *src, - const char *dst, name_route_extended_t route){}; + const char *dst, name_route_extended_t route) +{ + routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc; + int *src_id, *dst_id; + src_id = xbt_dict_get_or_null(rc->to_index, src); + dst_id = xbt_dict_get_or_null(rc->to_index, dst); + + /* Create the topology graph */ + if(!routing->route_graph) + routing->route_graph = xbt_graph_new_graph(1, NULL); + if(!routing->graph_node_map) + routing->graph_node_map = xbt_dict_new(); + + if (routing->cached && !routing->route_cache) + routing->route_cache = xbt_dict_new(); + + if( A_surfxml_route_symmetrical == A_surfxml_route_symmetrical_YES + || A_surfxml_ASroute_symmetrical == A_surfxml_ASroute_symmetrical_YES ) + xbt_die("Route symmetrical not supported on model dijkstra"); + + if(!route->dst_gateway && !route->src_gateway) + DEBUG2("Load Route from \"%s\" to \"%s\"", src, dst); + else + DEBUG4("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src, + route->src_gateway, dst, route->dst_gateway); + + route_extended_t e_route = + generic_new_extended_route(current_routing->hierarchy, route, 1); + route_new_dijkstra(routing, *src_id, *dst_id, e_route); +} #ifdef HAVE_PCRE_LIB /* ************************************************** */ @@ -2022,9 +2352,9 @@ static void rule_route_free(void *e) xbt_dynar_free(&(*elem)->re_str_link); pcre_free((*elem)->re_src); pcre_free((*elem)->re_dst); - xbt_free((*elem)); + xbt_free(*elem); } - (*elem) = NULL; + *elem = NULL; } static void rule_route_extended_free(void *e) @@ -2036,7 +2366,7 @@ static void rule_route_extended_free(void *e) pcre_free((*elem)->generic_rule_route.re_dst); xbt_free((*elem)->re_src_gateway); xbt_free((*elem)->re_dst_gateway); - xbt_free((*elem)); + xbt_free(*elem); } } @@ -2105,8 +2435,8 @@ static void model_rulebased_set_ASroute(routing_component_t rc, ruleroute_e->re_src_gateway = route->src_gateway; ruleroute_e->re_dst_gateway = route->dst_gateway; xbt_dynar_push(routing->list_ASroute, &ruleroute_e); - xbt_free(route->src_gateway); - xbt_free(route->dst_gateway); +// xbt_free(route->src_gateway); +// xbt_free(route->dst_gateway); xbt_free(route); } @@ -2383,8 +2713,10 @@ static void *model_rulebased_create(void) new_component->generic_routing.set_bypassroute = model_rulebased_set_bypassroute; new_component->generic_routing.get_onelink_routes = rulebased_get_onelink_routes; new_component->generic_routing.get_route = rulebased_get_route; - new_component->generic_routing.get_bypass_route = generic_get_bypassroute; //rulebased_get_bypass_route; + new_component->generic_routing.get_latency = generic_get_link_latency; + new_component->generic_routing.get_bypass_route = rulebased_get_bypass_route; new_component->generic_routing.finalize = rulebased_finalize; + new_component->generic_routing.get_network_element_type = get_network_element_type; /* initialization of internal structures */ new_component->dict_processing_units = xbt_dict_new(); new_component->dict_autonomous_systems = xbt_dict_new(); @@ -2553,156 +2885,14 @@ static void generic_set_autonomous_system(routing_component_t rc, xbt_dict_set(_to_index, name, id, xbt_free); } -static int surf_pointer_resource_cmp(const void *a, const void *b) { - if(a == b) - return 0; - return 1; -} - -static int surf_link_resource_cmp(const void *a, const void *b) { - if( memcmp(a,b,global_routing->size_of_link) == 0 ); - return 0; - return 1; -} - -static void generic_set_route(routing_component_t rc, const char *src, - const char *dst, name_route_t route) +static int surf_pointer_resource_cmp(const void *a, const void *b) { - DEBUG2("Load Route from \"%s\" to \"%s\"", src, dst); - xbt_dict_t _parse_routes; - xbt_dict_t _to_index; - char *route_name; - int *src_id, *dst_id,i; - unsigned long nb_links = xbt_dynar_length(route->link_name_list); - - _to_index = current_routing->to_index; - _parse_routes = current_routing->parse_routes; - - src_id = xbt_dict_get_or_null(_to_index, src); - dst_id = xbt_dict_get_or_null(_to_index, dst); - route_name = bprintf("%d#%d", *src_id, *dst_id); - - route_t route_to_test; - route_t route_sym = xbt_new0(s_route_t, 1); - - xbt_assert2(src_id - && dst_id, "Network elements %s or %s not found", src, dst); - - xbt_assert2(xbt_dynar_length(route->link_name_list) > 0, - "Invalid count of links, must be greater than zero (%s,%s)", - src, dst); - - route_to_test = xbt_dict_get_or_null(_parse_routes, route_name); - - if(route_to_test) - xbt_assert2(!xbt_dynar_compare( - (void*)route->link_name_list, - (void*)route_to_test->link_list, - (int_f_cpvoid_cpvoid_t) surf_link_resource_cmp), - "The route between \"%s\" and \"%s\" already exist", src,dst); - else - { - xbt_dict_set(_parse_routes, bprintf("%d#%d", *src_id, *dst_id), route, NULL); - } - - if(A_surfxml_route_symetrical == A_surfxml_route_symetrical_YES) - { - route_sym->link_list = xbt_dynar_new(sizeof(char *),NULL); - - for(i=nb_links ; i>0 ; i--) - { - char *link_name = xbt_new0(char,strlen(xbt_dynar_get_as(route->link_name_list, i-1, char *))); - link_name = xbt_strdup(xbt_dynar_get_as(route->link_name_list, i-1, char *)); - xbt_dynar_push_as(route_sym->link_list ,char *, link_name); - } - DEBUG2("Load Route from \"%s\" to \"%s\"", dst, src); - - route_to_test = xbt_dict_get_or_null(_parse_routes, bprintf("%d#%d",*dst_id, *src_id)); - - if(route_to_test) - xbt_assert2(!xbt_dynar_compare( - (void*)route_sym->link_list, - (void*)route_to_test->link_list, - (int_f_cpvoid_cpvoid_t) strcmp), - "The route between \"%s\" and \"%s\" already exist", dst,src); - else - { - xbt_dict_set(_parse_routes, bprintf("%d#%d",*dst_id, *src_id), route_sym, NULL); - } - } - - xbt_free(route_name); + return a != b; } -static void generic_set_ASroute(routing_component_t rc, const char *src, - const char *dst, route_extended_t e_route) +static int surf_link_resource_cmp(const void *a, const void *b) { - DEBUG4("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src, - e_route->src_gateway, dst, e_route->dst_gateway); - - xbt_dict_t _parse_routes; - xbt_dict_t _to_index; - char *route_name; - int *src_id, *dst_id; - _to_index = current_routing->to_index; - _parse_routes = current_routing->parse_routes; - - src_id = xbt_dict_get_or_null(_to_index, src); - dst_id = xbt_dict_get_or_null(_to_index, dst); - route_name = bprintf("%d#%d", *src_id, *dst_id); - route_t route_to_test; - - xbt_assert2(src_id - && dst_id, "Network elements %s or %s not found", src, dst); - - xbt_assert2(xbt_dynar_length(e_route->generic_route.link_list) > 0, - "Invalid count of links, must be greater than zero (%s,%s)", - src, dst); - - route_to_test = xbt_dict_get_or_null(_parse_routes, route_name); - - if(route_to_test) - xbt_assert4(!xbt_dynar_compare( - (void*) (&e_route->generic_route)->link_list, - (void*) route_to_test->link_list, - (int_f_cpvoid_cpvoid_t) strcmp), - "The route between \"%s\"(\"%s\") and \"%s\"(\"%s\") already exist", - src, e_route->src_gateway, dst, e_route->dst_gateway); - - route_name = bprintf("%d#%d", *src_id, *dst_id); - xbt_dict_set(_parse_routes, route_name, e_route, NULL); - xbt_free(route_name); - - unsigned long nb_links = xbt_dynar_length(e_route->generic_route.link_list); - - if(A_surfxml_ASroute_symetrical == A_surfxml_ASroute_symetrical_YES) - { - int i; - route_extended_t route_sym = xbt_new0(s_route_extended_t, 1); - route_sym->generic_route.link_list = xbt_dynar_new(sizeof(char *),NULL); - for(i=nb_links ; i>0 ; i--) - { - char *link_name = xbt_new0(char,strlen(xbt_dynar_get_as(e_route->generic_route.link_list, i-1, char *))); - link_name = bprintf("%s",xbt_dynar_get_as(e_route->generic_route.link_list, i-1, char *)); - xbt_dynar_push_as(route_sym->generic_route.link_list ,char *, link_name); - } - route_sym->src_gateway = xbt_new0( char,strlen(e_route->dst_gateway) ); - route_sym->src_gateway = bprintf("%s",e_route->dst_gateway); - route_sym->dst_gateway = xbt_new0( char,strlen(e_route->src_gateway) ); - route_sym->dst_gateway = bprintf("%s",e_route->src_gateway); - DEBUG4("Load ASroute from \"%s(%s)\" to \"%s(%s)\"",dst, route_sym->src_gateway,src,route_sym->dst_gateway); - - route_to_test = xbt_dict_get_or_null(_parse_routes, bprintf("%d#%d", *dst_id, *src_id)); - if(route_to_test) - xbt_assert4(!xbt_dynar_compare( - (void*) (&route_sym->generic_route)->link_list, - (void*) route_to_test->link_list, - (int_f_cpvoid_cpvoid_t) strcmp), - "The route between \"%s\"(\"%s\") and \"%s\"(\"%s\") already exist", - dst, route_sym->src_gateway, src, route_sym->dst_gateway); - xbt_dict_set(_parse_routes, bprintf("%d#%d", *dst_id, *src_id), route_sym, NULL); - - } + return !!memcmp(a,b,global_routing->size_of_link); } static void generic_set_bypassroute(routing_component_t rc, @@ -2718,7 +2908,7 @@ static void generic_set_bypassroute(routing_component_t rc, "Invalid count of links, must be greater than zero (%s,%s)", src, dst); xbt_assert4(!xbt_dict_get_or_null(dict_bypassRoutes, route_name), - "The bypass route between \"%s\"(\"%s\") and \"%s\"(\"%s\") already exist", + "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 = @@ -2734,6 +2924,21 @@ static void generic_set_bypassroute(routing_component_t rc, /* ************************************************************************** */ /* *********************** GENERIC BUSINESS METHODS ************************* */ +static double generic_get_link_latency(routing_component_t rc, + const char *src, const char *dst) +{ + route_extended_t route = rc->get_route(rc,src,dst); + void * link; + unsigned int i; + double latency = 0.0; + + xbt_dynar_foreach(route->generic_route.link_list,i,link) { + latency += get_link_latency(link); + } + generic_free_extended_route(route); + return latency; +} + static xbt_dynar_t generic_get_onelink_routes(routing_component_t rc) { xbt_die("\"generic_get_onelink_routes\" not implemented yet"); @@ -2779,8 +2984,8 @@ static route_extended_t generic_get_bypassroute(routing_component_t rc, } /* (3) find the common father */ - index_src = (path_src->used) - 1; - index_dst = (path_dst->used) - 1; + 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) { @@ -2793,8 +2998,8 @@ static route_extended_t generic_get_bypassroute(routing_component_t rc, current_dst = xbt_dynar_get_ptr(path_dst, index_dst); } - int max_index_src = (path_src->used) - 1; - int max_index_dst = (path_dst->used) - 1; + int max_index_src = path_src->used - 1; + int max_index_dst = path_dst->used - 1; int max_index = max(max_index_src, max_index_dst); int i, max; @@ -2875,6 +3080,44 @@ static route_extended_t generic_get_bypassroute(routing_component_t rc, /* ************************************************************************** */ /* ************************* GENERIC AUX FUNCTIONS ************************** */ +static route_t +generic_new_route(e_surf_routing_hierarchy_t hierarchy, + void *data, int order) +{ + + char *link_name; + route_t new_route; + unsigned int cpt; + xbt_dynar_t links = NULL, links_id = NULL; + + new_route = xbt_new0(s_route_t, 1); + new_route->link_list = + xbt_dynar_new(global_routing->size_of_link, NULL); + + xbt_assert0(hierarchy == SURF_ROUTING_BASE, + "the hierarchy type is not SURF_ROUTING_BASE"); + + links = ((route_t) data)->link_list; + + + links_id = new_route->link_list; + + xbt_dynar_foreach(links, cpt, link_name) { + + void *link = + xbt_dict_get_or_null(surf_network_model->resource_set, link_name); + if (link) { + if (order) + xbt_dynar_push(links_id, &link); + else + xbt_dynar_unshift(links_id, &link); + } else + THROW1(mismatch_error, 0, "Link %s not found", link_name); + } + + return new_route; +} + static route_extended_t generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy, void *data, int order) @@ -3037,20 +3280,23 @@ static void generic_src_dst_check(routing_component_t rc, const char *src, static void routing_parse_Sconfig(void) { - //TODO - DEBUG0("WARNING tag config not yet implemented."); - DEBUG1("Configuration name = %s",A_surfxml_config_id); + DEBUG1("START configuration name = %s",A_surfxml_config_id); } static void routing_parse_Econfig(void) { - //TODO xbt_dict_cursor_t cursor = NULL; char *key; char *elem; + char *cfg; xbt_dict_foreach(current_property_set, cursor, key, elem) { - DEBUG2("property : %s = %s",key,elem); + cfg = bprintf("%s:%s",key,elem); + if(xbt_cfg_is_default_value(_surf_cfg_set, key)) + xbt_cfg_set_parse(_surf_cfg_set, cfg); + else + INFO1("The custom configuration '%s' is already define by user!",key); } + DEBUG1("End configuration name = %s",A_surfxml_config_id); } static void routing_parse_Scluster(void) @@ -3062,12 +3308,27 @@ static void routing_parse_Scluster(void) char *cluster_suffix = A_surfxml_cluster_suffix; char *cluster_radical = A_surfxml_cluster_radical; char *cluster_power = A_surfxml_cluster_power; + char *cluster_core = A_surfxml_cluster_core; char *cluster_bw = A_surfxml_cluster_bw; char *cluster_lat = A_surfxml_cluster_lat; char *cluster_bb_bw = A_surfxml_cluster_bb_bw; char *cluster_bb_lat = A_surfxml_cluster_bb_lat; + char *cluster_availability_file = A_surfxml_cluster_availability_file; + char *cluster_state_file = A_surfxml_cluster_state_file; char *host_id, *groups, *link_id = NULL; - char *router_id, *link_router, *link_backbone, *route_src_dst; + char *router_id, *link_router, *link_backbone; + char *availability_file = bprintf("%s",cluster_availability_file); + char *state_file = bprintf("%s",cluster_state_file); + + xbt_dict_t patterns = xbt_dict_new(); + xbt_dict_set(patterns,"id",cluster_id,NULL); + xbt_dict_set(patterns,"prefix",cluster_prefix,NULL); + xbt_dict_set(patterns,"suffix",cluster_suffix,NULL); + + +#ifdef HAVE_PCRE_LIB + char *route_src_dst; +#endif unsigned int iter; int start, end, i; xbt_dynar_t radical_elements; @@ -3111,13 +3372,20 @@ static void routing_parse_Scluster(void) #endif link_id = bprintf("%s_link_%d", cluster_id, start); - DEBUG2("", host_id, cluster_power); + DEBUG2("", host_id, cluster_power); A_surfxml_host_state = A_surfxml_host_state_ON; SURFXML_BUFFER_SET(host_id, host_id); SURFXML_BUFFER_SET(host_power, cluster_power); + SURFXML_BUFFER_SET(host_core, cluster_core); SURFXML_BUFFER_SET(host_availability, "1.0"); - SURFXML_BUFFER_SET(host_availability_file, ""); - SURFXML_BUFFER_SET(host_state_file, ""); + xbt_dict_set(patterns,"radical",bprintf("%d",start),NULL); + availability_file = bprintf("%s",cluster_availability_file); + state_file = bprintf("%s",cluster_state_file); + DEBUG1("\tavailability_file=\"%s\"",xbt_str_varsubst(availability_file,patterns)); + DEBUG1("\tstate_file=\"%s\"",xbt_str_varsubst(state_file,patterns)); + SURFXML_BUFFER_SET(host_availability_file, xbt_str_varsubst(availability_file,patterns)); + SURFXML_BUFFER_SET(host_state_file, xbt_str_varsubst(state_file,patterns)); + DEBUG0(""); SURFXML_START_TAG(host); SURFXML_END_TAG(host); @@ -3137,6 +3405,8 @@ static void routing_parse_Scluster(void) SURFXML_START_TAG(link); SURFXML_END_TAG(link); + free(link_id); + free(host_id); break; case 2: @@ -3144,7 +3414,6 @@ static void routing_parse_Scluster(void) surf_parse_get_int(&start, xbt_dynar_get_as(radical_ends, 0, char *)); surf_parse_get_int(&end, xbt_dynar_get_as(radical_ends, 1, char *)); - DEBUG2("Create hosts and links from %d to %d", start, end); for (i = start; i <= end; i++) { host_id = bprintf("%s%d%s", cluster_prefix, i, cluster_suffix); #ifndef HAVE_PCRE_LIB @@ -3152,13 +3421,20 @@ static void routing_parse_Scluster(void) #endif link_id = bprintf("%s_link_%d", cluster_id, i); - DEBUG2("", host_id, cluster_power); + DEBUG2(""); SURFXML_START_TAG(host); SURFXML_END_TAG(host); @@ -3177,6 +3453,9 @@ static void routing_parse_Scluster(void) SURFXML_BUFFER_SET(link_state_file, ""); SURFXML_START_TAG(link); SURFXML_END_TAG(link); + + free(link_id); + free(host_id); } break; @@ -3186,6 +3465,7 @@ static void routing_parse_Scluster(void) xbt_dynar_free(&radical_ends); } + xbt_dynar_free(&radical_elements); DEBUG0(" "); router_id = @@ -3215,7 +3495,7 @@ static void routing_parse_Scluster(void) SURFXML_START_TAG(link); SURFXML_END_TAG(link); - DEBUG3("", link_backbone,cluster_bw, cluster_lat); + DEBUG3("", link_backbone,cluster_bb_bw, cluster_bb_lat); A_surfxml_link_state = A_surfxml_link_state_ON; A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED; if(cluster_bb_sharing_policy == A_surfxml_cluster_bb_sharing_policy_FATPIPE) @@ -3229,43 +3509,50 @@ static void routing_parse_Scluster(void) SURFXML_START_TAG(link); SURFXML_END_TAG(link); - char *new_suffix = bprintf("%s", ""); + DEBUG0(" "); + +#ifdef HAVE_PCRE_LIB + char *new_suffix = xbt_strdup(""); radical_elements = xbt_str_split(cluster_suffix, "."); xbt_dynar_foreach(radical_elements, iter, groups) { if (strcmp(groups, "")) { - new_suffix = bprintf("%s\\.%s", new_suffix, groups); + char *old_suffix = new_suffix; + new_suffix = bprintf("%s\\.%s", old_suffix, groups); + free(old_suffix); } } route_src_dst = bprintf("%s(.*)%s", cluster_prefix, new_suffix); + xbt_dynar_free(&radical_elements); + free(new_suffix); - DEBUG0(" "); - -#ifdef HAVE_PCRE_LIB + char *pcre_link_src = bprintf("%s_link_$1src", cluster_id); + char *pcre_link_backbone = bprintf("%s_backbone", cluster_id); + char *pcre_link_dst = bprintf("%s_link_$1dst", cluster_id); DEBUG2(""); + DEBUG0("symmetrical=\"NO\">"); SURFXML_BUFFER_SET(route_src, route_src_dst); SURFXML_BUFFER_SET(route_dst, route_src_dst); - A_surfxml_route_symetrical = A_surfxml_route_symetrical_NO; + A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; SURFXML_START_TAG(route); - DEBUG1("", cluster_id); - SURFXML_BUFFER_SET(link_ctn_id, bprintf("%s_link_$1src", cluster_id)); + DEBUG1("", pcre_link_src); + SURFXML_BUFFER_SET(link_ctn_id, pcre_link_src); A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX) {A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_UP;} SURFXML_START_TAG(link_ctn); SURFXML_END_TAG(link_ctn); - DEBUG1("", cluster_id); - SURFXML_BUFFER_SET(link_ctn_id, bprintf("%s_backbone", cluster_id)); + DEBUG1("", pcre_link_backbone); + SURFXML_BUFFER_SET(link_ctn_id, pcre_link_backbone); A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; SURFXML_START_TAG(link_ctn); SURFXML_END_TAG(link_ctn); - DEBUG1("", cluster_id); - SURFXML_BUFFER_SET(link_ctn_id, bprintf("%s_link_$1dst", cluster_id)); + DEBUG1("", pcre_link_dst); + SURFXML_BUFFER_SET(link_ctn_id, pcre_link_dst); A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX) {A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_DOWN;} @@ -3274,6 +3561,11 @@ static void routing_parse_Scluster(void) DEBUG0(""); SURFXML_END_TAG(route); + + free(pcre_link_dst); + free(pcre_link_backbone); + free(pcre_link_src); + free(route_src_dst); #else for (i = 0; i <= xbt_dynar_length(tab_elements_num); i++) { for (j = 0; j <= xbt_dynar_length(tab_elements_num); j++) { @@ -3296,10 +3588,10 @@ static void routing_parse_Scluster(void) } DEBUG2(""); + DEBUG0("symmetrical=\"NO\">"); SURFXML_BUFFER_SET(route_src, route_src); SURFXML_BUFFER_SET(route_dst, route_dst); - A_surfxml_route_symetrical = A_surfxml_route_symetrical_NO; + A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; SURFXML_START_TAG(route); if (i == xbt_dynar_length(tab_elements_num)) { @@ -3345,15 +3637,172 @@ static void routing_parse_Scluster(void) } } xbt_dynar_free(&tab_elements_num); + free(router_id); + +#endif + + free(link_backbone); + free(link_router); + xbt_dict_free(&patterns); + free(availability_file); + free(state_file); + + DEBUG0(""); + SURFXML_END_TAG(AS); + DEBUG0(" "); + + surfxml_bufferstack_pop(1); +} + +static void routing_parse_Speer(void) +{ + static int AX_ptr = 0; + + char *peer_id = A_surfxml_peer_id; + char *peer_power = A_surfxml_peer_power; + char *peer_bw_in = A_surfxml_peer_bw_in; + char *peer_bw_out = A_surfxml_peer_bw_out; + char *peer_lat = A_surfxml_peer_lat; + char *peer_coord = A_surfxml_peer_coordinates; + char *peer_state_file = A_surfxml_peer_state_file; + char *peer_availability_file = A_surfxml_peer_availability_file; + + char *host_id = NULL; + char *router_id, *link_router, *link_backbone, *link_id_up, *link_id_down; + +#ifdef HAVE_PCRE_LIB + +#endif + + int peer_sharing_policy = AX_surfxml_peer_sharing_policy; + +#ifndef HAVE_PCRE_LIB + //xbt_dynar_t tab_elements_num = xbt_dynar_new(sizeof(int), NULL); + //char *route_src, *route_dst; + //int j; +#endif + + static unsigned int surfxml_buffer_stack_stack_ptr = 1; + static unsigned int surfxml_buffer_stack_stack[1024]; + + surfxml_buffer_stack_stack[0] = 0; + + surfxml_bufferstack_push(1); + + SURFXML_BUFFER_SET(AS_id, peer_id); + SURFXML_BUFFER_SET(AS_coordinates, peer_coord); +#ifdef HAVE_PCRE_LIB + SURFXML_BUFFER_SET(AS_routing, "RuleBased"); + DEBUG1("", peer_id); +#else + SURFXML_BUFFER_SET(AS_routing, "Full"); + DEBUG1("", peer_id); #endif + SURFXML_START_TAG(AS); + + DEBUG0(" "); + host_id = bprintf("peer_%s", peer_id); + router_id = bprintf("router_%s", peer_id); + link_id_up = bprintf("link_%s_up", peer_id); + link_id_down = bprintf("link_%s_down", peer_id); + + link_router = bprintf("%s_link_router", peer_id); + link_backbone = bprintf("%s_backbone", peer_id); + + DEBUG2("", host_id, peer_power); + A_surfxml_host_state = A_surfxml_host_state_ON; + SURFXML_BUFFER_SET(host_id, host_id); + SURFXML_BUFFER_SET(host_power, peer_power); + SURFXML_BUFFER_SET(host_availability, "1.0"); + SURFXML_BUFFER_SET(host_availability_file, peer_availability_file); + SURFXML_BUFFER_SET(host_state_file, peer_state_file); + SURFXML_START_TAG(host); + SURFXML_END_TAG(host); + + DEBUG2("", router_id, peer_coord); + SURFXML_BUFFER_SET(router_id, router_id); + SURFXML_BUFFER_SET(router_coordinates, peer_coord); + SURFXML_START_TAG(router); + SURFXML_END_TAG(router); + + DEBUG3("", link_id_up, peer_bw_in, peer_lat); + A_surfxml_link_state = A_surfxml_link_state_ON; + A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED; + if(peer_sharing_policy == A_surfxml_peer_sharing_policy_FULLDUPLEX) +{A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FULLDUPLEX;} + SURFXML_BUFFER_SET(link_id, link_id_up); + SURFXML_BUFFER_SET(link_bandwidth, peer_bw_in); + SURFXML_BUFFER_SET(link_latency, peer_lat); + SURFXML_BUFFER_SET(link_bandwidth_file, ""); + SURFXML_BUFFER_SET(link_latency_file, ""); + SURFXML_BUFFER_SET(link_state_file, ""); + SURFXML_START_TAG(link); + SURFXML_END_TAG(link); + + DEBUG3("", link_id_down, peer_bw_out, peer_lat); + A_surfxml_link_state = A_surfxml_link_state_ON; + A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED; + if(peer_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX) +{A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FULLDUPLEX;} + SURFXML_BUFFER_SET(link_id, link_id_down); + SURFXML_BUFFER_SET(link_bandwidth, peer_bw_out); + SURFXML_BUFFER_SET(link_latency, peer_lat); + SURFXML_BUFFER_SET(link_bandwidth_file, ""); + SURFXML_BUFFER_SET(link_latency_file, ""); + SURFXML_BUFFER_SET(link_state_file, ""); + SURFXML_START_TAG(link); + SURFXML_END_TAG(link); + + DEBUG0(" "); + + // begin here + DEBUG2(""); + SURFXML_BUFFER_SET(route_src, peer_id); + SURFXML_BUFFER_SET(route_dst, router_id); + A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; + SURFXML_START_TAG(route); + + DEBUG1("", link_id_up); + SURFXML_BUFFER_SET(link_ctn_id, link_id_up); + A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; + if(peer_sharing_policy == A_surfxml_peer_sharing_policy_FULLDUPLEX) + {A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_UP;} + SURFXML_START_TAG(link_ctn); + SURFXML_END_TAG(link_ctn); + + DEBUG0(""); + SURFXML_END_TAG(route); + + //Opposite Route + DEBUG2(""); + SURFXML_BUFFER_SET(route_src, router_id); + SURFXML_BUFFER_SET(route_dst, peer_id); + A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; + SURFXML_START_TAG(route); + + DEBUG1("", link_id_down); + SURFXML_BUFFER_SET(link_ctn_id, link_id_down); + A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; + if(peer_sharing_policy == A_surfxml_peer_sharing_policy_FULLDUPLEX) + {A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_DOWN;} + SURFXML_START_TAG(link_ctn); + SURFXML_END_TAG(link_ctn); + + DEBUG0(""); + SURFXML_END_TAG(route); DEBUG0(""); SURFXML_END_TAG(AS); DEBUG0(" "); + //xbt_dynar_free(&tab_elements_num); + surfxml_bufferstack_pop(1); } + /* * New methods to init the routing model component from the lua script */ @@ -3380,7 +3829,7 @@ void routing_AS_end(const char *AS_id) void routing_add_host(const char *host_id) { - parse_S_host_lua((char *) host_id); + parse_S_host_lua((char *) host_id, (char*)""); // FIXME propagate coordinate system to lua } /* @@ -3396,7 +3845,7 @@ void routing_add_link(const char *link_id) */ void routing_set_route(const char *src_id, const char *dst_id) { - parse_S_route_new_and_endpoints_lua((char *) src_id, (char *) dst_id); + parse_S_route_new_and_endpoints_lua(src_id, dst_id); } /*