X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fdv%2Fplugin_transport_dv.c;h=697ca0c4cf211e3fa5cea15eaacdfc6efda51e57;hb=19377520016cc644070d207af34ae3e76618fdc8;hp=38826e47fb168c3d81521fa5d2206290ad57f78d;hpb=232537fa5ddfbd27eaa426f7bf7e1279a27f56ab;p=oweals%2Fgnunet.git diff --git a/src/dv/plugin_transport_dv.c b/src/dv/plugin_transport_dv.c index 38826e47f..697ca0c4c 100644 --- a/src/dv/plugin_transport_dv.c +++ b/src/dv/plugin_transport_dv.c @@ -4,7 +4,7 @@ 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 2, or (at your + by the Free Software Foundation; either version 3, or (at your option) any later version. GNUnet is distributed in the hope that it will be useful, but @@ -34,7 +34,7 @@ #include "gnunet_statistics_service.h" #include "gnunet_dv_service.h" #include "gnunet_transport_service.h" -#include "../transport/plugin_transport.h" +#include "gnunet_transport_plugin.h" #include "dv.h" #define DEBUG_TEMPLATE GNUNET_NO @@ -158,15 +158,22 @@ void handle_dv_message_received (void *cls, my_id = GNUNET_strdup(GNUNET_i2s(plugin->env->my_identity)); GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "plugin_transport_dv", - _("%s Received message from %s) of type %d, distance %u!\n"), + _("%s Received message from %s of type %d, distance %u!\n"), my_id, GNUNET_i2s(sender), ntohs(((struct GNUNET_MessageHeader *)msg)->type), distance); GNUNET_free_non_null(my_id); #endif + struct GNUNET_TRANSPORT_ATS_Information ats[2]; + ats[0].type = htonl (GNUNET_TRANSPORT_ATS_QUALITY_NET_DISTANCE); + ats[0].value = htonl (distance); + ats[1].type = htonl (GNUNET_TRANSPORT_ATS_ARRAY_TERMINATOR); + ats[1].value = htonl (0); + plugin->env->receive(plugin->env->cls, sender, (struct GNUNET_MessageHeader *)msg, - distance, - NULL, + (const struct GNUNET_TRANSPORT_ATS_Information *) &ats, + 2, + NULL, sender_address, sender_address_len); @@ -231,10 +238,6 @@ dv_plugin_send (void *cls, addrlen, cont, cont_cls); -#if DEBUG_DV - GNUNET_free_non_null(my_identity); -#endif - return ret; } @@ -346,28 +349,37 @@ static const char *address_to_string (void *cls, } /** - * Another peer has suggested an address for this - * peer and transport plugin. Check that this could be a valid - * address. If so, consider adding it to the list - * of addresses. + * 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 addr * @return GNUNET_OK if this is a plausible address for this peer - * and transport + * and transport, GNUNET_SYSERR if not * - * FIXME: does this mean anything for the DV plugin? */ static int -dv_plugin_address_suggested (void *cls, - void *addr, size_t addrlen) +dv_plugin_check_address (void *cls, + const void *addr, size_t addrlen) { - /* struct Plugin *plugin = cls; */ - - /* check if the address is plausible; if so, - add it to our list! */ - return GNUNET_NO; + struct Plugin *plugin = cls; + /* Verify that the first peer of this address matches our peer id! */ + if ((addrlen != (2 * sizeof(struct GNUNET_PeerIdentity))) || (0 != memcmp(addr, plugin->env->my_identity, sizeof(struct GNUNET_PeerIdentity)))) + { + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "%s: Address not correct size or identity doesn't match ours!\n", GNUNET_i2s(plugin->env->my_identity)); + if (addrlen == (2 * sizeof(struct GNUNET_PeerIdentity))) + { + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Peer in address is %s\n", GNUNET_i2s(addr)); + } + return GNUNET_SYSERR; + } + return GNUNET_OK; } @@ -384,7 +396,7 @@ libgnunet_plugin_transport_dv_init (void *cls) plugin = GNUNET_malloc (sizeof (struct Plugin)); plugin->env = env; - plugin->dv_handle = GNUNET_DV_connect(env->sched, env->cfg, &handle_dv_message_received, plugin); + plugin->dv_handle = GNUNET_DV_connect(env->cfg, &handle_dv_message_received, plugin); if (plugin->dv_handle == NULL) { @@ -397,7 +409,7 @@ libgnunet_plugin_transport_dv_init (void *cls) api->send = &dv_plugin_send; api->disconnect = &dv_plugin_disconnect; api->address_pretty_printer = &dv_plugin_address_pretty_printer; - api->check_address = &dv_plugin_address_suggested; + api->check_address = &dv_plugin_check_address; api->address_to_string = &address_to_string; return api; }