aboutsummaryrefslogtreecommitdiff
path: root/src/mesh
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesh')
-rw-r--r--src/mesh/Makefile.am4
-rw-r--r--src/mesh/gnunet-service-mesh.c2
-rw-r--r--src/mesh/test_mesh_small.c263
3 files changed, 20 insertions, 249 deletions
diff --git a/src/mesh/Makefile.am b/src/mesh/Makefile.am
index 30bc332c7..e95faffea 100644
--- a/src/mesh/Makefile.am
+++ b/src/mesh/Makefile.am
@@ -110,9 +110,7 @@ test_mesh_small_unicast_DEPENDENCIES = \
110 libgnunetmeshnew.la 110 libgnunetmeshnew.la
111 111
112if ENABLE_TEST_RUN 112if ENABLE_TEST_RUN
113if HAVE_EXPERIMENTAL 113TESTS = test_mesh_api test_mesh_path_api test_mesh_local_1 test_mesh_local_2 test_mesh_small
114TESTS = test_mesh_api test_mesh_path_api test_mesh_local_1 test_mesh_local_2 test_mesh_small_unicast
115endif
116endif 114endif
117 115
118EXTRA_DIST = \ 116EXTRA_DIST = \
diff --git a/src/mesh/gnunet-service-mesh.c b/src/mesh/gnunet-service-mesh.c
index 625a9a383..f30661abe 100644
--- a/src/mesh/gnunet-service-mesh.c
+++ b/src/mesh/gnunet-service-mesh.c
@@ -2278,7 +2278,7 @@ dht_get_type_handler (void *cls, struct GNUNET_TIME_Absolute exp,
2278 return; 2278 return;
2279 } 2279 }
2280 GNUNET_assert (NULL != t->client); 2280 GNUNET_assert (NULL != t->client);
2281 GNUNET_DHT_get_stop (t->dht_get_type); /* FIXME move to task? */ 2281 GNUNET_DHT_get_stop (t->dht_get_type);
2282 t->dht_get_type = NULL; 2282 t->dht_get_type = NULL;
2283 peer_info = peer_info_get (pi); 2283 peer_info = peer_info_get (pi);
2284 GNUNET_CONTAINER_multihashmap_put (t->peers, &pi->hashPubKey, peer_info, 2284 GNUNET_CONTAINER_multihashmap_put (t->peers, &pi->hashPubKey, peer_info,
diff --git a/src/mesh/test_mesh_small.c b/src/mesh/test_mesh_small.c
index 97edbf731..0fd0b9766 100644
--- a/src/mesh/test_mesh_small.c
+++ b/src/mesh/test_mesh_small.c
@@ -79,16 +79,6 @@ static struct GNUNET_CONFIGURATION_Handle *testing_cfg;
79static unsigned long long peers_running; 79static unsigned long long peers_running;
80 80
81/** 81/**
82 * Current round we are in.
83 */
84static unsigned long long current_round;
85
86/**
87 * Peers desired in the next round.
88 */
89static unsigned long long peers_next_round;
90
91/**
92 * Total number of connections in the whole network. 82 * Total number of connections in the whole network.
93 */ 83 */
94static unsigned int total_connections; 84static unsigned int total_connections;
@@ -109,11 +99,6 @@ static struct GNUNET_DISK_FileHandle *output_file;
109static struct GNUNET_DISK_FileHandle *data_file; 99static struct GNUNET_DISK_FileHandle *data_file;
110 100
111/** 101/**
112 * How many data points to capture before triggering next round?
113 */
114static struct GNUNET_TIME_Relative wait_time;
115
116/**
117 * Task called to disconnect peers. 102 * Task called to disconnect peers.
118 */ 103 */
119static GNUNET_SCHEDULER_TaskIdentifier disconnect_task; 104static GNUNET_SCHEDULER_TaskIdentifier disconnect_task;
@@ -123,15 +108,12 @@ static GNUNET_SCHEDULER_TaskIdentifier disconnect_task;
123 */ 108 */
124static GNUNET_SCHEDULER_TaskIdentifier shutdown_handle; 109static GNUNET_SCHEDULER_TaskIdentifier shutdown_handle;
125 110
126/**
127 * Task used to churn the network.
128 */
129static GNUNET_SCHEDULER_TaskIdentifier churn_task;
130
131static char *topology_file; 111static char *topology_file;
132 112
133static char *data_filename; 113static char *data_filename;
134 114
115static struct GNUNET_TIME_Relative time_out;
116
135/** 117/**
136 * Check whether peers successfully shut down. 118 * Check whether peers successfully shut down.
137 */ 119 */
@@ -159,7 +141,6 @@ shutdown_callback (void *cls, const char *emsg)
159static void 141static void
160shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 142shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
161{ 143{
162// struct NSEPeer *pos;
163#if VERBOSE 144#if VERBOSE
164 fprintf (stderr, "Ending test.\n"); 145 fprintf (stderr, "Ending test.\n");
165#endif 146#endif
@@ -169,14 +150,6 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
169 GNUNET_SCHEDULER_cancel (disconnect_task); 150 GNUNET_SCHEDULER_cancel (disconnect_task);
170 disconnect_task = GNUNET_SCHEDULER_NO_TASK; 151 disconnect_task = GNUNET_SCHEDULER_NO_TASK;
171 } 152 }
172// while (NULL != (pos = peer_head))
173// {
174// if (pos->nse_handle != NULL)
175// GNUNET_NSE_disconnect(pos->nse_handle);
176// GNUNET_CONTAINER_DLL_remove(peer_head, peer_tail, pos);
177// GNUNET_free(pos);
178// }
179
180 if (data_file != NULL) 153 if (data_file != NULL)
181 GNUNET_DISK_file_close (data_file); 154 GNUNET_DISK_file_close (data_file);
182 GNUNET_TESTING_daemons_stop (pg, TIMEOUT, &shutdown_callback, NULL); 155 GNUNET_TESTING_daemons_stop (pg, TIMEOUT, &shutdown_callback, NULL);
@@ -193,6 +166,17 @@ static struct GNUNET_MESH_MessageHandler handlers[] = {
193}; 166};
194 167
195 168
169static void
170disconnect_mesh (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
171{
172 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
173 "test: disconnecting mesh service of peers\n");
174 disconnect_task = GNUNET_SCHEDULER_NO_TASK;
175 GNUNET_SCHEDULER_cancel (shutdown_handle);
176 shutdown_handle = GNUNET_SCHEDULER_add_now(&shutdown_task, NULL);
177}
178
179
196/** 180/**
197 * Function called whenever an inbound tunnel is destroyed. Should clean up 181 * Function called whenever an inbound tunnel is destroyed. Should clean up
198 * any associated state. 182 * any associated state.
@@ -247,7 +231,7 @@ ch (void *cls, const struct GNUNET_PeerIdentity *peer,
247 * 231 *
248 */ 232 */
249static void 233static void
250connect_mesh_service (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 234connect_mesh (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
251{ 235{
252 struct GNUNET_TESTING_Daemon *d; 236 struct GNUNET_TESTING_Daemon *d;
253 struct GNUNET_MESH_Handle *h; 237 struct GNUNET_MESH_Handle *h;
@@ -275,206 +259,6 @@ connect_mesh_service (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
275} 259}
276 260
277 261
278static void
279churn_peers (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc);
280
281
282/**
283 * Continuation called by the "get_all" and "get" functions.
284 *
285 * @param cls struct StatsContext
286 * @param success GNUNET_OK if statistics were
287 * successfully obtained, GNUNET_SYSERR if not.
288 */
289static void
290stats_finished_callback (void *cls, int success)
291{
292 struct StatsContext *stats_context = cls;
293 char *buf;
294 int buf_len;
295
296 if ((GNUNET_OK == success) && (data_file != NULL))
297 {
298 /* Stats lookup successful, write out data */
299 buf = NULL;
300 buf_len =
301 GNUNET_asprintf (&buf, "TOTAL_MESH_BYTES: %u\n",
302 stats_context->total_mesh_bytes);
303 if (buf_len > 0)
304 {
305 GNUNET_DISK_file_write (data_file, buf, buf_len);
306 }
307 GNUNET_free_non_null (buf);
308 }
309
310 GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == shutdown_handle);
311 shutdown_handle = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL);
312 GNUNET_free (stats_context);
313}
314
315
316/**
317 * Callback function to process statistic values.
318 *
319 * @param cls struct StatsContext
320 * @param peer the peer the statistics belong to
321 * @param subsystem name of subsystem that created the statistic
322 * @param name the name of the datum
323 * @param value the current value
324 * @param is_persistent GNUNET_YES if the value is persistent, GNUNET_NO if not
325 * @return GNUNET_OK to continue, GNUNET_SYSERR to abort iteration
326 */
327static int
328statistics_iterator (void *cls, const struct GNUNET_PeerIdentity *peer,
329 const char *subsystem, const char *name, uint64_t value,
330 int is_persistent)
331{
332 struct StatsContext *stats_context = cls;
333
334//
335// if ( (0 == strstr(subsystem, "nse")) &&
336// (0 == strstr(name, "# flood messages received")) )
337 stats_context->total_mesh_bytes += 1; //value;
338 return GNUNET_OK;
339}
340
341
342static void
343disconnect_mesh_peers (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
344{
345// struct NSEPeer *pos;
346 char *buf;
347 struct StatsContext *stats_context;
348
349 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "disconnecting mesh service of peers\n");
350 disconnect_task = GNUNET_SCHEDULER_NO_TASK;
351// pos = peer_head;
352// while (NULL != (pos = peer_head))
353// {
354// if (pos->nse_handle != NULL)
355// {
356// GNUNET_NSE_disconnect(pos->nse_handle);
357// pos->nse_handle = NULL;
358// }
359// GNUNET_CONTAINER_DLL_remove(peer_head, peer_tail, pos);
360// GNUNET_free(pos);
361// }
362
363 GNUNET_asprintf (&buf, "round%llu", current_round);
364 if (GNUNET_OK ==
365 GNUNET_CONFIGURATION_get_value_number (testing_cfg, "test_mesh_small",
366 buf, &peers_next_round))
367 {
368 current_round++;
369 GNUNET_assert (churn_task == GNUNET_SCHEDULER_NO_TASK);
370 churn_task = GNUNET_SCHEDULER_add_now (&churn_peers, NULL);
371 }
372 else
373 { /* No more rounds, let's shut it down! */
374
375 stats_context = GNUNET_malloc (sizeof (struct StatsContext));
376 GNUNET_SCHEDULER_cancel (shutdown_handle);
377 shutdown_handle = GNUNET_SCHEDULER_NO_TASK;
378 GNUNET_TESTING_get_statistics (pg, &stats_finished_callback,
379 &statistics_iterator, stats_context);
380 }
381 GNUNET_free (buf);
382}
383
384
385/**
386 * FIXME.
387 *
388 * @param cls unused
389 * @param emsg NULL on success
390 */
391static void
392topology_output_callback (void *cls, const char *emsg)
393{
394 disconnect_task =
395 GNUNET_SCHEDULER_add_delayed (wait_time, &disconnect_mesh_peers, NULL);
396 GNUNET_SCHEDULER_add_now (&connect_mesh_service, NULL);
397}
398
399
400/**
401 * FIXME.
402 *
403 * @param cls closure
404 * @param emsg NULL on success
405 */
406static void
407churn_callback (void *cls, const char *emsg)
408{
409 char *temp_output_file;
410
411 if (emsg == NULL)
412 { /* Everything is okay! */
413 peers_running = peers_next_round;
414 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
415 "Round %llu, churn finished successfully.\n", current_round);
416 GNUNET_assert (disconnect_task == GNUNET_SCHEDULER_NO_TASK);
417 GNUNET_asprintf (&temp_output_file, "%s_%llu.dot", topology_file,
418 current_round);
419 GNUNET_TESTING_peergroup_topology_to_file (pg, temp_output_file,
420 &topology_output_callback, NULL);
421 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Writing topology to file %s\n",
422 temp_output_file);
423 GNUNET_free (temp_output_file);
424 }
425 else
426 {
427 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Round %llu, churn FAILED!!\n",
428 current_round);
429 GNUNET_SCHEDULER_cancel (shutdown_handle);
430 shutdown_handle = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL);
431 }
432}
433
434
435static void
436churn_peers (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
437{
438 /* peers_running = GNUNET_TESTING_daemons_running(pg); */
439 churn_task = GNUNET_SCHEDULER_NO_TASK;
440 if (peers_next_round == peers_running)
441 {
442 /* Nothing to do... */
443 GNUNET_SCHEDULER_add_now (&connect_mesh_service, NULL);
444 GNUNET_assert (disconnect_task == GNUNET_SCHEDULER_NO_TASK);
445 disconnect_task =
446 GNUNET_SCHEDULER_add_delayed (wait_time, &disconnect_mesh_peers, NULL);
447 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Round %lu, doing nothing!\n",
448 current_round);
449 }
450 else
451 {
452 if (peers_next_round > num_peers)
453 {
454 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
455 "Asked to turn on more peers than we have!!\n");
456 GNUNET_SCHEDULER_cancel (shutdown_handle);
457 GNUNET_SCHEDULER_add_now (&shutdown_task, NULL);
458 }
459 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
460 "Round %llu, turning off %llu peers, turning on %llu peers!\n",
461 current_round,
462 (peers_running >
463 peers_next_round) ? peers_running - peers_next_round : 0,
464 (peers_next_round >
465 peers_running) ? peers_next_round - peers_running : 0);
466 GNUNET_TESTING_daemons_churn (pg, "nse",
467 (peers_running >
468 peers_next_round) ? peers_running -
469 peers_next_round : 0,
470 (peers_next_round >
471 peers_running) ? peers_next_round -
472 peers_running : 0, wait_time, &churn_callback,
473 NULL);
474 }
475}
476
477
478/** 262/**
479 * peergroup_ready: start test when all peers are connected 263 * peergroup_ready: start test when all peers are connected
480 * @param cls closure 264 * @param cls closure
@@ -511,9 +295,9 @@ peergroup_ready (void *cls, const char *emsg)
511 } 295 }
512 peers_running = GNUNET_TESTING_daemons_running (pg); 296 peers_running = GNUNET_TESTING_daemons_running (pg);
513 297
514 GNUNET_SCHEDULER_add_now (&connect_mesh_service, NULL); 298 GNUNET_SCHEDULER_add_now (&connect_mesh, NULL);
515 disconnect_task = 299 disconnect_task =
516 GNUNET_SCHEDULER_add_delayed (wait_time, &disconnect_mesh_peers, NULL); 300 GNUNET_SCHEDULER_add_delayed (time_out, &disconnect_mesh, NULL);
517 301
518} 302}
519 303
@@ -557,7 +341,6 @@ run (void *cls, char *const *args, const char *cfgfile,
557 const struct GNUNET_CONFIGURATION_Handle *cfg) 341 const struct GNUNET_CONFIGURATION_Handle *cfg)
558{ 342{
559 char *temp_str; 343 char *temp_str;
560 unsigned long long temp_wait;
561 struct GNUNET_TESTING_Host *hosts; 344 struct GNUNET_TESTING_Host *hosts;
562 345
563 ok = 1; 346 ok = 1;
@@ -577,6 +360,8 @@ run (void *cls, char *const *args, const char *cfgfile,
577 "use_progressbars", "YES"); 360 "use_progressbars", "YES");
578#endif 361#endif
579 362
363 time_out = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30);
364
580 if (GNUNET_OK != 365 if (GNUNET_OK !=
581 GNUNET_CONFIGURATION_get_value_number (testing_cfg, "testing", 366 GNUNET_CONFIGURATION_get_value_number (testing_cfg, "testing",
582 "num_peers", &num_peers)) 367 "num_peers", &num_peers))
@@ -595,15 +380,6 @@ run (void *cls, char *const *args, const char *cfgfile,
595 } 380 }
596 381
597 if (GNUNET_OK != 382 if (GNUNET_OK !=
598 GNUNET_CONFIGURATION_get_value_number (testing_cfg, "test_mesh_small",
599 "wait_time", &temp_wait))
600 {
601 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
602 "Option nsetest_mesh_small:wait_time is required!\n");
603 return;
604 }
605
606 if (GNUNET_OK !=
607 GNUNET_CONFIGURATION_get_value_string (testing_cfg, "testing", 383 GNUNET_CONFIGURATION_get_value_string (testing_cfg, "testing",
608 "topology_output_file", 384 "topology_output_file",
609 &topology_file)) 385 &topology_file))
@@ -636,9 +412,6 @@ run (void *cls, char *const *args, const char *cfgfile,
636 GNUNET_free (data_filename); 412 GNUNET_free (data_filename);
637 } 413 }
638 414
639 wait_time =
640 GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, temp_wait);
641
642 if (GNUNET_YES == 415 if (GNUNET_YES ==
643 GNUNET_CONFIGURATION_get_value_string (cfg, "test_mesh_small", 416 GNUNET_CONFIGURATION_get_value_string (cfg, "test_mesh_small",
644 "output_file", &temp_str)) 417 "output_file", &temp_str))