Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add the latency factor for the standard model as well as for the new LegrandVelho...
[simgrid.git] / src / surf / network.c
1 /*      $Id$     */
2
3 /* Copyright (c) 2004 Arnaud Legrand. All rights reserved.                  */
4
5 /* This program is free software; you can redistribute it and/or modify it
6  * under the terms of the license (GNU LGPL) which comes with this package. */
7
8 #include "network_private.h"
9 #include "xbt/log.h"
10 #include "xbt/str.h"
11
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network, surf,
13                                 "Logging specific to the SURF network module");
14
15 surf_network_model_t surf_network_model = NULL;
16 static lmm_system_t network_maxmin_system = NULL;
17 static void (*network_solve) (lmm_system_t) = NULL;
18 xbt_dict_t link_set = NULL;
19 xbt_dict_t network_card_set = NULL;
20
21 double latency_factor = 1.0; /* default value */
22
23 int card_number = 0;
24 int host_number = 0;
25 link_CM02_t **routing_table = NULL;
26 int *routing_table_size = NULL;
27 static link_CM02_t loopback = NULL;
28
29 static void create_routing_table(void)
30 {
31   routing_table =
32       xbt_new0(link_CM02_t *, /*card_number * card_number */ host_number * host_number);
33   routing_table_size = xbt_new0(int, /*card_number * card_number*/ host_number * host_number);
34 }
35
36 static void link_free(void *nw_link)
37 {
38   free(((link_CM02_t) nw_link)->name);
39   xbt_dict_free(&(((link_CM02_t)nw_link)->properties));
40   free(nw_link);
41 }
42
43 static link_CM02_t link_new(char *name,
44                             double bw_initial,
45                             tmgr_trace_t bw_trace,
46                             double lat_initial,
47                             tmgr_trace_t lat_trace,
48                             e_surf_link_state_t
49                             state_initial,
50                             tmgr_trace_t state_trace,
51                             e_surf_link_sharing_policy_t
52                             policy, xbt_dict_t properties)
53 {
54   link_CM02_t nw_link = xbt_new0(s_link_CM02_t, 1);
55   xbt_assert1(!xbt_dict_get_or_null(link_set, name), 
56               "Link '%s' declared several times in the platform file.", name);   
57
58   nw_link->model = (surf_model_t) surf_network_model;
59   nw_link->name = name;
60   nw_link->bw_current = bw_initial;
61   if (bw_trace)
62     nw_link->bw_event =
63         tmgr_history_add_trace(history, bw_trace, 0.0, 0, nw_link);
64   nw_link->lat_current = lat_initial;
65   if (lat_trace)
66     nw_link->lat_event =
67         tmgr_history_add_trace(history, lat_trace, 0.0, 0, nw_link);
68   nw_link->state_current = state_initial;
69   if (state_trace)
70     nw_link->state_event =
71         tmgr_history_add_trace(history, state_trace, 0.0, 0, nw_link);
72
73   nw_link->constraint =
74       lmm_constraint_new(network_maxmin_system, nw_link,
75                          nw_link->bw_current);
76
77   if (policy == SURF_LINK_FATPIPE)
78     lmm_constraint_shared(nw_link->constraint);
79
80   nw_link->properties = properties;
81
82   current_property_set = properties;
83
84   xbt_dict_set(link_set, name, nw_link, link_free);
85
86   return nw_link;
87 }
88
89 static void network_card_free(void *nw_card)
90 {
91   free(((network_card_CM02_t) nw_card)->name);
92   free(nw_card);
93 }
94
95 static int network_card_new(const char *card_name)
96 {
97   network_card_CM02_t card =
98       xbt_dict_get_or_null(network_card_set, card_name);
99
100   if (!card) {
101     card = xbt_new0(s_network_card_CM02_t, 1);
102     card->name = xbt_strdup(card_name);
103     card->id = host_number++;
104     xbt_dict_set(network_card_set, card_name, card, network_card_free);
105   }
106   return card->id;
107 }
108
109 static void route_new(int src_id, int dst_id,
110                       link_CM02_t * link_list, int nb_link)
111 {
112   ROUTE_SIZE(src_id, dst_id) = nb_link;
113   ROUTE(src_id, dst_id) = link_list =
114       xbt_realloc(link_list, sizeof(link_CM02_t) * nb_link);
115 }
116
117 static void parse_link_init(void)
118 {
119   char *name_link;
120   double bw_initial;
121   tmgr_trace_t bw_trace;
122   double lat_initial;
123   tmgr_trace_t lat_trace;
124   e_surf_link_state_t state_initial_link = SURF_LINK_ON;
125   e_surf_link_sharing_policy_t policy_initial_link = SURF_LINK_SHARED;
126   tmgr_trace_t state_trace;
127
128   name_link = xbt_strdup(A_surfxml_link_id);
129   surf_parse_get_double(&bw_initial, A_surfxml_link_bandwidth);
130   surf_parse_get_trace(&bw_trace, A_surfxml_link_bandwidth_file);
131   surf_parse_get_double(&lat_initial, A_surfxml_link_latency);
132   surf_parse_get_trace(&lat_trace, A_surfxml_link_latency_file);
133
134   xbt_assert0((A_surfxml_link_state ==
135                A_surfxml_link_state_ON)
136               || (A_surfxml_link_state ==
137                   A_surfxml_link_state_OFF), "Invalid state");
138   if (A_surfxml_link_state == A_surfxml_link_state_ON)
139     state_initial_link = SURF_LINK_ON;
140   else if (A_surfxml_link_state ==
141            A_surfxml_link_state_OFF)
142     state_initial_link = SURF_LINK_OFF;
143
144   if (A_surfxml_link_sharing_policy ==
145       A_surfxml_link_sharing_policy_SHARED)
146     policy_initial_link = SURF_LINK_SHARED;
147   else if (A_surfxml_link_sharing_policy ==
148            A_surfxml_link_sharing_policy_FATPIPE)
149     policy_initial_link = SURF_LINK_FATPIPE;
150
151   surf_parse_get_trace(&state_trace, A_surfxml_link_state_file);
152
153   link_new(name_link, bw_initial, bw_trace,
154                    lat_initial, lat_trace, state_initial_link, state_trace,
155                    policy_initial_link, xbt_dict_new());
156
157 }
158
159 static int src_id = -1;
160 static int dst_id = -1;
161
162 static void parse_route_set_endpoints(void)
163 {
164   src_id = network_card_new(A_surfxml_route_src);
165   dst_id = network_card_new(A_surfxml_route_dst);
166   route_action = A_surfxml_route_action;
167 }
168
169 static void parse_route_set_route(void)
170 {
171   char *name;
172   if (src_id != -1 && dst_id != -1) {
173     name = bprintf("%x#%x",src_id, dst_id);
174     manage_route(route_table, name, route_action, 0);
175     free(name);    
176   }
177 }
178
179 static void add_loopback(void)
180 {
181   int i;
182   /* Adding loopback if needed */
183   for (i = 0; i < host_number; i++)
184     if (!ROUTE_SIZE(i, i)) {
185       if (!loopback)
186         loopback = link_new(xbt_strdup("__MSG_loopback__"),
187                                     498000000, NULL, 0.000015, NULL,
188                                     SURF_LINK_ON, NULL,
189                                     SURF_LINK_FATPIPE,NULL);
190       ROUTE_SIZE(i, i) = 1;
191       ROUTE(i, i) = xbt_new0(link_CM02_t, 1);
192       ROUTE(i, i)[0] = loopback;
193     }
194 }
195
196 static void add_route(void)
197 {
198   xbt_ex_t e;
199   int nb_link = 0;
200   unsigned int cpt = 0;    
201   int link_list_capacity = 0;
202   link_CM02_t *link_list = NULL;
203   xbt_dict_cursor_t cursor = NULL;
204   char *key,*data, *end;
205   const char *sep = "#";
206   xbt_dynar_t links, keys;
207
208   if (routing_table == NULL) create_routing_table();
209
210   xbt_dict_foreach(route_table, cursor, key, data) {
211           char* link = NULL;
212     nb_link = 0;
213     links = (xbt_dynar_t)data;
214     keys = xbt_str_split_str(key, sep);
215
216     link_list_capacity = xbt_dynar_length(links);
217     link_list = xbt_new(link_CM02_t, link_list_capacity);
218
219     src_id = strtol(xbt_dynar_get_as(keys, 0, char*), &end, 16);
220     dst_id = strtol(xbt_dynar_get_as(keys, 1, char*), &end, 16);
221     xbt_dynar_free(&keys);
222  
223     xbt_dynar_foreach (links, cpt, link) {
224       TRY {
225         link_list[nb_link++] = xbt_dict_get(link_set, link);
226       }
227       CATCH(e) {
228         RETHROW1("Link %s not found (dict raised this exception: %s)", link);
229       }     
230     }
231     route_new(src_id, dst_id, link_list, nb_link);
232    }
233 }
234
235 static void count_hosts(void)
236 {
237    host_number++;
238 }
239
240
241 static void add_traces(void) {
242    xbt_dict_cursor_t cursor=NULL;
243    char *trace_name,*elm;
244    
245    static int called = 0;
246    if (called) return;
247    called = 1;
248
249    /* connect all traces relative to network */
250    xbt_dict_foreach(trace_connect_list_link_avail, cursor, trace_name, elm) {
251       tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
252       link_CM02_t link = xbt_dict_get_or_null(link_set, elm);
253       
254       xbt_assert1(link, "Link %s undefined", elm);
255       xbt_assert1(trace, "Trace %s undefined", trace_name);
256       
257       link->state_event = tmgr_history_add_trace(history, trace, 0.0, 0, link);
258    }
259
260    xbt_dict_foreach(trace_connect_list_bandwidth, cursor, trace_name, elm) {
261       tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
262       link_CM02_t link = xbt_dict_get_or_null(link_set, elm);
263       
264       xbt_assert1(link, "Link %s undefined", elm);
265       xbt_assert1(trace, "Trace %s undefined", trace_name);
266       
267       link->bw_event = tmgr_history_add_trace(history, trace, 0.0, 0, link);
268    }
269    
270    xbt_dict_foreach(trace_connect_list_latency, cursor, trace_name, elm) {
271       tmgr_trace_t trace = xbt_dict_get_or_null(traces_set_list, trace_name);
272       link_CM02_t link = xbt_dict_get_or_null(link_set, elm);
273       
274       xbt_assert1(link, "Link %s undefined", elm);
275       xbt_assert1(trace, "Trace %s undefined", trace_name);
276       
277       link->lat_event = tmgr_history_add_trace(history, trace, 0.0, 0, link);
278    }
279 }
280
281 static void define_callbacks(const char *file)
282 {
283   /* Figuring out the network links */
284   surfxml_add_callback(STag_surfxml_host_cb_list, &count_hosts);
285   surfxml_add_callback(STag_surfxml_link_cb_list, &parse_link_init);
286   surfxml_add_callback(STag_surfxml_route_cb_list, &parse_route_set_endpoints);
287   surfxml_add_callback(ETag_surfxml_route_cb_list, &parse_route_set_route);
288   surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_traces);
289   surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_route);
290   surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_loopback);
291 }
292
293 static void *name_service(const char *name)
294 {
295   network_card_CM02_t card = xbt_dict_get_or_null(network_card_set, name);
296   return card;
297 }
298
299 static const char *get_resource_name(void *resource_id)
300 {
301   return ((network_card_CM02_t) resource_id)->name;
302 }
303
304 static int resource_used(void *resource_id)
305 {
306   return lmm_constraint_used(network_maxmin_system,
307                              ((link_CM02_t) resource_id)->
308                              constraint);
309 }
310
311 static int action_free(surf_action_t action)
312 {
313   action->refcount --;
314   if (!action->refcount ) {
315     xbt_swag_remove(action, action->state_set);
316     if (((surf_action_network_CM02_t) action)->variable)
317       lmm_variable_free(network_maxmin_system,
318                         ((surf_action_network_CM02_t) action)->variable);
319     free(action);
320     return 1;
321   }
322   return 0;
323 }
324
325 static void action_use(surf_action_t action)
326 {
327   action->refcount ++;
328 }
329
330 static void action_cancel(surf_action_t action)
331 {
332   return;
333 }
334
335 static void action_recycle(surf_action_t action)
336 {
337   return;
338 }
339
340 static void action_change_state(surf_action_t action,
341                                 e_surf_action_state_t state)
342 {
343 /*   if((state==SURF_ACTION_DONE) || (state==SURF_ACTION_FAILED)) */
344 /*     if(((surf_action_network_CM02_t)action)->variable) { */
345 /*       lmm_variable_disable(network_maxmin_system, ((surf_action_network_CM02_t)action)->variable); */
346 /*       ((surf_action_network_CM02_t)action)->variable = NULL; */
347 /*     } */
348
349   surf_action_change_state(action, state);
350   return;
351 }
352
353 static double share_resources(double now)
354 {
355   s_surf_action_network_CM02_t s_action;
356   surf_action_network_CM02_t action = NULL;
357   xbt_swag_t running_actions =
358       surf_network_model->common_public->states.running_action_set;
359   double min;
360
361   min = generic_maxmin_share_resources(running_actions,
362                                        xbt_swag_offset(s_action,
363                                                        variable),
364                                        network_maxmin_system,
365                                        network_solve);
366
367 #define VARIABLE(action) (*((lmm_variable_t*)(((char *) (action)) + xbt_swag_offset(s_action, variable)  )))
368   
369   xbt_swag_foreach(action, running_actions) {
370     if (action->latency > 0) {
371       if (min < 0)
372         min = action->latency;
373       else if (action->latency < min)
374         min = action->latency;
375     }
376   }
377
378   return min;
379 }
380
381 static void update_actions_state(double now, double delta)
382 {
383   double deltap = 0.0;
384   surf_action_network_CM02_t action = NULL;
385   surf_action_network_CM02_t next_action = NULL;
386   xbt_swag_t running_actions =
387       surf_network_model->common_public->states.running_action_set;
388   /*
389      xbt_swag_t failed_actions =
390      surf_network_model->common_public->states.failed_action_set;
391    */
392
393   xbt_swag_foreach_safe(action, next_action, running_actions) {
394     deltap = delta;
395     if (action->latency > 0) {
396       if (action->latency > deltap) {
397         double_update(&(action->latency), deltap);
398         deltap = 0.0;
399       } else {
400         double_update(&(deltap), action->latency);
401         action->latency = 0.0;
402       }
403       if ((action->latency == 0.0) && !(action->suspended))
404         lmm_update_variable_weight(network_maxmin_system, action->variable,
405                                    action->lat_current);
406     }
407     double_update(&(action->generic_action.remains),
408                   lmm_variable_getvalue(action->variable) * deltap);
409     if (action->generic_action.max_duration != NO_MAX_DURATION)
410       double_update(&(action->generic_action.max_duration), delta);
411
412     if ((action->generic_action.remains <= 0) &&
413         (lmm_get_variable_weight(action->variable) > 0)) {
414       action->generic_action.finish = surf_get_clock();
415       action_change_state((surf_action_t) action, SURF_ACTION_DONE);
416     } else if ((action->generic_action.max_duration != NO_MAX_DURATION) &&
417                (action->generic_action.max_duration <= 0)) {
418       action->generic_action.finish = surf_get_clock();
419       action_change_state((surf_action_t) action, SURF_ACTION_DONE);
420     }
421   }
422
423   return;
424 }
425
426 static void update_resource_state(void *id,
427                                   tmgr_trace_event_t event_type,
428                                   double value, double date)
429 {
430   link_CM02_t nw_link = id;
431   /*   printf("[" "%lg" "] Asking to update network card \"%s\" with value " */
432   /*     "%lg" " for event %p\n", surf_get_clock(), nw_link->name, */
433   /*     value, event_type); */
434
435   if (event_type == nw_link->bw_event) {
436     nw_link->bw_current = value;
437     lmm_update_constraint_bound(network_maxmin_system, nw_link->constraint,
438                                 nw_link->bw_current);
439   } else if (event_type == nw_link->lat_event) {
440     double delta = value - nw_link->lat_current;
441     lmm_variable_t var = NULL;
442     lmm_element_t elem = NULL;
443     surf_action_network_CM02_t action = NULL;
444
445     nw_link->lat_current = value;
446     while ((var= lmm_get_var_from_cnst
447            (network_maxmin_system, nw_link->constraint, &elem))) {
448       action = lmm_variable_id(var);
449       action->lat_current += delta;
450       if (action->rate < 0)
451         lmm_update_variable_bound(network_maxmin_system, action->variable,
452                                   SG_TCP_CTE_GAMMA / (2.0 *
453                                                       action->
454                                                       lat_current));
455       else
456         lmm_update_variable_bound(network_maxmin_system, action->variable,
457                                   min(action->rate,
458                                       SG_TCP_CTE_GAMMA / (2.0 *
459                                                           action->
460                                                           lat_current)));
461       if (!(action->suspended))
462         lmm_update_variable_weight(network_maxmin_system, action->variable,
463                                    action->lat_current);
464
465     }
466   } else if (event_type == nw_link->state_event) {
467     if (value > 0)
468       nw_link->state_current = SURF_LINK_ON;
469     else {
470       lmm_constraint_t cnst = nw_link->constraint;
471       lmm_variable_t var = NULL;
472       lmm_element_t elem = NULL;
473
474       nw_link->state_current = SURF_LINK_OFF;
475       while ((var= lmm_get_var_from_cnst
476               (network_maxmin_system, cnst, &elem))) {
477         surf_action_t action = lmm_variable_id(var) ;
478
479         if(surf_action_get_state(action)==SURF_ACTION_RUNNING ||
480            surf_action_get_state(action)==SURF_ACTION_READY) {
481           action->finish = date;
482           action_change_state( action, SURF_ACTION_FAILED);
483         }
484       }
485     }
486   } else {
487     CRITICAL0("Unknown event ! \n");
488     xbt_abort();
489   }
490
491   return;
492 }
493
494 static surf_action_t communicate(void *src, void *dst, double size,
495                                  double rate)
496 {
497   surf_action_network_CM02_t action = NULL;
498   /* LARGE PLATFORMS HACK:
499      Add a link_CM02_t *link and a int link_nb to network_card_CM02_t. It will represent local links for this node
500      Use the cluster_id for ->id */
501   network_card_CM02_t card_src = src;
502   network_card_CM02_t card_dst = dst;
503   int route_size = ROUTE_SIZE(card_src->id, card_dst->id);
504   link_CM02_t *route = ROUTE(card_src->id, card_dst->id);
505   /* LARGE PLATFORMS HACK:
506      total_route_size = route_size + src->link_nb + dst->nb */
507   int i;
508
509   XBT_IN4("(%s,%s,%g,%g)", card_src->name, card_dst->name, size, rate);
510   /* LARGE PLATFORMS HACK:
511      assert on total_route_size */
512   xbt_assert2(route_size,
513               "You're trying to send data from %s to %s but there is no connexion between these two cards.",
514               card_src->name, card_dst->name);
515
516   action = xbt_new0(s_surf_action_network_CM02_t, 1);
517
518   action->generic_action.refcount  = 1;
519   action->generic_action.cost = size;
520   action->generic_action.remains = size;
521   action->generic_action.max_duration = NO_MAX_DURATION;
522   action->generic_action.start = surf_get_clock();
523   action->generic_action.finish = -1.0;
524   action->generic_action.model_type =
525       (surf_model_t) surf_network_model;
526   action->suspended = 0;        /* Should be useless because of the 
527                                    calloc but it seems to help valgrind... */
528   action->generic_action.state_set =
529       surf_network_model->common_public->states.running_action_set;
530   for (i = 0; i < route_size; i++) 
531     if(route[i]->state_current == SURF_LINK_OFF) {
532       action->generic_action.state_set =
533         surf_network_model->common_public->states.failed_action_set;
534       break;
535     }
536   
537   xbt_swag_insert(action, action->generic_action.state_set);
538   action->rate = rate;
539
540   action->latency = 0.0;
541   for (i = 0; i < route_size; i++)
542     action->latency += route[i]->lat_current;
543   /* LARGE PLATFORMS HACK:
544      Add src->link and dst->link latencies */
545   action->lat_current = action->latency;
546   action->latency *= latency_factor;
547
548
549   /* LARGE PLATFORMS HACK:
550      lmm_variable_new(..., total_route_size)*/
551   if (action->latency > 0)
552     action->variable =
553         lmm_variable_new(network_maxmin_system, action, 0.0, -1.0,
554                          route_size);
555   else
556     action->variable =
557         lmm_variable_new(network_maxmin_system, action, 1.0, -1.0,
558                          route_size);
559
560   if (action->rate < 0) {
561     if (action->lat_current > 0)
562       lmm_update_variable_bound(network_maxmin_system, action->variable,
563                                 SG_TCP_CTE_GAMMA / (2.0 *
564                                                     action->lat_current));
565     else
566       lmm_update_variable_bound(network_maxmin_system, action->variable,
567                                 -1.0);
568   } else {
569     if (action->lat_current > 0)
570       lmm_update_variable_bound(network_maxmin_system, action->variable,
571                                 min(action->rate,
572                                     SG_TCP_CTE_GAMMA / (2.0 *
573                                                         action->
574                                                         lat_current)));
575     else
576       lmm_update_variable_bound(network_maxmin_system, action->variable,
577                                 action->rate);
578   }
579
580   for (i = 0; i < route_size; i++)
581     lmm_expand(network_maxmin_system, route[i]->constraint,
582                action->variable, 1.0);
583   /* LARGE PLATFORMS HACK:
584      expand also with src->link and dst->link */
585
586   XBT_OUT;
587
588   return (surf_action_t) action;
589 }
590
591 /* returns an array of link_CM02_t */
592 static const void **get_route(void *src, void *dst)
593 {
594   network_card_CM02_t card_src = src;
595   network_card_CM02_t card_dst = dst;
596   return (const void **) ROUTE(card_src->id, card_dst->id);
597 }
598
599 static int get_route_size(void *src, void *dst)
600 {
601   network_card_CM02_t card_src = src;
602   network_card_CM02_t card_dst = dst;
603   return ROUTE_SIZE(card_src->id, card_dst->id);
604 }
605
606 static const char *get_link_name(const void *link)
607 {
608   return ((link_CM02_t) link)->name;
609 }
610
611 static double get_link_bandwidth(const void *link)
612 {
613   return ((link_CM02_t) link)->bw_current;
614 }
615
616 static double get_link_latency(const void *link)
617 {
618   return ((link_CM02_t) link)->lat_current;
619 }
620
621 static int link_shared(const void *link)
622 {
623   return lmm_constraint_is_shared(((link_CM02_t) link)->constraint);
624 }
625
626 static xbt_dict_t get_properties(void *link)
627 {
628  return ((link_CM02_t) link)->properties;
629 }
630
631 static void action_suspend(surf_action_t action)
632 {
633   ((surf_action_network_CM02_t) action)->suspended = 1;
634   lmm_update_variable_weight(network_maxmin_system,
635                              ((surf_action_network_CM02_t) action)->
636                              variable, 0.0);
637 }
638
639 static void action_resume(surf_action_t action)
640 {
641   if (((surf_action_network_CM02_t) action)->suspended) {
642     lmm_update_variable_weight(network_maxmin_system,
643                                ((surf_action_network_CM02_t) action)->
644                                variable,
645                                ((surf_action_network_CM02_t) action)->
646                                lat_current);
647     ((surf_action_network_CM02_t) action)->suspended = 0;
648   }
649 }
650
651 static int action_is_suspended(surf_action_t action)
652 {
653   return ((surf_action_network_CM02_t) action)->suspended;
654 }
655
656 static void action_set_max_duration(surf_action_t action, double duration)
657 {
658   action->max_duration = duration;
659 }
660
661 static void finalize(void)
662 {
663   int i, j;
664
665   xbt_dict_free(&network_card_set);
666   xbt_dict_free(&link_set);
667   xbt_swag_free(surf_network_model->common_public->states.
668                 ready_action_set);
669   xbt_swag_free(surf_network_model->common_public->states.
670                 running_action_set);
671   xbt_swag_free(surf_network_model->common_public->states.
672                 failed_action_set);
673   xbt_swag_free(surf_network_model->common_public->states.
674                 done_action_set);
675   free(surf_network_model->common_public);
676   free(surf_network_model->common_private);
677   free(surf_network_model->extension_public);
678
679   free(surf_network_model);
680   surf_network_model = NULL;
681
682   loopback = NULL;
683   for (i = 0; i < host_number; i++)
684     for (j = 0; j < host_number; j++)
685       free(ROUTE(i, j));
686   free(routing_table);
687   routing_table = NULL;
688   free(routing_table_size);
689   routing_table_size = NULL;
690   host_number = 0;
691   lmm_system_free(network_maxmin_system);
692   network_maxmin_system = NULL;
693 }
694
695 static void surf_network_model_init_internal(void)
696 {
697   s_surf_action_t action;
698
699   surf_network_model = xbt_new0(s_surf_network_model_t, 1);
700
701   surf_network_model->common_private =
702       xbt_new0(s_surf_model_private_t, 1);
703   surf_network_model->common_public =
704       xbt_new0(s_surf_model_public_t, 1);
705   surf_network_model->extension_public =
706       xbt_new0(s_surf_network_model_extension_public_t, 1);
707
708   surf_network_model->common_public->states.ready_action_set =
709       xbt_swag_new(xbt_swag_offset(action, state_hookup));
710   surf_network_model->common_public->states.running_action_set =
711       xbt_swag_new(xbt_swag_offset(action, state_hookup));
712   surf_network_model->common_public->states.failed_action_set =
713       xbt_swag_new(xbt_swag_offset(action, state_hookup));
714   surf_network_model->common_public->states.done_action_set =
715       xbt_swag_new(xbt_swag_offset(action, state_hookup));
716
717   surf_network_model->common_public->name_service = name_service;
718   surf_network_model->common_public->get_resource_name =
719       get_resource_name;
720   surf_network_model->common_public->action_get_state =
721       surf_action_get_state;
722   surf_network_model->common_public->action_get_start_time =
723       surf_action_get_start_time;
724   surf_network_model->common_public->action_get_finish_time =
725       surf_action_get_finish_time;
726   surf_network_model->common_public->action_free = action_free;
727   surf_network_model->common_public->action_use = action_use;
728   surf_network_model->common_public->action_cancel = action_cancel;
729   surf_network_model->common_public->action_recycle = action_recycle;
730   surf_network_model->common_public->action_change_state =
731       action_change_state;
732   surf_network_model->common_public->action_set_data =
733       surf_action_set_data;
734   surf_network_model->common_public->name = "network";
735
736   surf_network_model->common_private->resource_used = resource_used;
737   surf_network_model->common_private->share_resources = share_resources;
738   surf_network_model->common_private->update_actions_state =
739       update_actions_state;
740   surf_network_model->common_private->update_resource_state =
741       update_resource_state;
742   surf_network_model->common_private->finalize = finalize;
743
744   surf_network_model->common_public->suspend = action_suspend;
745   surf_network_model->common_public->resume = action_resume;
746   surf_network_model->common_public->is_suspended = action_is_suspended;
747   surf_cpu_model->common_public->set_max_duration =
748       action_set_max_duration;
749
750   surf_network_model->extension_public->communicate = communicate;
751   surf_network_model->extension_public->get_route = get_route;
752   surf_network_model->extension_public->get_route_size = get_route_size;
753   surf_network_model->extension_public->get_link_name = get_link_name;
754   surf_network_model->extension_public->get_link_bandwidth =
755       get_link_bandwidth;
756   surf_network_model->extension_public->get_link_latency =
757       get_link_latency;
758   surf_network_model->extension_public->link_shared =
759       link_shared;
760
761   surf_network_model->common_public->get_properties =  get_properties;
762
763   link_set = xbt_dict_new();
764   network_card_set = xbt_dict_new();
765
766   if (!network_maxmin_system)
767     network_maxmin_system = lmm_system_new();
768 }
769
770 /***************************************************************************/
771 /* New TCP sharing model based on thesis experimantation and discussions.  */
772 /***************************************************************************/
773 void surf_network_model_init_LegrandVelho(const char *filename)
774 {
775   if (surf_network_model)
776     return;
777   surf_network_model_init_internal();
778   define_callbacks(filename);
779   xbt_dynar_push(model_list, &surf_network_model);
780   network_solve = lmm_solve;
781    
782   latency_factor = 10.4;
783
784   update_model_description(surf_network_model_description,
785                            "LegrandVelho",
786                            (surf_model_t) surf_network_model);
787   INFO0("LegrandVelho Model was chosen!!");
788 }
789
790 /***************************************************************************/
791 /* The nice TCP sharing model designed by Loris Marchal and Henri Casanova */
792 /***************************************************************************/
793 /* @TechReport{      rr-lip2002-40, */
794 /*   author        = {Henri Casanova and Loris Marchal}, */
795 /*   institution   = {LIP}, */
796 /*   title         = {A Network Model for Simulation of Grid Application}, */
797 /*   number        = {2002-40}, */
798 /*   month         = {oct}, */
799 /*   year          = {2002} */
800 /* } */
801 void surf_network_model_init_CM02(const char *filename)
802 {
803
804   if (surf_network_model)
805     return;
806   surf_network_model_init_internal();
807   define_callbacks(filename);
808   xbt_dynar_push(model_list, &surf_network_model);
809   network_solve = lmm_solve;
810
811   update_model_description(surf_network_model_description,
812                            "CM02",
813                            (surf_model_t) surf_network_model);
814 }
815
816 void surf_network_model_init_Reno(const char *filename)
817 {
818   if (surf_network_model)
819     return;
820   surf_network_model_init_internal();
821   define_callbacks(filename);
822
823   xbt_dynar_push(model_list, &surf_network_model);
824   lmm_set_default_protocol_function(func_reno_f, func_reno_fp,
825                                     func_reno_fpi);
826   network_solve = lagrange_solve;
827
828   update_model_description(surf_network_model_description,
829                            "Reno",
830                            (surf_model_t) surf_network_model);
831 }
832
833
834 void surf_network_model_init_Reno2(const char *filename)
835 {
836   if (surf_network_model)
837     return;
838   surf_network_model_init_internal();
839   define_callbacks(filename);
840
841   xbt_dynar_push(model_list, &surf_network_model);
842   lmm_set_default_protocol_function(func_reno2_f, func_reno2_fp,
843                                     func_reno2_fpi);
844   network_solve = lagrange_solve;
845
846   update_model_description(surf_network_model_description,
847                            "Reno2",
848                            (surf_model_t) surf_network_model);
849 }
850
851 void surf_network_model_init_Vegas(const char *filename)
852 {
853   if (surf_network_model)
854     return;
855   surf_network_model_init_internal();
856   define_callbacks(filename);
857
858   xbt_dynar_push(model_list, &surf_network_model);
859   lmm_set_default_protocol_function(func_vegas_f, func_vegas_fp,
860                                     func_vegas_fpi);
861   network_solve = lagrange_solve;
862
863   update_model_description(surf_network_model_description,
864                            "Vegas",
865                            (surf_model_t) surf_network_model);
866 }
867
868 #ifdef HAVE_SDP
869  void surf_network_model_init_SDP(const char *filename)
870 {
871   if (surf_network_model)
872     return;
873   surf_network_model_init_internal();
874   define_callbacks(filename);
875
876   xbt_dynar_push(model_list, &surf_network_model);
877   network_solve = sdp_solve;
878
879   update_model_description(surf_network_model_description,
880                            "SDP",
881                            (surf_model_t) surf_network_model);
882 }
883 #endif