Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
ben si
[simgrid.git] / src / surf / surf_routing_full.c
index 1ac2f26..431c3d3 100644 (file)
@@ -38,17 +38,19 @@ static xbt_dynar_t full_get_onelink_routes(AS_t rc)
           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);
+          if (rc->hierarchy == SURF_ROUTING_BASE) {
+            onelink->src = xbt_dynar_get_as(rc->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 = xbt_dynar_get_as(rc->index_network_elm,dst,network_element_t);
             onelink->dst->id = dst;
-          } else if (routing->generic_routing.hierarchy ==
-                     SURF_ROUTING_RECURSIVE) {
+          } else if (rc->hierarchy == SURF_ROUTING_RECURSIVE) {
             onelink->src = route->src_gateway;
             onelink->dst = route->dst_gateway;
           }
           xbt_dynar_push(ret, &onelink);
+          XBT_DEBUG("Push route from '%d' to '%d'",
+              src,
+              dst);
         }
       }
     }
@@ -158,11 +160,13 @@ void model_full_set_route(AS_t rc, const char *src,
                           const char *dst, route_t route)
 {
   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);
-  dst_net_elm = (network_element_t)xbt_lib_get_or_null(host_lib, dst, ROUTING_HOST_LEVEL);
-  if(!src_net_elm) src_net_elm = (network_element_t)xbt_lib_get_or_null(as_router_lib, src, ROUTING_ASR_LEVEL);
-  if(!dst_net_elm) dst_net_elm = (network_element_t)xbt_lib_get_or_null(as_router_lib, dst, ROUTING_ASR_LEVEL);
+  int as_route = 0;
+  src_net_elm = xbt_lib_get_or_null(host_lib, src, ROUTING_HOST_LEVEL);
+  dst_net_elm = xbt_lib_get_or_null(host_lib, dst, ROUTING_HOST_LEVEL);
+  if (!src_net_elm)
+    src_net_elm = xbt_lib_get_or_null(as_router_lib, src, ROUTING_ASR_LEVEL);
+  if (!dst_net_elm)
+    dst_net_elm = xbt_lib_get_or_null(as_router_lib, dst, ROUTING_ASR_LEVEL);
 
   xbt_assert(src_net_elm, "Network elements %s not found", src);
   xbt_assert(dst_net_elm, "Network elements %s not found", dst);
@@ -228,7 +232,7 @@ void model_full_set_route(AS_t rc, const char *src,
 //                         "in a sub-sub-AS is not allowed), "
 //                         "but '%s' is not in '%s'.",
 //                         route->dst_gateway, subas->name);
-
+      as_route = 1;
       XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"",
                 src, route->src_gateway->name, dst, route->dst_gateway->name);
       if (route->dst_gateway->rc_type == SURF_NETWORK_ELEMENT_NULL)
@@ -241,8 +245,9 @@ void model_full_set_route(AS_t rc, const char *src,
     xbt_dynar_shrink(TO_ROUTE_FULL(src_net_elm->id, dst_net_elm->id)->link_list, 0);
   }
 
-  if (A_surfxml_route_symmetrical == A_surfxml_route_symmetrical_YES
-      || A_surfxml_ASroute_symmetrical == A_surfxml_ASroute_symmetrical_YES) {
+  if ( (A_surfxml_route_symmetrical == A_surfxml_route_symmetrical_YES && as_route == 0)
+       || (A_surfxml_ASroute_symmetrical == A_surfxml_ASroute_symmetrical_YES && as_route == 1)
+     ) {
     if (route->dst_gateway && route->src_gateway) {
       network_element_t gw_tmp;
       gw_tmp = route->src_gateway;