X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f7e342550d6e25e190be5d1142e2d5a0e11846d2..5572adcb6316b36ca4c10a9b004232f84865592a:/src/surf/surf_routing.c diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index efbce744f5..50f6ddc9ac 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -111,6 +111,37 @@ struct s_model_type routing_models[] = { {NULL, NULL, NULL, NULL} }; +/** + * \brief Add a "host_link" to the network element list + */ +static void parse_S_host_link(sg_platf_host_link_cbarg_t host) +{ + sg_routing_edge_t info = NULL; + info = xbt_lib_get_or_null(host_lib, host->id, ROUTING_HOST_LEVEL); + xbt_assert(info, "Host '%s' not found!",host->id); + xbt_assert(current_routing->model_desc == &routing_models[SURF_MODEL_CLUSTER] || + current_routing->model_desc == &routing_models[SURF_MODEL_VIVALDI], + "You have to be in model Cluster to use tag host_link!"); + + s_surf_parsing_link_up_down_t link_up_down; + link_up_down.link_up = xbt_lib_get_or_null(link_lib, host->link_up, SURF_LINK_LEVEL); + link_up_down.link_down = xbt_lib_get_or_null(link_lib, host->link_down, SURF_LINK_LEVEL); + + xbt_assert(link_up_down.link_up, "Link '%s' not found!",host->link_up); + xbt_assert(link_up_down.link_down, "Link '%s' not found!",host->link_down); + + if(!current_routing->link_up_down_list) + current_routing->link_up_down_list = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL); + + // If dynar is is greater than edge id and if the host_link is already defined + if(xbt_dynar_length(current_routing->link_up_down_list) > info->id && + xbt_dynar_get_as(current_routing->link_up_down_list,info->id,void*)) + xbt_die("Host_link for '%s' is already defined!",host->id); + + XBT_DEBUG("Push Host_link for host '%s' to position %d",info->name,info->id); + xbt_dynar_set_as(current_routing->link_up_down_list,info->id,s_surf_parsing_link_up_down_t,link_up_down); +} + /** * \brief Add a "host" to the network element list */ @@ -175,7 +206,7 @@ static void parse_S_router(sg_platf_router_cbarg_t router) 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); - if (strcmp(router->coord, "")) { + if (router->coord && strcmp(router->coord, "")) { unsigned int cursor; char*str; @@ -253,27 +284,6 @@ static void routing_parse_S_bypassASroute(void) src, dst,gw_src,gw_dst); parsed_link_list = xbt_dynar_new(sizeof(char *), &xbt_free_ref); } -/** - * \brief Set a new link on the actual list of link for a route or ASroute from XML - */ - -static void routing_parse_link_ctn(void) -{ - char *link_id; - switch (A_surfxml_link_ctn_direction) { - case AU_surfxml_link_ctn_direction: - case A_surfxml_link_ctn_direction_NONE: - link_id = xbt_strdup(A_surfxml_link_ctn_id); - break; - case A_surfxml_link_ctn_direction_UP: - link_id = bprintf("%s_UP", A_surfxml_link_ctn_id); - break; - case A_surfxml_link_ctn_direction_DOWN: - link_id = bprintf("%s_DOWN", A_surfxml_link_ctn_id); - break; - } - xbt_dynar_push(parsed_link_list, &link_id); -} /** * \brief Store the route by calling the set_route function of the current routing component @@ -342,6 +352,28 @@ static void routing_parse_E_bypassRoute(void) gw_src = NULL; gw_dst = NULL; } + +/** + * \brief Set a new link on the actual list of link for a route or ASroute from XML + */ + +static void routing_parse_link_ctn(sg_platf_linkctn_cbarg_t linkctn) +{ + char *link_id; + switch (linkctn->direction) { + case SURF_LINK_DIRECTION_NONE: + link_id = xbt_strdup(linkctn->id); + break; + case SURF_LINK_DIRECTION_UP: + link_id = bprintf("%s_UP", linkctn->id); + break; + case SURF_LINK_DIRECTION_DOWN: + link_id = bprintf("%s_DOWN", linkctn->id); + break; + } + xbt_dynar_push(parsed_link_list, &link_id); +} + /** * \brief Store the bypass route by calling the set_bypassroute function of the current routing component */ @@ -746,6 +778,83 @@ void routing_model_create( void *loopback) /* ************************************************************************** */ /* ************************* GENERIC PARSE FUNCTIONS ************************ */ +void routing_cluster_add_backbone(void* bb) { + xbt_assert(current_routing->model_desc == &routing_models[SURF_MODEL_CLUSTER], + "You have to be in model Cluster to use tag backbone!"); + xbt_assert(!((as_cluster_t)current_routing)->backbone,"The backbone link is already defined!"); + ((as_cluster_t)current_routing)->backbone = bb; + XBT_DEBUG("Add a backbone to AS '%s'",current_routing->name); +} + +static void routing_parse_cabinet(sg_platf_cabinet_cbarg_t cabinet) +{ + int start, end, i; + char *groups , *host_id , *link_id = NULL; + unsigned int iter; + xbt_dynar_t radical_elements; + xbt_dynar_t radical_ends; + + //Make all hosts + radical_elements = xbt_str_split(cabinet->radical, ","); + xbt_dynar_foreach(radical_elements, iter, groups) { + + radical_ends = xbt_str_split(groups, "-"); + start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *)); + + switch (xbt_dynar_length(radical_ends)) { + case 1: + end = start; + break; + case 2: + end = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char *)); + break; + default: + surf_parse_error("Malformed radical"); + break; + } + s_sg_platf_host_cbarg_t host; + memset(&host, 0, sizeof(host)); + host.initial_state = SURF_RESOURCE_ON; + host.power_peak = cabinet->power; + host.power_scale = 1.0; + host.core_amount = 1; + + s_sg_platf_link_cbarg_t link; + memset(&link, 0, sizeof(link)); + link.state = SURF_RESOURCE_ON; + link.policy = SURF_LINK_FULLDUPLEX; + link.latency = cabinet->lat; + link.bandwidth = cabinet->bw; + + s_sg_platf_host_link_cbarg_t host_link; + memset(&host_link, 0, sizeof(host_link)); + + for (i = start; i <= end; i++) { + host_id = bprintf("%s%d%s",cabinet->prefix,i,cabinet->suffix); + link_id = bprintf("link_%s%d%s",cabinet->prefix,i,cabinet->suffix); + host.id = host_id; + link.id = link_id; + sg_platf_new_host(&host); + sg_platf_new_link(&link); + + char* link_up = bprintf("%s_UP",link_id); + char* link_down = bprintf("%s_DOWN",link_id); + host_link.id = host_id; + host_link.link_up = link_up; + host_link.link_down= link_down; + sg_platf_new_host_link(&host_link); + + free(host_id); + free(link_id); + free(link_up); + free(link_down); + } + + xbt_dynar_free(&radical_ends); + } + xbt_dynar_free(&radical_elements); +} + static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster) { char *host_id, *groups, *link_id = NULL; @@ -759,8 +868,8 @@ static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster) xbt_dynar_t radical_elements; xbt_dynar_t radical_ends; - if (strcmp(cluster->availability_trace, "") - || strcmp(cluster->state_trace, "")) { + if ((cluster->availability_trace && strcmp(cluster->availability_trace, "")) + || (cluster->state_trace && strcmp(cluster->state_trace, ""))) { patterns = xbt_dict_new_homogeneous(xbt_free_f); xbt_dict_set(patterns, "id", xbt_strdup(cluster->id), NULL); xbt_dict_set(patterns, "prefix", xbt_strdup(cluster->prefix), NULL); @@ -800,7 +909,7 @@ static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster) memset(&host, 0, sizeof(host)); host.id = host_id; - if (strcmp(cluster->availability_trace, "")) { + if (cluster->availability_trace && strcmp(cluster->availability_trace, "")) { xbt_dict_set(patterns, "radical", bprintf("%d", i), NULL); char *avail_file = xbt_str_varsubst(cluster->availability_trace, patterns); XBT_DEBUG("\tavailability_file=\"%s\"", avail_file); @@ -810,7 +919,7 @@ static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster) XBT_DEBUG("\tavailability_file=\"\""); } - if (strcmp(cluster->state_trace, "")) { + if (cluster->state_trace && strcmp(cluster->state_trace, "")) { char *avail_file = xbt_str_varsubst(cluster->state_trace, patterns); XBT_DEBUG("\tstate_file=\"%s\"", avail_file); host.state_trace = tmgr_trace_new_from_file(avail_file); @@ -893,7 +1002,7 @@ static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster) sg_platf_new_link(&link); - surf_routing_cluster_add_backbone(current_routing, xbt_lib_get_or_null(link_lib, link_backbone, SURF_LINK_LEVEL)); + routing_cluster_add_backbone(xbt_lib_get_or_null(link_lib, link_backbone, SURF_LINK_LEVEL)); free(link_backbone); } @@ -910,28 +1019,12 @@ static void routing_parse_postparse(void) { static void routing_parse_peer(sg_platf_peer_cbarg_t peer) { - static int AX_ptr = 0; char *host_id = NULL; - char *router_id, *link_router, *link_backbone, *link_id_up, *link_id_down; - - 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); - - XBT_DEBUG("", peer->id); - sg_platf_new_AS_begin(peer->id, A_surfxml_AS_routing_Full); + char *link_id; XBT_DEBUG(" "); host_id = HOST_PEER(peer->id); - router_id = ROUTER_PEER(peer->id); - link_id_up = LINK_UP_PEER(peer->id); - link_id_down = LINK_DOWN_PEER(peer->id); - - link_router = bprintf("%s_link_router", peer->id); - link_backbone = bprintf("%s_backbone", peer->id); + link_id = LINK_PEER(peer->id); XBT_DEBUG("", host_id, peer->power); s_sg_platf_host_cbarg_t host; @@ -946,80 +1039,41 @@ static void routing_parse_peer(sg_platf_peer_cbarg_t peer) host.coord = peer->coord; sg_platf_new_host(&host); - - XBT_DEBUG("", router_id, peer->coord); - s_sg_platf_router_cbarg_t router; - memset(&router, 0, sizeof(router)); - router.id = router_id; - router.coord = peer->coord; - sg_platf_new_router(&router); - - XBT_DEBUG("", link_id_up, - peer->bw_in, peer->lat); s_sg_platf_link_cbarg_t link; memset(&link, 0, sizeof(link)); link.state = SURF_RESOURCE_ON; link.policy = SURF_LINK_SHARED; - link.id = link_id_up; - link.bandwidth = peer->bw_in; link.latency = peer->lat; - sg_platf_new_link(&link); - // FIXME: dealing with full duplex is not the role of this piece of code, I'd say [Mt] - // Instead, it should be created fullduplex, and the models will do what's needed in this case - XBT_DEBUG("", link_id_down, + char* link_up = bprintf("%s_UP",link_id); + XBT_DEBUG("", link_up, peer->bw_out, peer->lat); - link.id = link_id_down; + link.id = link_up; + link.bandwidth = peer->bw_out; sg_platf_new_link(&link); - XBT_DEBUG(" "); + char* link_down = bprintf("%s_DOWN",link_id); + XBT_DEBUG("", link_down, + peer->bw_in, peer->lat); + link.id = link_down; + link.bandwidth = peer->bw_in; + sg_platf_new_link(&link); - // begin here - XBT_DEBUG(""); - SURFXML_BUFFER_SET(route_src, host_id); - SURFXML_BUFFER_SET(route_dst, router_id); - A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; - SURFXML_START_TAG(route); - - XBT_DEBUG("", link_id_up); - SURFXML_BUFFER_SET(link_ctn_id, link_id_up); - A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; - SURFXML_START_TAG(link_ctn); - SURFXML_END_TAG(link_ctn); - - XBT_DEBUG(""); - SURFXML_END_TAG(route); - - //Opposite Route - XBT_DEBUG(""); - SURFXML_BUFFER_SET(route_src, router_id); - SURFXML_BUFFER_SET(route_dst, host_id); - A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; - SURFXML_START_TAG(route); - - XBT_DEBUG("", link_id_down); - SURFXML_BUFFER_SET(link_ctn_id, link_id_down); - A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; - SURFXML_START_TAG(link_ctn); - SURFXML_END_TAG(link_ctn); - - XBT_DEBUG(""); - SURFXML_END_TAG(route); + XBT_DEBUG("", host_id,link_up,link_down); + s_sg_platf_host_link_cbarg_t host_link; + memset(&host_link, 0, sizeof(host_link)); + host_link.id = host_id; + host_link.link_up = link_up; + host_link.link_down= link_down; + sg_platf_new_host_link(&host_link); - XBT_DEBUG(""); - sg_platf_new_AS_end(); XBT_DEBUG(" "); //xbt_dynar_free(&tab_elements_num); free(host_id); - free(router_id); - free(link_router); - free(link_backbone); - free(link_id_up); - free(link_id_down); - surfxml_bufferstack_pop(1); + free(link_id); + free(link_up); + free(link_down); } static void routing_parse_Srandom(void) @@ -1146,6 +1200,7 @@ void routing_register_callbacks() { sg_platf_host_add_cb(parse_S_host); sg_platf_router_add_cb(parse_S_router); + sg_platf_host_link_add_cb(parse_S_host_link); surfxml_add_callback(STag_surfxml_random_cb_list, &routing_parse_Srandom); @@ -1156,8 +1211,6 @@ void routing_register_callbacks() surfxml_add_callback(STag_surfxml_bypassASroute_cb_list, &routing_parse_S_bypassASroute); - surfxml_add_callback(ETag_surfxml_link_ctn_cb_list, &routing_parse_link_ctn); - surfxml_add_callback(ETag_surfxml_route_cb_list, &routing_parse_E_route); surfxml_add_callback(ETag_surfxml_ASroute_cb_list, &routing_parse_E_ASroute); surfxml_add_callback(ETag_surfxml_bypassRoute_cb_list, @@ -1166,10 +1219,13 @@ void routing_register_callbacks() &routing_parse_E_bypassASroute); sg_platf_cluster_add_cb(routing_parse_cluster); + sg_platf_cabinet_add_cb(routing_parse_cabinet); sg_platf_peer_add_cb(routing_parse_peer); sg_platf_postparse_add_cb(routing_parse_postparse); + sg_platf_linkctn_add_cb(routing_parse_link_ctn); + /* we care about the ASes while parsing the platf. Incredible, isnt it? */ sg_platf_AS_end_add_cb(routing_AS_end); sg_platf_AS_begin_add_cb(routing_AS_begin);