aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2011-08-14 14:26:33 +0000
committerChristian Grothoff <christian@grothoff.org>2011-08-14 14:26:33 +0000
commitce440f071e48bbc75ff797f8a37662996c4af57a (patch)
tree4152ae6505e4eae8ce88b72eecb7b59197b01cfe /src
parenta2ed50e8e82e1d4f60302c30f9d748f7698b7cec (diff)
downloadgnunet-ce440f071e48bbc75ff797f8a37662996c4af57a.tar.gz
gnunet-ce440f071e48bbc75ff797f8a37662996c4af57a.zip
LRN: Fix deps in transport
Diffstat (limited to 'src')
-rw-r--r--src/transport/Makefile.am7
-rw-r--r--src/transport/gnunet-service-transport-new.c3
-rw-r--r--src/transport/gnunet-service-transport_blacklist.c128
-rw-r--r--src/transport/gnunet-service-transport_blacklist.h18
-rw-r--r--src/transport/gnunet-service-transport_clients.c3
-rw-r--r--src/transport/gnunet-service-transport_validation.c110
6 files changed, 186 insertions, 83 deletions
diff --git a/src/transport/Makefile.am b/src/transport/Makefile.am
index 4694ba2e5..2a217d4f3 100644
--- a/src/transport/Makefile.am
+++ b/src/transport/Makefile.am
@@ -71,6 +71,13 @@ lib_LTLIBRARIES = \
71 71
72libgnunettransporttesting_la_SOURCES = \ 72libgnunettransporttesting_la_SOURCES = \
73 transport-testing.c 73 transport-testing.c
74libgnunettransporttesting_la_LIBADD = \
75 $(top_builddir)/src/transport/libgnunettransport.la \
76 $(top_builddir)/src/hello/libgnunethello.la \
77 $(top_builddir)/src/util/libgnunetutil.la \
78 $(GN_LIBINTL)
79libgnunettransporttesting_la_DEPENDS = \
80 libgnunettransport.la
74 81
75libgnunettransport_la_SOURCES = \ 82libgnunettransport_la_SOURCES = \
76 transport_api.c transport.h \ 83 transport_api.c transport.h \
diff --git a/src/transport/gnunet-service-transport-new.c b/src/transport/gnunet-service-transport-new.c
index da0bfa6d3..e8369b661 100644
--- a/src/transport/gnunet-service-transport-new.c
+++ b/src/transport/gnunet-service-transport-new.c
@@ -150,7 +150,8 @@ plugin_env_receive_callback (void *cls,
150 uint16_t sender_address_len) 150 uint16_t sender_address_len)
151{ 151{
152 const char *plugin_name = cls; 152 const char *plugin_name = cls;
153 153
154
154 if (NULL != message) 155 if (NULL != message)
155 GST_clients_broadcast (message, GNUNET_YES); 156 GST_clients_broadcast (message, GNUNET_YES);
156 GNUNET_ATS_address_update (GST_ats, 157 GNUNET_ATS_address_update (GST_ats,
diff --git a/src/transport/gnunet-service-transport_blacklist.c b/src/transport/gnunet-service-transport_blacklist.c
index 09aa43452..7250b6e45 100644
--- a/src/transport/gnunet-service-transport_blacklist.c
+++ b/src/transport/gnunet-service-transport_blacklist.c
@@ -39,7 +39,7 @@
39/** 39/**
40 * Context we use when performing a blacklist check. 40 * Context we use when performing a blacklist check.
41 */ 41 */
42struct BlacklistCheck; 42struct GST_BlacklistCheck;
43 43
44 44
45/** 45/**
@@ -64,9 +64,15 @@ struct Blacklisters
64 struct GNUNET_SERVER_Client *client; 64 struct GNUNET_SERVER_Client *client;
65 65
66 /** 66 /**
67 * Blacklist check that we're currently performing. 67 * Blacklist check that we're currently performing (or NULL
68 * if we're performing one that has been cancelled).
68 */ 69 */
69 struct BlacklistCheck *bc; 70 struct GST_BlacklistCheck *bc;
71
72 /**
73 * Set to GNUNET_YES if we're currently waiting for a reply.
74 */
75 int waiting_for_reply;
70 76
71}; 77};
72 78
@@ -75,18 +81,18 @@ struct Blacklisters
75/** 81/**
76 * Context we use when performing a blacklist check. 82 * Context we use when performing a blacklist check.
77 */ 83 */
78struct BlacklistCheck 84struct GST_BlacklistCheck
79{ 85{
80 86
81 /** 87 /**
82 * This is a linked list. 88 * This is a linked list.
83 */ 89 */
84 struct BlacklistCheck *next; 90 struct GST_BlacklistCheck *next;
85 91
86 /** 92 /**
87 * This is a linked list. 93 * This is a linked list.
88 */ 94 */
89 struct BlacklistCheck *prev; 95 struct GST_BlacklistCheck *prev;
90 96
91 /** 97 /**
92 * Peer being checked. 98 * Peer being checked.
@@ -125,12 +131,12 @@ struct BlacklistCheck
125/** 131/**
126 * Head of DLL of active blacklisting queries. 132 * Head of DLL of active blacklisting queries.
127 */ 133 */
128static struct BlacklistCheck *bc_head; 134static struct GST_BlacklistCheck *bc_head;
129 135
130/** 136/**
131 * Tail of DLL of active blacklisting queries. 137 * Tail of DLL of active blacklisting queries.
132 */ 138 */
133static struct BlacklistCheck *bc_tail; 139static struct GST_BlacklistCheck *bc_tail;
134 140
135/** 141/**
136 * Head of DLL of blacklisting clients. 142 * Head of DLL of blacklisting clients.
@@ -172,7 +178,7 @@ client_disconnect_notification (void *cls,
172 struct GNUNET_SERVER_Client *client) 178 struct GNUNET_SERVER_Client *client)
173{ 179{
174 struct Blacklisters *bl; 180 struct Blacklisters *bl;
175 struct BlacklistCheck *bc; 181 struct GST_BlacklistCheck *bc;
176 182
177 if (client == NULL) 183 if (client == NULL)
178 return; 184 return;
@@ -435,7 +441,7 @@ GST_blacklist_stop ()
435/** 441/**
436 * Transmit blacklist query to the client. 442 * Transmit blacklist query to the client.
437 * 443 *
438 * @param cls the 'struct BlacklistCheck' 444 * @param cls the 'struct GST_BlacklistCheck'
439 * @param size number of bytes allowed 445 * @param size number of bytes allowed
440 * @param buf where to copy the message 446 * @param buf where to copy the message
441 * @return number of bytes copied to buf 447 * @return number of bytes copied to buf
@@ -445,7 +451,7 @@ transmit_blacklist_message (void *cls,
445 size_t size, 451 size_t size,
446 void *buf) 452 void *buf)
447{ 453{
448 struct BlacklistCheck *bc = cls; 454 struct GST_BlacklistCheck *bc = cls;
449 struct Blacklisters *bl; 455 struct Blacklisters *bl;
450 struct BlacklistMessage bm; 456 struct BlacklistMessage bm;
451 457
@@ -472,6 +478,7 @@ transmit_blacklist_message (void *cls,
472 bm.peer = bc->peer; 478 bm.peer = bc->peer;
473 memcpy (buf, &bm, sizeof (bm)); 479 memcpy (buf, &bm, sizeof (bm));
474 GNUNET_SERVER_receive_done (bl->client, GNUNET_OK); 480 GNUNET_SERVER_receive_done (bl->client, GNUNET_OK);
481 bl->waiting_for_reply = GNUNET_YES;
475 return sizeof (bm); 482 return sizeof (bm);
476} 483}
477 484
@@ -479,14 +486,14 @@ transmit_blacklist_message (void *cls,
479/** 486/**
480 * Perform next action in the blacklist check. 487 * Perform next action in the blacklist check.
481 * 488 *
482 * @param cls the 'struct BlacklistCheck*' 489 * @param cls the 'struct GST_BlacklistCheck*'
483 * @param tc unused 490 * @param tc unused
484 */ 491 */
485static void 492static void
486do_blacklist_check (void *cls, 493do_blacklist_check (void *cls,
487 const struct GNUNET_SCHEDULER_TaskContext *tc) 494 const struct GNUNET_SCHEDULER_TaskContext *tc)
488{ 495{
489 struct BlacklistCheck *bc = cls; 496 struct GST_BlacklistCheck *bc = cls;
490 struct Blacklisters *bl; 497 struct Blacklisters *bl;
491 498
492 bc->task = GNUNET_SCHEDULER_NO_TASK; 499 bc->task = GNUNET_SCHEDULER_NO_TASK;
@@ -504,7 +511,8 @@ do_blacklist_check (void *cls,
504 GNUNET_free (bc); 511 GNUNET_free (bc);
505 return; 512 return;
506 } 513 }
507 if (bl->bc != NULL) 514 if ( (bl->bc != NULL) ||
515 (bl->waiting_for_reply != GNUNET_NO) )
508 return; /* someone else busy with this client */ 516 return; /* someone else busy with this client */
509 bl->bc = bc; 517 bl->bc = bc;
510 bc->th = GNUNET_SERVER_notify_transmit_ready (bl->client, 518 bc->th = GNUNET_SERVER_notify_transmit_ready (bl->client,
@@ -572,9 +580,9 @@ test_connection_ok (void *cls,
572 uint32_t ats_count) 580 uint32_t ats_count)
573{ 581{
574 struct TestConnectionContext *tcc = cls; 582 struct TestConnectionContext *tcc = cls;
575 struct BlacklistCheck *bc; 583 struct GST_BlacklistCheck *bc;
576 584
577 bc = GNUNET_malloc (sizeof (struct BlacklistCheck)); 585 bc = GNUNET_malloc (sizeof (struct GST_BlacklistCheck));
578 GNUNET_CONTAINER_DLL_insert (bc_head, bc_tail, bc); 586 GNUNET_CONTAINER_DLL_insert (bc_head, bc_tail, bc);
579 bc->peer = *neighbour; 587 bc->peer = *neighbour;
580 bc->cont = &confirm_or_drop_neighbour; 588 bc->cont = &confirm_or_drop_neighbour;
@@ -647,7 +655,7 @@ GST_blacklist_handle_reply (void *cls,
647{ 655{
648 const struct BlacklistMessage *msg = (const struct BlacklistMessage*) message; 656 const struct BlacklistMessage *msg = (const struct BlacklistMessage*) message;
649 struct Blacklisters *bl; 657 struct Blacklisters *bl;
650 struct BlacklistCheck *bc; 658 struct GST_BlacklistCheck *bc;
651 659
652 bl = bl_head; 660 bl = bl_head;
653 while ( (bl != NULL) && 661 while ( (bl != NULL) &&
@@ -665,36 +673,42 @@ GST_blacklist_handle_reply (void *cls,
665 } 673 }
666 bc = bl->bc; 674 bc = bl->bc;
667 bl->bc = NULL; 675 bl->bc = NULL;
668 if (ntohl (msg->is_allowed) == GNUNET_SYSERR) 676 bl->waiting_for_reply = GNUNET_NO;
677 if (NULL != bc)
669 { 678 {
679 /* only run this if the blacklist check has not been
680 cancelled in the meantime... */
681 if (ntohl (msg->is_allowed) == GNUNET_SYSERR)
682 {
670#if DEBUG_TRANSPORT 683#if DEBUG_TRANSPORT
671 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 684 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
672 "Blacklist check failed, peer not allowed\n"); 685 "Blacklist check failed, peer not allowed\n");
673#endif 686#endif
674 bc->cont (bc->cont_cls, &bc->peer, GNUNET_NO); 687 bc->cont (bc->cont_cls, &bc->peer, GNUNET_NO);
675 GNUNET_CONTAINER_DLL_remove (bc_head, bc_tail, bc); 688 GNUNET_CONTAINER_DLL_remove (bc_head, bc_tail, bc);
676 GNUNET_free (bc); 689 GNUNET_free (bc);
677 } 690 }
678 else 691 else
679 { 692 {
680#if DEBUG_TRANSPORT 693#if DEBUG_TRANSPORT
681 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 694 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
682 "Blacklist check succeeded, continuing with checks\n"); 695 "Blacklist check succeeded, continuing with checks\n");
683#endif 696#endif
684 bc->bl_pos = bc->bl_pos->next; 697 bc->bl_pos = bc->bl_pos->next;
685 bc->task = GNUNET_SCHEDULER_add_now (&do_blacklist_check, 698 bc->task = GNUNET_SCHEDULER_add_now (&do_blacklist_check,
686 bc); 699 bc);
700 }
687 } 701 }
688 /* check if any other bc's are waiting for this blacklister */ 702 /* check if any other bc's are waiting for this blacklister */
689 bc = bc_head; 703 bc = bc_head;
690 while (bc != NULL) 704 for (bc = bc_head; bc != NULL; bc = bc->next)
691 { 705 if ( (bc->bl_pos == bl) &&
692 if ( (bc->bl_pos == bl) && 706 (GNUNET_SCHEDULER_NO_TASK == bc->task) )
693 (GNUNET_SCHEDULER_NO_TASK == bc->task) ) 707 {
694 bc->task = GNUNET_SCHEDULER_add_now (&do_blacklist_check, 708 bc->task = GNUNET_SCHEDULER_add_now (&do_blacklist_check,
695 bc); 709 bc);
696 bc = bc->next; 710 break;
697 } 711 }
698} 712}
699 713
700 714
@@ -754,14 +768,15 @@ test_blacklisted (void *cls,
754 * @param transport_name name of the transport to test, never NULL 768 * @param transport_name name of the transport to test, never NULL
755 * @param cont function to call with result 769 * @param cont function to call with result
756 * @param cont_cls closure for 'cont' 770 * @param cont_cls closure for 'cont'
771 * @return handle to the blacklist check
757 */ 772 */
758void 773struct GST_BlacklistCheck *
759GST_blacklist_test_allowed (const struct GNUNET_PeerIdentity *peer, 774GST_blacklist_test_allowed (const struct GNUNET_PeerIdentity *peer,
760 const char *transport_name, 775 const char *transport_name,
761 GST_BlacklistTestContinuation cont, 776 GST_BlacklistTestContinuation cont,
762 void *cont_cls) 777 void *cont_cls)
763{ 778{
764 struct BlacklistCheck *bc; 779 struct GST_BlacklistCheck *bc;
765 780
766 if ( (blacklist != NULL) && 781 if ( (blacklist != NULL) &&
767 (GNUNET_SYSERR == 782 (GNUNET_SYSERR ==
@@ -789,7 +804,7 @@ GST_blacklist_test_allowed (const struct GNUNET_PeerIdentity *peer,
789 } 804 }
790 805
791 /* need to query blacklist clients */ 806 /* need to query blacklist clients */
792 bc = GNUNET_malloc (sizeof (struct BlacklistCheck)); 807 bc = GNUNET_malloc (sizeof (struct GST_BlacklistCheck));
793 GNUNET_CONTAINER_DLL_insert (bc_head, bc_tail, bc); 808 GNUNET_CONTAINER_DLL_insert (bc_head, bc_tail, bc);
794 bc->peer = *peer; 809 bc->peer = *peer;
795 bc->cont = cont; 810 bc->cont = cont;
@@ -797,8 +812,39 @@ GST_blacklist_test_allowed (const struct GNUNET_PeerIdentity *peer,
797 bc->bl_pos = bl_head; 812 bc->bl_pos = bl_head;
798 bc->task = GNUNET_SCHEDULER_add_now (&do_blacklist_check, 813 bc->task = GNUNET_SCHEDULER_add_now (&do_blacklist_check,
799 bc); 814 bc);
815 return bc;
800} 816}
801 817
818
819/**
820 * Cancel a blacklist check.
821 *
822 * @param bc check to cancel
823 */
824void
825GST_blacklist_test_cancel (struct GST_BlacklistCheck *bc)
826{
827 GNUNET_CONTAINER_DLL_remove (bc_head, bc_tail, bc);
828 if (bc->bl_pos != NULL)
829 {
830 if (bc->bl_pos->bc == bc)
831 {
832 /* we're at the head of the queue, remove us! */
833 bc->bl_pos->bc = NULL;
834 }
835 }
836 if (GNUNET_SCHEDULER_NO_TASK != bc->task)
837 {
838 GNUNET_SCHEDULER_cancel (bc->task);
839 bc->task = GNUNET_SCHEDULER_NO_TASK;
840 }
841 if (NULL != bc->th)
842 {
843 GNUNET_CONNECTION_notify_transmit_ready_cancel (bc->th);
844 bc->th = NULL;
845 }
846 GNUNET_free (bc);
847}
802 848
803 849
804/* end of file gnunet-service-transport_blacklist.c */ 850/* end of file gnunet-service-transport_blacklist.c */
diff --git a/src/transport/gnunet-service-transport_blacklist.h b/src/transport/gnunet-service-transport_blacklist.h
index 03f059d81..6721b6aa2 100644
--- a/src/transport/gnunet-service-transport_blacklist.h
+++ b/src/transport/gnunet-service-transport_blacklist.h
@@ -80,7 +80,13 @@ GST_blacklist_handle_reply (void *cls,
80void 80void
81GST_blacklist_add_peer (const struct GNUNET_PeerIdentity *peer, 81GST_blacklist_add_peer (const struct GNUNET_PeerIdentity *peer,
82 const char *transport_name); 82 const char *transport_name);
83 83
84
85/**
86 * Handle to an active blacklist check.
87 */
88struct GST_BlacklistCheck;
89
84 90
85/** 91/**
86 * Continuation called from a blacklist test. 92 * Continuation called from a blacklist test.
@@ -102,14 +108,22 @@ typedef void (*GST_BlacklistTestContinuation)(void *cls,
102 * @param transport_name name of the transport to test, never NULL 108 * @param transport_name name of the transport to test, never NULL
103 * @param cont function to call with result 109 * @param cont function to call with result
104 * @param cont_cls closure for 'cont' 110 * @param cont_cls closure for 'cont'
111 * @return handle to the blacklist check
105 */ 112 */
106void 113struct GST_BlacklistCheck *
107GST_blacklist_test_allowed (const struct GNUNET_PeerIdentity *peer, 114GST_blacklist_test_allowed (const struct GNUNET_PeerIdentity *peer,
108 const char *transport_name, 115 const char *transport_name,
109 GST_BlacklistTestContinuation cont, 116 GST_BlacklistTestContinuation cont,
110 void *cont_cls); 117 void *cont_cls);
111 118
112 119
120/**
121 * Cancel a blacklist check.
122 *
123 * @param bc check to cancel
124 */
125void
126GST_blacklist_test_cancel (struct GST_BlacklistCheck *bc);
113 127
114#endif 128#endif
115/* end of file gnunet-service-transport_blacklist.h */ 129/* end of file gnunet-service-transport_blacklist.h */
diff --git a/src/transport/gnunet-service-transport_clients.c b/src/transport/gnunet-service-transport_clients.c
index f03c3a4d3..e73826daf 100644
--- a/src/transport/gnunet-service-transport_clients.c
+++ b/src/transport/gnunet-service-transport_clients.c
@@ -24,6 +24,7 @@
24 * @author Christian Grothoff 24 * @author Christian Grothoff
25 */ 25 */
26#include "platform.h" 26#include "platform.h"
27#include "gnunet-service-transport_blacklist.h"
27#include "gnunet-service-transport_clients.h" 28#include "gnunet-service-transport_clients.h"
28#include "gnunet-service-transport_hello.h" 29#include "gnunet-service-transport_hello.h"
29#include "gnunet-service-transport_neighbours.h" 30#include "gnunet-service-transport_neighbours.h"
@@ -801,6 +802,8 @@ GST_clients_start (struct GNUNET_SERVER_Handle *server)
801 { &clients_handle_address_lookup, NULL, 0}, 802 { &clients_handle_address_lookup, NULL, 0},
802 { &clients_handle_peer_address_lookup, NULL, sizeof (struct PeerAddressLookupMessage)}, 803 { &clients_handle_peer_address_lookup, NULL, sizeof (struct PeerAddressLookupMessage)},
803 { &clients_handle_address_iterate, NULL, sizeof (struct GNUNET_MessageHeader)}, 804 { &clients_handle_address_iterate, NULL, sizeof (struct GNUNET_MessageHeader)},
805 { &GST_blacklist_handle_init, NULL, sizeof (struct GNUNET_MessageHeader)},
806 { &GST_blacklist_handle_reply, NULL, sizeof (struct BlacklistMessage)},
804 {NULL, NULL, 0, 0} 807 {NULL, NULL, 0, 0}
805 }; 808 };
806 GNUNET_SERVER_add_handlers (server, handlers); 809 GNUNET_SERVER_add_handlers (server, handlers);
diff --git a/src/transport/gnunet-service-transport_validation.c b/src/transport/gnunet-service-transport_validation.c
index 50626eaa6..666892e6e 100644
--- a/src/transport/gnunet-service-transport_validation.c
+++ b/src/transport/gnunet-service-transport_validation.c
@@ -178,6 +178,11 @@ struct ValidationEntry
178 const void *addr; 178 const void *addr;
179 179
180 /** 180 /**
181 * Handle to the blacklist check (if we're currently in it).
182 */
183 struct GST_BlacklistCheck *bc;
184
185 /**
181 * Public key of the peer. 186 * Public key of the peer.
182 */ 187 */
183 struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded public_key; 188 struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded public_key;
@@ -483,6 +488,15 @@ cleanup_validation_entry (void *cls,
483{ 488{
484 struct ValidationEntry *ve = value; 489 struct ValidationEntry *ve = value;
485 490
491 if (NULL != ve->bc)
492 {
493 GST_blacklist_test_cancel (ve->bc);
494 ve->bc = NULL;
495 }
496 GNUNET_break (GNUNET_OK ==
497 GNUNET_CONTAINER_multihashmap_remove (validation_map,
498 &va->pid.hashPubKey,
499 va));
486 GNUNET_free (ve->transport_name); 500 GNUNET_free (ve->transport_name);
487 if (GNUNET_SCHEDULER_NO_TASK != ve->timeout_task) 501 if (GNUNET_SCHEDULER_NO_TASK != ve->timeout_task)
488 { 502 {
@@ -528,19 +542,14 @@ static void
528timeout_hello_validation (void *cls, 542timeout_hello_validation (void *cls,
529 const struct GNUNET_SCHEDULER_TaskContext *tc) 543 const struct GNUNET_SCHEDULER_TaskContext *tc)
530{ 544{
531 struct ValidationEntry *va = cls; 545 struct ValidationEntry *ve = cls;
532 546
533 va->timeout_task = GNUNET_SCHEDULER_NO_TASK; 547 ve->timeout_task = GNUNET_SCHEDULER_NO_TASK;
534 GNUNET_STATISTICS_update (GST_stats, 548 GNUNET_STATISTICS_update (GST_stats,
535 gettext_noop ("# address records discarded"), 549 gettext_noop ("# address records discarded"),
536 1, 550 1,
537 GNUNET_NO); 551 GNUNET_NO);
538 GNUNET_break (GNUNET_OK == 552 cleanup_validation_entry (NULL, &ve->pid.hashPubKey, ve);
539 GNUNET_CONTAINER_multihashmap_remove (validation_map,
540 &va->pid.hashPubKey,
541 va));
542 GNUNET_free (va->transport_name);
543 GNUNET_free (va);
544} 553}
545 554
546 555
@@ -772,26 +781,19 @@ struct ValidateAddressContext
772 781
773 782
774/** 783/**
775 * Iterator callback to go over all addresses and try to validate them 784 * Function called with the result from blacklisting.
776 * (unless blocked or already validated). 785 * Send a PING to the other peer if a communication is allowed.
777 * 786 *
778 * @param cls pointer to a 'struct ValidateAddressContext' 787 * @param cls ou r'struct ValidationEntry'
779 * @param tname name of the transport 788 * @param pid identity of the other peer
780 * @param expiration expiration time 789 * @param result GNUNET_OK if the connection is allowed, GNUNET_NO if not
781 * @param addr the address
782 * @param addrlen length of the address
783 * @return GNUNET_OK (keep the address)
784 */ 790 */
785static int 791static void
786validate_address (void *cls, 792transmit_ping_if_allowed (void *cls,
787 const char *tname, 793 const struct GNUNET_PeerIdentity *pid,
788 struct GNUNET_TIME_Absolute expiration, 794 int result)
789 const void *addr,
790 uint16_t addrlen)
791{ 795{
792 const struct ValidateAddressContext *vac = cls; 796 struct ValidationEntry *ve = cls;
793 const struct GNUNET_PeerIdentity *pid = &vac->pid;
794 struct ValidationEntry *ve;
795 struct TransportPingMessage ping; 797 struct TransportPingMessage ping;
796 struct GNUNET_TRANSPORT_PluginFunctions *papi; 798 struct GNUNET_TRANSPORT_PluginFunctions *papi;
797 const struct GNUNET_MessageHeader *hello; 799 const struct GNUNET_MessageHeader *hello;
@@ -800,20 +802,7 @@ validate_address (void *cls,
800 size_t slen; 802 size_t slen;
801 uint16_t hsize; 803 uint16_t hsize;
802 804
803 if (GNUNET_TIME_absolute_get_remaining (expiration).rel_value == 0) 805 ve->bc = NULL;
804 return GNUNET_OK; /* expired */
805 ve = find_validation_entry (&vac->public_key, pid, tname, addr, addrlen);
806 if (GNUNET_TIME_absolute_get_remaining (ve->validation_block).rel_value > 0)
807 return GNUNET_OK; /* blocked */
808 if ( (GNUNET_SCHEDULER_NO_TASK != ve->timeout_task) &&
809 (GNUNET_TIME_absolute_get_remaining (ve->valid_until).rel_value > 0) )
810 return GNUNET_OK; /* revalidation task already scheduled & still valid */
811 ve->validation_block = GNUNET_TIME_relative_to_absolute (HELLO_REVALIDATION_START_TIME);
812 if (GNUNET_SCHEDULER_NO_TASK != ve->timeout_task)
813 GNUNET_SCHEDULER_cancel (ve->timeout_task);
814 ve->timeout_task = GNUNET_SCHEDULER_add_delayed (HELLO_REVALIDATION_START_TIME,
815 &timeout_hello_validation,
816 ve);
817 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 806 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
818 "Transmitting plain PING to `%s'\n", 807 "Transmitting plain PING to `%s'\n",
819 GNUNET_i2s (pid)); 808 GNUNET_i2s (pid));
@@ -872,6 +861,49 @@ validate_address (void *cls,
872 1, 861 1,
873 GNUNET_NO); 862 GNUNET_NO);
874 } 863 }
864}
865
866
867/**
868 * Iterator callback to go over all addresses and try to validate them
869 * (unless blocked or already validated).
870 *
871 * @param cls pointer to a 'struct ValidateAddressContext'
872 * @param tname name of the transport
873 * @param expiration expiration time
874 * @param addr the address
875 * @param addrlen length of the address
876 * @return GNUNET_OK (keep the address)
877 */
878static int
879validate_address (void *cls,
880 const char *tname,
881 struct GNUNET_TIME_Absolute expiration,
882 const void *addr,
883 uint16_t addrlen)
884{
885 const struct ValidateAddressContext *vac = cls;
886 const struct GNUNET_PeerIdentity *pid = &vac->pid;
887 struct ValidationEntry *ve;
888
889 if (GNUNET_TIME_absolute_get_remaining (expiration).rel_value == 0)
890 return GNUNET_OK; /* expired */
891 ve = find_validation_entry (&vac->public_key, pid, tname, addr, addrlen);
892 if (GNUNET_TIME_absolute_get_remaining (ve->validation_block).rel_value > 0)
893 return GNUNET_OK; /* blocked */
894 if ( (GNUNET_SCHEDULER_NO_TASK != ve->timeout_task) &&
895 (GNUNET_TIME_absolute_get_remaining (ve->valid_until).rel_value > 0) )
896 return GNUNET_OK; /* revalidation task already scheduled & still valid */
897 ve->validation_block = GNUNET_TIME_relative_to_absolute (HELLO_REVALIDATION_START_TIME);
898 if (GNUNET_SCHEDULER_NO_TASK != ve->timeout_task)
899 GNUNET_SCHEDULER_cancel (ve->timeout_task);
900 ve->timeout_task = GNUNET_SCHEDULER_add_delayed (HELLO_REVALIDATION_START_TIME,
901 &timeout_hello_validation,
902 ve);
903 ve->bc = GST_blacklist_test_allowed (pid,
904 tname,
905 &transmit_ping_if_allowed,
906 ve);
875 return GNUNET_OK; 907 return GNUNET_OK;
876} 908}
877 909