+static void model_full_set_route(routing_component_t rc, const char *src,
+ const char *dst, name_route_extended_t route)
+{
+ int *src_id, *dst_id;
+ src_id = xbt_dict_get_or_null(rc->to_index, src);
+ dst_id = xbt_dict_get_or_null(rc->to_index, dst);
+ routing_component_full_t routing = ((routing_component_full_t) rc);
+ size_t table_size = xbt_dict_length(routing->generic_routing.to_index);
+
+ xbt_assert2(src_id
+ && dst_id, "Network elements %s or %s not found", src, dst);
+
+ xbt_assert2(xbt_dynar_length(route->generic_route.link_list) > 0,
+ "Invalid count of links, must be greater than zero (%s,%s)",
+ src, dst);
+
+ if(!routing->routing_table)
+ routing->routing_table = xbt_new0(route_extended_t, table_size * table_size);
+ if(TO_ROUTE_FULL(*src_id, *dst_id))
+ {
+ char * link_name;
+ unsigned int i;
+ xbt_dynar_t link_route_to_test = xbt_dynar_new(global_routing->size_of_link, NULL);
+ xbt_dynar_foreach(route->generic_route.link_list,i,link_name)
+ {
+ void *link = xbt_dict_get_or_null(surf_network_model->resource_set, link_name);
+ xbt_assert1(link,"Link : '%s' doesn't exists.",link_name);
+ xbt_dynar_push(link_route_to_test,&link);
+ }
+ xbt_assert2(!xbt_dynar_compare(
+ (void*)TO_ROUTE_FULL(*src_id, *dst_id)->generic_route.link_list,
+ (void*)link_route_to_test,
+ (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp),
+ "The route between \"%s\" and \"%s\" already exist", src,dst);
+ xbt_free(link_route_to_test);
+ }
+ else
+ {
+ if(!route->dst_gateway && !route->src_gateway)
+ DEBUG2("Load Route from \"%s\" to \"%s\"", src, dst);
+ else
+ DEBUG4("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src,
+ route->src_gateway, dst, route->dst_gateway);
+ TO_ROUTE_FULL(*src_id, *dst_id) = generic_new_extended_route(rc->hierarchy,route,1);
+ xbt_dynar_shrink(TO_ROUTE_FULL(*src_id, *dst_id)->generic_route.link_list, 0);
+ }
+
+ if( A_surfxml_route_symetrical == A_surfxml_route_symetrical_YES
+ || A_surfxml_ASroute_symetrical == A_surfxml_ASroute_symetrical_YES )
+ {
+ if(route->dst_gateway && route->src_gateway)
+ {
+ char * gw_src = bprintf("%s",route->src_gateway);
+ char * gw_dst = bprintf("%s",route->dst_gateway);
+ route->src_gateway = bprintf("%s",gw_dst);
+ route->dst_gateway = bprintf("%s",gw_src);
+ }
+ if(TO_ROUTE_FULL(*dst_id, *src_id))
+ {
+ char * link_name;
+ unsigned int i;
+ xbt_dynar_t link_route_to_test = xbt_dynar_new(global_routing->size_of_link, NULL);
+ for(i=xbt_dynar_length(route->generic_route.link_list) ;i>0 ;i--)
+ {
+ link_name = xbt_dynar_get_as(route->generic_route.link_list,i-1,void *);
+ void *link = xbt_dict_get_or_null(surf_network_model->resource_set, link_name);
+ xbt_assert1(link,"Link : '%s' doesn't exists.",link_name);
+ xbt_dynar_push(link_route_to_test,&link);
+ }
+ xbt_assert2(!xbt_dynar_compare(
+ (void*)TO_ROUTE_FULL(*dst_id, *src_id)->generic_route.link_list,
+ (void*)link_route_to_test,
+ (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp),
+ "The route between \"%s\" and \"%s\" already exist", src,dst);
+ xbt_free(link_route_to_test);
+ }
+ else
+ {
+ if(!route->dst_gateway && !route->src_gateway)
+ DEBUG2("Load Route from \"%s\" to \"%s\"", dst, src);
+ else
+ DEBUG4("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", dst,
+ route->src_gateway, src, route->dst_gateway);
+ TO_ROUTE_FULL(*dst_id, *src_id) = generic_new_extended_route(rc->hierarchy,route,0);
+ xbt_dynar_shrink(TO_ROUTE_FULL(*dst_id, *src_id)->generic_route.link_list, 0);
+ }
+
+ }