+ return new_e_route;
+}
+
+/* ************************************************************************** */
+/* ************************* GENERIC AUX FUNCTIONS ************************** */
+
+static 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_assert0(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_assert0(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 = e_route->src_gateway;
+ new_e_route->dst_gateway = e_route->dst_gateway;
+ }
+
+ links_id = new_e_route->generic_route.link_list;
+
+ xbt_dynar_foreach(links, cpt, link_name) {
+
+ void *link =
+ xbt_dict_get_or_null(surf_network_model->resource_set, link_name);
+ if (link) {
+ if (order)
+ xbt_dynar_push(links_id, &link);
+ else
+ xbt_dynar_unshift(links_id, &link);
+ } else
+ THROW1(mismatch_error, 0, "Link %s not found", link_name);
+ }
+
+ return new_e_route;
+}
+
+static void generic_free_route(route_t route)
+{
+ if (route) {
+ xbt_dynar_free(&(route->link_list));
+ xbt_free(route);
+ }
+}
+
+static void generic_free_extended_route(route_extended_t e_route)
+{
+ if (e_route) {
+ xbt_dynar_free(&(e_route->generic_route.link_list));
+ if (e_route->src_gateway)
+ xbt_free(e_route->src_gateway);
+ if (e_route->dst_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;
+}
+
+static 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_dict_get_or_null
+ (global_routing->where_network_elements,
+ element))->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;
+}
+
+static 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_dict_get_or_null
+ (global_routing->where_network_elements,
+ element))->rc_component;
+ if (element_as == rc)
+ return element_as;
+ return generic_as_exist(rc, element_as);
+}
+
+static void generic_src_dst_check(routing_component_t rc, const char *src,
+ const char *dst)
+{
+
+ routing_component_t src_as = ((network_element_info_t)
+ xbt_dict_get_or_null
+ (global_routing->where_network_elements,
+ src))->rc_component;
+ routing_component_t dst_as = ((network_element_info_t)
+ xbt_dict_get_or_null
+ (global_routing->where_network_elements,
+ dst))->rc_component;
+
+ xbt_assert3(src_as != NULL && dst_as != NULL,
+ "Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"",
+ src, dst, rc->name);
+ xbt_assert4(src_as == dst_as,
+ "The src(%s in %s) and dst(%s in %s) are in differents AS",
+ src, src_as->name, dst, dst_as->name);
+ xbt_assert2(rc == dst_as,
+ "The routing component of src and dst is not the same as the network elements belong (%s==%s)",
+ rc->name, dst_as->name);
+}
+
+static void routing_parse_Sconfig(void)
+{
+ //TODO
+ DEBUG0("WARNING tag config not yet implemented.");
+ DEBUG1("Configuration name = %s",A_surfxml_config_id);
+}
+
+static void routing_parse_Econfig(void)
+{
+ //TODO
+ xbt_dict_cursor_t cursor = NULL;
+ char *key;
+ char *elem;
+ xbt_dict_foreach(current_property_set, cursor, key, elem) {
+ DEBUG2("property : %s = %s",key,elem);
+ }
+}
+
+static void routing_parse_Scluster(void)
+{
+ static int AX_ptr = 0;
+
+ char *cluster_id = A_surfxml_cluster_id;
+ char *cluster_prefix = A_surfxml_cluster_prefix;
+ char *cluster_suffix = A_surfxml_cluster_suffix;
+ char *cluster_radical = A_surfxml_cluster_radical;
+ char *cluster_power = A_surfxml_cluster_power;
+ char *cluster_bw = A_surfxml_cluster_bw;
+ char *cluster_lat = A_surfxml_cluster_lat;
+ char *cluster_bb_bw = A_surfxml_cluster_bb_bw;
+ char *cluster_bb_lat = A_surfxml_cluster_bb_lat;
+ char *host_id, *groups, *link_id = NULL;
+ char *router_id, *link_router, *link_backbone, *route_src_dst;
+ unsigned int iter;
+ int start, end, i;
+ xbt_dynar_t radical_elements;
+ xbt_dynar_t radical_ends;
+ int cluster_sharing_policy = AX_surfxml_cluster_sharing_policy;
+ int cluster_bb_sharing_policy = AX_surfxml_cluster_bb_sharing_policy;
+
+#ifndef HAVE_PCRE_LIB
+ xbt_dynar_t tab_elements_num = xbt_dynar_new(sizeof(int), NULL);
+ char *route_src, *route_dst;
+ int j;
+#endif
+
+ static unsigned int surfxml_buffer_stack_stack_ptr = 1;
+ static unsigned int surfxml_buffer_stack_stack[1024];
+
+ surfxml_buffer_stack_stack[0] = 0;
+
+ surfxml_bufferstack_push(1);
+
+ SURFXML_BUFFER_SET(AS_id, cluster_id);
+#ifdef HAVE_PCRE_LIB
+ SURFXML_BUFFER_SET(AS_routing, "RuleBased");
+ DEBUG1("<AS id=\"%s\"\trouting=\"RuleBased\">", cluster_id);
+#else
+ SURFXML_BUFFER_SET(AS_routing, "Full");
+ DEBUG1("<AS id=\"%s\"\trouting=\"Full\">", cluster_id);
+#endif
+ SURFXML_START_TAG(AS);
+
+ radical_elements = xbt_str_split(cluster_radical, ",");
+ xbt_dynar_foreach(radical_elements, iter, groups) {
+ radical_ends = xbt_str_split(groups, "-");
+ switch (xbt_dynar_length(radical_ends)) {
+ case 1:
+ surf_parse_get_int(&start,
+ xbt_dynar_get_as(radical_ends, 0, char *));
+ host_id = bprintf("%s%d%s", cluster_prefix, start, cluster_suffix);
+#ifndef HAVE_PCRE_LIB
+ xbt_dynar_push_as(tab_elements_num, int, start);
+#endif
+ link_id = bprintf("%s_link_%d", cluster_id, start);
+
+ DEBUG2("<host\tid=\"%s\"\tpower=\"%s\"/>", host_id, cluster_power);
+ A_surfxml_host_state = A_surfxml_host_state_ON;
+ SURFXML_BUFFER_SET(host_id, host_id);
+ SURFXML_BUFFER_SET(host_power, cluster_power);
+ SURFXML_BUFFER_SET(host_availability, "1.0");
+ SURFXML_BUFFER_SET(host_availability_file, "");
+ SURFXML_BUFFER_SET(host_state_file, "");
+ SURFXML_START_TAG(host);
+ SURFXML_END_TAG(host);
+
+ DEBUG3("<link\tid=\"%s\"\tbw=\"%s\"\tlat=\"%s\"/>", link_id,cluster_bw, cluster_lat);
+ A_surfxml_link_state = A_surfxml_link_state_ON;
+ A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED;
+ if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX)
+ {A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FULLDUPLEX;}
+ if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FATPIPE)
+ {A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FATPIPE;}
+ SURFXML_BUFFER_SET(link_id, link_id);
+ SURFXML_BUFFER_SET(link_bandwidth, cluster_bw);
+ SURFXML_BUFFER_SET(link_latency, cluster_lat);
+ SURFXML_BUFFER_SET(link_bandwidth_file, "");
+ SURFXML_BUFFER_SET(link_latency_file, "");
+ SURFXML_BUFFER_SET(link_state_file, "");
+ SURFXML_START_TAG(link);
+ SURFXML_END_TAG(link);
+
+ break;
+
+ case 2:
+
+ surf_parse_get_int(&start,
+ xbt_dynar_get_as(radical_ends, 0, char *));
+ surf_parse_get_int(&end, xbt_dynar_get_as(radical_ends, 1, char *));
+ DEBUG2("Create hosts and links from %d to %d", start, end);
+ for (i = start; i <= end; i++) {
+ host_id = bprintf("%s%d%s", cluster_prefix, i, cluster_suffix);
+#ifndef HAVE_PCRE_LIB
+ xbt_dynar_push_as(tab_elements_num, int, i);
+#endif
+ link_id = bprintf("%s_link_%d", cluster_id, i);
+
+ DEBUG2("<host\tid=\"%s\"\tpower=\"%s\"/>", host_id, cluster_power);
+ A_surfxml_host_state = A_surfxml_host_state_ON;
+ SURFXML_BUFFER_SET(host_id, host_id);
+ SURFXML_BUFFER_SET(host_power, cluster_power);
+ SURFXML_BUFFER_SET(host_availability, "1.0");
+ SURFXML_BUFFER_SET(host_availability_file, "");
+ SURFXML_BUFFER_SET(host_state_file, "");
+ SURFXML_START_TAG(host);
+ SURFXML_END_TAG(host);
+
+ DEBUG3("<link\tid=\"%s\"\tbw=\"%s\"\tlat=\"%s\"/>", link_id,cluster_bw, cluster_lat);
+ A_surfxml_link_state = A_surfxml_link_state_ON;
+ A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED;
+ if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX)
+ {A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FULLDUPLEX;}
+ if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FATPIPE)
+ {A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FATPIPE;}
+ SURFXML_BUFFER_SET(link_id, link_id);
+ SURFXML_BUFFER_SET(link_bandwidth, cluster_bw);
+ SURFXML_BUFFER_SET(link_latency, cluster_lat);
+ SURFXML_BUFFER_SET(link_bandwidth_file, "");
+ SURFXML_BUFFER_SET(link_latency_file, "");
+ SURFXML_BUFFER_SET(link_state_file, "");
+ SURFXML_START_TAG(link);
+ SURFXML_END_TAG(link);
+ }
+ break;
+
+ default:
+ DEBUG0("Malformed radical");
+ }
+
+ xbt_dynar_free(&radical_ends);
+ }
+
+ DEBUG0(" ");
+ router_id =
+ bprintf("%s%s_router%s", cluster_prefix, cluster_id,
+ cluster_suffix);
+ link_router = bprintf("%s_link_%s_router", cluster_id, cluster_id);
+ link_backbone = bprintf("%s_backbone", cluster_id);
+
+ DEBUG1("<router id=\"%s\"/>", router_id);
+ SURFXML_BUFFER_SET(router_id, router_id);;
+ SURFXML_START_TAG(router);
+ SURFXML_END_TAG(router);
+
+ DEBUG3("<link\tid=\"%s\" bw=\"%s\" lat=\"%s\"/>", link_router,cluster_bw, cluster_lat);
+ A_surfxml_link_state = A_surfxml_link_state_ON;
+ A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED;
+ if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX)
+ {A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FULLDUPLEX;}
+ if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FATPIPE)
+ {A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FATPIPE;}
+ SURFXML_BUFFER_SET(link_id, link_router);
+ SURFXML_BUFFER_SET(link_bandwidth, cluster_bw);
+ SURFXML_BUFFER_SET(link_latency, cluster_lat);
+ SURFXML_BUFFER_SET(link_bandwidth_file, "");
+ SURFXML_BUFFER_SET(link_latency_file, "");
+ SURFXML_BUFFER_SET(link_state_file, "");
+ SURFXML_START_TAG(link);
+ SURFXML_END_TAG(link);
+
+ DEBUG3("<link\tid=\"%s\" bw=\"%s\" lat=\"%s\"/>", link_backbone,cluster_bw, cluster_lat);
+ A_surfxml_link_state = A_surfxml_link_state_ON;
+ A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED;
+ if(cluster_bb_sharing_policy == A_surfxml_cluster_bb_sharing_policy_FATPIPE)
+ {A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FATPIPE;}
+ SURFXML_BUFFER_SET(link_id, link_backbone);
+ SURFXML_BUFFER_SET(link_bandwidth, cluster_bb_bw);
+ SURFXML_BUFFER_SET(link_latency, cluster_bb_lat);
+ SURFXML_BUFFER_SET(link_bandwidth_file, "");
+ SURFXML_BUFFER_SET(link_latency_file, "");
+ SURFXML_BUFFER_SET(link_state_file, "");
+ SURFXML_START_TAG(link);
+ SURFXML_END_TAG(link);
+
+ char *new_suffix = bprintf("%s", "");
+
+ radical_elements = xbt_str_split(cluster_suffix, ".");
+ xbt_dynar_foreach(radical_elements, iter, groups) {
+ if (strcmp(groups, "")) {
+ new_suffix = bprintf("%s\\.%s", new_suffix, groups);
+ }
+ }
+ route_src_dst = bprintf("%s(.*)%s", cluster_prefix, new_suffix);
+
+ DEBUG0(" ");
+
+#ifdef HAVE_PCRE_LIB
+
+ DEBUG2("<route\tsrc=\"%s\"\tdst=\"%s\"", route_src_dst, route_src_dst);
+ DEBUG0("symetrical=\"NO\">");
+ SURFXML_BUFFER_SET(route_src, route_src_dst);
+ SURFXML_BUFFER_SET(route_dst, route_src_dst);
+ A_surfxml_route_symetrical = A_surfxml_route_symetrical_NO;
+ SURFXML_START_TAG(route);
+
+ DEBUG1("<link_ctn\tid=\"%s_link_$1src\"/>", cluster_id);
+ SURFXML_BUFFER_SET(link_ctn_id, bprintf("%s_link_$1src", cluster_id));
+ A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE;
+ if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX)
+ {A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_UP;}
+ SURFXML_START_TAG(link_ctn);
+ SURFXML_END_TAG(link_ctn);
+
+ DEBUG1("<link_ctn\tid=\"%s_backbone\"/>", cluster_id);
+ SURFXML_BUFFER_SET(link_ctn_id, bprintf("%s_backbone", cluster_id));
+ A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE;
+ SURFXML_START_TAG(link_ctn);
+ SURFXML_END_TAG(link_ctn);
+
+ DEBUG1("<link_ctn\tid=\"%s_link_$1dst\"/>", cluster_id);
+ SURFXML_BUFFER_SET(link_ctn_id, bprintf("%s_link_$1dst", cluster_id));
+ A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE;
+ if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX)
+ {A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_DOWN;}
+ SURFXML_START_TAG(link_ctn);
+ SURFXML_END_TAG(link_ctn);
+
+ DEBUG0("</route>");
+ SURFXML_END_TAG(route);
+#else
+ for (i = 0; i <= xbt_dynar_length(tab_elements_num); i++) {
+ for (j = 0; j <= xbt_dynar_length(tab_elements_num); j++) {
+ if (i == xbt_dynar_length(tab_elements_num)) {
+ route_src = router_id;
+ } else {
+ route_src =
+ bprintf("%s%d%s", cluster_prefix,
+ xbt_dynar_get_as(tab_elements_num, i, int),
+ cluster_suffix);
+ }
+
+ if (j == xbt_dynar_length(tab_elements_num)) {
+ route_dst = router_id;
+ } else {
+ route_dst =
+ bprintf("%s%d%s", cluster_prefix,
+ xbt_dynar_get_as(tab_elements_num, j, int),
+ cluster_suffix);
+ }
+
+ DEBUG2("<route\tsrc=\"%s\"\tdst=\"%s\"", route_src, route_dst);
+ DEBUG0("symetrical=\"NO\">");
+ SURFXML_BUFFER_SET(route_src, route_src);
+ SURFXML_BUFFER_SET(route_dst, route_dst);
+ A_surfxml_route_symetrical = A_surfxml_route_symetrical_NO;
+ SURFXML_START_TAG(route);
+
+ if (i == xbt_dynar_length(tab_elements_num)) {
+ route_src = link_router;
+ } else {
+ route_src =
+ bprintf("%s_link_%d", cluster_id,
+ xbt_dynar_get_as(tab_elements_num, i, int));
+ }
+
+ if (j == xbt_dynar_length(tab_elements_num)) {
+ route_dst = link_router;
+ } else {
+ route_dst =
+ bprintf("%s_link_%d", cluster_id,
+ xbt_dynar_get_as(tab_elements_num, j, int));
+ }
+
+ DEBUG1("<link_ctn\tid=\"%s\"/>", route_src);
+ SURFXML_BUFFER_SET(link_ctn_id, route_src);
+ A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE;
+ if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX)
+ {A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_UP;}
+ SURFXML_START_TAG(link_ctn);
+ SURFXML_END_TAG(link_ctn);
+
+ DEBUG1("<link_ctn\tid=\"%s_backbone\"/>", cluster_id);
+ SURFXML_BUFFER_SET(link_ctn_id, bprintf("%s_backbone", cluster_id));
+ A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE;
+ SURFXML_START_TAG(link_ctn);
+ SURFXML_END_TAG(link_ctn);
+
+ DEBUG1("<link_ctn\tid=\"%s\"/>", route_dst);
+ SURFXML_BUFFER_SET(link_ctn_id, route_dst);
+ A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE;
+ if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX)
+ {A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_DOWN;}
+ SURFXML_START_TAG(link_ctn);
+ SURFXML_END_TAG(link_ctn);
+
+ DEBUG0("</route>");
+ SURFXML_END_TAG(route);
+ }
+ }
+ xbt_dynar_free(&tab_elements_num);
+#endif
+
+ DEBUG0("</AS>");
+ SURFXML_END_TAG(AS);
+ DEBUG0(" ");
+
+ surfxml_bufferstack_pop(1);
+}
+
+/*
+ * New methods to init the routing model component from the lua script
+ */
+
+/*
+ * calling parse_S_AS_lua with lua values
+ */
+void routing_AS_init(const char *AS_id, const char *AS_routing)
+{
+ parse_S_AS_lua((char *) AS_id, (char *) AS_routing);
+}
+
+/*
+ * calling parse_E_AS_lua to fisnish the creation of routing component
+ */
+void routing_AS_end(const char *AS_id)
+{
+ parse_E_AS_lua((char *) AS_id);
+}
+
+/*
+ * add a host to the network element list
+ */
+
+void routing_add_host(const char *host_id)
+{
+ parse_S_host_lua((char *) host_id);
+}
+
+/*
+ * Set a new link on the actual list of link for a route or ASroute
+ */
+void routing_add_link(const char *link_id)
+{
+ parse_E_link_c_ctn_new_elem_lua((char *) link_id);
+}
+
+/*
+ *Set the endpoints for a route
+ */
+void routing_set_route(const char *src_id, const char *dst_id)
+{
+ parse_S_route_new_and_endpoints_lua((char *) src_id, (char *) dst_id);
+}
+
+/*
+ * Store the route by calling parse_E_route_store_route
+ */
+void routing_store_route(void)
+{
+ parse_E_route_store_route();