X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8f3f851daa42c5485ec0fedf68b24c639e43aee5..e373b0b3befb83483aeadcea9962e46492947b84:/src/surf/surf_routing.c diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 1e89a6e388..9f198f2a4e 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -1,11 +1,17 @@ -/* Copyright (c) 2009, 2010. The SimGrid Team. +/* Copyright (c) 2009, 2010. The SimGrid Team. * All rights reserved. */ /* 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 -#include /* regular expresion library */ +#include "gras_config.h" + +#ifdef HAVE_PCRE_LIB + #include /* regular expresion library */ +#endif #include "surf_private.h" #include "xbt/dynar.h" #include "xbt/str.h" @@ -50,13 +56,20 @@ static void model_none_end(void); /* none routing model */ static void routing_full_parse_Scluster(void);/*cluster bypass*/ -/* this lines are olny for replace use like index in the model table */ -#define SURF_MODEL_FULL 0 -#define SURF_MODEL_FLOYD 1 -#define SURF_MODEL_DIJKSTRA 2 -#define SURF_MODEL_DIJKSTRACACHE 3 -#define SURF_MODEL_RULEBASED 4 -#define SURF_MODEL_NONE 5 +static void parse_Sconfig(void);/*config Tag*/ + +/* this lines are only for replace use like index in the model table */ +typedef enum { + SURF_MODEL_FULL=0, + SURF_MODEL_FLOYD, + SURF_MODEL_DIJKSTRA, + SURF_MODEL_DIJKSTRACACHE, + SURF_MODEL_NONE, +#ifdef HAVE_PCRE_LIB + SURF_MODEL_RULEBASED +#endif +} e_routing_types; + /* must be finish with null and carefull if change de order */ struct s_model_type routing_models[] = @@ -68,10 +81,11 @@ struct s_model_type routing_models[] = model_dijkstra_create ,model_dijkstra_both_load, model_dijkstra_both_unload, model_dijkstra_both_end }, {"DijkstraCache", "Dijkstra routing data (fast initialization, fast lookup, small memory requirements, shortest path routing only)", model_dijkstracache_create, model_dijkstra_both_load, model_dijkstra_both_unload, model_dijkstra_both_end }, - {"RuleBased", "Rule-Based routing data (...)", - model_rulebased_create, model_rulebased_load, model_rulebased_unload, model_rulebased_end }, {"none", "No routing (usable with Constant network only)", model_none_create, model_none_load, model_none_unload, model_none_end }, +#ifdef HAVE_PCRE_LIB + {"RuleBased", "Rule-Based routing data (...)", model_rulebased_create, model_rulebased_load, model_rulebased_unload, model_rulebased_end }, +#endif {NULL,NULL,NULL,NULL,NULL,NULL}}; /* ************************************************************************** */ @@ -86,6 +100,7 @@ static void generic_set_bypassroute(routing_component_t rc, const char* src, con /* ************************************************************************** */ /* *************** GENERIC BUSINESS METHODS (declarations) ****************** */ +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, const char* dst); /* ************************************************************************** */ @@ -111,42 +126,89 @@ static xbt_dynar_t link_list = NULL; /* temporary store of current list link of /** * \brief Add a "host" to the network element list */ -static void parse_S_host(void) { - 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,A_surfxml_host_id), - "Reading a host, processing unit \"%s\" already exist",A_surfxml_host_id); +static void parse_S_host(char* host_id) { + 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",host_id); xbt_assert1(current_routing->set_processing_unit, "no defined method \"set_processing_unit\" in \"%s\"",current_routing->name); - (*(current_routing->set_processing_unit))(current_routing,A_surfxml_host_id); - xbt_dict_set(global_routing->where_network_elements,A_surfxml_host_id,(void*)current_routing,NULL); + (*(current_routing->set_processing_unit))(current_routing,host_id); + info = xbt_new0(s_network_element_info_t,1); + 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); } +/* + * \brief Add a host to the network element list from XML + */ +static void parse_S_host_XML(void) +{ + parse_S_host(A_surfxml_host_id); +} + +/* + * \brief Add a host to the network element list from lua script + */ +static void parse_S_host_lua(char *host_id) +{ + parse_S_host(host_id); +} +/* + * + */ + /** * \brief Add a "router" to the network element list */ static void parse_S_router(void) { + 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,A_surfxml_router_id), "Reading a router, processing unit \"%s\" already exist",A_surfxml_router_id); xbt_assert1(current_routing->set_processing_unit, "no defined method \"set_processing_unit\" in \"%s\"",current_routing->name); (*(current_routing->set_processing_unit))(current_routing,A_surfxml_router_id); - xbt_dict_set(global_routing->where_network_elements,A_surfxml_router_id,(void*)current_routing,NULL); + info = xbt_new0(s_network_element_info_t,1); + 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 } /** * \brief Set the endponints for a route */ -static void parse_S_route_new_and_endpoints(void) { +static void parse_S_route_new_and_endpoints(char *src_id,char *dst_id) { if( src != NULL && dst != NULL && link_list != NULL ) - THROW2(arg_error,0,"Route between %s to %s can not be defined",A_surfxml_route_src,A_surfxml_route_dst); - src = A_surfxml_route_src; - dst = A_surfxml_route_dst; + THROW2(arg_error,0,"Route between %s to %s can not be defined",src_id,dst_id); + src = src_id; + dst = dst_id; xbt_assert2(strlen(src)>0||strlen(dst)>0, "Some limits are null in the route between \"%s\" and \"%s\"",src,dst); link_list = xbt_dynar_new(sizeof(char*), &xbt_free_ref); } +/** + * \breif Set the endpoints for a route from XML + */ +static void parse_S_route_new_and_endpoints_XML(void) +{ + parse_S_route_new_and_endpoints(A_surfxml_route_src,A_surfxml_route_dst); +} + +/** + * \breif Set the endpoints for a route from lua + */ +static void parse_S_route_new_and_endpoints_lua(char *id_src,char *id_dst) +{ + parse_S_route_new_and_endpoints(id_src,id_dst); +} + /** * \brief Set the endponints and gateways for a ASroute */ @@ -180,12 +242,29 @@ 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_c_ctn_new_elem(void) { +static void parse_E_link_ctn_new_elem(char *link_id) { char *val; - val = xbt_strdup(A_surfxml_link_c_ctn_id); + val = xbt_strdup(link_id); xbt_dynar_push(link_list, &val); } +/** + * \brief Set a new link on the actual list of link for a route or ASroute from XML + */ + +static void parse_E_link_ctn_new_elem_XML(void) +{ + parse_E_link_ctn_new_elem(A_surfxml_link_ctn_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) { + + parse_E_link_ctn_new_elem(link_id); +} + /** * \brief Store the route by calling the set_route function of the current routing component */ @@ -246,13 +325,13 @@ static void parse_E_bypassRoute_store_route(void) { /** * \brief Make a new routing component * - * Detect the routing model type of the routing component, make the new structure and + * make the new structure and * set the parsing functions to allows parsing the part of the routing tree */ -static void parse_S_AS(void) { +static void parse_S_AS(char* AS_id,char* AS_routing) { routing_component_t new_routing; model_type_t model = NULL; - char* wanted = A_surfxml_AS_routing; + char* wanted = AS_routing; int cpt; /* seach the routing model */ for (cpt=0;routing_models[cpt].name;cpt++) @@ -271,7 +350,7 @@ static void parse_S_AS(void) { new_routing = (routing_component_t)(*(model->create))(); new_routing->routing = model; new_routing->hierarchy = SURF_ROUTING_NULL; - new_routing->name = xbt_strdup(A_surfxml_AS_id); + new_routing->name = xbt_strdup(AS_id); new_routing->routing_sons = xbt_dict_new(); //INFO2("Routing %s for AS %s",A_surfxml_AS_routing,A_surfxml_AS_id); @@ -281,18 +360,18 @@ static void parse_S_AS(void) { new_routing->routing_father = NULL; global_routing->root = new_routing; - } else if( current_routing != NULL && global_routing->root != NULL ) { + } else if( current_routing != NULL && global_routing->root != NULL ) { - xbt_assert1(!xbt_dict_get_or_null(current_routing->routing_sons,A_surfxml_AS_id), - "The AS \"%s\" already exist",A_surfxml_AS_id); + xbt_assert1(!xbt_dict_get_or_null(current_routing->routing_sons,AS_id), + "The AS \"%s\" already exist",AS_id); /* it is a part of the tree */ new_routing->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,A_surfxml_AS_id,(void*)new_routing,NULL); + xbt_dict_set(current_routing->routing_sons,AS_id,(void*)new_routing,NULL); /* add to the father element list */ - (*(current_routing->set_autonomous_system))(current_routing,A_surfxml_AS_id); + (*(current_routing->set_autonomous_system))(current_routing,AS_id); /* unload the prev parse rules */ (*(current_routing->routing->unload))(); @@ -305,20 +384,41 @@ static void parse_S_AS(void) { current_routing = new_routing; } +/* + * Detect the routing model type of the routing component from XML platforms + */ +static void parse_S_AS_XML(void) +{ + parse_S_AS(A_surfxml_AS_id,A_surfxml_AS_routing); +} + +/* + * define the routing model type of routing component from lua script + */ +static void parse_S_AS_lua(char* id,char* mode) +{ + parse_S_AS(id,mode); +} + + /** * \brief Finish the creation of a new routing component * * 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(void) { +static void parse_E_AS(char *AS_id) { if( current_routing == NULL ) { - THROW1(arg_error,0,"Close AS(%s), that never open",A_surfxml_AS_id); + THROW1(arg_error,0,"Close AS(%s), that never open",AS_id); } else { + 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); - xbt_dict_set(global_routing->where_network_elements,current_routing->name,current_routing->routing_father,NULL); + 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->routing->unload))(); (*(current_routing->routing->end))(); current_routing = current_routing->routing_father; @@ -327,6 +427,22 @@ static void parse_E_AS(void) { } } +/* + * \brief Finish the creation of a new routing component from XML + */ +static void parse_E_AS_XML(void) +{ + parse_E_AS(A_surfxml_AS_id); +} + +/* + * \brief Finish the creation of a new routing component from lua + */ +static void parse_E_AS_lua(char *id) +{ + parse_E_AS(id); +} + /* Aux Business methods */ /** @@ -354,8 +470,8 @@ static xbt_dynar_t elements_father(const char* src,const char* dst) { routing_component_t* father = NULL; /* (1) find the as where the src and dst are located */ - src_as = xbt_dict_get_or_null(global_routing->where_network_elements,src); - dst_as = xbt_dict_get_or_null(global_routing->where_network_elements,dst); + src_as = ((network_element_info_t)xbt_dict_get_or_null(global_routing->where_network_elements,src))->rc_component; + dst_as = ((network_element_info_t)xbt_dict_get_or_null(global_routing->where_network_elements,dst))->rc_component; xbt_assert2(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 */ @@ -428,7 +544,7 @@ static route_extended_t _get_route(const char* src,const char* dst) { xbt_assert0(src&&dst,"bad parameters for \"_get_route\" method"); - route_extended_t e_route, e_route_cnt, e_route_src, e_route_dst; + 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); @@ -581,14 +697,45 @@ static void finalize(void) { xbt_free(global_routing); } -static void get_onelink_routes(void) +static xbt_dynar_t recursive_get_onelink_routes (routing_component_t rc) +{ + xbt_dynar_t ret = xbt_dynar_new (sizeof(onelink_t), xbt_free); + + //adding my one link routes + unsigned int cpt; + void *link; + xbt_dynar_t onelink_mine = rc->get_onelink_routes (rc); + if (onelink_mine){ + xbt_dynar_foreach(onelink_mine, cpt, link) { + xbt_dynar_push(ret,&link); + } + } + + //recursing + char *key; + xbt_dict_cursor_t cursor=NULL; + routing_component_t rc_child; + xbt_dict_foreach(rc->routing_sons, cursor, key, rc_child) { + xbt_dynar_t onelink_child = recursive_get_onelink_routes (rc_child); + if (onelink_child){ + xbt_dynar_foreach(onelink_child, cpt, link) { + xbt_dynar_push(ret,&link); + } + } + } + return ret; +} + +static xbt_dynar_t get_onelink_routes(void) { - xbt_die("get_onelink_routes function not implemented yet!!!"); + return recursive_get_onelink_routes (global_routing->root); } -static int is_router(const char *name) +static e_surf_network_element_type_t get_network_element_type(const char *name) { - xbt_die("is_router function not implemented yet!!!"); + network_element_info_t rc=NULL; + rc = xbt_dict_get(global_routing->where_network_elements,name); + return rc->rc_type; } /** @@ -603,6 +750,8 @@ void routing_model_create(size_t size_of_links, void* loopback) { global_routing->where_network_elements = xbt_dict_new(); global_routing->root = NULL; global_routing->get_route = get_route; + global_routing->get_onelink_routes = get_onelink_routes; + global_routing->get_network_element_type = get_network_element_type; global_routing->finalize = finalize; global_routing->loopback = loopback; global_routing->size_of_link = size_of_links; @@ -612,24 +761,25 @@ void routing_model_create(size_t size_of_links, void* loopback) { current_routing = NULL; /* parse generic elements */ - surfxml_add_callback(STag_surfxml_host_cb_list, &parse_S_host); + surfxml_add_callback(STag_surfxml_host_cb_list, &parse_S_host_XML); surfxml_add_callback(STag_surfxml_router_cb_list, &parse_S_router); - surfxml_add_callback(STag_surfxml_route_cb_list, &parse_S_route_new_and_endpoints); + surfxml_add_callback(STag_surfxml_route_cb_list, &parse_S_route_new_and_endpoints_XML); surfxml_add_callback(STag_surfxml_ASroute_cb_list, &parse_S_ASroute_new_and_endpoints); surfxml_add_callback(STag_surfxml_bypassRoute_cb_list, &parse_S_bypassRoute_new_and_endpoints); - surfxml_add_callback(ETag_surfxml_link_c_ctn_cb_list, &parse_E_link_c_ctn_new_elem); + surfxml_add_callback(ETag_surfxml_link_ctn_cb_list, &parse_E_link_ctn_new_elem_XML); surfxml_add_callback(ETag_surfxml_route_cb_list, &parse_E_route_store_route); surfxml_add_callback(ETag_surfxml_ASroute_cb_list, &parse_E_ASroute_store_route); surfxml_add_callback(ETag_surfxml_bypassRoute_cb_list, &parse_E_bypassRoute_store_route); - surfxml_add_callback(STag_surfxml_AS_cb_list, &parse_S_AS); - surfxml_add_callback(ETag_surfxml_AS_cb_list, &parse_E_AS); + surfxml_add_callback(STag_surfxml_AS_cb_list, &parse_S_AS_XML); + surfxml_add_callback(ETag_surfxml_AS_cb_list, &parse_E_AS_XML); surfxml_add_callback(STag_surfxml_cluster_cb_list, &routing_full_parse_Scluster); + surfxml_add_callback(STag_surfxml_config_cb_list, &parse_Sconfig); } /* ************************************************************************** */ @@ -648,6 +798,35 @@ typedef struct { } s_routing_component_full_t,*routing_component_full_t; /* Business methods */ +static xbt_dynar_t full_get_onelink_routes(routing_component_t rc) +{ + xbt_dynar_t ret = xbt_dynar_new (sizeof(onelink_t), xbt_free); + + routing_component_full_t routing = (routing_component_full_t)rc; + int table_size = xbt_dict_length(routing->to_index); + xbt_dict_cursor_t c1 = NULL, c2 = NULL; + char *k1, *d1, *k2, *d2; + xbt_dict_foreach(routing->to_index, c1, k1, d1) { + xbt_dict_foreach (routing->to_index, c2, k2, d2) { + int *src_id = xbt_dict_get_or_null(routing->to_index, k1); + int *dst_id = xbt_dict_get_or_null(routing->to_index, k2); + xbt_assert2(src_id && dst_id, "Ask for route \"from\"(%s) or \"to\"(%s) no found in the local table",src,dst); + route_extended_t route = TO_ROUTE_FULL(*src_id,*dst_id); + if (route){ + if (xbt_dynar_length(route->generic_route.link_list) == 1){ + void *link = *(void**)xbt_dynar_get_ptr(route->generic_route.link_list,0); + + onelink_t onelink = xbt_new0 (s_onelink_t, 1); + onelink->src = xbt_strdup (k1); + onelink->dst = xbt_strdup (k2); + onelink->link_ptr = link; + xbt_dynar_push (ret, &onelink); + } + } + } + } + return ret; +} static route_extended_t full_get_route(routing_component_t rc, const char* src,const char* dst) { xbt_assert1(rc&&src&&dst, "Invalid params for \"get_route\" function at AS \"%s\"",rc->name); @@ -709,6 +888,7 @@ static void* model_full_create(void) { new_component->generic_routing.set_ASroute = generic_set_ASroute; new_component->generic_routing.set_bypassroute = generic_set_bypassroute; new_component->generic_routing.get_route = full_get_route; + new_component->generic_routing.get_onelink_routes = full_get_onelink_routes; new_component->generic_routing.get_bypass_route = generic_get_bypassroute; new_component->generic_routing.finalize = full_finalize; new_component->to_index = xbt_dict_new(); @@ -806,7 +986,34 @@ typedef struct { xbt_dict_t parse_routes; } s_routing_component_floyd_t,*routing_component_floyd_t; +static route_extended_t floyd_get_route(routing_component_t rc, const char* src,const char* dst); + /* Business methods */ +static xbt_dynar_t floyd_get_onelink_routes(routing_component_t rc) +{ + xbt_dynar_t ret = xbt_dynar_new (sizeof(onelink_t), xbt_free); + + routing_component_floyd_t routing = (routing_component_floyd_t)rc; + //int table_size = xbt_dict_length(routing->to_index); + xbt_dict_cursor_t c1 = NULL, c2 = NULL; + char *k1, *d1, *k2, *d2; + xbt_dict_foreach(routing->to_index, c1, k1, d1) { + xbt_dict_foreach (routing->to_index, c2, k2, d2) { + route_extended_t route = floyd_get_route (rc, k1, k2); + if (route){ + if (xbt_dynar_length(route->generic_route.link_list) == 1){ + void *link = *(void**)xbt_dynar_get_ptr(route->generic_route.link_list,0); + onelink_t onelink = xbt_new0 (s_onelink_t, 1); + onelink->src = xbt_strdup (k1); + onelink->dst = xbt_strdup (k2); + onelink->link_ptr = link; + xbt_dynar_push (ret, &onelink); + } + } + } + } + return ret; +} static route_extended_t floyd_get_route(routing_component_t rc, const char* src,const char* dst) { xbt_assert1(rc&&src&&dst, "Invalid params for \"get_route\" function at AS \"%s\"",rc->name); @@ -829,7 +1036,7 @@ static route_extended_t floyd_get_route(routing_component_t rc, const char* src, int first = 1; int pred = *dst_id; int prev_pred = 0; - char *gw_src,*gw_dst, *prev_gw_src,*prev_gw_dst, *first_gw; + char *gw_src=NULL,*gw_dst=NULL, *prev_gw_src,*prev_gw_dst, *first_gw=NULL; unsigned int cpt; void* link; xbt_dynar_t links; @@ -907,6 +1114,7 @@ static void* model_floyd_create(void) { new_component->generic_routing.set_ASroute = generic_set_ASroute; new_component->generic_routing.set_bypassroute = generic_set_bypassroute; new_component->generic_routing.get_route = floyd_get_route; + new_component->generic_routing.get_onelink_routes = floyd_get_onelink_routes; new_component->generic_routing.get_bypass_route = generic_get_bypassroute; new_component->generic_routing.finalize = floyd_finalize; new_component->to_index = xbt_dict_new(); @@ -1155,6 +1363,10 @@ static void add_loopback_dijkstra(routing_component_dijkstra_t rc) { } /* Business methods */ +static xbt_dynar_t dijkstra_get_onelink_routes(routing_component_t rc) +{ + xbt_die("\"dijkstra_get_onelink_routes\" function not implemented yet"); +} static route_extended_t dijkstra_get_route(routing_component_t rc, const char* src,const char* dst) { xbt_assert1(rc&&src&&dst, "Invalid params for \"get_route\" function at AS \"%s\"",rc->name); @@ -1279,7 +1491,7 @@ static route_extended_t dijkstra_get_route(routing_component_t rc, const char* s } /* compose route path with links */ - char *gw_src,*gw_dst, *prev_gw_src,*prev_gw_dst, *first_gw; + char *gw_src=NULL,*gw_dst=NULL, *prev_gw_src,*prev_gw_dst, *first_gw=NULL; for(v = dst_node_id; v != src_node_id; v = pred_arr[v]) { xbt_node_t node_pred_v = xbt_dynar_get_as(nodes, pred_arr[v], xbt_node_t); @@ -1361,6 +1573,7 @@ static void* model_dijkstra_both_create(int cached) { new_component->generic_routing.set_ASroute = generic_set_ASroute; new_component->generic_routing.set_bypassroute = generic_set_bypassroute; new_component->generic_routing.get_route = dijkstra_get_route; + new_component->generic_routing.get_onelink_routes = dijkstra_get_onelink_routes; new_component->generic_routing.get_bypass_route = generic_get_bypassroute; new_component->generic_routing.finalize = dijkstra_finalize; new_component->cached = cached; @@ -1439,6 +1652,7 @@ static void model_dijkstra_both_end(void) { } +#ifdef HAVE_PCRE_LIB /* ************************************************** */ /* ************** RULE-BASED ROUTING **************** */ @@ -1535,7 +1749,7 @@ static void model_rulebased_set_ASroute(routing_component_t rc, const char* src, } static void model_rulebased_set_bypassroute(routing_component_t rc, const char* src, const char* dst, route_extended_t e_route) { - xbt_die("bypass routing not support for Route-Based model"); + xbt_die("bypass routing not supported for Route-Based model"); } #define BUFFER_SIZE 4096 /* result buffer size */ @@ -1603,6 +1817,11 @@ static char* remplace(char* value, const char** src_list, int src_size, const ch return xbt_strdup(result_result); } +static xbt_dynar_t rulebased_get_onelink_routes(routing_component_t rc) +{ + xbt_die("\"rulebased_get_onelink_routes\" function not implemented yet"); +} + /* Business methods */ static route_extended_t rulebased_get_route(routing_component_t rc, const char* src,const char* dst) { xbt_assert1(rc&&src&&dst, "Invalid params for \"get_route\" function at AS \"%s\"",rc->name); @@ -1705,6 +1924,7 @@ static void* model_rulebased_create(void) { new_component->generic_routing.set_route = model_rulebased_set_route; new_component->generic_routing.set_ASroute = model_rulebased_set_ASroute; 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 = NULL; //rulebased_get_bypass_route; new_component->generic_routing.finalize = rulebased_finalize; @@ -1727,6 +1947,8 @@ static void model_rulebased_unload(void) { static void model_rulebased_end(void) { } +#endif /* HAVE_PCRE_LIB */ + /* ************************************************************************** */ /* ******************************* NO ROUTING ******************************* */ @@ -1736,6 +1958,9 @@ typedef struct { } s_routing_component_none_t,*routing_component_none_t; /* Business methods */ +static xbt_dynar_t none_get_onelink_routes(routing_component_t rc){ + return NULL; +} static route_extended_t none_get_route(routing_component_t rc, const char* src,const char* dst){ return NULL; } @@ -1758,6 +1983,7 @@ static void* model_none_create(void) { new_component->generic_routing.set_ASroute = NULL; new_component->generic_routing.set_bypassroute = NULL; new_component->generic_routing.get_route = none_get_route; + new_component->generic_routing.get_onelink_routes = none_get_onelink_routes; new_component->generic_routing.get_bypass_route = none_get_bypass_route; new_component->generic_routing.finalize = none_finalize; return new_component; @@ -1828,7 +2054,7 @@ static void generic_set_processing_unit(routing_component_t rc, const char* name modeltype==&routing_models[SURF_MODEL_DIJKSTRACACHE]) _to_index = ((routing_component_dijkstra_t)rc)->to_index; - else xbt_die("\"generic_set_processing_unit\" not support"); + else xbt_die("\"generic_set_processing_unit\" not supported"); *id = xbt_dict_length(_to_index); xbt_dict_set(_to_index,name,id,xbt_free); } @@ -1848,7 +2074,7 @@ static void generic_set_autonomous_system(routing_component_t rc, const char* na modeltype==&routing_models[SURF_MODEL_DIJKSTRACACHE]) _to_index = ((routing_component_dijkstra_t)rc)->to_index; - else xbt_die("\"generic_set_autonomous_system\" not support"); + else xbt_die("\"generic_set_autonomous_system\" not supported"); *id = xbt_dict_length(_to_index); xbt_dict_set(_to_index,name,id,xbt_free); } @@ -1874,7 +2100,7 @@ static void generic_set_route(routing_component_t rc, const char* src, const cha _parse_routes = ((routing_component_dijkstra_t)rc)->parse_routes; _to_index = ((routing_component_dijkstra_t)rc)->to_index; - } else xbt_die("\"generic_set_route\" not support"); + } else xbt_die("\"generic_set_route\" not supported"); src_id = xbt_dict_get_or_null(_to_index, src); dst_id = xbt_dict_get_or_null(_to_index, dst); @@ -1911,7 +2137,7 @@ static void generic_set_ASroute(routing_component_t rc, const char* src, const c _parse_routes = ((routing_component_dijkstra_t)rc)->parse_routes; _to_index = ((routing_component_dijkstra_t)rc)->to_index; - } else xbt_die("\"generic_set_route\" not support"); + } else xbt_die("\"generic_set_route\" not supported"); src_id = xbt_dict_get_or_null(_to_index, src); dst_id = xbt_dict_get_or_null(_to_index, dst); @@ -1939,7 +2165,7 @@ static void generic_set_bypassroute(routing_component_t rc, const char* src, con } else if(modeltype==&routing_models[SURF_MODEL_DIJKSTRA]|| modeltype==&routing_models[SURF_MODEL_DIJKSTRACACHE]) { dict_bypassRoutes = ((routing_component_dijkstra_t)rc)->bypassRoutes; - } else xbt_die("\"generic_set_bypassroute\" not support"); + } else xbt_die("\"generic_set_bypassroute\" not supported"); route_name = bprintf("%s#%s",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); xbt_assert4(!xbt_dict_get_or_null(dict_bypassRoutes,route_name), @@ -1956,6 +2182,11 @@ static void generic_set_bypassroute(routing_component_t rc, const char* src, con /* ************************************************************************** */ /* *********************** GENERIC BUSINESS METHODS ************************* */ +static xbt_dynar_t generic_get_onelink_routes (routing_component_t rc) +{ + xbt_die("\"generic_get_onelink_routes\" not implemented yet"); +} + static route_extended_t generic_get_bypassroute(routing_component_t rc, const char* src, const char* dst) { model_type_t modeltype = rc->routing; xbt_dict_t dict_bypassRoutes; @@ -1967,7 +2198,7 @@ static route_extended_t generic_get_bypassroute(routing_component_t rc, const ch } else if(modeltype==&routing_models[SURF_MODEL_DIJKSTRA]|| modeltype==&routing_models[SURF_MODEL_DIJKSTRACACHE]) { dict_bypassRoutes = ((routing_component_dijkstra_t)rc)->bypassRoutes; - } else xbt_die("\"generic_set_bypassroute\" not support"); + } else xbt_die("\"generic_get_bypassroute\" not supported"); routing_component_t src_as, dst_as; @@ -1979,8 +2210,8 @@ static route_extended_t generic_get_bypassroute(routing_component_t rc, const ch routing_component_t* current_dst = NULL; /* (1) find the as where the src and dst are located */ - src_as = xbt_dict_get_or_null(global_routing->where_network_elements,src); - dst_as = xbt_dict_get_or_null(global_routing->where_network_elements,dst); + src_as = ((network_element_info_t)xbt_dict_get_or_null(global_routing->where_network_elements,src))->rc_component; + dst_as = ((network_element_info_t)xbt_dict_get_or_null(global_routing->where_network_elements,dst))->rc_component; xbt_assert2(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 */ @@ -2165,7 +2396,7 @@ static routing_component_t generic_autonomous_system_exist(routing_component_t r routing_component_t element_as, result, elem; xbt_dict_cursor_t cursor = NULL; char *key; - element_as = xbt_dict_get_or_null(global_routing->where_network_elements,element); + element_as = ((network_element_info_t)xbt_dict_get_or_null(global_routing->where_network_elements,element))->rc_component; result = ((routing_component_t)-1); if(element_as!=rc) result = generic_as_exist(rc,element_as); @@ -2184,15 +2415,15 @@ static routing_component_t generic_autonomous_system_exist(routing_component_t r static routing_component_t generic_processing_units_exist(routing_component_t rc, char* element) { routing_component_t element_as; - element_as = xbt_dict_get_or_null(global_routing->where_network_elements,element); + element_as = ((network_element_info_t)xbt_dict_get_or_null(global_routing->where_network_elements,element))->rc_component; if(element_as==rc) return element_as; return generic_as_exist(rc,element_as); } static void generic_src_dst_check(routing_component_t rc, const char* src, const char* dst) { - routing_component_t src_as = xbt_dict_get_or_null(global_routing->where_network_elements,src); - routing_component_t dst_as = xbt_dict_get_or_null(global_routing->where_network_elements,dst); + routing_component_t src_as = ((network_element_info_t)xbt_dict_get_or_null(global_routing->where_network_elements,src))->rc_component; + routing_component_t dst_as = ((network_element_info_t)xbt_dict_get_or_null(global_routing->where_network_elements,dst))->rc_component; xbt_assert3(src_as != NULL && dst_as != NULL, "Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"",src,dst,rc->name); @@ -2202,6 +2433,12 @@ static void generic_src_dst_check(routing_component_t rc, const char* src, const "The routing component of src and dst is not the same as the network elements belong (%s==%s)",rc->name,dst_as->name); } +static void parse_Sconfig(void) +{ + //TODO + DEBUG0("WARNING tag config not yet implemented."); +} + static void routing_full_parse_Scluster(void) { static int AX_ptr = 0; @@ -2221,15 +2458,27 @@ static void routing_full_parse_Scluster(void) int start, end, i; xbt_dynar_t radical_elements; xbt_dynar_t radical_ends; + #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 int surfxml_buffer_stack_stack_ptr = 0; - static int surfxml_buffer_stack_stack[1024]; + 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); - DEBUG1("",cluster_id); SURFXML_BUFFER_SET(AS_id, cluster_id); +#ifdef HAVE_PCRE_LIB SURFXML_BUFFER_SET(AS_routing, "RuleBased"); + DEBUG1("",cluster_id); +#else + SURFXML_BUFFER_SET(AS_routing, "Full"); + DEBUG1("",cluster_id); +#endif SURFXML_START_TAG(AS); radical_elements = xbt_str_split(cluster_radical, ","); @@ -2240,7 +2489,10 @@ static void routing_full_parse_Scluster(void) { case 1: surf_parse_get_int(&start, xbt_dynar_get_as(radical_ends, 0, char *)); - host_id = bprintf("%s%d%s", cluster_prefix, start, cluster_suffix); + host_id = bprintf("%s_%d%s", cluster_prefix, start, cluster_suffix); + #ifndef HAVE_PCRE_LIB + xbt_dynar_push_as(tab_elements_num, int, start); + #endif link_id = bprintf("%s_link_%d", cluster_id, start); DEBUG2("",host_id,cluster_power); @@ -2250,10 +2502,6 @@ static void routing_full_parse_Scluster(void) SURFXML_BUFFER_SET(host_availability_file, ""); A_surfxml_host_state = A_surfxml_host_state_ON; SURFXML_BUFFER_SET(host_state_file, ""); - SURFXML_BUFFER_SET(host_interference_send, "1.0"); - SURFXML_BUFFER_SET(host_interference_recv, "1.0"); - SURFXML_BUFFER_SET(host_interference_send_recv, "1.0"); - SURFXML_BUFFER_SET(host_max_outgoing_rate, "-1.0"); SURFXML_START_TAG(host); SURFXML_END_TAG(host); @@ -2275,9 +2523,13 @@ static void routing_full_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); + host_id = bprintf("%s_%d%s", cluster_prefix, i, cluster_suffix); + #ifndef HAVE_PCRE_LIB + xbt_dynar_push_as(tab_elements_num, int, i); + #endif link_id = bprintf("%s_link_%d", cluster_id, i); DEBUG2("",host_id,cluster_power); @@ -2287,10 +2539,6 @@ static void routing_full_parse_Scluster(void) SURFXML_BUFFER_SET(host_availability_file, ""); A_surfxml_host_state = A_surfxml_host_state_ON; SURFXML_BUFFER_SET(host_state_file, ""); - SURFXML_BUFFER_SET(host_interference_send, "1.0"); - SURFXML_BUFFER_SET(host_interference_recv, "1.0"); - SURFXML_BUFFER_SET(host_interference_send_recv, "1.0"); - SURFXML_BUFFER_SET(host_max_outgoing_rate, "-1.0"); SURFXML_START_TAG(host); SURFXML_END_TAG(host); @@ -2316,11 +2564,11 @@ static void routing_full_parse_Scluster(void) } DEBUG0(" "); - router_id = bprintf("%srouter%s",cluster_prefix,cluster_suffix); - link_router = bprintf("%s_link_router",cluster_id); + router_id = bprintf("%s_%s_router%s",cluster_prefix,cluster_id,cluster_suffix); + link_router = bprintf("%s_link_%s_router",cluster_id,cluster_id); link_backbone = bprintf("%s_backbone",cluster_id); - DEBUG1("",router_id); + DEBUG1("",router_id); SURFXML_BUFFER_SET(router_id, router_id);; SURFXML_START_TAG(router); SURFXML_END_TAG(router); @@ -2359,32 +2607,101 @@ static void routing_full_parse_Scluster(void) new_suffix = bprintf("%s\\.%s",new_suffix,groups); } } - route_src_dst = bprintf("%s(.*)%s",cluster_prefix,new_suffix); + route_src_dst = bprintf("%s_(.*)%s",cluster_prefix,new_suffix); DEBUG0(" "); +#ifdef HAVE_PCRE_LIB + DEBUG2("",route_src_dst,route_src_dst); SURFXML_BUFFER_SET(route_src, route_src_dst); SURFXML_BUFFER_SET(route_dst, route_src_dst); SURFXML_START_TAG(route); DEBUG1("",cluster_id); - SURFXML_BUFFER_SET(link_c_ctn_id, bprintf("%s_link_$1src",cluster_id)); - SURFXML_START_TAG(link_c_ctn); - SURFXML_END_TAG(link_c_ctn); + SURFXML_BUFFER_SET(link_ctn_id, bprintf("%s_link_$1src",cluster_id)); + SURFXML_START_TAG(link_ctn); + SURFXML_END_TAG(link_ctn); DEBUG1("",cluster_id); - SURFXML_BUFFER_SET(link_c_ctn_id, bprintf("%s_backbone",cluster_id)); - SURFXML_START_TAG(link_c_ctn); - SURFXML_END_TAG(link_c_ctn); + SURFXML_BUFFER_SET(link_ctn_id, bprintf("%s_backbone",cluster_id)); + SURFXML_START_TAG(link_ctn); + SURFXML_END_TAG(link_ctn); DEBUG1("",cluster_id); - SURFXML_BUFFER_SET(link_c_ctn_id, bprintf("%s_link_$1dst",cluster_id)); - SURFXML_START_TAG(link_c_ctn); - SURFXML_END_TAG(link_c_ctn); + SURFXML_BUFFER_SET(link_ctn_id, bprintf("%s_link_$1dst",cluster_id)); + SURFXML_START_TAG(link_ctn); + SURFXML_END_TAG(link_ctn); DEBUG0(""); SURFXML_END_TAG(route); +#else + for(i=0 ; i<=xbt_dynar_length(tab_elements_num) ; i++) + { + for(j=0 ; j<=xbt_dynar_length(tab_elements_num) ; j++) + { + if(i == xbt_dynar_length(tab_elements_num)) + { + route_src = router_id; + } + else + { + route_src = bprintf("%s_%d%s",cluster_prefix,xbt_dynar_get_as(tab_elements_num,i,int),cluster_suffix); + } + + if(j == xbt_dynar_length(tab_elements_num)) + { + route_dst = router_id; + } + else + { + route_dst = bprintf("%s_%d%s",cluster_prefix,xbt_dynar_get_as(tab_elements_num,j,int),cluster_suffix); + } + + DEBUG2("",route_src,route_dst); + SURFXML_BUFFER_SET(route_src, route_src); + SURFXML_BUFFER_SET(route_dst, route_dst); + SURFXML_START_TAG(route); + + if(i == xbt_dynar_length(tab_elements_num)) + { + route_src = link_router; + } + else + { + route_src = bprintf("%s_link_%d",cluster_id,xbt_dynar_get_as(tab_elements_num,i,int)); + } + + if(j == xbt_dynar_length(tab_elements_num)) + { + route_dst = link_router; + } + else + { + route_dst = bprintf("%s_link_%d",cluster_id,xbt_dynar_get_as(tab_elements_num,j,int)); + } + + DEBUG1("",route_src); + SURFXML_BUFFER_SET(link_ctn_id, route_src); + SURFXML_START_TAG(link_ctn); + SURFXML_END_TAG(link_ctn); + + DEBUG1("",cluster_id); + SURFXML_BUFFER_SET(link_ctn_id, bprintf("%s_backbone",cluster_id)); + SURFXML_START_TAG(link_ctn); + SURFXML_END_TAG(link_ctn); + + DEBUG1("",route_dst); + SURFXML_BUFFER_SET(link_ctn_id, route_dst); + SURFXML_START_TAG(link_ctn); + SURFXML_END_TAG(link_ctn); + + DEBUG0(""); + SURFXML_END_TAG(route); + } + } + xbt_dynar_free(&tab_elements_num); +#endif DEBUG0(""); SURFXML_END_TAG(AS); @@ -2392,3 +2709,56 @@ static void routing_full_parse_Scluster(void) surfxml_bufferstack_pop(1); } + +/* + * New methods to init the routing model component from the lua script + */ + +/* + * calling parse_S_AS_lua with lua values + */ +void routing_AS_init(const char* AS_id,const char* AS_routing) +{ + parse_S_AS_lua((char*)AS_id,(char*)AS_routing); +} + +/* + * calling parse_E_AS_lua to fisnish the creation of routing component + */ +void routing_AS_end(const char *AS_id) +{ + parse_E_AS_lua((char*)AS_id); +} + +/* + * add a host to the network element list + */ + +void routing_add_host(const char* host_id) +{ + parse_S_host_lua((char*)host_id); +} + +/* + * Set a new link on the actual list of link for a route or ASroute + */ +void routing_add_link(const char* link_id) +{ + parse_E_link_c_ctn_new_elem_lua((char*)link_id); +} + +/* + *Set the endpoints for a route + */ +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); +} + +/* + * Store the route by calling parse_E_route_store_route + */ +void routing_store_route(void) +{ + parse_E_route_store_route(); +}