track HELLOs from peerinfo
authorChristian Grothoff <christian@grothoff.org>
Tue, 27 Sep 2011 14:26:23 +0000 (14:26 +0000)
committerChristian Grothoff <christian@grothoff.org>
Tue, 27 Sep 2011 14:26:23 +0000 (14:26 +0000)
src/dht/Makefile.am
src/dht/gnunet-service-dht-new.c
src/dht/gnunet-service-dht_hello.c [new file with mode: 0644]
src/dht/gnunet-service-dht_hello.h [new file with mode: 0644]
src/dht/gnunet-service-dht_neighbours.c

index 70fa5ca2808b5bb777afb73fdbc5096fba3b4e49..5cad82062bc8dd7df82d91a027eab1d4ee075f91 100644 (file)
@@ -122,6 +122,7 @@ gnunet_service_dht_new_SOURCES = \
  gnunet-service-dht-new.c gnunet-service-dht.h \
  gnunet-service-dht_clients.c gnunet-service-dht_clients.h \
  gnunet-service-dht_datacache.c gnunet-service-dht_datacache.h \
+ gnunet-service-dht_hello.c gnunet-service-dht_hello.h \
  gnunet-service-dht_nse.c gnunet-service-dht_nse.h \
  gnunet-service-dht_neighbours.c gnunet-service-dht_neighbours.h \
  gnunet-service-dht_routing.c gnunet-service-dht_routing.h 
index 1469385d2c1b52f5cd1a8fb086efd6fdf7d01c00..0d377450adad3c892af4cc88315ab316125b6080 100644 (file)
@@ -34,6 +34,7 @@
 #include "gnunet-service-dht.h"
 #include "gnunet-service-dht_clients.h"
 #include "gnunet-service-dht_datacache.h"
+#include "gnunet-service-dht_hello.h"
 #include "gnunet-service-dht_neighbours.h"
 #include "gnunet-service-dht_nse.h"
 #include "gnunet-service-dht_routing.h"
@@ -114,6 +115,7 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   GDS_DATACACHE_done ();
   GDS_ROUTING_done ();
   GDS_CLIENTS_done ();
+  GDS_HELLO_done ();
   GDS_NSE_done ();
   if (GDS_block_context != NULL)
   {
@@ -147,6 +149,7 @@ run (void *cls, struct GNUNET_SERVER_Handle *server,
   GDS_ROUTING_init ();
   GDS_NSE_init ();
   GDS_DATACACHE_init ();
+  GDS_HELLO_init ();
   GDS_CLIENTS_init (server);
   if (GNUNET_OK !=
       GDS_NEIGHBOURS_init ())
diff --git a/src/dht/gnunet-service-dht_hello.c b/src/dht/gnunet-service-dht_hello.c
new file mode 100644 (file)
index 0000000..2ee60c9
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+     This file is part of GNUnet.
+     (C) 2011 Christian Grothoff (and other contributing authors)
+
+     GNUnet is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-dht_hello.c
+ * @brief GNUnet DHT integration with peerinfo
+ * @author Christian Grothoff
+ *
+ * TODO:
+ * - consider adding mechanism to remove expired HELLOs
+ */
+#include "platform.h"
+#include "gnunet-service-dht.h"
+#include "gnunet-service-dht_hello.h"
+#include "gnunet_peerinfo_service.h"
+
+
+/**
+ * Handle for peerinfo notifications.
+ */
+static struct GNUNET_PEERINFO_NotifyContext *pnc;
+
+/**
+ * Hash map of peers to HELLOs.
+ */
+static struct GNUNET_CONTAINER_MultiHashMap *peer_to_hello;
+
+
+/**
+ * Obtain a peer's HELLO if available
+ *
+ * @param peer peer to look for a HELLO from
+ * @return HELLO for the given peer
+ */
+const struct GNUNET_HELLO_Message *
+GDS_HELLO_get (const struct GNUNET_PeerIdentity *peer)
+{
+  return GNUNET_CONTAINER_multihashmap_get (peer_to_hello,
+                                           &peer->hashPubKey);
+}
+
+
+/**
+ * Function called for each HELLO known to PEERINFO.
+ *
+ * @param cls closure
+ * @param peer id of the peer, NULL for last call
+ * @param hello hello message for the peer (can be NULL)
+ * @param error message
+ */
+static void
+process_hello (void *cls,
+              const struct GNUNET_PeerIdentity *
+              peer,
+              const struct GNUNET_HELLO_Message *
+              hello, const char *err_msg)
+{
+  struct GNUNET_TIME_Absolute ex;
+  struct GNUNET_HELLO_Message *hm;
+
+  if (hello == NULL)
+    return;
+  ex = GNUNET_HELLO_get_last_expiration (hello);
+  if (GNUNET_TIME_absolute_get_remaining (ex).rel_value == 0)
+    return;
+  hm = GNUNET_CONTAINER_multihashmap_get (peer_to_hello,
+                                         &peer->hashPubKey);
+  GNUNET_free_non_null (hm);
+  hm = GNUNET_malloc (GNUNET_HELLO_size (hello));
+  memcpy (hm, hello, GNUNET_HELLO_size (hello));
+  GNUNET_assert (GNUNET_SYSERR !=
+                GNUNET_CONTAINER_multihashmap_put (peer_to_hello,
+                                                   &peer->hashPubKey,
+                                                   hm,
+                                                   GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE));
+}
+
+
+/**
+ * Initialize HELLO subsystem.
+ */
+void
+GDS_HELLO_init ()
+{
+  pnc = GNUNET_PEERINFO_notify (GDS_cfg,
+                               &process_hello,
+                               NULL);
+  peer_to_hello = GNUNET_CONTAINER_multihashmap_create (256);
+}
+
+
+/**
+ * Free memory occopied by the HELLO.
+ */
+static int
+free_hello (void *cls,
+           const GNUNET_HashCode *key,
+           void *hello)
+{
+  GNUNET_free (hello);
+  return GNUNET_OK;
+}
+
+
+/**
+ * Shutdown HELLO subsystem.
+ */
+void
+GDS_HELLO_done ()
+{
+  if (NULL != pnc)
+  {
+    GNUNET_PEERINFO_notify_cancel (pnc);
+    pnc = NULL;
+  }
+  GNUNET_CONTAINER_multihashmap_iterate (peer_to_hello,
+                                        &free_hello,
+                                        NULL);
+  GNUNET_CONTAINER_multihashmap_destroy (peer_to_hello);
+}
+
+/* end of gnunet-service-dht_hello.c */
diff --git a/src/dht/gnunet-service-dht_hello.h b/src/dht/gnunet-service-dht_hello.h
new file mode 100644 (file)
index 0000000..04a6a49
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+     This file is part of GNUnet.
+     (C) 2011 Christian Grothoff (and other contributing authors)
+
+     GNUnet is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 3, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file dht/gnunet-service-dht_hello.h
+ * @brief GNUnet DHT integration with peerinfo
+ * @author Christian Grothoff
+ */
+#ifndef GNUNET_SERVICE_DHT_HELLO_H
+#define GNUNET_SERVICE_DHT_HELLO_H
+
+#include "gnunet_util_lib.h"
+#include "gnunet_hello_lib.h"
+
+/**
+ * Obtain a peer's HELLO if available
+ *
+ * @param peer peer to look for a HELLO from
+ * @return HELLO for the given peer
+ */
+const struct GNUNET_HELLO_Message *
+GDS_HELLO_get (const struct GNUNET_PeerIdentity *peer);
+
+
+/**
+ * Initialize HELLO subsystem.
+ */
+void
+GDS_HELLO_init (void);
+
+
+/**
+ * Shutdown HELLO subsystem.
+ */
+void
+GDS_HELLO_done (void);
+
+#endif
index a9ecbe4af3388e6fc25612a4f7dc396737efa874..8cbf918d2d5a70eab7a6fa80132af8862769b4f2 100644 (file)
 #include "gnunet_hello_lib.h"
 #include "gnunet_dht_service.h"
 #include "gnunet_statistics_service.h"
-#include "gnunet_peerinfo_service.h"
 #include "dht.h"
 #include "gnunet-service-dht.h"
 #include "gnunet-service-dht_clients.h"
 #include "gnunet-service-dht_datacache.h"
+#include "gnunet-service-dht_hello.h"
 #include "gnunet-service-dht_neighbours.h"
 #include "gnunet-service-dht_nse.h"
 #include "gnunet-service-dht_routing.h"
@@ -328,12 +328,6 @@ struct PeerInfo
    */
   struct GNUNET_CORE_InformationRequestContext *info_ctx;
 
-  /**
-   * HELLO message for the peer, NULL if not known.  FIXME: track
-   * separately? FIXME: free!?
-   */
-  struct GNUNET_HELLO_Message *hello;
-
   /**
    * Task for scheduling preference updates
    */
@@ -422,11 +416,6 @@ static struct GNUNET_PeerIdentity my_identity;
  */
 static struct GNUNET_CORE_Handle *coreAPI;
 
-/**
- * Handle for peerinfo notifications.
- */
-static struct GNUNET_PEERINFO_NotifyContext *pnc;
-
 
 /**
  * Find the optimal bucket for this key.
@@ -1533,6 +1522,7 @@ handle_find_peer (const struct GNUNET_PeerIdentity *sender,
   struct PeerInfo *peer;
   unsigned int choice;
   GNUNET_HashCode mhash;
+  const struct GNUNET_HELLO_Message *hello;
 
   /* first, check about our own HELLO */
   if (NULL != GDS_my_hello)
@@ -1574,8 +1564,9 @@ handle_find_peer (const struct GNUNET_PeerIdentity *sender,
       if (peer == NULL)
        peer = bucket->head;
       GNUNET_BLOCK_mingle_hash (&peer->id.hashPubKey, bf_mutator, &mhash);
+      hello = GDS_HELLO_get (&peer->id);
     }
-  while ( (peer->hello == NULL) ||
+  while ( (hello == NULL) ||
          (GNUNET_YES == GNUNET_CONTAINER_bloomfilter_test (bf, &mhash)) );
   GDS_NEIGHBOURS_handle_reply (sender,
                               GNUNET_BLOCK_TYPE_DHT_HELLO,
@@ -1583,8 +1574,8 @@ handle_find_peer (const struct GNUNET_PeerIdentity *sender,
                               key,
                               0, NULL,
                               0, NULL,
-                              peer->hello,
-                              GNUNET_HELLO_size (peer->hello));    
+                              hello,
+                              GNUNET_HELLO_size (hello));    
 }
 
 
@@ -1831,29 +1822,6 @@ handle_dht_p2p_result (void *cls, const struct GNUNET_PeerIdentity *peer,
 }
 
 
-/**
- * Function called for each HELLO known to PEERINFO.
- *
- * @param cls closure
- * @param peer id of the peer, NULL for last call
- * @param hello hello message for the peer (can be NULL)
- * @param error message
- */
-static void
-process_hello (void *cls,
-              const struct GNUNET_PeerIdentity *
-              peer,
-              const struct GNUNET_HELLO_Message *
-              hello, const char *err_msg)
-{
-  // FIXME: consider moving HELLO processing to another file!
-  // FIXME: first, filter HELLOs without addresses (!)
-  // FIXME: track HELLOs (for responding to FIND PEER requests)
-  // FIXME: add code to possibly ask core to establish connections
-  //        (using our own peerinfo is better than using FIND PEER!)
-}
-
-
 /**
  * Initialize neighbours subsystem.
  *
@@ -1887,9 +1855,6 @@ GDS_NEIGHBOURS_init ()
   if (coreAPI == NULL)
     return GNUNET_SYSERR;
   all_known_peers = GNUNET_CONTAINER_multihashmap_create (256);
-  pnc = GNUNET_PEERINFO_notify (GDS_cfg,
-                               &process_hello,
-                               NULL);
   return GNUNET_OK;
 }
 
@@ -1902,11 +1867,6 @@ GDS_NEIGHBOURS_done ()
 {
   if (coreAPI == NULL)
     return;
-  if (NULL != pnc)
-  {
-    GNUNET_PEERINFO_notify_cancel (pnc);
-    pnc = NULL;
-  }
   GNUNET_CORE_disconnect (coreAPI);
   coreAPI = NULL;    
   GNUNET_assert (0 == GNUNET_CONTAINER_multihashmap_size (all_known_peers));