aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ats/experiments/example.exp2
-rw-r--r--src/ats/gnunet-ats-solver-eval.c272
-rw-r--r--src/ats/gnunet-ats-solver-eval.h35
3 files changed, 253 insertions, 56 deletions
diff --git a/src/ats/experiments/example.exp b/src/ats/experiments/example.exp
index fcf5fc453..9e69ab8e2 100644
--- a/src/ats/experiments/example.exp
+++ b/src/ats/experiments/example.exp
@@ -10,7 +10,7 @@
10 10
11# operations = address_add, address_del, start_set_property, stop_set_property, 11# operations = address_add, address_del, start_set_property, stop_set_property,
12# start_set_preference, stop_preference, start_request, stop_request 12# start_set_preference, stop_preference, start_request, stop_request
13duration = 5 s 13duration = 0
14op-0-operation = address_add 14op-0-operation = address_add
15op-0-address-id = 0 15op-0-address-id = 0
16op-0-peer-id = 0 16op-0-peer-id = 0
diff --git a/src/ats/gnunet-ats-solver-eval.c b/src/ats/gnunet-ats-solver-eval.c
index bb490336b..8776960fc 100644
--- a/src/ats/gnunet-ats-solver-eval.c
+++ b/src/ats/gnunet-ats-solver-eval.c
@@ -122,6 +122,16 @@ find_peer_by_id (int id)
122 return NULL; 122 return NULL;
123} 123}
124 124
125static struct TestPeer *
126find_peer_by_pid (const struct GNUNET_PeerIdentity *pid)
127{
128 struct TestPeer *cur;
129 for (cur = peer_head; NULL != cur; cur = cur->next)
130 if (0 == memcmp (&cur->peer_id, pid, sizeof (struct GNUNET_PeerIdentity)))
131 return cur;
132 return NULL;
133}
134
125static struct TestAddress * 135static struct TestAddress *
126find_address_by_id (struct TestPeer *peer, int aid) 136find_address_by_id (struct TestPeer *peer, int aid)
127{ 137{
@@ -133,6 +143,18 @@ find_address_by_id (struct TestPeer *peer, int aid)
133} 143}
134 144
135 145
146static struct TestAddress *
147find_address_by_ats_address (struct TestPeer *p, struct ATS_Address *addr)
148{
149 struct TestAddress *cur;
150 for (cur = p->addr_head; NULL != cur; cur = cur->next)
151 if ((0 == strcmp(cur->ats_addr->plugin, addr->plugin)) &&
152 (cur->ats_addr->addr_len == addr->addr_len) &&
153 (0 == memcmp (cur->ats_addr->addr, addr->addr, addr->addr_len)))
154 return cur;
155 return NULL;
156}
157
136 158
137/** 159/**
138 * Logging 160 * Logging
@@ -142,15 +164,60 @@ void
142GNUNET_ATS_solver_logging_now (struct LoggingHandle *l) 164GNUNET_ATS_solver_logging_now (struct LoggingHandle *l)
143{ 165{
144 struct LoggingTimeStep *lts; 166 struct LoggingTimeStep *lts;
145 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Logging\n"); 167 struct TestPeer *cur;
168 struct TestAddress *cur_addr;
169 struct LoggingPeer *log_p;
170 struct LoggingAddress *log_a;
171 int c;
146 172
147 lts = GNUNET_new (struct LoggingTimeStep); 173 lts = GNUNET_new (struct LoggingTimeStep);
174 GNUNET_CONTAINER_DLL_insert_tail(l->head, l->tail, lts);
148 lts->timestamp = GNUNET_TIME_absolute_get(); 175 lts->timestamp = GNUNET_TIME_absolute_get();
176 if (NULL == lts->prev)
177 lts->delta = GNUNET_TIME_UNIT_ZERO;
178 else
179 lts->delta = GNUNET_TIME_absolute_get_duration(lts->prev->timestamp);
180
181 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Logging %llu, delta %llu\n",
182 lts->timestamp.abs_value_us, lts->delta.rel_value_us);
183
149 184
150 /* Store logging data here */ 185 /* Store logging data here */
186 for (cur = peer_head; NULL != cur; cur = cur->next)
187 {
188 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Logging peer id %u\n", cur->peer_id);
151 189
152 GNUNET_CONTAINER_DLL_insert_tail(l->head, l->tail, lts); 190 log_p = GNUNET_new (struct LoggingPeer);
191 log_p->id = cur->id;
192 log_p->peer_id = cur->peer_id;
193 for (c = 0; c < GNUNET_ATS_PreferenceCount; c++)
194 {
195 log_p->pref_norm[c] = cur->pref_norm[c];
196 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "\t %s = %.2f\n", GNUNET_ATS_print_preference_type(c), log_p->pref_norm[c]);
197 }
198 GNUNET_CONTAINER_DLL_insert_tail(lts->head, lts->tail, log_p);
153 199
200 for (cur_addr = cur->addr_head; NULL != cur_addr; cur_addr = cur_addr->next)
201 {
202 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Logging peer id %u address %u\n", cur->peer_id, cur_addr->aid);
203 log_a = GNUNET_new (struct LoggingAddress);
204 log_a->aid = cur_addr->aid;
205 log_a->active = cur_addr->ats_addr->active;
206 log_a->used = cur_addr->ats_addr->used;
207 log_a->assigned_bw_in = cur_addr->ats_addr->assigned_bw_in;
208 log_a->assigned_bw_out = cur_addr->ats_addr->assigned_bw_out;
209 for (c = 0; c < GNUNET_ATS_PropertyCount; c++)
210 {
211 log_a->prop_norm[c] = cur_addr->prop_norm[c];
212 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "\t %s = %.2f\n", GNUNET_ATS_print_property_type(c), log_a->prop_norm[c]);
213 }
214 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "\t Active = %i\n", log_a->active);
215 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "\t BW in = %llu\n", ntohl(log_a->assigned_bw_in.value__));
216 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "\t BW out = %llu\n", ntohl(log_a->assigned_bw_out.value__));
217
218 GNUNET_CONTAINER_DLL_insert_tail(log_p->addr_head, log_p->addr_tail, log_a);
219 }
220 }
154} 221}
155 222
156static void 223static void
@@ -173,12 +240,8 @@ GNUNET_ATS_solver_logging_start (struct GNUNET_TIME_Relative freq)
173 240
174 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Start logging every %s\n", 241 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Start logging every %s\n",
175 GNUNET_STRINGS_relative_time_to_string(freq, GNUNET_NO)); 242 GNUNET_STRINGS_relative_time_to_string(freq, GNUNET_NO));
176
177 /* Iterate over peers */
178
179 l->log_freq = freq; 243 l->log_freq = freq;
180 l->logging_task = GNUNET_SCHEDULER_add_now (&logging_task, l); 244 l->logging_task = GNUNET_SCHEDULER_add_now (&logging_task, l);
181
182 return l; 245 return l;
183} 246}
184 247
@@ -197,29 +260,78 @@ void
197GNUNET_ATS_solver_logging_eval (struct LoggingHandle *l) 260GNUNET_ATS_solver_logging_eval (struct LoggingHandle *l)
198{ 261{
199 struct LoggingTimeStep *lts; 262 struct LoggingTimeStep *lts;
263 struct LoggingPeer *log_p;
264 struct LoggingAddress *log_a;
265 int c;
200 266
201 for (lts = l->head; NULL != lts; lts = lts->next) 267 for (lts = l->head; NULL != lts; lts = lts->next)
202 { 268 {
203 fprintf (stderr, "Log %llu: \n", (long long unsigned int) lts->timestamp.abs_value_us); 269 fprintf (stderr, "Log %llu %llu: \n",
270 (long long unsigned int) lts->timestamp.abs_value_us,
271 (long long unsigned int) lts->delta.rel_value_us);
272
273 for (log_p = lts->head; NULL != log_p; log_p = log_p->next)
274 {
275 fprintf (stderr,"\tLogging peer id %u\n", log_p->id);
276 for (c = 0; c < GNUNET_ATS_PreferenceCount; c++)
277 {
278 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "\t %s = %.2f\n", GNUNET_ATS_print_preference_type(c), log_p->pref_norm[c]);
279 }
280
281 for (log_a = log_p->addr_head; NULL != log_a; log_a = log_a->next)
282 {
283 fprintf (stderr, "\tPeer id %u address %u: %u %u %u\n",
284 log_p->id, log_a->aid, log_a->active,
285 ntohl(log_a->assigned_bw_in.value__),
286 ntohl(log_a->assigned_bw_out.value__));
287
288 for (c = 0; c < GNUNET_ATS_PropertyCount; c++)
289 {
290 fprintf(stderr, "\t %s = %.2f\n", GNUNET_ATS_print_property_type(c), log_a->prop_norm[c]);
291 }
292 }
293 }
204 } 294 }
205} 295}
206 296
207void 297void
208GNUNET_ATS_solver_logging_free (struct LoggingHandle *l) 298GNUNET_ATS_solver_logging_free (struct LoggingHandle *l)
209{ 299{
210 struct LoggingTimeStep *cur; 300 struct LoggingTimeStep *lts_cur;
211 struct LoggingTimeStep *next; 301 struct LoggingTimeStep *lts_next;
302 struct LoggingPeer *log_p_cur;
303 struct LoggingPeer *log_p_next;
304 struct LoggingAddress *log_a_cur;
305 struct LoggingAddress *log_a_next;
212 306
213 if (GNUNET_SCHEDULER_NO_TASK != l->logging_task) 307 if (GNUNET_SCHEDULER_NO_TASK != l->logging_task)
214 GNUNET_SCHEDULER_cancel (l->logging_task); 308 GNUNET_SCHEDULER_cancel (l->logging_task);
215 l->logging_task = GNUNET_SCHEDULER_NO_TASK; 309 l->logging_task = GNUNET_SCHEDULER_NO_TASK;
216 310
217 next = l->head; 311 lts_next = l->head;
218 while (NULL != (cur = next)) 312 while (NULL != (lts_cur = lts_next))
219 { 313 {
220 next = cur->next; 314 lts_next = lts_cur->next;
221 GNUNET_CONTAINER_DLL_remove (l->head, l->tail, cur); 315 GNUNET_CONTAINER_DLL_remove (l->head, l->tail, lts_cur);
222 GNUNET_free (cur); 316
317 log_p_next = lts_cur->head;
318 while (NULL != (log_p_cur = log_p_next))
319 {
320 log_p_next = log_p_cur->next;
321
322 log_a_next = log_p_cur->addr_head;
323 while (NULL != (log_a_cur = log_a_next))
324 {
325 log_a_next = log_a_cur->next;
326 GNUNET_CONTAINER_DLL_remove (log_p_cur->addr_head, log_p_cur->addr_tail, log_a_cur);
327 GNUNET_free (log_a_cur);
328 }
329
330 GNUNET_CONTAINER_DLL_remove (lts_cur->head, lts_cur->tail, log_p_cur);
331 GNUNET_free (log_p_cur);
332 }
333
334 GNUNET_free (lts_cur);
223 } 335 }
224 336
225 GNUNET_free (l); 337 GNUNET_free (l);
@@ -294,6 +406,8 @@ static void
294set_prop_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 406set_prop_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
295{ 407{
296 struct PropertyGenerator *pg = cls; 408 struct PropertyGenerator *pg = cls;
409 struct TestPeer *p;
410 struct TestAddress *a;
297 double pref_value; 411 double pref_value;
298 struct GNUNET_ATS_Information atsi; 412 struct GNUNET_ATS_Information atsi;
299 413
@@ -308,6 +422,18 @@ set_prop_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
308 pg->peer, pg->address_id); 422 pg->peer, pg->address_id);
309 return; 423 return;
310 } 424 }
425 if (NULL == (p = find_peer_by_id (pg->peer)))
426 {
427 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
428 "Setting property generation for unknown peer %u\n",
429 pg->peer);
430 }
431 if (NULL == (a = find_address_by_id (p, pg->address_id)))
432 {
433 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
434 "Setting property generation for unknown peer %u\n",
435 pg->peer);
436 }
311 437
312 pref_value = get_property (pg); 438 pref_value = get_property (pg);
313 439
@@ -316,7 +442,6 @@ set_prop_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
316 pg->peer, pg->address_id, 442 pg->peer, pg->address_id,
317 GNUNET_ATS_print_property_type (pg->ats_property), pref_value); 443 GNUNET_ATS_print_property_type (pg->ats_property), pref_value);
318 444
319
320 atsi.type = htonl (pg->ats_property); 445 atsi.type = htonl (pg->ats_property);
321 atsi.value = htonl ((uint32_t) pref_value); 446 atsi.value = htonl ((uint32_t) pref_value);
322 447
@@ -326,17 +451,6 @@ set_prop_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
326 pg->test_address->ats_addr, &atsi, 1); 451 pg->test_address->ats_addr, &atsi, 1);
327 sh->env.sf.s_bulk_stop (sh->solver); 452 sh->env.sf.s_bulk_stop (sh->solver);
328 453
329 switch (pg->ats_property) {
330 case GNUNET_ATS_PREFERENCE_BANDWIDTH:
331 //p->pref_bandwidth = pref_value;
332 break;
333 case GNUNET_ATS_PREFERENCE_LATENCY:
334 //p->pref_delay = pref_value;
335 break;
336 default:
337 break;
338 }
339
340 pg->set_task = GNUNET_SCHEDULER_add_delayed (pg->frequency, 454 pg->set_task = GNUNET_SCHEDULER_add_delayed (pg->frequency,
341 &set_prop_task, pg); 455 &set_prop_task, pg);
342 456
@@ -863,7 +977,7 @@ load_op_add_address (struct GNUNET_ATS_TEST_Operation *o,
863 } 977 }
864 GNUNET_free (op_name); 978 GNUNET_free (op_name);
865 979
866 fprintf (stderr, 980 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
867 "Found operation %s: [%llu:%llu] address `%s' plugin `%s' \n", 981 "Found operation %s: [%llu:%llu] address `%s' plugin `%s' \n",
868 "ADD_ADDRESS", o->peer_id, o->address_id, o->address, o->plugin); 982 "ADD_ADDRESS", o->peer_id, o->address_id, o->address, o->plugin);
869 983
@@ -951,7 +1065,7 @@ load_op_del_address (struct GNUNET_ATS_TEST_Operation *o,
951 } 1065 }
952 GNUNET_free (op_name); 1066 GNUNET_free (op_name);
953 1067
954 fprintf (stderr, 1068 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
955 "Found operation %s: [%llu:%llu] address `%s' plugin `%s' \n", 1069 "Found operation %s: [%llu:%llu] address `%s' plugin `%s' \n",
956 "DEL_ADDRESS", o->peer_id, o->address_id, o->address, o->plugin); 1070 "DEL_ADDRESS", o->peer_id, o->address_id, o->address, o->plugin);
957 1071
@@ -1130,7 +1244,7 @@ load_op_start_set_preference (struct GNUNET_ATS_TEST_Operation *o,
1130 GNUNET_free (pref); 1244 GNUNET_free (pref);
1131 GNUNET_free (op_name); 1245 GNUNET_free (op_name);
1132 1246
1133 fprintf (stderr, 1247 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1134 "Found operation %s: [%llu:%llu]: %s = %llu\n", 1248 "Found operation %s: [%llu:%llu]: %s = %llu\n",
1135 "START_SET_PREFERENCE", o->peer_id, o->address_id, 1249 "START_SET_PREFERENCE", o->peer_id, o->address_id,
1136 GNUNET_ATS_print_preference_type(o->pref_type), o->base_rate); 1250 GNUNET_ATS_print_preference_type(o->pref_type), o->base_rate);
@@ -1194,7 +1308,7 @@ load_op_stop_set_preference (struct GNUNET_ATS_TEST_Operation *o,
1194 GNUNET_free (pref); 1308 GNUNET_free (pref);
1195 GNUNET_free (op_name); 1309 GNUNET_free (op_name);
1196 1310
1197 fprintf (stderr, 1311 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1198 "Found operation %s: [%llu:%llu]: %s\n", 1312 "Found operation %s: [%llu:%llu]: %s\n",
1199 "STOP_SET_PREFERENCE", o->peer_id, o->address_id, 1313 "STOP_SET_PREFERENCE", o->peer_id, o->address_id,
1200 GNUNET_ATS_print_preference_type(o->pref_type)); 1314 GNUNET_ATS_print_preference_type(o->pref_type));
@@ -1363,7 +1477,7 @@ load_op_start_set_property(struct GNUNET_ATS_TEST_Operation *o,
1363 GNUNET_free (prop); 1477 GNUNET_free (prop);
1364 GNUNET_free (op_name); 1478 GNUNET_free (op_name);
1365 1479
1366 fprintf (stderr, 1480 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1367 "Found operation %s: [%llu:%llu] %s = %llu\n", 1481 "Found operation %s: [%llu:%llu] %s = %llu\n",
1368 "START_SET_PROPERTY", o->peer_id, o->address_id, 1482 "START_SET_PROPERTY", o->peer_id, o->address_id,
1369 GNUNET_ATS_print_property_type (o->prop_type), o->base_rate); 1483 GNUNET_ATS_print_property_type (o->prop_type), o->base_rate);
@@ -1429,7 +1543,7 @@ load_op_stop_set_property (struct GNUNET_ATS_TEST_Operation *o,
1429 GNUNET_free (pref); 1543 GNUNET_free (pref);
1430 GNUNET_free (op_name); 1544 GNUNET_free (op_name);
1431 1545
1432 fprintf (stderr, 1546 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1433 "Found operation %s: [%llu:%llu] %s\n", 1547 "Found operation %s: [%llu:%llu] %s\n",
1434 "STOP_SET_PROPERTY", o->peer_id, o->address_id, 1548 "STOP_SET_PROPERTY", o->peer_id, o->address_id,
1435 GNUNET_ATS_print_property_type (o->prop_type)); 1549 GNUNET_ATS_print_property_type (o->prop_type));
@@ -1495,7 +1609,7 @@ load_episode (struct Experiment *e, struct Episode *cur,
1495 char *op; 1609 char *op;
1496 int op_counter = 0; 1610 int op_counter = 0;
1497 int res; 1611 int res;
1498 fprintf (stderr, "Parsing episode %u\n",cur->id); 1612 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "=== Parsing episode %u\n",cur->id);
1499 GNUNET_asprintf(&sec_name, "episode-%u", cur->id); 1613 GNUNET_asprintf(&sec_name, "episode-%u", cur->id);
1500 1614
1501 while (1) 1615 while (1)
@@ -1599,7 +1713,6 @@ load_episodes (struct Experiment *e, struct GNUNET_CONFIGURATION_Handle *cfg)
1599 if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_time(cfg, 1713 if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_time(cfg,
1600 sec_name, "duration", &e_duration)) 1714 sec_name, "duration", &e_duration))
1601 { 1715 {
1602 fprintf (stderr, "Missing duration in episode %u \n",e_counter);
1603 GNUNET_free (sec_name); 1716 GNUNET_free (sec_name);
1604 break; 1717 break;
1605 } 1718 }
@@ -1615,7 +1728,7 @@ load_episodes (struct Experiment *e, struct GNUNET_CONFIGURATION_Handle *cfg)
1615 return GNUNET_SYSERR; 1728 return GNUNET_SYSERR;
1616 } 1729 }
1617 1730
1618 fprintf (stderr, "Found episode %u with duration %s \n", 1731 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Found episode %u with duration %s \n",
1619 e_counter, 1732 e_counter,
1620 GNUNET_STRINGS_relative_time_to_string(cur->duration, GNUNET_YES)); 1733 GNUNET_STRINGS_relative_time_to_string(cur->duration, GNUNET_YES));
1621 1734
@@ -1712,6 +1825,8 @@ enforce_add_address (struct GNUNET_ATS_TEST_Operation *op)
1712 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Adding address %u for peer %u\n", 1825 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Adding address %u for peer %u\n",
1713 op->address_id, op->peer_id); 1826 op->address_id, op->peer_id);
1714 1827
1828
1829
1715 sh->env.sf.s_add (sh->solver, a->ats_addr, op->address_network); 1830 sh->env.sf.s_add (sh->solver, a->ats_addr, op->address_network);
1716 1831
1717} 1832}
@@ -1721,6 +1836,7 @@ static void
1721enforce_del_address (struct GNUNET_ATS_TEST_Operation *op) 1836enforce_del_address (struct GNUNET_ATS_TEST_Operation *op)
1722{ 1837{
1723 struct TestPeer *p; 1838 struct TestPeer *p;
1839 struct TestAddress *a;
1724 struct AddressLookupCtx ctx; 1840 struct AddressLookupCtx ctx;
1725 1841
1726 if (NULL == (p = find_peer_by_id (op->peer_id))) 1842 if (NULL == (p = find_peer_by_id (op->peer_id)))
@@ -1744,7 +1860,7 @@ enforce_del_address (struct GNUNET_ATS_TEST_Operation *op)
1744 return; 1860 return;
1745 } 1861 }
1746 1862
1747 if (NULL == (find_address_by_id (p, op->address_id))) 1863 if (NULL == (a =find_address_by_id (p, op->address_id)))
1748 { 1864 {
1749 GNUNET_break (0); 1865 GNUNET_break (0);
1750 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 1866 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
@@ -1752,6 +1868,9 @@ enforce_del_address (struct GNUNET_ATS_TEST_Operation *op)
1752 return; 1868 return;
1753 } 1869 }
1754 1870
1871 GNUNET_CONTAINER_DLL_remove(p->addr_head, p->addr_tail, a);
1872 GNUNET_free (a);
1873
1755 GNUNET_CONTAINER_multipeermap_remove (sh->addresses, &p->peer_id, ctx.res); 1874 GNUNET_CONTAINER_multipeermap_remove (sh->addresses, &p->peer_id, ctx.res);
1756 1875
1757 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Removing address %u for peer %u\n", 1876 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Removing address %u for peer %u\n",
@@ -1872,7 +1991,6 @@ enforce_start_request (struct GNUNET_ATS_TEST_Operation *op)
1872 { 1991 {
1873 1992
1874 } 1993 }
1875
1876} 1994}
1877 1995
1878static void 1996static void
@@ -1995,13 +2113,13 @@ GNUNET_ATS_solvers_experimentation_run (struct Experiment *e,
1995 e->experiment_timeout_task = GNUNET_SCHEDULER_add_delayed (e->max_duration, 2113 e->experiment_timeout_task = GNUNET_SCHEDULER_add_delayed (e->max_duration,
1996 &timeout_experiment, e); 2114 &timeout_experiment, e);
1997 2115
1998
1999 /* Start */ 2116 /* Start */
2000 if (NULL == e->start) 2117 if (NULL == e->start)
2001 { 2118 {
2002 GNUNET_break (0); 2119 GNUNET_break (0);
2003 return; 2120 return;
2004 } 2121 }
2122
2005 e->cur = e->start; 2123 e->cur = e->start;
2006 fprintf (stderr, "Running episode %u with timeout %s\n", 2124 fprintf (stderr, "Running episode %u with timeout %s\n",
2007 e->cur->id, 2125 e->cur->id,
@@ -2059,7 +2177,7 @@ GNUNET_ATS_solvers_experimentation_load (char *filename)
2059 return NULL; 2177 return NULL;
2060 } 2178 }
2061 else 2179 else
2062 fprintf (stderr, "Experiment name: `%s'\n", e->name); 2180 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment name: `%s'\n", e->name);
2063 2181
2064 if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_filename (cfg, "experiment", 2182 if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_filename (cfg, "experiment",
2065 "cfg_file", &e->cfg_file)) 2183 "cfg_file", &e->cfg_file))
@@ -2070,7 +2188,7 @@ GNUNET_ATS_solvers_experimentation_load (char *filename)
2070 } 2188 }
2071 else 2189 else
2072 { 2190 {
2073 fprintf (stderr, "Experiment configuration: `%s'\n", e->cfg_file); 2191 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment configuration: `%s'\n", e->cfg_file);
2074 e->cfg = GNUNET_CONFIGURATION_create(); 2192 e->cfg = GNUNET_CONFIGURATION_create();
2075 if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (e->cfg, e->cfg_file)) 2193 if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (e->cfg, e->cfg_file))
2076 { 2194 {
@@ -2089,7 +2207,7 @@ GNUNET_ATS_solvers_experimentation_load (char *filename)
2089 return NULL; 2207 return NULL;
2090 } 2208 }
2091 else 2209 else
2092 fprintf (stderr, "Experiment logging frequency: `%s'\n", 2210 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment logging frequency: `%s'\n",
2093 GNUNET_STRINGS_relative_time_to_string (e->log_freq, GNUNET_YES)); 2211 GNUNET_STRINGS_relative_time_to_string (e->log_freq, GNUNET_YES));
2094 2212
2095 if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_time(cfg, "experiment", 2213 if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_time(cfg, "experiment",
@@ -2100,7 +2218,7 @@ GNUNET_ATS_solvers_experimentation_load (char *filename)
2100 return NULL; 2218 return NULL;
2101 } 2219 }
2102 else 2220 else
2103 fprintf (stderr, "Experiment duration: `%s'\n", 2221 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment duration: `%s'\n",
2104 GNUNET_STRINGS_relative_time_to_string (e->max_duration, GNUNET_YES)); 2222 GNUNET_STRINGS_relative_time_to_string (e->max_duration, GNUNET_YES));
2105 2223
2106 if (GNUNET_SYSERR == load_episodes (e, cfg)) 2224 if (GNUNET_SYSERR == load_episodes (e, cfg))
@@ -2111,7 +2229,7 @@ GNUNET_ATS_solvers_experimentation_load (char *filename)
2111 fprintf (stderr, "Failed to load experiment\n"); 2229 fprintf (stderr, "Failed to load experiment\n");
2112 return NULL; 2230 return NULL;
2113 } 2231 }
2114 fprintf (stderr, "Loaded %u episodes with total duration %s\n", 2232 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Loaded %u episodes with total duration %s\n",
2115 e->num_episodes, 2233 e->num_episodes,
2116 GNUNET_STRINGS_relative_time_to_string (e->total_duration, GNUNET_YES)); 2234 GNUNET_STRINGS_relative_time_to_string (e->total_duration, GNUNET_YES));
2117 2235
@@ -2293,56 +2411,56 @@ solver_info_cb (void *cls,
2293 switch (op) 2411 switch (op)
2294 { 2412 {
2295 case GAS_OP_SOLVE_START: 2413 case GAS_OP_SOLVE_START:
2296 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 2414 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2297 "Solver notifies `%s' with result `%s' `%s'\n", "GAS_OP_SOLVE_START", 2415 "Solver notifies `%s' with result `%s' `%s'\n", "GAS_OP_SOLVE_START",
2298 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL", add_info); 2416 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL", add_info);
2299 return; 2417 return;
2300 case GAS_OP_SOLVE_STOP: 2418 case GAS_OP_SOLVE_STOP:
2301 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 2419 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2302 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_STOP", 2420 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_STOP",
2303 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL", add_info); 2421 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL", add_info);
2304 return; 2422 return;
2305 2423
2306 case GAS_OP_SOLVE_SETUP_START: 2424 case GAS_OP_SOLVE_SETUP_START:
2307 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 2425 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2308 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_SETUP_START", 2426 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_SETUP_START",
2309 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL"); 2427 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
2310 return; 2428 return;
2311 2429
2312 case GAS_OP_SOLVE_SETUP_STOP: 2430 case GAS_OP_SOLVE_SETUP_STOP:
2313 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 2431 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2314 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_SETUP_STOP", 2432 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_SETUP_STOP",
2315 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL"); 2433 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
2316 return; 2434 return;
2317 2435
2318 case GAS_OP_SOLVE_MLP_LP_START: 2436 case GAS_OP_SOLVE_MLP_LP_START:
2319 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 2437 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2320 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_LP_START", 2438 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_LP_START",
2321 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL"); 2439 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
2322 return; 2440 return;
2323 case GAS_OP_SOLVE_MLP_LP_STOP: 2441 case GAS_OP_SOLVE_MLP_LP_STOP:
2324 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 2442 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2325 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_LP_STOP", 2443 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_LP_STOP",
2326 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL"); 2444 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
2327 return; 2445 return;
2328 2446
2329 case GAS_OP_SOLVE_MLP_MLP_START: 2447 case GAS_OP_SOLVE_MLP_MLP_START:
2330 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 2448 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2331 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_MLP_START", 2449 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_MLP_START",
2332 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL"); 2450 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
2333 return; 2451 return;
2334 case GAS_OP_SOLVE_MLP_MLP_STOP: 2452 case GAS_OP_SOLVE_MLP_MLP_STOP:
2335 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 2453 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2336 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_MLP_STOP", 2454 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_MLP_STOP",
2337 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL"); 2455 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
2338 return; 2456 return;
2339 case GAS_OP_SOLVE_UPDATE_NOTIFICATION_START: 2457 case GAS_OP_SOLVE_UPDATE_NOTIFICATION_START:
2340 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 2458 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2341 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_UPDATE_NOTIFICATION_START", 2459 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_UPDATE_NOTIFICATION_START",
2342 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL"); 2460 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
2343 return; 2461 return;
2344 case GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP: 2462 case GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP:
2345 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 2463 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
2346 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP", 2464 "Solver notifies `%s' with result `%s'\n", "GAS_OP_SOLVE_UPDATE_NOTIFICATION_STOP",
2347 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL"); 2465 (GAS_STAT_SUCCESS == stat) ? "SUCCESS" : "FAIL");
2348 return; 2466 return;
@@ -2354,6 +2472,7 @@ solver_info_cb (void *cls,
2354static void 2472static void
2355solver_bandwidth_changed_cb (void *cls, struct ATS_Address *address) 2473solver_bandwidth_changed_cb (void *cls, struct ATS_Address *address)
2356{ 2474{
2475 GNUNET_break (0);
2357 if ( (0 == ntohl (address->assigned_bw_out.value__)) && 2476 if ( (0 == ntohl (address->assigned_bw_out.value__)) &&
2358 (0 == ntohl (address->assigned_bw_in.value__)) ) 2477 (0 == ntohl (address->assigned_bw_in.value__)) )
2359 { 2478 {
@@ -2388,6 +2507,28 @@ get_property_cb (void *cls, const struct ATS_Address *address)
2388} 2507}
2389 2508
2390static void 2509static void
2510set_updated_property ( struct ATS_Address *address, uint32_t type, double prop_rel)
2511{
2512 struct TestPeer *p;
2513 struct TestAddress *a;
2514
2515 if (NULL == (p = find_peer_by_pid (&address->peer)))
2516 {
2517 GNUNET_break (0);
2518 return;
2519 }
2520
2521 if (NULL == (a = find_address_by_ats_address (p, address)))
2522 {
2523 GNUNET_break (0);
2524 return;
2525 }
2526 a->prop_norm[type] = prop_rel;
2527 sh->env.sf.s_address_update_property (sh->solver, address, type, 0, prop_rel);
2528}
2529
2530
2531static void
2391normalized_property_changed_cb (void *cls, struct ATS_Address *address, 2532normalized_property_changed_cb (void *cls, struct ATS_Address *address,
2392 uint32_t type, double prop_rel) 2533 uint32_t type, double prop_rel)
2393{ 2534{
@@ -2396,7 +2537,24 @@ normalized_property_changed_cb (void *cls, struct ATS_Address *address,
2396 GNUNET_ATS_print_property_type (type), GNUNET_i2s (&address->peer), 2537 GNUNET_ATS_print_property_type (type), GNUNET_i2s (&address->peer),
2397 prop_rel); 2538 prop_rel);
2398 2539
2399 sh->env.sf.s_address_update_property (sh->solver, address, type, 0, prop_rel); 2540 set_updated_property (address, type, prop_rel);
2541}
2542
2543static void
2544set_updated_preference (const struct GNUNET_PeerIdentity *peer,
2545 enum GNUNET_ATS_PreferenceKind kind,
2546 double pref_rel)
2547{
2548 struct TestPeer *p;
2549
2550 if (NULL == (p = find_peer_by_pid (peer)))
2551 {
2552 GNUNET_break (0);
2553 return;
2554 }
2555
2556 p->pref_norm[kind] = pref_rel;
2557 sh->env.sf.s_pref (sh->solver, peer, kind, pref_rel);
2400} 2558}
2401 2559
2402 2560
@@ -2411,7 +2569,7 @@ normalized_preference_changed_cb (void *cls,
2411 GNUNET_ATS_print_preference_type (kind), GNUNET_i2s (peer), 2569 GNUNET_ATS_print_preference_type (kind), GNUNET_i2s (peer),
2412 pref_rel); 2570 pref_rel);
2413 2571
2414 sh->env.sf.s_pref (sh->solver, peer, kind, pref_rel); 2572 set_updated_preference(peer, kind, pref_rel);
2415} 2573}
2416 2574
2417 2575
@@ -2619,6 +2777,7 @@ run (void *cls, char * const *args, const char *cfgfile,
2619 } 2777 }
2620 2778
2621 /* load experiment */ 2779 /* load experiment */
2780 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "=== Loading experiment\n");
2622 e = GNUNET_ATS_solvers_experimentation_load (opt_exp_file); 2781 e = GNUNET_ATS_solvers_experimentation_load (opt_exp_file);
2623 if (NULL == e) 2782 if (NULL == e)
2624 { 2783 {
@@ -2629,6 +2788,7 @@ run (void *cls, char * const *args, const char *cfgfile,
2629 } 2788 }
2630 2789
2631 /* load solver */ 2790 /* load solver */
2791 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "=== Loading solver\n");
2632 sh = GNUNET_ATS_solvers_solver_start (solver); 2792 sh = GNUNET_ATS_solvers_solver_start (solver);
2633 if (NULL == sh) 2793 if (NULL == sh)
2634 { 2794 {
@@ -2639,9 +2799,11 @@ run (void *cls, char * const *args, const char *cfgfile,
2639 } 2799 }
2640 2800
2641 /* start logging */ 2801 /* start logging */
2802 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "=== Start logging \n");
2642 l = GNUNET_ATS_solver_logging_start (e->log_freq); 2803 l = GNUNET_ATS_solver_logging_start (e->log_freq);
2643 2804
2644 /* run experiment */ 2805 /* run experiment */
2806 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "=== Running experiment \n");
2645 GNUNET_ATS_solvers_experimentation_run (e, episode_done_cb, 2807 GNUNET_ATS_solvers_experimentation_run (e, episode_done_cb,
2646 experiment_done_cb); 2808 experiment_done_cb);
2647 2809
diff --git a/src/ats/gnunet-ats-solver-eval.h b/src/ats/gnunet-ats-solver-eval.h
index ab62f5000..9463fcbe9 100644
--- a/src/ats/gnunet-ats-solver-eval.h
+++ b/src/ats/gnunet-ats-solver-eval.h
@@ -90,7 +90,39 @@ struct LoggingTimeStep
90 struct LoggingTimeStep *prev; 90 struct LoggingTimeStep *prev;
91 struct LoggingTimeStep *next; 91 struct LoggingTimeStep *next;
92 92
93 struct LoggingPeer *head;
94 struct LoggingPeer *tail;
95
93 struct GNUNET_TIME_Absolute timestamp; 96 struct GNUNET_TIME_Absolute timestamp;
97 struct GNUNET_TIME_Relative delta;
98};
99
100struct LoggingPeer
101{
102 struct LoggingPeer *prev;
103 struct LoggingPeer *next;
104
105 int id;
106 struct GNUNET_PeerIdentity peer_id;
107 double pref_norm[GNUNET_ATS_PreferenceCount];
108
109 struct LoggingAddress *addr_head;
110 struct LoggingAddress *addr_tail;
111};
112
113
114struct LoggingAddress
115{
116 struct LoggingAddress *next;
117 struct LoggingAddress *prev;
118
119 int aid;
120 int active;
121 int used;
122 struct GNUNET_BANDWIDTH_Value32NBO assigned_bw_in;
123 struct GNUNET_BANDWIDTH_Value32NBO assigned_bw_out;
124
125 double prop_norm[GNUNET_ATS_PropertyCount];
94}; 126};
95 127
96 128
@@ -101,6 +133,7 @@ struct TestPeer
101 133
102 int id; 134 int id;
103 struct GNUNET_PeerIdentity peer_id; 135 struct GNUNET_PeerIdentity peer_id;
136 double pref_norm[GNUNET_ATS_PreferenceCount];
104 137
105 struct TestAddress *addr_head; 138 struct TestAddress *addr_head;
106 struct TestAddress *addr_tail; 139 struct TestAddress *addr_tail;
@@ -114,6 +147,8 @@ struct TestAddress
114 147
115 int aid; 148 int aid;
116 struct ATS_Address *ats_addr; 149 struct ATS_Address *ats_addr;
150
151 double prop_norm[GNUNET_ATS_PropertyCount];
117}; 152};
118 153
119struct Episode; 154struct Episode;