Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Reimplement function get_onelink_route.
authornavarro <navarro@caraja.(none)>
Fri, 16 Mar 2012 13:51:44 +0000 (14:51 +0100)
committernavarro <navarro@caraja.(none)>
Fri, 16 Mar 2012 13:55:14 +0000 (14:55 +0100)
src/surf/surf_private.h
src/surf/surf_routing.c
src/surf/surf_routing_dijkstra.c
src/surf/surf_routing_floyd.c
src/surf/surf_routing_full.c
src/surf/surf_routing_generic.c
src/surf/surf_routing_none.c
src/surf/surf_routing_private.h
src/surf/surf_routing_rulebased.c

index bfd298c..dafbfc4 100644 (file)
@@ -144,7 +144,7 @@ typedef enum {
 } e_surf_routing_hierarchy_t;
 
 typedef struct s_as {
 } 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;
   xbt_dict_t bypassRoutes;             /* store bypass routes */
   routing_model_description_t model_desc;
   e_surf_routing_hierarchy_t hierarchy;
@@ -164,8 +164,8 @@ typedef struct s_as {
    * 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 */
    * 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,
   void (*parse_route) (AS_t as, const char *src,
                      const char *dst, route_t route);
   void (*parse_ASroute) (AS_t as, const char *src,
index b2e27e8..e93f8fa 100644 (file)
@@ -112,7 +112,7 @@ static void parse_S_host(sg_platf_host_cbarg_t host)
   info->rc_component = current_routing;
   info->rc_type = SURF_NETWORK_ELEMENT_HOST;
   info->name = xbt_strdup(host->id);
   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);
 
   xbt_lib_set(host_lib, host->id, ROUTING_HOST_LEVEL, (void *) info);
   XBT_DEBUG("Having set name '%s' id '%d'",host->id,info->id);
 
@@ -157,7 +157,7 @@ static void parse_S_router(sg_platf_router_cbarg_t router)
   info->rc_component = current_routing;
   info->rc_type = SURF_NETWORK_ELEMENT_ROUTER;
   info->name = xbt_strdup(router->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_lib_set(as_router_lib, router->id, ROUTING_ASR_LEVEL, (void *) info);
   XBT_DEBUG("Having set name '%s' id '%d'",router->id,info->id);
 
@@ -398,7 +398,7 @@ void routing_AS_begin(const char *AS_id, const char *wanted_routing_type)
     xbt_dict_set(current_routing->routing_sons, AS_id,
                  (void *) new_as, NULL);
     /* add to the father element list */
     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");
   }
   } else {
     THROWF(arg_error, 0, "All defined components must be belong to a AS");
   }
index e6a11c3..764e845 100644 (file)
@@ -171,33 +171,34 @@ static void dijkstra_get_route_and_latency(AS_t as_generic,
 static xbt_dynar_t dijkstra_get_onelink_routes(AS_t as)
 {
          xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free);
 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;
 }
 
          return ret;
 }
 
index 28f4f6c..d262408 100644 (file)
@@ -32,31 +32,35 @@ static void floyd_get_route_and_latency(AS_t asg, network_element_t src, network
 static xbt_dynar_t floyd_get_onelink_routes(AS_t asg)
 {
   xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free);
 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;
 }
 
   return ret;
 }
 
@@ -66,7 +70,7 @@ static void floyd_get_route_and_latency(AS_t asg, network_element_t src, network
 
   /* set utils vars */
   as_floyd_t as = (as_floyd_t)asg;
 
   /* 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);
 
   generic_src_dst_check(asg, src, dst);
   int *src_id = &(src->id);
@@ -147,7 +151,7 @@ static void floyd_finalize(AS_t rc)
   int i, j;
   size_t table_size;
   if (as) {
   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++)
     /* Delete link_table */
     for (i = 0; i < table_size; i++)
       for (j = 0; j < table_size; j++)
@@ -184,7 +188,7 @@ void model_floyd_end(AS_t current_routing)
        unsigned int i, j, a, b, c;
 
        /* set the size of table routing */
        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)
        {
 
        if(!as->link_table)
        {
@@ -249,7 +253,7 @@ void model_floyd_parse_route(AS_t rc, const char *src,
        as_floyd_t as = (as_floyd_t) rc;
 
        /* set the size of table routing */
        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);
     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);
index 2f7af5e..1ac2f26 100644 (file)
@@ -25,39 +25,34 @@ typedef struct s_routing_component_full {
 static xbt_dynar_t full_get_onelink_routes(AS_t rc)
 {
   xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free);
 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;
 }
 
   return ret;
 }
 
@@ -73,7 +68,7 @@ static void full_get_route_and_latency(AS_t rc,
 
   /* set utils vars */
   routing_component_full_t routing = (routing_component_full_t) rc;
 
   /* 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;
 
   route_t e_route = NULL;
   void *link;
@@ -95,7 +90,7 @@ static void full_get_route_and_latency(AS_t rc,
 static void full_finalize(AS_t rc)
 {
   routing_component_full_t routing = (routing_component_full_t) rc;
 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 */
   int i, j;
   if (routing) {
     /* Delete routing table */
@@ -132,7 +127,7 @@ void model_full_end(AS_t current_routing)
   /* set utils vars */
   routing_component_full_t routing =
       ((routing_component_full_t) current_routing);
   /* 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)
 
   /* Create table if necessary */
   if (!routing->routing_table)
@@ -173,7 +168,7 @@ void model_full_set_route(AS_t rc, const char *src,
   xbt_assert(dst_net_elm, "Network elements %s not found", dst);
 
   routing_component_full_t routing = (routing_component_full_t) rc;
   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)",
 
   xbt_assert(!xbt_dynar_is_empty(route->link_list),
              "Invalid count of links, must be greater than zero (%s,%s)",
index c3d6d9a..f89383f 100644 (file)
@@ -29,10 +29,9 @@ AS_t model_generic_create_sized(size_t childsize) {
   new_component->get_bypass_route =
       generic_get_bypassroute;
   new_component->finalize = model_generic_finalize;
   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->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) {
   return new_component;
 }
 void model_generic_finalize(AS_t as) {
@@ -40,20 +39,18 @@ void model_generic_finalize(AS_t as) {
   model_none_finalize(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,
 }
 
 void generic_parse_bypassroute(AS_t rc,
index 75d295b..e4e187c 100644 (file)
@@ -23,12 +23,14 @@ static route_t none_get_bypass_route(AS_t rc,
   return NULL;
 }
 
   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;
 }
 
   /* 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;
 }
   /* even don't care about sub-ASes -- I'm as nihilist as an old punk*/
   return -1;
 }
@@ -50,7 +52,7 @@ AS_t model_none_create_sized(size_t childsize) {
   new_component->finalize = model_none_finalize;
 
   new_component->routing_sons = xbt_dict_new_homogeneous(NULL);
   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;
 }
 
   return new_component;
 }
 
index fe451e3..9b356dd 100644 (file)
@@ -29,8 +29,8 @@ void model_none_finalize(AS_t as);
 AS_t model_generic_create_sized(size_t childsize);
 void model_generic_finalize(AS_t as);
 
 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);
 
 void generic_parse_bypassroute(AS_t rc, const char *src, const char *dst,
                                route_t e_route);
 
index 5481859..d12f459 100644 (file)
@@ -15,8 +15,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_rulebased, surf, "Routing part of sur
 
 typedef struct {
   s_as_t generic_routing;
 
 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;
   xbt_dynar_t list_route;
   xbt_dynar_t list_ASroute;
 } s_AS_rulebased_t, *AS_rulebased_t;
@@ -64,17 +62,17 @@ static void rule_route_extended_free(void *e)
 
 /* Parse routing model functions */
 
 
 /* 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;
 {
   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;
 }
 
   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;
 {
   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;
 }
 
   return -1;
 }
 
@@ -214,52 +212,49 @@ static void rulebased_get_route_and_latency(AS_t rc,
 static xbt_dynar_t rulebased_get_onelink_routes(AS_t rc)
 {
   xbt_dynar_t ret = xbt_dynar_new (sizeof(onelink_t), xbt_free);
 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;
 }
 
   return ret;
 }