From cc495dba9bd5ecbe25a8607a535fd439ec2d03fd Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Mon, 24 Jan 2011 15:17:39 +0000 Subject: [PATCH] doxyfixes --- TODO | 2 + src/chat/gnunet-chat.c | 5 +- src/chat/gnunet-service-chat.c | 8 +- src/fs/Makefile.am | 11 +- src/fs/fs_download.c | 11 +- src/fs/fs_test_lib.c | 2 + src/fs/gnunet-service-fs.c | 2 +- src/fs/perf_gnunet_service_fs_p2p_trust.c | 475 ++++++++++++++++++ src/include/Makefile.am | 4 +- src/monkey/Makefile.am | 13 +- .../gnunet_monkey_action.h | 0 src/{include => monkey}/gnunet_monkey_edb.h | 4 +- src/transport/plugin_transport_wlan.c | 2 +- src/vpn/gnunet-helper-vpn.c | 2 +- 14 files changed, 513 insertions(+), 28 deletions(-) create mode 100644 src/fs/perf_gnunet_service_fs_p2p_trust.c rename src/{include => monkey}/gnunet_monkey_action.h (100%) rename src/{include => monkey}/gnunet_monkey_edb.h (98%) diff --git a/TODO b/TODO index fd6a251ac..00acb96ac 100644 --- a/TODO +++ b/TODO @@ -62,6 +62,8 @@ - Remove KBlocks in gnunet-unindex (see discussion with Kenneth Almquist on gnunet-devs in 9/2009) - use different queue prioritization for probe-downloads vs. normal downloads - re-implement gnunet-auto-share + - implement 'GNUNET_FS_file_information_create_from_directory', avoiding + code duplication with gnunet-gtk's similar code (!) * GNUNET-GTK: [CG] - add tool bar - do meaningful update to status line (starting up, peer running, #connections, shutdown, ...) diff --git a/src/chat/gnunet-chat.c b/src/chat/gnunet-chat.c index b960db043..be6db0ca4 100644 --- a/src/chat/gnunet-chat.c +++ b/src/chat/gnunet-chat.c @@ -83,7 +83,7 @@ static int do_help (const char *args, const void *xtra); * @param cls closure, NULL * @param room in which room was the message received? * @param sender what is the ID of the sender? (maybe NULL) - * @param member_info information about the joining member + * @param meta information about the joining member * @param message the message text * @param options options for the message * @return GNUNET_OK to accept the message now, GNUNET_NO to @@ -183,6 +183,7 @@ confirmation_cb (void *cls, /** * Callback used for notification that another room member has joined or left. * + * @param cls closure (not used) * @param member_info will be non-null if the member is joining, NULL if he is * leaving * @param member_id hash of public key of the user (for unique identification) @@ -580,7 +581,7 @@ out: * @param cls closure, NULL * @param args remaining command-line arguments * @param cfgfile name of the configuration file used (for saving, can be NULL!) - * @param cfg configuration + * @param c configuration */ static void run (void *cls, diff --git a/src/chat/gnunet-service-chat.c b/src/chat/gnunet-service-chat.c index 4cf869595..e0a46abc4 100644 --- a/src/chat/gnunet-service-chat.c +++ b/src/chat/gnunet-service-chat.c @@ -19,8 +19,8 @@ */ /** - * @file chat/gnunet-service-caht.c - * @brief program that tracks template + * @file chat/gnunet-service-chat.c + * @brief service providing chat functionality * @author Christian Grothoff * @author Vitaly Minko */ @@ -1460,7 +1460,7 @@ cleanup_task (void *cls, * * @param cls closure, NULL * @param server handle to the server for this service - * @param identity the public identity of this peer + * @param my_identity the public identity of this peer * @param publicKey the public key of this peer */ static void @@ -1479,7 +1479,7 @@ core_init (void *cls, * * @param cls closure, NULL * @param server the initialized server - * @param cfg configuration to use + * @param c configuration to use */ static void run (void *cls, diff --git a/src/fs/Makefile.am b/src/fs/Makefile.am index 2f67ce36a..fb1772562 100644 --- a/src/fs/Makefile.am +++ b/src/fs/Makefile.am @@ -152,7 +152,8 @@ check_PROGRAMS = \ test_gnunet_service_fs_p2p \ perf_gnunet_service_fs_p2p \ perf_gnunet_service_fs_p2p_dht \ - perf_gnunet_service_fs_p2p_index + perf_gnunet_service_fs_p2p_index \ + perf_gnunet_service_fs_p2p_trust if HAVE_PYTHON_PEXPECT @@ -336,6 +337,14 @@ perf_gnunet_service_fs_p2p_dht_LDADD = \ $(top_builddir)/src/fs/libgnunetfs.la \ $(top_builddir)/src/util/libgnunetutil.la +perf_gnunet_service_fs_p2p_trust_SOURCES = \ + perf_gnunet_service_fs_p2p_trust.c +perf_gnunet_service_fs_p2p_trust_LDADD = \ + $(top_builddir)/src/fs/libgnunetfstest.a \ + $(top_builddir)/src/testing/libgnunettesting.la \ + $(top_builddir)/src/fs/libgnunetfs.la \ + $(top_builddir)/src/util/libgnunetutil.la + do_subst = $(SED) -e 's,[@]PYTHON[@],$(PYTHON),g' diff --git a/src/fs/fs_download.c b/src/fs/fs_download.c index 11db7fd10..126868e7b 100644 --- a/src/fs/fs_download.c +++ b/src/fs/fs_download.c @@ -464,6 +464,7 @@ check_completed (struct GNUNET_FS_DownloadContext *dc) * the top-level block will move to state BRS_DOWNLOAD_UP. * * @param dr one of our request entries + * @param dr download request to match against * @param data plaintext data, starting from the beginning of the file * @param data_len number of bytes in data */ @@ -802,12 +803,7 @@ try_top_down_reconstruction (struct GNUNET_FS_DownloadContext *dc, * Schedule the download of the specified block in the tree. * * @param dc overall download this block belongs to - * @param chk content-hash-key of the block - * @param offset offset of the block in the file - * (for IBlocks, the offset is the lowest - * offset of any DBlock in the subtree under - * the IBlock) - * @param depth depth of the block, 0 is the root of the tree + * @param dr request to schedule */ static void schedule_block_download (struct GNUNET_FS_DownloadContext *dc, @@ -1690,7 +1686,7 @@ deactivate_fs_download (void *cls) * @param file_start_offset desired starting offset for the download * in the original file; requesting tree should not contain * DBLOCKs prior to the file_start_offset - * @param file_length desired number of bytes the user wanted to access + * @param desired_length desired number of bytes the user wanted to access * (from file_start_offset). Resulting tree should not contain * DBLOCKs after file_start_offset + file_length. * @return download request tree for the given range of DBLOCKs at @@ -1788,6 +1784,7 @@ reconstruct_cont (void *cls, /** * Task requesting the next block from the tree encoder. * + * @param cls the 'struct GNUJNET_FS_DownloadContext' we're processing * @param tc task context */ static void diff --git a/src/fs/fs_test_lib.c b/src/fs/fs_test_lib.c index e63c5d596..fd600951c 100644 --- a/src/fs/fs_test_lib.c +++ b/src/fs/fs_test_lib.c @@ -527,6 +527,7 @@ GNUNET_FS_TEST_daemons_stop (unsigned int total, struct GNUNET_CONFIGURATION_Handle *gcfg; GNUNET_assert (total > 0); + GNUNET_assert (daemons[0] != NULL); pg = daemons[0]->group; gcfg = daemons[0]->gcfg; for (i=0;ipublish_tmp_file)); GNUNET_free (daemons[i]->publish_tmp_file); + daemons[i]->publish_tmp_file = NULL; } GNUNET_free (daemons[i]); daemons[i] = NULL; diff --git a/src/fs/gnunet-service-fs.c b/src/fs/gnunet-service-fs.c index deaa04289..66b7a5e93 100644 --- a/src/fs/gnunet-service-fs.c +++ b/src/fs/gnunet-service-fs.c @@ -39,7 +39,7 @@ #include "gnunet-service-fs_indexing.h" #include "fs.h" -#define DEBUG_FS GNUNET_NO +#define DEBUG_FS GNUNET_YES /** * Should we introduce random latency in processing? Required for proper diff --git a/src/fs/perf_gnunet_service_fs_p2p_trust.c b/src/fs/perf_gnunet_service_fs_p2p_trust.c new file mode 100644 index 000000000..d4e98dbf2 --- /dev/null +++ b/src/fs/perf_gnunet_service_fs_p2p_trust.c @@ -0,0 +1,475 @@ +/* + This file is part of GNUnet. + (C) 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 3, 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 fs/perf_gnunet_service_fs_p2p_trust.c + * @brief profile P2P routing trust mechanism. Creates + * a clique of NUM_DAEMONS (i.e. 3) where two + * peers share (seed) different files and download + * them from each other while all the other peers + * just "leach" those files. Ideally, the seeders + * "learn" that they contribute (to each other), + * and give the other seeder higher priority; + * naturally, this only happens nicely for larger + * files; finally, once the seeders are done, the + * leachers should see fast download rates as well. + * @author Christian Grothoff + * + * Sample outputs: + * - 1 MB, 3 peers: + * Download speed of type `seeder 1' was 3864 KiB/s + * Download speed of type `seeder 2' was 3764 KiB/s + * Download speed of type `leach' was 3592 KiB/s + * Analysis: download too small for trust to go into effect + * - 100 MB, 3 peers: + * Download speed of type `seeder 1' was 4018 KiB/s + * Download speed of type `seeder 2' was 4016 KiB/s + * + * Analysis: leach squeezed out entirely early, then backs off far too + * far => fails to ever recover (code needs improvement...) + * [system load is initially very high, then drops to 0 + * after seeders are done] + */ +#include "platform.h" +#include "fs_test_lib.h" +#include "gnunet_testing_lib.h" + +#define VERBOSE GNUNET_NO + +/** + * File-size we use for testing. + */ +#define FILESIZE (1024 * 1024 * 100) + +/** + * How long until we give up on transmitting the message? + */ +#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 30) + +/** + * Number of daemons in clique, must be at least 3 (!). + */ +#define NUM_DAEMONS 3 + +/** + * Seed for first file on offer. + */ +#define SEED1 42 + +/** + * Seed for second file on offer. + */ +#define SEED2 43 + +static struct GNUNET_FS_TestDaemon *daemons[NUM_DAEMONS]; + +static int ok; + +static struct GNUNET_TIME_Absolute start_time; + +static const char *progname; + +static struct GNUNET_FS_Uri *uri1; + +static struct GNUNET_FS_Uri *uri2; + +static void +do_stop (void *cls, + const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + GNUNET_FS_TEST_daemons_stop (NUM_DAEMONS, + daemons); +} + + +/** + * Master context for 'stat_run'. + */ +struct StatMaster +{ + struct GNUNET_STATISTICS_Handle *stat; + unsigned int daemon; + unsigned int value; +}; + +struct StatValues +{ + const char *subsystem; + const char *name; +}; + +/** + * Statistics we print out. + */ +static struct StatValues stats[] = + { + { "fs", "# queries forwarded"}, + { "fs", "# replies received and matched"}, + { "fs", "# results found locally"}, + { "fs", "# requests forwarded due to high load"}, + { "fs", "# requests done for free (low load)"}, + { "fs", "# requests dropped, priority insufficient"}, + { "fs", "# requests done for a price (normal load)"}, + { "fs", "# requests dropped by datastore (queue length limit)"}, + { "fs", "# P2P searches received"}, + { "fs", "# P2P searches discarded (queue length bound)"}, + { "fs", "# replies received for local clients"}, + { "fs", "# queries retransmitted to same target"}, + { "fs", "cummulative artificial delay introduced (ms)"}, + { "core", "# bytes decrypted"}, + { "core", "# bytes encrypted"}, + { "core", "# discarded CORE_SEND requests"}, + { "core", "# discarded CORE_SEND request bytes"}, + { "core", "# discarded lower priority CORE_SEND requests"}, + { "core", "# discarded lower priority CORE_SEND request bytes"}, + { "transport", "# bytes received via TCP"}, + { "transport", "# bytes transmitted via TCP"}, + { "datacache", "# bytes stored"}, + { NULL, NULL} + }; + + +/** + * Callback function to process statistic values. + * + * @param cls closure + * @param subsystem name of subsystem that created the statistic + * @param name the name of the datum + * @param value the current value + * @param is_persistent GNUNET_YES if the value is persistent, GNUNET_NO if not + * @return GNUNET_OK to continue, GNUNET_SYSERR to abort iteration + */ +static int +print_stat (void *cls, + const char *subsystem, + const char *name, + uint64_t value, + int is_persistent) +{ + struct StatMaster *sm = cls; + fprintf (stderr, + "Peer %2u: %12s/%50s = %12llu\n", + sm->daemon, + subsystem, + name, + (unsigned long long) value); + return GNUNET_OK; +} + + +/** + * Function that gathers stats from all daemons. + */ +static void +stat_run (void *cls, + const struct GNUNET_SCHEDULER_TaskContext *tc); + + +/** + * Function called when GET operation on stats is done. + */ +static void +get_done (void *cls, + int success) +{ + struct StatMaster *sm = cls; + GNUNET_break (GNUNET_OK == success); + sm->value++; + GNUNET_SCHEDULER_add_now (&stat_run, sm); +} + + +/** + * Function that gathers stats from all daemons. + */ +static void +stat_run (void *cls, + const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + struct StatMaster *sm = cls; + + if (stats[sm->value].name != NULL) + { + GNUNET_STATISTICS_get (sm->stat, +#if 0 + NULL, NULL, +#else + stats[sm->value].subsystem, + stats[sm->value].name, +#endif + GNUNET_TIME_UNIT_FOREVER_REL, + &get_done, + &print_stat, sm); + return; + } + GNUNET_STATISTICS_destroy (sm->stat, GNUNET_NO); + sm->value = 0; + sm->daemon++; + if (sm->daemon == NUM_DAEMONS) + { + GNUNET_free (sm); + GNUNET_SCHEDULER_add_now (&do_stop, NULL); + return; + } + sm->stat = GNUNET_STATISTICS_create ("", + GNUNET_FS_TEST_get_configuration (daemons, + sm->daemon)); + GNUNET_SCHEDULER_add_now (&stat_run, sm); +} + + +static void +do_report (void *cls, + const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + static int download_counter; + const char *type = cls; + struct GNUNET_TIME_Relative del; + char *fancy; + struct StatMaster *sm; + + if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_PREREQ_DONE)) + { + del = GNUNET_TIME_absolute_get_duration (start_time); + if (del.rel_value == 0) + del.rel_value = 1; + fancy = GNUNET_STRINGS_byte_size_fancy (((unsigned long long)FILESIZE) * 1000LL / del.rel_value); + fprintf (stdout, + "Download speed of type `%s' was %s/s\n", + type, + fancy); + GNUNET_free (fancy); + if (NUM_DAEMONS != ++download_counter) + return; /* more downloads to come */ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Finished all downloads, shutting down\n", + (unsigned long long) FILESIZE); + sm = GNUNET_malloc (sizeof (struct StatMaster)); + sm->stat = GNUNET_STATISTICS_create ("", + GNUNET_FS_TEST_get_configuration (daemons, + sm->daemon)); + GNUNET_SCHEDULER_add_now (&stat_run, sm); + } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Timeout during download for type `%s', shutting down with error\n", + type); + ok = 1; + GNUNET_SCHEDULER_add_now (&do_stop, NULL); + } +} + + +static void +do_downloads (void *cls, + const struct GNUNET_FS_Uri *u2) +{ + int anonymity; + unsigned int i; + + if (NULL == u2) + { + GNUNET_FS_TEST_daemons_stop (NUM_DAEMONS, + daemons); + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Timeout during upload attempt, shutting down with error\n"); + ok = 1; + return; + } + uri2 = GNUNET_FS_uri_dup (u2); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Downloading %llu bytes\n", + (unsigned long long) FILESIZE); + start_time = GNUNET_TIME_absolute_get (); + if (NULL != strstr (progname, "dht")) + anonymity = 0; + else + anonymity = 1; + /* (semi) leach-download(s); not true leaches since + these peers do participate in sharing, they just + don't have to offer anything *initially*. */ + for (i=0;ireason & GNUNET_SCHEDULER_REASON_PREREQ_DONE)); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Daemons started, will now try to connect them\n"); + pg = GNUNET_FS_TEST_get_group (daemons); + GNUNET_TESTING_create_topology (pg, + GNUNET_TESTING_TOPOLOGY_CLIQUE, + GNUNET_TESTING_TOPOLOGY_NONE, + NULL); + GNUNET_TESTING_connect_topology (pg, + GNUNET_TESTING_TOPOLOGY_CLIQUE, + GNUNET_TESTING_TOPOLOGY_OPTION_NONE, + 0.0, + &do_publish1, + NULL); +} + + +static void +run (void *cls, + char *const *args, + const char *cfgfile, + const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + GNUNET_FS_TEST_daemons_start ("fs_test_lib_data.conf", + TIMEOUT, + NUM_DAEMONS, + daemons, + &do_connect, + NULL); +} + + +int +main (int argc, char *argv[]) +{ + char *const argvx[] = { + "perf-gnunet-service-fs-p2p", + "-c", + "fs_test_lib_data.conf", +#if VERBOSE + "-L", "DEBUG", +#endif + NULL + }; + struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_OPTION_END + }; + progname = argv[0]; + GNUNET_DISK_directory_remove ("/tmp/gnunet-test-fs-lib/"); + GNUNET_log_setup ("perf_gnunet_service_fs_p2p_index", +#if VERBOSE + "DEBUG", +#else + "WARNING", +#endif + NULL); + GNUNET_PROGRAM_run ((sizeof (argvx) / sizeof (char *)) - 1, + argvx, "perf-gnunet-service-fs-p2p-index", + "nohelp", options, &run, NULL); + GNUNET_DISK_directory_remove ("/tmp/gnunet-test-fs-lib/"); + return ok; +} + +/* end of perf_gnunet_service_fs_p2p_index.c */ diff --git a/src/include/Makefile.am b/src/include/Makefile.am index bdfa677c6..ea12f3339 100644 --- a/src/include/Makefile.am +++ b/src/include/Makefile.am @@ -64,6 +64,4 @@ gnunetinclude_HEADERS = \ gnunet_transport_service.h \ gnunet_transport_plugin.h \ gnunet_upnp_service.h \ - gnunet_util_lib.h \ - gnunet_monkey_edb.h \ - gnunet_monkey_action.h + gnunet_util_lib.h diff --git a/src/monkey/Makefile.am b/src/monkey/Makefile.am index 849aeef02..44042dfdd 100644 --- a/src/monkey/Makefile.am +++ b/src/monkey/Makefile.am @@ -21,12 +21,12 @@ lib_LTLIBRARIES = libmonkeyedb.la \ libmonkeyedb_la_SOURCES = \ edb_api.c \ gnunet_monkey_edb.h - + libmonkeyedb_la_LIBADD = \ $(top_builddir)/src/util/libgnunetutil.la \ -lsqlite3 \ $(GN_LIBINTL) $(XLIB) - + libmonkeyaction_la_SOURCES = \ action_api.c \ gnunet_monkey_action.h @@ -35,7 +35,6 @@ libmonkeyaction_la_LIBADD = \ $(top_builddir)/src/util/libgnunetutil.la \ $(GN_LIBINTL) $(XLIB) - bin_PROGRAMS = \ gnunet-monkey \ gnunet-service-monkey @@ -80,7 +79,7 @@ gnunet_service_monkey_LDADD = \ bug_null_pointer_exception: gcc -g -O0 -o bug_null_pointer_exception bug_null_pointer_exception.c - + check_PROGRAMS = \ test_monkey_edb #test_gnunet_monkey @@ -95,14 +94,14 @@ test_monkey_edb_SOURCES = \ test_monkey_edb_LDADD = \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/monkey/libmonkeyedb.la - + #test_gnunet_monkey_SOURCES = \ #test_gnunet_monkey.c #test_gnunet_monkey_LDADD = \ #$(top_builddir)/src/arm/libgnunetarm.la \ #$(top_builddir)/src/util/libgnunetutil.la - - + + check_SCRIPTS = \ #test_gnunet_monkey.sh \ #test_monkey_npe.sh diff --git a/src/include/gnunet_monkey_action.h b/src/monkey/gnunet_monkey_action.h similarity index 100% rename from src/include/gnunet_monkey_action.h rename to src/monkey/gnunet_monkey_action.h diff --git a/src/include/gnunet_monkey_edb.h b/src/monkey/gnunet_monkey_edb.h similarity index 98% rename from src/include/gnunet_monkey_edb.h rename to src/monkey/gnunet_monkey_edb.h index af5142a82..b373118f6 100644 --- a/src/include/gnunet_monkey_edb.h +++ b/src/monkey/gnunet_monkey_edb.h @@ -19,7 +19,7 @@ */ /** - * @file include/gnunet_monkey_edb.h + * @file monkey/gnunet_monkey_edb.h * @brief Monkey API for accessing the Expression Database (edb) */ @@ -64,12 +64,14 @@ typedef int (*GNUNET_MONKEY_ExpressionIterator) (void *, int, char **, * Run an SQLite query to retrieve those expressions that are previous to * given expression and are in the same scope of the given expression * For example, consider the following code snippet: + * * { * struct Something whole; // line no.1 * struct SomethingElse part; // line no.2 * whole.part = ∂ // line no.3 * whole.part->member = 1; // line no.4 * } + * * If the expression supplied to the function is that of line no.4 "whole.part->member = 1;" * The returned list of expressions will be: whole.part (line no.4), whole.part->member (line no.4), * whole (line no.3), whole.part (line no.3), &part (line no.3), whole.part = &part (line no.3) diff --git a/src/transport/plugin_transport_wlan.c b/src/transport/plugin_transport_wlan.c index e8d4d11c5..f17d37146 100644 --- a/src/transport/plugin_transport_wlan.c +++ b/src/transport/plugin_transport_wlan.c @@ -893,7 +893,7 @@ get_next_queue_Session (struct Plugin * plugin){ /** * Function to sort the message into the message fragment queue - * @prarm plugin the plugin struct + * @param plugin the plugin struct * @param message to sort into the queue */ static void diff --git a/src/vpn/gnunet-helper-vpn.c b/src/vpn/gnunet-helper-vpn.c index e495b4c3c..1cee01c71 100644 --- a/src/vpn/gnunet-helper-vpn.c +++ b/src/vpn/gnunet-helper-vpn.c @@ -59,7 +59,7 @@ struct in6_ifreq /** * Creates a tun-interface called dev; * @param dev is asumed to point to a char[IFNAMSIZ] - * if *dev == '\0', uses the name supplied by the kernel + * if *dev == '\\0', uses the name supplied by the kernel * @return the fd to the tun or -1 on error */ static int -- 2.25.1