Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add model Reno, NewReno and Tahoe with ns3
[simgrid.git] / src / surf / surf.c
index de300f9..8acdd35 100644 (file)
@@ -131,6 +131,11 @@ s_surf_model_description_t surf_network_model_description[] = {
   {"GTNets",
    "Network Pseudo-model using the GTNets simulator instead of an analytic model",
    NULL, surf_network_model_init_GTNETS},
   {"GTNets",
    "Network Pseudo-model using the GTNets simulator instead of an analytic model",
    NULL, surf_network_model_init_GTNETS},
+#endif
+#ifdef HAVE_NS3
+  {"NS3",
+   "Use NS3 tcp model",
+       NULL, surf_network_model_init_NS3},
 #endif
   {"Reno",
    "Model using lagrange_solve instead of lmm_solve (experts only)", NULL,
 #endif
   {"Reno",
    "Model using lagrange_solve instead of lmm_solve (experts only)", NULL,
@@ -217,7 +222,7 @@ double generic_maxmin_share_resources(xbt_swag_t running_actions,
   double value = -1;
 #define VARIABLE(action) (*((lmm_variable_t*)(((char *) (action)) + (offset))))
 
   double value = -1;
 #define VARIABLE(action) (*((lmm_variable_t*)(((char *) (action)) + (offset))))
 
-  xbt_assert0(solve, "Give me a real solver function!");
+  xbt_assert(solve, "Give me a real solver function!");
   solve(sys);
 
   xbt_swag_foreach(action, running_actions) {
   solve(sys);
 
   xbt_swag_foreach(action, running_actions) {
@@ -290,17 +295,13 @@ void surf_init(int *argc, char **argv)
        as_router_lib = xbt_lib_new();
 
        XBT_DEBUG("ADD ROUTING LEVEL");
        as_router_lib = xbt_lib_new();
 
        XBT_DEBUG("ADD ROUTING LEVEL");
-       ROUTING_HOST_LEVEL = xbt_lib_add_level(host_lib,free);
-       ROUTING_ASR_LEVEL  = xbt_lib_add_level(as_router_lib,free);
+       ROUTING_HOST_LEVEL = xbt_lib_add_level(host_lib,xbt_free);
+       ROUTING_ASR_LEVEL  = xbt_lib_add_level(as_router_lib,xbt_free);
 
        XBT_DEBUG("ADD SURF LEVELS");
 
        XBT_DEBUG("ADD SURF LEVELS");
-       SURF_CPU_LEVEL = xbt_lib_add_level(host_lib,free);
-       SURF_WKS_LEVEL = xbt_lib_add_level(host_lib,free);
-       SURF_LINK_LEVEL = xbt_lib_add_level(link_lib,free);
-
-       XBT_DEBUG("ADD COORD LEVEL");
-       COORD_HOST_LEVEL = xbt_lib_add_level(host_lib,free);
-       COORD_ASR_LEVEL  = xbt_lib_add_level(as_router_lib,free);
+       SURF_CPU_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free);
+       SURF_WKS_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free);
+       SURF_LINK_LEVEL = xbt_lib_add_level(link_lib,surf_resource_free);
 
   /* Connect our log channels: that must be done manually under windows */
   XBT_LOG_CONNECT(surf_cpu, surf);
 
   /* Connect our log channels: that must be done manually under windows */
   XBT_LOG_CONNECT(surf_cpu, surf);
@@ -386,9 +387,14 @@ void surf_exit(void)
   if (surf_path)
     xbt_dynar_free(&surf_path);
 
   if (surf_path)
     xbt_dynar_free(&surf_path);
 
+  xbt_lib_free(&host_lib);
+  xbt_lib_free(&link_lib);
+  xbt_lib_free(&as_router_lib);
+
   tmgr_finalize();
   surf_parse_lex_destroy();
   surf_parse_free_callbacks();
   tmgr_finalize();
   surf_parse_lex_destroy();
   surf_parse_free_callbacks();
+
   NOW = 0;                      /* Just in case the user plans to restart the simulation afterward */
 }
 
   NOW = 0;                      /* Just in case the user plans to restart the simulation afterward */
 }
 
@@ -436,14 +442,30 @@ double surf_solve(double max_date)
 
   XBT_DEBUG("Looking for next action end");
   xbt_dynar_foreach(model_list, iter, model) {
 
   XBT_DEBUG("Looking for next action end");
   xbt_dynar_foreach(model_list, iter, model) {
-    XBT_DEBUG("Running for Resource [%s]", model->name);
-    model_next_action_end = model->model_private->share_resources(NOW);
-    XBT_DEBUG("Resource [%s] : next action end = %f",
-           model->name, model_next_action_end);
-    if (((min < 0.0) || (model_next_action_end < min))
-        && (model_next_action_end >= 0.0))
-      min = model_next_action_end;
+
+       if(strcmp(model->name,"network NS3") ){
+               XBT_DEBUG("Running for Resource [%s]", model->name);
+               model_next_action_end = model->model_private->share_resources(NOW);
+               XBT_DEBUG("Resource [%s] : next action end = %f",
+                          model->name, model_next_action_end);
+               if (((min < 0.0) || (model_next_action_end < min))
+                       && (model_next_action_end >= 0.0))
+                 min = model_next_action_end;
+         }
   }
   }
+
+  XBT_DEBUG("Min for other resources : %f", min);
+
+
+  if(surf_network_model->name && !strcmp(surf_network_model->name,"network NS3")){
+       // run until min or next flow
+       model_next_action_end = surf_network_model->model_private->share_resources(min);
+       XBT_DEBUG("Min for NS3 : %f", model_next_action_end);
+       if ( ((min < 0.0) || (model_next_action_end < min)) && ( model_next_action_end >= 0.0 ))
+               min = model_next_action_end;
+  }
+
+
   XBT_DEBUG("Next action end : %f", min);
 
   XBT_DEBUG("Looking for next event");
   XBT_DEBUG("Next action end : %f", min);
 
   XBT_DEBUG("Looking for next event");