From 1d436d8516c2968ce4f36e2f15859075be58f779 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Fri, 18 Mar 2011 16:41:57 +0000 Subject: unix domains sockets are now preferred --- src/transport/gnunet-service-transport.c | 70 ++++++++++++++++++----- src/transport/test_transport_api_multi_peer1.conf | 5 +- src/transport/test_transport_api_multi_peer2.conf | 4 +- src/transport/test_transport_ats.c | 1 - src/transport/test_transport_ats_peer1.conf | 5 +- src/transport/test_transport_ats_peer2.conf | 5 +- src/transport/transport.h | 21 +++++++ 7 files changed, 91 insertions(+), 20 deletions(-) diff --git a/src/transport/gnunet-service-transport.c b/src/transport/gnunet-service-transport.c index e55fc41ac..1a5d0af4b 100644 --- a/src/transport/gnunet-service-transport.c +++ b/src/transport/gnunet-service-transport.c @@ -929,7 +929,7 @@ static void disconnect_neighbour (struct NeighbourList *n, int check); * * @param neighbour target peer for which to transmit */ -static void try_transmission_to_peer (struct NeighbourList *neighbour); +static void try_transmission_to_peer (struct NeighbourList *n); struct ATS_info * ats_init (); @@ -947,6 +947,9 @@ void ats_notify_ats_data (struct ATS_info * ats, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_TRANSPORT_ATS_Information *ats_data); +struct ForeignAddressList * ats_get_preferred_address (struct ATS_info * ats, + struct NeighbourList *n); + /** * Find an entry in the neighbour list for a particular peer. * @@ -1525,6 +1528,9 @@ find_ready_address(struct NeighbourList *neighbour) struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get (); struct ForeignAddressList *best_address; + /* Hack to prefer unix domain sockets */ + struct ForeignAddressList *unix_address = NULL; + best_address = NULL; while (head != NULL) { @@ -1566,6 +1572,12 @@ find_ready_address(struct NeighbourList *neighbour) (unsigned long long) addresses->timeout.abs_value, (unsigned int) addresses->distance); #endif + if (0==strcmp(head->plugin->short_name,"unix")) + { + if ((unix_address == NULL) || ((unix_address != NULL) && + (addresses->latency.rel_value < unix_address->latency.rel_value))) + unix_address = addresses; + } if ( ( (best_address == NULL) || (addresses->connected == GNUNET_YES) || (best_address->connected == GNUNET_NO) ) && @@ -1577,12 +1589,22 @@ find_ready_address(struct NeighbourList *neighbour) connected a chance some times... */ addresses = addresses->next; } + if (unix_address != NULL) + break; head = head->next; } + if (unix_address != NULL) + { + best_address = unix_address; +#if DEBUG_TRANSPORT + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Found unix address, forced this address\n"); +#endif + } if (best_address != NULL) { #if DEBUG_TRANSPORT - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Best address found (`%s') has latency of %llu ms.\n", (best_address->addrlen > 0) ? a2s (best_address->ready_list->plugin->short_name, @@ -1599,6 +1621,7 @@ find_ready_address(struct NeighbourList *neighbour) 1, GNUNET_NO); } + return best_address; } @@ -1626,7 +1649,7 @@ retry_transmission_task (void *cls, * @param neighbour target peer for which to transmit */ static void -try_transmission_to_peer (struct NeighbourList *neighbour) +try_transmission_to_peer (struct NeighbourList *n) { struct ReadyList *rl; struct MessageQueue *mq; @@ -1634,7 +1657,7 @@ try_transmission_to_peer (struct NeighbourList *neighbour) ssize_t ret; int force_address; - if (neighbour->messages_head == NULL) + if (n->messages_head == NULL) { #if DEBUG_TRANSPORT GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -1644,12 +1667,12 @@ try_transmission_to_peer (struct NeighbourList *neighbour) return; /* nothing to do */ } rl = NULL; - mq = neighbour->messages_head; + mq = n->messages_head; force_address = GNUNET_YES; if (mq->specific_address == NULL) { /* TODO: ADD ATS */ - mq->specific_address = find_ready_address(neighbour); + mq->specific_address = ats_get_preferred_address(ats, n); GNUNET_STATISTICS_update (stats, gettext_noop ("# transport selected peer address freely"), 1, @@ -1680,9 +1703,9 @@ try_transmission_to_peer (struct NeighbourList *neighbour) mq->message_buf_size, GNUNET_NO); if (mq->client != NULL) - transmit_send_ok (mq->client, neighbour, &neighbour->id, GNUNET_NO); - GNUNET_CONTAINER_DLL_remove (neighbour->messages_head, - neighbour->messages_tail, + transmit_send_ok (mq->client, n, &n->id, GNUNET_NO); + GNUNET_CONTAINER_DLL_remove (n->messages_head, + n->messages_tail, mq); GNUNET_free (mq); return; /* nobody ready */ @@ -1691,11 +1714,11 @@ try_transmission_to_peer (struct NeighbourList *neighbour) gettext_noop ("# message delivery deferred (no address)"), 1, GNUNET_NO); - if (neighbour->retry_task != GNUNET_SCHEDULER_NO_TASK) - GNUNET_SCHEDULER_cancel (neighbour->retry_task); - neighbour->retry_task = GNUNET_SCHEDULER_add_delayed (timeout, + if (n->retry_task != GNUNET_SCHEDULER_NO_TASK) + GNUNET_SCHEDULER_cancel (n->retry_task); + n->retry_task = GNUNET_SCHEDULER_add_delayed (timeout, &retry_transmission_task, - neighbour); + n); #if DEBUG_TRANSPORT GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "No validated destination address available to transmit message of size %u to peer `%4s', will wait %llums to find an address.\n", @@ -1707,8 +1730,8 @@ try_transmission_to_peer (struct NeighbourList *neighbour) (unless that's already pending...) */ return; } - GNUNET_CONTAINER_DLL_remove (neighbour->messages_head, - neighbour->messages_tail, + GNUNET_CONTAINER_DLL_remove (n->messages_head, + n->messages_tail, mq); if (mq->specific_address->connected == GNUNET_NO) mq->specific_address->connect_attempts++; @@ -5675,6 +5698,23 @@ void ats_notify_ats_data (struct ATS_info * ats, ats_calculate_bandwidth_distribution(ats); } +struct ForeignAddressList * ats_get_preferred_address (struct ATS_info * ats, + struct NeighbourList *n) +{ +#if DEBUG_ATS + GNUNET_log (GNUNET_ERROR_TYPE_BULK, "ats_get_prefered_transport for peer: %s\n",GNUNET_i2s(&n->id)); +#endif + struct ReadyList *next = n->plugins; + while (next != NULL) + { +#if DEBUG_ATS + GNUNET_log (GNUNET_ERROR_TYPE_BULK, "plugin: %s %i\n",next->plugin->short_name,strcmp(next->plugin->short_name,"unix")); +#endif + next = next->next; + } + return find_ready_address(n); +} + /** * Initiate transport service. * diff --git a/src/transport/test_transport_api_multi_peer1.conf b/src/transport/test_transport_api_multi_peer1.conf index 0f0977277..2e95a5bd8 100644 --- a/src/transport/test_transport_api_multi_peer1.conf +++ b/src/transport/test_transport_api_multi_peer1.conf @@ -27,6 +27,9 @@ USE_IPv4 = YES #BINDTO4 = 127.0.0.1 #BINDTO6 = ::1 +[transport-unix] +PORT = 30004 + [fs] AUTOSTART = NO @@ -56,7 +59,7 @@ FRIENDS-ONLY = NO MINIMUM-FRIENDS = 0 [transport] -PLUGINS = tcp udp http +PLUGINS = tcp udp http unix #DEBUG = YES #PREFIX = xterm -T transport2 -e gdb --command=cmd --args #PREFIX = valgrind --tool=memcheck --leak-check=full --log-file=transport%p diff --git a/src/transport/test_transport_api_multi_peer2.conf b/src/transport/test_transport_api_multi_peer2.conf index 9f6ffb239..c1f1eadb9 100644 --- a/src/transport/test_transport_api_multi_peer2.conf +++ b/src/transport/test_transport_api_multi_peer2.conf @@ -27,6 +27,8 @@ USE_IPv4 = YES #BINDTO4 = 127.0.0.1 #BINDTO6 = ::1 +[transport-unix] +PORT = 40005 [core] AUTOSTART = NO @@ -57,7 +59,7 @@ FRIENDS-ONLY = NO MINIMUM-FRIENDS = 0 [transport] -PLUGINS = tcp udp http +PLUGINS = tcp udp http unix #DEBUG = YES ACCEPT_FROM6 = ::1; ACCEPT_FROM = 127.0.0.1; diff --git a/src/transport/test_transport_ats.c b/src/transport/test_transport_ats.c index 4c636cab6..739975951 100644 --- a/src/transport/test_transport_ats.c +++ b/src/transport/test_transport_ats.c @@ -336,7 +336,6 @@ static void exchange_hello (void *cls, const struct GNUNET_MessageHeader *message) { - return; struct PeerContext *me = cls; GNUNET_TRANSPORT_get_hello_cancel (p1.th, &exchange_hello, me); diff --git a/src/transport/test_transport_ats_peer1.conf b/src/transport/test_transport_ats_peer1.conf index e750ee011..0347d293f 100644 --- a/src/transport/test_transport_ats_peer1.conf +++ b/src/transport/test_transport_ats_peer1.conf @@ -8,6 +8,9 @@ ENABLE_UPNP = NO INTERNAL_ADDRESS = 127.0.0.1 EXTERNAL_ADDRESS = 127.0.0.1 +[transport-unix] +PORT = 4368 + [fs] AUTOSTART = NO @@ -37,7 +40,7 @@ FRIENDS-ONLY = NO MINIMUM-FRIENDS = 0 [transport] -PLUGINS = tcp +PLUGINS = tcp unix #DEBUG = YES #PREFIX = xterm -T transport2 -e gdb --command=cmd --args #PREFIX = valgrind --tool=memcheck --leak-check=full --log-file=transport%p diff --git a/src/transport/test_transport_ats_peer2.conf b/src/transport/test_transport_ats_peer2.conf index 40f0b0732..065ed56a5 100644 --- a/src/transport/test_transport_ats_peer2.conf +++ b/src/transport/test_transport_ats_peer2.conf @@ -8,6 +8,9 @@ ENABLE_UPNP = NO EXTERNAL_ADDRESS = 127.0.0.1 INTERNAL_ADDRESS = 127.0.0.1 +[transport-unix] +PORT = 5368 + [core] AUTOSTART = NO @@ -37,7 +40,7 @@ FRIENDS-ONLY = NO MINIMUM-FRIENDS = 0 [transport] -PLUGINS = tcp +PLUGINS = tcp unix #DEBUG = YES ACCEPT_FROM6 = ::1; ACCEPT_FROM = 127.0.0.1; diff --git a/src/transport/transport.h b/src/transport/transport.h index 00af17cab..dc9e7ce58 100644 --- a/src/transport/transport.h +++ b/src/transport/transport.h @@ -30,6 +30,27 @@ #include "gnunet_time_lib.h" #include "gnunet_transport_service.h" +/* Minimum time between to calculations*/ +#define ATS_MIN_INTERVAL GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS,250) +#define ATS_EXEC_INTERVAL GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS,1) + +#define DEBUG_ATS GNUNET_NO + +struct ATS_info +{ + struct GNUNET_CONTAINER_MultiHashMap * peers; + struct GNUNET_TIME_Absolute last; + struct GNUNET_TIME_Relative min_delta; + struct GNUNET_TIME_Relative reg_delta; + + GNUNET_SCHEDULER_TaskIdentifier ats_task; +}; + +struct ATS_peer +{ + struct GNUNET_PeerIdentity peer; +}; + #define DEBUG_TRANSPORT GNUNET_NO #define DEBUG_TRANSPORT_TIMEOUT GNUNET_NO #define DEBUG_TRANSPORT_DISCONNECT GNUNET_NO -- cgit v1.2.3