diff options
Diffstat (limited to 'src/multicast/test_multicast_multipeer.c')
-rw-r--r-- | src/multicast/test_multicast_multipeer.c | 195 |
1 files changed, 113 insertions, 82 deletions
diff --git a/src/multicast/test_multicast_multipeer.c b/src/multicast/test_multicast_multipeer.c index 5c3664f35..5f4493993 100644 --- a/src/multicast/test_multicast_multipeer.c +++ b/src/multicast/test_multicast_multipeer.c | |||
@@ -33,7 +33,7 @@ | |||
33 | #include "gnunet_testbed_service.h" | 33 | #include "gnunet_testbed_service.h" |
34 | #include "gnunet_multicast_service.h" | 34 | #include "gnunet_multicast_service.h" |
35 | 35 | ||
36 | #define NUM_PEERS 2 | 36 | #define PEERS_REQUESTED 12 |
37 | 37 | ||
38 | struct multicast_peer | 38 | struct multicast_peer |
39 | { | 39 | { |
@@ -44,6 +44,18 @@ struct multicast_peer | |||
44 | int test_ok; | 44 | int test_ok; |
45 | }; | 45 | }; |
46 | 46 | ||
47 | enum pingpong | ||
48 | { | ||
49 | PING = 1, | ||
50 | PONG = 2 | ||
51 | }; | ||
52 | |||
53 | struct pingpong_msg | ||
54 | { | ||
55 | int peer; | ||
56 | enum pingpong msg; | ||
57 | }; | ||
58 | |||
47 | static void service_connect (void *cls, | 59 | static void service_connect (void *cls, |
48 | struct GNUNET_TESTBED_Operation *op, | 60 | struct GNUNET_TESTBED_Operation *op, |
49 | void *ca_result, | 61 | void *ca_result, |
@@ -53,19 +65,20 @@ static struct multicast_peer **mc_peers; | |||
53 | static struct GNUNET_TESTBED_Peer **peers; | 65 | static struct GNUNET_TESTBED_Peer **peers; |
54 | 66 | ||
55 | // FIXME: refactor | 67 | // FIXME: refactor |
56 | static struct GNUNET_TESTBED_Operation *op[NUM_PEERS]; | 68 | static struct GNUNET_TESTBED_Operation *op[PEERS_REQUESTED]; |
57 | static struct GNUNET_TESTBED_Operation *pi_op[NUM_PEERS]; | 69 | static struct GNUNET_TESTBED_Operation *pi_op[PEERS_REQUESTED]; |
58 | 70 | ||
59 | static struct GNUNET_MULTICAST_Origin *origin; | 71 | static struct GNUNET_MULTICAST_Origin *origin; |
60 | static struct GNUNET_MULTICAST_Member *member[NUM_PEERS]; /* first element always empty */ | 72 | static struct GNUNET_MULTICAST_Member *member[PEERS_REQUESTED]; /* first element always empty */ |
61 | 73 | ||
62 | static struct GNUNET_SCHEDULER_Task *timeout_tid; | 74 | static struct GNUNET_SCHEDULER_Task *timeout_tid; |
63 | 75 | ||
64 | static struct GNUNET_CRYPTO_EddsaPrivateKey *group_key; | 76 | static struct GNUNET_CRYPTO_EddsaPrivateKey group_key; |
65 | static struct GNUNET_CRYPTO_EddsaPublicKey *group_pub_key; | 77 | static struct GNUNET_CRYPTO_EddsaPublicKey group_pub_key; |
78 | static struct GNUNET_HashCode group_pub_key_hash; | ||
66 | 79 | ||
67 | static struct GNUNET_CRYPTO_EcdsaPrivateKey *member_key[NUM_PEERS]; | 80 | static struct GNUNET_CRYPTO_EcdsaPrivateKey *member_key[PEERS_REQUESTED]; |
68 | static struct GNUNET_CRYPTO_EcdsaPublicKey *member_pub_key[NUM_PEERS]; | 81 | static struct GNUNET_CRYPTO_EcdsaPublicKey *member_pub_key[PEERS_REQUESTED]; |
69 | 82 | ||
70 | 83 | ||
71 | /** | 84 | /** |
@@ -80,7 +93,7 @@ static int result; | |||
80 | static void | 93 | static void |
81 | shutdown_task (void *cls) | 94 | shutdown_task (void *cls) |
82 | { | 95 | { |
83 | for (int i=0;i<NUM_PEERS;i++) | 96 | for (int i=0;i<PEERS_REQUESTED;i++) |
84 | { | 97 | { |
85 | if (NULL != op[i]) | 98 | if (NULL != op[i]) |
86 | { | 99 | { |
@@ -96,7 +109,7 @@ shutdown_task (void *cls) | |||
96 | 109 | ||
97 | if (NULL != mc_peers) | 110 | if (NULL != mc_peers) |
98 | { | 111 | { |
99 | for (int i=0; i < NUM_PEERS; i++) | 112 | for (int i=0; i < PEERS_REQUESTED; i++) |
100 | { | 113 | { |
101 | GNUNET_free (mc_peers[i]); | 114 | GNUNET_free (mc_peers[i]); |
102 | mc_peers[i] = NULL; | 115 | mc_peers[i] = NULL; |
@@ -143,12 +156,15 @@ notify (void *cls, | |||
143 | { | 156 | { |
144 | struct multicast_peer *mc_peer = (struct multicast_peer*)cls; | 157 | struct multicast_peer *mc_peer = (struct multicast_peer*)cls; |
145 | 158 | ||
146 | char text[] = "ping"; | 159 | struct pingpong_msg *pp_msg = GNUNET_new (struct pingpong_msg); |
147 | *data_size = strlen(text)+1; | 160 | pp_msg->peer = mc_peer->peer; |
148 | GNUNET_memcpy(data, text, *data_size); | 161 | pp_msg->msg = PING; |
162 | |||
163 | *data_size = sizeof (struct pingpong_msg); | ||
164 | GNUNET_memcpy(data, pp_msg, *data_size); | ||
149 | 165 | ||
150 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 166 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
151 | "Peer #%u sents message to origin: %s\n", mc_peer->peer, text); | 167 | "Peer #%u sents ping to origin\n", mc_peer->peer); |
152 | 168 | ||
153 | return GNUNET_YES; | 169 | return GNUNET_YES; |
154 | } | 170 | } |
@@ -203,29 +219,20 @@ member_message (void *cls, | |||
203 | const struct GNUNET_MULTICAST_MessageHeader *msg) | 219 | const struct GNUNET_MULTICAST_MessageHeader *msg) |
204 | { | 220 | { |
205 | struct multicast_peer *mc_peer = (struct multicast_peer*)cls; | 221 | struct multicast_peer *mc_peer = (struct multicast_peer*)cls; |
222 | struct pingpong_msg *pp_msg = (struct pingpong_msg*) &(msg[1]); | ||
206 | 223 | ||
207 | if (0 != strncmp ("pong", (char *)&msg[1], 4)) | 224 | if (PONG == pp_msg->msg && mc_peer->peer == pp_msg->peer) |
208 | { | 225 | { |
209 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 226 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
210 | "peer #%i (%s) did not receive pong\n", | 227 | "peer #%i (%s) receives a pong\n", |
211 | mc_peer->peer, | 228 | mc_peer->peer, |
212 | GNUNET_i2s (mc_peers[mc_peer->peer]->id)); | 229 | GNUNET_i2s (mc_peers[mc_peer->peer]->id)); |
213 | 230 | ||
214 | result = GNUNET_SYSERR; | 231 | mc_peer->test_ok = GNUNET_OK; |
215 | GNUNET_SCHEDULER_shutdown (); | ||
216 | } | 232 | } |
217 | 233 | ||
218 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 234 | // Test for completeness of received PONGs |
219 | "peer #%i (%s) receives: %s\n", | 235 | for (int i=1; i<PEERS_REQUESTED; i++) |
220 | mc_peer->peer, | ||
221 | GNUNET_i2s (mc_peers[mc_peer->peer]->id), | ||
222 | (char *)&msg[1]); | ||
223 | |||
224 | mc_peer->test_ok = GNUNET_OK; | ||
225 | |||
226 | // FIXME: ugly test function | ||
227 | // (we start with 1 because 0 is origin) | ||
228 | for (int i=1; i<NUM_PEERS; i++) | ||
229 | if (GNUNET_NO == mc_peers[i]->test_ok) | 236 | if (GNUNET_NO == mc_peers[i]->test_ok) |
230 | return; | 237 | return; |
231 | 238 | ||
@@ -298,11 +305,15 @@ origin_notify (void *cls, | |||
298 | size_t *data_size, | 305 | size_t *data_size, |
299 | void *data) | 306 | void *data) |
300 | { | 307 | { |
301 | char text[] = "pong"; | 308 | struct pingpong_msg *rcv_pp_msg = (struct pingpong_msg*)cls; |
302 | *data_size = strlen(text)+1; | 309 | struct pingpong_msg *pp_msg = GNUNET_new (struct pingpong_msg); |
303 | memcpy(data, text, *data_size); | ||
304 | 310 | ||
305 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "origin sends (to all): %s\n", text); | 311 | pp_msg->peer = rcv_pp_msg->peer; |
312 | pp_msg->msg = PONG; | ||
313 | *data_size = sizeof (struct pingpong_msg); | ||
314 | memcpy(data, pp_msg, *data_size); | ||
315 | |||
316 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "origin sends pong\n"); | ||
306 | 317 | ||
307 | return GNUNET_YES; | 318 | return GNUNET_YES; |
308 | } | 319 | } |
@@ -312,9 +323,12 @@ static void | |||
312 | origin_request (void *cls, | 323 | origin_request (void *cls, |
313 | const struct GNUNET_MULTICAST_RequestHeader *req) | 324 | const struct GNUNET_MULTICAST_RequestHeader *req) |
314 | { | 325 | { |
315 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "origin receives: %s\n", (char *)&req[1]); | 326 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "origin receives a msg\n"); |
327 | |||
328 | req++; | ||
329 | struct pingpong_msg *pp_msg = (struct pingpong_msg *) req; | ||
316 | 330 | ||
317 | if (0 != strncmp ("ping", (char *)&req[1], 4)) { | 331 | if (1 != pp_msg->msg) { |
318 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "origin didn't reveice a correct request"); | 332 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "origin didn't reveice a correct request"); |
319 | } | 333 | } |
320 | 334 | ||
@@ -322,7 +336,7 @@ origin_request (void *cls, | |||
322 | 0, | 336 | 0, |
323 | 0, | 337 | 0, |
324 | origin_notify, | 338 | origin_notify, |
325 | cls); | 339 | pp_msg); |
326 | } | 340 | } |
327 | 341 | ||
328 | 342 | ||
@@ -366,15 +380,17 @@ multicast_ca (void *cls, | |||
366 | struct multicast_peer *mc_peer = (struct multicast_peer*)cls; | 380 | struct multicast_peer *mc_peer = (struct multicast_peer*)cls; |
367 | struct GNUNET_MessageHeader *join_msg; | 381 | struct GNUNET_MessageHeader *join_msg; |
368 | char data[64]; | 382 | char data[64]; |
369 | 383 | ||
370 | if (0 == mc_peer->peer) | 384 | if (0 == mc_peer->peer) |
371 | { | 385 | { |
372 | group_pub_key = GNUNET_new (struct GNUNET_CRYPTO_EddsaPublicKey); | 386 | struct GNUNET_CRYPTO_EddsaPrivateKey *key = GNUNET_CRYPTO_eddsa_key_create (); |
373 | group_key = GNUNET_CRYPTO_eddsa_key_create (); | 387 | GNUNET_CRYPTO_eddsa_key_get_public (key, &group_pub_key); |
374 | GNUNET_CRYPTO_eddsa_key_get_public (group_key, group_pub_key); | 388 | GNUNET_CRYPTO_hash (&group_pub_key, sizeof (group_pub_key), &group_pub_key_hash); |
375 | 389 | ||
376 | return GNUNET_MULTICAST_origin_start (cfg, | 390 | group_key = *key; |
377 | group_key, | 391 | |
392 | origin = GNUNET_MULTICAST_origin_start (cfg, | ||
393 | &group_key, | ||
378 | 0, | 394 | 0, |
379 | origin_join_request, | 395 | origin_join_request, |
380 | origin_replay_frag, | 396 | origin_replay_frag, |
@@ -382,6 +398,20 @@ multicast_ca (void *cls, | |||
382 | origin_request, | 398 | origin_request, |
383 | origin_message, | 399 | origin_message, |
384 | cls); | 400 | cls); |
401 | |||
402 | if (NULL == origin) { | ||
403 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
404 | "Peer #%u could not create a multicast group", | ||
405 | mc_peer->peer); | ||
406 | return NULL; | ||
407 | } | ||
408 | |||
409 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
410 | "Peer #%u connected as origin to group %s\n", | ||
411 | mc_peer->peer, | ||
412 | GNUNET_h2s (&group_pub_key_hash)); | ||
413 | |||
414 | return origin; | ||
385 | } | 415 | } |
386 | else | 416 | else |
387 | { | 417 | { |
@@ -401,23 +431,25 @@ multicast_ca (void *cls, | |||
401 | GNUNET_memcpy (&join_msg[1], data, data_size); | 431 | GNUNET_memcpy (&join_msg[1], data, data_size); |
402 | 432 | ||
403 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 433 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
404 | "Peer #%u (%s) tries to join multicast group\n", | 434 | "Peer #%u (%s) tries to join multicast group %s\n", |
405 | mc_peer->peer, | 435 | mc_peer->peer, |
406 | GNUNET_i2s (mc_peers[mc_peer->peer]->id)); | 436 | GNUNET_i2s (mc_peers[mc_peer->peer]->id), |
407 | 437 | GNUNET_h2s (&group_pub_key_hash)); | |
408 | return GNUNET_MULTICAST_member_join (cfg, | 438 | |
409 | group_pub_key, | 439 | member[mc_peer->peer] = GNUNET_MULTICAST_member_join (cfg, |
410 | member_key[mc_peer->peer], | 440 | &group_pub_key, |
411 | mc_peers[0]->id, | 441 | member_key[mc_peer->peer], |
412 | 0, | 442 | mc_peers[0]->id, |
413 | NULL, | 443 | 0, |
414 | join_msg, /* join message */ | 444 | NULL, |
415 | member_join_request, | 445 | join_msg, /* join message */ |
416 | member_join_decision, | 446 | member_join_request, |
417 | member_replay_frag, | 447 | member_join_decision, |
418 | member_replay_msg, | 448 | member_replay_frag, |
419 | member_message, | 449 | member_replay_msg, |
420 | cls); | 450 | member_message, |
451 | cls); | ||
452 | return member[mc_peer->peer]; | ||
421 | } | 453 | } |
422 | } | 454 | } |
423 | 455 | ||
@@ -485,20 +517,10 @@ service_connect (void *cls, | |||
485 | GNUNET_SCHEDULER_shutdown(); | 517 | GNUNET_SCHEDULER_shutdown(); |
486 | } | 518 | } |
487 | 519 | ||
488 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
489 | "Connected to multicast service of peer #%u (%s)\n", | ||
490 | mc_peer->peer, | ||
491 | GNUNET_i2s (mc_peers[mc_peer->peer]->id)); | ||
492 | |||
493 | if (0 == mc_peer->peer) | 520 | if (0 == mc_peer->peer) |
494 | { | 521 | { |
495 | origin = ca_result; | 522 | // Get GNUnet identity of members |
496 | 523 | for (int i = 0; i<PEERS_REQUESTED; i++) | |
497 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
498 | "Connected to multicast service of origin\n"); | ||
499 | |||
500 | // Get GNUnet identity of members | ||
501 | for (int i = 0; i<NUM_PEERS; i++) | ||
502 | { | 524 | { |
503 | pi_op[i] = GNUNET_TESTBED_peer_get_information (peers[i], | 525 | pi_op[i] = GNUNET_TESTBED_peer_get_information (peers[i], |
504 | GNUNET_TESTBED_PIT_IDENTITY, | 526 | GNUNET_TESTBED_PIT_IDENTITY, |
@@ -506,10 +528,6 @@ service_connect (void *cls, | |||
506 | mc_peers[i]); | 528 | mc_peers[i]); |
507 | } | 529 | } |
508 | } | 530 | } |
509 | else | ||
510 | { | ||
511 | member[mc_peer->peer] = ca_result; | ||
512 | } | ||
513 | } | 531 | } |
514 | 532 | ||
515 | 533 | ||
@@ -526,11 +544,10 @@ service_connect (void *cls, | |||
526 | * @param cls closure | 544 | * @param cls closure |
527 | * @param h the run handle | 545 | * @param h the run handle |
528 | * @param peers started peers for the test | 546 | * @param peers started peers for the test |
529 | * @param num_peers size of the 'peers' array | 547 | * @param PEERS_REQUESTED size of the 'peers' array |
530 | * @param links_succeeded number of links between peers that were created | 548 | * @param links_succeeded number of links between peers that were created |
531 | * @param links_failed number of links testbed was unable to establish | 549 | * @param links_failed number of links testbed was unable to establish |
532 | */ | 550 | */ static void |
533 | static void | ||
534 | testbed_master (void *cls, | 551 | testbed_master (void *cls, |
535 | struct GNUNET_TESTBED_RunHandle *h, | 552 | struct GNUNET_TESTBED_RunHandle *h, |
536 | unsigned int num_peers, | 553 | unsigned int num_peers, |
@@ -546,10 +563,10 @@ testbed_master (void *cls, | |||
546 | 563 | ||
547 | peers = p; | 564 | peers = p; |
548 | 565 | ||
549 | mc_peers = GNUNET_new_array (NUM_PEERS, struct multicast_peer*); | 566 | mc_peers = GNUNET_new_array (PEERS_REQUESTED, struct multicast_peer*); |
550 | 567 | ||
551 | // Create test contexts for members | 568 | // Create test contexts for members |
552 | for (int i = 0; i<NUM_PEERS; i++) | 569 | for (int i = 0; i<PEERS_REQUESTED; i++) |
553 | { | 570 | { |
554 | mc_peers[i] = GNUNET_new (struct multicast_peer); | 571 | mc_peers[i] = GNUNET_new (struct multicast_peer); |
555 | mc_peers[i]->peer = i; | 572 | mc_peers[i]->peer = i; |
@@ -583,12 +600,26 @@ int | |||
583 | main (int argc, char *argv[]) | 600 | main (int argc, char *argv[]) |
584 | { | 601 | { |
585 | int ret; | 602 | int ret; |
603 | char const *config_file; | ||
604 | |||
605 | if (strstr (argv[0], "_line") != NULL) | ||
606 | { | ||
607 | config_file = "test_multicast_line.conf"; | ||
608 | } | ||
609 | else if (strstr(argv[0], "_star") != NULL) | ||
610 | { | ||
611 | config_file = "test_multicast_star.conf"; | ||
612 | } | ||
613 | else | ||
614 | { | ||
615 | config_file = "test_multicast_star.conf"; | ||
616 | } | ||
586 | 617 | ||
587 | result = GNUNET_SYSERR; | 618 | result = GNUNET_SYSERR; |
588 | ret = GNUNET_TESTBED_test_run | 619 | ret = GNUNET_TESTBED_test_run |
589 | ("test-multicast-multipeer", /* test case name */ | 620 | ("test-multicast-multipeer", /* test case name */ |
590 | "test_multicast.conf", /* template configuration */ | 621 | config_file, /* template configuration */ |
591 | NUM_PEERS, /* number of peers to start */ | 622 | PEERS_REQUESTED, /* number of peers to start */ |
592 | 0LL, /* Event mask - set to 0 for no event notifications */ | 623 | 0LL, /* Event mask - set to 0 for no event notifications */ |
593 | NULL, /* Controller event callback */ | 624 | NULL, /* Controller event callback */ |
594 | NULL, /* Closure for controller event callback */ | 625 | NULL, /* Closure for controller event callback */ |