/* This file is part of GNUnet. Copyright (C) 2009, 2010, 2011, 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 dht/gnunet-service-dht.c * @brief GNUnet DHT service * @author Christian Grothoff * @author Nathan Evans */ #include "platform.h" #include "gnunet_block_lib.h" #include "gnunet_util_lib.h" #include "gnunet_transport_service.h" #include "gnunet_transport_hello_service.h" #include "gnunet_hello_lib.h" #include "gnunet_dht_service.h" #include "gnunet_statistics_service.h" #include "gnunet-service-dht.h" #include "gnunet-service-dht_datacache.h" #include "gnunet-service-dht_hello.h" #include "gnunet-service-dht_neighbours.h" #include "gnunet-service-dht_nse.h" #include "gnunet-service-dht_routing.h" /** * Our HELLO */ struct GNUNET_MessageHeader *GDS_my_hello; /** * Handle to get our current HELLO. */ static struct GNUNET_TRANSPORT_HelloGetHandle *ghh; /** * Hello address expiration */ struct GNUNET_TIME_Relative hello_expiration; #include "gnunet-service-dht_clients.c" /** * Receive the HELLO from transport service, free current and replace * if necessary. * * @param cls NULL * @param message HELLO message of peer */ static void process_hello(void *cls, const struct GNUNET_MessageHeader *message) { GNUNET_free_non_null(GDS_my_hello); GDS_my_hello = GNUNET_malloc(ntohs(message->size)); GNUNET_memcpy(GDS_my_hello, message, ntohs(message->size)); } /** * Task run during shutdown. * * @param cls unused */ static void shutdown_task(void *cls) { if (NULL != ghh) { GNUNET_TRANSPORT_hello_get_cancel(ghh); ghh = NULL; } GDS_NEIGHBOURS_done(); GDS_DATACACHE_done(); GDS_ROUTING_done(); GDS_HELLO_done(); GDS_NSE_done(); if (NULL != GDS_block_context) { GNUNET_BLOCK_context_destroy(GDS_block_context); GDS_block_context = NULL; } if (NULL != GDS_stats) { GNUNET_STATISTICS_destroy(GDS_stats, GNUNET_YES); GDS_stats = NULL; } GNUNET_free_non_null(GDS_my_hello); GDS_my_hello = NULL; GDS_CLIENTS_stop(); } /** * Process dht 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) { GDS_cfg = c; GDS_service = service; if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_time(c, "transport", "HELLO_EXPIRATION", &hello_expiration)) { hello_expiration = GNUNET_CONSTANTS_HELLO_ADDRESS_EXPIRATION; } GDS_block_context = GNUNET_BLOCK_context_create(GDS_cfg); GDS_stats = GNUNET_STATISTICS_create("dht", GDS_cfg); GNUNET_SERVICE_suspend(GDS_service); GDS_CLIENTS_init(); GDS_ROUTING_init(); GDS_NSE_init(); GDS_DATACACHE_init(); GDS_HELLO_init(); if (GNUNET_OK != GDS_NEIGHBOURS_init()) { shutdown_task(NULL); return; } GNUNET_SCHEDULER_add_shutdown(&shutdown_task, NULL); ghh = GNUNET_TRANSPORT_hello_get(GDS_cfg, GNUNET_TRANSPORT_AC_GLOBAL, &process_hello, NULL); } /* Finally, define the main method */ GDS_DHT_SERVICE_INIT("dht", &run); /* end of gnunet-service-dht.c */