diff options
author | lurchi <lurchi@strangeplace.net> | 2017-12-14 18:10:31 +0100 |
---|---|---|
committer | lurchi <lurchi@strangeplace.net> | 2017-12-14 18:12:25 +0100 |
commit | cbb68b43b499da5e9b5ea3d5662f60b6f6c228b1 (patch) | |
tree | 579ddde58e0b72e39af982642e755784eeb93c2b /src | |
parent | f2f8d311f0d93970d70a796688bc89da10b5f75d (diff) | |
download | gnunet-cbb68b43b499da5e9b5ea3d5662f60b6f6c228b1.tar.gz gnunet-cbb68b43b499da5e9b5ea3d5662f60b6f6c228b1.zip |
don't shutdown before all members and origin have disconnected
Diffstat (limited to 'src')
-rw-r--r-- | src/multicast/test_multicast_multipeer.c | 312 |
1 files changed, 159 insertions, 153 deletions
diff --git a/src/multicast/test_multicast_multipeer.c b/src/multicast/test_multicast_multipeer.c index 5f4493993..7df1a8213 100644 --- a/src/multicast/test_multicast_multipeer.c +++ b/src/multicast/test_multicast_multipeer.c | |||
@@ -35,9 +35,10 @@ | |||
35 | 35 | ||
36 | #define PEERS_REQUESTED 12 | 36 | #define PEERS_REQUESTED 12 |
37 | 37 | ||
38 | struct multicast_peer | 38 | struct MulticastPeerContext |
39 | { | 39 | { |
40 | int peer; /* peer number */ | 40 | int peer; /* peer number */ |
41 | struct GNUNET_CRYPTO_EcdsaPrivateKey *key; | ||
41 | const struct GNUNET_PeerIdentity *id; | 42 | const struct GNUNET_PeerIdentity *id; |
42 | struct GNUNET_TESTBED_Operation *op; /* not yet in use */ | 43 | struct GNUNET_TESTBED_Operation *op; /* not yet in use */ |
43 | struct GNUNET_TESTBED_Operation *pi_op; /* not yet in use */ | 44 | struct GNUNET_TESTBED_Operation *pi_op; /* not yet in use */ |
@@ -61,7 +62,7 @@ static void service_connect (void *cls, | |||
61 | void *ca_result, | 62 | void *ca_result, |
62 | const char *emsg); | 63 | const char *emsg); |
63 | 64 | ||
64 | static struct multicast_peer **mc_peers; | 65 | static struct MulticastPeerContext **multicast_peers; |
65 | static struct GNUNET_TESTBED_Peer **peers; | 66 | static struct GNUNET_TESTBED_Peer **peers; |
66 | 67 | ||
67 | // FIXME: refactor | 68 | // FIXME: refactor |
@@ -69,18 +70,14 @@ static struct GNUNET_TESTBED_Operation *op[PEERS_REQUESTED]; | |||
69 | static struct GNUNET_TESTBED_Operation *pi_op[PEERS_REQUESTED]; | 70 | static struct GNUNET_TESTBED_Operation *pi_op[PEERS_REQUESTED]; |
70 | 71 | ||
71 | static struct GNUNET_MULTICAST_Origin *origin; | 72 | static struct GNUNET_MULTICAST_Origin *origin; |
72 | static struct GNUNET_MULTICAST_Member *member[PEERS_REQUESTED]; /* first element always empty */ | 73 | static struct GNUNET_MULTICAST_Member *members[PEERS_REQUESTED]; /* first element always empty */ |
73 | 74 | ||
74 | static struct GNUNET_SCHEDULER_Task *timeout_tid; | 75 | static struct GNUNET_SCHEDULER_Task *timeout_tid; |
75 | 76 | ||
76 | static struct GNUNET_CRYPTO_EddsaPrivateKey group_key; | 77 | //static struct GNUNET_CRYPTO_EddsaPrivateKey *group_key; |
77 | static struct GNUNET_CRYPTO_EddsaPublicKey group_pub_key; | 78 | static struct GNUNET_CRYPTO_EddsaPublicKey group_pub_key; |
78 | static struct GNUNET_HashCode group_pub_key_hash; | 79 | static struct GNUNET_HashCode group_pub_key_hash; |
79 | 80 | ||
80 | static struct GNUNET_CRYPTO_EcdsaPrivateKey *member_key[PEERS_REQUESTED]; | ||
81 | static struct GNUNET_CRYPTO_EcdsaPublicKey *member_pub_key[PEERS_REQUESTED]; | ||
82 | |||
83 | |||
84 | /** | 81 | /** |
85 | * Global result for testcase. | 82 | * Global result for testcase. |
86 | */ | 83 | */ |
@@ -93,6 +90,8 @@ static int result; | |||
93 | static void | 90 | static void |
94 | shutdown_task (void *cls) | 91 | shutdown_task (void *cls) |
95 | { | 92 | { |
93 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
94 | "shutdown_task!\n"); | ||
96 | for (int i=0;i<PEERS_REQUESTED;i++) | 95 | for (int i=0;i<PEERS_REQUESTED;i++) |
97 | { | 96 | { |
98 | if (NULL != op[i]) | 97 | if (NULL != op[i]) |
@@ -107,14 +106,16 @@ shutdown_task (void *cls) | |||
107 | } | 106 | } |
108 | } | 107 | } |
109 | 108 | ||
110 | if (NULL != mc_peers) | 109 | if (NULL != multicast_peers) |
111 | { | 110 | { |
112 | for (int i=0; i < PEERS_REQUESTED; i++) | 111 | for (int i=0; i < PEERS_REQUESTED; i++) |
113 | { | 112 | { |
114 | GNUNET_free (mc_peers[i]); | 113 | GNUNET_free (multicast_peers[i]->key); |
115 | mc_peers[i] = NULL; | 114 | GNUNET_free (multicast_peers[i]); |
115 | multicast_peers[i] = NULL; | ||
116 | } | 116 | } |
117 | GNUNET_free (mc_peers); | 117 | GNUNET_free (multicast_peers); |
118 | multicast_peers = NULL; | ||
118 | } | 119 | } |
119 | 120 | ||
120 | if (NULL != timeout_tid) | 121 | if (NULL != timeout_tid) |
@@ -141,11 +142,11 @@ member_join_request (void *cls, | |||
141 | const struct GNUNET_MessageHeader *join_msg, | 142 | const struct GNUNET_MessageHeader *join_msg, |
142 | struct GNUNET_MULTICAST_JoinHandle *jh) | 143 | struct GNUNET_MULTICAST_JoinHandle *jh) |
143 | { | 144 | { |
144 | struct multicast_peer *mc_peer = (struct multicast_peer*)cls; | 145 | struct MulticastPeerContext *mc_peer = (struct MulticastPeerContext*)cls; |
145 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 146 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
146 | "Peer #%u (%s) sent a join request.\n", | 147 | "Peer #%u (%s) sent a join request.\n", |
147 | mc_peer->peer, | 148 | mc_peer->peer, |
148 | GNUNET_i2s (mc_peers[mc_peer->peer]->id)); | 149 | GNUNET_i2s (multicast_peers[mc_peer->peer]->id)); |
149 | } | 150 | } |
150 | 151 | ||
151 | 152 | ||
@@ -154,7 +155,7 @@ notify (void *cls, | |||
154 | size_t *data_size, | 155 | size_t *data_size, |
155 | void *data) | 156 | void *data) |
156 | { | 157 | { |
157 | struct multicast_peer *mc_peer = (struct multicast_peer*)cls; | 158 | struct MulticastPeerContext *mc_peer = (struct MulticastPeerContext*)cls; |
158 | 159 | ||
159 | struct pingpong_msg *pp_msg = GNUNET_new (struct pingpong_msg); | 160 | struct pingpong_msg *pp_msg = GNUNET_new (struct pingpong_msg); |
160 | pp_msg->peer = mc_peer->peer; | 161 | pp_msg->peer = mc_peer->peer; |
@@ -178,18 +179,18 @@ member_join_decision (void *cls, | |||
178 | const struct GNUNET_PeerIdentity *relays, | 179 | const struct GNUNET_PeerIdentity *relays, |
179 | const struct GNUNET_MessageHeader *join_msg) | 180 | const struct GNUNET_MessageHeader *join_msg) |
180 | { | 181 | { |
181 | struct multicast_peer *mc_peer = (struct multicast_peer*)cls; | 182 | struct MulticastPeerContext *mc_peer = (struct MulticastPeerContext*)cls; |
182 | struct GNUNET_MULTICAST_MemberTransmitHandle *req; | 183 | struct GNUNET_MULTICAST_MemberTransmitHandle *req; |
183 | 184 | ||
184 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 185 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
185 | "Peer #%u (%s) received a decision from origin: %s\n", | 186 | "Peer #%u (%s) received a decision from origin: %s\n", |
186 | mc_peer->peer, | 187 | mc_peer->peer, |
187 | GNUNET_i2s (mc_peers[mc_peer->peer]->id), | 188 | GNUNET_i2s (multicast_peers[mc_peer->peer]->id), |
188 | (GNUNET_YES == is_admitted)?"accepted":"rejected"); | 189 | (GNUNET_YES == is_admitted)?"accepted":"rejected"); |
189 | 190 | ||
190 | if (GNUNET_YES == is_admitted) | 191 | if (GNUNET_YES == is_admitted) |
191 | { | 192 | { |
192 | req = GNUNET_MULTICAST_member_to_origin (member[mc_peer->peer], | 193 | req = GNUNET_MULTICAST_member_to_origin (members[mc_peer->peer], |
193 | 0, | 194 | 0, |
194 | notify, | 195 | notify, |
195 | cls); | 196 | cls); |
@@ -215,10 +216,32 @@ member_replay_msg () | |||
215 | 216 | ||
216 | 217 | ||
217 | static void | 218 | static void |
219 | origin_disconnected_cb (void *cls) | ||
220 | { | ||
221 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
222 | "Origin disconnected. Shutting down.\n"); | ||
223 | result = GNUNET_YES; | ||
224 | GNUNET_SCHEDULER_shutdown (); | ||
225 | } | ||
226 | |||
227 | |||
228 | static void | ||
229 | member_disconnected_cb (void *cls) | ||
230 | { | ||
231 | for (int i = 1; i < PEERS_REQUESTED; ++i) | ||
232 | if (GNUNET_NO == multicast_peers[i]->test_ok) | ||
233 | return; | ||
234 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
235 | "All member disconnected. Stopping origin.\n"); | ||
236 | GNUNET_MULTICAST_origin_stop (origin, origin_disconnected_cb, cls); | ||
237 | } | ||
238 | |||
239 | |||
240 | static void | ||
218 | member_message (void *cls, | 241 | member_message (void *cls, |
219 | const struct GNUNET_MULTICAST_MessageHeader *msg) | 242 | const struct GNUNET_MULTICAST_MessageHeader *msg) |
220 | { | 243 | { |
221 | struct multicast_peer *mc_peer = (struct multicast_peer*)cls; | 244 | struct MulticastPeerContext *mc_peer = (struct MulticastPeerContext*)cls; |
222 | struct pingpong_msg *pp_msg = (struct pingpong_msg*) &(msg[1]); | 245 | struct pingpong_msg *pp_msg = (struct pingpong_msg*) &(msg[1]); |
223 | 246 | ||
224 | if (PONG == pp_msg->msg && mc_peer->peer == pp_msg->peer) | 247 | if (PONG == pp_msg->msg && mc_peer->peer == pp_msg->peer) |
@@ -226,18 +249,15 @@ member_message (void *cls, | |||
226 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 249 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
227 | "peer #%i (%s) receives a pong\n", | 250 | "peer #%i (%s) receives a pong\n", |
228 | mc_peer->peer, | 251 | mc_peer->peer, |
229 | GNUNET_i2s (mc_peers[mc_peer->peer]->id)); | 252 | GNUNET_i2s (multicast_peers[mc_peer->peer]->id)); |
230 | |||
231 | mc_peer->test_ok = GNUNET_OK; | 253 | mc_peer->test_ok = GNUNET_OK; |
232 | } | 254 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
233 | 255 | "peer #%u (%s) parting from multicast group\n", | |
234 | // Test for completeness of received PONGs | 256 | mc_peer->peer, |
235 | for (int i=1; i<PEERS_REQUESTED; i++) | 257 | GNUNET_i2s (multicast_peers[mc_peer->peer]->id)); |
236 | if (GNUNET_NO == mc_peers[i]->test_ok) | ||
237 | return; | ||
238 | 258 | ||
239 | result = GNUNET_YES; | 259 | GNUNET_MULTICAST_member_part (members[mc_peer->peer], member_disconnected_cb, cls); |
240 | GNUNET_SCHEDULER_shutdown(); | 260 | } |
241 | } | 261 | } |
242 | 262 | ||
243 | 263 | ||
@@ -349,81 +369,53 @@ origin_message (void *cls, | |||
349 | 369 | ||
350 | 370 | ||
351 | static void | 371 | static void |
352 | multicast_da (void *cls, | 372 | multicast_disconnect (void *cls, |
353 | void *op_result) | 373 | void *op_result) |
354 | { | 374 | { |
355 | struct multicast_peer *mc_peer = (struct multicast_peer*)cls; | ||
356 | 375 | ||
357 | if (0 == mc_peer->peer) | ||
358 | { | ||
359 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
360 | "Origin closes multicast group\n"); | ||
361 | |||
362 | GNUNET_MULTICAST_origin_stop (origin, NULL, cls); | ||
363 | } | ||
364 | else | ||
365 | { | ||
366 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
367 | "peer #%u (%s) parting from multicast group\n", | ||
368 | mc_peer->peer, | ||
369 | GNUNET_i2s (mc_peers[mc_peer->peer]->id)); | ||
370 | |||
371 | GNUNET_MULTICAST_member_part (member[mc_peer->peer], NULL, cls); | ||
372 | } | ||
373 | } | 376 | } |
374 | 377 | ||
375 | 378 | ||
376 | static void * | 379 | static void * |
377 | multicast_ca (void *cls, | 380 | multicast_connect (void *cls, |
378 | const struct GNUNET_CONFIGURATION_Handle *cfg) | 381 | const struct GNUNET_CONFIGURATION_Handle *cfg) |
379 | { | 382 | { |
380 | struct multicast_peer *mc_peer = (struct multicast_peer*)cls; | 383 | struct MulticastPeerContext *multicast_peer = cls; |
381 | struct GNUNET_MessageHeader *join_msg; | 384 | struct GNUNET_MessageHeader *join_msg; |
382 | char data[64]; | 385 | char data[64]; |
383 | 386 | ||
384 | if (0 == mc_peer->peer) | 387 | multicast_peer->key = GNUNET_CRYPTO_ecdsa_key_create (); |
388 | if (0 == multicast_peer->peer) | ||
385 | { | 389 | { |
386 | struct GNUNET_CRYPTO_EddsaPrivateKey *key = GNUNET_CRYPTO_eddsa_key_create (); | 390 | GNUNET_CRYPTO_eddsa_key_get_public (multicast_peer->key, &group_pub_key); |
387 | GNUNET_CRYPTO_eddsa_key_get_public (key, &group_pub_key); | ||
388 | GNUNET_CRYPTO_hash (&group_pub_key, sizeof (group_pub_key), &group_pub_key_hash); | 391 | GNUNET_CRYPTO_hash (&group_pub_key, sizeof (group_pub_key), &group_pub_key_hash); |
389 | |||
390 | group_key = *key; | ||
391 | |||
392 | origin = GNUNET_MULTICAST_origin_start (cfg, | 392 | origin = GNUNET_MULTICAST_origin_start (cfg, |
393 | &group_key, | 393 | multicast_peer->key, |
394 | 0, | 394 | 0, |
395 | origin_join_request, | 395 | origin_join_request, |
396 | origin_replay_frag, | 396 | origin_replay_frag, |
397 | origin_replay_msg, | 397 | origin_replay_msg, |
398 | origin_request, | 398 | origin_request, |
399 | origin_message, | 399 | origin_message, |
400 | cls); | 400 | cls); |
401 | 401 | if (NULL == origin) | |
402 | if (NULL == origin) { | 402 | { |
403 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 403 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
404 | "Peer #%u could not create a multicast group", | 404 | "Peer #%u could not create a multicast group", |
405 | mc_peer->peer); | 405 | multicast_peer->peer); |
406 | return NULL; | 406 | return NULL; |
407 | } | 407 | } |
408 | |||
409 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 408 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
410 | "Peer #%u connected as origin to group %s\n", | 409 | "Peer #%u connected as origin to group %s\n", |
411 | mc_peer->peer, | 410 | multicast_peer->peer, |
412 | GNUNET_h2s (&group_pub_key_hash)); | 411 | GNUNET_h2s (&group_pub_key_hash)); |
413 | |||
414 | return origin; | 412 | return origin; |
415 | } | 413 | } |
416 | else | 414 | else |
417 | { | 415 | { |
418 | // Get members keys | ||
419 | member_pub_key[mc_peer->peer] = GNUNET_new (struct GNUNET_CRYPTO_EcdsaPublicKey); | ||
420 | member_key[mc_peer->peer] = GNUNET_CRYPTO_ecdsa_key_create (); | ||
421 | GNUNET_CRYPTO_ecdsa_key_get_public (member_key[mc_peer->peer], | ||
422 | member_pub_key[mc_peer->peer]); | ||
423 | |||
424 | sprintf(data, "Hi, I am peer #%u (%s). Can I enter?", | 416 | sprintf(data, "Hi, I am peer #%u (%s). Can I enter?", |
425 | mc_peer->peer, | 417 | multicast_peer->peer, |
426 | GNUNET_i2s (mc_peers[mc_peer->peer]->id)); | 418 | GNUNET_i2s (multicast_peers[multicast_peer->peer]->id)); |
427 | uint8_t data_size = strlen (data) + 1; | 419 | uint8_t data_size = strlen (data) + 1; |
428 | join_msg = GNUNET_malloc (sizeof (join_msg) + data_size); | 420 | join_msg = GNUNET_malloc (sizeof (join_msg) + data_size); |
429 | join_msg->size = htons (sizeof (join_msg) + data_size); | 421 | join_msg->size = htons (sizeof (join_msg) + data_size); |
@@ -432,24 +424,25 @@ multicast_ca (void *cls, | |||
432 | 424 | ||
433 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 425 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
434 | "Peer #%u (%s) tries to join multicast group %s\n", | 426 | "Peer #%u (%s) tries to join multicast group %s\n", |
435 | mc_peer->peer, | 427 | multicast_peer->peer, |
436 | GNUNET_i2s (mc_peers[mc_peer->peer]->id), | 428 | GNUNET_i2s (multicast_peers[multicast_peer->peer]->id), |
437 | GNUNET_h2s (&group_pub_key_hash)); | 429 | GNUNET_h2s (&group_pub_key_hash)); |
438 | 430 | ||
439 | member[mc_peer->peer] = GNUNET_MULTICAST_member_join (cfg, | 431 | members[multicast_peer->peer] = |
440 | &group_pub_key, | 432 | GNUNET_MULTICAST_member_join (cfg, |
441 | member_key[mc_peer->peer], | 433 | &group_pub_key, |
442 | mc_peers[0]->id, | 434 | multicast_peer->key, |
443 | 0, | 435 | multicast_peers[0]->id, |
444 | NULL, | 436 | 0, |
445 | join_msg, /* join message */ | 437 | NULL, |
446 | member_join_request, | 438 | join_msg, /* join message */ |
447 | member_join_decision, | 439 | member_join_request, |
448 | member_replay_frag, | 440 | member_join_decision, |
449 | member_replay_msg, | 441 | member_replay_frag, |
450 | member_message, | 442 | member_replay_msg, |
451 | cls); | 443 | member_message, |
452 | return member[mc_peer->peer]; | 444 | cls); |
445 | return members[multicast_peer->peer]; | ||
453 | } | 446 | } |
454 | } | 447 | } |
455 | 448 | ||
@@ -460,7 +453,7 @@ peer_information_cb (void *cls, | |||
460 | const struct GNUNET_TESTBED_PeerInformation *pinfo, | 453 | const struct GNUNET_TESTBED_PeerInformation *pinfo, |
461 | const char *emsg) | 454 | const char *emsg) |
462 | { | 455 | { |
463 | struct multicast_peer *mc_peer = (struct multicast_peer*)cls; | 456 | struct MulticastPeerContext *mc_peer = (struct MulticastPeerContext*)cls; |
464 | 457 | ||
465 | if (NULL == pinfo) { | 458 | if (NULL == pinfo) { |
466 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "got no peer information\n"); | 459 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "got no peer information\n"); |
@@ -468,7 +461,7 @@ peer_information_cb (void *cls, | |||
468 | GNUNET_SCHEDULER_shutdown (); | 461 | GNUNET_SCHEDULER_shutdown (); |
469 | } | 462 | } |
470 | 463 | ||
471 | mc_peers[mc_peer->peer]->id = pinfo->result.id; | 464 | multicast_peers[mc_peer->peer]->id = pinfo->result.id; |
472 | 465 | ||
473 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 466 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
474 | "Got peer information of %s (%s)\n", | 467 | "Got peer information of %s (%s)\n", |
@@ -478,22 +471,28 @@ peer_information_cb (void *cls, | |||
478 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 471 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
479 | "Create peer #%u (%s)\n", | 472 | "Create peer #%u (%s)\n", |
480 | mc_peer->peer, | 473 | mc_peer->peer, |
481 | GNUNET_i2s (mc_peers[mc_peer->peer]->id)); | 474 | GNUNET_i2s (multicast_peers[mc_peer->peer]->id)); |
482 | 475 | ||
483 | if (0 != mc_peer->peer) | 476 | if (0 != mc_peer->peer) |
484 | { | 477 | { |
485 | /* connect to multicast service of members */ | 478 | /* connect to multicast service of members */ |
486 | op[mc_peer->peer] = GNUNET_TESTBED_service_connect (NULL, /* Closure for operation */ | 479 | op[mc_peer->peer] = |
487 | peers[mc_peer->peer], /* The peer whose service to connect to */ | 480 | GNUNET_TESTBED_service_connect (/* Closure for operation */ |
488 | "multicast", /* The name of the service */ | 481 | NULL, |
489 | service_connect, /* callback to call after a handle to service | 482 | /* The peer whose service to connect to */ |
490 | is opened */ | 483 | peers[mc_peer->peer], |
491 | cls, /* closure for the above callback */ | 484 | /* The name of the service */ |
492 | multicast_ca, /* callback to call with peer's configuration; | 485 | "multicast", |
493 | this should open the needed service connection */ | 486 | /* called after a handle to service is opened */ |
494 | multicast_da, /* callback to be called when closing the | 487 | service_connect, |
495 | opened service connection */ | 488 | /* closure for the above callback */ |
496 | cls); /* closure for the above two callbacks */ | 489 | cls, |
490 | /* called when opening the service connection */ | ||
491 | multicast_connect, | ||
492 | /* called when closing the service connection */ | ||
493 | multicast_disconnect, | ||
494 | /* closure for the above two callbacks */ | ||
495 | cls); | ||
497 | } | 496 | } |
498 | } | 497 | } |
499 | 498 | ||
@@ -504,14 +503,14 @@ service_connect (void *cls, | |||
504 | void *ca_result, | 503 | void *ca_result, |
505 | const char *emsg) | 504 | const char *emsg) |
506 | { | 505 | { |
507 | struct multicast_peer *mc_peer = (struct multicast_peer*)cls; | 506 | struct MulticastPeerContext *mc_peer = (struct MulticastPeerContext*)cls; |
508 | 507 | ||
509 | if (NULL == ca_result) | 508 | if (NULL == ca_result) |
510 | { | 509 | { |
511 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 510 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
512 | "Connection adapter not created for peer #%u (%s)\n", | 511 | "Connection adapter not created for peer #%u (%s)\n", |
513 | mc_peer->peer, | 512 | mc_peer->peer, |
514 | GNUNET_i2s (mc_peers[mc_peer->peer]->id)); | 513 | GNUNET_i2s (multicast_peers[mc_peer->peer]->id)); |
515 | 514 | ||
516 | result = GNUNET_SYSERR; | 515 | result = GNUNET_SYSERR; |
517 | GNUNET_SCHEDULER_shutdown(); | 516 | GNUNET_SCHEDULER_shutdown(); |
@@ -525,7 +524,7 @@ service_connect (void *cls, | |||
525 | pi_op[i] = GNUNET_TESTBED_peer_get_information (peers[i], | 524 | pi_op[i] = GNUNET_TESTBED_peer_get_information (peers[i], |
526 | GNUNET_TESTBED_PIT_IDENTITY, | 525 | GNUNET_TESTBED_PIT_IDENTITY, |
527 | peer_information_cb, | 526 | peer_information_cb, |
528 | mc_peers[i]); | 527 | multicast_peers[i]); |
529 | } | 528 | } |
530 | } | 529 | } |
531 | } | 530 | } |
@@ -549,50 +548,51 @@ service_connect (void *cls, | |||
549 | * @param links_failed number of links testbed was unable to establish | 548 | * @param links_failed number of links testbed was unable to establish |
550 | */ static void | 549 | */ static void |
551 | testbed_master (void *cls, | 550 | testbed_master (void *cls, |
552 | struct GNUNET_TESTBED_RunHandle *h, | 551 | struct GNUNET_TESTBED_RunHandle *h, |
553 | unsigned int num_peers, | 552 | unsigned int num_peers, |
554 | struct GNUNET_TESTBED_Peer **p, | 553 | struct GNUNET_TESTBED_Peer **p, |
555 | unsigned int links_succeeded, | 554 | unsigned int links_succeeded, |
556 | unsigned int links_failed) | 555 | unsigned int links_failed) |
557 | { | 556 | { |
558 | /* Testbed is ready with peers running and connected in a pre-defined overlay | 557 | /* Testbed is ready with peers running and connected in a pre-defined overlay |
559 | topology (FIXME) */ | 558 | topology (FIXME) */ |
560 | |||
561 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
562 | "Connected to testbed_master()\n"); | ||
563 | |||
564 | peers = p; | 559 | peers = p; |
565 | 560 | multicast_peers = GNUNET_new_array (PEERS_REQUESTED, struct MulticastPeerContext*); | |
566 | mc_peers = GNUNET_new_array (PEERS_REQUESTED, struct multicast_peer*); | ||
567 | 561 | ||
568 | // Create test contexts for members | 562 | // Create test contexts for members |
569 | for (int i = 0; i<PEERS_REQUESTED; i++) | 563 | for (int i = 0; i<PEERS_REQUESTED; i++) |
570 | { | 564 | { |
571 | mc_peers[i] = GNUNET_new (struct multicast_peer); | 565 | multicast_peers[i] = GNUNET_new (struct MulticastPeerContext); |
572 | mc_peers[i]->peer = i; | 566 | multicast_peers[i]->peer = i; |
573 | mc_peers[i]->test_ok = GNUNET_NO; | 567 | multicast_peers[i]->test_ok = GNUNET_NO; |
574 | } | 568 | } |
575 | |||
576 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | 569 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
577 | "Create origin peer\n"); | 570 | "Create origin peer\n"); |
578 | 571 | op[0] = | |
579 | op[0] = GNUNET_TESTBED_service_connect (NULL, /* Closure for operation */ | 572 | GNUNET_TESTBED_service_connect (/* Closure for operation */ |
580 | peers[0], /* The peer whose service to connect to */ | 573 | NULL, |
581 | "multicast", /* The name of the service */ | 574 | /* The peer whose service to connect to */ |
582 | service_connect, /* callback to call after a handle to service | 575 | peers[0], |
583 | is opened */ | 576 | /* The name of the service */ |
584 | mc_peers[0], /* closure for the above callback */ | 577 | "multicast", |
585 | multicast_ca, /* callback to call with peer's configuration; | 578 | /* called after a handle to service is opened */ |
586 | this should open the needed service connection */ | 579 | service_connect, |
587 | multicast_da, /* callback to be called when closing the | 580 | /* closure for the above callback */ |
588 | opened service connection */ | 581 | multicast_peers[0], |
589 | mc_peers[0]); /* closure for the above two callbacks */ | 582 | /* called when opening the service connection */ |
590 | 583 | multicast_connect, | |
591 | GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL); /* Schedule a new task on shutdown */ | 584 | /* called when closing the service connection */ |
592 | 585 | multicast_disconnect, | |
586 | /* closure for the above two callbacks */ | ||
587 | multicast_peers[0]); | ||
588 | /* Schedule a new task on shutdown */ | ||
589 | GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL); | ||
593 | /* Schedule the shutdown task with a delay of a few Seconds */ | 590 | /* Schedule the shutdown task with a delay of a few Seconds */ |
594 | timeout_tid = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 400), | 591 | timeout_tid = |
595 | &timeout_task, NULL); | 592 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply |
593 | (GNUNET_TIME_UNIT_SECONDS, 400), | ||
594 | &timeout_task, | ||
595 | NULL); | ||
596 | } | 596 | } |
597 | 597 | ||
598 | 598 | ||
@@ -616,15 +616,21 @@ main (int argc, char *argv[]) | |||
616 | } | 616 | } |
617 | 617 | ||
618 | result = GNUNET_SYSERR; | 618 | result = GNUNET_SYSERR; |
619 | ret = GNUNET_TESTBED_test_run | 619 | ret = |
620 | ("test-multicast-multipeer", /* test case name */ | 620 | GNUNET_TESTBED_test_run ("test-multicast-multipeer", |
621 | config_file, /* template configuration */ | 621 | config_file, |
622 | PEERS_REQUESTED, /* number of peers to start */ | 622 | /* number of peers to start */ |
623 | 0LL, /* Event mask - set to 0 for no event notifications */ | 623 | PEERS_REQUESTED, |
624 | NULL, /* Controller event callback */ | 624 | /* Event mask - set to 0 for no event notifications */ |
625 | NULL, /* Closure for controller event callback */ | 625 | 0LL, |
626 | testbed_master, /* continuation callback to be called when testbed setup is complete */ | 626 | /* Controller event callback */ |
627 | NULL); /* Closure for the test_master callback */ | 627 | NULL, |
628 | /* Closure for controller event callback */ | ||
629 | NULL, | ||
630 | /* called when testbed setup is complete */ | ||
631 | testbed_master, | ||
632 | /* Closure for the test_master callback */ | ||
633 | NULL); | ||
628 | if ( (GNUNET_OK != ret) || (GNUNET_OK != result) ) | 634 | if ( (GNUNET_OK != ret) || (GNUNET_OK != result) ) |
629 | return 1; | 635 | return 1; |
630 | return 0; | 636 | return 0; |