diff options
author | Christian Grothoff <christian@grothoff.org> | 2011-08-14 14:26:33 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2011-08-14 14:26:33 +0000 |
commit | ce440f071e48bbc75ff797f8a37662996c4af57a (patch) | |
tree | 4152ae6505e4eae8ce88b72eecb7b59197b01cfe /src | |
parent | a2ed50e8e82e1d4f60302c30f9d748f7698b7cec (diff) | |
download | gnunet-ce440f071e48bbc75ff797f8a37662996c4af57a.tar.gz gnunet-ce440f071e48bbc75ff797f8a37662996c4af57a.zip |
LRN: Fix deps in transport
Diffstat (limited to 'src')
-rw-r--r-- | src/transport/Makefile.am | 7 | ||||
-rw-r--r-- | src/transport/gnunet-service-transport-new.c | 3 | ||||
-rw-r--r-- | src/transport/gnunet-service-transport_blacklist.c | 128 | ||||
-rw-r--r-- | src/transport/gnunet-service-transport_blacklist.h | 18 | ||||
-rw-r--r-- | src/transport/gnunet-service-transport_clients.c | 3 | ||||
-rw-r--r-- | src/transport/gnunet-service-transport_validation.c | 110 |
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 | ||
72 | libgnunettransporttesting_la_SOURCES = \ | 72 | libgnunettransporttesting_la_SOURCES = \ |
73 | transport-testing.c | 73 | transport-testing.c |
74 | libgnunettransporttesting_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) | ||
79 | libgnunettransporttesting_la_DEPENDS = \ | ||
80 | libgnunettransport.la | ||
74 | 81 | ||
75 | libgnunettransport_la_SOURCES = \ | 82 | libgnunettransport_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 | */ |
42 | struct BlacklistCheck; | 42 | struct 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 | */ |
78 | struct BlacklistCheck | 84 | struct 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 | */ |
128 | static struct BlacklistCheck *bc_head; | 134 | static 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 | */ |
133 | static struct BlacklistCheck *bc_tail; | 139 | static 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 | */ |
485 | static void | 492 | static void |
486 | do_blacklist_check (void *cls, | 493 | do_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 | */ |
758 | void | 773 | struct GST_BlacklistCheck * |
759 | GST_blacklist_test_allowed (const struct GNUNET_PeerIdentity *peer, | 774 | GST_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 | */ | ||
824 | void | ||
825 | GST_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, | |||
80 | void | 80 | void |
81 | GST_blacklist_add_peer (const struct GNUNET_PeerIdentity *peer, | 81 | GST_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 | */ | ||
88 | struct 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 | */ |
106 | void | 113 | struct GST_BlacklistCheck * |
107 | GST_blacklist_test_allowed (const struct GNUNET_PeerIdentity *peer, | 114 | GST_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 | */ | ||
125 | void | ||
126 | GST_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 | |||
528 | timeout_hello_validation (void *cls, | 542 | timeout_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 | */ |
785 | static int | 791 | static void |
786 | validate_address (void *cls, | 792 | transmit_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 | */ | ||
878 | static int | ||
879 | validate_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 | ||