X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftransport%2Fgnunet-service-transport_plugins.c;h=c6c5e04442e4bf2c6360c398bc48ff6910c32b56;hb=5268a6fed72de00832cf075f480c03fe86952bb6;hp=3e0e6601dc0b616c63b78e6d1419bb4074a9d2a1;hpb=c2d9d1e64c9801122caaa6b429fc67706db5c9d7;p=oweals%2Fgnunet.git diff --git a/src/transport/gnunet-service-transport_plugins.c b/src/transport/gnunet-service-transport_plugins.c index 3e0e6601d..c6c5e0444 100644 --- a/src/transport/gnunet-service-transport_plugins.c +++ b/src/transport/gnunet-service-transport_plugins.c @@ -1,21 +1,21 @@ /* This file is part of GNUnet. - Copyright (C) 2010-2014 Christian Grothoff (and other contributing authors) + Copyright (C) 2010-2014 GNUnet e.V. - GNUnet is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 3, or (at your - option) any later version. + GNUnet is 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 - General Public License for more details. + 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 . - You should have received a copy of the GNU General Public License - along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + SPDX-License-Identifier: AGPL3.0-or-later */ /** @@ -26,6 +26,7 @@ #include "platform.h" #include "gnunet-service-transport.h" #include "gnunet-service-transport_hello.h" +#include "gnunet-service-transport_ats.h" #include "gnunet-service-transport_plugins.h" /** @@ -78,6 +79,49 @@ static struct TransportPlugin *plugins_head; static struct TransportPlugin *plugins_tail; +/** + * Function that will be called to update metrics for an address + * + * @param cls closure + * @param address address to update metrics for + * @param session the session + * @param distance new distance + */ +static void +plugin_env_update_distance (void *cls, + const struct GNUNET_HELLO_Address *address, + uint32_t distance) +{ + GST_ats_update_distance (address, + distance); +} + + +/** + * Function that will be called to figure if an address is an loopback, + * LAN, WAN etc. address + * + * @param cls closure + * @param addr binary address + * @param addrlen length of the @a addr + * @return type of the network @a addr belongs to + */ +static enum GNUNET_NetworkType +plugin_env_address_to_type (void *cls, + const struct sockaddr *addr, + size_t addrlen) +{ + if (NULL == GST_is) + { + GNUNET_break(0); + return GNUNET_NT_UNSPECIFIED; + } + return GNUNET_NT_scanner_get_type (GST_is, + addr, + addrlen); +} + + /** * Load and initialize all plugins. The respective functions will be * invoked by the plugins when the respective events happen. The @@ -89,15 +133,12 @@ static struct TransportPlugin *plugins_tail; * @param session_start_cb function to call when a session was created * @param session_end_cb function to call when a session was terminated * @param address_type_cb function to call when a address type is requested - * @param metric_update_cb function to call when address metrics change */ void GST_plugins_load (GNUNET_TRANSPORT_PluginReceiveCallback recv_cb, GNUNET_TRANSPORT_AddressNotification address_cb, GNUNET_TRANSPORT_SessionStart session_start_cb, - GNUNET_TRANSPORT_SessionEnd session_end_cb, - GNUNET_TRANSPORT_AddressToType address_type_cb, - GNUNET_TRANSPORT_UpdateAddressMetrics metric_update_cb) + GNUNET_TRANSPORT_SessionEnd session_end_cb) { struct TransportPlugin *plug; struct TransportPlugin *next; @@ -108,15 +149,19 @@ GST_plugins_load (GNUNET_TRANSPORT_PluginReceiveCallback recv_cb, int fail; if (GNUNET_OK != - GNUNET_CONFIGURATION_get_value_number (GST_cfg, "TRANSPORT", - "NEIGHBOUR_LIMIT", &tneigh)) + GNUNET_CONFIGURATION_get_value_number (GST_cfg, + "TRANSPORT", + "NEIGHBOUR_LIMIT", + &tneigh)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Transport service is lacking NEIGHBOUR_LIMIT option.\n")); return; } if (GNUNET_OK != - GNUNET_CONFIGURATION_get_value_string (GST_cfg, "TRANSPORT", "PLUGINS", + GNUNET_CONFIGURATION_get_value_string (GST_cfg, + "TRANSPORT", + "PLUGINS", &plugs)) return; GNUNET_log (GNUNET_ERROR_TYPE_INFO, @@ -127,7 +172,9 @@ GST_plugins_load (GNUNET_TRANSPORT_PluginReceiveCallback recv_cb, GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Loading `%s' transport plugin\n"), pos); - GNUNET_asprintf (&libname, "libgnunet_plugin_transport_%s", pos); + GNUNET_asprintf (&libname, + "libgnunet_plugin_transport_%s", + pos); plug = GNUNET_new (struct TransportPlugin); plug->short_name = GNUNET_strdup (pos); plug->lib_name = libname; @@ -139,11 +186,13 @@ GST_plugins_load (GNUNET_TRANSPORT_PluginReceiveCallback recv_cb, plug->env.notify_address = address_cb; plug->env.session_start = session_start_cb; plug->env.session_end = session_end_cb; - plug->env.get_address_type = address_type_cb; - plug->env.update_address_metrics = metric_update_cb; + plug->env.get_address_type = &plugin_env_address_to_type; + plug->env.update_address_distance = &plugin_env_update_distance; plug->env.max_connections = tneigh; plug->env.stats = GST_stats; - GNUNET_CONTAINER_DLL_insert (plugins_head, plugins_tail, plug); + GNUNET_CONTAINER_DLL_insert (plugins_head, + plugins_tail, + plug); } GNUNET_free (plugs); next = plugins_head; @@ -151,13 +200,16 @@ GST_plugins_load (GNUNET_TRANSPORT_PluginReceiveCallback recv_cb, { plug = next; next = plug->next; - plug->api = GNUNET_PLUGIN_load (plug->lib_name, &plug->env); + plug->api = GNUNET_PLUGIN_load (plug->lib_name, + &plug->env); if (NULL == plug->api) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Failed to load transport plugin for `%s'\n"), plug->lib_name); - GNUNET_CONTAINER_DLL_remove (plugins_head, plugins_tail, plug); + GNUNET_CONTAINER_DLL_remove (plugins_head, + plugins_tail, + plug); GNUNET_free (plug->short_name); GNUNET_free (plug->lib_name); GNUNET_free (plug); @@ -258,7 +310,9 @@ GST_plugins_load (GNUNET_TRANSPORT_PluginReceiveCallback recv_cb, _("Did not load plugin `%s' due to missing functions\n"), plug->lib_name); GNUNET_break (NULL == GNUNET_PLUGIN_unload (plug->lib_name, plug->api)); - GNUNET_CONTAINER_DLL_remove (plugins_head, plugins_tail, plug); + GNUNET_CONTAINER_DLL_remove (plugins_head, + plugins_tail, + plug); GNUNET_free (plug->short_name); GNUNET_free (plug->lib_name); GNUNET_free (plug); @@ -355,17 +409,26 @@ GST_plugins_a2s (const struct GNUNET_HELLO_Address *address) return TRANSPORT_SESSION_INBOUND_STRING; /* Addresse with length 0 are inbound, address->address itself may be NULL */ api = GST_plugins_printer_find (address->transport_name); if (NULL == api) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Failed to find transport plugin `%s'\n", + address->transport_name); return ""; + } if (0 == address->address_length) { - GNUNET_snprintf (unable_to_show, sizeof (unable_to_show), + GNUNET_snprintf (unable_to_show, + sizeof (unable_to_show), "", (unsigned int) address->address_length, address->transport_name); return unable_to_show; } - return (NULL != (s = api->address_to_string (NULL, address->address, - address->address_length)) ? s : ""); + return (NULL != (s = api->address_to_string (NULL, + address->address, + address->address_length)) + ? s + : ""); } @@ -386,7 +449,8 @@ GST_plugins_monitor_subscribe (GNUNET_TRANSPORT_SessionInfoCallback cb, GNUNET_break (0); else pos->api->setup_monitor (pos->api->cls, - cb, cb_cls); + cb, + cb_cls); }