X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ccc5ecd2a44dfbd9740d894c3e3ec9f33a2d5748..485a5ec02aa2f8c667ab99f1d556e1851a99cc07:/src/surf/surf_routing.c diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 44a6e90d65..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"); @@ -175,8 +176,7 @@ static double eculidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t dst) } -static double vivaldi_get_link_latency (routing_component_t rc, - const char *src, const char *dst) +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; @@ -540,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); + } } /* @@ -599,6 +606,24 @@ static void parse_E_AS_lua(const char *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 * @@ -801,7 +826,6 @@ 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; @@ -825,7 +849,6 @@ static double _get_latency(const char *src, const char *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); @@ -844,8 +867,9 @@ static double _get_latency(const char *src, const char *dst) "bad gateway for route between \"%s\" and \"%s\"", src, dst); latency = - (*(common_father->get_latency)) (common_father, e_route_cnt->src_gateway, - e_route_cnt->src_gateway); + (*(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); @@ -1053,7 +1077,6 @@ static e_surf_network_element_type_t get_network_element_type(const char */ 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(); @@ -1104,16 +1127,26 @@ void routing_model_create(size_t size_of_links, void *loopback, double_f_cpvoid_ surfxml_add_callback(STag_surfxml_peer_cb_list, &routing_parse_Speer); - surfxml_add_callback(STag_surfxml_config_cb_list, - &routing_parse_Sconfig); - surfxml_add_callback(ETag_surfxml_config_cb_list, - &routing_parse_Econfig); - #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); +} + /* ************************************************************************** */ /* *************************** FULL ROUTING ********************************* */ @@ -1249,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; } @@ -1328,7 +1362,7 @@ 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 exists", src,dst); + "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 @@ -1571,6 +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.get_network_element_type = get_network_element_type; return new_component; } @@ -2193,6 +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.get_network_element_type = get_network_element_type; return new_component; } @@ -2225,6 +2261,15 @@ static void model_dijkstra_both_end(void) unsigned int cursor2; xbt_dynar_t nodes = NULL; + /* 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(); + /* Add the loopback if needed */ if (current_routing->hierarchy == SURF_ROUTING_BASE) add_loopback_dijkstra(routing); @@ -2247,7 +2292,7 @@ static void model_dijkstra_both_set_route (routing_component_t rc, const char *s dst_id = xbt_dict_get_or_null(rc->to_index, dst); /* Create the topology graph */ - if(!routing->route_cache) + 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(); @@ -2671,6 +2716,7 @@ static void *model_rulebased_create(void) 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(); @@ -3234,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) @@ -3446,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) @@ -3641,6 +3690,7 @@ static void routing_parse_Speer(void) 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);