gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r13037 - gnunet/src/dht


From: gnunet
Subject: [GNUnet-SVN] r13037 - gnunet/src/dht
Date: Tue, 21 Sep 2010 11:45:07 +0200

Author: nevans
Date: 2010-09-21 11:45:07 +0200 (Tue, 21 Sep 2010)
New Revision: 13037

Modified:
   gnunet/src/dht/gnunet-service-dht.c
Log:
try new method for sending find peer requests

Modified: gnunet/src/dht/gnunet-service-dht.c
===================================================================
--- gnunet/src/dht/gnunet-service-dht.c 2010-09-21 07:45:55 UTC (rev 13036)
+++ gnunet/src/dht/gnunet-service-dht.c 2010-09-21 09:45:07 UTC (rev 13037)
@@ -55,9 +55,15 @@
 /**
  * Should the DHT issue FIND_PEER requests to get better routing tables?
  */
-#define DO_FIND_PEER GNUNET_YES
+#define DEFAULT_DO_FIND_PEER GNUNET_YES
 
 /**
+ * Defines whether find peer requests send their HELLO's outgoing,
+ * or expect replies to contain hellos.
+ */
+#define FIND_PEER_WITH_HELLO GNUNET_YES
+
+/**
  * What is the maximum number of peers in a given bucket.
  */
 #define DEFAULT_BUCKET_SIZE 4
@@ -2248,11 +2254,42 @@
   size_t hello_size;
   size_t tsize;
   GNUNET_HashCode *recent_hash;
-#if RESTRICT_FIND_PEER
+  struct GNUNET_MessageHeader *other_hello;
+  size_t other_hello_size;
   struct GNUNET_PeerIdentity peer_id;
+
+  find_peer_message = (struct GNUNET_DHT_FindPeerMessage *)find_msg;
+  GNUNET_break_op(ntohs(find_msg->size) >= (sizeof(struct 
GNUNET_DHT_FindPeerMessage)));
+  if (ntohs(find_msg->size) < sizeof(struct GNUNET_DHT_FindPeerMessage))
+    return;
+  other_hello = NULL;
+  other_hello_size = 0;
+  if (ntohs(find_msg->size) > sizeof(struct GNUNET_DHT_FindPeerMessage))
+    {
+      other_hello_size = ntohs(find_msg->size) - sizeof(struct 
GNUNET_DHT_FindPeerMessage);
+      other_hello = GNUNET_malloc(other_hello_size);
+      memcpy(other_hello, &find_peer_message[1], other_hello_size);
+      if ((GNUNET_HELLO_size((struct GNUNET_HELLO_Message *)other_hello) == 0) 
|| (GNUNET_OK != GNUNET_HELLO_get_id((struct GNUNET_HELLO_Message 
*)other_hello, &peer_id)))
+        {
+          GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Received invalid HELLO 
message in find peer request!\n");
+          GNUNET_free(other_hello);
+          return;
+        }
+#if FIND_PEER_WITH_HELLO
+
+      if (GNUNET_YES == consider_peer(&peer_id))
+        {
+          increment_stats(STAT_HELLOS_PROVIDED);
+          GNUNET_TRANSPORT_offer_hello(transport_handle, other_hello);
+          GNUNET_CORE_peer_request_connect(sched, cfg, 
GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 5), &peer_id, NULL, 
NULL);
+        }
+      else /* We don't want this peer! */ /* Alternatively, just continue 
normally */
+        return;
 #endif
+    }
 
-  find_peer_message = (struct GNUNET_DHT_FindPeerMessage *)find_msg;
+
+
 #if DEBUG_DHT
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "`%s:%s': Received `%s' request from client, key %s (msg size 
%d, we expected %d)\n",
@@ -2267,6 +2304,7 @@
                 "`%s': Our HELLO is null, can't return.\n",
                 "DHT");
 #endif
+    GNUNET_free_non_null(other_hello);
     return;
   }
 
@@ -2275,6 +2313,7 @@
     {
       increment_stats(STAT_BLOOM_FIND_PEER);
       GNUNET_CONTAINER_bloomfilter_free(incoming_bloom);
+      GNUNET_free_non_null(other_hello);
       return; /* We match the bloomfilter, do not send a response to this peer 
(they likely already know us!)*/
     }
   GNUNET_CONTAINER_bloomfilter_free(incoming_bloom);
@@ -2287,6 +2326,7 @@
   if (GNUNET_YES == 
GNUNET_CONTAINER_multihashmap_contains(recent_find_peer_requests, 
&message_context->key)) /* We have recently responded to a find peer request 
for this peer! */
   {
     increment_stats("# dht find peer requests ignored (recently seen!)");
+    GNUNET_free_non_null(other_hello);
     return;
   }
 
@@ -2302,6 +2342,7 @@
   if (GNUNET_NO == consider_peer(&peer_id))
     {
       increment_stats("# dht find peer requests ignored (do not need!)");
+      GNUNET_free_non_null(other_hello);
       return;
     }
 #endif
@@ -2318,6 +2359,7 @@
   if (tsize >= GNUNET_SERVER_MAX_MESSAGE_SIZE)
     {
       GNUNET_break_op (0);
+      GNUNET_free_non_null(other_hello);
       return;
     }
 
@@ -2348,6 +2390,7 @@
                                    &message_context->key);
     }
 #endif
+  GNUNET_free_non_null(other_hello);
   GNUNET_free(find_peer_result);
 }
 
@@ -3572,8 +3615,14 @@
     }
 #endif
 
+#if FIND_PEER_WITH_HELLO
+  find_peer_msg = GNUNET_malloc(sizeof(struct GNUNET_DHT_FindPeerMessage) + 
GNUNET_HELLO_size((struct GNUNET_HELLO_Message *)my_hello));
+  find_peer_msg->header.size = htons(sizeof(struct GNUNET_DHT_FindPeerMessage) 
+ GNUNET_HELLO_size((struct GNUNET_HELLO_Message *)my_hello));
+  memcpy(&find_peer_msg[1], my_hello, GNUNET_HELLO_size((struct 
GNUNET_HELLO_Message *)my_hello));
+#else
   find_peer_msg = GNUNET_malloc(sizeof(struct GNUNET_DHT_FindPeerMessage));
   find_peer_msg->header.size = htons(sizeof(struct 
GNUNET_DHT_FindPeerMessage));
+#endif
   find_peer_msg->header.type = htons(GNUNET_MESSAGE_TYPE_DHT_FIND_PEER);
   temp_bloom = GNUNET_CONTAINER_bloomfilter_init (NULL, DHT_BLOOM_SIZE, 
DHT_BLOOM_K);
   GNUNET_CONTAINER_multihashmap_iterate(all_known_peers, &add_known_to_bloom, 
temp_bloom);
@@ -4092,9 +4141,7 @@
      struct GNUNET_SERVER_Handle *server,
      const struct GNUNET_CONFIGURATION_Handle *c)
 {
-#if DO_FIND_PEER
   struct GNUNET_TIME_Relative next_send_time;
-#endif
   unsigned long long temp_config_num;
   char *converge_modifier_buf;
   sched = scheduler;
@@ -4167,7 +4214,7 @@
         malicious_get_frequency = DEFAULT_MALICIOUS_GET_FREQUENCY;
     }
 
-  if (GNUNET_NO == GNUNET_CONFIGURATION_get_value_number (cfg, "DHT",
+  if (GNUNET_YES != GNUNET_CONFIGURATION_get_value_number (cfg, "DHT",
                                         "MAX_HOPS",
                                         &max_hops))
     {




reply via email to

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