A_surfxml_bypassRoute_src, A_surfxml_bypassRoute_dst);
src = A_surfxml_bypassRoute_src;
dst = A_surfxml_bypassRoute_dst;
- gw_src = A_surfxml_bypassRoute_gw_src;
- gw_dst = A_surfxml_bypassRoute_gw_dst;
+ gw_src = NULL;
+ gw_dst = NULL;
xbt_assert(strlen(src) > 0 || strlen(dst) > 0 || strlen(gw_src) > 0
|| strlen(gw_dst) > 0,
"Some limits are null in the route between \"%s\" and \"%s\"",
parsed_link_list = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
}
+/**
+ * \brief Set the end points for a bypassASroute
+ */
+static void routing_parse_S_bypassASroute(void)
+{
+ if (src != NULL && dst != NULL && parsed_link_list != NULL)
+ THROWF(arg_error, 0,
+ "Bypass AS Route between %s to %s can not be defined",
+ A_surfxml_bypassASroute_src, A_surfxml_bypassASroute_dst);
+ src = A_surfxml_bypassASroute_src;
+ dst = A_surfxml_bypassASroute_dst;
+ gw_src = A_surfxml_bypassASroute_gw_src;
+ gw_dst = A_surfxml_bypassASroute_gw_dst;
+ xbt_assert(strlen(src) > 0 || strlen(dst) > 0 || strlen(gw_src) > 0
+ || strlen(gw_dst) > 0,
+ "Some limits are null in the route between \"%s\" and \"%s\"",
+ src, 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
*/
* \brief Store the bypass route by calling the set_bypassroute function of the current routing component
*/
static void routing_parse_E_bypassRoute(void)
+{
+ route_t e_route = xbt_new0(s_route_t, 1);
+ e_route->link_list = parsed_link_list;
+
+ xbt_assert(current_routing->parse_bypassroute,
+ "Bypassing mechanism not implemented by routing '%s'",
+ current_routing->name);
+
+ current_routing->parse_bypassroute(current_routing, src, dst, e_route);
+ parsed_link_list = NULL;
+ src = NULL;
+ dst = NULL;
+ gw_src = NULL;
+ gw_dst = NULL;
+}
+/**
+ * \brief Store the bypass route by calling the set_bypassroute function of the current routing component
+ */
+static void routing_parse_E_bypassASroute(void)
{
route_t e_route = xbt_new0(s_route_t, 1);
e_route->link_list = parsed_link_list;
XBT_DEBUG("elements_father: common father '%s' src_father '%s' dst_father '%s'",
common_father->name,src_father->name,dst_father->name);
- /* If src and dst are in the same AS, life is good */
- if (src_father == dst_father) { /* SURF_ROUTING_BASE */
-
- route.link_list = *links;
+ /* Check whether a direct bypass is defined */
+ route_t e_route_bypass = NULL;
+ if (common_father->get_bypass_route)
+ e_route_bypass = common_father->get_bypass_route(common_father, src, dst, latency);
- common_father->get_route_and_latency(common_father, src, dst, &route,latency);
+ /* Common ancestor is kind enough to declare a bypass route from src to dst -- use it and bail out */
+ if (e_route_bypass) {
+ xbt_dynar_merge(links,&(e_route_bypass->link_list));
+ generic_free_route(e_route_bypass);
return;
}
- /* If we are here, src and dst are not in the same AS; check whether a direct bypass is defined */
-
- route_t e_route_bypass = NULL;
- if (common_father->get_bypass_route)
- e_route_bypass = common_father->get_bypass_route(common_father, src, dst);
+ /* If src and dst are in the same AS, life is good */
+ if (src_father == dst_father) { /* SURF_ROUTING_BASE */
- if (e_route_bypass) { /* Common ancestor is kind enough to declare a bypass route from src to dst -- use it and bail out */
- if (latency)
- xbt_die("Bypass cannot work yet with get_latency"); // FIXME: get_bypass_route should update the latency itself, just like get_route
+ route.link_list = *links;
-// // FIXME this path is never tested. I need examples to check the bypass mechanism...
-// THROW_UNIMPLEMENTED; // let's warn the users of the problem
- xbt_dynar_merge(links,&(e_route_bypass->link_list));
- generic_free_route(e_route_bypass);
+ common_father->get_route_and_latency(common_father, src, dst, &route,latency);
return;
}
/* Not in the same AS, no bypass. We'll have to find our path between the ASes recursively*/
- route.link_list = xbt_dynar_new(global_routing->size_of_link, NULL);
+ route.link_list = xbt_dynar_new(sizeof(sg_routing_link_t), NULL);
// Find the net_card corresponding to father
network_element_t src_father_net_elm = src_father->net_elem;
network_element_t dst_father_net_elm = dst_father->net_elem;
network_element_t dst,
xbt_dynar_t * route, double *latency)
{
+ XBT_DEBUG("routing_get_route_and_latency from %s to %s",src->name,dst->name);
if (!*route) {
xbt_dynar_reset(global_routing->last_route);
*route = global_routing->last_route;
*
* Make a global routing structure and set all the parsing functions.
*/
-void routing_model_create(size_t size_of_links, void *loopback)
+void routing_model_create( void *loopback)
{
/* config the uniq global routing */
global_routing = xbt_new0(s_routing_global_t, 1);
global_routing->root = NULL;
global_routing->get_onelink_routes = get_onelink_routes;
global_routing->loopback = loopback;
- global_routing->size_of_link = size_of_links;
- global_routing->last_route = xbt_dynar_new(global_routing->size_of_link,NULL);
+ global_routing->last_route = xbt_dynar_new(sizeof(sg_routing_link_t),NULL);
/* no current routing at moment */
current_routing = NULL;
}
surfxml_add_callback(STag_surfxml_ASroute_cb_list, &routing_parse_S_ASroute);
surfxml_add_callback(STag_surfxml_bypassRoute_cb_list,
&routing_parse_S_bypassRoute);
+ 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_ASroute_cb_list, &routing_parse_E_ASroute);
surfxml_add_callback(ETag_surfxml_bypassRoute_cb_list,
&routing_parse_E_bypassRoute);
+ surfxml_add_callback(ETag_surfxml_bypassASroute_cb_list,
+ &routing_parse_E_bypassASroute);
sg_platf_cluster_add_cb(routing_parse_cluster);