+
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+ surf_network_model->get_latency_limited = ns3_get_link_latency_limited;
+#endif
+}
+
+static void finalize(void)
+{
+ ns3_finalize();
+ xbt_dynar_free_container(&IPV4addr);
+}
+
+static double ns3_share_resources(double min)
+{
+ XBT_DEBUG("ns3_share_resources");
+
+ xbt_swag_t running_actions =
+ surf_network_model->states.running_action_set;
+
+ //get the first relevant value from the running_actions list
+ if (!xbt_swag_size(running_actions))
+ return -1.0;
+
+ ns3_simulator(min);
+ time_to_next_flow_completion = ns3_time() - surf_get_clock();
+
+// XBT_INFO("min : %f",min);
+// XBT_INFO("ns3 time : %f",ns3_time());
+// XBT_INFO("surf time : %f",surf_get_clock());
+
+ xbt_assert(time_to_next_flow_completion,
+ "Time to next flow completion not initialized!\n");
+
+ XBT_DEBUG("ns3_share_resources return %f",time_to_next_flow_completion);
+ return time_to_next_flow_completion;
+}
+
+static void ns3_update_actions_state(double now, double delta)
+{
+ xbt_dict_cursor_t cursor = NULL;
+ char *key;
+ void *data;
+
+ surf_action_t action = NULL;
+ xbt_swag_t running_actions =
+ surf_network_model->states.running_action_set;
+
+ /* If there are no running flows, just return */
+ if (!xbt_swag_size(running_actions))
+ return;
+
+ xbt_dict_foreach(dict_socket,cursor,key,data){
+ action = (surf_action_t)ns3_get_socket_action(data);
+ action->remains = ns3_get_socket_remains(data);
+ if(ns3_get_socket_is_finished(data) == 1){
+ action->finish = now;
+ surf_action_state_set(action, SURF_ACTION_DONE);
+ }
+ }
+ return;
+}
+
+/* Max durations are not supported */
+static surf_action_t communicate(const char *src_name,
+ const char *dst_name, double size, double rate)
+{
+ surf_action_t action = NULL;
+
+ XBT_DEBUG("Communicate from %s to %s",src_name,dst_name);
+ action = surf_action_new(sizeof(s_surf_action_t), size, surf_network_model, 0);
+
+ ns3_create_flow(src_name, dst_name, surf_get_clock(), size, action);
+
+ return (surf_action_t) action;
+}
+
+/* Suspend a flow() */
+static void action_suspend(surf_action_t action)
+{
+ THROW_UNIMPLEMENTED;
+}
+
+/* Resume a flow() */
+static void action_resume(surf_action_t action)
+{
+ THROW_UNIMPLEMENTED;
+}
+
+/* Test whether a flow is suspended */
+static int action_is_suspended(surf_action_t action)
+{
+ return 0;
+}
+
+static int action_unref(surf_action_t action)
+{
+ action->refcount--;
+ if (!action->refcount) {
+ xbt_swag_remove(action, action->state_set);
+ surf_action_free(&action);
+ return 1;
+ }
+ return 0;