int COORD_ASR_LEVEL; //Coordinates level
int NS3_ASR_LEVEL; //host node for ns3
-static xbt_dict_t patterns = NULL;
static xbt_dict_t random_value = NULL;
/* Global vars */
routing_global_t global_routing = NULL;
-routing_component_t current_routing = NULL;
-model_type_t current_routing_model = NULL;
+AS_t current_routing = NULL;
/* global parse functions */
xbt_dynar_t link_list = NULL; /* temporary store of current list link 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 double_f_cpvoid_t get_link_latency = NULL;
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route, surf, "Routing part of surf");
struct s_model_type routing_models[] = {
{"Full",
"Full routing data (fast, large memory requirements, fully expressive)",
- model_full_create, model_full_load, model_full_unload, model_full_end},
+ model_full_create, model_full_end},
{"Floyd",
"Floyd routing data (slow initialization, fast lookup, lesser memory requirements, shortest path routing only)",
- model_floyd_create, model_floyd_load, model_floyd_unload, model_floyd_end},
+ model_floyd_create, model_floyd_end},
{"Dijkstra",
"Dijkstra routing data (fast initialization, slow lookup, small memory requirements, shortest path routing only)",
- model_dijkstra_create, model_dijkstra_both_load,
- model_dijkstra_both_unload, model_dijkstra_both_end},
+ model_dijkstra_create, 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},
+ model_dijkstracache_create, model_dijkstra_both_end},
{"none", "No routing (usable with Constant network only)",
- model_none_create, model_none_load, model_none_unload, model_none_end},
+ model_none_create, NULL},
{"RuleBased", "Rule-Based routing data (...)",
- model_rulebased_create, model_none_load, model_none_unload, model_none_end},
+ model_rulebased_create, NULL},
{"Vivaldi", "Vivaldi routing",
- model_vivaldi_create, model_none_load, model_none_unload, model_none_end},
+ model_vivaldi_create, NULL},
{"Cluster", "Cluster routing",
- model_cluster_create, model_none_load, model_cluster_unload, model_none_end},
- {NULL, NULL, NULL, NULL, NULL, NULL}
+ model_cluster_create, NULL},
+ {NULL, NULL, NULL, NULL}
};
/**
current_routing->hierarchy = SURF_ROUTING_BASE;
xbt_assert(!xbt_lib_get_or_null(host_lib, host->id, ROUTING_HOST_LEVEL),
"Reading a host, processing unit \"%s\" already exists", host->id);
- xbt_assert(current_routing->set_processing_unit,
- "no defined method \"set_processing_unit\" in \"%s\"",
- current_routing->name);
- (*(current_routing->set_processing_unit)) (current_routing, host->id);
+
+ (*(current_routing->parse_PU)) (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_assert(!xbt_lib_get_or_null(as_router_lib, router->id, ROUTING_ASR_LEVEL),
"Reading a router, processing unit \"%s\" already exists",
router->id);
- xbt_assert(current_routing->set_processing_unit,
- "no defined method \"set_processing_unit\" in \"%s\"",
- current_routing->name);
- (*(current_routing->set_processing_unit)) (current_routing, router->id);
+
+ (*(current_routing->parse_PU)) (current_routing, router->id);
info = xbt_new0(s_network_element_info_t, 1);
info->rc_component = current_routing;
info->rc_type = SURF_NETWORK_ELEMENT_ROUTER;
*/
static void routing_parse_E_route(void)
{
- name_route_extended_t route = xbt_new0(s_name_route_extended_t, 1);
+ route_extended_t route = xbt_new0(s_route_extended_t, 1);
route->generic_route.link_list = link_list;
- xbt_assert(current_routing->set_route,
+ xbt_assert(current_routing->parse_route,
"no defined method \"set_route\" in \"%s\"",
current_routing->name);
- (*(current_routing->set_route)) (current_routing, src, dst, route);
+ (*(current_routing->parse_route)) (current_routing, src, dst, route);
link_list = NULL;
src = NULL;
dst = NULL;
*/
static void routing_parse_E_ASroute(void)
{
- name_route_extended_t e_route = xbt_new0(s_name_route_extended_t, 1);
+ route_extended_t e_route = xbt_new0(s_route_extended_t, 1);
e_route->generic_route.link_list = link_list;
e_route->src_gateway = xbt_strdup(gw_src);
e_route->dst_gateway = xbt_strdup(gw_dst);
- xbt_assert(current_routing->set_ASroute,
+ xbt_assert(current_routing->parse_ASroute,
"no defined method \"set_ASroute\" in \"%s\"",
current_routing->name);
- (*(current_routing->set_ASroute)) (current_routing, src, dst, e_route);
+ (*(current_routing->parse_ASroute)) (current_routing, src, dst, e_route);
link_list = NULL;
src = NULL;
dst = NULL;
e_route->generic_route.link_list = link_list;
e_route->src_gateway = xbt_strdup(gw_src);
e_route->dst_gateway = xbt_strdup(gw_dst);
- xbt_assert(current_routing->set_bypassroute,
+ xbt_assert(current_routing->parse_bypassroute,
"Bypassing mechanism not implemented by routing '%s'",
current_routing->name);
- (*(current_routing->set_bypassroute)) (current_routing, src, dst, e_route);
+ (*(current_routing->parse_bypassroute)) (current_routing, src, dst, e_route);
link_list = NULL;
src = NULL;
dst = NULL;
* @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_open(const char *AS_id, const char *wanted_routing_type)
+void routing_AS_begin(const char *AS_id, const char *wanted_routing_type)
{
- routing_component_t new_routing;
- model_type_t model = NULL;
+ AS_t new_as;
+ routing_model_description_t model = NULL;
int cpt;
- surf_parse_models_setup(); /* ensure that the models are created after the last <config> tag and before the first <AS>-like */
-
/* search the routing model */
for (cpt = 0; routing_models[cpt].name; cpt++)
if (!strcmp(wanted_routing_type, routing_models[cpt].name))
}
/* make a new routing component */
- new_routing = (routing_component_t) (*(model->create)) ();
- new_routing->routing = model;
- new_routing->hierarchy = SURF_ROUTING_NULL;
- new_routing->name = xbt_strdup(AS_id);
- new_routing->routing_sons = xbt_dict_new();
+ new_as = (AS_t) (*(model->create)) ();
+ new_as->model_desc = model;
+ new_as->hierarchy = SURF_ROUTING_NULL;
+ new_as->name = xbt_strdup(AS_id);
if (current_routing == NULL && global_routing->root == NULL) {
/* it is the first one */
- new_routing->routing_father = NULL;
- global_routing->root = new_routing;
+ new_as->routing_father = NULL;
+ global_routing->root = new_as;
} else if (current_routing != NULL && global_routing->root != NULL) {
(current_routing->routing_sons, AS_id),
"The AS \"%s\" already exists", AS_id);
/* it is a part of the tree */
- new_routing->routing_father = current_routing;
+ 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,
- (void *) new_routing, NULL);
+ (void *) new_as, NULL);
/* add to the father element list */
- (*(current_routing->set_autonomous_system)) (current_routing, AS_id);
- /* unload the prev parse rules */
- (*(current_routing->routing->unload)) ();
-
+ (*(current_routing->parse_AS)) (current_routing, AS_id);
} else {
THROWF(arg_error, 0, "All defined components must be belong to a AS");
}
- /* set the new parse rules */
- (*(new_routing->routing->load)) ();
/* set the new current component of the tree */
- current_routing = new_routing;
+ current_routing = new_as;
}
/**
* even if you add stuff to a closed AS
*
*/
-void routing_AS_close()
+void routing_AS_end()
{
if (current_routing == NULL) {
xbt_lib_set(as_router_lib, current_routing->name, ROUTING_ASR_LEVEL,
(void *) info);
- (*(current_routing->routing->unload)) ();
- (*(current_routing->routing->end)) ();
+ if (current_routing->model_desc->end)
+ (*(current_routing->model_desc->end)) (current_routing);
current_routing = current_routing->routing_father;
- if (current_routing != NULL)
- (*(current_routing->routing->load)) ();
}
}
/* 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_lib_get_or_null(host_lib, name,
- ROUTING_HOST_LEVEL))->rc_component;
- return as_comp->name;
-}
-
-
/**
* \brief Get the AS father and the first elements of the chain
*
* father in the chain
*/
static void elements_father(const char *src, const char *dst,
- routing_component_t * res_father,
- routing_component_t * res_src,
- routing_component_t * res_dst)
+ AS_t * res_father,
+ AS_t * res_src,
+ AS_t * res_dst)
{
xbt_assert(src && dst, "bad parameters for \"elements_father\" method");
#define ELEMENTS_FATHER_MAXDEPTH 16 /* increase if it is not enough */
- routing_component_t src_as, dst_as;
- routing_component_t path_src[ELEMENTS_FATHER_MAXDEPTH];
- routing_component_t path_dst[ELEMENTS_FATHER_MAXDEPTH];
+ AS_t src_as, dst_as;
+ AS_t path_src[ELEMENTS_FATHER_MAXDEPTH];
+ AS_t path_dst[ELEMENTS_FATHER_MAXDEPTH];
int index_src = 0;
int index_dst = 0;
- routing_component_t current;
- routing_component_t current_src;
- routing_component_t current_dst;
- routing_component_t father;
+ AS_t current;
+ AS_t current_src;
+ AS_t current_dst;
+ AS_t father;
/* (1) find the as where the src and dst are located */
network_element_info_t src_data = xbt_lib_get_or_null(host_lib, src,
XBT_DEBUG("Solve route/latency \"%s\" to \"%s\"", src, dst);
xbt_assert(src && dst, "bad parameters for \"_get_route_latency\" method");
- routing_component_t common_father;
- routing_component_t src_father;
- routing_component_t dst_father;
+ AS_t common_father;
+ AS_t src_father;
+ AS_t dst_father;
elements_father(src, dst, &common_father, &src_father, &dst_father);
if (src_father == dst_father) { /* SURF_ROUTING_BASE */
static void get_route_latency(const char *src, const char *dst,
xbt_dynar_t * route, double *latency, int cleanup)
{
+ static xbt_dynar_t last_route = NULL;
+
_get_route_latency(src, dst, route, latency);
xbt_assert(!route || *route, "no route between \"%s\" and \"%s\"", src, dst);
xbt_assert(!latency || *latency >= 0.0,
"latency error on route between \"%s\" and \"%s\"", src, dst);
if (route) {
- xbt_dynar_free(&global_routing->last_route);
- global_routing->last_route = cleanup ? *route : NULL;
+ xbt_dynar_free(&last_route);
+ last_route = cleanup ? *route : NULL;
}
}
/**
- * \brief Generic method: find a route between hosts
+ * \brief Find a route between hosts
*
* \param src the source host name
* \param dst the destination host name
* by calling the differents "get_route" functions in each routing component.
* No need to free the returned dynar. It will be freed at the next call.
*/
-static xbt_dynar_t get_route(const char *src, const char *dst)
-{
+xbt_dynar_t routing_get_route(const char *src, const char *dst) {
xbt_dynar_t route = NULL;
get_route_latency(src, dst, &route, NULL, 1);
return route;
}
-/**
- * \brief Generic method: find a route between hosts
- *
- * \param src the source host name
- * \param dst the destination host name
- *
- * same as get_route, but return NULL if any exception is raised.
- */
-static xbt_dynar_t get_route_or_null(const char *src, const char *dst)
-{
- xbt_dynar_t route = NULL;
- xbt_ex_t exception;
- TRY {
- get_route_latency(src, dst, &route, NULL, 1);
- } CATCH(exception) {
- xbt_ex_free(exception);
- return NULL;
- }
- return route;
-}
-
/**
* \brief Generic method: find a route between hosts
*
return route;
}
-/*Get Latency*/
-static double get_latency(const char *src, const char *dst)
-{
- double latency = -1.0;
- get_route_latency(src, dst, NULL, &latency, 0);
- return latency;
-}
-
-static int surf_parse_models_setup_already_called = 0;
-/* Call the last initialization functions, that must be called after the
- * <config> tag, if any, and before the first of cluster|peer|AS|trace|trace_connect
- */
-void surf_parse_models_setup()
-{
- if (surf_parse_models_setup_already_called)
- return;
- surf_parse_models_setup_already_called = 1;
- surf_config_models_setup();
-}
-
-
-/**
- * \brief Recursive function for finalize
- *
- * \param rc the source host name
- *
- * This fuction is call by "finalize". It allow to finalize the
- * AS or routing components. It delete all the structures.
- */
-static void _finalize(routing_component_t rc)
-{
- if (rc) {
- xbt_dict_cursor_t cursor = NULL;
- char *key;
- routing_component_t elem;
- xbt_dict_foreach(rc->routing_sons, cursor, key, elem) {
- _finalize(elem);
- }
- xbt_dict_t tmp_sons = rc->routing_sons;
- char *tmp_name = rc->name;
- xbt_dict_free(&tmp_sons);
- xbt_free(tmp_name);
- xbt_assert(rc->finalize, "no defined method \"finalize\" in \"%s\"",
- current_routing->name);
- (*(rc->finalize)) (rc);
- }
-}
-
-/**
- * \brief Generic method: delete all the routing structures
- *
- * walk through the routing components tree and delete the structures
- * by calling the differents "finalize" functions in each routing component
- */
-static void finalize(void)
-{
- /* delete recursively all the tree */
- _finalize(global_routing->root);
- /* delete last_route */
- xbt_dynar_free(&(global_routing->last_route));
- /* delete global routing structure */
- xbt_free(global_routing);
- /* make sure that we will reinit the models while loading the platf once reinited -- HACK but there is no proper surf_routing_init() */
- surf_parse_models_setup_already_called = 0;
-}
-
-static xbt_dynar_t recursive_get_onelink_routes(routing_component_t rc)
+static xbt_dynar_t recursive_get_onelink_routes(AS_t rc)
{
xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free);
//recursing
char *key;
xbt_dict_cursor_t cursor = NULL;
- routing_component_t rc_child;
+ AS_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) {
return recursive_get_onelink_routes(global_routing->root);
}
-e_surf_network_element_type_t get_network_element_type(const char *name)
+e_surf_network_element_type_t routing_get_network_element_type(const char *name)
{
network_element_info_t rc = NULL;
*
* Make a global routing structure and set all the parsing functions.
*/
-void routing_model_create(size_t size_of_links, void *loopback,
- double_f_cpvoid_t get_link_latency_fun)
+void routing_model_create(size_t size_of_links, void *loopback)
{
/* config the uniq global routing */
global_routing = xbt_new0(s_routing_global_t, 1);
global_routing->root = NULL;
- global_routing->get_route = get_route;
- global_routing->get_route_or_null = get_route_or_null;
- 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_route_latency = get_route_latency;
- 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;
- global_routing->last_route = NULL;
- get_link_latency = get_link_latency_fun;
/* no current routing at moment */
current_routing = NULL;
}
/* ************************************************************************** */
/* ************************* GENERIC PARSE FUNCTIONS ************************ */
-void generic_set_processing_unit(routing_component_t rc, const char *name)
-{
- XBT_DEBUG("Load process unit \"%s\"", name);
- int *id = xbt_new0(int, 1);
- xbt_dict_t _to_index;
- _to_index = current_routing->to_index;
- *id = xbt_dict_length(_to_index);
- xbt_dict_set(_to_index, name, id, xbt_free);
-}
-
-void generic_set_autonomous_system(routing_component_t rc, const char *name)
-{
- XBT_DEBUG("Load Autonomous system \"%s\"", name);
- int *id = xbt_new0(int, 1);
- xbt_dict_t _to_index;
- _to_index = current_routing->to_index;
- *id = xbt_dict_length(_to_index);
- xbt_dict_set(_to_index, name, id, xbt_free);
-}
-
-int surf_pointer_resource_cmp(const void *a, const void *b)
-{
- return a != b;
-}
-
-int surf_link_resource_cmp(const void *a, const void *b)
-{
- return ! !memcmp(a, b, global_routing->size_of_link);
-}
-
-void generic_set_bypassroute(routing_component_t rc,
- const char *src, const char *dst,
- route_extended_t e_route)
-{
- XBT_DEBUG("Load bypassRoute from \"%s\" to \"%s\"", src, dst);
- xbt_dict_t dict_bypassRoutes = rc->bypassRoutes;
- char *route_name;
-
- route_name = bprintf("%s#%s", src, dst);
- xbt_assert(xbt_dynar_length(e_route->generic_route.link_list) > 0,
- "Invalid count of links, must be greater than zero (%s,%s)",
- src, dst);
- xbt_assert(!xbt_dict_get_or_null(dict_bypassRoutes, route_name),
- "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 =
- generic_new_extended_route(SURF_ROUTING_RECURSIVE, e_route, 0);
- xbt_dynar_free(&(e_route->generic_route.link_list));
- xbt_free(e_route);
-
- xbt_dict_set(dict_bypassRoutes, route_name, new_e_route,
- (void (*)(void *)) generic_free_extended_route);
- xbt_free(route_name);
-}
-
-/* ************************************************************************** */
-/* *********************** GENERIC BUSINESS METHODS ************************* */
-
-double generic_get_link_latency(routing_component_t rc,
- const char *src, const char *dst,
- route_extended_t route)
-{
- int need_to_clean = route ? 0 : 1;
- void *link;
- unsigned int i;
- double latency = 0.0;
-
- route = route ? route : rc->get_route(rc, src, dst);
-
- xbt_dynar_foreach(route->generic_route.link_list, i, link) {
- latency += get_link_latency(link);
- }
- if (need_to_clean)
- generic_free_extended_route(route);
- return latency;
-}
-
-xbt_dynar_t generic_get_onelink_routes(routing_component_t rc)
-{
- xbt_die("\"generic_get_onelink_routes\" not implemented yet");
-}
-
-route_extended_t generic_get_bypassroute(routing_component_t rc,
- const char *src, const char *dst)
-{
- xbt_dict_t dict_bypassRoutes = rc->bypassRoutes;
- routing_component_t src_as, dst_as;
- int index_src, index_dst;
- xbt_dynar_t path_src = NULL;
- xbt_dynar_t path_dst = NULL;
- routing_component_t current = NULL;
- routing_component_t *current_src = NULL;
- routing_component_t *current_dst = NULL;
-
- /* (1) find the as where the src and dst are located */
- void *src_data = xbt_lib_get_or_null(host_lib, src, ROUTING_HOST_LEVEL);
- void *dst_data = xbt_lib_get_or_null(host_lib, dst, ROUTING_HOST_LEVEL);
- if (!src_data)
- src_data = xbt_lib_get_or_null(as_router_lib, src, ROUTING_ASR_LEVEL);
- if (!dst_data)
- dst_data = xbt_lib_get_or_null(as_router_lib, dst, ROUTING_ASR_LEVEL);
-
- if (src_data == NULL || dst_data == NULL)
- xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"",
- src, dst, rc->name);
-
- src_as = ((network_element_info_t) src_data)->rc_component;
- dst_as = ((network_element_info_t) dst_data)->rc_component;
-
- /* (2) find the path to the root routing component */
- path_src = xbt_dynar_new(sizeof(routing_component_t), NULL);
- current = src_as;
- while (current != NULL) {
- xbt_dynar_push(path_src, ¤t);
- current = current->routing_father;
- }
- path_dst = xbt_dynar_new(sizeof(routing_component_t), NULL);
- current = dst_as;
- while (current != NULL) {
- xbt_dynar_push(path_dst, ¤t);
- current = current->routing_father;
- }
-
- /* (3) find the common father */
- index_src = path_src->used - 1;
- index_dst = path_dst->used - 1;
- current_src = xbt_dynar_get_ptr(path_src, index_src);
- current_dst = xbt_dynar_get_ptr(path_dst, index_dst);
- while (index_src >= 0 && index_dst >= 0 && *current_src == *current_dst) {
- xbt_dynar_pop_ptr(path_src);
- xbt_dynar_pop_ptr(path_dst);
- index_src--;
- index_dst--;
- current_src = xbt_dynar_get_ptr(path_src, index_src);
- current_dst = xbt_dynar_get_ptr(path_dst, index_dst);
- }
-
- 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;
-
- route_extended_t e_route_bypass = NULL;
-
- for (max = 0; max <= max_index; max++) {
- for (i = 0; i < max; i++) {
- if (i <= max_index_src && max <= max_index_dst) {
- char *route_name = bprintf("%s#%s",
- (*(routing_component_t *)
- (xbt_dynar_get_ptr(path_src, i)))->name,
- (*(routing_component_t *)
- (xbt_dynar_get_ptr(path_dst, max)))->name);
- e_route_bypass = xbt_dict_get_or_null(dict_bypassRoutes, route_name);
- xbt_free(route_name);
- }
- if (e_route_bypass)
- break;
- if (max <= max_index_src && i <= max_index_dst) {
- char *route_name = bprintf("%s#%s",
- (*(routing_component_t *)
- (xbt_dynar_get_ptr(path_src, max)))->name,
- (*(routing_component_t *)
- (xbt_dynar_get_ptr(path_dst, i)))->name);
- e_route_bypass = xbt_dict_get_or_null(dict_bypassRoutes, route_name);
- xbt_free(route_name);
- }
- if (e_route_bypass)
- break;
- }
-
- if (e_route_bypass)
- break;
-
- if (max <= max_index_src && max <= max_index_dst) {
- char *route_name = bprintf("%s#%s",
- (*(routing_component_t *)
- (xbt_dynar_get_ptr(path_src, max)))->name,
- (*(routing_component_t *)
- (xbt_dynar_get_ptr(path_dst, max)))->name);
- e_route_bypass = xbt_dict_get_or_null(dict_bypassRoutes, route_name);
- xbt_free(route_name);
- }
- if (e_route_bypass)
- break;
- }
-
- xbt_dynar_free(&path_src);
- xbt_dynar_free(&path_dst);
-
- route_extended_t new_e_route = NULL;
-
- if (e_route_bypass) {
- void *link;
- unsigned int cpt = 0;
- new_e_route = xbt_new0(s_route_extended_t, 1);
- new_e_route->src_gateway = xbt_strdup(e_route_bypass->src_gateway);
- new_e_route->dst_gateway = xbt_strdup(e_route_bypass->dst_gateway);
- new_e_route->generic_route.link_list =
- xbt_dynar_new(global_routing->size_of_link, NULL);
- xbt_dynar_foreach(e_route_bypass->generic_route.link_list, cpt, link) {
- xbt_dynar_push(new_e_route->generic_route.link_list, &link);
- }
- }
-
- return new_e_route;
-}
-
-/* ************************************************************************** */
-/* ************************* GENERIC AUX FUNCTIONS ************************** */
-
-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_assert(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_lib_get_or_null(link_lib, link_name, SURF_LINK_LEVEL);
- if (link) {
- if (order)
- xbt_dynar_push(links_id, &link);
- else
- xbt_dynar_unshift(links_id, &link);
- } else
- THROWF(mismatch_error, 0, "Link %s not found", link_name);
- }
-
- return new_route;
-}
-
-route_extended_t
-generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy,
- void *data, int order)
-{
-
- char *link_name;
- route_extended_t e_route, new_e_route;
- route_t route;
- unsigned int cpt;
- xbt_dynar_t links = NULL, links_id = NULL;
-
- new_e_route = xbt_new0(s_route_extended_t, 1);
- new_e_route->generic_route.link_list =
- xbt_dynar_new(global_routing->size_of_link, NULL);
- new_e_route->src_gateway = NULL;
- new_e_route->dst_gateway = NULL;
-
- xbt_assert(hierarchy == SURF_ROUTING_BASE
- || hierarchy == SURF_ROUTING_RECURSIVE,
- "the hierarchy type is not defined");
-
- if (hierarchy == SURF_ROUTING_BASE) {
-
- route = (route_t) data;
- links = route->link_list;
-
- } else if (hierarchy == SURF_ROUTING_RECURSIVE) {
-
- e_route = (route_extended_t) data;
- xbt_assert(e_route->src_gateway
- && e_route->dst_gateway, "bad gateway, is null");
- links = e_route->generic_route.link_list;
-
- /* remeber not erase the gateway names */
- new_e_route->src_gateway = strdup(e_route->src_gateway);
- new_e_route->dst_gateway = strdup(e_route->dst_gateway);
- }
-
- links_id = new_e_route->generic_route.link_list;
-
- xbt_dynar_foreach(links, cpt, link_name) {
-
- void *link = xbt_lib_get_or_null(link_lib, link_name, SURF_LINK_LEVEL);
- if (link) {
- if (order)
- xbt_dynar_push(links_id, &link);
- else
- xbt_dynar_unshift(links_id, &link);
- } else
- THROWF(mismatch_error, 0, "Link %s not found", link_name);
- }
-
- return new_e_route;
-}
-
-void generic_free_route(route_t route)
-{
- if (route) {
- xbt_dynar_free(&(route->link_list));
- xbt_free(route);
- }
-}
-
-void generic_free_extended_route(route_extended_t e_route)
-{
- if (e_route) {
- xbt_dynar_free(&(e_route->generic_route.link_list));
- xbt_free(e_route->src_gateway);
- xbt_free(e_route->dst_gateway);
- xbt_free(e_route);
- }
-}
-
-static routing_component_t generic_as_exist(routing_component_t find_from,
- routing_component_t to_find)
-{
- //return to_find; // FIXME: BYPASSERROR OF FOREACH WITH BREAK
- xbt_dict_cursor_t cursor = NULL;
- char *key;
- int found = 0;
- routing_component_t elem;
- xbt_dict_foreach(find_from->routing_sons, cursor, key, elem) {
- if (to_find == elem || generic_as_exist(elem, to_find)) {
- found = 1;
- break;
- }
- }
- if (found)
- return to_find;
- return NULL;
-}
-
-routing_component_t
-generic_autonomous_system_exist(routing_component_t rc, char *element)
-{
- //return rc; // FIXME: BYPASSERROR OF FOREACH WITH BREAK
- routing_component_t element_as, result, elem;
- xbt_dict_cursor_t cursor = NULL;
- char *key;
- element_as = ((network_element_info_t)
- xbt_lib_get_or_null(as_router_lib, element,
- ROUTING_ASR_LEVEL))->rc_component;
- result = ((routing_component_t) - 1);
- if (element_as != rc)
- result = generic_as_exist(rc, element_as);
-
- int found = 0;
- if (result) {
- xbt_dict_foreach(element_as->routing_sons, cursor, key, elem) {
- found = !strcmp(elem->name, element);
- if (found)
- break;
- }
- if (found)
- return element_as;
- }
- return NULL;
-}
-
-routing_component_t
-generic_processing_units_exist(routing_component_t rc, char *element)
-{
- routing_component_t element_as;
- element_as = ((network_element_info_t)
- xbt_lib_get_or_null(host_lib,
- element, ROUTING_HOST_LEVEL))->rc_component;
- if (element_as == rc)
- return element_as;
- return generic_as_exist(rc, element_as);
-}
-
-void generic_src_dst_check(routing_component_t rc, const char *src,
- const char *dst)
-{
-
- void *src_data = xbt_lib_get_or_null(host_lib, src, ROUTING_HOST_LEVEL);
- void *dst_data = xbt_lib_get_or_null(host_lib, dst, ROUTING_HOST_LEVEL);
- if (!src_data)
- src_data = xbt_lib_get_or_null(as_router_lib, src, ROUTING_ASR_LEVEL);
- if (!dst_data)
- dst_data = xbt_lib_get_or_null(as_router_lib, dst, ROUTING_ASR_LEVEL);
-
- if (src_data == NULL || dst_data == NULL)
- xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"",
- src, dst, rc->name);
-
- routing_component_t src_as =
- ((network_element_info_t) src_data)->rc_component;
- routing_component_t dst_as =
- ((network_element_info_t) dst_data)->rc_component;
-
- if (src_as != dst_as)
- xbt_die("The src(%s in %s) and dst(%s in %s) are in differents AS",
- src, src_as->name, dst, dst_as->name);
- if (rc != dst_as)
- xbt_die
- ("The routing component of src'%s' and dst'%s' is not the same as the network elements belong (%s?=%s?=%s)",
- src, dst, src_as->name, dst_as->name, rc->name);
-}
static void routing_parse_cluster(void)
{
char *host_id, *groups, *link_id = NULL;
+ xbt_dict_t patterns = NULL;
s_sg_platf_host_cbarg_t host;
s_sg_platf_link_cbarg_t link;
+ unsigned int iter;
+ int start, end, i;
+ xbt_dynar_t radical_elements;
+ xbt_dynar_t radical_ends;
+
if (strcmp(struct_cluster->availability_trace, "")
|| strcmp(struct_cluster->state_trace, "")) {
- if (xbt_dict_size(patterns) == 0)
- patterns = xbt_dict_new();
+ patterns = xbt_dict_new();
xbt_dict_set(patterns, "id", xbt_strdup(struct_cluster->id), free);
xbt_dict_set(patterns, "prefix", xbt_strdup(struct_cluster->prefix), free);
xbt_dict_set(patterns, "suffix", xbt_strdup(struct_cluster->suffix), free);
}
- unsigned int iter;
- int start, end, i;
- xbt_dynar_t radical_elements;
- xbt_dynar_t radical_ends;
XBT_DEBUG("<AS id=\"%s\"\trouting=\"Cluster\">", struct_cluster->id);
- sg_platf_new_AS_open(struct_cluster->id, "Cluster");
+ sg_platf_new_AS_begin(struct_cluster->id, "Cluster");
//Make all hosts
radical_elements = xbt_str_split(struct_cluster->radical, ",");
xbt_dynar_foreach(radical_elements, iter, groups) {
- memset(&host, 0, sizeof(host));
radical_ends = xbt_str_split(groups, "-");
start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *));
bprintf("%s%d%s", struct_cluster->prefix, i, struct_cluster->suffix);
link_id = bprintf("%s_link_%d", struct_cluster->id, i);
- XBT_DEBUG("<host\tid=\"%s\"\tpower=\"%f\">", host_id,
- struct_cluster->power);
+ XBT_DEBUG("<host\tid=\"%s\"\tpower=\"%f\">", host_id, struct_cluster->power);
+
+ memset(&host, 0, sizeof(host));
host.id = host_id;
if (strcmp(struct_cluster->availability_trace, "")) {
xbt_dict_set(patterns, "radical", bprintf("%d", i), xbt_free);
- char *tmp_availability_file =
- xbt_strdup(struct_cluster->availability_trace);
- xbt_str_varsubst(tmp_availability_file, patterns);
- XBT_DEBUG("\tavailability_file=\"%s\"", tmp_availability_file);
- host.power_trace = tmgr_trace_new(tmp_availability_file);
- xbt_free(tmp_availability_file);
+ char *avail_file = xbt_str_varsubst(struct_cluster->availability_trace, patterns);
+ XBT_DEBUG("\tavailability_file=\"%s\"", avail_file);
+ host.power_trace = tmgr_trace_new(avail_file);
+ xbt_free(avail_file);
} else {
XBT_DEBUG("\tavailability_file=\"\"");
}
+
if (strcmp(struct_cluster->state_trace, "")) {
- char *tmp_state_file = xbt_strdup(struct_cluster->state_trace);
- xbt_str_varsubst(tmp_state_file, patterns);
- XBT_DEBUG("\tstate_file=\"%s\"", tmp_state_file);
- host.state_trace = tmgr_trace_new(tmp_state_file);
- xbt_free(tmp_state_file);
+ char *avail_file = xbt_str_varsubst(struct_cluster->state_trace, patterns);
+ XBT_DEBUG("\tstate_file=\"%s\"", avail_file);
+ host.state_trace = tmgr_trace_new(avail_file);
+ xbt_free(avail_file);
} else {
XBT_DEBUG("\tstate_file=\"\"");
}
}
xbt_dynar_free(&radical_elements);
- // Add a router. It is magically used thanks to the way in which surf_routing_cluster is written, and it's very useful to connect clusters together
+ // Add a router. It is magically used thanks to the way in which surf_routing_cluster is written,
+ // and it's very useful to connect clusters together
XBT_DEBUG(" ");
XBT_DEBUG("<router id=\"%s\"/>", struct_cluster->router_id);
- s_sg_platf_router_cbarg_t router;
char *newid = NULL;
+ s_sg_platf_router_cbarg_t router;
memset(&router, 0, sizeof(router));
router.id = struct_cluster->router_id;
router.coord = "";
sg_platf_new_link(&link);
- surf_parsing_link_up_down_t info =
- xbt_new0(s_surf_parsing_link_up_down_t, 1);
- info->link_up =
- xbt_lib_get_or_null(link_lib, link_backbone, SURF_LINK_LEVEL);
- info->link_down = info->link_up;
- surf_routing_cluster_add_link(struct_cluster->id, info);
+ surf_routing_cluster_add_backbone(current_routing, xbt_lib_get_or_null(link_lib, link_backbone, SURF_LINK_LEVEL));
free(link_backbone);
}
- XBT_DEBUG(" ");
-
- char *new_suffix = xbt_strdup("");
-
- radical_elements = xbt_str_split(struct_cluster->suffix, ".");
- xbt_dynar_foreach(radical_elements, iter, groups) {
- if (strcmp(groups, "")) {
- char *old_suffix = new_suffix;
- new_suffix = bprintf("%s\\.%s", old_suffix, groups);
- free(old_suffix);
- }
- }
-
- xbt_dynar_free(&radical_elements);
- xbt_free(new_suffix);
-
- if (strcmp(struct_cluster->availability_trace, "")
- || strcmp(struct_cluster->state_trace, ""))
- xbt_dict_free(&patterns);
-
XBT_DEBUG("</AS>");
- sg_platf_new_AS_close();
+ sg_platf_new_AS_end();
XBT_DEBUG(" ");
+ xbt_dict_free(&patterns); // no op if it were never set
}
-/*
- * This function take a string and replace parameters from patterns dict.
- * It returns the new value.
- */
-static char *replace_random_parameter(char *string)
-{
- char *test_string = NULL;
-
- if (xbt_dict_size(random_value) == 0)
- return string;
-
- string = xbt_str_varsubst(string, patterns); // for patterns of cluster
- test_string = bprintf("${%s}", string);
- test_string = xbt_str_varsubst(test_string, random_value); //Add ${xxxxx} for random Generator
-
- if (strcmp(test_string, "")) { //if not empty, keep this value.
- xbt_free(string);
- string = test_string;
- } //In other case take old value (without ${})
- else
- free(test_string);
- return string;
-}
-
-static void routing_parse_postparse(void)
-{
+static void routing_parse_postparse(void) {
xbt_dict_free(&random_value);
- xbt_dict_free(&patterns);
}
static void routing_parse_peer(sg_platf_peer_cbarg_t peer)
surfxml_bufferstack_push(1);
XBT_DEBUG("<AS id=\"%s\"\trouting=\"Full\">", peer->id);
- sg_platf_new_AS_open(peer->id, "Full");
+ sg_platf_new_AS_begin(peer->id, "Full");
XBT_DEBUG(" ");
host_id = HOST_PEER(peer->id);
SURFXML_END_TAG(route);
XBT_DEBUG("</AS>");
- sg_platf_new_AS_close();
+ sg_platf_new_AS_end();
XBT_DEBUG(" ");
//xbt_dynar_free(&tab_elements_num);
instr_routing_define_callbacks();
#endif
}
+
+/**
+ * \brief Recursive function for finalize
+ *
+ * \param rc the source host name
+ *
+ * This fuction is call by "finalize". It allow to finalize the
+ * AS or routing components. It delete all the structures.
+ */
+static void finalize_rec(AS_t as) {
+ xbt_dict_cursor_t cursor = NULL;
+ char *key;
+ AS_t elem;
+
+ xbt_dict_foreach(as->routing_sons, cursor, key, elem) {
+ finalize_rec(elem);
+ }
+
+ as->finalize(as);
+}
+
+/** \brief Frees all memory allocated by the routing module */
+void routing_exit(void) {
+ if (!global_routing)
+ return;
+ finalize_rec(global_routing->root);
+ xbt_free(global_routing);
+}