} e_surf_routing_hierarchy_t;
typedef struct s_as {
- int nb_index;
+ xbt_dynar_t index_network_elm;
xbt_dict_t bypassRoutes; /* store bypass routes */
routing_model_description_t model_desc;
e_surf_routing_hierarchy_t hierarchy;
* that a new element is added to the AS currently built.
*
* Of course, only the routing model of this AS is informed, not every ones */
- int (*parse_PU) (AS_t as, const char *name); /* A host or a router, whatever */
- int (*parse_AS) (AS_t as, const char *name);
+ int (*parse_PU) (AS_t as, network_element_t elm); /* A host or a router, whatever */
+ int (*parse_AS) (AS_t as, network_element_t elm);
void (*parse_route) (AS_t as, const char *src,
const char *dst, route_t route);
void (*parse_ASroute) (AS_t as, const char *src,
info->rc_component = current_routing;
info->rc_type = SURF_NETWORK_ELEMENT_HOST;
info->name = xbt_strdup(host->id);
- info->id = current_routing->parse_PU(current_routing, host->id);
+ info->id = current_routing->parse_PU(current_routing, (void *) info);
xbt_lib_set(host_lib, host->id, ROUTING_HOST_LEVEL, (void *) info);
XBT_DEBUG("Having set name '%s' id '%d'",host->id,info->id);
info->rc_component = current_routing;
info->rc_type = SURF_NETWORK_ELEMENT_ROUTER;
info->name = xbt_strdup(router->id);
- info->id = current_routing->parse_PU(current_routing, router->id);
+ info->id = current_routing->parse_PU(current_routing, (void *) info);
xbt_lib_set(as_router_lib, router->id, ROUTING_ASR_LEVEL, (void *) info);
XBT_DEBUG("Having set name '%s' id '%d'",router->id,info->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, AS_id);
+ info->id = current_routing->parse_AS(current_routing, (void *) info);
} else {
THROWF(arg_error, 0, "All defined components must be belong to a AS");
}
static xbt_dynar_t dijkstra_get_onelink_routes(AS_t as)
{
xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free);
- THROW_UNIMPLEMENTED;
-// //size_t table_size = xbt_dict_length(routing->generic_routing.to_index);
-// xbt_dict_cursor_t c1 = NULL, c2 = NULL;
-// char *k1, *d1, *k2, *d2;
-// xbt_dict_foreach(as->to_index, c1, k1, d1) {
-// xbt_dict_foreach(as->to_index, c2, k2, d2) {
-// route_t route = xbt_new0(s_route_t,1);
-// route->link_list = xbt_dynar_new(global_routing->size_of_link,NULL);
-// dijkstra_get_route_and_latency(as, k1, k2,route, NULL);
-//
-// if (xbt_dynar_length(route->link_list) == 1) {
-// void *link =
-// *(void **) xbt_dynar_get_ptr(route->link_list, 0);
-// onelink_t onelink = xbt_new0(s_onelink_t, 1);
-// onelink->link_ptr = link;
-// if (as->hierarchy == SURF_ROUTING_BASE) {
-// onelink->src = xbt_strdup(k1);
-// onelink->dst = xbt_strdup(k2);
-// } else if (as->hierarchy ==
-// SURF_ROUTING_RECURSIVE) {
-// onelink->src = route->src_gateway;
-// onelink->dst = route->dst_gateway;
-// }
-// xbt_dynar_push(ret, &onelink);
-// }
-// }
-// }
+ route_t route = xbt_new0(s_route_t,1);
+ route->link_list = xbt_dynar_new(global_routing->size_of_link,NULL);
+
+ int src,dst;
+ network_element_t src_elm, dst_elm;
+ size_t table_size = xbt_dynar_length(as->index_network_elm);
+ for(src=0; src < table_size; src++) {
+ for(dst=0; dst< table_size; dst++) {
+ xbt_dynar_reset(route->link_list);
+ src_elm = xbt_dynar_get_as(as->index_network_elm,src,network_element_t);
+ dst_elm = xbt_dynar_get_as(as->index_network_elm,dst,network_element_t);
+ dijkstra_get_route_and_latency(as, src_elm, dst_elm,route, NULL);
+
+ if (xbt_dynar_length(route->link_list) == 1) {
+ void *link = *(void **) xbt_dynar_get_ptr(route->link_list, 0);
+ onelink_t onelink = xbt_new0(s_onelink_t, 1);
+ onelink->link_ptr = link;
+ if (as->hierarchy == SURF_ROUTING_BASE) {
+ onelink->src = src_elm;
+ onelink->dst = dst_elm;
+ } else if (as->hierarchy == SURF_ROUTING_RECURSIVE) {
+ onelink->src = route->src_gateway;
+ onelink->dst = route->dst_gateway;
+ }
+ xbt_dynar_push(ret, &onelink);
+ }
+ }
+ }
return ret;
}
static xbt_dynar_t floyd_get_onelink_routes(AS_t asg)
{
xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free);
- THROW_UNIMPLEMENTED;
-// route_t route = xbt_new0(s_route_t, 1);
-// route->link_list = xbt_dynar_new(global_routing->size_of_link, NULL);
-//
-// xbt_dict_cursor_t c1 = NULL, c2 = NULL;
-// char *k1, *d1, *k2, *d2;
-// xbt_dict_foreach(asg->to_index, c1, k1, d1) {
-// xbt_dict_foreach(asg->to_index, c2, k2, d2) {
-// xbt_dynar_reset(route->link_list);
-// floyd_get_route_and_latency(asg, k1, k2, route, NULL);
-// if (xbt_dynar_length(route->link_list) == 1) {
-// void *link = *(void **) xbt_dynar_get_ptr(route->link_list, 0);
-// onelink_t onelink = xbt_new0(s_onelink_t, 1);
-// onelink->link_ptr = link;
-// if (asg->hierarchy == SURF_ROUTING_BASE) {
-// onelink->src = xbt_strdup(k1);
-// onelink->dst = xbt_strdup(k2);
-// } else if (asg->hierarchy == SURF_ROUTING_RECURSIVE) {
-// onelink->src = route->src_gateway;
-// onelink->dst = route->dst_gateway;
-// }
-// xbt_dynar_push(ret, &onelink);
-// }
-// }
-// }
+ route_t route = xbt_new0(s_route_t, 1);
+ route->link_list = xbt_dynar_new(global_routing->size_of_link, NULL);
+
+ int src,dst;
+ network_element_t src_elm, dst_elm;
+ int table_size = xbt_dynar_length(asg->index_network_elm);
+ for(src=0; src < table_size; src++) {
+ for(dst=0; dst< table_size; dst++) {
+ xbt_dynar_reset(route->link_list);
+ src_elm = xbt_dynar_get_as(asg->index_network_elm,src,network_element_t);
+ dst_elm = xbt_dynar_get_as(asg->index_network_elm,dst,network_element_t);
+ floyd_get_route_and_latency(asg, src_elm, dst_elm, route, NULL);
+
+ if (xbt_dynar_length(route->link_list) == 1) {
+ void *link = *(void **) xbt_dynar_get_ptr(route->link_list, 0);
+ onelink_t onelink = xbt_new0(s_onelink_t, 1);
+ onelink->link_ptr = link;
+ if (asg->hierarchy == SURF_ROUTING_BASE) {
+ onelink->src = src_elm;
+ onelink->dst = dst_elm;
+ } else if (asg->hierarchy == SURF_ROUTING_RECURSIVE) {
+ onelink->src = route->src_gateway;
+ onelink->dst = route->dst_gateway;
+ }
+ xbt_dynar_push(ret, &onelink);
+ }
+ }
+ }
+
return ret;
}
/* set utils vars */
as_floyd_t as = (as_floyd_t)asg;
- size_t table_size = asg->nb_index;
+ size_t table_size = xbt_dynar_length(asg->index_network_elm);
generic_src_dst_check(asg, src, dst);
int *src_id = &(src->id);
int i, j;
size_t table_size;
if (as) {
- table_size = as->generic_routing.nb_index;
+ table_size = xbt_dynar_length(as->generic_routing.index_network_elm);
/* Delete link_table */
for (i = 0; i < table_size; i++)
for (j = 0; j < table_size; j++)
unsigned int i, j, a, b, c;
/* set the size of table routing */
- size_t table_size = as->generic_routing.nb_index;
+ size_t table_size = xbt_dynar_length(as->generic_routing.index_network_elm);
if(!as->link_table)
{
as_floyd_t as = (as_floyd_t) rc;
/* set the size of table routing */
- size_t table_size = rc->nb_index;
+ size_t table_size = xbt_dynar_length(rc->index_network_elm);
network_element_t src_net_elm, dst_net_elm;
src_net_elm = (network_element_t)xbt_lib_get_or_null(host_lib, src, ROUTING_HOST_LEVEL);
static xbt_dynar_t full_get_onelink_routes(AS_t rc)
{
xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free);
-THROW_UNIMPLEMENTED;
-// routing_component_full_t routing = (routing_component_full_t) rc;
-// size_t table_size = routing->generic_routing.nb_index;
-// xbt_dict_cursor_t c1 = NULL, c2 = NULL;
-// char *k1, *d1, *k2, *d2;
-// xbt_dict_foreach(routing->generic_routing.to_index, c1, k1, d1) {
-// xbt_dict_foreach(routing->generic_routing.to_index, c2, k2, d2) {
-// int *src_id = xbt_dict_get_or_null(routing->generic_routing.to_index, k1);
-// int *dst_id = xbt_dict_get_or_null(routing->generic_routing.to_index, k2);
-// xbt_assert(src_id && dst_id,
-// "Ask for route \"from\"(%s) or \"to\"(%s) "
-// "no found in the local table", k1, k2);
-// route_t route = TO_ROUTE_FULL(*src_id, *dst_id);
-// if (route) {
-// if (xbt_dynar_length(route->link_list) == 1) {
-// void *link = *(void **) xbt_dynar_get_ptr(route->link_list, 0);
-// onelink_t onelink = xbt_new0(s_onelink_t, 1);
-// onelink->link_ptr = link;
-// if (routing->generic_routing.hierarchy == SURF_ROUTING_BASE) {
-// onelink->src->routing_obj->name = xbt_strdup(k1);
-// onelink->src->routing_obj->id = atoi(k1);
-// onelink->dst->routing_obj->name = xbt_strdup(k2);
-// onelink->dst->routing_obj->id = atoi(k2);
-// } else if (routing->generic_routing.hierarchy ==
-// SURF_ROUTING_RECURSIVE) {
-// onelink->src = route->src_gateway;
-// onelink->dst = route->dst_gateway;
-// }
-// xbt_dynar_push(ret, &onelink);
-// }
-// }
-// }
-// }
+ routing_component_full_t routing = (routing_component_full_t) rc;
+
+ int src,dst;
+ int table_size = xbt_dynar_length(rc->index_network_elm);
+
+ for(src=0; src < table_size; src++) {
+ for(dst=0; dst< table_size; dst++) {
+ route_t route = TO_ROUTE_FULL(src, dst);
+ if (route) {
+ if (xbt_dynar_length(route->link_list) == 1) {
+ void *link = *(void **) xbt_dynar_get_ptr(route->link_list, 0);
+ onelink_t onelink = xbt_new0(s_onelink_t, 1);
+ onelink->link_ptr = link;
+ if (routing->generic_routing.hierarchy == SURF_ROUTING_BASE) {
+ onelink->src = xbt_dynar_get_as(routing->generic_routing.index_network_elm,src,network_element_t);
+ onelink->src->id = src;
+ onelink->dst = xbt_dynar_get_as(routing->generic_routing.index_network_elm,dst,network_element_t);
+ onelink->dst->id = dst;
+ } else if (routing->generic_routing.hierarchy ==
+ SURF_ROUTING_RECURSIVE) {
+ onelink->src = route->src_gateway;
+ onelink->dst = route->dst_gateway;
+ }
+ xbt_dynar_push(ret, &onelink);
+ }
+ }
+ }
+ }
return ret;
}
/* set utils vars */
routing_component_full_t routing = (routing_component_full_t) rc;
- size_t table_size = routing->generic_routing.nb_index;
+ size_t table_size = xbt_dynar_length(routing->generic_routing.index_network_elm);
route_t e_route = NULL;
void *link;
static void full_finalize(AS_t rc)
{
routing_component_full_t routing = (routing_component_full_t) rc;
- size_t table_size = routing->generic_routing.nb_index;
+ size_t table_size = xbt_dynar_length(routing->generic_routing.index_network_elm);
int i, j;
if (routing) {
/* Delete routing table */
/* set utils vars */
routing_component_full_t routing =
((routing_component_full_t) current_routing);
- size_t table_size = routing->generic_routing.nb_index;
+ size_t table_size = xbt_dynar_length(routing->generic_routing.index_network_elm);
/* Create table if necessary */
if (!routing->routing_table)
xbt_assert(dst_net_elm, "Network elements %s not found", dst);
routing_component_full_t routing = (routing_component_full_t) rc;
- size_t table_size = routing->generic_routing.nb_index;
+ size_t table_size = xbt_dynar_length(routing->generic_routing.index_network_elm);
xbt_assert(!xbt_dynar_is_empty(route->link_list),
"Invalid count of links, must be greater than zero (%s,%s)",
new_component->get_bypass_route =
generic_get_bypassroute;
new_component->finalize = model_generic_finalize;
-
- new_component->nb_index = 0;
new_component->bypassRoutes = xbt_dict_new_homogeneous((void (*)(void *)) generic_free_route);
+ new_component->index_network_elm = xbt_dynar_new(sizeof(char*),NULL);
return new_component;
}
void model_generic_finalize(AS_t as) {
model_none_finalize(as);
}
-int generic_parse_PU(AS_t as, const char *name)
+int generic_parse_PU(AS_t as, network_element_t elm)
{
- XBT_DEBUG("Load process unit \"%s\"", name);
- int id = as->nb_index;
- (as->nb_index)++;
- return id;
+ XBT_DEBUG("Load process unit \"%s\"", elm->name);
+ xbt_dynar_push(as->index_network_elm, elm);
+ return xbt_dynar_length(as->index_network_elm)-1;
}
-int generic_parse_AS(AS_t as, const char *name)
+int generic_parse_AS(AS_t as, network_element_t elm)
{
- XBT_DEBUG("Load Autonomous system \"%s\"", name);
- int id = as->nb_index;
- as->nb_index++;
- return id;
+ XBT_DEBUG("Load Autonomous system \"%s\"", elm->name);
+ xbt_dynar_push(as->index_network_elm, elm);
+ return xbt_dynar_length(as->index_network_elm)-1;
}
void generic_parse_bypassroute(AS_t rc,
return NULL;
}
-static int none_parse_PU(AS_t rc, const char *name) {
+static int none_parse_PU(AS_t rc, network_element_t elm) {
+ xbt_dynar_push(rc->index_network_elm, (void *)elm);
/* don't care about PUs */
return -1;
}
-static int none_parse_AS(AS_t rc, const char *name) {
+static int none_parse_AS(AS_t rc, network_element_t elm) {
+ xbt_dynar_push(rc->index_network_elm, (void *)elm);
/* even don't care about sub-ASes -- I'm as nihilist as an old punk*/
return -1;
}
new_component->finalize = model_none_finalize;
new_component->routing_sons = xbt_dict_new_homogeneous(NULL);
-
+ new_component->index_network_elm = xbt_dynar_new(sizeof(char*),NULL);
return new_component;
}
AS_t model_generic_create_sized(size_t childsize);
void model_generic_finalize(AS_t as);
-int generic_parse_PU(AS_t rc, const char *name);
-int generic_parse_AS(AS_t rc, const char *name);
+int generic_parse_PU(AS_t rc, network_element_t elm);
+int generic_parse_AS(AS_t rc, network_element_t elm);
void generic_parse_bypassroute(AS_t rc, const char *src, const char *dst,
route_t e_route);
typedef struct {
s_as_t generic_routing;
- int nb_processing_units;
- int nb_autonomous_systems;
xbt_dynar_t list_route;
xbt_dynar_t list_ASroute;
} s_AS_rulebased_t, *AS_rulebased_t;
/* Parse routing model functions */
-static int model_rulebased_parse_PU(AS_t rc, const char *name)
+static int model_rulebased_parse_PU(AS_t rc, network_element_t elm)
{
AS_rulebased_t routing = (AS_rulebased_t) rc;
- routing->nb_processing_units++;
+ xbt_dynar_push(routing->generic_routing.index_network_elm,(void *)elm);
return -1;
}
-static int model_rulebased_parse_AS(AS_t rc, const char *name)
+static int model_rulebased_parse_AS(AS_t rc, network_element_t elm)
{
AS_rulebased_t routing = (AS_rulebased_t) rc;
- routing->nb_autonomous_systems++;
+ xbt_dynar_push(routing->generic_routing.index_network_elm,(void *)elm);
return -1;
}
static xbt_dynar_t rulebased_get_onelink_routes(AS_t rc)
{
xbt_dynar_t ret = xbt_dynar_new (sizeof(onelink_t), xbt_free);
- THROW_UNIMPLEMENTED;
-// //We have already bypass cluster routes with network NS3
-// if(!strcmp(surf_network_model->name,"network NS3"))
-// return ret;
-//
-// AS_rulebased_t routing = (AS_rulebased_t)rc;
-//
-// xbt_dict_cursor_t c1 = NULL;
-// char *k1, *d1;
-//
-// //find router
-// char *router = NULL;
-// xbt_dict_foreach(routing->dict_processing_units, c1, k1, d1) {
-// if (routing_get_network_element_type(k1) == SURF_NETWORK_ELEMENT_ROUTER){
-// router = k1;
-// break;
-// }
-// }
-//
-// if (!router)
-// xbt_die ("rulebased_get_onelink_routes works only if the AS is a cluster, sorry.");
-//
-// xbt_dict_foreach(routing->dict_processing_units, c1, k1, d1) {
-// route_t route = xbt_new0(s_route_t,1);
-// route->link_list = xbt_dynar_new(global_routing->size_of_link,NULL);
-// rulebased_get_route_and_latency (rc, router, k1, route,NULL);
-//
-// int number_of_links = xbt_dynar_length(route->link_list);
-//
-// if(number_of_links == 1) {
-// //loopback
-// }
-// else{
-// if (number_of_links != 2) {
-// xbt_die ("rulebased_get_onelink_routes works only if the AS is a cluster, sorry.");
-// }
-//
-// void *link_ptr;
-// xbt_dynar_get_cpy (route->link_list, 1, &link_ptr);
-// onelink_t onelink = xbt_new0 (s_onelink_t, 1);
-// onelink->src = xbt_strdup (k1);
-// onelink->dst = xbt_strdup (router);
-// onelink->link_ptr = link_ptr;
-// xbt_dynar_push (ret, &onelink);
-// }
-// }
+ //We have already bypass cluster routes with network NS3
+ if(!strcmp(surf_network_model->name,"network NS3"))
+ return ret;
+
+ char *k1;
+
+ //find router
+ network_element_t router = NULL;
+ xbt_lib_cursor_t cursor;
+ xbt_lib_foreach(as_router_lib, cursor, k1, router)
+ {
+ if (router->rc_type == SURF_NETWORK_ELEMENT_ROUTER)
+ break;
+ }
+
+ if (!router)
+ xbt_die ("rulebased_get_onelink_routes works only if the AS is a cluster, sorry.");
+
+ network_element_t host = NULL;
+ xbt_lib_foreach(as_router_lib, cursor, k1, host){
+ route_t route = xbt_new0(s_route_t,1);
+ route->link_list = xbt_dynar_new(global_routing->size_of_link,NULL);
+ rulebased_get_route_and_latency (rc, router, host, route,NULL);
+
+ int number_of_links = xbt_dynar_length(route->link_list);
+
+ if(number_of_links == 1) {
+ //loopback
+ }
+ else{
+ if (number_of_links != 2) {
+ xbt_die ("rulebased_get_onelink_routes works only if the AS is a cluster, sorry.");
+ }
+
+ void *link_ptr;
+ xbt_dynar_get_cpy (route->link_list, 1, &link_ptr);
+ onelink_t onelink = xbt_new0 (s_onelink_t, 1);
+ onelink->src = host;
+ onelink->dst = router;
+ onelink->link_ptr = link_ptr;
+ xbt_dynar_push (ret, &onelink);
+ }
+ }
return ret;
}