From 8d70c6db692b3119ff140bbf0d7cd39263b56fa8 Mon Sep 17 00:00:00 2001 From: "Nathan S. Evans" Date: Sun, 5 Sep 2010 10:04:49 +0000 Subject: [PATCH] allow transport api to send multiple request connect messages --- src/transport/gnunet-nat-server.c | 6 ++-- src/transport/gnunet-service-transport.c | 10 +++--- src/transport/transport_api.c | 45 ++++++++++++++++++------ 3 files changed, 43 insertions(+), 18 deletions(-) diff --git a/src/transport/gnunet-nat-server.c b/src/transport/gnunet-nat-server.c index 0743c92df..ab99b5f28 100644 --- a/src/transport/gnunet-nat-server.c +++ b/src/transport/gnunet-nat-server.c @@ -582,8 +582,8 @@ main (int argc, if (1 != inet_pton (AF_INET, argv[1], &external)) { fprintf (stderr, - "Error parsing IPv4 address: %s\n", - strerror (errno)); + "Error parsing IPv4 address: %s\n", + strerror (errno)); return 1; } if (1 != inet_pton (AF_INET, DUMMY_IP, &dummy)) @@ -634,7 +634,7 @@ main (int argc, if (1 == getppid()) /* Check the parent process id, if 1 the parent has died, so we should die too */ break; if (FD_ISSET (icmpsock, &rs)) - process_icmp_response (); + process_icmp_response (); if (0 == (++alt % 2)) send_icmp_echo (&external); else diff --git a/src/transport/gnunet-service-transport.c b/src/transport/gnunet-service-transport.c index 8423d9cf5..d49c246f0 100644 --- a/src/transport/gnunet-service-transport.c +++ b/src/transport/gnunet-service-transport.c @@ -2782,7 +2782,7 @@ setup_new_neighbour (const struct GNUNET_PeerIdentity *peer, if (do_hello) { GNUNET_STATISTICS_update (stats, - gettext_noop ("# peerinfo iterate requests"), + gettext_noop ("# peerinfo new neighbor iterate requests"), 1, GNUNET_NO); GNUNET_STATISTICS_update (stats, @@ -4124,7 +4124,7 @@ process_hello (struct TransportPlugin *plugin, const struct GNUNET_HELLO_Message *hello; struct CheckHelloValidatedContext *chvc; struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded publicKey; -#if DEBUG_TRANSPORT_HELLO +#if DEBUG_TRANSPORT_HELLO > 2 char *my_id; #endif hsize = ntohs (message->size); @@ -4196,7 +4196,7 @@ process_hello (struct TransportPlugin *plugin, chvc->hello, GNUNET_TIME_absolute_get ()).value > 0) { -#if DEBUG_TRANSPORT_HELLO +#if DEBUG_TRANSPORT_HELLO > 2 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received duplicate `%s' message for `%4s'; ignored\n", "HELLO", @@ -4209,7 +4209,7 @@ process_hello (struct TransportPlugin *plugin, GNUNET_HELLO_size(hello))); chvc = chvc->next; } -#if DEBUG_TRANSPORT_HELLO +#if DEBUG_TRANSPORT_HELLO > 2 if (plugin != NULL) { my_id = GNUNET_strdup(GNUNET_i2s(plugin->env.my_identity)); @@ -4233,7 +4233,7 @@ process_hello (struct TransportPlugin *plugin, /* finally, check if HELLO was previously validated (continuation will then schedule actual validation) */ GNUNET_STATISTICS_update (stats, - gettext_noop ("# peerinfo iterate requests"), + gettext_noop ("# peerinfo process hello iterate requests"), 1, GNUNET_NO); GNUNET_STATISTICS_update (stats, diff --git a/src/transport/transport_api.c b/src/transport/transport_api.c index 4809981f5..093c00bef 100644 --- a/src/transport/transport_api.c +++ b/src/transport/transport_api.c @@ -1288,6 +1288,28 @@ send_transport_request_connect (void *cls, size_t size, void *buf) return sizeof(struct TransportRequestConnectMessage); } +/** + * Create and send a request connect message to + * the transport service for a particular peer. + * + * @param h handle to the transport service + * @param n the neighbor to send the request connect message about + * + */ +static void send_request_connect_message(struct GNUNET_TRANSPORT_Handle *h, struct NeighbourList *n) +{ + struct TransportRequestConnectMessage *trcm; + + trcm = GNUNET_malloc(sizeof(struct TransportRequestConnectMessage)); + trcm->header.type = htons(GNUNET_MESSAGE_TYPE_TRANSPORT_REQUEST_CONNECT); + trcm->header.size = htons(sizeof(struct TransportRequestConnectMessage)); + memcpy(&trcm->peer, &n->id, sizeof(struct GNUNET_PeerIdentity)); + schedule_control_transmit (h, + sizeof (struct TransportRequestConnectMessage), + GNUNET_NO, + GNUNET_TIME_UNIT_FOREVER_REL, &send_transport_request_connect, trcm); +} + /** * Add neighbour to our list * @@ -1298,7 +1320,6 @@ neighbour_add (struct GNUNET_TRANSPORT_Handle *h, const struct GNUNET_PeerIdentity *pid) { struct NeighbourList *n; - struct TransportRequestConnectMessage *trcm; if (GNUNET_YES == h->in_disconnect) return NULL; @@ -1322,14 +1343,7 @@ neighbour_add (struct GNUNET_TRANSPORT_Handle *h, n->h = h; h->neighbours = n; - trcm = GNUNET_malloc(sizeof(struct TransportRequestConnectMessage)); - trcm->header.type = htons(GNUNET_MESSAGE_TYPE_TRANSPORT_REQUEST_CONNECT); - trcm->header.size = htons(sizeof(struct TransportRequestConnectMessage)); - memcpy(&trcm->peer, pid, sizeof(struct GNUNET_PeerIdentity)); - schedule_control_transmit (h, - sizeof (struct TransportRequestConnectMessage), - GNUNET_NO, - GNUNET_TIME_UNIT_FOREVER_REL, &send_transport_request_connect, trcm); + return n; } @@ -1796,6 +1810,17 @@ GNUNET_TRANSPORT_notify_transmit_ready (struct GNUNET_TRANSPORT_Handle n = neighbour_add (handle, target); } + + /** + * Send a request connect message if not connected, + * otherwise we will never send anything to + * transport service + */ + if (n->is_connected == GNUNET_NO) + { + send_request_connect_message(handle, n); + } + if (n == NULL) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -1830,7 +1855,7 @@ GNUNET_TRANSPORT_notify_transmit_ready (struct GNUNET_TRANSPORT_Handle th->priority = priority; th->notify_delay_task = GNUNET_SCHEDULER_add_delayed (handle->sched, timeout, - &peer_transmit_timeout, th); + &peer_transmit_timeout, th); schedule_transmission (handle); return th; } -- 2.25.1