gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r10910 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r10910 - gnunet/src/transport
Date: Wed, 14 Apr 2010 21:21:45 +0200

Author: grothoff
Date: 2010-04-14 21:21:45 +0200 (Wed, 14 Apr 2010)
New Revision: 10910

Modified:
   gnunet/src/transport/gnunet-service-transport.c
Log:
maybe done with transport inbound-NAT verification and connect signalling fixed

Modified: gnunet/src/transport/gnunet-service-transport.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport.c     2010-04-14 19:08:44 UTC 
(rev 10909)
+++ gnunet/src/transport/gnunet-service-transport.c     2010-04-14 19:21:45 UTC 
(rev 10910)
@@ -23,10 +23,6 @@
  * @brief low-level P2P messaging
  * @author Christian Grothoff
  *
- * TODO:
- * - CHECK that 'address' being NULL in 'struct ForeignAddressList' is
- *   tolerated in the code everywhere (could not happen before)
- *
  * NOTE:
  * - This code uses 'GNUNET_a2s' for debug printing in many places,
  *   which is technically wrong since it assumes we have IP+Port 
@@ -1213,17 +1209,18 @@
       while (addresses != NULL)
         {
 #if DEBUG_TRANSPORT > 1
-         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                     "Have address `%s' for peer `%4s' (status: %d, %d, %d, 
%u, %llums, %u)\n",
-                     GNUNET_a2s (addresses->addr,
-                                 addresses->addrlen),
-                     GNUNET_i2s (&neighbour->id),
-                     addresses->connected,
-                     addresses->in_transmit,
-                     addresses->validated,
-                     addresses->connect_attempts,
-                     (unsigned long long) addresses->timeout.value,
-                     (unsigned int) addresses->distance);
+         if (addresses->addr != NULL)
+           GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                       "Have address `%s' for peer `%4s' (status: %d, %d, %d, 
%u, %llums, %u)\n",
+                       GNUNET_a2s (addresses->addr,
+                                   addresses->addrlen),
+                       GNUNET_i2s (&neighbour->id),
+                       addresses->connected,
+                       addresses->in_transmit,
+                       addresses->validated,
+                       addresses->connect_attempts,
+                       (unsigned long long) addresses->timeout.value,
+                       (unsigned int) addresses->distance);
 #endif
           if ( ( (best_address == NULL) || 
                 (addresses->connected == GNUNET_YES) ||
@@ -1376,8 +1373,10 @@
               "Sending message of size %u for `%4s' to `%s' via plugin `%s'\n",
               mq->message_buf_size,
               GNUNET_i2s (&neighbour->id), 
-             GNUNET_a2s (mq->specific_address->addr,
-                         mq->specific_address->addrlen),
+             (mq->specific_address->addr != NULL)
+             ? GNUNET_a2s (mq->specific_address->addr,
+                           mq->specific_address->addrlen)
+             : "<inbound>",
              rl->plugin->short_name);
 #endif
   GNUNET_STATISTICS_update (stats,
@@ -1787,9 +1786,9 @@
   struct OwnAddressList *al;
   struct GNUNET_TIME_Absolute abex;
 
+  GNUNET_assert (addr != NULL);
   abex = GNUNET_TIME_relative_to_absolute (expires);
   GNUNET_assert (p == find_transport (name));
-
   al = p->addresses;
   while (al != NULL)
     {
@@ -1886,6 +1885,7 @@
  * @param tname name of the transport plugin
  * @param session session to look for, NULL for 'any'; otherwise
  *        can be used for the service to "learn" this session ID
+ *        if 'addr' matches
  * @param addr binary address
  * @param addrlen length of addr
  * @return NULL if no such entry exists
@@ -1898,7 +1898,7 @@
                  size_t addrlen)
 {
   struct ReadyList *head;
-  struct ForeignAddressList *address_head;
+  struct ForeignAddressList *pos;
 
   head = neighbour->plugins;
   while (head != NULL)
@@ -1909,15 +1909,19 @@
     }
   if (head == NULL)
     return NULL;
-
-  address_head = head->addresses;
-  while ( (address_head != NULL) &&
-         ( (address_head->addrlen != addrlen) ||
-           (memcmp(address_head->addr, addr, addrlen) != 0) ) )
-    address_head = address_head->next;
-  if ( (session != NULL) && (address_head != NULL) )
-    address_head->session = session; /* learn it! */
-  return address_head;
+  pos = head->addresses;
+  while ( (pos != NULL) &&
+         ( (pos->addrlen != addrlen) ||
+           (memcmp(pos->addr, addr, addrlen) != 0) ) )
+    {
+      if ( (session != NULL) &&
+          (pos->session == session) )
+       return pos;
+      pos = pos->next;
+    }
+  if ( (session != NULL) && (pos != NULL) )
+    pos->session = session; /* learn it! */
+  return pos;
 }
 
 
@@ -2044,6 +2048,11 @@
   const char *tname;
 
   /**
+   * Session, or NULL.
+   */
+  struct Session *session;
+
+  /**
    * Length of addr.
    */
   size_t addrlen;
@@ -2073,6 +2082,7 @@
 {
   struct CheckAddressExistsClosure *caec = cls;
   struct ValidationEntry *ve = value;
+
   if ( (0 == strcmp (caec->tname,
                     ve->transport_name)) &&
        (caec->addrlen == ve->addrlen) &&
@@ -2083,6 +2093,12 @@
       caec->exists = GNUNET_YES;
       return GNUNET_NO;
     }
+  if ( (ve->session != NULL) &&
+       (caec->session == ve->session) )
+    {
+      caec->exists = GNUNET_YES;
+      return GNUNET_NO;
+    }
   return GNUNET_YES;
 }
 
@@ -2362,6 +2378,7 @@
   caec.addr = peer_address->addr;
   caec.addrlen = peer_address->addrlen;
   caec.tname = tp->short_name;
+  caec.session = peer_address->session;
   caec.exists = GNUNET_NO;
   GNUNET_CONTAINER_multihashmap_iterate (validation_map,
                                          &check_address_exists,
@@ -2375,8 +2392,10 @@
 #if DEBUG_TRANSPORT > 1
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                   "Some validation of address `%s' via `%s' for peer `%4s' 
already in progress.\n",
-                  GNUNET_a2s (peer_address->addr,
-                             peer_address->addrlen),
+                 (peer_address->addr != NULL)
+                  ? GNUNET_a2s (peer_address->addr,
+                               peer_address->addrlen)
+                 : "<inbound>",
                   tp->short_name,
                   GNUNET_i2s (&neighbour->id));
 #endif
@@ -2389,10 +2408,12 @@
                                             (unsigned int) -1);
   va->send_time = GNUNET_TIME_absolute_get();
   va->session = peer_address->session;
-  va->addr = (const void*) &va[1];
-  memcpy (&va[1], peer_address->addr, peer_address->addrlen);
-  va->addrlen = peer_address->addrlen;
-
+  if (peer_address->addr != NULL)
+    {
+      va->addr = (const void*) &va[1];
+      memcpy (&va[1], peer_address->addr, peer_address->addrlen);
+      va->addrlen = peer_address->addrlen;
+    }
   memcpy(&va->publicKey,
         &neighbour->publicKey, 
         sizeof(struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded));
@@ -2419,8 +2440,10 @@
 #if DEBUG_TRANSPORT_REVALIDATION
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Performing re-validation of address `%s' via `%s' for peer 
`%4s' sending `%s' (%u bytes) and `%s' (%u bytes)\n",
-              GNUNET_a2s (peer_address->addr,
-                         peer_address->addrlen),
+              (peer_address->addr != NULL) 
+             ? GNUNET_a2s (peer_address->addr,
+                           peer_address->addrlen)
+             : "<inbound>",
               tp->short_name,
               GNUNET_i2s (&neighbour->id),
               "HELLO", hello_size,
@@ -2595,13 +2618,14 @@
     }
 
 #if DEBUG_TRANSPORT
-  if (ve->addr != NULL)
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-               "Confirmed validity of address, peer `%4s' has address `%s' 
(%s).\n",
-               GNUNET_h2s (key),
-               GNUNET_a2s ((const struct sockaddr *) ve->addr,
-                           ve->addrlen),
-               ve->transport_name);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+             "Confirmed validity of address, peer `%4s' has address `%s' 
(%s).\n",
+             GNUNET_h2s (key),
+             (ve->addr != NULL) 
+             ? GNUNET_a2s ((const struct sockaddr *) ve->addr,
+                           ve->addrlen)
+             : "<inbound>",
+             ve->transport_name);
 #endif
   GNUNET_STATISTICS_update (stats,
                            gettext_noop ("# address validation successes"),
@@ -2611,15 +2635,18 @@
   GNUNET_CRYPTO_hash (&ve->publicKey,
                       sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
                       &target.hashPubKey);
-  avac.done = GNUNET_NO;
-  avac.ve = ve;
-  hello = GNUNET_HELLO_create (&ve->publicKey,
-                              &add_validated_address,
-                              &avac);
-  GNUNET_PEERINFO_add_peer (cfg, sched,
-                           &target,
-                           hello);
-  GNUNET_free (hello);
+  if (ve->addr != NULL)
+    {
+      avac.done = GNUNET_NO;
+      avac.ve = ve;
+      hello = GNUNET_HELLO_create (&ve->publicKey,
+                                  &add_validated_address,
+                                  &avac);
+      GNUNET_PEERINFO_add_peer (cfg, sched,
+                               &target,
+                               hello);
+      GNUNET_free (hello);
+    }
   n = find_neighbour (&target);
   if (n != NULL)
     {
@@ -2775,6 +2802,7 @@
   uint16_t hello_size;
   size_t tsize;
 
+  GNUNET_assert (addr != NULL);
   GNUNET_STATISTICS_update (stats,
                            gettext_noop ("# peer addresses scheduled for 
validation"),
                            1,





reply via email to

[Prev in Thread] Current Thread [Next in Thread]