src/surf/surf_routing_dijkstra.c
src/surf/surf_routing_none.c
src/surf/surf_routing_cluster.c
+ src/surf/surf_routing_vivaldi.c
src/surf/surf_config.c
src/surf/maxmin.c
src/surf/fair_bottleneck.c
print "\t\tbw_in=\"13380000\" bw_out=\"1024000\" lat=\"5E-4\" />\n\n";
}
}
-print "\t\t<ASroute src=\"(.*)\"\n\t\t\tdst=\"(.*)\"\n\t\t\tgw_src=\"router_\$1src\"\n\t\t\tgw_dst=\"router_\$1dst\">\n\t\t</ASroute>\n";
print "\t</AS>\n";
print "</platform>";
-print " \n";
\ No newline at end of file
+print " \n";
<peer id="peer-225" coordinates="268.1 60.1 0.2 " power="730000000.0"
bw_in="13380000" bw_out="1024000" lat="5E-4" />
-
- <ASroute src="(.*)"
- dst="(.*)"
- gw_src="router_$1src"
- gw_dst="router_$1dst">
- </ASroute>
</AS>
</platform>
<peer id="peer-2499" coordinates="-32.7 -13.3 1.4 " power="730000000.0"
bw_in="13380000" bw_out="1024000" lat="5E-4" />
-
- <ASroute src="(.*)"
- dst="(.*)"
- gw_src="router_$1src"
- gw_dst="router_$1dst">
- </ASroute>
</AS>
</platform>
<peer id="peer-1739" coordinates="36.2 -52.2 0.7 " power="730000000.0"
bw_in="13380000" bw_out="1024000" lat="5E-4" />
-
- <ASroute src="(.*)"
- dst="(.*)"
- gw_src="router_$1src"
- gw_dst="router_$1dst">
- </ASroute>
</AS>
</platform>
ws_list = SD_workstation_get_list();
reclaimed = xbt_dynar_new(sizeof(bcast_task_t),xbt_free_ref);
xbt_dynar_t done = NULL;
- send_one(0,262144);
+ send_one(0,SD_workstation_get_number());
do {
if (done != NULL && xbt_dynar_length(done) > 0) {
unsigned int cursor;
{"none", "No routing (usable with Constant network only)",
model_none_create, model_none_load, model_none_unload, model_none_end},
{"RuleBased", "Rule-Based routing data (...)", model_rulebased_create,
- model_rulebased_load, model_rulebased_unload, model_rulebased_end},
-{"Vivaldi", "Vivaldi routing", model_rulebased_create,
- model_rulebased_load, model_rulebased_unload, model_rulebased_end},
+ model_none_load, model_none_unload, model_none_end},
+{"Vivaldi", "Vivaldi routing", model_vivaldi_create,
+ model_none_load, model_none_unload, model_none_end},
{"Cluster", "Cluster routing", model_cluster_create,
- model_rulebased_load, model_rulebased_unload, model_rulebased_end},
+ model_none_load, model_none_unload, model_none_end},
{NULL, NULL, NULL, NULL, NULL, NULL}
};
-static double euclidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t dst)
-{
- double src_coord, dst_coord;
-
- src_coord = atof(xbt_dynar_get_as(src, index, char *));
- dst_coord = atof(xbt_dynar_get_as(dst, index, char *));
-
- return (src_coord-dst_coord)*(src_coord-dst_coord);
-
-}
-
-static double base_vivaldi_get_latency (const char *src, const char *dst)
-{
- double euclidean_dist;
- xbt_dynar_t src_ctn, dst_ctn;
- src_ctn = xbt_lib_get_or_null(host_lib, src, COORD_HOST_LEVEL);
- if(!src_ctn) src_ctn = xbt_lib_get_or_null(as_router_lib, src, COORD_ASR_LEVEL);
- dst_ctn = xbt_lib_get_or_null(host_lib, dst, COORD_HOST_LEVEL);
- if(!dst_ctn) dst_ctn = xbt_lib_get_or_null(as_router_lib, dst, COORD_ASR_LEVEL);
-
- if(dst_ctn == NULL || src_ctn == NULL)
- xbt_die("Coord src '%s' :%p dst '%s' :%p",src,src_ctn,dst,dst_ctn);
-
- euclidean_dist = sqrt (euclidean_dist_comp(0,src_ctn,dst_ctn)+euclidean_dist_comp(1,src_ctn,dst_ctn))
- + fabs(atof(xbt_dynar_get_as(src_ctn, 2, char *)))+fabs(atof(xbt_dynar_get_as(dst_ctn, 2, char *)));
-
- xbt_assert(euclidean_dist>=0, "Euclidean Dist is less than 0\"%s\" and \"%.2f\"", src, euclidean_dist);
-
- //From .ms to .s
- return euclidean_dist / 1000;
-}
-
-static double vivaldi_get_link_latency (routing_component_t rc,const char *src, const char *dst, route_extended_t e_route)
-{
- if(get_network_element_type(src) == SURF_NETWORK_ELEMENT_AS) {
- int need_to_clean = e_route?0:1;
- double latency;
- e_route = e_route?e_route:(*(rc->get_route)) (rc, src, dst);
- latency = base_vivaldi_get_latency(e_route->src_gateway,e_route->dst_gateway);
- if(need_to_clean) generic_free_extended_route(e_route);
- return latency;
- } else {
- return base_vivaldi_get_latency(src,dst);
- }
-}
-
/**
* \brief Add a "host" to the network element list
*/
new_routing->name = xbt_strdup(AS_id);
new_routing->routing_sons = xbt_dict_new();
- /* Hack for Vivaldi */
- if(!strcmp(model->name,"Vivaldi"))
- new_routing->get_latency = vivaldi_get_link_latency;
-
if (current_routing == NULL && global_routing->root == NULL) {
/* it is the first one */
SURFXML_START_TAG(AS);
XBT_DEBUG(" ");
- host_id = bprintf("peer_%s", struct_peer->V_peer_id);
- router_id = bprintf("router_%s", struct_peer->V_peer_id);
- link_id_up = bprintf("link_%s_up", struct_peer->V_peer_id);
- link_id_down = bprintf("link_%s_down", struct_peer->V_peer_id);
+ host_id = HOST_PEER(struct_peer->V_peer_id);
+ router_id = ROUTER_PEER(struct_peer->V_peer_id);
+ link_id_up = LINK_UP_PEER(struct_peer->V_peer_id);
+ link_id_down = LINK_DOWN_PEER(struct_peer->V_peer_id);
link_router = bprintf("%s_link_router", struct_peer->V_peer_id);
link_backbone = bprintf("%s_backbone", struct_peer->V_peer_id);
/* ************************************************** */
/* ************** RULE-BASED ROUTING **************** */
void *model_rulebased_create(void); /* create structures for rulebased routing model */
-void model_rulebased_load(void); /* load parse functions for rulebased routing model */
-void model_rulebased_unload(void); /* unload parse functions for rulebased routing model */
-void model_rulebased_end(void); /* finalize the creation of rulebased routing model */
/* ************************************************** */
/* ************** Cluster ROUTING **************** */
void *model_cluster_create(void); /* create structures for cluster routing model */
-void model_cluster_load(void); /* load parse functions for cluster routing model */
-void model_cluster_unload(void); /* unload parse functions for cluster routing model */
-void model_cluster_end(void); /* finalize the creation of cluster routing model */
+
+/* ************************************************** */
+/* ************** Vivaldi ROUTING **************** */
+void *model_vivaldi_create(void); /* create structures for vivaldi routing model */
+#define HOST_PEER(peername) bprintf("peer_%s", peername)
+#define ROUTER_PEER(peername) bprintf("router_%s", peername)
+#define LINK_UP_PEER(peername) bprintf("link_%s_up", peername)
+#define LINK_DOWN_PEER(peername) bprintf("link_%s_down", peername)
/* ************************************************************************** */
/* ********** Dijkstra & Dijkstra Cached ROUTING **************************** */
&rule_route_extended_free);
return new_component;
}
-
-void model_rulebased_load(void)
-{
- /* use "surfxml_add_callback" to add a parse function call */
-}
-
-void model_rulebased_unload(void)
-{
- /* use "surfxml_del_callback" to remove a parse function call */
-}
-
-void model_rulebased_end(void)
-{
-}
--- /dev/null
+/* Copyright (c) 2009, 2010, 2011. The SimGrid Team.
+ * All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+#include "surf_routing_private.h"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_vivaldi, surf, "Routing part of surf");
+
+/* Routing model structure */
+
+typedef struct {
+ s_routing_component_t generic_routing;
+ xbt_dict_t dict_processing_units;
+ xbt_dict_t dict_autonomous_systems;
+} s_routing_component_vivaldi_t, *routing_component_vivaldi_t;
+
+/* Parse routing model functions */
+
+static route_extended_t vivaldi_get_route(routing_component_t rc,
+ const char *src,
+ const char *dst);
+
+/* Business methods */
+static route_extended_t vivaldi_get_route(routing_component_t rc,
+ const char *src,
+ const char *dst)
+{
+ xbt_assert(rc && src
+ && dst,
+ "Invalid params for \"get_route\" function at AS \"%s\"",
+ rc->name);
+
+ route_extended_t new_e_route = xbt_new0(s_route_extended_t, 1);
+ new_e_route->src_gateway = ROUTER_PEER(src);
+ new_e_route->dst_gateway = ROUTER_PEER(dst);
+ new_e_route->generic_route.link_list = xbt_dynar_new(0, NULL);
+ return new_e_route;
+}
+
+static double euclidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t dst)
+{
+ double src_coord, dst_coord;
+
+ src_coord = atof(xbt_dynar_get_as(src, index, char *));
+ dst_coord = atof(xbt_dynar_get_as(dst, index, char *));
+
+ return (src_coord-dst_coord)*(src_coord-dst_coord);
+
+}
+
+static double base_vivaldi_get_latency (const char *src, const char *dst)
+{
+ double euclidean_dist;
+ xbt_dynar_t src_ctn, dst_ctn;
+ src_ctn = xbt_lib_get_or_null(host_lib, src, COORD_HOST_LEVEL);
+ if(!src_ctn) src_ctn = xbt_lib_get_or_null(as_router_lib, src, COORD_ASR_LEVEL);
+ dst_ctn = xbt_lib_get_or_null(host_lib, dst, COORD_HOST_LEVEL);
+ if(!dst_ctn) dst_ctn = xbt_lib_get_or_null(as_router_lib, dst, COORD_ASR_LEVEL);
+
+ if(dst_ctn == NULL || src_ctn == NULL)
+ xbt_die("Coord src '%s' :%p dst '%s' :%p",src,src_ctn,dst,dst_ctn);
+
+ euclidean_dist = sqrt (euclidean_dist_comp(0,src_ctn,dst_ctn)+euclidean_dist_comp(1,src_ctn,dst_ctn))
+ + fabs(atof(xbt_dynar_get_as(src_ctn, 2, char *)))+fabs(atof(xbt_dynar_get_as(dst_ctn, 2, char *)));
+
+ xbt_assert(euclidean_dist>=0, "Euclidean Dist is less than 0\"%s\" and \"%.2f\"", src, euclidean_dist);
+
+ //From .ms to .s
+ return euclidean_dist / 1000;
+}
+
+static double vivaldi_get_link_latency (routing_component_t rc,const char *src, const char *dst, route_extended_t e_route)
+{
+ if(get_network_element_type(src) == SURF_NETWORK_ELEMENT_AS) {
+ int need_to_clean = e_route?0:1;
+ double latency;
+ e_route = e_route?e_route:(*(rc->get_route)) (rc, src, dst);
+ latency = base_vivaldi_get_latency(e_route->src_gateway,e_route->dst_gateway);
+ if(need_to_clean) generic_free_extended_route(e_route);
+ return latency;
+ } else {
+ return base_vivaldi_get_latency(src,dst);
+ }
+}
+
+/* Creation routing model functions */
+void *model_vivaldi_create(void)
+{
+ routing_component_vivaldi_t new_component = model_none_create();
+ new_component->generic_routing.get_route = vivaldi_get_route;
+ new_component->generic_routing.get_latency = vivaldi_get_link_latency;
+ return new_component;
+}