gnunet-svn
[Top][All Lists]
Advanced

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

[gnunet] branch master updated: -theoretically complete, alas untested p


From: gnunet
Subject: [gnunet] branch master updated: -theoretically complete, alas untested plugin_dhtu_ip.c
Date: Wed, 07 Jul 2021 09:40:30 +0200

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository gnunet.

The following commit(s) were added to refs/heads/master by this push:
     new db54a526e -theoretically complete, alas untested plugin_dhtu_ip.c
db54a526e is described below

commit db54a526e4741013d4904c3987b4f8b369a7b44b
Author: Christian Grothoff <grothoff@gnunet.org>
AuthorDate: Wed Jul 7 09:37:27 2021 +0200

    -theoretically complete, alas untested plugin_dhtu_ip.c
---
 src/dhtu/plugin_dhtu_ip.c        | 118 ++++++++++++++++++++++++++++++++-------
 src/include/gnunet_dhtu_plugin.h |   2 +-
 2 files changed, 98 insertions(+), 22 deletions(-)

diff --git a/src/dhtu/plugin_dhtu_ip.c b/src/dhtu/plugin_dhtu_ip.c
index a0da9d680..f80325cbc 100644
--- a/src/dhtu/plugin_dhtu_ip.c
+++ b/src/dhtu/plugin_dhtu_ip.c
@@ -23,17 +23,21 @@
  *
  * @file plugin_dhtu_ip.c
  * @brief plain IP based DHT network underlay
- *
- * TODO:
- * - call NSE callback
- * - expire destination addresses 
- * - faster lookup of destinations
  */
 #include "platform.h"
 #include "gnunet_dhtu_plugin.h"
 
+/**
+ * How frequently should we re-scan our local interfaces for IPs?
+ */
 #define SCAN_FREQ GNUNET_TIME_UNIT_MINUTES
 
+/**
+ * Maximum number of concurrently active destinations to support.
+ */
+#define MAX_DESTS 256
+
+
 /**
  * Opaque handle that the underlay offers for our address to be used when
  * sending messages to another peer.
@@ -90,7 +94,7 @@ struct GNUNET_DHTU_Source
  */
 struct GNUNET_DHTU_Target
 {
-  // FIXME: add mechanism for targets to expire
+
   /**
    * Kept in a DLL.
    */
@@ -182,7 +186,8 @@ struct Plugin
   struct GNUNET_DHTU_Source *src_tail;
 
   /**
-   * Head of destinations that are active.
+   * Head of destinations that are active. Sorted by
+   * last use, with latest used at the head.
    */
   struct GNUNET_DHTU_Target *dst_head;
 
@@ -191,6 +196,11 @@ struct Plugin
    */
   struct GNUNET_DHTU_Target *dst_tail;
 
+  /**
+   * Map from hashes of sockaddrs to targets.
+   */
+  struct GNUNET_CONTAINER_MultiHashMap *dsts;
+  
   /**
    * Task that scans for IP address changes.
    */
@@ -276,6 +286,36 @@ create_target (struct Plugin *plugin,
   static struct GNUNET_DHTU_PublicKey pk;
   struct GNUNET_DHTU_Target *dst;
 
+  if (MAX_DESTS >
+      GNUNET_CONTAINER_multihashmap_size (plugin->dsts))
+  {
+    struct GNUNET_HashCode key;
+    
+    dst = NULL;
+    for (struct GNUNET_DHTU_Target *pos = plugin->dst_head;
+         NULL != pos;
+         pos = pos->next)
+    {
+      /* >= here assures we remove oldest entries first */
+      if ( (NULL == dst) ||
+           (dst->ph_count >= pos->ph_count) )
+        dst = pos;
+    }
+    GNUNET_assert (NULL != dst);
+    plugin->env->disconnect_cb (dst->app_ctx);
+    GNUNET_CRYPTO_hash (&dst->addr,
+                        dst->addrlen,
+                        &key);
+    GNUNET_assert (GNUNET_YES ==
+                   GNUNET_CONTAINER_multihashmap_remove (plugin->dsts,
+                                                         &key,
+                                                         dst));
+    GNUNET_CONTAINER_DLL_remove (plugin->dst_head,
+                                 plugin->dst_tail,
+                                 dst);
+    GNUNET_assert (NULL == dst->ph_head);
+    GNUNET_free (dst);
+  }
   pk.size = htons (sizeof (pk));  
   dst = GNUNET_new (struct GNUNET_DHTU_Target);
   dst->addrlen = addrlen;
@@ -336,20 +376,38 @@ find_target (struct Plugin *plugin,
              const void *addr,
              size_t addrlen)
 {
-  // FIXME-OPTIMIZE: use hash map instead of linear search
-  for (struct GNUNET_DHTU_Target *dst = plugin->dst_head;
-       NULL != dst;
-       dst = dst->next)
+  struct GNUNET_HashCode key;
+  struct GNUNET_DHTU_Target *dst;
+
+  GNUNET_CRYPTO_hash (addr,
+                      addrlen,
+                      &key);
+  dst = GNUNET_CONTAINER_multihashmap_get (plugin->dsts,
+                                           &key);
+  if (NULL == dst)
   {
-    if ( (addrlen == dst->addrlen) &&
-         (0 == memcmp (addr,
-                       &dst->addr,
-                       addrlen)) )
-        return dst;
+    dst = create_target (plugin,
+                         (const struct sockaddr *) addr,
+                         addrlen);
+    GNUNET_assert (GNUNET_YES ==
+                   GNUNET_CONTAINER_multihashmap_put (
+                                                      plugin->dsts,
+                                                      &key,
+                                                      dst,
+                                                      
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
   }
-  return create_target (plugin,
-                        (const struct sockaddr *) addr,
-                        addrlen);
+  else
+  {
+    /* move to head of DLL */
+    GNUNET_CONTAINER_DLL_remove (plugin->dst_head,
+                                 plugin->dst_tail,
+                                 dst);
+    GNUNET_CONTAINER_DLL_insert (plugin->dst_head,
+                                 plugin->dst_tail,
+                                 dst);
+
+  }
+  return dst;
 }
 
 
@@ -818,7 +876,19 @@ libgnunet_plugin_dhtu_ip_init (void *cls)
   unsigned int nport;
   int sock;
   int af;
+  unsigned long long nse;
 
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_number (env->cfg,
+                                             "DHTU-IP",
+                                             "NSE",
+                                             &nse))
+  {
+    GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
+                               "DHTU-IP",
+                               "NSE");
+    return NULL;
+  }
   if (GNUNET_OK !=
       GNUNET_CONFIGURATION_get_value_string (env->cfg,
                                              "DHTU-IP",
@@ -936,13 +1006,18 @@ libgnunet_plugin_dhtu_ip_init (void *cls)
     }
     break;
   }
+  plugin->dsts = GNUNET_CONTAINER_multihashmap_create (128,
+                                                       GNUNET_NO);
   plugin->sock = GNUNET_NETWORK_socket_box_native (sock);
   plugin->read_task = GNUNET_SCHEDULER_add_read_net (
     GNUNET_TIME_UNIT_FOREVER_REL,
     plugin->sock,
     &read_cb,
     plugin);
-  // FIXME: deal with NSE callback...
+  env->network_size_cb (env->cls,
+                        GNUNET_TIME_UNIT_ZERO_ABS,
+                        log (nse) / log (2),
+                        -1.0 /* stddev */);
   plugin->scan_task = GNUNET_SCHEDULER_add_now (&scan,
                                                 plugin);
   api = GNUNET_new (struct GNUNET_DHTU_PluginFunctions);
@@ -974,6 +1049,7 @@ libgnunet_plugin_dhtu_ip_done (void *cls)
   while (NULL != (dst = plugin->dst_head))
   {
     plugin->env->disconnect_cb (dst->app_ctx);
+    GNUNET_assert (NULL == dst->ph_head);
     GNUNET_CONTAINER_DLL_remove (plugin->dst_head,
                                  plugin->dst_tail,
                                  dst);
@@ -988,7 +1064,7 @@ libgnunet_plugin_dhtu_ip_done (void *cls)
     GNUNET_free (src->address);
     GNUNET_free (src);
   }
-
+  GNUNET_CONTAINER_multihashmap_destroy (plugin->dsts);
   GNUNET_SCHEDULER_cancel (plugin->scan_task);
   GNUNET_break (0 ==
                 GNUNET_NETWORK_socket_close (plugin->sock));
diff --git a/src/include/gnunet_dhtu_plugin.h b/src/include/gnunet_dhtu_plugin.h
index 4e5abf476..df9729a23 100644
--- a/src/include/gnunet_dhtu_plugin.h
+++ b/src/include/gnunet_dhtu_plugin.h
@@ -165,7 +165,7 @@ struct GNUNET_DHTU_PluginEnvironment
    * @param cls closure
    * @param timestamp time when the estimate was received from the server (or 
created by the server)
    * @param logestimate the log(Base 2) value of the current network size 
estimate
-   * @param std_dev standard deviation for the estimate
+   * @param std_dev standard deviation for the estimate, negative if 
unavailable
    */
   void
   (*network_size_cb)(void *cls,

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

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