From b05f920bfa907476b618a24bd78487db8873d2a1 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 21 Jul 2010 20:48:40 +0000 Subject: [PATCH] add code to enable checking if transport's idea of our peer identity matches that of core, etc -- might help diagnose certain bugs --- TODO | 24 ++++++------ src/core/gnunet-service-core.c | 1 + src/core/test_core_api.c | 2 +- src/core/test_core_api_reliability.c | 2 +- src/dht/gnunet-service-dht.c | 3 +- src/hostlist/hostlist-client.c | 2 +- src/hostlist/test_gnunet_daemon_hostlist.c | 2 +- src/include/gnunet_transport_service.h | 6 ++- src/testing/testing.c | 12 ++++-- src/topology/gnunet-daemon-topology.c | 1 + src/transport/gnunet-service-transport.c | 15 +++++++- src/transport/test_transport_api.c | 2 +- .../test_transport_api_reliability.c | 2 +- src/transport/transport.h | 27 +++++++++++++ src/transport/transport_api.c | 38 +++++++++++++++---- 15 files changed, 107 insertions(+), 32 deletions(-) diff --git a/TODO b/TODO index 747548f23..4511ae209 100644 --- a/TODO +++ b/TODO @@ -22,15 +22,6 @@ * DHT: [Nate] - implement DHT service - implement performance tests -* FS: [CG] - - service: - + trust: do not charge when "idle" / load considerations (migration, routing) - + artificial delays - + active reply route caching design & implementation; gap extension! - - non-anonymous FS service (needs DHT) - + DHT integration for search - + CS-DHT-functions (DHT-put of LOC) - + P2P-functions (DHT-get) * GNUNET-GTK: [CG] - implement publish dialog details: + open (import directory structure) @@ -92,9 +83,18 @@ - datacache - datastore * FS: [CG] - - reconstruct IBLOCKS from DBLOCKS if possible (during download; see FIXME in fs_download) - - add support for pushing "already seen" search results to FS service for bloomfilter (can wait) - - use different 'priority' for probe downloads vs. normal downloads + - library: + + reconstruct IBLOCKS from DBLOCKS if possible (during download; see FIXME in fs_download) + + add support for pushing "already seen" search results to FS service for bloomfilter (can wait) + + use different 'priority' for probe downloads vs. normal downloads + - service: + + trust: do not charge when "idle" / load considerations (migration, routing) + + artificial delays + + active reply route caching design & implementation; gap extension! + - non-anonymous FS service (needs DHT) + + DHT integration for search + + CS-DHT-functions (DHT-put of LOC) + + P2P-functions (DHT-get) - implement FS performance tests + insert + download diff --git a/src/core/gnunet-service-core.c b/src/core/gnunet-service-core.c index df3342ce0..2ad197e58 100644 --- a/src/core/gnunet-service-core.c +++ b/src/core/gnunet-service-core.c @@ -3878,6 +3878,7 @@ run (void *cls, /* setup transport connection */ transport = GNUNET_TRANSPORT_connect (sched, cfg, + &my_identity, NULL, &handle_transport_receive, &handle_transport_notify_connect, diff --git a/src/core/test_core_api.c b/src/core/test_core_api.c index ad82d0a1d..b04430eea 100644 --- a/src/core/test_core_api.c +++ b/src/core/test_core_api.c @@ -297,7 +297,7 @@ setup_peer (struct PeerContext *p, const char *cfgname) "-c", cfgname, NULL); #endif GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_load (p->cfg, cfgname)); - p->th = GNUNET_TRANSPORT_connect (sched, p->cfg, p, NULL, NULL, NULL); + p->th = GNUNET_TRANSPORT_connect (sched, p->cfg, NULL, p, NULL, NULL, NULL); GNUNET_assert (p->th != NULL); GNUNET_TRANSPORT_get_hello (p->th, &process_hello, p); } diff --git a/src/core/test_core_api_reliability.c b/src/core/test_core_api_reliability.c index e8e1ad0f6..b9fba21c6 100644 --- a/src/core/test_core_api_reliability.c +++ b/src/core/test_core_api_reliability.c @@ -444,7 +444,7 @@ setup_peer (struct PeerContext *p, const char *cfgname) "-c", cfgname, NULL); #endif GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_load (p->cfg, cfgname)); - p->th = GNUNET_TRANSPORT_connect (sched, p->cfg, p, NULL, NULL, NULL); + p->th = GNUNET_TRANSPORT_connect (sched, p->cfg, NULL, p, NULL, NULL, NULL); GNUNET_assert (p->th != NULL); GNUNET_TRANSPORT_get_hello (p->th, &process_hello, p); } diff --git a/src/dht/gnunet-service-dht.c b/src/dht/gnunet-service-dht.c index 9cd4c2909..31ceff773 100644 --- a/src/dht/gnunet-service-dht.c +++ b/src/dht/gnunet-service-dht.c @@ -2445,7 +2445,8 @@ run (void *cls, if (coreAPI == NULL) return; - transport_handle = GNUNET_TRANSPORT_connect(sched, cfg, NULL, NULL, NULL, NULL); + transport_handle = GNUNET_TRANSPORT_connect(sched, cfg, + NULL, NULL, NULL, NULL, NULL); if (transport_handle != NULL) GNUNET_TRANSPORT_get_hello (transport_handle, &process_hello, NULL); else diff --git a/src/hostlist/hostlist-client.c b/src/hostlist/hostlist-client.c index 26b68390c..b4d86e052 100644 --- a/src/hostlist/hostlist-client.c +++ b/src/hostlist/hostlist-client.c @@ -1528,7 +1528,7 @@ GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c, GNUNET_break (0); return GNUNET_SYSERR; } - transport = GNUNET_TRANSPORT_connect (s, c, NULL, NULL, NULL, NULL); + transport = GNUNET_TRANSPORT_connect (s, c, NULL, NULL, NULL, NULL, NULL); if (NULL == transport) { curl_global_cleanup (); diff --git a/src/hostlist/test_gnunet_daemon_hostlist.c b/src/hostlist/test_gnunet_daemon_hostlist.c index 85138ebf1..899a2eb44 100644 --- a/src/hostlist/test_gnunet_daemon_hostlist.c +++ b/src/hostlist/test_gnunet_daemon_hostlist.c @@ -143,7 +143,7 @@ setup_peer (struct PeerContext *p, const char *cfgname) "-c", cfgname, NULL); #endif GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_load (p->cfg, cfgname)); - p->th = GNUNET_TRANSPORT_connect (sched, p->cfg, p, NULL, + p->th = GNUNET_TRANSPORT_connect (sched, p->cfg, NULL, p, NULL, ¬ify_connect, NULL); GNUNET_assert (p->th != NULL); GNUNET_TRANSPORT_get_hello (p->th, &process_hello, p); diff --git a/src/include/gnunet_transport_service.h b/src/include/gnunet_transport_service.h index 7cb4df5a6..2ee9fb718 100644 --- a/src/include/gnunet_transport_service.h +++ b/src/include/gnunet_transport_service.h @@ -120,6 +120,8 @@ typedef void * * @param sched scheduler to use * @param cfg configuration to use + * @param self our own identity (API should check that it matches + * the identity found by transport), or NULL (no check) * @param cls closure for the callbacks * @param rec receive function to call * @param nc function to call on connect events @@ -131,7 +133,9 @@ struct GNUNET_TRANSPORT_Handle *GNUNET_TRANSPORT_connect (struct *sched, const struct GNUNET_CONFIGURATION_Handle - *cfg, void *cls, + *cfg, + const struct GNUNET_PeerIdentity *self, + void *cls, GNUNET_TRANSPORT_ReceiveCallback rec, GNUNET_TRANSPORT_NotifyConnect diff --git a/src/testing/testing.c b/src/testing/testing.c index d12892fcc..3bc6c98da 100644 --- a/src/testing/testing.c +++ b/src/testing/testing.c @@ -161,7 +161,9 @@ testing_init (void *cls, d->th = GNUNET_TRANSPORT_connect (d->sched, - d->cfg, d, NULL, NULL, NULL); + d->cfg, + &d->id, + d, NULL, NULL, NULL); if (d->th == NULL) { if (GNUNET_YES == d->dead) @@ -1402,7 +1404,9 @@ GNUNET_TESTING_daemons_connect (struct GNUNET_TESTING_Daemon *d1, #endif ctx->d2th = GNUNET_TRANSPORT_connect (d2->sched, - d2->cfg, d2, NULL, NULL, NULL); + d2->cfg, + &d2->id, + d2, NULL, NULL, NULL); if (ctx->d2th == NULL) { GNUNET_CORE_disconnect(ctx->d1core); @@ -1455,7 +1459,9 @@ reattempt_daemons_connect (void *cls, const struct GNUNET_SCHEDULER_TaskContext } ctx->d2th = GNUNET_TRANSPORT_connect (ctx->d2->sched, - ctx->d2->cfg, ctx->d2, NULL, NULL, NULL); + ctx->d2->cfg, + &ctx->d2->id, + ctx->d2, NULL, NULL, NULL); if (ctx->d2th == NULL) { GNUNET_CORE_disconnect(ctx->d1core); diff --git a/src/topology/gnunet-daemon-topology.c b/src/topology/gnunet-daemon-topology.c index d39c89d36..3686f2018 100644 --- a/src/topology/gnunet-daemon-topology.c +++ b/src/topology/gnunet-daemon-topology.c @@ -1395,6 +1395,7 @@ run (void *cls, NULL, NULL, NULL, + NULL, NULL); handle = GNUNET_CORE_connect (sched, cfg, diff --git a/src/transport/gnunet-service-transport.c b/src/transport/gnunet-service-transport.c index 0d33ac5ca..c1dc60fd0 100644 --- a/src/transport/gnunet-service-transport.c +++ b/src/transport/gnunet-service-transport.c @@ -4673,10 +4673,12 @@ handle_start (void *cls, struct GNUNET_SERVER_Client *client, const struct GNUNET_MessageHeader *message) { + const struct StartMessage *start; struct TransportClient *c; struct ConnectInfoMessage cim; struct NeighbourList *n; + start = (const struct StartMessage*) message; #if DEBUG_TRANSPORT GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' request from client\n", "START"); @@ -4693,6 +4695,17 @@ handle_start (void *cls, } c = c->next; } + if ( (GNUNET_NO != ntohl (start->do_check)) && + (0 != memcmp (&start->self, + &my_identity, + sizeof (struct GNUNET_PeerIdentity))) ) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Rejecting control connection from peer `%s', which is not me!\n"), + GNUNET_i2s (&start->self)); + GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + return; + } c = GNUNET_malloc (sizeof (struct TransportClient)); c->next = clients; clients = c; @@ -5239,7 +5252,7 @@ run (void *cls, { static const struct GNUNET_SERVER_MessageHandler handlers[] = { {&handle_start, NULL, - GNUNET_MESSAGE_TYPE_TRANSPORT_START, 0}, + GNUNET_MESSAGE_TYPE_TRANSPORT_START, sizeof (struct StartMessage)}, {&handle_hello, NULL, GNUNET_MESSAGE_TYPE_HELLO, 0}, {&handle_send, NULL, diff --git a/src/transport/test_transport_api.c b/src/transport/test_transport_api.c index 52b9282de..7aa81bff8 100644 --- a/src/transport/test_transport_api.c +++ b/src/transport/test_transport_api.c @@ -220,7 +220,7 @@ setup_peer (struct PeerContext *p, const char *cfgname) GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_load (p->cfg, cfgname)); p->th = GNUNET_TRANSPORT_connect (sched, p->cfg, - p, + NULL, p, ¬ify_receive, ¬ify_connect, ¬ify_disconnect); GNUNET_assert (p->th != NULL); diff --git a/src/transport/test_transport_api_reliability.c b/src/transport/test_transport_api_reliability.c index dc4867f84..c86b582b9 100644 --- a/src/transport/test_transport_api_reliability.c +++ b/src/transport/test_transport_api_reliability.c @@ -366,7 +366,7 @@ setup_peer (struct PeerContext *p, const char *cfgname) "-c", cfgname, NULL); #endif GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_load (p->cfg, cfgname)); - p->th = GNUNET_TRANSPORT_connect (sched, p->cfg, + p->th = GNUNET_TRANSPORT_connect (sched, p->cfg, NULL, p, ¬ify_receive, ¬ify_connect, diff --git a/src/transport/transport.h b/src/transport/transport.h index 0f2d5c6c9..aa934c944 100644 --- a/src/transport/transport.h +++ b/src/transport/transport.h @@ -46,6 +46,33 @@ */ #define MIN_QUOTA_REFRESH_TIME 2000 +/** + * Message from the transport service to the library + * asking to check if both processes agree about this + * peers identity. + */ +struct StartMessage +{ + + /** + * Type will be GNUNET_MESSAGE_TYPE_TRANSPORT_START + */ + struct GNUNET_MessageHeader header; + + /** + * Should the 'self' field be checked? + */ + uint32_t do_check; + + /** + * Identity we think we have. If it does not match, the + * receiver should print out an error message and disconnect. + */ + struct GNUNET_PeerIdentity self; + +}; + + /** * Message from the transport service to the library * informing about neighbors. diff --git a/src/transport/transport_api.c b/src/transport/transport_api.c index eb8868d98..db96d1800 100644 --- a/src/transport/transport_api.c +++ b/src/transport/transport_api.c @@ -278,7 +278,7 @@ struct GNUNET_TRANSPORT_Handle /** * Closure for the callbacks. */ - void *cls; + void *cls; /** * Function to call for received data. @@ -341,6 +341,11 @@ struct GNUNET_TRANSPORT_Handle */ struct NeighbourList *neighbours; + /** + * Peer identity as assumed by this process, or all zeros. + */ + struct GNUNET_PeerIdentity self; + /** * ID of the task trying to reconnect to the service. */ @@ -363,6 +368,11 @@ struct GNUNET_TRANSPORT_Handle */ int in_disconnect; + /** + * Should we check that 'self' matches what the service thinks? + * (if GNUNET_NO, then 'self' is all zeros!). + */ + int check_self; }; @@ -1038,7 +1048,8 @@ GNUNET_TRANSPORT_offer_hello (struct GNUNET_TRANSPORT_Handle *handle, static size_t send_start (void *cls, size_t size, void *buf) { - struct GNUNET_MessageHeader *s = buf; + struct GNUNET_TRANSPORT_Handle *h = cls; + struct StartMessage s; if (buf == NULL) { @@ -1054,10 +1065,13 @@ send_start (void *cls, size_t size, void *buf) GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmitting `%s' request.\n", "START"); #endif - GNUNET_assert (size >= sizeof (struct GNUNET_MessageHeader)); - s->size = htons (sizeof (struct GNUNET_MessageHeader)); - s->type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_START); - return sizeof (struct GNUNET_MessageHeader); + GNUNET_assert (size >= sizeof (struct StartMessage)); + s.header.size = htons (sizeof (struct StartMessage)); + s.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_START); + s.do_check = htonl (h->check_self); + s.self = h->self; + memcpy (buf, &s, sizeof (struct StartMessage)); + return sizeof (struct StartMessage); } @@ -1192,9 +1206,9 @@ reconnect (void *cls, pos = pos->next; } schedule_control_transmit (h, - sizeof (struct GNUNET_MessageHeader), + sizeof (struct StartMessage), GNUNET_YES, - GNUNET_TIME_UNIT_FOREVER_REL, &send_start, NULL); + GNUNET_TIME_UNIT_FOREVER_REL, &send_start, h); GNUNET_CLIENT_receive (h->client, &demultiplexer, h, GNUNET_TIME_UNIT_FOREVER_REL); } @@ -1274,6 +1288,8 @@ neighbour_add (struct GNUNET_TRANSPORT_Handle *h, * * @param sched scheduler to use * @param cfg configuration to use + * @param self our own identity (API should check that it matches + * the identity found by transport), or NULL (no check) * @param cls closure for the callbacks * @param rec receive function to call * @param nc function to call on connect events @@ -1282,6 +1298,7 @@ neighbour_add (struct GNUNET_TRANSPORT_Handle *h, struct GNUNET_TRANSPORT_Handle * GNUNET_TRANSPORT_connect (struct GNUNET_SCHEDULER_Handle *sched, const struct GNUNET_CONFIGURATION_Handle *cfg, + const struct GNUNET_PeerIdentity *self, void *cls, GNUNET_TRANSPORT_ReceiveCallback rec, GNUNET_TRANSPORT_NotifyConnect nc, @@ -1290,6 +1307,11 @@ GNUNET_TRANSPORT_connect (struct GNUNET_SCHEDULER_Handle *sched, struct GNUNET_TRANSPORT_Handle *ret; ret = GNUNET_malloc (sizeof (struct GNUNET_TRANSPORT_Handle)); + if (self != NULL) + { + ret->self = *self; + ret->check_self = GNUNET_YES; + } ret->sched = sched; ret->cfg = cfg; ret->cls = cls; -- 2.25.1