From: Christian Grothoff Date: Fri, 19 Mar 2010 14:24:14 +0000 (+0000) Subject: moving gnunet-peerinfo.c to allow it to use transport_api X-Git-Tag: initial-import-from-subversion-38251~22393 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=7b7ec4fefd44742d9368638df9670771b8eaf259;p=oweals%2Fgnunet.git moving gnunet-peerinfo.c to allow it to use transport_api --- diff --git a/HACKING b/HACKING index 5d8badcbb..6b5dfb001 100644 --- a/HACKING +++ b/HACKING @@ -6,7 +6,7 @@ include files: - _plugin: plugin definition - _protocol: structs used in network protocol - exceptions: - * GNUNET_config.h --- generated // FIXME: decapitalize + * gnunet_config.h --- generated * platform.h --- first included * plibc.h --- external library * gnunet_common.h --- fundamental routines diff --git a/TODO b/TODO index a0a86789c..6fb70aebd 100644 --- a/TODO +++ b/TODO @@ -15,30 +15,20 @@ away), in order in which they will likely be done: 0.9.0pre0: * TRANSPORT: - - TCP not used bi-directionally (especially important also for PONG!) - Need a way for plugin to tell to service that it can *reliably* transmit - PONGs. Need *good* way to ensure only one (plugin) session is active at - any given point in time; need systematic way to periodically probe latency/ - transport cost changes - - disconnect notifications from TCP not always as nice as we might want - them to be (but how can we do this cleanly given that UDP is connectionless?) - implement transport API to pretty-print transport address + resolve cyclic dependency (gnunet-peerinfo -> transport_api -> peerinfo!) + gnunet-transport-service crashes when asked to resolve address (!) + asynchronous transport lookup and non-CPS iterator in peerinfo require some work to ensure printing in the proper order... - - instantly filter addresses from *other* peers that - are *equal* to our own address + port (i.e., localhost:2086). We - no longer filter those for outgoing (helps with loopback testing - and keeps the code clean), but we should filter strictly *impossible* - incoming addresses! This is for efficiency, not correctness. - - [./transport/gnunet-service-transport.c:173]: (style) struct or union member 'TransportPlugin::rebuild' is never used - - [./transport/plugin_transport_tcp.c:391]: (style) struct or union member 'Plugin::address_update_task' is never used * CORE: - SET_KEY is triggered every 2.5 minutes (after session is up); should just do PING (not SET_KEY + PING) - "Forcing disconnect of XXX due to inactivity" -- can happen every few MS!? (disconnect does not really succeed, or what?) + Also, core does not seem to actually decrement the number of active + sessions even if no connections exist for a while! (likely related...) + - transport reports bw quota violations on big-endian systems (core or + transport issue?) * HELLO: - need function to test "equivalency" of HELLOs; use in topology! * FS: @@ -253,10 +243,38 @@ away), in order in which they will likely be done: - Remove KBlocks in gnunet-unindex (see discussion with Kenneth Almquist on gnunet-devs in 9/2009) - Allow checking of presence of search results and/or content via command-line tools (add options to gnunet-search / gnunet-download to limit search to local peer) -* STATISTICS: - - should use BIO instead of mmap * PEERINFO: - expire 'ancient' HELLOs (those without valid addresses AND that we have not 'used' (for their public keys) in a while; need a way to track actual 'use') - make sue we also trigger notifications whenever HELLOs expire + + + +Optimizations: +* TCP: + - should use hash map to look up sessions +* PEERINFO: + - api creates many, many short-lived TCP connections; either some + clients should use the API differently or we need to change the + API to enable re-use of connections to the service +* STATISTICS: + - should use BIO instead of mmap +* TRANSPORT: + - need to periodically probe latency/transport cost changes & possibly switch transport + - instantly filter addresses from *other* peers that + are *equal* to our own address + port (i.e., localhost:2086). We + no longer filter those for outgoing (helps with loopback testing + and keeps the code clean), but we should filter strictly *impossible* + incoming addresses! This is for efficiency, not correctness. + - should use hash map to look up Neighbours + +Minor features: +* TCP: + - repeatedly resolve hostname and look up interfaces to determine our own IP + - [./transport/plugin_transport_tcp.c:391]: (style) struct or union member 'Plugin::address_update_task' is never used (related to issue above) +* TRANSPORT: + - [./transport/gnunet-service-transport.c:173]: (style) struct or union member 'TransportPlugin::rebuild' is never used (related to TCP not refreshing external addresses?) + + + diff --git a/configure.ac b/configure.ac index 41157ca29..4251e329c 100644 --- a/configure.ac +++ b/configure.ac @@ -655,6 +655,7 @@ src/nat/Makefile src/nat/libnatpmp/Makefile src/nat/miniupnp/Makefile src/peerinfo/Makefile +src/peerinfo-tool/Makefile src/statistics/Makefile src/template/Makefile src/testing/Makefile diff --git a/src/Makefile.am b/src/Makefile.am index 4d63bc756..a01288078 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -22,6 +22,7 @@ SUBDIRS = \ datastore \ template \ transport \ + peerinfo-tool \ core \ testing \ $(HOSTLIST_DIR) \ diff --git a/src/peerinfo-tool/Makefile.am b/src/peerinfo-tool/Makefile.am new file mode 100644 index 000000000..b9e6d7d07 --- /dev/null +++ b/src/peerinfo-tool/Makefile.am @@ -0,0 +1,24 @@ +INCLUDES = -I$(top_srcdir)/src/include + +if MINGW + WINFLAGS = -Wl,--no-undefined -Wl,--export-all-symbols -lole32 -lshell32 -luuid -liconv -lstdc++ -lcomdlg32 -lgdi32 +endif + +if USE_COVERAGE + AM_CFLAGS = --coverage -O0 + XLIB = -lgcov +endif + +bin_PROGRAMS = \ + gnunet-peerinfo + +gnunet_peerinfo_SOURCES = \ + gnunet-peerinfo.c +gnunet_peerinfo_LDADD = \ + $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \ + $(top_builddir)/src/transport/libgnunettransport.la \ + $(top_builddir)/src/util/libgnunetutil.la + + +#check_SCRIPTS = \ +# test_gnunet_peerinfo.sh diff --git a/src/peerinfo-tool/gnunet-peerinfo.c b/src/peerinfo-tool/gnunet-peerinfo.c new file mode 100644 index 000000000..c056b390e --- /dev/null +++ b/src/peerinfo-tool/gnunet-peerinfo.c @@ -0,0 +1,223 @@ +/* + This file is part of GNUnet. + (C) 2001, 2002, 2003, 2004, 2006, 2009, 2010 Christian Grothoff (and other contributing authors) + + 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 + 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. + + 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. +*/ + +/** + * @file peerinfo-tool/gnunet-peerinfo.c + * @brief Print information about other known peers. + * @author Christian Grothoff + */ +#include "platform.h" +#include "gnunet_crypto_lib.h" +#include "gnunet_configuration_lib.h" +#include "gnunet_getopt_lib.h" +#include "gnunet_peerinfo_service.h" +#include "gnunet_transport_service.h" +#include "gnunet_program_lib.h" + +static int no_resolve; + +static int be_quiet; + +static int get_self; + +static struct GNUNET_SCHEDULER_Handle *sched; + +static const struct GNUNET_CONFIGURATION_Handle *cfg; + +#define FIXME 0 + +#if FIXME +/** + * Function to call with a human-readable format of an address + * + * @param cls closure + * @param address NULL on error, otherwise 0-terminated printable UTF-8 string + */ +static void +print_resolved_address (void *cls, + const char *address) +{ + /* FIXME: need to buffer output from all requests and print it at + once, otherwise we mix results... */ + if (address == NULL) + { + return; + } + fprintf (stderr, " %s\n", address); +} +#endif + +/** + * Iterator callback to go over all addresses. + * + * @param cls closure + * @param tname name of the transport + * @param expiration expiration time + * @param addr the address + * @param addrlen length of the address + * @return GNUNET_OK to keep the address and continue + */ +static int +print_address (void *cls, + const char *tname, + struct GNUNET_TIME_Absolute expiration, + const void *addr, size_t addrlen) +{ +#if FIXME + GNUNET_TRANSPORT_address_lookup (sched, + cfg, + addr, + addrlen, + no_resolve, + tname, + GNUNET_TIME_UNIT_SECONDS, + &print_resolved_address, + NULL); +#endif + return GNUNET_OK; +} + + +/** + * Print information about the peer. + * Currently prints the GNUNET_PeerIdentity, trust and the IP. + * Could of course do more (e.g. resolve via DNS). + */ +static void +print_peer_info (void *cls, + const struct GNUNET_PeerIdentity *peer, + const struct GNUNET_HELLO_Message *hello, uint32_t trust) +{ + struct GNUNET_CRYPTO_HashAsciiEncoded enc; + + if (peer == NULL) + return; + GNUNET_CRYPTO_hash_to_enc (&peer->hashPubKey, &enc); + if (be_quiet) + { + printf ("%s\n", (const char *) &enc); + return; + } + printf (_("Peer `%s' with trust %8u\n"), (const char *) &enc, trust); + GNUNET_HELLO_iterate_addresses (hello, GNUNET_NO, &print_address, NULL); +} + +/** + * Main function that will be run by the scheduler. + * + * @param cls closure + * @param s the scheduler to use + * @param args remaining command-line arguments + * @param cfgfile name of the configuration file used (for saving, can be NULL!) + * @param c configuration + */ +static void +run (void *cls, + struct GNUNET_SCHEDULER_Handle *s, + char *const *args, + const char *cfgfile, + const struct GNUNET_CONFIGURATION_Handle *c) +{ + struct GNUNET_CRYPTO_RsaPrivateKey *priv; + struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pub; + struct GNUNET_PeerIdentity pid; + struct GNUNET_CRYPTO_HashAsciiEncoded enc; + char *fn; + + sched = s; + cfg = c; + if (get_self != GNUNET_YES) + { + (void) GNUNET_PEERINFO_iterate (cfg, + sched, + NULL, + 0, + GNUNET_TIME_relative_multiply + (GNUNET_TIME_UNIT_SECONDS, 2), + &print_peer_info, NULL); + } + else + { + if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_filename (cfg, + "GNUNETD", + "HOSTKEY", &fn)) + { + fprintf (stderr, + _("Could not find option `%s:%s' in configuration.\n"), + "GNUNETD", + "HOSTKEYFILE"); + return; + } + priv = GNUNET_CRYPTO_rsa_key_create_from_file (fn); + if (priv == NULL) + { + fprintf (stderr, _("Loading hostkey from `%s' failed.\n"), fn); + GNUNET_free (fn); + return; + } + GNUNET_free (fn); + GNUNET_CRYPTO_rsa_key_get_public (priv, &pub); + GNUNET_CRYPTO_rsa_key_free (priv); + GNUNET_CRYPTO_hash (&pub, sizeof (pub), &pid.hashPubKey); + GNUNET_CRYPTO_hash_to_enc (&pid.hashPubKey, &enc); + if (be_quiet) + printf ("%s\n", (char *) &enc); + else + printf (_("I am peer `%s'.\n"), (const char *) &enc); + } +} + + +/** + * gnunet-peerinfo command line options + */ +static struct GNUNET_GETOPT_CommandLineOption options[] = { + {'n', "numeric", NULL, + gettext_noop ("don't resolve host names"), + 0, &GNUNET_GETOPT_set_one, &no_resolve}, + {'q', "quiet", NULL, + gettext_noop ("output only the identity strings"), + 0, &GNUNET_GETOPT_set_one, &be_quiet}, + {'s', "self", NULL, + gettext_noop ("output our own identity only"), + 0, &GNUNET_GETOPT_set_one, &get_self}, + GNUNET_GETOPT_OPTION_END +}; + +/** + * The main function to obtain peer information. + * + * @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) +{ + return (GNUNET_OK == + GNUNET_PROGRAM_run (argc, + argv, + "gnunet-peerinfo", + gettext_noop ("Print information about peers."), + options, &run, NULL)) ? 0 : 1; +} + +/* end of gnunet-peerinfo.c */ diff --git a/src/peerinfo/Makefile.am b/src/peerinfo/Makefile.am index ea7ef1316..42396e3e7 100644 --- a/src/peerinfo/Makefile.am +++ b/src/peerinfo/Makefile.am @@ -23,15 +23,8 @@ libgnunetpeerinfo_la_LDFLAGS = \ bin_PROGRAMS = \ - gnunet-peerinfo \ gnunet-service-peerinfo -gnunet_peerinfo_SOURCES = \ - gnunet-peerinfo.c -gnunet_peerinfo_LDADD = \ - $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \ - $(top_builddir)/src/util/libgnunetutil.la - gnunet_service_peerinfo_SOURCES = \ gnunet-service-peerinfo.c gnunet_service_peerinfo_LDADD = \ @@ -54,6 +47,3 @@ test_peerinfo_api_LDADD = \ EXTRA_DIST = \ test_peerinfo_api_data.conf - -#check_SCRIPTS = \ -# test_gnunet_peerinfo.sh diff --git a/src/peerinfo/gnunet-peerinfo.c b/src/peerinfo/gnunet-peerinfo.c deleted file mode 100644 index d4a36a059..000000000 --- a/src/peerinfo/gnunet-peerinfo.c +++ /dev/null @@ -1,222 +0,0 @@ -/* - This file is part of GNUnet. - (C) 2001, 2002, 2003, 2004, 2006, 2009 Christian Grothoff (and other contributing authors) - - 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 - 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. - - 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. -*/ - -/** - * @file peerinfo/gnunet-peerinfo.c - * @brief Print information about other known peers. - * @author Christian Grothoff - */ -#include "platform.h" -#include "gnunet_crypto_lib.h" -#include "gnunet_configuration_lib.h" -#include "gnunet_getopt_lib.h" -#include "gnunet_peerinfo_service.h" -#include "gnunet_transport_service.h" -#include "gnunet_program_lib.h" - -static int no_resolve; - -static int be_quiet; - -static int get_self; - -static struct GNUNET_SCHEDULER_Handle *sched; - -static const struct GNUNET_CONFIGURATION_Handle *cfg; - -#if FIXME -/** - * Function to call with a human-readable format of an address - * - * @param cls closure - * @param address NULL on error, otherwise 0-terminated printable UTF-8 string - */ -static void -print_resolved_address (void *cls, - const char *address) -{ - /* FIXME: need to buffer output from all requests and print it at - once, otherwise we mix results... */ - if (address == NULL) - { - fprintf (stderr, "\n"); - return; - } - fprintf (stderr, " %s\n", address); -} -#endif - -/** - * Iterator callback to go over all addresses. - * - * @param cls closure - * @param tname name of the transport - * @param expiration expiration time - * @param addr the address - * @param addrlen length of the address - * @return GNUNET_OK to keep the address and continue - */ -static int -print_address (void *cls, - const char *tname, - struct GNUNET_TIME_Absolute expiration, - const void *addr, size_t addrlen) -{ -#if FIXME - GNUNET_TRANSPORT_address_lookup (sched, - cfg, - addr, - addrlen, - no_resolve, - tname, - GNUNET_TIME_UNIT_SECONDS, - &print_resolved_address, - NULL); -#endif - return GNUNET_OK; -} - - -/** - * Print information about the peer. - * Currently prints the GNUNET_PeerIdentity, trust and the IP. - * Could of course do more (e.g. resolve via DNS). - */ -static void -print_peer_info (void *cls, - const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_HELLO_Message *hello, uint32_t trust) -{ - struct GNUNET_CRYPTO_HashAsciiEncoded enc; - - if (peer == NULL) - return; - GNUNET_CRYPTO_hash_to_enc (&peer->hashPubKey, &enc); - if (be_quiet) - { - printf ("%s\n", (const char *) &enc); - return; - } - printf (_("Peer `%s' with trust %8u\n"), (const char *) &enc, trust); - GNUNET_HELLO_iterate_addresses (hello, GNUNET_NO, &print_address, NULL); -} - -/** - * Main function that will be run by the scheduler. - * - * @param cls closure - * @param s the scheduler to use - * @param args remaining command-line arguments - * @param cfgfile name of the configuration file used (for saving, can be NULL!) - * @param c configuration - */ -static void -run (void *cls, - struct GNUNET_SCHEDULER_Handle *s, - char *const *args, - const char *cfgfile, - const struct GNUNET_CONFIGURATION_Handle *c) -{ - struct GNUNET_CRYPTO_RsaPrivateKey *priv; - struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pub; - struct GNUNET_PeerIdentity pid; - struct GNUNET_CRYPTO_HashAsciiEncoded enc; - char *fn; - - sched = s; - cfg = c; - if (get_self != GNUNET_YES) - { - (void) GNUNET_PEERINFO_iterate (cfg, - sched, - NULL, - 0, - GNUNET_TIME_relative_multiply - (GNUNET_TIME_UNIT_SECONDS, 2), - &print_peer_info, NULL); - } - else - { - if (GNUNET_OK != - GNUNET_CONFIGURATION_get_value_filename (cfg, - "GNUNETD", - "HOSTKEY", &fn)) - { - fprintf (stderr, - _("Could not find option `%s:%s' in configuration.\n"), - "GNUNETD", - "HOSTKEYFILE"); - return; - } - priv = GNUNET_CRYPTO_rsa_key_create_from_file (fn); - if (priv == NULL) - { - fprintf (stderr, _("Loading hostkey from `%s' failed.\n"), fn); - GNUNET_free (fn); - return; - } - GNUNET_free (fn); - GNUNET_CRYPTO_rsa_key_get_public (priv, &pub); - GNUNET_CRYPTO_rsa_key_free (priv); - GNUNET_CRYPTO_hash (&pub, sizeof (pub), &pid.hashPubKey); - GNUNET_CRYPTO_hash_to_enc (&pid.hashPubKey, &enc); - if (be_quiet) - printf ("%s\n", (char *) &enc); - else - printf (_("I am peer `%s'.\n"), (const char *) &enc); - } -} - - -/** - * gnunet-peerinfo command line options - */ -static struct GNUNET_GETOPT_CommandLineOption options[] = { - {'n', "numeric", NULL, - gettext_noop ("don't resolve host names"), - 0, &GNUNET_GETOPT_set_one, &no_resolve}, - {'q', "quiet", NULL, - gettext_noop ("output only the identity strings"), - 0, &GNUNET_GETOPT_set_one, &be_quiet}, - {'s', "self", NULL, - gettext_noop ("output our own identity only"), - 0, &GNUNET_GETOPT_set_one, &get_self}, - GNUNET_GETOPT_OPTION_END -}; - -/** - * The main function to obtain peer information. - * - * @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) -{ - return (GNUNET_OK == - GNUNET_PROGRAM_run (argc, - argv, - "gnunet-peerinfo", - gettext_noop ("Print information about peers."), - options, &run, NULL)) ? 0 : 1; -} - -/* end of gnunet-peerinfo.c */