X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftransport%2Fplugin_transport_udp_broadcasting.c;h=0c26aa62493760f66ff0aee499e034bad462b5c2;hb=1b1edf92c24f91c36747458e880e0d6a5e559e95;hp=814328f480f05dc734391f47cdf3ad7551c22e44;hpb=858539f346bb72c1313c0f9bf0ef20d829664ae5;p=oweals%2Fgnunet.git diff --git a/src/transport/plugin_transport_udp_broadcasting.c b/src/transport/plugin_transport_udp_broadcasting.c index 814328f48..0c26aa624 100644 --- a/src/transport/plugin_transport_udp_broadcasting.c +++ b/src/transport/plugin_transport_udp_broadcasting.c @@ -1,21 +1,21 @@ /* This file is part of GNUnet - (C) 2010, 2011 Christian Grothoff (and other contributing authors) + Copyright (C) 2010, 2011 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 */ /** @@ -29,7 +29,6 @@ #include "gnunet_hello_lib.h" #include "gnunet_util_lib.h" #include "gnunet_fragmentation_lib.h" -#include "gnunet_nat_lib.h" #include "gnunet_protocols.h" #include "gnunet_resolver_service.h" #include "gnunet_signatures.h" @@ -88,7 +87,7 @@ struct BroadcastAddress struct Plugin *plugin; - void *addr; + struct sockaddr *addr; socklen_t addrlen; @@ -106,86 +105,41 @@ struct BroadcastAddress }; -struct Mstv4Context +/** + * Client-specific context for #broadcast_mst_cb(). + */ +struct MstContext { struct Plugin *plugin; - struct IPv4UdpAddress addr; - - /** - * ATS network type. - */ - enum GNUNET_ATS_Network_Type ats_address_network_type; -}; - + const union UdpAddress *udp_addr; -struct Mstv6Context -{ - struct Plugin *plugin; - - struct IPv6UdpAddress addr; + size_t udp_addr_len; /** * ATS network type. */ - enum GNUNET_ATS_Network_Type ats_address_network_type; + enum GNUNET_NetworkType ats_address_network_type; }; +/** + * Parse broadcast message received. + * + * @param cls the `struct Plugin` + * @param client the `struct MstContext` with sender address + * @param message the message we received + * @return #GNUNET_OK (always) + */ static int -broadcast_ipv6_mst_cb (void *cls, void *client, - const struct GNUNET_MessageHeader *message) -{ - struct Plugin *plugin = cls; - struct Mstv6Context *mc = client; - struct GNUNET_HELLO_Address *address; - const struct GNUNET_MessageHeader *hello; - const struct UDP_Beacon_Message *msg; - struct GNUNET_ATS_Information atsi; - - msg = (const struct UDP_Beacon_Message *) message; - - if (GNUNET_MESSAGE_TYPE_TRANSPORT_BROADCAST_BEACON != - ntohs (msg->header.type)) - return GNUNET_OK; - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Received beacon with %u bytes from peer `%s' via address `%s'\n", - ntohs (msg->header.size), GNUNET_i2s (&msg->sender), - udp_address_to_string (NULL, &mc->addr, sizeof (mc->addr))); - - /* setup ATS */ - atsi.type = htonl (GNUNET_ATS_NETWORK_TYPE); - atsi.value = htonl (mc->ats_address_network_type); - GNUNET_break (ntohl(mc->ats_address_network_type) != GNUNET_ATS_NET_UNSPECIFIED); - - hello = (struct GNUNET_MessageHeader *) &msg[1]; - address = GNUNET_HELLO_address_allocate (&msg->sender, PLUGIN_NAME, - (const char *) &mc->addr, - sizeof (mc->addr), - GNUNET_HELLO_ADDRESS_INFO_NONE); - plugin->env->receive (plugin->env->cls, address, NULL, hello); - plugin->env->update_address_metrics (plugin->env->cls, address, - NULL, &atsi, 1); - GNUNET_HELLO_address_free (address); - GNUNET_STATISTICS_update (plugin->env->stats, - _ - ("# IPv6 multicast HELLO beacons received via udp"), - 1, GNUNET_NO); - GNUNET_free (mc); - return GNUNET_OK; -} - - -static int -broadcast_ipv4_mst_cb (void *cls, void *client, - const struct GNUNET_MessageHeader *message) +broadcast_mst_cb (void *cls, + const struct GNUNET_MessageHeader *message) { - struct Plugin *plugin = cls; - struct Mstv4Context *mc = client; + struct MstContext *mc = cls; + struct Plugin *plugin = mc->plugin; struct GNUNET_HELLO_Address *address; const struct GNUNET_MessageHeader *hello; const struct UDP_Beacon_Message *msg; - struct GNUNET_ATS_Information atsi; msg = (const struct UDP_Beacon_Message *) message; @@ -194,87 +148,68 @@ broadcast_ipv4_mst_cb (void *cls, void *client, return GNUNET_OK; LOG (GNUNET_ERROR_TYPE_DEBUG, "Received beacon with %u bytes from peer `%s' via address `%s'\n", - ntohs (msg->header.size), GNUNET_i2s (&msg->sender), - udp_address_to_string (NULL, &mc->addr, sizeof (mc->addr))); - - - /* setup ATS */ - atsi.type = htonl (GNUNET_ATS_NETWORK_TYPE); - atsi.value = htonl (mc->ats_address_network_type); - GNUNET_break (ntohl(mc->ats_address_network_type) != GNUNET_ATS_NET_UNSPECIFIED); - + ntohs (msg->header.size), + GNUNET_i2s (&msg->sender), + udp_address_to_string (NULL, + mc->udp_addr, + mc->udp_addr_len)); hello = (struct GNUNET_MessageHeader *) &msg[1]; address = GNUNET_HELLO_address_allocate (&msg->sender, PLUGIN_NAME, - (const char *) &mc->addr, - sizeof (mc->addr), + mc->udp_addr, + mc->udp_addr_len, GNUNET_HELLO_ADDRESS_INFO_NONE); - plugin->env->receive (plugin->env->cls, address, NULL, hello); - plugin->env->update_address_metrics (plugin->env->cls, address, - NULL, &atsi, 1); + plugin->env->receive (plugin->env->cls, + address, + NULL, + hello); GNUNET_HELLO_address_free (address); - GNUNET_STATISTICS_update (plugin->env->stats, - _("# IPv4 broadcast HELLO beacons received via udp"), + _("# Multicast HELLO beacons received via UDP"), 1, GNUNET_NO); - GNUNET_free (mc); return GNUNET_OK; } +/** + * We received a broadcast message. Process it and all subsequent + * messages in the same packet. + * + * @param plugin the UDP plugin + * @param buf the buffer with the message(s) + * @param size number of bytes in @a buf + * @param udp_addr address of the sender + * @param udp_addr_len number of bytes in @a udp_addr + * @param network_type network type of the sender's address + */ void udp_broadcast_receive (struct Plugin *plugin, const char *buf, ssize_t size, - const struct sockaddr *addr, - size_t addrlen) + const union UdpAddress *udp_addr, + size_t udp_addr_len, + enum GNUNET_NetworkType network_type) { - if (addrlen == sizeof (struct sockaddr_in)) - { - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Received IPv4 HELLO beacon broadcast with %i bytes from address %s\n", - size, GNUNET_a2s ((const struct sockaddr *) addr, addrlen)); - struct Mstv4Context *mc; - - mc = GNUNET_new (struct Mstv4Context); - struct sockaddr_in *av4 = (struct sockaddr_in *) addr; - - mc->addr.ipv4_addr = av4->sin_addr.s_addr; - mc->addr.u4_port = av4->sin_port; - mc->ats_address_network_type = plugin->env->get_address_type (plugin->env->cls, - (const struct sockaddr *) addr, - addrlen); - - GNUNET_assert (NULL != plugin->broadcast_ipv4_mst); - if (GNUNET_OK != - GNUNET_SERVER_mst_receive (plugin->broadcast_ipv4_mst, mc, buf, size, - GNUNET_NO, GNUNET_NO)) - GNUNET_free (mc); - } - if (addrlen == sizeof (struct sockaddr_in6)) - { - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Received IPv6 HELLO beacon broadcast with %i bytes from address %s\n", - size, GNUNET_a2s ((const struct sockaddr *) &addr, addrlen)); - struct Mstv6Context *mc; - - mc = GNUNET_new (struct Mstv6Context); - struct sockaddr_in6 *av6 = (struct sockaddr_in6 *) addr; - - mc->addr.ipv6_addr = av6->sin6_addr; - mc->addr.u6_port = av6->sin6_port; - mc->ats_address_network_type = plugin->env->get_address_type (plugin->env->cls, (const struct sockaddr *) addr, addrlen); - GNUNET_assert (NULL != plugin->broadcast_ipv4_mst); - if (GNUNET_OK != - GNUNET_SERVER_mst_receive (plugin->broadcast_ipv6_mst, mc, buf, size, - GNUNET_NO, GNUNET_NO)) - GNUNET_free (mc); - } + struct GNUNET_MessageStreamTokenizer *broadcast_mst; + struct MstContext mc; + + broadcast_mst = GNUNET_MST_create (&broadcast_mst_cb, + &mc); + mc.plugin = plugin; + mc.udp_addr = udp_addr; + mc.udp_addr_len = udp_addr_len; + mc.ats_address_network_type = network_type; + GNUNET_MST_from_buffer (broadcast_mst, + buf, size, + GNUNET_NO, + GNUNET_NO); + GNUNET_MST_destroy (broadcast_mst); } static unsigned int -prepare_beacon (struct Plugin *plugin, struct UDP_Beacon_Message *msg) +prepare_beacon (struct Plugin *plugin, + struct UDP_Beacon_Message *msg) { uint16_t hello_size; uint16_t msg_size; @@ -293,14 +228,13 @@ prepare_beacon (struct Plugin *plugin, struct UDP_Beacon_Message *msg) msg->sender = *(plugin->env->my_identity); msg->header.size = htons (msg_size); msg->header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_BROADCAST_BEACON); - memcpy (&msg[1], hello, hello_size); + GNUNET_memcpy (&msg[1], hello, hello_size); return msg_size; } static void -udp_ipv4_broadcast_send (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) +udp_ipv4_broadcast_send (void *cls) { struct BroadcastAddress *baddr = cls; struct Plugin *plugin = baddr->plugin; @@ -375,8 +309,7 @@ udp_ipv4_broadcast_send (void *cls, static void -udp_ipv6_broadcast_send (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) +udp_ipv6_broadcast_send (void *cls) { struct BroadcastAddress *baddr = cls; struct Plugin *plugin = baddr->plugin; @@ -446,7 +379,7 @@ udp_ipv6_broadcast_send (void *cls, else GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL, baddr->cryogenic_fd, - &udp_ipv4_broadcast_send, + &udp_ipv6_broadcast_send, baddr); } else @@ -479,7 +412,7 @@ iface_proc (void *cls, { struct Plugin *plugin = cls; struct BroadcastAddress *ba; - enum GNUNET_ATS_Network_Type network; + enum GNUNET_NetworkType network; if (NULL == addr) return GNUNET_OK; @@ -495,7 +428,7 @@ iface_proc (void *cls, GNUNET_a2s (netmask, addrlen), name, netmask); network = plugin->env->get_address_type (plugin->env->cls, broadcast_addr, addrlen); - if (GNUNET_ATS_NET_LOOPBACK == network) + if (GNUNET_NT_LOOPBACK == network) { /* Broadcasting on loopback does not make sense */ return GNUNET_YES; @@ -504,7 +437,7 @@ iface_proc (void *cls, ba = GNUNET_new (struct BroadcastAddress); ba->plugin = plugin; ba->addr = GNUNET_malloc (addrlen); - memcpy (ba->addr, broadcast_addr, addrlen); + GNUNET_memcpy (ba->addr, broadcast_addr, addrlen); ba->addrlen = addrlen; if ( (GNUNET_YES == plugin->enable_ipv4) && @@ -594,28 +527,28 @@ iface_proc (void *cls, } +/** + * Setup broadcasting subsystem. + * + * @param plugin + * @param server_addrv6 + * @param server_addrv4 + */ void setup_broadcast (struct Plugin *plugin, struct sockaddr_in6 *server_addrv6, struct sockaddr_in *server_addrv4) { - const struct GNUNET_MessageHeader *hello; - - hello = plugin->env->get_our_hello (); if (GNUNET_YES == - GNUNET_HELLO_is_friend_only ((const struct GNUNET_HELLO_Message *) hello)) + GNUNET_CONFIGURATION_get_value_yesno (plugin->env->cfg, + "topology", + "FRIENDS-ONLY")) { LOG (GNUNET_ERROR_TYPE_WARNING, _("Disabling HELLO broadcasting due to friend-to-friend only configuration!\n")); return; } - /* always create tokenizers */ - plugin->broadcast_ipv4_mst = - GNUNET_SERVER_mst_create (&broadcast_ipv4_mst_cb, plugin); - plugin->broadcast_ipv6_mst = - GNUNET_SERVER_mst_create (&broadcast_ipv6_mst_cb, plugin); - if (GNUNET_YES != plugin->enable_broadcasting) return; /* We do not send, just receive */ @@ -647,6 +580,11 @@ setup_broadcast (struct Plugin *plugin, } +/** + * Stop broadcasting subsystem. + * + * @param plugin + */ void stop_broadcast (struct Plugin *plugin) { @@ -697,18 +635,6 @@ stop_broadcast (struct Plugin *plugin) GNUNET_free (p); } } - - /* Destroy MSTs */ - if (NULL != plugin->broadcast_ipv4_mst) - { - GNUNET_SERVER_mst_destroy (plugin->broadcast_ipv4_mst); - plugin->broadcast_ipv4_mst = NULL; - } - if (NULL != plugin->broadcast_ipv6_mst) - { - GNUNET_SERVER_mst_destroy (plugin->broadcast_ipv6_mst); - plugin->broadcast_ipv6_mst = NULL; - } } /* end of plugin_transport_udp_broadcasting.c */