unix domains sockets are now preferred
authorMatthias Wachs <wachs@net.in.tum.de>
Fri, 18 Mar 2011 16:41:57 +0000 (16:41 +0000)
committerMatthias Wachs <wachs@net.in.tum.de>
Fri, 18 Mar 2011 16:41:57 +0000 (16:41 +0000)
src/transport/gnunet-service-transport.c
src/transport/test_transport_api_multi_peer1.conf
src/transport/test_transport_api_multi_peer2.conf
src/transport/test_transport_ats.c
src/transport/test_transport_ats_peer1.conf
src/transport/test_transport_ats_peer2.conf
src/transport/transport.h

index e55fc41aca11e34d5bb04b15a3126b01b91a088b..1a5d0af4b7b9d91f8cef564ea48931107ed6f814 100644 (file)
@@ -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.
  *
index 0f0977277627f82d4bb3ed60469424405479e685..2e95a5bd8114e1bb2fb98e7001ded41cf064c764 100644 (file)
@@ -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
index 9f6ffb23917fb2bbef6c0f88f901357109f3e633..c1f1eadb9be17b05693e4f52d66430287c166590 100644 (file)
@@ -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;
index 4c636cab662728d477532eac61741bf635930763..73997595165a0db80751f7a0700d6a725b6e5c05 100644 (file)
@@ -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);
index e750ee0118d33dac9db4617ef969cb1053c2f54d..0347d293f0750f401a3a22c37b98720d3e6917a7 100644 (file)
@@ -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
index 40f0b07325dc92a641a95b0e7b6718c1dfac323b..065ed56a59c8ecf5d8259c08966f299f314a58ae 100644 (file)
@@ -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;
index 00af17cab48bc4eea99a0e8966e879ce1c2cd3ac..dc9e7ce582bb795473f6603fab3de5836f1cbad1 100644 (file)
 #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