From d8a11aace3ade81eebb0dd3f5b22fb85a536114a Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 13 Feb 2019 00:53:06 +0100 Subject: [PATCH] add more missing EXTRA_DISTs and remove dv (to be integrated with transport in TNG) --- configure.ac | 1 - pkgconfig/Makefile.am | 1 - pkgconfig/gnunetdv.pc.in | 12 - src/ats/Makefile.am | 2 + src/dv/.gitignore | 2 - src/dv/Makefile.am | 100 - src/dv/dv.conf.in | 15 - src/dv/dv.h | 172 -- src/dv/dv_api.c | 467 ----- src/dv/gnunet-dv.c | 185 -- src/dv/gnunet-service-dv.c | 2146 --------------------- src/dv/plugin_transport_dv.c | 910 --------- src/dv/template_dv.conf | 33 - src/dv/test_transport_blacklist.c | 69 - src/dv/test_transport_blacklist_data.conf | 5 - src/dv/test_transport_dv.c | 131 -- src/dv/test_transport_dv_data.conf | 19 - src/gns/test_gns_nick_shorten.conf | 24 - src/peerstore/Makefile.am | 4 +- src/testing/Makefile.am | 3 +- 20 files changed, 7 insertions(+), 4294 deletions(-) delete mode 100644 pkgconfig/gnunetdv.pc.in delete mode 100644 src/dv/.gitignore delete mode 100644 src/dv/Makefile.am delete mode 100644 src/dv/dv.conf.in delete mode 100644 src/dv/dv.h delete mode 100644 src/dv/dv_api.c delete mode 100644 src/dv/gnunet-dv.c delete mode 100644 src/dv/gnunet-service-dv.c delete mode 100644 src/dv/plugin_transport_dv.c delete mode 100644 src/dv/template_dv.conf delete mode 100644 src/dv/test_transport_blacklist.c delete mode 100644 src/dv/test_transport_blacklist_data.conf delete mode 100644 src/dv/test_transport_dv.c delete mode 100644 src/dv/test_transport_dv_data.conf delete mode 100644 src/gns/test_gns_nick_shorten.conf diff --git a/configure.ac b/configure.ac index 14360284a..f53d65006 100644 --- a/configure.ac +++ b/configure.ac @@ -1833,7 +1833,6 @@ pkgconfig/gnunetdatacache.pc pkgconfig/gnunetdatastore.pc pkgconfig/gnunetdht.pc pkgconfig/gnunetdns.pc -pkgconfig/gnunetdv.pc pkgconfig/gnunetenv.pc pkgconfig/gnunetfragmentation.pc pkgconfig/gnunetfs.pc diff --git a/pkgconfig/Makefile.am b/pkgconfig/Makefile.am index 755d680df..9ff682bd8 100644 --- a/pkgconfig/Makefile.am +++ b/pkgconfig/Makefile.am @@ -10,7 +10,6 @@ pcfiles = \ gnunetdatastore.pc \ gnunetdht.pc \ gnunetdns.pc \ - gnunetdv.pc \ gnunetenv.pc \ gnunetfragmentation.pc \ gnunetfs.pc \ diff --git a/pkgconfig/gnunetdv.pc.in b/pkgconfig/gnunetdv.pc.in deleted file mode 100644 index bd5bd4278..000000000 --- a/pkgconfig/gnunetdv.pc.in +++ /dev/null @@ -1,12 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: GNUnet dv -Description: Library to access GNUnet DV service -URL: http://gnunet.org -Version: @VERSION@ -Requires: -Libs: -L${libdir} -lgnunetdv -Cflags: -I${includedir} diff --git a/src/ats/Makefile.am b/src/ats/Makefile.am index 2a62d71bd..1200aac09 100644 --- a/src/ats/Makefile.am +++ b/src/ats/Makefile.am @@ -214,6 +214,8 @@ EXTRA_DIST = \ ats.h ats2.h \ plugin_ats2_common.c \ test_delay \ + test_ats2_lib.conf \ + test_ats_api.conf \ test_ats_api_mlp.conf \ test_ats_api_ril.conf \ test_ats_api_proportional.conf diff --git a/src/dv/.gitignore b/src/dv/.gitignore deleted file mode 100644 index b3068b1c4..000000000 --- a/src/dv/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -gnunet-service-dv -gnunet-dv diff --git a/src/dv/Makefile.am b/src/dv/Makefile.am deleted file mode 100644 index c44321151..000000000 --- a/src/dv/Makefile.am +++ /dev/null @@ -1,100 +0,0 @@ -# This Makefile.am is in the public domain -AM_CPPFLAGS = -I$(top_srcdir)/src/include - -if MINGW - WINFLAGS = -Wl,--no-undefined -Wl,--export-all-symbols -endif - -if USE_COVERAGE - AM_CFLAGS = --coverage -O0 - XLIB = -lgcov -endif - -plugindir = $(libdir)/gnunet - -libexecdir= $(pkglibdir)/libexec/ - -pkgcfgdir= $(pkgdatadir)/config.d/ - -pkgcfg_DATA = \ - dv.conf - -lib_LTLIBRARIES = libgnunetdv.la - -plugin_LTLIBRARIES = libgnunet_plugin_transport_dv.la - -libgnunetdv_la_SOURCES = \ - dv_api.c dv.h -libgnunetdv_la_LIBADD = \ - $(top_builddir)/src/util/libgnunetutil.la \ - $(GN_LIBINTL) $(XLIB) -libgnunetdv_la_LDFLAGS = \ - $(GN_LIB_LDFLAGS) $(WINFLAGS) \ - -version-info 0:0:0 - - -noinst_PROGRAMS = \ - gnunet-dv - -libexec_PROGRAMS = \ - gnunet-service-dv - -gnunet_service_dv_SOURCES = \ - gnunet-service-dv.c dv.h -gnunet_service_dv_LDADD = \ - $(top_builddir)/src/ats/libgnunetats.la \ - $(top_builddir)/src/set/libgnunetset.la \ - $(top_builddir)/src/statistics/libgnunetstatistics.la \ - $(top_builddir)/src/core/libgnunetcore.la \ - $(top_builddir)/src/util/libgnunetutil.la \ - $(GN_LIBINTL) - -gnunet_dv_SOURCES = \ - gnunet-dv.c dv.h -gnunet_dv_LDADD = \ - libgnunetdv.la \ - $(top_builddir)/src/util/libgnunetutil.la \ - $(GN_LIBINTL) - -libgnunet_plugin_transport_dv_la_SOURCES = \ - plugin_transport_dv.c -libgnunet_plugin_transport_dv_la_LIBADD = \ - libgnunetdv.la \ - $(top_builddir)/src/ats/libgnunetats.la \ - $(top_builddir)/src/hello/libgnunethello.la \ - $(top_builddir)/src/util/libgnunetutil.la -libgnunet_plugin_transport_dv_la_LDFLAGS = \ - $(GN_PLUGIN_LDFLAGS) - -if HAVE_TESTING -check_PROGRAMS = \ - test_transport_blacklist \ - test_transport_dv -endif - -if ENABLE_TEST_RUN - AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH;unset XDG_DATA_HOME;unset XDG_CONFIG_HOME; - TESTS = $(check_PROGRAMS) -endif - -test_transport_dv_SOURCES = \ - test_transport_dv.c -test_transport_dv_LDADD = \ - $(top_builddir)/src/testbed/libgnunettestbed.la \ - $(top_builddir)/src/core/libgnunetcore.la \ - $(top_builddir)/src/transport/libgnunettransport.la \ - $(top_builddir)/src/util/libgnunetutil.la - -test_transport_blacklist_SOURCES = \ - test_transport_blacklist.c -test_transport_blacklist_LDADD = \ - $(top_builddir)/src/testbed/libgnunettestbed.la \ - $(top_builddir)/src/core/libgnunetcore.la \ - $(top_builddir)/src/transport/libgnunettransport.la \ - $(top_builddir)/src/util/libgnunetutil.la - -EXTRA_DIST = \ - test_transport_dv_data.conf \ - test_transport_blacklist_data.conf \ - template_dv.conf - diff --git a/src/dv/dv.conf.in b/src/dv/dv.conf.in deleted file mode 100644 index 145c58be6..000000000 --- a/src/dv/dv.conf.in +++ /dev/null @@ -1,15 +0,0 @@ -[dv] -START_ON_DEMAND = @START_ON_DEMAND@ -ACCEPT_FROM6 = ::1; -ACCEPT_FROM = 127.0.0.1; -BINARY = gnunet-service-dv -HOSTNAME = localhost -@UNIXONLY@ PORT = 2571 -UNIXPATH = $GNUNET_RUNTIME_DIR/gnunet-service-dv.sock -UNIX_MATCH_UID = YES -UNIX_MATCH_GID = YES -# ACCEPT_FROM = -# ACCEPT_FROM6 = -# REJECT_FROM = -# REJECT_FROM6 = -# BINDTO = diff --git a/src/dv/dv.h b/src/dv/dv.h deleted file mode 100644 index b85d9c33f..000000000 --- a/src/dv/dv.h +++ /dev/null @@ -1,172 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) 2013 GNUnet e.V. - - GNUnet is free software: you can redistribute it and/or modify it - under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, - 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 - Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - - SPDX-License-Identifier: AGPL3.0-or-later -*/ - -/** - * @author Christian Grothoff - * @file dv/dv.h - * @brief IPC messages between DV service and DV plugin - */ -#ifndef DV_H -#define DV_H - -#include "gnunet_common.h" - -GNUNET_NETWORK_STRUCT_BEGIN - -/** - * DV service tells plugin about a DV-connection being - * now available. - */ -struct GNUNET_DV_ConnectMessage -{ - /** - * Type: #GNUNET_MESSAGE_TYPE_DV_CONNECT - */ - struct GNUNET_MessageHeader header; - - /** - * The distance to the peer that we are now connected to - */ - uint32_t distance GNUNET_PACKED; - - /** - * The other peer (at the given distance). - */ - struct GNUNET_PeerIdentity peer; - - /** - * The network the peer is in - */ - uint32_t network GNUNET_PACKED; - -}; - - -/** - * DV service tells plugin about a DV-connection being - * no longer available. - * - * Sender address is copied to the end of this struct, - * followed by the actual message received. - */ -struct GNUNET_DV_DisconnectMessage -{ - /** - * Type: #GNUNET_MESSAGE_TYPE_DV_DISCONNECT - */ - struct GNUNET_MessageHeader header; - - /** - * Always zero. - */ - uint32_t reserved GNUNET_PACKED; - - /** - * The peer that is no longer available. - */ - struct GNUNET_PeerIdentity peer; - -}; - - -/** - * DV Message, contains a message that was received via DV for this - * peer. Send from the DV service to the DV plugin. - * - * Sender address is copied to the end of this struct, - * followed by the actual message received. - */ -struct GNUNET_DV_ReceivedMessage -{ - /** - * Type: #GNUNET_MESSAGE_TYPE_DV_RECV - */ - struct GNUNET_MessageHeader header; - - /** - * The distance to the peer that we received the message from - */ - uint32_t distance GNUNET_PACKED; - - /** - * The (actual) sender of the message - */ - struct GNUNET_PeerIdentity sender; - - /* payload follows */ -}; - - -/** - * Message from plugin to DV service, requesting a - * message to be routed. - */ -struct GNUNET_DV_SendMessage -{ - /** - * Type: #GNUNET_MESSAGE_TYPE_DV_SEND - */ - struct GNUNET_MessageHeader header; - - /** - * Reserved for alignment. 0. - */ - uint32_t reserved GNUNET_PACKED; - - /** - * The (actual) target of the message - */ - struct GNUNET_PeerIdentity target; - -}; - - -/** - * Message from service to DV plugin, saying that our - * distance to another peer changed. - */ -struct GNUNET_DV_DistanceUpdateMessage -{ - /** - * Type: #GNUNET_MESSAGE_TYPE_DV_DISTANCE_CHANGED. - */ - struct GNUNET_MessageHeader header; - - /** - * What is the new distance? - */ - uint32_t distance GNUNET_PACKED; - - /** - * The peer for which the distance changed. - */ - struct GNUNET_PeerIdentity peer; - - /** - * The network the peer is in - */ - uint32_t network GNUNET_PACKED; - -}; - - -GNUNET_NETWORK_STRUCT_END - -#endif diff --git a/src/dv/dv_api.c b/src/dv/dv_api.c deleted file mode 100644 index dd46ce9f5..000000000 --- a/src/dv/dv_api.c +++ /dev/null @@ -1,467 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) 2009--2013, 2016 GNUnet e.V. - - GNUnet is free software: you can redistribute it and/or modify it - under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, - 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 - Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - - SPDX-License-Identifier: AGPL3.0-or-later -*/ - -/** - * @file dv/dv_api.c - * @brief library to access the DV service - * @author Christian Grothoff - * @author Nathan Evans - */ -#include "platform.h" -#include "gnunet_util_lib.h" -#include "gnunet_dv_service.h" -#include "gnunet_protocols.h" -#include "dv.h" -#include "gnunet_transport_plugin.h" - -#define LOG(kind,...) GNUNET_log_from (kind, "dv-api",__VA_ARGS__) - - -/** - * Information we track for each peer. - */ -struct ConnectedPeer -{ - - /** - * Identity of the peer. - */ - struct GNUNET_PeerIdentity pid; - -}; - - -/** - * Handle to the DV service. - */ -struct GNUNET_DV_ServiceHandle -{ - - /** - * Connection to DV service. - */ - struct GNUNET_MQ_Handle *mq; - - /** - * Our configuration. - */ - const struct GNUNET_CONFIGURATION_Handle *cfg; - - /** - * Closure for the callbacks. - */ - void *cls; - - /** - * Function to call on connect events. - */ - GNUNET_DV_ConnectCallback connect_cb; - - /** - * Function to call on distance change events. - */ - GNUNET_DV_DistanceChangedCallback distance_cb; - - /** - * Function to call on disconnect events. - */ - GNUNET_DV_DisconnectCallback disconnect_cb; - - /** - * Function to call on receiving messages events. - */ - GNUNET_DV_MessageReceivedCallback message_cb; - - /** - * Information tracked per connected peer. Maps peer - * identities to `struct ConnectedPeer` entries. - */ - struct GNUNET_CONTAINER_MultiPeerMap *peers; - -}; - - -/** - * Disconnect and then reconnect to the DV service. - * - * @param sh service handle - */ -static void -reconnect (struct GNUNET_DV_ServiceHandle *sh); - - -/** - * We got disconnected from the service and thus all of the - * connections need to be torn down. - * - * @param cls the `struct GNUNET_DV_ServiceHandle` - * @param key a peer identity - * @param value a `struct ConnectedPeer` to clean up - * @return #GNUNET_OK (continue to iterate) - */ -static int -cleanup_send_cb (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) -{ - struct GNUNET_DV_ServiceHandle *sh = cls; - struct ConnectedPeer *peer = value; - - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_remove (sh->peers, - key, - peer)); - sh->disconnect_cb (sh->cls, - key); - GNUNET_free (peer); - return GNUNET_OK; -} - - -/** - * Handles a message sent from the DV service to us. - * Parse it out and give it to the plugin. - * - * @param cls the handle to the DV API - * @param cm the message that was received - */ -static void -handle_connect (void *cls, - const struct GNUNET_DV_ConnectMessage *cm) -{ - struct GNUNET_DV_ServiceHandle *sh = cls; - struct ConnectedPeer *peer; - - peer = GNUNET_CONTAINER_multipeermap_get (sh->peers, - &cm->peer); - if (NULL != peer) - { - GNUNET_break (0); - reconnect (sh); - return; - } - peer = GNUNET_new (struct ConnectedPeer); - peer->pid = cm->peer; - GNUNET_assert (GNUNET_OK == - GNUNET_CONTAINER_multipeermap_put (sh->peers, - &peer->pid, - peer, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); - sh->connect_cb (sh->cls, - &cm->peer, - ntohl (cm->distance), - (enum GNUNET_NetworkType) ntohl (cm->network)); -} - - -/** - * Handles a message sent from the DV service to us. - * Parse it out and give it to the plugin. - * - * @param cls the handle to the DV API - * @param dm the message that was received - */ -static void -handle_disconnect (void *cls, - const struct GNUNET_DV_DisconnectMessage *dm) -{ - struct GNUNET_DV_ServiceHandle *sh = cls; - struct ConnectedPeer *peer; - - peer = GNUNET_CONTAINER_multipeermap_get (sh->peers, - &dm->peer); - if (NULL == peer) - { - GNUNET_break (0); - reconnect (sh); - return; - } - cleanup_send_cb (sh, - &dm->peer, - peer); -} - - -/** - * Handles a message sent from the DV service to us. - * Parse it out and give it to the plugin. - * - * @param cls the handle to the DV API - * @param msg the message that was received - */ -static void -handle_distance_update (void *cls, - const struct GNUNET_DV_DistanceUpdateMessage *dum) -{ - struct GNUNET_DV_ServiceHandle *sh = cls; - struct ConnectedPeer *peer; - - peer = GNUNET_CONTAINER_multipeermap_get (sh->peers, - &dum->peer); - if (NULL == peer) - { - GNUNET_break (0); - reconnect (sh); - return; - } - sh->distance_cb (sh->cls, - &dum->peer, - ntohl (dum->distance), - (enum GNUNET_NetworkType) ntohl (dum->network)); -} - - -/** - * Handles a message sent from the DV service to us. - * Parse it out and give it to the plugin. - * - * @param cls the handle to the DV API - * @param rm the message that was received - */ -static int -check_received (void *cls, - const struct GNUNET_DV_ReceivedMessage *rm) -{ - struct GNUNET_DV_ServiceHandle *sh = cls; - const struct GNUNET_MessageHeader *payload; - - if (NULL == - GNUNET_CONTAINER_multipeermap_get (sh->peers, - &rm->sender)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - if (ntohs (rm->header.size) - sizeof (struct GNUNET_DV_ReceivedMessage) < - sizeof (*payload)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - payload = (const struct GNUNET_MessageHeader *) &rm[1]; - if (ntohs (rm->header.size) != - sizeof (struct GNUNET_DV_ReceivedMessage) + ntohs (payload->size)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - return GNUNET_OK; -} - - -/** - * Handles a message sent from the DV service to us. - * Parse it out and give it to the plugin. - * - * @param cls the handle to the DV API - * @param rm the message that was received - */ -static void -handle_received (void *cls, - const struct GNUNET_DV_ReceivedMessage *rm) -{ - struct GNUNET_DV_ServiceHandle *sh = cls; - const struct GNUNET_MessageHeader *payload; - - payload = (const struct GNUNET_MessageHeader *) &rm[1]; - sh->message_cb (sh->cls, - &rm->sender, - ntohl (rm->distance), - payload); -} - - -/** - * Generic error handler, called with the appropriate error code and - * the same closure specified at the creation of the message queue. - * Not every message queue implementation supports an error handler. - * - * @param cls closure with the `struct GNUNET_DV_ServiceHandle *` - * @param error error code - */ -static void -mq_error_handler (void *cls, - enum GNUNET_MQ_Error error) -{ - struct GNUNET_DV_ServiceHandle *sh = cls; - - reconnect (sh); -} - - -/** - * Disconnect and then reconnect to the DV service. - * - * @param sh service handle - */ -static void -reconnect (struct GNUNET_DV_ServiceHandle *sh) -{ - struct GNUNET_MQ_MessageHandler handlers[] = { - GNUNET_MQ_hd_fixed_size (connect, - GNUNET_MESSAGE_TYPE_DV_CONNECT, - struct GNUNET_DV_ConnectMessage, - sh), - GNUNET_MQ_hd_fixed_size (disconnect, - GNUNET_MESSAGE_TYPE_DV_DISCONNECT, - struct GNUNET_DV_DisconnectMessage, - sh), - GNUNET_MQ_hd_fixed_size (distance_update, - GNUNET_MESSAGE_TYPE_DV_DISTANCE_CHANGED, - struct GNUNET_DV_DistanceUpdateMessage, - sh), - GNUNET_MQ_hd_var_size (received, - GNUNET_MESSAGE_TYPE_DV_RECV, - struct GNUNET_DV_ReceivedMessage, - sh), - GNUNET_MQ_handler_end () - }; - struct GNUNET_MessageHeader *sm; - struct GNUNET_MQ_Envelope *env; - - if (NULL != sh->mq) - { - GNUNET_MQ_destroy (sh->mq); - sh->mq = NULL; - } - GNUNET_CONTAINER_multipeermap_iterate (sh->peers, - &cleanup_send_cb, - sh); - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Connecting to DV service\n"); - sh->mq = GNUNET_CLIENT_connect (sh->cfg, - "dv", - handlers, - &mq_error_handler, - sh); - if (NULL == sh->mq) - { - GNUNET_break (0); - return; - } - env = GNUNET_MQ_msg (sm, - GNUNET_MESSAGE_TYPE_DV_START); - GNUNET_MQ_send (sh->mq, - env); -} - - -/** - * Connect to the DV service. - * - * @param cfg configuration - * @param cls closure for callbacks - * @param connect_cb function to call on connects - * @param distance_cb function to call if distances change - * @param disconnect_cb function to call on disconnects - * @param message_cb function to call if we receive messages - * @return handle to access the service - */ -struct GNUNET_DV_ServiceHandle * -GNUNET_DV_service_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, - void *cls, - GNUNET_DV_ConnectCallback connect_cb, - GNUNET_DV_DistanceChangedCallback distance_cb, - GNUNET_DV_DisconnectCallback disconnect_cb, - GNUNET_DV_MessageReceivedCallback message_cb) -{ - struct GNUNET_DV_ServiceHandle *sh; - - sh = GNUNET_new (struct GNUNET_DV_ServiceHandle); - sh->cfg = cfg; - sh->cls = cls; - sh->connect_cb = connect_cb; - sh->distance_cb = distance_cb; - sh->disconnect_cb = disconnect_cb; - sh->message_cb = message_cb; - sh->peers = GNUNET_CONTAINER_multipeermap_create (128, - GNUNET_YES); - reconnect (sh); - return sh; -} - - -/** - * Disconnect from DV service. - * - * @param sh service handle - */ -void -GNUNET_DV_service_disconnect (struct GNUNET_DV_ServiceHandle *sh) -{ - if (NULL == sh) - return; - if (NULL != sh->mq) - { - GNUNET_MQ_destroy (sh->mq); - sh->mq = NULL; - } - GNUNET_CONTAINER_multipeermap_iterate (sh->peers, - &cleanup_send_cb, - sh); - GNUNET_CONTAINER_multipeermap_destroy (sh->peers); - GNUNET_free (sh); -} - - -/** - * Send a message via DV service. - * - * @param sh service handle - * @param target intended recpient - * @param msg message payload - */ -void -GNUNET_DV_send (struct GNUNET_DV_ServiceHandle *sh, - const struct GNUNET_PeerIdentity *target, - const struct GNUNET_MessageHeader *msg) -{ - struct GNUNET_DV_SendMessage *sm; - struct ConnectedPeer *peer; - struct GNUNET_MQ_Envelope *env; - - if (ntohs (msg->size) + sizeof (*sm) >= GNUNET_MAX_MESSAGE_SIZE) - { - GNUNET_break (0); - return; - } - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Asked to send %u bytes of type %u to %s\n", - (unsigned int) ntohs (msg->size), - (unsigned int) ntohs (msg->type), - GNUNET_i2s (target)); - peer = GNUNET_CONTAINER_multipeermap_get (sh->peers, - target); - if (NULL == peer) - { - GNUNET_break (0); - return; - } - GNUNET_assert (NULL != sh->mq); - env = GNUNET_MQ_msg_nested_mh (sm, - GNUNET_MESSAGE_TYPE_DV_SEND, - msg); - sm->target = *target; - GNUNET_MQ_send (sh->mq, - env); -} - - -/* end of dv_api.c */ diff --git a/src/dv/gnunet-dv.c b/src/dv/gnunet-dv.c deleted file mode 100644 index 90d8144e5..000000000 --- a/src/dv/gnunet-dv.c +++ /dev/null @@ -1,185 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) 2013 GNUnet e.V. - - GNUnet is free software: you can redistribute it and/or modify it - under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, - 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 - Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - - SPDX-License-Identifier: AGPL3.0-or-later -*/ -/** - * @file dv/gnunet-dv.c - * @brief DV monitoring command line tool - * @author Christian Grothoff - */ -#include "platform.h" -#include "gnunet_util_lib.h" -#include "gnunet_dv_service.h" - -/** - * Handle to DV service. - */ -static struct GNUNET_DV_ServiceHandle *sh; - -/** - * Was verbose specified? - */ -static unsigned int verbose; - - -/** - * Function called if DV starts to be able to talk to a peer. - * - * @param cls closure - * @param peer newly connected peer - * @param distance distance to the peer - * @param network the network the next hop is located in - */ -static void -connect_cb (void *cls, - const struct GNUNET_PeerIdentity *peer, - uint32_t distance, - enum GNUNET_NetworkType network) -{ - fprintf (stderr, "Connect: %s at %u\n", - GNUNET_i2s (peer), - (unsigned int) distance); -} - - -/** - * Function called if DV distance to a peer is changed. - * - * @param cls closure - * @param peer connected peer - * @param distance new distance to the peer - * @param network network used on first hop to peer - */ -static void -change_cb (void *cls, - const struct GNUNET_PeerIdentity *peer, - uint32_t distance, - enum GNUNET_NetworkType network) -{ - fprintf (stderr, "Change: %s at %u\n", - GNUNET_i2s (peer), - (unsigned int) distance); -} - - -/** - * Function called if DV is no longer able to talk to a peer. - * - * @param cls closure - * @param peer peer that disconnected - */ -static void -disconnect_cb (void *cls, - const struct GNUNET_PeerIdentity *peer) -{ - fprintf (stderr, "Disconnect: %s\n", - GNUNET_i2s (peer)); -} - - -/** - * Function called if DV receives a message for this peer. - * - * @param cls closure - * @param sender sender of the message - * @param distance how far did the message travel - * @param msg actual message payload - */ -static void -message_cb (void *cls, - const struct GNUNET_PeerIdentity *sender, - uint32_t distance, - const struct GNUNET_MessageHeader *msg) -{ - if (verbose) - fprintf (stderr, "Message: %s at %u sends %u bytes of type %u\n", - GNUNET_i2s (sender), - (unsigned int) distance, - (unsigned int) ntohs (msg->size), - (unsigned int) ntohs (msg->type)); -} - - -/** - * Task run on shutdown. - * - * @param cls NULL - */ -static void -shutdown_task (void *cls) -{ - GNUNET_DV_service_disconnect (sh); - sh = NULL; -} - - -/** - * Main function that will be run by the scheduler. - * - * @param cls closure - * @param args remaining command-line arguments - * @param cfgfile name of the configuration file used (for saving, can be NULL!) - * @param cfg configuration - */ -static void -run (void *cls, char *const *args, const char *cfgfile, - const struct GNUNET_CONFIGURATION_Handle *cfg) -{ - sh = GNUNET_DV_service_connect (cfg, NULL, - &connect_cb, - &change_cb, - &disconnect_cb, - &message_cb); - GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL); -} - - -/** - * The main function. - * - * @param argc number of arguments from the command line - * @param argv command line arguments - * @return 0 ok, 1 on error - */ -int -main (int argc, char *const *argv) -{ - int res; - - struct GNUNET_GETOPT_CommandLineOption options[] = { - - GNUNET_GETOPT_option_verbose (&verbose), - - GNUNET_GETOPT_OPTION_END - }; - - if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) - return 2; - - res = GNUNET_PROGRAM_run (argc, argv, "gnunet-dv", - gettext_noop ("Print information about DV state"), - options, &run, - NULL); - GNUNET_free ((void *) argv); - - if (GNUNET_OK != res) - return 1; - return 0; -} - -/* end of gnunet-dv.c */ diff --git a/src/dv/gnunet-service-dv.c b/src/dv/gnunet-service-dv.c deleted file mode 100644 index dd2ff9c12..000000000 --- a/src/dv/gnunet-service-dv.c +++ /dev/null @@ -1,2146 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) 2013, 2016 GNUnet e.V. - - GNUnet is free software: you can redistribute it and/or modify it - under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, - 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 - Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - - SPDX-License-Identifier: AGPL3.0-or-later -*/ - -/** - * @file dv/gnunet-service-dv.c - * @brief the distance vector service, primarily handles gossip of nearby - * peers and sending/receiving DV messages from core and decapsulating - * them - * - * @author Christian Grothoff - * @author Nathan Evans - */ -#include "platform.h" -#include "gnunet_util_lib.h" -#include "gnunet_protocols.h" -#include "gnunet_core_service.h" -#include "gnunet_hello_lib.h" -#include "gnunet_peerinfo_service.h" -#include "gnunet_statistics_service.h" -#include "gnunet_set_service.h" -#include "gnunet_ats_service.h" -#include "dv.h" -#include - - -/** - * How often do we establish the consensu? - */ -#define GNUNET_DV_CONSENSUS_FREQUENCY GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MINUTES, 5) - -/** - * Maximum number of messages we queue per peer. - */ -#define MAX_QUEUE_SIZE 16 - -/** - * Maximum number of messages we queue towards the clients/plugin. - */ -#define MAX_QUEUE_SIZE_PLUGIN 1024 - -/** - * The default fisheye depth, from how many hops away will - * we keep peers? - */ -#define DEFAULT_FISHEYE_DEPTH 3 - -/** - * How many hops is a direct neighbor away? - */ -#define DIRECT_NEIGHBOR_COST 1 - - -GNUNET_NETWORK_STRUCT_BEGIN - -/** - * Information about a peer DV can route to. These entries are what - * we use as the binary format to establish consensus to create our - * routing table and as the address format in the HELLOs. - */ -struct Target -{ - - /** - * Identity of the peer we can reach. - */ - struct GNUNET_PeerIdentity peer; - - /** - * How many hops (1-3) is this peer away? in network byte order - */ - uint32_t distance GNUNET_PACKED; - -}; - - -/** - * Message exchanged between DV services (via core), requesting a - * message to be routed. - */ -struct RouteMessage -{ - /** - * Type: #GNUNET_MESSAGE_TYPE_DV_ROUTE - */ - struct GNUNET_MessageHeader header; - - /** - * Expected (remaining) distance. Must be always smaller than - * #DEFAULT_FISHEYE_DEPTH, should be zero at the target. Must - * be decremented by one at each hop. Peers must not forward - * these messages further once the counter has reached zero. - */ - uint32_t distance GNUNET_PACKED; - - /** - * The (actual) target of the message (this peer, if distance is zero). - */ - struct GNUNET_PeerIdentity target; - - /** - * The (actual) sender of the message. - */ - struct GNUNET_PeerIdentity sender; - -}; - -GNUNET_NETWORK_STRUCT_END - - -/** - * Information about a direct neighbor (core-level, excluding - * DV-links, only DV-enabled peers). - */ -struct DirectNeighbor -{ - - /** - * Identity of the peer. - */ - struct GNUNET_PeerIdentity peer; - - /** - * Session ID we use whenever we create a set union with - * this neighbor; constructed from the XOR of our peer - * IDs and then salted with "DV-SALT" to avoid conflicts - * with other applications. - */ - struct GNUNET_HashCode real_session_id; - - /** - * Transmit handle to core service. - */ - struct GNUNET_MQ_Handle *mq; - - /** - * Routing table of the neighbor, NULL if not yet established. - * Keys are peer identities, values are 'struct Target' entries. - * Note that the distances in the targets are from the point-of-view - * of the peer, not from us! - */ - struct GNUNET_CONTAINER_MultiPeerMap *neighbor_table; - - /** - * Updated routing table of the neighbor, under construction, - * NULL if we are not currently building it. - * Keys are peer identities, values are 'struct Target' entries. - * Note that the distances in the targets are from the point-of-view - * of the other peer, not from us! - */ - struct GNUNET_CONTAINER_MultiPeerMap *neighbor_table_consensus; - - /** - * Our current (exposed) routing table as a set. - */ - struct GNUNET_SET_Handle *my_set; - - /** - * Handle for our current active set union operation. - */ - struct GNUNET_SET_OperationHandle *set_op; - - /** - * Handle used if we are listening for this peer, waiting for the - * other peer to initiate construction of the set union. NULL if - * we ar the initiating peer. - */ - struct GNUNET_SET_ListenHandle *listen_handle; - - /** - * ID of the task we use to (periodically) update our consensus - * with this peer. Used if we are the initiating peer. - */ - struct GNUNET_SCHEDULER_Task *initiate_task; - - /** - * At what offset are we, with respect to inserting our own routes - * into the consensus? - */ - unsigned int consensus_insertion_offset; - - /** - * At what distance are we, with respect to inserting our own routes - * into the consensus? - */ - unsigned int consensus_insertion_distance; - - /** - * Elements in consensus - */ - unsigned int consensus_elements; - - /** - * Direct one hop route - */ - struct Route *direct_route; - - /** - * Flag set within 'check_target_removed' to trigger full global route refresh. - */ - int target_removed; - - /** - * Our distance to this peer, 0 for unknown. - */ - uint32_t distance; - - /** - * The network this peer is in - */ - enum GNUNET_NetworkType network; - - /** - * Is this neighbor connected at the core level? - */ - int connected; - -}; - - -/** - * A route includes information about the next hop, - * the target, and the ultimate distance to the - * target. - */ -struct Route -{ - - /** - * Which peer do we need to forward the message to? - */ - struct DirectNeighbor *next_hop; - - /** - * What would be the target, and how far is it away? - */ - struct Target target; - - /** - * Offset of this target in the respective consensus set. - */ - unsigned int set_offset; - -}; - - -/** - * Set of targets we bring to a consensus; all targets in a set have a - * distance equal to the sets distance (which is implied by the array - * index of the set). - */ -struct ConsensusSet -{ - - /** - * Array of targets in the set, may include NULL entries if a - * neighbor has disconnected; the targets are allocated with the - * respective container (all_routes), not here. - */ - struct Route **targets; - - /** - * Size of the @e targets array. - */ - unsigned int array_length; - -}; - - -/** - * Peermap of all of our neighbors; processing these usually requires - * first checking to see if the peer is core-connected and if the - * distance is 1, in which case they are direct neighbors. - */ -static struct GNUNET_CONTAINER_MultiPeerMap *direct_neighbors; - -/** - * Hashmap with all routes that we currently support; contains - * routing information for all peers from distance 2 - * up to distance #DEFAULT_FISHEYE_DEPTH. - */ -static struct GNUNET_CONTAINER_MultiPeerMap *all_routes; - -/** - * Array of consensus sets we expose to the outside world. Sets - * are structured by the distance to the target. - */ -static struct ConsensusSet consensi[DEFAULT_FISHEYE_DEPTH]; - -/** - * Handle to the core service api. - */ -static struct GNUNET_CORE_Handle *core_api; - -/** - * The identity of our peer. - */ -static struct GNUNET_PeerIdentity my_identity; - -/** - * The configuration for this service. - */ -static const struct GNUNET_CONFIGURATION_Handle *cfg; - -/** - * The client, the DV plugin connected to us (or an event monitor). - * Hopefully this client will never change, although if the plugin - * dies and returns for some reason it may happen. - */ -static struct GNUNET_NotificationContext *nc; - -/** - * Handle for the statistics service. - */ -static struct GNUNET_STATISTICS_Handle *stats; - -/** - * Handle to ATS service. - */ -static struct GNUNET_ATS_PerformanceHandle *ats; - -/** - * Task scheduled to refresh routes based on direct neighbours. - */ -static struct GNUNET_SCHEDULER_Task *rr_task; - -/** - * #GNUNET_YES if we are shutting down. - */ -static int in_shutdown; - -/** - * Start creating a new DV set union by initiating the connection. - * - * @param cls the 'struct DirectNeighbor' of the peer we're building - * a routing consensus with - */ -static void -initiate_set_union (void *cls); - - -/** - * Start creating a new DV set union construction, our neighbour has - * asked for it (callback for listening peer). - * - * @param cls the 'struct DirectNeighbor' of the peer we're building - * a routing consensus with - * @param other_peer the other peer - * @param context_msg message with application specific information from - * the other peer - * @param request request from the other peer, use GNUNET_SET_accept - * to accept it, otherwise the request will be refused - * Note that we don't use a return value here, as it is also - * necessary to specify the set we want to do the operation with, - * whith sometimes can be derived from the context message. - * Also necessary to specify the timeout. - */ -static void -listen_set_union (void *cls, - const struct GNUNET_PeerIdentity *other_peer, - const struct GNUNET_MessageHeader *context_msg, - struct GNUNET_SET_Request *request); - - -/** - * Forward a message from another peer to the plugin. - * - * @param message the message to send to the plugin - * @param origin the original sender of the message - * @param distance distance to the original sender of the message - */ -static void -send_data_to_plugin (const struct GNUNET_MessageHeader *message, - const struct GNUNET_PeerIdentity *origin, - uint32_t distance) -{ - struct GNUNET_DV_ReceivedMessage *received_msg; - size_t size; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Delivering message from peer `%s' at distance %u\n", - GNUNET_i2s (origin), - (unsigned int) distance); - size = sizeof (struct GNUNET_DV_ReceivedMessage) + - ntohs (message->size); - if (size >= GNUNET_MAX_MESSAGE_SIZE) - { - GNUNET_break (0); /* too big */ - return; - } - received_msg = GNUNET_malloc (size); - received_msg->header.size = htons (size); - received_msg->header.type = htons (GNUNET_MESSAGE_TYPE_DV_RECV); - received_msg->distance = htonl (distance); - received_msg->sender = *origin; - GNUNET_memcpy (&received_msg[1], message, ntohs (message->size)); - GNUNET_notification_context_broadcast (nc, - &received_msg->header, - GNUNET_YES); - GNUNET_free (received_msg); -} - - -/** - * Forward a control message to the plugin. - * - * @param message the message to send to the plugin - */ -static void -send_control_to_plugin (const struct GNUNET_MessageHeader *message) -{ - GNUNET_notification_context_broadcast (nc, - message, - GNUNET_NO); -} - - -/** - * Send a DISTANCE_CHANGED message to the plugin. - * - * @param peer peer with a changed distance - * @param distance new distance to the peer - * @param network network used by the neighbor - */ -static void -send_distance_change_to_plugin (const struct GNUNET_PeerIdentity *peer, - uint32_t distance, - enum GNUNET_NetworkType network) -{ - struct GNUNET_DV_DistanceUpdateMessage du_msg; - - GNUNET_break (GNUNET_NT_UNSPECIFIED != network); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Delivering DISTANCE_CHANGED for message about peer `%s'\n", - GNUNET_i2s (peer)); - du_msg.header.size = htons (sizeof (du_msg)); - du_msg.header.type = htons (GNUNET_MESSAGE_TYPE_DV_DISTANCE_CHANGED); - du_msg.distance = htonl (distance); - du_msg.peer = *peer; - du_msg.network = htonl ((uint32_t) network); - send_control_to_plugin (&du_msg.header); -} - - -/** - * Give a CONNECT message to the plugin. - * - * @param target peer that connected - * @param distance distance to the target - * @param network the network the next hop is located in - */ -static void -send_connect_to_plugin (const struct GNUNET_PeerIdentity *target, - uint32_t distance, - enum GNUNET_NetworkType network) -{ - struct GNUNET_DV_ConnectMessage cm; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Delivering CONNECT about peer %s with distance %u\n", - GNUNET_i2s (target), distance); - cm.header.size = htons (sizeof (cm)); - cm.header.type = htons (GNUNET_MESSAGE_TYPE_DV_CONNECT); - cm.distance = htonl (distance); - cm.network = htonl ((uint32_t) network); - cm.peer = *target; - send_control_to_plugin (&cm.header); -} - - -/** - * Give a DISCONNECT message to the plugin. - * - * @param target peer that disconnected - */ -static void -send_disconnect_to_plugin (const struct GNUNET_PeerIdentity *target) -{ - struct GNUNET_DV_DisconnectMessage dm; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Delivering DISCONNECT about peer `%s'\n", - GNUNET_i2s (target)); - dm.header.size = htons (sizeof (dm)); - dm.header.type = htons (GNUNET_MESSAGE_TYPE_DV_DISCONNECT); - dm.reserved = htonl (0); - dm.peer = *target; - send_control_to_plugin (&dm.header); -} - - -/** - * Forward the given payload to the given target. - * - * @param target where to send the message - * @param distance distance to the @a sender - * @param sender original sender of the message - * @param actual_target ultimate recipient for the message - * @param payload payload of the message - */ -static void -forward_payload (struct DirectNeighbor *target, - uint32_t distance, - const struct GNUNET_PeerIdentity *sender, - const struct GNUNET_PeerIdentity *actual_target, - const struct GNUNET_MessageHeader *payload) -{ - struct GNUNET_MQ_Envelope *env; - struct RouteMessage *rm; - - if ( (GNUNET_MQ_get_length (target->mq) >= MAX_QUEUE_SIZE) && - (0 != memcmp (sender, - &my_identity, - sizeof (struct GNUNET_PeerIdentity))) ) - { - /* not _our_ client and queue is full, drop */ - GNUNET_STATISTICS_update (stats, - "# messages dropped", - 1, - GNUNET_NO); - return; - } - if (sizeof (struct RouteMessage) + ntohs (payload->size) - >= GNUNET_MAX_MESSAGE_SIZE) - { - GNUNET_break (0); - return; - } - env = GNUNET_MQ_msg_nested_mh (rm, - GNUNET_MESSAGE_TYPE_DV_ROUTE, - payload); - rm->distance = htonl (distance); - rm->target = *actual_target; - rm->sender = *sender; - GNUNET_MQ_send (target->mq, - env); -} - - -/** - * Find a free slot for storing a 'route' in the 'consensi' - * set at the given distance. - * - * @param distance distance to use for the set slot - */ -static unsigned int -get_consensus_slot (uint32_t distance) -{ - struct ConsensusSet *cs; - unsigned int i; - - GNUNET_assert (distance < DEFAULT_FISHEYE_DEPTH); - cs = &consensi[distance]; - i = 0; - while ( (i < cs->array_length) && - (NULL != cs->targets[i]) ) i++; - if (i == cs->array_length) - { - GNUNET_array_grow (cs->targets, - cs->array_length, - cs->array_length * 2 + 2); - } - return i; -} - - -/** - * Allocate a slot in the consensus set for a route. - * - * @param route route to initialize - * @param distance which consensus set to use - */ -static void -allocate_route (struct Route *route, - uint32_t distance) -{ - unsigned int i; - - if (distance >= DEFAULT_FISHEYE_DEPTH) - { - route->target.distance = htonl (distance); - route->set_offset = UINT_MAX; /* invalid slot */ - return; - } - i = get_consensus_slot (distance); - route->set_offset = i; - consensi[distance].targets[i] = route; - route->target.distance = htonl (distance); -} - - -/** - * Release a slot in the consensus set for a route. - * - * @param route route to release the slot from - */ -static void -release_route (struct Route *route) -{ - if (UINT_MAX == route->set_offset) - return; - GNUNET_assert (ntohl (route->target.distance) < DEFAULT_FISHEYE_DEPTH); - consensi[ntohl (route->target.distance)].targets[route->set_offset] = NULL; - route->set_offset = UINT_MAX; /* indicate invalid slot */ -} - - -/** - * Move a route from one consensus set to another. - * - * @param route route to move - * @param new_distance new distance for the route (destination set) - */ -static void -move_route (struct Route *route, - uint32_t new_distance) -{ - release_route (route); - allocate_route (route, new_distance); -} - - -/** - * Initialize this neighbors 'my_set' and when done give - * it to the pending set operation for execution. - * - * Add a single element to the set per call: - * - * If we reached the last element of a consensus element: increase distance - * - * - * @param cls the neighbor for which we are building the set - */ -static void -build_set (void *cls) -{ - struct DirectNeighbor *neighbor = cls; - struct GNUNET_SET_Element element; - struct Target *target; - struct Route *route; - - target = NULL; - /* skip over NULL entries */ - while ( (DEFAULT_FISHEYE_DEPTH > neighbor->consensus_insertion_distance) && - (consensi[neighbor->consensus_insertion_distance].array_length > neighbor->consensus_insertion_offset) && - (NULL == consensi[neighbor->consensus_insertion_distance].targets[neighbor->consensus_insertion_offset]) ) - neighbor->consensus_insertion_offset++; - while ( (DEFAULT_FISHEYE_DEPTH > neighbor->consensus_insertion_distance) && - (consensi[neighbor->consensus_insertion_distance].array_length == neighbor->consensus_insertion_offset) ) - { - /* If we reached the last element of a consensus array element: increase distance and start with next array */ - neighbor->consensus_insertion_offset = 0; - neighbor->consensus_insertion_distance++; - /* skip over NULL entries */ - while ( (DEFAULT_FISHEYE_DEPTH > neighbor->consensus_insertion_distance) && - (consensi[neighbor->consensus_insertion_distance].array_length > neighbor->consensus_insertion_offset) && - (NULL == consensi[neighbor->consensus_insertion_distance].targets[neighbor->consensus_insertion_offset]) ) - neighbor->consensus_insertion_offset++; - } - if (DEFAULT_FISHEYE_DEPTH == neighbor->consensus_insertion_distance) - { - /* we have added all elements to the set, run the operation */ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Finished building my SET for peer `%s' with %u elements, committing\n", - GNUNET_i2s (&neighbor->peer), - neighbor->consensus_elements); - GNUNET_SET_commit (neighbor->set_op, - neighbor->my_set); - GNUNET_SET_destroy (neighbor->my_set); - neighbor->my_set = NULL; - return; - } - - route = consensi[neighbor->consensus_insertion_distance].targets[neighbor->consensus_insertion_offset]; - GNUNET_assert (NULL != route); - target = &route->target; - GNUNET_assert (ntohl (target->distance) < DEFAULT_FISHEYE_DEPTH); - element.size = sizeof (struct Target); - element.element_type = htons (0); - element.data = target; - - /* Find next non-NULL entry */ - neighbor->consensus_insertion_offset++; - if ( (0 != memcmp (&target->peer, - &my_identity, - sizeof (my_identity))) && - (0 != memcmp (&target->peer, - &neighbor->peer, - sizeof (struct GNUNET_PeerIdentity))) ) - { - /* Add target if it is not the neighbor or this peer */ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Adding peer `%s' with distance %u to SET\n", - GNUNET_i2s (&target->peer), - ntohl (target->distance) + 1); - GNUNET_SET_add_element (neighbor->my_set, - &element, - &build_set, neighbor); - neighbor->consensus_elements++; - } - else - build_set (neighbor); -} - - -/** - * A peer is now connected to us at distance 1. Initiate DV exchange. - * - * @param neighbor entry for the neighbor at distance 1 - */ -static void -handle_direct_connect (struct DirectNeighbor *neighbor) -{ - struct Route *route; - struct GNUNET_HashCode h1; - struct GNUNET_HashCode h2; - struct GNUNET_HashCode session_id; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Direct connection to %s established, routing table exchange begins.\n", - GNUNET_i2s (&neighbor->peer)); - GNUNET_STATISTICS_update (stats, - "# peers connected (1-hop)", - 1, GNUNET_NO); - route = GNUNET_CONTAINER_multipeermap_get (all_routes, - &neighbor->peer); - if (NULL != route) - { - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_remove (all_routes, - &neighbor->peer, - route)); - send_disconnect_to_plugin (&neighbor->peer); - release_route (route); - GNUNET_free (route); - } - - neighbor->direct_route = GNUNET_new (struct Route); - neighbor->direct_route->next_hop = neighbor; - neighbor->direct_route->target.peer = neighbor->peer; - allocate_route (neighbor->direct_route, DIRECT_NEIGHBOR_COST); - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Adding direct route to %s\n", - GNUNET_i2s (&neighbor->direct_route->target.peer)); - - - /* construct session ID seed as XOR of both peer's identities */ - GNUNET_CRYPTO_hash (&my_identity, - sizeof (my_identity), - &h1); - GNUNET_CRYPTO_hash (&neighbor->peer, - sizeof (struct GNUNET_PeerIdentity), - &h2); - GNUNET_CRYPTO_hash_xor (&h1, - &h2, - &session_id); - /* make sure session ID is unique across applications by salting it with 'DV' */ - GNUNET_CRYPTO_hkdf (&neighbor->real_session_id, sizeof (struct GNUNET_HashCode), - GCRY_MD_SHA512, GCRY_MD_SHA256, - "DV-SALT", 2, - &session_id, sizeof (session_id), - NULL, 0); - if (0 < memcmp (&neighbor->peer, - &my_identity, - sizeof (struct GNUNET_PeerIdentity))) - { - if (NULL != neighbor->listen_handle) - { - GNUNET_break (0); - } - else - neighbor->initiate_task = GNUNET_SCHEDULER_add_now (&initiate_set_union, - neighbor); - } - else - { - if (NULL != neighbor->listen_handle) - { - GNUNET_break (0); - } - else - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Starting SET listen operation with peer `%s'\n", - GNUNET_i2s (&neighbor->peer)); - neighbor->listen_handle = GNUNET_SET_listen (cfg, - GNUNET_SET_OPERATION_UNION, - &neighbor->real_session_id, - &listen_set_union, - neighbor); - } - } -} - - -/** - * Method called whenever a peer connects. - * - * @param cls closure - * @param peer peer identity this notification is about - * @param mq message queue for sending data to @a peer - * @return our `struct DirectNeighbour` for this peer - */ -static void * -handle_core_connect (void *cls, - const struct GNUNET_PeerIdentity *peer, - struct GNUNET_MQ_Handle *mq) -{ - struct DirectNeighbor *neighbor; - - /* Check for connect to self message */ - if (0 == memcmp (&my_identity, - peer, - sizeof (struct GNUNET_PeerIdentity))) - return NULL; - /* check if entry exists */ - neighbor = GNUNET_CONTAINER_multipeermap_get (direct_neighbors, - peer); - if (NULL != neighbor) - { - GNUNET_break (GNUNET_NT_UNSPECIFIED != neighbor->network); - GNUNET_break (GNUNET_YES != neighbor->connected); - neighbor->connected = GNUNET_YES; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Core connected to %s (distance %u)\n", - GNUNET_i2s (peer), - (unsigned int) neighbor->distance); - if (DIRECT_NEIGHBOR_COST != neighbor->distance) - return NULL; - handle_direct_connect (neighbor); - return NULL; - } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Core connected to %s (distance unknown)\n", - GNUNET_i2s (peer)); - neighbor = GNUNET_new (struct DirectNeighbor); - neighbor->peer = *peer; - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_put (direct_neighbors, - &neighbor->peer, - neighbor, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); - neighbor->connected = GNUNET_YES; - neighbor->distance = 0; /* unknown */ - neighbor->network = GNUNET_NT_UNSPECIFIED; - return neighbor; -} - - -/** - * Called for each 'target' in a neighbor table to free the associated memory. - * - * @param cls NULL - * @param key key of the value - * @param value value to free - * @return #GNUNET_OK to continue to iterate - */ -static int -free_targets (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) -{ - GNUNET_free (value); - return GNUNET_OK; -} - - -/** - * Add a new route to the given @a target via the given @a neighbor. - * - * @param target the target of the route - * @param neighbor the next hop for communicating with the @a target - */ -static void -add_new_route (struct Target *target, - struct DirectNeighbor *neighbor) -{ - struct Route *route; - - route = GNUNET_new (struct Route); - route->next_hop = neighbor; - route->target.peer = target->peer; - allocate_route (route, ntohl (target->distance) + 1); - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_put (all_routes, - &route->target.peer, - route, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); - send_connect_to_plugin (&route->target.peer, - ntohl (route->target.distance), - neighbor->network); -} - - -/** - * Multipeerhmap iterator for checking if a given route is - * (now) useful to this peer. - * - * @param cls the direct neighbor for the given route - * @param key key value stored under - * @param value a 'struct Target' that may or may not be useful; not that - * the distance in 'target' does not include the first hop yet - * @return #GNUNET_YES to continue iteration, #GNUNET_NO to stop - */ -static int -check_possible_route (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) -{ - struct DirectNeighbor *neighbor = cls; - struct Target *target = value; - struct Route *route; - - if (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_contains (direct_neighbors, - key)) - return GNUNET_YES; /* direct route, do not care about alternatives */ - route = GNUNET_CONTAINER_multipeermap_get (all_routes, - key); - if (NULL != route) - { - /* we have an existing route, check how it compares with going via 'target' */ - if (ntohl (route->target.distance) > ntohl (target->distance) + 1) - { - /* via 'target' is cheaper than the existing route; switch to alternative route! */ - move_route (route, ntohl (target->distance) + 1); - route->next_hop = neighbor; - send_distance_change_to_plugin (&target->peer, - ntohl (target->distance) + 1, - neighbor->network); - } - return GNUNET_YES; /* got a route to this target already */ - } - if (ntohl (target->distance) >= DEFAULT_FISHEYE_DEPTH) - return GNUNET_YES; /* distance is too large to be interesting */ - add_new_route (target, neighbor); - return GNUNET_YES; -} - - -/** - * Multipeermap iterator for finding routes that were previously - * "hidden" due to a better route (called after a disconnect event). - * - * @param cls NULL - * @param key peer identity of the given direct neighbor - * @param value a `struct DirectNeighbor` to check for additional routes - * @return #GNUNET_YES to continue iteration - */ -static int -refresh_routes (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) -{ - struct DirectNeighbor *neighbor = value; - - if ( (GNUNET_YES != neighbor->connected) || - (DIRECT_NEIGHBOR_COST != neighbor->distance) ) - return GNUNET_YES; - if (NULL != neighbor->neighbor_table) - GNUNET_CONTAINER_multipeermap_iterate (neighbor->neighbor_table, - &check_possible_route, - neighbor); - return GNUNET_YES; -} - - -/** - * Task to run #refresh_routes() on all direct neighbours. - * - * @param cls NULL - */ -static void -refresh_routes_task (void *cls) -{ - rr_task = NULL; - GNUNET_CONTAINER_multipeermap_iterate (direct_neighbors, - &refresh_routes, - NULL); -} - - -/** - * Asynchronously run #refresh_routes() at the next opportunity - * on all direct neighbours. - */ -static void -schedule_refresh_routes () -{ - if (NULL == rr_task) - rr_task = GNUNET_SCHEDULER_add_now (&refresh_routes_task, - NULL); -} - - -/** - * Multipeermap iterator for freeing routes that go via a particular - * neighbor that disconnected and is thus no longer available. - * - * @param cls the direct neighbor that is now unavailable - * @param key key value stored under - * @param value a `struct Route` that may or may not go via neighbor - * - * @return #GNUNET_YES to continue iteration, #GNUNET_NO to stop - */ -static int -cull_routes (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) -{ - struct DirectNeighbor *neighbor = cls; - struct Route *route = value; - - if (route->next_hop != neighbor) - return GNUNET_YES; /* not affected */ - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_remove (all_routes, key, value)); - release_route (route); - send_disconnect_to_plugin (&route->target.peer); - GNUNET_free (route); - return GNUNET_YES; -} - - -/** - * Handle the case that a direct connection to a peer is - * disrupted. Remove all routes via that peer and - * stop the consensus with it. - * - * @param neighbor peer that was disconnected (or at least is no - * longer at distance 1) - */ -static void -handle_direct_disconnect (struct DirectNeighbor *neighbor) -{ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Culling routes via %s due to direct disconnect\n", - GNUNET_i2s (&neighbor->peer)); - GNUNET_CONTAINER_multipeermap_iterate (all_routes, - &cull_routes, - neighbor); - if (NULL != neighbor->direct_route) - { - release_route (neighbor->direct_route); - GNUNET_free (neighbor->direct_route); - neighbor->direct_route = NULL; - } - if (NULL != neighbor->neighbor_table_consensus) - { - GNUNET_CONTAINER_multipeermap_iterate (neighbor->neighbor_table_consensus, - &free_targets, - NULL); - GNUNET_CONTAINER_multipeermap_destroy (neighbor->neighbor_table_consensus); - neighbor->neighbor_table_consensus = NULL; - } - if (NULL != neighbor->neighbor_table) - { - GNUNET_CONTAINER_multipeermap_iterate (neighbor->neighbor_table, - &free_targets, - NULL); - GNUNET_CONTAINER_multipeermap_destroy (neighbor->neighbor_table); - neighbor->neighbor_table = NULL; - } - if (NULL != neighbor->set_op) - { - GNUNET_SET_operation_cancel (neighbor->set_op); - neighbor->set_op = NULL; - } - if (NULL != neighbor->my_set) - { - GNUNET_SET_destroy (neighbor->my_set); - neighbor->my_set = NULL; - } - if (NULL != neighbor->listen_handle) - { - GNUNET_SET_listen_cancel (neighbor->listen_handle); - neighbor->listen_handle = NULL; - } - if (NULL != neighbor->initiate_task) - { - GNUNET_SCHEDULER_cancel (neighbor->initiate_task); - neighbor->initiate_task = NULL; - } -} - - -/** - * Function that is called with QoS information about an address; used - * to update our current distance to another peer. - * - * @param cls closure - * @param address the address - * @param active #GNUNET_YES if this address is actively used - * to maintain a connection to a peer; - * #GNUNET_NO if the address is not actively used; - * #GNUNET_SYSERR if this address is no longer available for ATS - * @param bandwidth_out assigned outbound bandwidth for the connection - * @param bandwidth_in assigned inbound bandwidth for the connection - * @param prop performance data for the address (as far as known) - */ -static void -handle_ats_update (void *cls, - const struct GNUNET_HELLO_Address *address, - int active, - struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, - struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in, - const struct GNUNET_ATS_Properties *prop) -{ - struct DirectNeighbor *neighbor; - uint32_t distance; - enum GNUNET_NetworkType network; - - if (NULL == address) - { - /* ATS service temporarily disconnected */ - return; - } - - if (GNUNET_YES != active) - { - // FIXME: handle disconnect/inactive case too! - return; - } - distance = prop->distance; - network = prop->scope; - GNUNET_break (GNUNET_NT_UNSPECIFIED != network); - /* check if entry exists */ - neighbor = GNUNET_CONTAINER_multipeermap_get (direct_neighbors, - &address->peer); - if (NULL != neighbor) - { - neighbor->network = network; - if (neighbor->distance == distance) - return; /* nothing new to see here, move along */ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "ATS says distance to %s is now %u\n", - GNUNET_i2s (&address->peer), - (unsigned int) distance); - if ( (DIRECT_NEIGHBOR_COST == neighbor->distance) && - (DIRECT_NEIGHBOR_COST == distance) ) - return; /* no change */ - if (DIRECT_NEIGHBOR_COST == neighbor->distance) - { - neighbor->distance = distance; - GNUNET_STATISTICS_update (stats, - "# peers connected (1-hop)", - -1, GNUNET_NO); - handle_direct_disconnect (neighbor); - schedule_refresh_routes (); - return; - } - neighbor->distance = distance; - if (DIRECT_NEIGHBOR_COST != neighbor->distance) - return; - if (GNUNET_YES != neighbor->connected) - return; - handle_direct_connect (neighbor); - return; - } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "ATS says distance to %s is now %u\n", - GNUNET_i2s (&address->peer), - (unsigned int) distance); - neighbor = GNUNET_new (struct DirectNeighbor); - neighbor->peer = address->peer; - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_put (direct_neighbors, - &neighbor->peer, - neighbor, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); - neighbor->connected = GNUNET_NO; /* not yet */ - neighbor->distance = distance; - neighbor->network = network; -} - - -/** - * Check if a target was removed from the set of the other peer; if so, - * if we also used it for our route, we need to remove it from our - * 'all_routes' set (and later check if an alternative path now exists). - * - * @param cls the `struct DirectNeighbor` - * @param key peer identity for the target - * @param value a `struct Target` previously reachable via the given neighbor - */ -static int -check_target_removed (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) -{ - struct DirectNeighbor *neighbor = cls; - struct Target *new_target; - struct Route *current_route; - - new_target = GNUNET_CONTAINER_multipeermap_get (neighbor->neighbor_table_consensus, - key); - current_route = GNUNET_CONTAINER_multipeermap_get (all_routes, - key); - if (NULL != new_target) - { - /* target was in old set, is in new set */ - if ( (NULL != current_route) && - (current_route->next_hop == neighbor) && - (current_route->target.distance != new_target->distance) ) - { - /* need to recalculate routes due to distance change */ - neighbor->target_removed = GNUNET_YES; - } - return GNUNET_OK; - } - /* target was revoked, check if it was used */ - if ( (NULL == current_route) || - (current_route->next_hop != neighbor) ) - { - /* didn't matter, wasn't used */ - return GNUNET_OK; - } - /* remove existing route */ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Lost route to %s\n", - GNUNET_i2s (¤t_route->target.peer)); - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_remove (all_routes, key, current_route)); - send_disconnect_to_plugin (¤t_route->target.peer); - release_route (current_route); - GNUNET_free (current_route); - neighbor->target_removed = GNUNET_YES; - return GNUNET_OK; -} - - -/** - * Check if a target was added to the set of the other peer; if it - * was added or impoves the existing route, do the needed updates. - * - * @param cls the `struct DirectNeighbor` - * @param key peer identity for the target - * @param value a `struct Target` now reachable via the given neighbor - */ -static int -check_target_added (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) -{ - struct DirectNeighbor *neighbor = cls; - struct Target *target = value; - struct Route *current_route; - - /* target was revoked, check if it was used */ - current_route = GNUNET_CONTAINER_multipeermap_get (all_routes, - key); - if (NULL != current_route) - { - /* route exists */ - if (current_route->next_hop == neighbor) - { - /* we had the same route before, no change in target */ - if (ntohl (target->distance) + 1 != ntohl (current_route->target.distance)) - { - /* but distance changed! */ - if (ntohl (target->distance) + 1 > DEFAULT_FISHEYE_DEPTH) - { - /* distance increased beyond what is allowed, kill route */ - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_remove (all_routes, - key, - current_route)); - send_disconnect_to_plugin (key); - release_route (current_route); - GNUNET_free (current_route); - } - else - { - /* distance decreased, update route */ - move_route (current_route, - ntohl (target->distance) + 1); - send_distance_change_to_plugin (&target->peer, - ntohl (target->distance) + 1, - neighbor->network); - } - } - return GNUNET_OK; - } - if (ntohl (current_route->target.distance) <= ntohl (target->distance) + 1) - { - /* alternative, shorter route exists, ignore */ - return GNUNET_OK; - } - /* new route is better than the existing one, take over! */ - /* NOTE: minor security issue: malicious peers may advertise - very short routes to take over longer paths; as we don't - check that the shorter routes actually work, a malicious - direct neighbor can use this to DoS our long routes */ - - move_route (current_route, ntohl (target->distance) + 1); - current_route->next_hop = neighbor; - send_distance_change_to_plugin (&target->peer, - ntohl (target->distance) + 1, - neighbor->network); - return GNUNET_OK; - } - /* new route */ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Discovered new route to %s using %u hops\n", - GNUNET_i2s (&target->peer), - (unsigned int) (ntohl (target->distance) + 1)); - current_route = GNUNET_new (struct Route); - current_route->next_hop = neighbor; - current_route->target.peer = target->peer; - allocate_route (current_route, ntohl (target->distance) + 1); - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_put (all_routes, - ¤t_route->target.peer, - current_route, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); - - send_connect_to_plugin (¤t_route->target.peer, - ntohl (current_route->target.distance), - neighbor->network); - return GNUNET_OK; -} - - -/** - * Callback for set operation results. Called for each element - * in the result set. - * We have learned a new route from the other peer. Add it to the - * route set we're building. - * - * @param cls the `struct DirectNeighbor` we're building the consensus with - * @param element a result element, only valid if status is #GNUNET_SET_STATUS_OK - * @param current_size current set size - * @param status see `enum GNUNET_SET_Status` - */ -static void -handle_set_union_result (void *cls, - const struct GNUNET_SET_Element *element, - uint64_t current_size, - enum GNUNET_SET_Status status) -{ - struct DirectNeighbor *neighbor = cls; - struct DirectNeighbor *dn; - struct Target *target; - const struct Target *ctarget; - char *status_str; - - switch (status) - { - case GNUNET_SET_STATUS_OK: - status_str = "GNUNET_SET_STATUS_OK"; - break; - case GNUNET_SET_STATUS_FAILURE: - status_str = "GNUNET_SET_STATUS_FAILURE"; - break; - case GNUNET_SET_STATUS_HALF_DONE: - status_str = "GNUNET_SET_STATUS_HALF_DONE"; - break; - case GNUNET_SET_STATUS_DONE: - status_str = "GNUNET_SET_STATUS_DONE"; - break; - default: - status_str = "UNDEFINED"; - break; - } - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Got SET union result: %s\n", - status_str); - switch (status) - { - case GNUNET_SET_STATUS_OK: - if (sizeof (struct Target) != element->size) - { - GNUNET_break_op (0); - return; - } - ctarget = element->data; - if ( (NULL != - (dn = GNUNET_CONTAINER_multipeermap_get (direct_neighbors, - &ctarget->peer))) && - (DIRECT_NEIGHBOR_COST == dn->distance) ) - { - /* this is a direct neighbor of ours, we do not care about routes - to this peer */ - return; - } - target = GNUNET_new (struct Target); - GNUNET_memcpy (target, element->data, sizeof (struct Target)); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received information about peer `%s' with distance %u from SET\n", - GNUNET_i2s (&target->peer), - ntohl (target->distance) + 1); - - if (NULL == neighbor->neighbor_table_consensus) - neighbor->neighbor_table_consensus - = GNUNET_CONTAINER_multipeermap_create (10, GNUNET_NO); - if (GNUNET_YES != - GNUNET_CONTAINER_multipeermap_put (neighbor->neighbor_table_consensus, - &target->peer, - target, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)) - { - GNUNET_break_op (0); - GNUNET_free (target); - } - break; - case GNUNET_SET_STATUS_FAILURE: - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Failed to establish DV union, will try again later\n"); - neighbor->set_op = NULL; - if (NULL != neighbor->neighbor_table_consensus) - { - GNUNET_CONTAINER_multipeermap_iterate (neighbor->neighbor_table_consensus, - &free_targets, - NULL); - GNUNET_CONTAINER_multipeermap_destroy (neighbor->neighbor_table_consensus); - neighbor->neighbor_table_consensus = NULL; - } - if (0 < memcmp (&neighbor->peer, - &my_identity, - sizeof (struct GNUNET_PeerIdentity))) - neighbor->initiate_task = GNUNET_SCHEDULER_add_delayed (GNUNET_DV_CONSENSUS_FREQUENCY, - &initiate_set_union, - neighbor); - break; - case GNUNET_SET_STATUS_HALF_DONE: - break; - case GNUNET_SET_STATUS_DONE: - /* we got all of our updates; integrate routing table! */ - neighbor->target_removed = GNUNET_NO; - if (NULL == neighbor->neighbor_table_consensus) - neighbor->neighbor_table_consensus = GNUNET_CONTAINER_multipeermap_create (10, GNUNET_NO); - if (NULL != neighbor->neighbor_table) - GNUNET_CONTAINER_multipeermap_iterate (neighbor->neighbor_table, - &check_target_removed, - neighbor); - if (GNUNET_YES == neighbor->target_removed) - { - /* check if we got an alternative for the removed routes */ - schedule_refresh_routes (); - } - /* add targets that appeared (and check for improved routes) */ - GNUNET_CONTAINER_multipeermap_iterate (neighbor->neighbor_table_consensus, - &check_target_added, - neighbor); - if (NULL != neighbor->neighbor_table) - { - GNUNET_CONTAINER_multipeermap_iterate (neighbor->neighbor_table, - &free_targets, - NULL); - GNUNET_CONTAINER_multipeermap_destroy (neighbor->neighbor_table); - neighbor->neighbor_table = NULL; - } - neighbor->neighbor_table = neighbor->neighbor_table_consensus; - neighbor->neighbor_table_consensus = NULL; - - /* operation done, schedule next run! */ - neighbor->set_op = NULL; - if (0 < memcmp (&neighbor->peer, - &my_identity, - sizeof (struct GNUNET_PeerIdentity))) - neighbor->initiate_task = GNUNET_SCHEDULER_add_delayed (GNUNET_DV_CONSENSUS_FREQUENCY, - &initiate_set_union, - neighbor); - break; - default: - GNUNET_break (0); - return; - } -} - - -/** - * Start creating a new DV set union construction, our neighbour has - * asked for it (callback for listening peer). - * - * @param cls the 'struct DirectNeighbor' of the peer we're building - * a routing consensus with - * @param other_peer the other peer - * @param context_msg message with application specific information from - * the other peer - * @param request request from the other peer, use GNUNET_SET_accept - * to accept it, otherwise the request will be refused - * Note that we don't use a return value here, as it is also - * necessary to specify the set we want to do the operation with, - * whith sometimes can be derived from the context message. - * Also necessary to specify the timeout. - */ -static void -listen_set_union (void *cls, - const struct GNUNET_PeerIdentity *other_peer, - const struct GNUNET_MessageHeader *context_msg, - struct GNUNET_SET_Request *request) -{ - struct DirectNeighbor *neighbor = cls; - - if (NULL == request) - return; /* why??? */ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Starting to create consensus with %s\n", - GNUNET_i2s (&neighbor->peer)); - if (NULL != neighbor->set_op) - { - GNUNET_SET_operation_cancel (neighbor->set_op); - neighbor->set_op = NULL; - } - if (NULL != neighbor->my_set) - { - GNUNET_SET_destroy (neighbor->my_set); - neighbor->my_set = NULL; - } - neighbor->my_set = GNUNET_SET_create (cfg, - GNUNET_SET_OPERATION_UNION); - neighbor->set_op = GNUNET_SET_accept (request, - GNUNET_SET_RESULT_ADDED, - (struct GNUNET_SET_Option[]) {{ 0 }}, - &handle_set_union_result, - neighbor); - neighbor->consensus_insertion_offset = 0; - neighbor->consensus_insertion_distance = 0; - neighbor->consensus_elements = 0; - build_set (neighbor); -} - - -/** - * Start creating a new DV set union by initiating the connection. - * - * @param cls the `struct DirectNeighbor *` of the peer we're building - * a routing consensus with - */ -static void -initiate_set_union (void *cls) -{ - struct DirectNeighbor *neighbor = cls; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Initiating SET union with peer `%s'\n", - GNUNET_i2s (&neighbor->peer)); - neighbor->initiate_task = NULL; - neighbor->my_set = GNUNET_SET_create (cfg, - GNUNET_SET_OPERATION_UNION); - neighbor->set_op = GNUNET_SET_prepare (&neighbor->peer, - &neighbor->real_session_id, - NULL, - GNUNET_SET_RESULT_ADDED, - (struct GNUNET_SET_Option[]) {{ 0 }}, - &handle_set_union_result, - neighbor); - neighbor->consensus_insertion_offset = 0; - neighbor->consensus_insertion_distance = 0; - neighbor->consensus_elements = 0; - build_set (neighbor); -} - - -/** - * Check that @a rm is well-formed. - * - * @param cls closure - * @param rm the message - * @return #GNUNET_OK if @a rm is well-formed. - */ -static int -check_dv_route_message (void *cls, - const struct RouteMessage *rm) -{ - const struct GNUNET_MessageHeader *payload; - - if (ntohs (rm->header.size) < sizeof (struct RouteMessage) + sizeof (struct GNUNET_MessageHeader)) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - payload = (const struct GNUNET_MessageHeader *) &rm[1]; - if (ntohs (rm->header.size) != sizeof (struct RouteMessage) + ntohs (payload->size)) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - return GNUNET_OK; -} - - -/** - * Core handler for DV data messages. Whatever this message - * contains all we really have to do is rip it out of its - * DV layering and give it to our pal the DV plugin to report - * in with. - * - * @param cls closure - * @param rm the message - */ -static void -handle_dv_route_message (void *cls, - const struct RouteMessage *rm) -{ - struct DirectNeighbor *neighbor = cls; - const struct GNUNET_MessageHeader *payload; - struct Route *route; - struct DirectNeighbor *nneighbor; - struct DirectNeighbor *dn; - struct Target *target; - uint32_t distance; - char me[5]; - char src[5]; - char prev[5]; - char dst[5]; - - distance = ntohl (rm->distance); - payload = (const struct GNUNET_MessageHeader *) &rm[1]; - strncpy (prev, GNUNET_i2s (&neighbor->peer), 4); - strncpy (me, GNUNET_i2s (&my_identity), 4); - strncpy (src, GNUNET_i2s (&rm->sender), 4); - strncpy (dst, GNUNET_i2s (&rm->target), 4); - prev[4] = me[4] = src[4] = dst[4] = '\0'; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Handling DV message with %u bytes payload of type %u from %s to %s routed by %s to me (%s @ hop %u)\n", - (unsigned int) (ntohs (rm->header.size) - sizeof (struct RouteMessage)), - ntohs (payload->type), - src, - dst, - prev, - me, - (unsigned int) distance + 1); - - if (0 == memcmp (&rm->target, - &my_identity, - sizeof (struct GNUNET_PeerIdentity))) - { - if ((NULL != - (dn = GNUNET_CONTAINER_multipeermap_get (direct_neighbors, - &rm->sender))) && - (DIRECT_NEIGHBOR_COST == dn->distance)) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Discarding DV message, as %s is a direct neighbor\n", - GNUNET_i2s (&rm->sender)); - GNUNET_STATISTICS_update (stats, - "# messages discarded (direct neighbor)", - 1, GNUNET_NO); - return; - } - /* message is for me, check reverse route! */ - route = GNUNET_CONTAINER_multipeermap_get (all_routes, - &rm->sender); - if ( (NULL == route) && - (distance < DEFAULT_FISHEYE_DEPTH) ) - { - /* don't have reverse route yet, learn it! */ - target = GNUNET_new (struct Target); - target->peer = rm->sender; - target->distance = htonl (distance); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Learning sender %s at distance %u from delivery!\n", - GNUNET_i2s (&rm->sender), - (unsigned int) distance + 1); - if (NULL == neighbor->neighbor_table) - neighbor->neighbor_table = GNUNET_CONTAINER_multipeermap_create (10, GNUNET_NO); - if (GNUNET_YES != - GNUNET_CONTAINER_multipeermap_put (neighbor->neighbor_table, - &target->peer, - target, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)) - { - GNUNET_break_op (0); - GNUNET_free (target); - return; - } - add_new_route (target, neighbor); - } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Delivering %u bytes from %s to myself!\n", - ntohs (payload->size), - GNUNET_i2s (&rm->sender)); - send_data_to_plugin (payload, - &rm->sender, - 1 + distance); - return; - } - if ( (NULL == GNUNET_CONTAINER_multipeermap_get (direct_neighbors, - &rm->sender)) && - (NULL == GNUNET_CONTAINER_multipeermap_get (all_routes, - &rm->sender)) ) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Learning sender %s at distance %u from forwarding!\n", - GNUNET_i2s (&rm->sender), - 1 + distance); - target = GNUNET_new (struct Target); - target->peer = rm->sender; - target->distance = htonl (distance); - if (NULL == neighbor->neighbor_table) - neighbor->neighbor_table = GNUNET_CONTAINER_multipeermap_create (10, GNUNET_NO); - if (GNUNET_YES != - GNUNET_CONTAINER_multipeermap_put (neighbor->neighbor_table, - &target->peer, - target, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)) - { - GNUNET_break_op (0); - GNUNET_free (target); - return; - } - add_new_route (target, neighbor); - } - - route = GNUNET_CONTAINER_multipeermap_get (all_routes, - &rm->target); - if (NULL == route) - { - nneighbor = GNUNET_CONTAINER_multipeermap_get (direct_neighbors, - &rm->target); - if (NULL == nneighbor) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "No route to %s, not routing %u bytes!\n", - GNUNET_i2s (&rm->target), - ntohs (payload->size)); - GNUNET_STATISTICS_update (stats, - "# messages discarded (no route)", - 1, GNUNET_NO); - return; - } - } - else - { - nneighbor = route->next_hop; - } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Forwarding message to %s\n", - GNUNET_i2s (&nneighbor->peer)); - forward_payload (nneighbor, - distance + 1, - &rm->sender, - &rm->target, - payload); -} - - -/** - * Check that @a msg is well-formed - * - * @param cls identification of the client - * @param message the actual message - * @return #GNUNET_OK if @a msg is well-formed - */ -static int -check_dv_send_message (void *cls, - const struct GNUNET_DV_SendMessage *msg) -{ - const struct GNUNET_MessageHeader *payload; - - if (ntohs (msg->header.size) < sizeof (struct GNUNET_DV_SendMessage) + - sizeof (struct GNUNET_MessageHeader)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - payload = (const struct GNUNET_MessageHeader *) &msg[1]; - if (ntohs (msg->header.size) != sizeof (struct GNUNET_DV_SendMessage) + ntohs (payload->size)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - return GNUNET_OK; -} - - -/** - * Service server's handler for message send requests (which come - * bubbling up to us through the DV plugin). - * - * @param cls identification of the client - * @param message the actual message - */ -static void -handle_dv_send_message (void *cls, - const struct GNUNET_DV_SendMessage *msg) -{ - struct GNUNET_SERVICE_Client *client = cls; - struct Route *route; - const struct GNUNET_MessageHeader *payload; - - payload = (const struct GNUNET_MessageHeader *) &msg[1]; - route = GNUNET_CONTAINER_multipeermap_get (all_routes, - &msg->target); - if (NULL == route) - { - /* got disconnected */ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "No route to %s, dropping local message of type %u\n", - GNUNET_i2s (&msg->target), - ntohs (payload->type)); - GNUNET_STATISTICS_update (stats, - "# local messages discarded (no route)", - 1, GNUNET_NO); - GNUNET_SERVICE_client_continue (client); - return; - } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Forwarding %u bytes of type %u to %s\n", - ntohs (payload->size), - ntohs (payload->type), - GNUNET_i2s (&msg->target)); - - forward_payload (route->next_hop, - 0 /* first hop, distance is zero */, - &my_identity, - &msg->target, - payload); - GNUNET_SERVICE_client_continue (client); -} - - -/** - * Cleanup all of the data structures associated with a given neighbor. - * - * @param neighbor neighbor to clean up - */ -static void -cleanup_neighbor (struct DirectNeighbor *neighbor) -{ - handle_direct_disconnect (neighbor); - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_remove (direct_neighbors, - &neighbor->peer, - neighbor)); - GNUNET_free (neighbor); -} - - -/** - * Method called whenever a given peer disconnects. - * - * @param cls closure - * @param peer peer identity this notification is about - * @param internal_cls the corresponding `struct DirectNeighbor` - */ -static void -handle_core_disconnect (void *cls, - const struct GNUNET_PeerIdentity *peer, - void *internal_cls) -{ - struct DirectNeighbor *neighbor = internal_cls; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received core peer disconnect message for peer `%s'!\n", - GNUNET_i2s (peer)); - /* Check for disconnect from self message */ - if (NULL == neighbor) - return; - GNUNET_break (GNUNET_YES == neighbor->connected); - neighbor->connected = GNUNET_NO; - if (DIRECT_NEIGHBOR_COST == neighbor->distance) - { - GNUNET_STATISTICS_update (stats, - "# peers connected (1-hop)", - -1, - GNUNET_NO); - } - cleanup_neighbor (neighbor); - if (GNUNET_YES == in_shutdown) - return; - schedule_refresh_routes (); -} - - -/** - * Multipeermap iterator for freeing routes. Should never be called. - * - * @param cls NULL - * @param key key value stored under - * @param value the route to be freed - * @return #GNUNET_YES to continue iteration, #GNUNET_NO to stop - */ -static int -free_route (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) -{ - struct Route *route = value; - - GNUNET_break (0); - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_remove (all_routes, key, value)); - release_route (route); - send_disconnect_to_plugin (&route->target.peer); - GNUNET_free (route); - return GNUNET_YES; -} - - -/** - * Multipeermap iterator for freeing direct neighbors. Should never be called. - * - * @param cls NULL - * @param key key value stored under - * @param value the direct neighbor to be freed - * @return #GNUNET_YES to continue iteration, #GNUNET_NO to stop - */ -static int -free_direct_neighbors (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) -{ - struct DirectNeighbor *neighbor = value; - - cleanup_neighbor (neighbor); - return GNUNET_YES; -} - - -/** - * Task run during shutdown. - * - * @param cls unused - */ -static void -shutdown_task (void *cls) -{ - unsigned int i; - - in_shutdown = GNUNET_YES; - GNUNET_assert (NULL != core_api); - GNUNET_CORE_disconnect (core_api); - core_api = NULL; - GNUNET_ATS_performance_done (ats); - ats = NULL; - GNUNET_CONTAINER_multipeermap_iterate (direct_neighbors, - &free_direct_neighbors, - NULL); - GNUNET_CONTAINER_multipeermap_iterate (all_routes, - &free_route, - NULL); - GNUNET_CONTAINER_multipeermap_destroy (direct_neighbors); - GNUNET_CONTAINER_multipeermap_destroy (all_routes); - GNUNET_STATISTICS_destroy (stats, GNUNET_NO); - stats = NULL; - GNUNET_notification_context_destroy (nc); - nc = NULL; - for (i=0;idistance = htonl (route->target.distance); - cm->peer = route->target.peer; - GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), - env); - return GNUNET_OK; -} - - -/** - * Handle START-message. This is the first message sent to us - * by the client (can only be one!). - * - * @param cls closure (always NULL) - * @param client identification of the client - * @param message the actual message - */ -static void -handle_start (void *cls, - const struct GNUNET_MessageHeader *message) -{ - struct GNUNET_SERVICE_Client *client = cls; - - GNUNET_notification_context_add (nc, - GNUNET_SERVICE_client_get_mq (client)); - GNUNET_SERVICE_client_continue (client); - GNUNET_CONTAINER_multipeermap_iterate (all_routes, - ¬ify_client_about_route, - client); -} - - -/** - * Called on core init. - * - * @param cls unused - * @param identity this peer's identity - */ -static void -core_init (void *cls, - const struct GNUNET_PeerIdentity *identity) -{ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "I am peer: %s\n", - GNUNET_i2s (identity)); - my_identity = *identity; -} - - -/** - * Process dv requests. - * - * @param cls closure - * @param c configuration to use - * @param service the initialized service - */ -static void -run (void *cls, - const struct GNUNET_CONFIGURATION_Handle *c, - struct GNUNET_SERVICE_Handle *service) -{ - struct GNUNET_MQ_MessageHandler core_handlers[] = { - GNUNET_MQ_hd_var_size (dv_route_message, - GNUNET_MESSAGE_TYPE_DV_ROUTE, - struct RouteMessage, - NULL), - GNUNET_MQ_handler_end () - }; - in_shutdown = GNUNET_NO; - cfg = c; - direct_neighbors = GNUNET_CONTAINER_multipeermap_create (128, - GNUNET_NO); - all_routes = GNUNET_CONTAINER_multipeermap_create (65536, - GNUNET_NO); - core_api = GNUNET_CORE_connect (cfg, - NULL, - &core_init, - &handle_core_connect, - &handle_core_disconnect, - core_handlers); - - if (NULL == core_api) - return; - ats = GNUNET_ATS_performance_init (cfg, - &handle_ats_update, - NULL); - if (NULL == ats) - { - GNUNET_CORE_disconnect (core_api); - core_api = NULL; - return; - } - nc = GNUNET_notification_context_create (MAX_QUEUE_SIZE_PLUGIN); - stats = GNUNET_STATISTICS_create ("dv", - cfg); - GNUNET_SCHEDULER_add_shutdown (&shutdown_task, - NULL); -} - - -/** - * Callback called when a client connects to the service. - * - * @param cls closure for the service - * @param c the new client that connected to the service - * @param mq the message queue used to send messages to the client - * @return @a c - */ -static void * -client_connect_cb (void *cls, - struct GNUNET_SERVICE_Client *c, - struct GNUNET_MQ_Handle *mq) -{ - return c; -} - - -/** - * Callback called when a client disconnected from the service - * - * @param cls closure for the service - * @param c the client that disconnected - * @param internal_cls should be equal to @a c - */ -static void -client_disconnect_cb (void *cls, - struct GNUNET_SERVICE_Client *c, - void *internal_cls) -{ - GNUNET_assert (c == internal_cls); -} - - -/** - * Define "main" method using service macro. - */ -GNUNET_SERVICE_MAIN -("dv", - GNUNET_SERVICE_OPTION_NONE, - &run, - &client_connect_cb, - &client_disconnect_cb, - NULL, - GNUNET_MQ_hd_fixed_size (start, - GNUNET_MESSAGE_TYPE_DV_START, - struct GNUNET_MessageHeader, - NULL), - GNUNET_MQ_hd_var_size (dv_send_message, - GNUNET_MESSAGE_TYPE_DV_SEND, - struct GNUNET_DV_SendMessage, - NULL), - GNUNET_MQ_handler_end ()); - - -/* end of gnunet-service-dv.c */ diff --git a/src/dv/plugin_transport_dv.c b/src/dv/plugin_transport_dv.c deleted file mode 100644 index a99c170d7..000000000 --- a/src/dv/plugin_transport_dv.c +++ /dev/null @@ -1,910 +0,0 @@ -/* - This file is part of GNUnet - Copyright (C) 2002--2014 GNUnet e.V. - - GNUnet is free software: you can redistribute it and/or modify it - under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, - 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 - Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - - SPDX-License-Identifier: AGPL3.0-or-later -*/ - -/** - * @file dv/plugin_transport_dv.c - * @brief DV transport service, takes incoming DV requests and deals with - * the DV service - * @author Nathan Evans - * @author Christian Grothoff - */ -#include "platform.h" -#include "gnunet_util_lib.h" -#include "gnunet_protocols.h" -#include "gnunet_statistics_service.h" -#include "gnunet_dv_service.h" -#include "gnunet_transport_service.h" -#include "gnunet_transport_plugin.h" -#include "dv.h" - - -#define LOG(kind,...) GNUNET_log_from (kind, "transport-dv",__VA_ARGS__) - - -/** - * Encapsulation of all of the state of the plugin. - */ -struct Plugin; - - -/** - * Session handle for connections. - */ -struct GNUNET_ATS_Session -{ - /** - * Pointer to the global plugin struct. - */ - struct Plugin *plugin; - - /** - * Address we use for the other peer. - */ - struct GNUNET_HELLO_Address *address; - - /** - * To whom are we talking to. - */ - struct GNUNET_PeerIdentity sender; - - /** - * Number of bytes waiting for transmission to this peer. - * FIXME: not set yet. - */ - unsigned long long bytes_in_queue; - - /** - * Number of messages waiting for transmission to this peer. - * FIXME: not set yet. - */ - unsigned int msgs_in_queue; - - /** - * Current distance to the given peer. - */ - uint32_t distance; - - /** - * Current network the next hop peer is located in - */ - enum GNUNET_NetworkType network; - - /** - * Does the transport service know about this session (and we thus - * need to call `session_end` when it is released?) - */ - int active; - -}; - - -/** - * Encapsulation of all of the state of the plugin. - */ -struct Plugin -{ - /** - * Our environment. - */ - struct GNUNET_TRANSPORT_PluginEnvironment *env; - - /** - * Hash map of sessions (active and inactive). - */ - struct GNUNET_CONTAINER_MultiPeerMap *sessions; - - /** - * Copy of the handler array where the closures are - * set to this struct's instance. - */ - struct GNUNET_SERVER_MessageHandler *handlers; - - /** - * Handle to the DV service - */ - struct GNUNET_DV_ServiceHandle *dvh; - - /** - * Tokenizer for boxed messages. - */ - struct GNUNET_SERVER_MessageStreamTokenizer *mst; - - /** - * Function to call about session status changes. - */ - GNUNET_TRANSPORT_SessionInfoCallback sic; - - /** - * Closure for @e sic. - */ - void *sic_cls; -}; - - -/** - * If a session monitor is attached, notify it about the new - * session state. - * - * @param plugin our plugin - * @param session session that changed state - * @param state new state of the session - */ -static void -notify_session_monitor (struct Plugin *plugin, - struct GNUNET_ATS_Session *session, - enum GNUNET_TRANSPORT_SessionState state) -{ - struct GNUNET_TRANSPORT_SessionInfo info; - - if (NULL == plugin->sic) - return; - memset (&info, 0, sizeof (info)); - info.state = state; - info.is_inbound = GNUNET_SYSERR; /* hard to say */ - info.num_msg_pending = session->msgs_in_queue; - info.num_bytes_pending = session->bytes_in_queue; - /* info.receive_delay remains zero as this is not supported by DV - (cannot selectively not receive from 'core') */ - info.session_timeout = GNUNET_TIME_UNIT_FOREVER_ABS; - info.address = session->address; - plugin->sic (plugin->sic_cls, - session, - &info); -} - - -/** - * Notify transport service about the change in distance. - * - * @param session session where the distance changed - */ -static void -notify_distance_change (struct GNUNET_ATS_Session *session) -{ - struct Plugin *plugin = session->plugin; - - if (GNUNET_YES != session->active) - return; - plugin->env->update_address_distance (plugin->env->cls, - session->address, - session->distance); -} - - -/** - * Function called by MST on each message from the box. - * - * @param cls closure with the `struct Plugin *` - * @param client identification of the client (with the 'struct GNUNET_ATS_Session') - * @param message the actual message - * @return #GNUNET_OK on success - */ -static int -unbox_cb (void *cls, - void *client, - const struct GNUNET_MessageHeader *message) -{ - struct Plugin *plugin = cls; - struct GNUNET_ATS_Session *session = client; - - session->active = GNUNET_YES; - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Delivering message of type %u with %u bytes from peer `%s'\n", - ntohs (message->type), - ntohs (message->size), - GNUNET_i2s (&session->sender)); - plugin->env->receive (plugin->env->cls, - session->address, - session, - message); - plugin->env->update_address_distance (plugin->env->cls, - session->address, - session->distance); - return GNUNET_OK; -} - - -/** - * Handler for messages received from the DV service. - * - * @param cls closure with the plugin - * @param sender sender of the message - * @param distance how far did the message travel - * @param msg actual message payload - */ -static void -handle_dv_message_received (void *cls, - const struct GNUNET_PeerIdentity *sender, - uint32_t distance, - const struct GNUNET_MessageHeader *msg) -{ - struct Plugin *plugin = cls; - struct GNUNET_ATS_Session *session; - - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Received DV_MESSAGE_RECEIVED message for peer `%s': new distance %u\n", - GNUNET_i2s (sender), - distance); - session = GNUNET_CONTAINER_multipeermap_get (plugin->sessions, - sender); - if (NULL == session) - { - GNUNET_break (0); - return; - } - if (GNUNET_MESSAGE_TYPE_DV_BOX == ntohs (msg->type)) - { - /* need to unbox using MST */ - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Unboxing DV message using MST\n"); - GNUNET_SERVER_mst_receive (plugin->mst, - session, - (const char *) &msg[1], - ntohs (msg->size) - sizeof (struct GNUNET_MessageHeader), - GNUNET_YES, - GNUNET_NO); - return; - } - session->active = GNUNET_YES; - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Delivering message of type %u with %u bytes from peer `%s'\n", - ntohs (msg->type), - ntohs (msg->size), - GNUNET_i2s (sender)); - plugin->env->receive (plugin->env->cls, - session->address, - session, - msg); - plugin->env->update_address_distance (plugin->env->cls, - session->address, - session->distance); -} - - -/** - * Function called if DV starts to be able to talk to a peer. - * - * @param cls closure with `struct Plugin *` - * @param peer newly connected peer - * @param distance distance to the peer - * @param network the network the next hop is located in - */ -static void -handle_dv_connect (void *cls, - const struct GNUNET_PeerIdentity *peer, - uint32_t distance, - enum GNUNET_NetworkType network) -{ - struct Plugin *plugin = cls; - struct GNUNET_ATS_Session *session; - - GNUNET_break (GNUNET_NT_UNSPECIFIED != network); - /** - * This requires transport plugin to be linked to libgnunetats. - * If you remove it, also remove libgnunetats linkage from Makefile.am - */ - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Received DV_CONNECT message for peer `%s' with next hop in network %s\n", - GNUNET_i2s (peer), - GNUNET_NT_to_string (network)); - - session = GNUNET_CONTAINER_multipeermap_get (plugin->sessions, - peer); - if (NULL != session) - { - GNUNET_break (0); - session->distance = distance; - notify_distance_change (session); - return; /* nothing to do */ - } - - session = GNUNET_new (struct GNUNET_ATS_Session); - session->address = GNUNET_HELLO_address_allocate (peer, "dv", - NULL, 0, - GNUNET_HELLO_ADDRESS_INFO_NONE); - session->sender = *peer; - session->plugin = plugin; - session->distance = distance; - session->network = network; - GNUNET_assert(GNUNET_YES == - GNUNET_CONTAINER_multipeermap_put (plugin->sessions, - &session->sender, session, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); - - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Creating new DV session %p for peer `%s' at distance %u\n", - session, - GNUNET_i2s (peer), - distance); - - session->active = GNUNET_YES; - plugin->env->session_start (plugin->env->cls, - session->address, - session, - network); - plugin->env->update_address_distance (plugin->env->cls, - session->address, - session->distance); - - notify_session_monitor (session->plugin, - session, - GNUNET_TRANSPORT_SS_UP); -} - - -/** - * Function called if DV distance to a peer is changed. - * - * @param cls closure with `struct Plugin *` - * @param peer connected peer - * @param distance new distance to the peer - * @param network network type used for the connection - */ -static void -handle_dv_distance_changed (void *cls, - const struct GNUNET_PeerIdentity *peer, - uint32_t distance, - enum GNUNET_NetworkType network) -{ - struct Plugin *plugin = cls; - struct GNUNET_ATS_Session *session; - - GNUNET_break (GNUNET_NT_UNSPECIFIED != network); - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Received `%s' message for peer `%s': new distance %u\n", - "DV_DISTANCE_CHANGED", - GNUNET_i2s (peer), - distance); - session = GNUNET_CONTAINER_multipeermap_get (plugin->sessions, - peer); - if (NULL == session) - { - GNUNET_break (0); - handle_dv_connect (plugin, peer, distance, network); - return; - } - session->distance = distance; - notify_distance_change (session); -} - - -/** - * Release session object and clean up associated resources. - * - * @param session session to clean up - */ -static void -free_session (struct GNUNET_ATS_Session *session) -{ - struct Plugin *plugin = session->plugin; - - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_remove (plugin->sessions, - &session->sender, - session)); - - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Freeing session %p for peer `%s'\n", - session, - GNUNET_i2s (&session->sender)); - if (GNUNET_YES == session->active) - { - notify_session_monitor (session->plugin, - session, - GNUNET_TRANSPORT_SS_DONE); - plugin->env->session_end (plugin->env->cls, - session->address, - session); - session->active = GNUNET_NO; - } - GNUNET_HELLO_address_free (session->address); - GNUNET_free (session); -} - - -/** - * Function called if DV is no longer able to talk to a peer. - * - * @param cls closure with `struct Plugin *` - * @param peer peer that disconnected - */ -static void -handle_dv_disconnect (void *cls, - const struct GNUNET_PeerIdentity *peer) -{ - struct Plugin *plugin = cls; - struct GNUNET_ATS_Session *session; - - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Received `%s' message for peer `%s'\n", - "DV_DISCONNECT", - GNUNET_i2s (peer)); - session = GNUNET_CONTAINER_multipeermap_get (plugin->sessions, - peer); - if (NULL == session) - return; /* nothing to do */ - free_session (session); -} - - -/** - * Function that can be used by the transport service to transmit - * a message using the plugin. - * - * @param cls closure - * @param session the session used - * @param priority how important is the message - * @param msgbuf the message to transmit - * @param msgbuf_size number of bytes in 'msgbuf' - * @param timeout when should we time out - * @param cont continuation to call once the message has - * been transmitted (or if the transport is ready - * for the next transmission call; or if the - * peer disconnected...) - * @param cont_cls closure for @a cont - * @return number of bytes used (on the physical network, with overheads); - * -1 on hard errors (i.e. address invalid); 0 is a legal value - * and does NOT mean that the message was not transmitted (DV) - */ -static ssize_t -dv_plugin_send (void *cls, - struct GNUNET_ATS_Session *session, - const char *msgbuf, - size_t msgbuf_size, - unsigned int priority, - struct GNUNET_TIME_Relative timeout, - GNUNET_TRANSPORT_TransmitContinuation cont, - void *cont_cls) -{ - struct Plugin *plugin = cls; - const struct GNUNET_MessageHeader *msg; - struct GNUNET_MessageHeader *box; - - box = NULL; - msg = (const struct GNUNET_MessageHeader *) msgbuf; - if (ntohs (msg->size) != msgbuf_size) - { - /* need to box */ - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Boxing DV message\n"); - box = GNUNET_malloc (sizeof (struct GNUNET_MessageHeader) + msgbuf_size); - box->type = htons (GNUNET_MESSAGE_TYPE_DV_BOX); - box->size = htons (sizeof (struct GNUNET_MessageHeader) + msgbuf_size); - GNUNET_memcpy (&box[1], msgbuf, msgbuf_size); - msg = box; - } - GNUNET_DV_send (plugin->dvh, - &session->sender, - msg); - cont (cont_cls, - &session->sender, - GNUNET_OK, - msgbuf_size, 0); - GNUNET_free_non_null (box); - return 0; /* DV */ -} - - -/** - * Function that can be used to force the plugin to disconnect - * from the given peer and cancel all previous transmissions - * (and their continuations). - * - * @param cls closure with the `struct Plugin *` - * @param target peer from which to disconnect - */ -static void -dv_plugin_disconnect_peer (void *cls, - const struct GNUNET_PeerIdentity *target) -{ - struct Plugin *plugin = cls; - struct GNUNET_ATS_Session *session; - - session = GNUNET_CONTAINER_multipeermap_get (plugin->sessions, - target); - if (NULL == session) - return; /* nothing to do */ - session->active = GNUNET_NO; -} - - -/** - * Function that can be used to force the plugin to disconnect - * from the given peer and cancel all previous transmissions - * (and their continuations). - * - * @param cls closure with the `struct Plugin *` - * @param session which session to disconnect - * @return #GNUNET_OK - */ -static int -dv_plugin_disconnect_session (void *cls, - struct GNUNET_ATS_Session *session) -{ - session->active = GNUNET_NO; - return GNUNET_OK; -} - - -/** - * Convert the transports address to a nice, human-readable - * format. - * - * @param cls closure - * @param type name of the transport that generated the address - * @param addr one of the addresses of the host, NULL for the last address - * the specific address format depends on the transport - * @param addrlen length of the address - * @param numeric should (IP) addresses be displayed in numeric form? - * @param timeout after how long should we give up? - * @param asc function to call on each string - * @param asc_cls closure for @a asc - */ -static void -dv_plugin_address_pretty_printer (void *cls, - const char *type, - const void *addr, - size_t addrlen, - int numeric, - struct GNUNET_TIME_Relative timeout, - GNUNET_TRANSPORT_AddressStringCallback asc, - void *asc_cls) -{ - if ( (0 == addrlen) && - (0 == strcmp (type, "dv")) ) - asc (asc_cls, - "dv", - GNUNET_OK); - else - asc (asc_cls, - NULL, - GNUNET_SYSERR); - asc (asc_cls, - NULL, - GNUNET_OK); -} - - -/** - * Convert the DV address to a pretty string. - * - * @param cls closure - * @param addr the (hopefully) DV address - * @param addrlen the length of the @a addr - * @return string representing the DV address - */ -static const char * -dv_plugin_address_to_string (void *cls, - const void *addr, - size_t addrlen) -{ - if (0 != addrlen) - { - GNUNET_break (0); /* malformed */ - return NULL; - } - return "dv"; -} - - -/** - * Another peer has suggested an address for this peer and transport - * plugin. Check that this could be a valid address. This function - * is not expected to 'validate' the address in the sense of trying to - * connect to it but simply to see if the binary format is technically - * legal for establishing a connection to this peer (and make sure that - * the address really corresponds to our network connection/settings - * and not some potential man-in-the-middle). - * - * @param cls closure - * @param addr pointer to the address - * @param addrlen length of @a addr - * @return #GNUNET_OK if this is a plausible address for this peer - * and transport, #GNUNET_SYSERR if not - * - */ -static int -dv_plugin_check_address (void *cls, - const void *addr, - size_t addrlen) -{ - if (0 != addrlen) - return GNUNET_SYSERR; - return GNUNET_OK; -} - - -/** - * Create a new session to transmit data to the target - * This session will used to send data to this peer and the plugin will - * notify us by calling the env->session_end function - * - * @param cls the plugin - * @param address the address - * @return the session if the address is valid, NULL otherwise - */ -static struct GNUNET_ATS_Session * -dv_get_session (void *cls, - const struct GNUNET_HELLO_Address *address) -{ - struct Plugin *plugin = cls; - struct GNUNET_ATS_Session *session; - - if (0 != address->address_length) - return NULL; - session = GNUNET_CONTAINER_multipeermap_get (plugin->sessions, - &address->peer); - if (NULL == session) - return NULL; /* not valid right now */ - session->active = GNUNET_YES; - return session; -} - - -/** - * Function called to convert a string address to - * a binary address. - * - * @param cls closure ('struct Plugin*') - * @param addr string address - * @param addrlen length of the @a addr including \0 termination - * @param buf location to store the buffer - * If the function returns #GNUNET_SYSERR, its contents are undefined. - * @param added length of created address - * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure - */ -static int -dv_plugin_string_to_address (void *cls, - const char *addr, - uint16_t addrlen, - void **buf, - size_t *added) -{ - if ( (addrlen == 3) && - (0 == strcmp ("dv", addr)) ) - { - *added = 0; - return GNUNET_OK; - } - return GNUNET_SYSERR; -} - - -/** - * Function that will be called whenever the transport service wants to - * notify the plugin that a session is still active and in use and - * therefore the session timeout for this session has to be updated - * - * @param cls closure (`struct Plugin *`) - * @param peer which peer was the session for - * @param session which session is being updated - */ -static void -dv_plugin_update_session_timeout (void *cls, - const struct GNUNET_PeerIdentity *peer, - struct GNUNET_ATS_Session *session) -{ - /* DV currently doesn't time out like "normal" plugins, - so it should be safe to do nothing, right? - (or should we add an internal timeout?) */ -} - - -/** - * Function to obtain the network type for a session - * FIXME: we should probably look at the network type - * used by the next hop here. Or find some other way - * to properly allow ATS-DV resource allocation. - * - * @param cls closure (`struct Plugin *`) - * @param session the session - * @return the network type - */ -static enum GNUNET_NetworkType -dv_get_network (void *cls, - struct GNUNET_ATS_Session *session) -{ - GNUNET_assert (NULL != session); - return session->network; -} - - -/** - * Function obtain the network type for an address. - * - * @param cls closure (`struct Plugin *`) - * @param address the address - * @return the network type - */ -static enum GNUNET_NetworkType -dv_plugin_get_network_for_address (void *cls, - const struct GNUNET_HELLO_Address *address) -{ - return GNUNET_NT_WAN; /* FOR NOW */ -} - - -/** - * Function that is called to get the keepalive factor. - * #GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT is divided by this number to - * calculate the interval between keepalive packets. - * - * @param cls closure with the `struct Plugin` - * @return keepalive factor - */ -static unsigned int -dv_plugin_query_keepalive_factor (void *cls) -{ - return 3; -} - - -/** - * Return information about the given session to the - * monitor callback. - * - * @param cls the `struct Plugin` with the monitor callback (`sic`) - * @param peer peer we send information about - * @param value our `struct GNUNET_ATS_Session` to send information about - * @return #GNUNET_OK (continue to iterate) - */ -static int -send_session_info_iter (void *cls, - const struct GNUNET_PeerIdentity *peer, - void *value) -{ - struct Plugin *plugin = cls; - struct GNUNET_ATS_Session *session = value; - - if (GNUNET_YES != session->active) - return GNUNET_OK; - notify_session_monitor (plugin, - session, - GNUNET_TRANSPORT_SS_UP); - return GNUNET_OK; -} - - -/** - * Begin monitoring sessions of a plugin. There can only - * be one active monitor per plugin (i.e. if there are - * multiple monitors, the transport service needs to - * multiplex the generated events over all of them). - * - * @param cls closure of the plugin - * @param sic callback to invoke, NULL to disable monitor; - * plugin will being by iterating over all active - * sessions immediately and then enter monitor mode - * @param sic_cls closure for @a sic - */ -static void -dv_plugin_setup_monitor (void *cls, - GNUNET_TRANSPORT_SessionInfoCallback sic, - void *sic_cls) -{ - struct Plugin *plugin = cls; - - plugin->sic = sic; - plugin->sic_cls = sic_cls; - if (NULL != sic) - { - GNUNET_CONTAINER_multipeermap_iterate (plugin->sessions, - &send_session_info_iter, - plugin); - /* signal end of first iteration */ - sic (sic_cls, NULL, NULL); - } -} - - -/** - * Entry point for the plugin. - * - * @param cls closure with the plugin environment - * @return plugin API - */ -void * -libgnunet_plugin_transport_dv_init (void *cls) -{ - struct GNUNET_TRANSPORT_PluginEnvironment *env = cls; - struct GNUNET_TRANSPORT_PluginFunctions *api; - struct Plugin *plugin; - - plugin = GNUNET_new (struct Plugin); - plugin->env = env; - plugin->sessions = GNUNET_CONTAINER_multipeermap_create (1024 * 8, GNUNET_YES); - plugin->mst = GNUNET_SERVER_mst_create (&unbox_cb, - plugin); - plugin->dvh = GNUNET_DV_service_connect (env->cfg, - plugin, - &handle_dv_connect, - &handle_dv_distance_changed, - &handle_dv_disconnect, - &handle_dv_message_received); - if (NULL == plugin->dvh) - { - GNUNET_CONTAINER_multipeermap_destroy (plugin->sessions); - GNUNET_SERVER_mst_destroy (plugin->mst); - GNUNET_free (plugin); - return NULL; - } - api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions); - api->cls = plugin; - api->send = &dv_plugin_send; - api->disconnect_peer = &dv_plugin_disconnect_peer; - api->disconnect_session = &dv_plugin_disconnect_session; - api->address_pretty_printer = &dv_plugin_address_pretty_printer; - api->check_address = &dv_plugin_check_address; - api->address_to_string = &dv_plugin_address_to_string; - api->string_to_address = &dv_plugin_string_to_address; - api->query_keepalive_factor = &dv_plugin_query_keepalive_factor; - api->get_session = &dv_get_session; - api->get_network = &dv_get_network; - api->get_network_for_address = &dv_plugin_get_network_for_address; - api->update_session_timeout = &dv_plugin_update_session_timeout; - api->setup_monitor = &dv_plugin_setup_monitor; - return api; -} - - -/** - * Function called to free a session. - * - * @param cls NULL - * @param key unused - * @param value session to free - * @return #GNUNET_OK (continue to iterate) - */ -static int -free_session_iterator (void *cls, - const struct GNUNET_PeerIdentity *key, - void *value) -{ - struct GNUNET_ATS_Session *session = value; - - free_session (session); - return GNUNET_OK; -} - - -/** - * Exit point from the plugin. - * - * @param cls plugin API - * @return NULL - */ -void * -libgnunet_plugin_transport_dv_done (void *cls) -{ - struct GNUNET_TRANSPORT_PluginFunctions *api = cls; - struct Plugin *plugin = api->cls; - - GNUNET_DV_service_disconnect (plugin->dvh); - GNUNET_CONTAINER_multipeermap_iterate (plugin->sessions, - &free_session_iterator, - NULL); - GNUNET_CONTAINER_multipeermap_destroy (plugin->sessions); - GNUNET_SERVER_mst_destroy (plugin->mst); - GNUNET_free (plugin); - GNUNET_free (api); - return NULL; -} - -/* end of plugin_transport_dv.c */ diff --git a/src/dv/template_dv.conf b/src/dv/template_dv.conf deleted file mode 100644 index d37154261..000000000 --- a/src/dv/template_dv.conf +++ /dev/null @@ -1,33 +0,0 @@ -# Peers: -# -# `G3FK2T8AMPJ0H556QXEYVTEW409BP3KHPCG99TV66V8NYAS1KEWG' -# `6DEVS8Y51AT0TGNNHR7A75H47XXYJEFRZXX5RVQ9Q6S7Z49SYXT0' -# `6YNBKM6TTK64FAG9DF0292AW5JA9CCAC04JTY0HF8XHP635HPBBG' -# `DK5WZKKDHH06BH1H0DE0Z8CPBTG9AD8P85SF02WW3285AT3V0V50' -# - -[testbed] -OVERLAY_TOPOLOGY = CLIQUE -SETUP_TIMEOUT = 3 m -OPERATION_TIMEOUT = 30 s -CACHE_SIZE = 0 - -[transport-blacklist-G3FK2T8AMPJ0H556QXEYVTEW409BP3KHPCG99TV66V8NYAS1KEWG] -6DEVS8Y51AT0TGNNHR7A75H47XXYJEFRZXX5RVQ9Q6S7Z49SYXT0 = tcp - -[transport-blacklist-6DEVS8Y51AT0TGNNHR7A75H47XXYJEFRZXX5RVQ9Q6S7Z49SYXT0] -G3FK2T8AMPJ0H556QXEYVTEW409BP3KHPCG99TV66V8NYAS1KEWG = tcp - -[transport-blacklist-6YNBKM6TTK64FAG9DF0292AW5JA9CCAC04JTY0HF8XHP635HPBBG] - -[transport-blacklist-DK5WZKKDHH06BH1H0DE0Z8CPBTG9AD8P85SF02WW3285AT3V0V50] - -[PATHS] -GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-dv-testing/ - -[peerinfo] -USE_INCLUDED_HELLOS = NO - -[nat] -RETURN_LOCAL_ADDRESSES = YES - diff --git a/src/dv/test_transport_blacklist.c b/src/dv/test_transport_blacklist.c deleted file mode 100644 index 4fc9b4908..000000000 --- a/src/dv/test_transport_blacklist.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) 2009, 2013 GNUnet e.V. - - GNUnet is free software: you can redistribute it and/or modify it - under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, - 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 - Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - - SPDX-License-Identifier: AGPL3.0-or-later -*/ -/** - * @file dv/test_transport_blacklist.c - * @brief base testcase for testing blacklist - */ -#include "platform.h" -#include "gnunet_core_service.h" -#include "gnunet_testbed_service.h" - -/** - * Return value from main, set to 0 on success. - */ -static int ok; - - -static void -test_connection (void *cls, - struct GNUNET_TESTBED_RunHandle *h, - unsigned int num_peers, - struct GNUNET_TESTBED_Peer **peers, - unsigned int links_succeeded, - unsigned int links_failed) -{ - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Links successful %u / %u failed\n", links_succeeded, links_failed); - if ( (4 == num_peers) && (0 == links_failed) ) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Testbed connect peers despite blacklist!\n"); - ok = 1; - } - else - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Note that getting a message about a timeout during setup is expected for this test.\n"); - } - GNUNET_SCHEDULER_shutdown (); -} - - -int -main (int argc, char *argv[]) -{ - (void) GNUNET_TESTBED_test_run ("test-transport-blacklist", - "test_transport_blacklist_data.conf", - 4, - 0, NULL, NULL, - &test_connection, NULL); - return ok; -} - -/* end of test_transport_blacklist.c */ diff --git a/src/dv/test_transport_blacklist_data.conf b/src/dv/test_transport_blacklist_data.conf deleted file mode 100644 index ea55a196b..000000000 --- a/src/dv/test_transport_blacklist_data.conf +++ /dev/null @@ -1,5 +0,0 @@ -@INLINE@ template_dv.conf - -[transport] -PORT = 52565 -PLUGINS = tcp diff --git a/src/dv/test_transport_dv.c b/src/dv/test_transport_dv.c deleted file mode 100644 index 03b6087d5..000000000 --- a/src/dv/test_transport_dv.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) 2009, 2013 GNUnet e.V. - - GNUnet is free software: you can redistribute it and/or modify it - under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, - 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 - Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - - SPDX-License-Identifier: AGPL3.0-or-later -*/ -/** - * @file dv/test_transport_dv.c - * @brief base testcase for testing distance vector transport - */ -#include "platform.h" -#include "gnunet_core_service.h" -#include "gnunet_testbed_service.h" - -/** - * Return value from main, set to 0 on success. - */ -static int ok; - -struct GNUNET_TESTBED_Operation *topology_op; - -static struct GNUNET_SCHEDULER_Task * shutdown_task; - - -static void -do_shutdown (void *cls) -{ - shutdown_task = NULL; - if (NULL != topology_op) - { - GNUNET_TESTBED_operation_done (topology_op); - topology_op = NULL; - } -} - - -static void -topology_completed (void *cls, - unsigned int nsuccess, - unsigned int nfailures) -{ - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Links successful %u / %u failed\n", - nsuccess, - nfailures); - GNUNET_TESTBED_operation_done (topology_op); - topology_op = NULL; - - if (nfailures > 0) - { - fprintf (stderr, - "Error: links successful %u but %u failed\n", - nsuccess, - nfailures); - ok = 1; - } - else - ok = 0; - - GNUNET_SCHEDULER_shutdown (); -} - - -static void -test_connection (void *cls, - struct GNUNET_TESTBED_RunHandle *h, - unsigned int num_peers, - struct GNUNET_TESTBED_Peer **peers, - unsigned int links_succeeded, - unsigned int links_failed) -{ - shutdown_task = GNUNET_SCHEDULER_add_shutdown (&do_shutdown, - NULL); - if (4 != num_peers) - { - ok = 1; - fprintf (stderr, - "Only %u out of 4 peers were started ...\n", - num_peers); - } - - if (0 != links_failed) - { - /* All peers except DV peers are connected */ - fprintf (stderr, - "Testbed failed to connect peers (%u links OK, %u links failed)\n", - links_succeeded, - links_failed); - - topology_op = GNUNET_TESTBED_overlay_configure_topology - (NULL, num_peers, peers, NULL, - &topology_completed, NULL, - GNUNET_TESTBED_TOPOLOGY_CLIQUE, - GNUNET_TESTBED_TOPOLOGY_OPTION_END); - return; - } - - ok = 1; - fprintf (stderr, - "Testbed connected peers, should not happen...\n"); - GNUNET_SCHEDULER_shutdown (); -} - - -int -main (int argc, char *argv[]) -{ - ok = 1; - /* Connecting initial topology */ - (void) GNUNET_TESTBED_test_run ("test-transport-dv", - "test_transport_dv_data.conf", - 4, - 0, NULL, NULL, - &test_connection, NULL); - return ok; -} - -/* end of test_transport_dv.c */ diff --git a/src/dv/test_transport_dv_data.conf b/src/dv/test_transport_dv_data.conf deleted file mode 100644 index a21fba8a7..000000000 --- a/src/dv/test_transport_dv_data.conf +++ /dev/null @@ -1,19 +0,0 @@ -@INLINE@ template_dv.conf - -[transport] -PORT = 52565 -PLUGINS = tcp dv -#PREFIX = valgrind --leak-check=full --track-fds=yes --leak-resolution=high - -[dv] -START_ON_DEMAND = YES -# PREFIX = valgrind --leak-check=full --track-fds=yes --leak-resolution=high - -[set] -START_ON_DEMAND = YES -# PREFIX = valgrind --leak-check=full --track-fds=yes --leak-resolution=high - -[core] -# PREFIX = valgrind --leak-check=full --track-fds=yes --leak-resolution=high - - diff --git a/src/gns/test_gns_nick_shorten.conf b/src/gns/test_gns_nick_shorten.conf deleted file mode 100644 index 317477c80..000000000 --- a/src/gns/test_gns_nick_shorten.conf +++ /dev/null @@ -1,24 +0,0 @@ -@INLINE@ test_gns_defaults.conf - -[PATHS] -GNUNET_TEST_HOME = $GNUNET_TMP/test-gnunet-gns-peer-1/ - -[dht] -START_ON_DEMAND = YES - -[transport] -PLUGINS = - -[gns] -#PREFIX = valgrind --leak-check=full --track-origins=yes -START_ON_DEMAND = YES -AUTO_IMPORT_PKEY = YES -MAX_PARALLEL_BACKGROUND_QUERIES = 10 -DEFAULT_LOOKUP_TIMEOUT = 15 s -RECORD_PUT_INTERVAL = 1 h -ZONE_PUBLISH_TIME_WINDOW = 1 h -DNS_ROOT=PD67SGHF3E0447TU9HADIVU9OM7V4QHTOG0EBU69TFRI2LG63DR0 -#USE_CACHE = NO - -[revocation] -WORKBITS = 1 diff --git a/src/peerstore/Makefile.am b/src/peerstore/Makefile.am index 3aef05769..c6acdce56 100644 --- a/src/peerstore/Makefile.am +++ b/src/peerstore/Makefile.am @@ -107,7 +107,9 @@ check_PROGRAMS = \ $(FLAT_TESTS) EXTRA_DIST = \ - test_peerstore_api_data.conf + test_peerstore_api_data.conf \ + test_plugin_peerstore_flat.conf \ + test_plugin_peerstore_sqlite.conf if ENABLE_TEST_RUN AM_TESTS_ENVIRONMENT=export GNUNET_PREFIX=$${GNUNET_PREFIX:-@libdir@};export PATH=$${GNUNET_PREFIX:-@prefix@}/bin:$$PATH;unset XDG_DATA_HOME;unset XDG_CONFIG_HOME; diff --git a/src/testing/Makefile.am b/src/testing/Makefile.am index 727bfb134..39e5f1574 100644 --- a/src/testing/Makefile.am +++ b/src/testing/Makefile.am @@ -95,4 +95,5 @@ test_testing_sharedservices_LDADD = \ $(top_builddir)/src/util/libgnunetutil.la EXTRA_DIST = \ - test_testing_defaults.conf + test_testing_defaults.conf \ + test_testing_sharedservices.conf -- 2.25.1