+static double time_to_next_flow_completion = -1;
+
+static double ns3_share_resources(double min);
+static void ns3_update_actions_state(double now, double delta);
+static void finalize(void);
+static surf_action_t ns3_communicate(sg_routing_edge_t src_elm,
+ sg_routing_edge_t dst_elm,
+ double size, double rate);
+static void action_suspend(surf_action_t action);
+static void action_resume(surf_action_t action);
+static int action_is_suspended(surf_action_t action);
+static int action_unref(surf_action_t action);
+
+xbt_dynar_t IPV4addr;
+
+static void replace_bdw_ns3(char ** bdw)
+{
+ char *temp = xbt_strdup(*bdw);
+ xbt_free(*bdw);
+ *bdw = bprintf("%fBps",atof(temp));
+ xbt_free(temp);
+
+}
+
+static void replace_lat_ns3(char ** lat)
+{
+ char *temp = xbt_strdup(*lat);
+ xbt_free(*lat);
+ *lat = bprintf("%fs",atof(temp));
+ xbt_free(temp);
+}
+
+static void parse_ns3_add_host(sg_platf_host_cbarg_t host)
+{
+ XBT_DEBUG("NS3_ADD_HOST '%s'",host->id);
+ xbt_lib_set(host_lib,
+ host->id,
+ NS3_HOST_LEVEL,
+ ns3_add_host(host->id)
+ );
+}
+
+static void parse_ns3_add_link(sg_platf_link_cbarg_t link)
+{
+ XBT_DEBUG("NS3_ADD_LINK '%s'",link->id);
+
+ if(!IPV4addr) IPV4addr = xbt_dynar_new(sizeof(char*),free);
+
+ tmgr_trace_t bw_trace;
+ tmgr_trace_t state_trace;
+ tmgr_trace_t lat_trace;
+
+ bw_trace = link->bandwidth_trace;
+ lat_trace = link->latency_trace;
+ state_trace = link->state_trace;
+
+ if (bw_trace)
+ XBT_INFO("The NS3 network model doesn't support bandwidth state traces");
+ if (lat_trace)
+ XBT_INFO("The NS3 network model doesn't support latency state traces");
+ if (state_trace)
+ XBT_INFO("The NS3 network model doesn't support link state traces");
+
+ ns3_link_t link_ns3 = xbt_new0(s_ns3_link_t,1);;
+ link_ns3->id = xbt_strdup((char*)(link->id));
+ link_ns3->bdw = bprintf("%f",link->bandwidth);
+ link_ns3->lat = bprintf("%f",link->latency);
+
+ surf_ns3_link_t l = xbt_new0(s_surf_ns3_link_t,1);
+ l->generic_resource.name = xbt_strdup(link->id);
+ l->generic_resource.properties = current_property_set;
+ l->data = link_ns3;
+ l->created = 1;
+
+ xbt_lib_set(link_lib,link->id,NS3_LINK_LEVEL,link_ns3);
+ xbt_lib_set(link_lib,link->id,SURF_LINK_LEVEL,l);
+}
+
+static void parse_ns3_add_router(sg_platf_router_cbarg_t router)
+{
+ XBT_DEBUG("NS3_ADD_ROUTER '%s'",router->id);
+ xbt_lib_set(as_router_lib,
+ router->id,
+ NS3_ASR_LEVEL,
+ ns3_add_router(router->id)
+ );
+}
+
+static void parse_ns3_add_AS(sg_platf_AS_cbarg_t AS)
+{
+ XBT_DEBUG("NS3_ADD_AS '%s'",AS->id);
+ xbt_lib_set(as_router_lib,
+ AS->id,
+ NS3_ASR_LEVEL,
+ ns3_add_AS(AS->id)
+ );
+}
+
+static void parse_ns3_add_cluster(sg_platf_cluster_cbarg_t cluster)
+{
+ const char *cluster_prefix = cluster->prefix;
+ const char *cluster_suffix = cluster->suffix;
+ const char *cluster_radical = cluster->radical;
+ const char *cluster_bb_bw = bprintf("%f",cluster->bb_bw);
+ const char *cluster_bb_lat = bprintf("%f",cluster->bb_lat);
+ const char *cluster_bw = bprintf("%f",cluster->bw);
+ const char *cluster_lat = bprintf("%f",cluster->lat);
+ const char *groups = NULL;
+
+ int start, end, i;
+ unsigned int iter;
+
+ xbt_dynar_t radical_elements;
+ xbt_dynar_t radical_ends;
+ xbt_dynar_t tab_elements_num = xbt_dynar_new(sizeof(int), NULL);
+
+ char *router_id,*host_id;
+
+ 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:
+ start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *));
+ xbt_dynar_push_as(tab_elements_num, int, start);
+ router_id = bprintf("ns3_%s%d%s", cluster_prefix, start, cluster_suffix);
+ xbt_lib_set(host_lib,
+ router_id,
+ NS3_HOST_LEVEL,
+ ns3_add_host_cluster(router_id)
+ );
+ XBT_DEBUG("NS3_ADD_ROUTER '%s'",router_id);
+ free(router_id);
+ break;
+
+ case 2:
+ start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *));
+ end = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char *));
+ for (i = start; i <= end; i++){
+ xbt_dynar_push_as(tab_elements_num, int, i);
+ router_id = bprintf("ns3_%s%d%s", cluster_prefix, i, cluster_suffix);
+ xbt_lib_set(host_lib,
+ router_id,
+ NS3_HOST_LEVEL,
+ ns3_add_host_cluster(router_id)
+ );
+ XBT_DEBUG("NS3_ADD_ROUTER '%s'",router_id);
+ free(router_id);
+ }
+ break;
+
+ default:
+ XBT_DEBUG("Malformed radical");
+ }
+ }
+
+ //Create links
+ unsigned int cpt;
+ int elmts;
+ char * lat = xbt_strdup(cluster_lat);
+ char * bw = xbt_strdup(cluster_bw);
+ replace_lat_ns3(&lat);
+ replace_bdw_ns3(&bw);
+
+ xbt_dynar_foreach(tab_elements_num,cpt,elmts)
+ {
+ host_id = bprintf("%s%d%s", cluster_prefix, elmts, cluster_suffix);
+ router_id = bprintf("ns3_%s%d%s", cluster_prefix, elmts, cluster_suffix);
+ XBT_DEBUG("Create link from '%s' to '%s'",host_id,router_id);
+
+ ns3_nodes_t host_src = xbt_lib_get_or_null(host_lib,host_id, NS3_HOST_LEVEL);
+ ns3_nodes_t host_dst = xbt_lib_get_or_null(host_lib,router_id,NS3_HOST_LEVEL);
+
+ if(host_src && host_dst){}
+ else xbt_die("\tns3_add_link from %d to %d",host_src->node_num,host_dst->node_num);
+
+ ns3_add_link(host_src->node_num,host_src->type,
+ host_dst->node_num,host_dst->type,
+ bw,lat);
+
+ free(router_id);
+ free(host_id);
+ }
+ xbt_dynar_free(&tab_elements_num);
+
+
+ //Create link backbone
+ lat = xbt_strdup(cluster_bb_lat);
+ bw = xbt_strdup(cluster_bb_bw);
+ replace_lat_ns3(&lat);
+ replace_bdw_ns3(&bw);
+ ns3_add_cluster(bw,lat,cluster->id);
+ xbt_free(lat);
+ xbt_free(bw);
+}
+
+static double ns3_get_link_latency (const void *link)