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
#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"
GDS_DATACACHE_done ();
GDS_ROUTING_done ();
GDS_CLIENTS_done ();
+ GDS_HELLO_done ();
GDS_NSE_done ();
if (GDS_block_context != NULL)
{
GDS_ROUTING_init ();
GDS_NSE_init ();
GDS_DATACACHE_init ();
+ GDS_HELLO_init ();
GDS_CLIENTS_init (server);
if (GNUNET_OK !=
GDS_NEIGHBOURS_init ())
--- /dev/null
+/*
+ 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 */
--- /dev/null
+/*
+ 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
#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"
*/
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
*/
*/
static struct GNUNET_CORE_Handle *coreAPI;
-/**
- * Handle for peerinfo notifications.
- */
-static struct GNUNET_PEERINFO_NotifyContext *pnc;
-
/**
* Find the optimal bucket for this key.
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)
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,
key,
0, NULL,
0, NULL,
- peer->hello,
- GNUNET_HELLO_size (peer->hello));
+ hello,
+ GNUNET_HELLO_size (hello));
}
}
-/**
- * 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.
*
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;
}
{
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));