aboutsummaryrefslogtreecommitdiff
path: root/src/multicast/test_multicast_multipeer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/multicast/test_multicast_multipeer.c')
-rw-r--r--src/multicast/test_multicast_multipeer.c195
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
38struct multicast_peer 38struct multicast_peer
39{ 39{
@@ -44,6 +44,18 @@ struct multicast_peer
44 int test_ok; 44 int test_ok;
45}; 45};
46 46
47enum pingpong
48{
49 PING = 1,
50 PONG = 2
51};
52
53struct pingpong_msg
54{
55 int peer;
56 enum pingpong msg;
57};
58
47static void service_connect (void *cls, 59static 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;
53static struct GNUNET_TESTBED_Peer **peers; 65static struct GNUNET_TESTBED_Peer **peers;
54 66
55// FIXME: refactor 67// FIXME: refactor
56static struct GNUNET_TESTBED_Operation *op[NUM_PEERS]; 68static struct GNUNET_TESTBED_Operation *op[PEERS_REQUESTED];
57static struct GNUNET_TESTBED_Operation *pi_op[NUM_PEERS]; 69static struct GNUNET_TESTBED_Operation *pi_op[PEERS_REQUESTED];
58 70
59static struct GNUNET_MULTICAST_Origin *origin; 71static struct GNUNET_MULTICAST_Origin *origin;
60static struct GNUNET_MULTICAST_Member *member[NUM_PEERS]; /* first element always empty */ 72static struct GNUNET_MULTICAST_Member *member[PEERS_REQUESTED]; /* first element always empty */
61 73
62static struct GNUNET_SCHEDULER_Task *timeout_tid; 74static struct GNUNET_SCHEDULER_Task *timeout_tid;
63 75
64static struct GNUNET_CRYPTO_EddsaPrivateKey *group_key; 76static struct GNUNET_CRYPTO_EddsaPrivateKey group_key;
65static struct GNUNET_CRYPTO_EddsaPublicKey *group_pub_key; 77static struct GNUNET_CRYPTO_EddsaPublicKey group_pub_key;
78static struct GNUNET_HashCode group_pub_key_hash;
66 79
67static struct GNUNET_CRYPTO_EcdsaPrivateKey *member_key[NUM_PEERS]; 80static struct GNUNET_CRYPTO_EcdsaPrivateKey *member_key[PEERS_REQUESTED];
68static struct GNUNET_CRYPTO_EcdsaPublicKey *member_pub_key[NUM_PEERS]; 81static struct GNUNET_CRYPTO_EcdsaPublicKey *member_pub_key[PEERS_REQUESTED];
69 82
70 83
71/** 84/**
@@ -80,7 +93,7 @@ static int result;
80static void 93static void
81shutdown_task (void *cls) 94shutdown_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
312origin_request (void *cls, 323origin_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
533static void
534testbed_master (void *cls, 551testbed_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
583main (int argc, char *argv[]) 600main (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 */