/* Global vars */
extern routing_global_t global_routing;
extern routing_component_t current_routing;
-extern model_type_t current_routing_model;
+extern routing_model_description_t current_routing_model;
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_dijkstra, surf, "Routing part of surf");
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_dijkstra, surf, "Routing part of surf -- dijkstra routing logic");
typedef struct {
s_routing_component_t generic_routing;
static void graph_node_map_elem_free(void *e)
{
graph_node_map_element_t elm = (graph_node_map_element_t) e;
- if (elm) {
- xbt_free(elm);
- }
+ xbt_free(elm);
}
static void graph_edge_data_free(void *e)
route_extended_t e_route = (route_extended_t) e;
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->src_gateway);
+ xbt_free(e_route->dst_gateway);
xbt_free(e_route);
}
}
}
}
-/* Business methods */
+static route_extended_t dijkstra_get_route(routing_component_t rc,
+ const char *src,
+ const char *dst);
+
static xbt_dynar_t dijkstra_get_onelink_routes(routing_component_t rc)
{
- xbt_die("\"dijkstra_get_onelink_routes\" function not implemented yet");
+ // xbt_die("\"dijkstra_get_onelink_routes\" function not implemented yet");
+ xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free);
+
+ routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc;
+ //size_t table_size = xbt_dict_length(routing->generic_routing.to_index);
+ xbt_dict_cursor_t c1 = NULL, c2 = NULL;
+ char *k1, *d1, *k2, *d2;
+ xbt_dict_foreach(routing->generic_routing.to_index, c1, k1, d1) {
+ xbt_dict_foreach(routing->generic_routing.to_index, c2, k2, d2) {
+ route_extended_t route = dijkstra_get_route(rc, k1, k2);
+ if (route) {
+ if (xbt_dynar_length(route->generic_route.link_list) == 1) {
+ void *link =
+ *(void **) xbt_dynar_get_ptr(route->generic_route.link_list,
+ 0);
+ onelink_t onelink = xbt_new0(s_onelink_t, 1);
+ onelink->link_ptr = link;
+ if (routing->generic_routing.hierarchy == SURF_ROUTING_BASE) {
+ onelink->src = xbt_strdup(k1);
+ onelink->dst = xbt_strdup(k2);
+ } else if (routing->generic_routing.hierarchy ==
+ SURF_ROUTING_RECURSIVE) {
+ onelink->src = xbt_strdup(route->src_gateway);
+ onelink->dst = xbt_strdup(route->dst_gateway);
+ }
+ xbt_dynar_push(ret, &onelink);
+ }
+ }
+ }
+ }
+ return ret;
}
static route_extended_t dijkstra_get_route(routing_component_t rc,
/* Creation routing model functions */
-void *model_dijkstra_both_create(int cached)
+routing_component_t model_dijkstra_both_create(int cached)
{
- routing_component_dijkstra_t new_component =
- xbt_new0(s_routing_component_dijkstra_t, 1);
- new_component->generic_routing.set_processing_unit =
- generic_set_processing_unit;
- new_component->generic_routing.set_autonomous_system =
- generic_set_autonomous_system;
- new_component->generic_routing.set_route = model_dijkstra_both_set_route;
- new_component->generic_routing.set_ASroute = model_dijkstra_both_set_route;
- new_component->generic_routing.set_bypassroute = generic_set_bypassroute;
+ routing_component_dijkstra_t new_component = (routing_component_dijkstra_t)
+ routmod_generic_create(sizeof(s_routing_component_dijkstra_t));
+
+ new_component->generic_routing.parse_route = model_dijkstra_both_parse_route;
+ new_component->generic_routing.parse_ASroute = model_dijkstra_both_parse_route;
new_component->generic_routing.get_route = dijkstra_get_route;
- new_component->generic_routing.get_latency = generic_get_link_latency;
new_component->generic_routing.get_onelink_routes =
dijkstra_get_onelink_routes;
- new_component->generic_routing.get_bypass_route =
- generic_get_bypassroute;
new_component->generic_routing.finalize = dijkstra_finalize;
new_component->cached = cached;
- new_component->generic_routing.to_index = xbt_dict_new();
- new_component->generic_routing.bypassRoutes = xbt_dict_new();
- new_component->generic_routing.get_network_element_type = get_network_element_type;
- return new_component;
+
+ return (routing_component_t)new_component;
}
-void *model_dijkstra_create(void)
+routing_component_t model_dijkstra_create(void)
{
return model_dijkstra_both_create(0);
}
-void *model_dijkstracache_create(void)
+routing_component_t model_dijkstracache_create(void)
{
return model_dijkstra_both_create(1);
}
-void model_dijkstra_both_load(void)
-{
- /* use "surfxml_add_callback" to add a parse function call */
-}
-
-void model_dijkstra_both_unload(void)
-{
- /* use "surfxml_del_callback" to remove a parse function call */
-}
-
void model_dijkstra_both_end(void)
{
routing_component_dijkstra_t routing =
}
}
-void model_dijkstra_both_set_route (routing_component_t rc, const char *src,
- const char *dst, name_route_extended_t route)
+void model_dijkstra_both_parse_route (routing_component_t rc, const char *src,
+ const char *dst, route_extended_t route)
{
routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc;
int *src_id, *dst_id;