aboutsummaryrefslogtreecommitdiff
path: root/src/transport/gnunet-transport.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2013-01-17 13:03:16 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2013-01-17 13:03:16 +0000
commit34d8a9d0b428eb683f0503106bcc31f3fc1af8a7 (patch)
treec96e4b4ddbb712794d34b9177652d09215885c9d /src/transport/gnunet-transport.c
parenta5d7b80e7e64f3127fd703b52928aa337f4337f5 (diff)
downloadgnunet-34d8a9d0b428eb683f0503106bcc31f3fc1af8a7.tar.gz
gnunet-34d8a9d0b428eb683f0503106bcc31f3fc1af8a7.zip
improved timeout handling for address listing
Diffstat (limited to 'src/transport/gnunet-transport.c')
-rw-r--r--src/transport/gnunet-transport.c53
1 files changed, 38 insertions, 15 deletions
diff --git a/src/transport/gnunet-transport.c b/src/transport/gnunet-transport.c
index ecb26ca89..94e4656e3 100644
--- a/src/transport/gnunet-transport.c
+++ b/src/transport/gnunet-transport.c
@@ -39,9 +39,9 @@
39 * How long do we wait for the NAT test to report success? 39 * How long do we wait for the NAT test to report success?
40 * Should match NAT_SERVER_TIMEOUT in 'nat_test.c'. 40 * Should match NAT_SERVER_TIMEOUT in 'nat_test.c'.
41 */ 41 */
42#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) 42#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 60)
43#define RESOLUTION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10) 43#define RESOLUTION_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
44#define OP_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5) 44#define OP_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
45 45
46/** 46/**
47 * Benchmarking block size in KB 47 * Benchmarking block size in KB
@@ -273,12 +273,25 @@ shutdown_task (void *cls,
273 } 273 }
274} 274}
275 275
276struct ResolutionContext *rc_head;
277struct ResolutionContext *rc_tail;
278
279struct ResolutionContext
280{
281 struct ResolutionContext *next;
282 struct ResolutionContext *prev;
283 struct GNUNET_HELLO_Address *addrcp;
284 struct GNUNET_TRANSPORT_AddressToStringContext *asc;
285 int printed;
286};
276 287
277 288
278static void 289static void
279operation_timeout (void *cls, 290operation_timeout (void *cls,
280 const struct GNUNET_SCHEDULER_TaskContext *tc) 291 const struct GNUNET_SCHEDULER_TaskContext *tc)
281{ 292{
293 struct ResolutionContext *cur;
294 struct ResolutionContext *next;
282 op_timeout = GNUNET_SCHEDULER_NO_TASK; 295 op_timeout = GNUNET_SCHEDULER_NO_TASK;
283 if ((try_connect) || (benchmark_send) || 296 if ((try_connect) || (benchmark_send) ||
284 (benchmark_receive)) 297 (benchmark_receive))
@@ -292,7 +305,20 @@ operation_timeout (void *cls,
292 } 305 }
293 if (iterate_connections) 306 if (iterate_connections)
294 { 307 {
295 FPRINTF (stdout, _("Failed to list connections, timeout occured\n")); 308 next = rc_head;
309 while (NULL != (cur = next))
310 {
311 next = cur->next;
312 FPRINTF (stdout, _("Failed to resolve address for peer `%s'\n"),
313 GNUNET_i2s (&cur->addrcp->peer));
314
315 GNUNET_CONTAINER_DLL_remove (rc_head, rc_tail, cur);
316 GNUNET_TRANSPORT_address_to_string_cancel (cur->asc);
317 GNUNET_free (cur->addrcp);
318 GNUNET_free (cur);
319
320 }
321 FPRINTF (stdout, _("Failed to list connections, timeout occured\n"));
296 if (GNUNET_SCHEDULER_NO_TASK != end) 322 if (GNUNET_SCHEDULER_NO_TASK != end)
297 GNUNET_SCHEDULER_cancel (end); 323 GNUNET_SCHEDULER_cancel (end);
298 end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); 324 end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL);
@@ -641,13 +667,6 @@ notify_receive (void *cls, const struct GNUNET_PeerIdentity *peer,
641 } 667 }
642} 668}
643 669
644struct ResolutionContext
645{
646 struct GNUNET_HELLO_Address *addrcp;
647
648 int printed;
649};
650
651 670
652static void 671static void
653process_string (void *cls, const char *address) 672process_string (void *cls, const char *address)
@@ -668,6 +687,7 @@ process_string (void *cls, const char *address)
668 if (GNUNET_NO == rc->printed) 687 if (GNUNET_NO == rc->printed)
669 FPRINTF (stdout, _("Peer `%s': %s <unable to resolve address>\n"), GNUNET_i2s (&addrcp->peer), addrcp->transport_name); 688 FPRINTF (stdout, _("Peer `%s': %s <unable to resolve address>\n"), GNUNET_i2s (&addrcp->peer), addrcp->transport_name);
670 GNUNET_free (rc->addrcp); 689 GNUNET_free (rc->addrcp);
690 GNUNET_CONTAINER_DLL_remove (rc_head, rc_tail, rc);
671 GNUNET_free (rc); 691 GNUNET_free (rc);
672 if ((0 == address_resolutions) && (iterate_connections)) 692 if ((0 == address_resolutions) && (iterate_connections))
673 { 693 {
@@ -685,6 +705,7 @@ process_string (void *cls, const char *address)
685 end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); 705 end = GNUNET_SCHEDULER_add_now (&shutdown_task, NULL);
686 } 706 }
687 } 707 }
708
688} 709}
689 710
690/** 711/**
@@ -720,15 +741,17 @@ process_address (void *cls, const struct GNUNET_PeerIdentity *peer,
720 &operation_timeout, NULL); 741 &operation_timeout, NULL);
721 742
722 rc = GNUNET_malloc(sizeof (struct ResolutionContext)); 743 rc = GNUNET_malloc(sizeof (struct ResolutionContext));
723 rc->addrcp = GNUNET_HELLO_address_copy(address);
724 rc->printed = GNUNET_NO;
725
726 GNUNET_assert (NULL != rc); 744 GNUNET_assert (NULL != rc);
745 GNUNET_CONTAINER_DLL_insert (rc_head, rc_tail, rc);
727 address_resolutions ++; 746 address_resolutions ++;
747
748 rc->addrcp = GNUNET_HELLO_address_copy(address);
749 rc->printed = GNUNET_NO;
728 /* Resolve address to string */ 750 /* Resolve address to string */
729 GNUNET_TRANSPORT_address_to_string (cfg, address, numeric, 751 rc->asc = GNUNET_TRANSPORT_address_to_string (cfg, address, numeric,
730 RESOLUTION_TIMEOUT, &process_string, 752 RESOLUTION_TIMEOUT, &process_string,
731 rc); 753 rc);
754
732} 755}
733 756
734void try_connect_cb (void *cls, 757void try_connect_cb (void *cls,