X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8fb370cb7b0fe8f6edcec683a27ffe6e58cb3056..85a65428aea40518dd5198032efddb3984dbe506:/src/surf/surf_routing.c diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 3992b09897..e4ce24ded5 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -4,8 +4,6 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include /* regular expression library */ - #include "simgrid/platf_interface.h" // platform creation API internal interface #include "surf_routing_private.h" @@ -42,6 +40,7 @@ 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 +int ROUTING_PROP_ASR_LEVEL; //Where the properties are stored static xbt_dict_t random_value = NULL; @@ -147,7 +146,7 @@ static void parse_S_host(sg_platf_host_cbarg_t host) xbt_assert(!xbt_lib_get_or_null(host_lib, host->id, ROUTING_HOST_LEVEL), "Reading a host, processing unit \"%s\" already exists", host->id); - info = xbt_new0(s_network_element_t, 1); + info = xbt_new0(s_routing_edge_t, 1); info->rc_component = current_routing; info->rc_type = SURF_NETWORK_ELEMENT_HOST; info->name = xbt_strdup(host->id); @@ -192,7 +191,7 @@ static void parse_S_router(sg_platf_router_cbarg_t router) "Reading a router, processing unit \"%s\" already exists", router->id); - info = xbt_new0(s_network_element_t, 1); + info = xbt_new0(s_routing_edge_t, 1); info->rc_component = current_routing; info->rc_type = SURF_NETWORK_ELEMENT_ROUTER; info->name = xbt_strdup(router->id); @@ -225,72 +224,45 @@ static void parse_S_router(sg_platf_router_cbarg_t router) */ static void parse_E_route(sg_platf_route_cbarg_t route) { - route_t created_route = xbt_new0(s_route_t, 1); - created_route->link_list = route->link_list; - xbt_assert(current_routing->parse_route, "no defined method \"set_route\" in \"%s\"", current_routing->name); - current_routing->parse_route(current_routing, - route->src, route->dst, created_route); - generic_free_route(created_route); + current_routing->parse_route(current_routing, route); } /** * \brief Store the ASroute by calling the set_ASroute function of the current routing component */ -static void parse_E_ASroute(sg_platf_ASroute_cbarg_t ASroute) +static void parse_E_ASroute(sg_platf_route_cbarg_t ASroute) { - route_t e_route = xbt_new0(s_route_t, 1); - e_route->link_list = ASroute->link_list; - - if (!strcmp(current_routing->model_desc->name,"RuleBased")) { - // DIRTY PERL HACK AHEAD: with the rulebased routing, the {src,dst}_gateway fields - // store the provided name instead of the entity directly (model_rulebased_parse_ASroute knows) - // - // This is because the user will provide something like "^AS_(.*)$" instead of the proper name of a given entity - e_route->src_gateway = (sg_routing_edge_t) ASroute->gw_src; - e_route->dst_gateway = (sg_routing_edge_t) ASroute->gw_dst; - } else { - e_route->src_gateway = sg_routing_edge_by_name_or_null(ASroute->gw_src); - e_route->dst_gateway = sg_routing_edge_by_name_or_null(ASroute->gw_dst); - } xbt_assert(current_routing->parse_ASroute, "no defined method \"set_ASroute\" in \"%s\"", current_routing->name); - current_routing->parse_ASroute(current_routing, ASroute->src, ASroute->dst, e_route); - generic_free_route(e_route); + current_routing->parse_ASroute(current_routing, ASroute); } /** * \brief Store the bypass route by calling the set_bypassroute function of the current routing component */ -static void parse_E_bypassRoute(sg_platf_bypassRoute_cbarg_t route) +static void parse_E_bypassRoute(sg_platf_route_cbarg_t route) { - route_t e_route = xbt_new0(s_route_t, 1); - e_route->link_list = route->link_list; - xbt_assert(current_routing->parse_bypassroute, "Bypassing mechanism not implemented by routing '%s'", current_routing->name); - current_routing->parse_bypassroute(current_routing, route->src, route->dst, e_route); + current_routing->parse_bypassroute(current_routing, route); } /** * \brief Store the bypass route by calling the set_bypassroute function of the current routing component */ -static void parse_E_bypassASroute(sg_platf_bypassASroute_cbarg_t ASroute) +static void parse_E_bypassASroute(sg_platf_route_cbarg_t ASroute) { - route_t e_route = xbt_new0(s_route_t, 1); - e_route->link_list = ASroute->link_list; - e_route->src_gateway = sg_routing_edge_by_name_or_null(ASroute->gw_src); - e_route->dst_gateway = sg_routing_edge_by_name_or_null(ASroute->gw_dst); xbt_assert(current_routing->parse_bypassroute, "Bypassing mechanism not implemented by routing '%s'", current_routing->name); - current_routing->parse_bypassroute(current_routing, ASroute->src, ASroute->dst, e_route); + current_routing->parse_bypassroute(current_routing, ASroute); } static void routing_parse_trace(sg_platf_trace_cbarg_t trace) @@ -347,6 +319,8 @@ static void routing_parse_trace_connect(sg_platf_trace_connect_cbarg_t trace_con } } +extern int _sg_init_status; /* yay, this is an horrible hack */ + /** * \brief Make a new routing component to the platform * @@ -360,17 +334,20 @@ static void routing_parse_trace_connect(sg_platf_trace_connect_cbarg_t trace_con * @param AS_id name of this autonomous system. Must be unique in the platform * @param wanted_routing_type one of Full, Floyd, Dijkstra or similar. Full list in the variable routing_models, in src/surf/surf_routing.c */ -void routing_AS_begin(const char *AS_id, int wanted_routing_type) +void routing_AS_begin(sg_platf_AS_cbarg_t AS) { + XBT_DEBUG("routing_AS_begin"); AS_t new_as; routing_model_description_t model = NULL; xbt_assert(!xbt_lib_get_or_null - (as_router_lib, AS_id, ROUTING_ASR_LEVEL), - "The AS \"%s\" already exists", AS_id); + (as_router_lib, AS->id, ROUTING_ASR_LEVEL), + "The AS \"%s\" already exists", AS->id); + + _sg_init_status = 2; /* horrible hack: direct access to the global controlling the level of configuration to prevent any further config */ /* search the routing model */ - switch(wanted_routing_type){ + switch(AS->routing){ case A_surfxml_AS_routing_Cluster: model = &routing_models[SURF_MODEL_CLUSTER];break; case A_surfxml_AS_routing_Dijkstra: model = &routing_models[SURF_MODEL_DIJKSTRA];break; case A_surfxml_AS_routing_DijkstraCache: model = &routing_models[SURF_MODEL_DIJKSTRACACHE];break; @@ -379,16 +356,18 @@ void routing_AS_begin(const char *AS_id, int wanted_routing_type) case A_surfxml_AS_routing_None: model = &routing_models[SURF_MODEL_NONE];break; case A_surfxml_AS_routing_RuleBased: model = &routing_models[SURF_MODEL_RULEBASED];break; case A_surfxml_AS_routing_Vivaldi: model = &routing_models[SURF_MODEL_VIVALDI];break; + default: xbt_die("Not a valid model!!!"); + break; } /* make a new routing component */ new_as = (AS_t) model->create(); new_as->model_desc = model; new_as->hierarchy = SURF_ROUTING_NULL; - new_as->name = xbt_strdup(AS_id); + new_as->name = xbt_strdup(AS->id); sg_routing_edge_t info = NULL; - info = xbt_new0(s_network_element_t, 1); + info = xbt_new0(s_routing_edge_t, 1); if (current_routing == NULL && routing_platf->root == NULL) { @@ -399,15 +378,15 @@ void routing_AS_begin(const char *AS_id, int wanted_routing_type) } else if (current_routing != NULL && routing_platf->root != NULL) { xbt_assert(!xbt_dict_get_or_null - (current_routing->routing_sons, AS_id), - "The AS \"%s\" already exists", AS_id); + (current_routing->routing_sons, AS->id), + "The AS \"%s\" already exists", AS->id); /* it is a part of the tree */ new_as->routing_father = current_routing; /* set the father behavior */ if (current_routing->hierarchy == SURF_ROUTING_NULL) current_routing->hierarchy = SURF_ROUTING_RECURSIVE; /* add to the sons dictionary */ - xbt_dict_set(current_routing->routing_sons, AS_id, + 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, (void *) info); @@ -419,7 +398,7 @@ void routing_AS_begin(const char *AS_id, int wanted_routing_type) info->rc_type = SURF_NETWORK_ELEMENT_AS; info->name = new_as->name; - xbt_lib_set(as_router_lib, new_as->name, ROUTING_ASR_LEVEL, + xbt_lib_set(as_router_lib, info->name, ROUTING_ASR_LEVEL, (void *) info); XBT_DEBUG("Having set name '%s' id '%d'",new_as->name,info->id); @@ -440,7 +419,7 @@ void routing_AS_begin(const char *AS_id, int wanted_routing_type) * even if you add stuff to a closed AS * */ -void routing_AS_end() +void routing_AS_end(sg_platf_AS_cbarg_t AS) { if (current_routing == NULL) { @@ -541,11 +520,11 @@ static void elements_father(sg_routing_edge_t src, sg_routing_edge_t dst, static void _get_route_and_latency(sg_routing_edge_t src, sg_routing_edge_t dst, xbt_dynar_t * links, double *latency) { - s_route_t route; + s_sg_platf_route_cbarg_t route; memset(&route,0,sizeof(route)); - XBT_DEBUG("Solve route/latency \"%s\" to \"%s\"", src->name, dst->name); xbt_assert(src && dst, "bad parameters for \"_get_route_latency\" method"); + XBT_DEBUG("Solve route/latency \"%s\" to \"%s\"", src->name, dst->name); /* Find how src and dst are interconnected */ AS_t common_father, src_father, dst_father; @@ -554,7 +533,7 @@ static void _get_route_and_latency(sg_routing_edge_t src, sg_routing_edge_t dst, common_father->name,src_father->name,dst_father->name); /* Check whether a direct bypass is defined */ - route_t e_route_bypass = NULL; + sg_platf_route_cbarg_t e_route_bypass = NULL; if (common_father->get_bypass_route) e_route_bypass = common_father->get_bypass_route(common_father, src, dst, latency); @@ -584,11 +563,11 @@ static void _get_route_and_latency(sg_routing_edge_t src, sg_routing_edge_t dst, src_father_net_elm, dst_father_net_elm, &route, latency); - xbt_assert((route.src_gateway != NULL) && (route.dst_gateway != NULL), + xbt_assert((route.gw_src != NULL) && (route.gw_dst != NULL), "bad gateways for route from \"%s\" to \"%s\"", src->name, dst->name); - sg_routing_edge_t src_gateway_net_elm = route.src_gateway; - sg_routing_edge_t dst_gateway_net_elm = route.dst_gateway; + sg_routing_edge_t src_gateway_net_elm = route.gw_src; + sg_routing_edge_t dst_gateway_net_elm = route.gw_dst; /* If source gateway is not our source, we have to recursively find our way up to this point */ if (src != src_gateway_net_elm) @@ -830,7 +809,10 @@ static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster) } XBT_DEBUG("", cluster->id); - sg_platf_new_AS_begin(cluster->id, A_surfxml_AS_routing_Cluster); + s_sg_platf_AS_cbarg_t AS = SG_PLATF_AS_INITIALIZER; + AS.id = cluster->id; + AS.routing = A_surfxml_AS_routing_Cluster; + sg_platf_new_AS_begin(&AS); current_routing->link_up_down_list = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL); @@ -1037,7 +1019,7 @@ static void routing_parse_Srandom(void) char *rd_name = NULL; char *rd_value; mean = surf_parse_get_double(A_surfxml_random_mean); - std = surf_parse_get_double(A_surfxml_random_std_deviation); + std = surf_parse_get_double(A_surfxml_random_std___deviation); min = surf_parse_get_double(A_surfxml_random_min); max = surf_parse_get_double(A_surfxml_random_max); seed = surf_parse_get_double(A_surfxml_random_seed);