From 406c7d2d2d126c994a1fff13470b1f96439c6f9d Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 31 Jul 2016 15:42:37 +0000 Subject: convering more services to new core MQ API --- src/hostlist/gnunet-daemon-hostlist.c | 129 ++++++++---- src/hostlist/gnunet-daemon-hostlist_client.c | 123 +++++------ src/hostlist/gnunet-daemon-hostlist_client.h | 15 +- src/hostlist/gnunet-daemon-hostlist_server.c | 151 ++++---------- src/hostlist/gnunet-daemon-hostlist_server.h | 6 +- .../test_gnunet_daemon_hostlist_learning.c | 224 +++++++++++++-------- 6 files changed, 347 insertions(+), 301 deletions(-) (limited to 'src/hostlist') diff --git a/src/hostlist/gnunet-daemon-hostlist.c b/src/hostlist/gnunet-daemon-hostlist.c index 21fab323b..44db59949 100644 --- a/src/hostlist/gnunet-daemon-hostlist.c +++ b/src/hostlist/gnunet-daemon-hostlist.c @@ -47,12 +47,7 @@ static int provide_hostlist; /** * Handle to hostlist server's connect handler */ -static GNUNET_CORE_ConnectEventHandler server_ch; - -/** - * Handle to hostlist server's disconnect handler - */ -static GNUNET_CORE_DisconnectEventHandler server_dh; +static GNUNET_CORE_ConnecTEventHandler server_ch; #endif @@ -81,17 +76,17 @@ static struct GNUNET_CORE_Handle *core; /** * Handle to the hostlist client's advertisement handler */ -static GNUNET_CORE_MessageCallback client_adv_handler; +static GNUNET_HOSTLIST_UriHandler client_adv_handler; /** * Handle to hostlist client's connect handler */ -static GNUNET_CORE_ConnectEventHandler client_ch; +static GNUNET_CORE_ConnecTEventHandler client_ch; /** * Handle to hostlist client's disconnect handler */ -static GNUNET_CORE_DisconnectEventHandler client_dh; +static GNUNET_CORE_DisconnecTEventHandler client_dh; GNUNET_NETWORK_STRUCT_BEGIN @@ -146,17 +141,49 @@ core_init (void *cls, * Core handler for p2p hostlist advertisements * * @param cls closure - * @param peer identity of the sender * @param message advertisement message we got - * @return #GNUNET_OK on success + * @return #GNUNET_OK if message is well-formed */ static int -advertisement_handler (void *cls, - const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_MessageHeader *message) +check_advertisement (void *cls, + const struct GNUNET_MessageHeader *message) { + size_t size; + size_t uri_size; + const char *uri; + + size = ntohs (message->size); + if (size <= sizeof (struct GNUNET_MessageHeader)) + { + GNUNET_break_op (0); + return GNUNET_SYSERR; + } + uri = (const char *) &message[1]; + uri_size = size - sizeof (struct GNUNET_MessageHeader); + if (uri[uri_size - 1] != '\0') + { + GNUNET_break_op (0); + return GNUNET_SYSERR; + } + return GNUNET_OK; +} + + +/** + * Core handler for p2p hostlist advertisements + * + * @param cls closure + * @param message advertisement message we got + * @return #GNUNET_OK on success + */ +static void +handle_advertisement (void *cls, + const struct GNUNET_MessageHeader *message) +{ + const char *uri = (const char *) &message[1]; + GNUNET_assert (NULL != client_adv_handler); - return (*client_adv_handler) (cls, peer, message); + (void) (*client_adv_handler) (uri); } @@ -166,20 +193,33 @@ advertisement_handler (void *cls, * * @param cls closure * @param peer peer identity this notification is about + * @param mq queue for sending messages to @a peer + * @return peer */ -static void -connect_handler (void *cls, const struct GNUNET_PeerIdentity *peer) +static void * +connect_handler (void *cls, + const struct GNUNET_PeerIdentity *peer, + struct GNUNET_MQ_Handle *mq) { - if (0 == memcmp (&me, peer, sizeof (struct GNUNET_PeerIdentity))) - return; + if (0 == memcmp (&me, + peer, + sizeof (struct GNUNET_PeerIdentity))) + return NULL; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "A new peer connected, notifying client and server\n"); if (NULL != client_ch) - (*client_ch) (cls, peer); + GNUNET_assert (NULL == + (*client_ch) (cls, + peer, + mq)); #if HAVE_MHD if (NULL != server_ch) - (*server_ch) (cls, peer); + GNUNET_assert (NULL == + (*server_ch) (cls, + peer, + mq)); #endif + return (void *) peer; } @@ -192,18 +232,18 @@ connect_handler (void *cls, const struct GNUNET_PeerIdentity *peer) */ static void disconnect_handler (void *cls, - const struct GNUNET_PeerIdentity *peer) + const struct GNUNET_PeerIdentity *peer, + void *internal_cls) { - if (0 == memcmp (&me, peer, sizeof (struct GNUNET_PeerIdentity))) + if (0 == memcmp (&me, + peer, + sizeof (struct GNUNET_PeerIdentity))) return; /* call hostlist client disconnect handler */ if (NULL != client_dh) - (*client_dh) (cls, peer); -#if HAVE_MHD - /* call hostlist server disconnect handler */ - if (NULL != server_dh) - (*server_dh) (cls, peer); -#endif + (*client_dh) (cls, + peer, + NULL); } @@ -220,7 +260,7 @@ cleaning_task (void *cls) "Hostlist daemon is shutting down\n"); if (NULL != core) { - GNUNET_CORE_disconnect (core); + GNUNET_CORE_disconnecT (core); core = NULL; } if (bootstrapping) @@ -235,7 +275,8 @@ cleaning_task (void *cls) #endif if (NULL != stats) { - GNUNET_STATISTICS_destroy (stats, GNUNET_NO); + GNUNET_STATISTICS_destroy (stats, + GNUNET_NO); stats = NULL; } } @@ -255,12 +296,15 @@ run (void *cls, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { - static const struct GNUNET_CORE_MessageHandler learn_handlers[] = { - {&advertisement_handler, GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT, 0}, - {NULL, 0, 0} + GNUNET_MQ_hd_var_size (advertisement, + GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT, + struct GNUNET_MessageHeader); + struct GNUNET_MQ_MessageHandler learn_handlers[] = { + make_advertisement_handler (NULL), + GNUNET_MQ_handler_end () }; - static const struct GNUNET_CORE_MessageHandler no_learn_handlers[] = { - {NULL, 0, 0} + struct GNUNET_MQ_MessageHandler no_learn_handlers[] = { + GNUNET_MQ_handler_end () }; if ((! bootstrapping) && (! learning) #if HAVE_MHD @@ -279,24 +323,27 @@ run (void *cls, return; } if (bootstrapping) - GNUNET_HOSTLIST_client_start (cfg, stats, + GNUNET_HOSTLIST_client_start (cfg, + stats, &client_ch, &client_dh, &client_adv_handler, learning); core = - GNUNET_CORE_connect (cfg, NULL, + GNUNET_CORE_connecT (cfg, + NULL, &core_init, &connect_handler, &disconnect_handler, - NULL, GNUNET_NO, - NULL, GNUNET_NO, learning ? learn_handlers : no_learn_handlers); #if HAVE_MHD if (provide_hostlist) - GNUNET_HOSTLIST_server_start (cfg, stats, core, &server_ch, &server_dh, + GNUNET_HOSTLIST_server_start (cfg, + stats, + core, + &server_ch, advertising); #endif GNUNET_SCHEDULER_add_shutdown (&cleaning_task, diff --git a/src/hostlist/gnunet-daemon-hostlist_client.c b/src/hostlist/gnunet-daemon-hostlist_client.c index 9f6413898..c1a2c2721 100644 --- a/src/hostlist/gnunet-daemon-hostlist_client.c +++ b/src/hostlist/gnunet-daemon-hostlist_client.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2001-2010, 2014 GNUnet e.V. + Copyright (C) 2001-2010, 2014, 2016 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 @@ -1187,14 +1187,20 @@ task_hostlist_saving (void *cls) * * @param cls closure * @param peer peer identity this notification is about + * @param mq message queue for transmissions to @a peer */ -static void -handler_connect (void *cls, const struct GNUNET_PeerIdentity *peer) +static void * +handler_connect (void *cls, + const struct GNUNET_PeerIdentity *peer, + struct GNUNET_MQ_Handle *mq) { GNUNET_assert (stat_connection_count < UINT_MAX); stat_connection_count++; - GNUNET_STATISTICS_update (stats, gettext_noop ("# active connections"), 1, + GNUNET_STATISTICS_update (stats, + gettext_noop ("# active connections"), + 1, GNUNET_NO); + return NULL; } @@ -1205,11 +1211,15 @@ handler_connect (void *cls, const struct GNUNET_PeerIdentity *peer) * @param peer peer identity this notification is about */ static void -handler_disconnect (void *cls, const struct GNUNET_PeerIdentity *peer) +handler_disconnect (void *cls, + const struct GNUNET_PeerIdentity *peer, + void *internal_cls) { GNUNET_assert (stat_connection_count > 0); stat_connection_count--; - GNUNET_STATISTICS_update (stats, gettext_noop ("# active connections"), -1, + GNUNET_STATISTICS_update (stats, + gettext_noop ("# active connections"), + -1, GNUNET_NO); } @@ -1217,63 +1227,44 @@ handler_disconnect (void *cls, const struct GNUNET_PeerIdentity *peer) /** * Method called whenever an advertisement message arrives. * - * @param cls closure (always NULL) - * @param peer the peer sending the message - * @param message the actual message - * @return #GNUNET_OK to keep the connection open, - * #GNUNET_SYSERR to close it (signal serious error) + * @param uri the advertised URI */ -static int -handler_advertisement (void *cls, const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_MessageHeader *message) +static void +handler_advertisement (const char *uri) { - size_t size; size_t uri_size; - const struct GNUNET_MessageHeader *incoming; - const char *uri; struct Hostlist *hostlist; - GNUNET_assert (ntohs (message->type) == - GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT); - size = ntohs (message->size); - if (size <= sizeof (struct GNUNET_MessageHeader)) - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } - incoming = (const struct GNUNET_MessageHeader *) message; - uri = (const char *) &incoming[1]; - uri_size = size - sizeof (struct GNUNET_MessageHeader); - if (uri[uri_size - 1] != '\0') - { - GNUNET_break_op (0); - return GNUNET_SYSERR; - } + uri_size = strlen (uri) + 1; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Hostlist client recieved advertisement from `%s' containing URI `%s'\n", - GNUNET_i2s (peer), uri); + "Hostlist client recieved advertisement containing URI `%s'\n", + uri); if (GNUNET_NO != linked_list_contains (uri)) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "URI `%s' is already known\n", uri); - return GNUNET_OK; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "URI `%s' is already known\n", + uri); + return; } if (GNUNET_NO == stat_testing_allowed) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Currently not accepting new advertisements: interval between to advertisements is not reached\n"); - return GNUNET_SYSERR; + return; } if (GNUNET_YES == stat_testing_hostlist) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Currently not accepting new advertisements: we are already testing a hostlist\n"); - return GNUNET_SYSERR; + return; } hostlist = GNUNET_malloc (sizeof (struct Hostlist) + uri_size); hostlist->hostlist_uri = (const char *) &hostlist[1]; - GNUNET_memcpy (&hostlist[1], uri, uri_size); + GNUNET_memcpy (&hostlist[1], + uri, + uri_size); hostlist->time_creation = GNUNET_TIME_absolute_get (); hostlist->quality = HOSTLIST_INITIAL; hostlist_to_test = hostlist; @@ -1282,7 +1273,8 @@ handler_advertisement (void *cls, const struct GNUNET_PeerIdentity *peer, stat_testing_allowed = GNUNET_NO; ti_testing_intervall_task = GNUNET_SCHEDULER_add_delayed (TESTING_INTERVAL, - &task_testing_intervall_reset, NULL); + &task_testing_intervall_reset, + NULL); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Testing new hostlist advertisements is locked for the next %s\n", @@ -1290,9 +1282,8 @@ handler_advertisement (void *cls, const struct GNUNET_PeerIdentity *peer, GNUNET_YES)); ti_download_dispatcher_task = - GNUNET_SCHEDULER_add_now (&task_download_dispatcher, NULL); - - return GNUNET_OK; + GNUNET_SCHEDULER_add_now (&task_download_dispatcher, + NULL); } @@ -1557,9 +1548,9 @@ save_hostlist_file (int shutdown) int GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_STATISTICS_Handle *st, - GNUNET_CORE_ConnectEventHandler *ch, - GNUNET_CORE_DisconnectEventHandler *dh, - GNUNET_CORE_MessageCallback *msgh, + GNUNET_CORE_ConnecTEventHandler *ch, + GNUNET_CORE_DisconnecTEventHandler *dh, + GNUNET_HOSTLIST_UriHandler *msgh, int learn) { char *filename; @@ -1578,23 +1569,31 @@ GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c, /* Read proxy configuration */ if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (cfg, - "HOSTLIST", "PROXY", &proxy)) + "HOSTLIST", + "PROXY", + &proxy)) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found proxy host: `%s'\n", proxy); /* proxy username */ - if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (cfg, - "HOSTLIST", "PROXY_USERNAME", &proxy_username)) + if (GNUNET_OK == + GNUNET_CONFIGURATION_get_value_string (cfg, + "HOSTLIST", + "PROXY_USERNAME", + &proxy_username)) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Found proxy username name: `%s'\n", - proxy_username); + "Found proxy username name: `%s'\n", + proxy_username); } /* proxy password */ - if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_string (cfg, - "HOSTLIST", "PROXY_PASSWORD", &proxy_password)) + if (GNUNET_OK == + GNUNET_CONFIGURATION_get_value_string (cfg, + "HOSTLIST", + "PROXY_PASSWORD", + &proxy_password)) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found proxy password name: `%s'\n", @@ -1659,7 +1658,8 @@ GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c, load_hostlist_file (); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Hostlists will be saved to file again in %s\n", - GNUNET_STRINGS_relative_time_to_string (SAVING_INTERVAL, GNUNET_YES)); + GNUNET_STRINGS_relative_time_to_string (SAVING_INTERVAL, + GNUNET_YES)); ti_saving_task = GNUNET_SCHEDULER_add_delayed (SAVING_INTERVAL, &task_hostlist_saving, @@ -1671,8 +1671,10 @@ GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c, _("Learning is not enabled on this peer\n")); *msgh = NULL; if (GNUNET_OK == - GNUNET_CONFIGURATION_get_value_filename (cfg, "HOSTLIST", - "HOSTLISTFILE", &filename)) + GNUNET_CONFIGURATION_get_value_filename (cfg, + "HOSTLIST", + "HOSTLISTFILE", + &filename)) { if (GNUNET_YES == GNUNET_DISK_file_test (filename)) { @@ -1706,9 +1708,10 @@ GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c, } else { - ti_check_download = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES, - &stat_timeout_task, - NULL); + ti_check_download + = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES, + &stat_timeout_task, + NULL); } return GNUNET_OK; } diff --git a/src/hostlist/gnunet-daemon-hostlist_client.h b/src/hostlist/gnunet-daemon-hostlist_client.h index 15e913adb..dd80d4a48 100644 --- a/src/hostlist/gnunet-daemon-hostlist_client.h +++ b/src/hostlist/gnunet-daemon-hostlist_client.h @@ -30,6 +30,15 @@ #include "gnunet_util_lib.h" +/** + * Function that handles an advertised URI. + * + * @param uri 0-termianted URI of a hostlist + */ +typedef void +(*GNUNET_HOSTLIST_UriHandler)(const char *uri); + + /** * Start downloading hostlists from hostlist servers as necessary. * @@ -44,9 +53,9 @@ int GNUNET_HOSTLIST_client_start (const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_STATISTICS_Handle *st, - GNUNET_CORE_ConnectEventHandler *ch, - GNUNET_CORE_DisconnectEventHandler *dh, - GNUNET_CORE_MessageCallback *msgh, + GNUNET_CORE_ConnecTEventHandler *ch, + GNUNET_CORE_DisconnecTEventHandler *dh, + GNUNET_HOSTLIST_UriHandler *msgh, int learn); diff --git a/src/hostlist/gnunet-daemon-hostlist_server.c b/src/hostlist/gnunet-daemon-hostlist_server.c index 40820e557..b01dbc09e 100644 --- a/src/hostlist/gnunet-daemon-hostlist_server.c +++ b/src/hostlist/gnunet-daemon-hostlist_server.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2008, 2009, 2010, 2014 GNUnet e.V. + Copyright (C) 2008, 2009, 2010, 2014, 2016 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 @@ -101,12 +101,6 @@ static int advertising; */ static char *hostlist_uri; -/** - * Map of peer identities to `struct GNUNET_CORE_TransmitHandle *` for - * pending hostlist server advertisements. - */ -static struct GNUNET_CONTAINER_MultiPeerMap *advertisements; - /** * Context for #host_processor(). @@ -436,47 +430,34 @@ access_handler_callback (void *cls, * @param buf buffer to copy message to * @return number of bytes copied to @a buf */ -static size_t -adv_transmit_ready (void *cls, - size_t size, - void *buf) +static void +adv_transmit (struct GNUNET_MQ_Handle *mq) { - const struct GNUNET_PeerIdentity *peer = cls; static uint64_t hostlist_adv_count; - size_t transmission_size; + const void *extra; + uint64_t flags; size_t uri_size; /* Including \0 termination! */ - struct GNUNET_MessageHeader header; - char *cbuf; - struct GNUNET_CORE_TransmitHandle *th; - - th = GNUNET_CONTAINER_multipeermap_get (advertisements, - peer); - GNUNET_assert (NULL != th); - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_remove (advertisements, - peer, - th)); - if (NULL == buf) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Transmission failed, buffer invalid!\n"); - return 0; - } + struct GNUNET_MessageHeader *header; + struct GNUNET_MQ_Envelope *env; + + extra = GNUNET_CORE_get_mq_options (GNUNET_YES, + GNUNET_CORE_PRIO_BEST_EFFORT, + &flags); uri_size = strlen (hostlist_uri) + 1; - transmission_size = sizeof (struct GNUNET_MessageHeader) + uri_size; - header.type = htons (GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT); - header.size = htons (transmission_size); - GNUNET_assert (size >= transmission_size); - GNUNET_memcpy (buf, - &header, - sizeof (struct GNUNET_MessageHeader)); - cbuf = buf; - GNUNET_memcpy (&cbuf[sizeof (struct GNUNET_MessageHeader)], - hostlist_uri, - uri_size); + env = GNUNET_MQ_msg_extra (header, + uri_size, + GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT); + GNUNET_memcpy (&header[1], + hostlist_uri, + uri_size); + GNUNET_MQ_env_set_options (env, + flags, + extra); + GNUNET_MQ_send (mq, + env); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sent advertisement message: Copied %u bytes into buffer!\n", - (unsigned int) transmission_size); + (unsigned int) uri_size); hostlist_adv_count++; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " # Sent advertisement message: %llu\n", @@ -484,7 +465,6 @@ adv_transmit_ready (void *cls, GNUNET_STATISTICS_update (stats, gettext_noop ("# hostlist advertisements send"), 1, GNUNET_NO); - return transmission_size; } @@ -493,78 +473,39 @@ adv_transmit_ready (void *cls, * * @param cls closure * @param peer peer identity this notification is about + * @param mq queue for transmission to @a peer + * @return NULL (must!) */ -static void +static void * connect_handler (void *cls, - const struct GNUNET_PeerIdentity *peer) + const struct GNUNET_PeerIdentity *peer, + struct GNUNET_MQ_Handle *mq) { size_t size; - struct GNUNET_CORE_TransmitHandle *th; if (! advertising) - return; + return NULL; if (NULL == hostlist_uri) - return; + return NULL; size = strlen (hostlist_uri) + 1; if (size + sizeof (struct GNUNET_MessageHeader) >= GNUNET_SERVER_MAX_MESSAGE_SIZE) { GNUNET_break (0); - return; + return NULL; } size += sizeof (struct GNUNET_MessageHeader); if (NULL == core) { GNUNET_break (0); - return; + return NULL; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Asked CORE to transmit advertisement message with a size of %u bytes to peer `%s'\n", (unsigned int) size, GNUNET_i2s (peer)); - if (NULL == - (th = GNUNET_CORE_notify_transmit_ready (core, GNUNET_YES, - GNUNET_CORE_PRIO_BEST_EFFORT, - GNUNET_ADV_TIMEOUT, - peer, - size, - &adv_transmit_ready, - (void *) peer)) ) - { - GNUNET_log (GNUNET_ERROR_TYPE_WARNING, - _("Advertisement message could not be queued by core\n")); - } - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_put (advertisements, - peer, - th, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); -} - - -/** - * Method called whenever a given peer disconnects. - * - * @param cls closure - * @param peer peer identity this notification is about - */ -static void -disconnect_handler (void *cls, - const struct GNUNET_PeerIdentity *peer) -{ - struct GNUNET_CORE_TransmitHandle *th; - - if (! advertising) - return; - th = GNUNET_CONTAINER_multipeermap_get (advertisements, - peer); - if (NULL == th) - return; - GNUNET_assert (GNUNET_YES == - GNUNET_CONTAINER_multipeermap_remove (advertisements, - peer, - th)); - GNUNET_CORE_notify_transmit_ready_cancel (th); + adv_transmit (mq); + return NULL; } @@ -696,7 +637,6 @@ prepare_daemon (struct MHD_Daemon *daemon_handle) * @param st statistics handle to use * @param co core handle to use * @param[out] server_ch set to handler for CORE connect events - * @param[out] server_dh set to handler for CORE disconnect events * @param advertise #GNUNET_YES if we should advertise our hostlist * @return #GNUNET_OK on success */ @@ -704,8 +644,7 @@ int GNUNET_HOSTLIST_server_start (const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_STATISTICS_Handle *st, struct GNUNET_CORE_Handle *co, - GNUNET_CORE_ConnectEventHandler *server_ch, - GNUNET_CORE_DisconnectEventHandler *server_dh, + GNUNET_CORE_ConnecTEventHandler *server_ch, int advertise) { unsigned long long port; @@ -730,8 +669,6 @@ GNUNET_HOSTLIST_server_start (const struct GNUNET_CONFIGURATION_Handle *c, { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Advertising enabled on this hostlist server\n"); - advertisements = GNUNET_CONTAINER_multipeermap_create (8, - GNUNET_NO); } cfg = c; stats = st; @@ -797,11 +734,15 @@ GNUNET_HOSTLIST_server_start (const struct GNUNET_CONFIGURATION_Handle *c, } else ipv4 = NULL; - if (GNUNET_CONFIGURATION_have_value (cfg, "HOSTLIST", "BINDTOIPV6")) + if (GNUNET_CONFIGURATION_have_value (cfg, + "HOSTLIST", + "BINDTOIPV6")) { if (GNUNET_OK != - GNUNET_CONFIGURATION_get_value_string (cfg, "HOSTLIST", - "BINDTOIP", &ipv6)) + GNUNET_CONFIGURATION_get_value_string (cfg, + "HOSTLIST", + "BINDTOIP", + &ipv6)) { GNUNET_log (GNUNET_ERROR_TYPE_WARNING, _("BINDTOIP does not a valid IPv4 address! Ignoring BINDTOIPV6.\n")); @@ -892,7 +833,6 @@ GNUNET_HOSTLIST_server_start (const struct GNUNET_CONFIGURATION_Handle *c, core = co; *server_ch = &connect_handler; - *server_dh = &disconnect_handler; if (NULL != daemon_handle_v4) hostlist_task_v4 = prepare_daemon (daemon_handle_v4); if (NULL != daemon_handle_v6) @@ -958,13 +898,6 @@ GNUNET_HOSTLIST_server_stop () GNUNET_PEERINFO_disconnect (peerinfo); peerinfo = NULL; } - if (NULL != advertisements) - { - GNUNET_break (0 == - GNUNET_CONTAINER_multipeermap_size (advertisements)); - GNUNET_CONTAINER_multipeermap_destroy (advertisements); - advertisements = NULL; - } cfg = NULL; stats = NULL; core = NULL; diff --git a/src/hostlist/gnunet-daemon-hostlist_server.h b/src/hostlist/gnunet-daemon-hostlist_server.h index f70e22fd9..f18ad0ca2 100644 --- a/src/hostlist/gnunet-daemon-hostlist_server.h +++ b/src/hostlist/gnunet-daemon-hostlist_server.h @@ -39,7 +39,6 @@ * @param st statistics handle to use * @param co core handle to use * @param[out] server_ch set to handler for CORE connect events - * @param[out] server_dh set to handler for CORE disconnect events * @param advertise #GNUNET_YES if we should advertise our hostlist * @return #GNUNET_OK on success */ @@ -47,9 +46,8 @@ int GNUNET_HOSTLIST_server_start (const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_STATISTICS_Handle *st, struct GNUNET_CORE_Handle *core, - GNUNET_CORE_ConnectEventHandler *server_ch, - GNUNET_CORE_DisconnectEventHandler *server_dh, - int advertise); + GNUNET_CORE_ConnecTEventHandler *server_ch, + int advertise); /** diff --git a/src/hostlist/test_gnunet_daemon_hostlist_learning.c b/src/hostlist/test_gnunet_daemon_hostlist_learning.c index 54f219ad8..041898abd 100644 --- a/src/hostlist/test_gnunet_daemon_hostlist_learning.c +++ b/src/hostlist/test_gnunet_daemon_hostlist_learning.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet - Copyright (C) 2009, 2010, 2011, 2012 GNUnet e.V. + Copyright (C) 2009, 2010, 2011, 2012, 2016 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 @@ -63,9 +63,9 @@ static char *current_adv_uri; static const struct GNUNET_CONFIGURATION_Handle *cfg; -static struct GNUNET_SCHEDULER_Task * timeout_task; +static struct GNUNET_SCHEDULER_Task *timeout_task; -static struct GNUNET_SCHEDULER_Task * check_task; +static struct GNUNET_SCHEDULER_Task *check_task; static struct PeerContext adv_peer; @@ -81,8 +81,9 @@ static struct GNUNET_STATISTICS_GetHandle *advsent_stat; static void shutdown_testcase () { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Shutdown testcase....\n"); - if (timeout_task != NULL) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Shutdown testcase....\n"); + if (NULL != timeout_task) { GNUNET_SCHEDULER_cancel (timeout_task); timeout_task = NULL; @@ -112,7 +113,7 @@ shutdown_testcase () GNUNET_STATISTICS_destroy (learn_peer.stats, GNUNET_NO); learn_peer.stats = NULL; } - if (check_task != NULL) + if (NULL != check_task) { GNUNET_SCHEDULER_cancel (check_task); check_task = NULL; @@ -124,20 +125,24 @@ shutdown_testcase () } if (NULL != adv_peer.core) { - GNUNET_CORE_disconnect (adv_peer.core); + GNUNET_CORE_disconnecT (adv_peer.core); adv_peer.core = NULL; } if (NULL != learn_peer.core) { - GNUNET_CORE_disconnect (learn_peer.core); + GNUNET_CORE_disconnecT (learn_peer.core); learn_peer.core = NULL; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Killing hostlist server ARM process.\n"); - if (0 != GNUNET_OS_process_kill (adv_peer.arm_proc, GNUNET_TERM_SIG)) - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill"); - if (GNUNET_OS_process_wait (adv_peer.arm_proc) != GNUNET_OK) - GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "waitpid"); + if (0 != GNUNET_OS_process_kill (adv_peer.arm_proc, + GNUNET_TERM_SIG)) + GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, + "kill"); + if (GNUNET_OK != + GNUNET_OS_process_wait (adv_peer.arm_proc)) + GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, + "waitpid"); GNUNET_OS_process_destroy (adv_peer.arm_proc); adv_peer.arm_proc = NULL; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -156,6 +161,7 @@ shutdown_testcase () "Shutdown complete....\n"); } + /** * Timeout, give up. */ @@ -185,10 +191,14 @@ do_shutdown (void *cls) static int -process_downloads (void *cls, const char *subsystem, const char *name, - uint64_t value, int is_persistent) +process_downloads (void *cls, + const char *subsystem, + const char *name, + uint64_t value, + int is_persistent) { - if ((value >= 2) && (learned_hostlist_downloaded == GNUNET_NO)) + if ( (value >= 2) && + (GNUNET_NO == learned_hostlist_downloaded) ) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Peer has successfully downloaded advertised URI\n"); @@ -210,18 +220,25 @@ process_uris_recv_done (void *cls, int success) static int -process_uris_recv (void *cls, const char *subsystem, const char *name, - uint64_t value, int is_persistent) +process_uris_recv (void *cls, + const char *subsystem, + const char *name, + uint64_t value, + int is_persistent) { - if (((struct PeerContext *) cls == &learn_peer) && (value == 1) && - (learned_hostlist_saved == GNUNET_NO)) + struct PeerContext *pc = cls; + if ( (pc == &learn_peer) && + (value == 1) && + (learned_hostlist_saved == GNUNET_NO) ) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Peer has successfully saved advertised URI\n"); learned_hostlist_saved = GNUNET_YES; - if ((learned_hostlist_downloaded == GNUNET_YES) && (adv_sent == GNUNET_YES)) + if ( (learned_hostlist_downloaded == GNUNET_YES) && + (adv_sent == GNUNET_YES) ) { - GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); + GNUNET_SCHEDULER_add_now (&do_shutdown, + NULL); } } return GNUNET_OK; @@ -239,7 +256,8 @@ static int process_adv_sent (void *cls, const char *subsystem, const char *name, - uint64_t value, int is_persistent) + uint64_t value, + int is_persistent) { if ((value >= 1) && (adv_sent == GNUNET_NO)) { @@ -249,7 +267,8 @@ process_adv_sent (void *cls, if ((learned_hostlist_downloaded == GNUNET_YES) && (learned_hostlist_saved == GNUNET_YES)) { - GNUNET_SCHEDULER_add_now (&do_shutdown, NULL); + GNUNET_SCHEDULER_add_now (&do_shutdown, + NULL); } } return GNUNET_OK; @@ -273,8 +292,11 @@ check_statistics (void *cls) if (NULL != download_stats) GNUNET_STATISTICS_get_cancel (download_stats); download_stats = - GNUNET_STATISTICS_get (learn_peer.stats, "hostlist", stat, - &process_downloads_done, &process_downloads, + GNUNET_STATISTICS_get (learn_peer.stats, + "hostlist", + stat, + &process_downloads_done, + &process_downloads, &learn_peer); if (NULL != urisrecv_stat) GNUNET_STATISTICS_get_cancel (urisrecv_stat); @@ -293,55 +315,64 @@ check_statistics (void *cls) GNUNET_STATISTICS_get (adv_peer.stats, "hostlist", gettext_noop ("# hostlist advertisements send"), &process_adv_sent_done, - &process_adv_sent, NULL); + &process_adv_sent, + NULL); } check_task = - GNUNET_SCHEDULER_add_delayed (CHECK_INTERVAL, &check_statistics, NULL); + GNUNET_SCHEDULER_add_delayed (CHECK_INTERVAL, + &check_statistics, + NULL); } -/** - * Core handler for p2p hostlist advertisements - */ static int -ad_arrive_handler (void *cls, - const struct GNUNET_PeerIdentity *peer, +check_ad_arrive (void *cls, + const struct GNUNET_MessageHeader *message) +{ + const char *end = (const char *) &message[1]; + if ('\0' != end[ntohs (message->size) - sizeof (struct GNUNET_MessageHeader) - 1]) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + return GNUNET_OK; +} + + +static void +handle_ad_arrive (void *cls, const struct GNUNET_MessageHeader *message) { char *hostname; char *expected_uri; unsigned long long port; - const struct GNUNET_MessageHeader *incoming; const char *end; - if (-1 == - GNUNET_CONFIGURATION_get_value_number (adv_peer.cfg, "HOSTLIST", - "HTTPPORT", &port)) + if (GNUNET_SYSERR == + GNUNET_CONFIGURATION_get_value_number (adv_peer.cfg, + "HOSTLIST", + "HTTPPORT", + &port)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Could not read advertising server's configuration\n"); - return GNUNET_SYSERR; + return; } if (GNUNET_SYSERR == - GNUNET_CONFIGURATION_get_value_string (adv_peer.cfg, "HOSTLIST", - "EXTERNAL_DNS_NAME", &hostname)) + GNUNET_CONFIGURATION_get_value_string (adv_peer.cfg, + "HOSTLIST", + "EXTERNAL_DNS_NAME", + &hostname)) hostname = GNUNET_RESOLVER_local_fqdn_get (); - GNUNET_asprintf (&expected_uri, "http://%s:%u/", + GNUNET_asprintf (&expected_uri, + "http://%s:%u/", hostname != NULL ? hostname : "localhost", (unsigned int) port); - incoming = (const struct GNUNET_MessageHeader *) message; - end = (const char *) &incoming[1]; - if ('\0' != - end[ntohs (message->size) - sizeof (struct GNUNET_MessageHeader) - 1]) - { - GNUNET_break (0); - GNUNET_free (expected_uri); - GNUNET_free_non_null (hostname); - return GNUNET_SYSERR; - } + end = (const char *) &message[1]; current_adv_uri = GNUNET_strdup (end); - if (0 == strcmp (expected_uri, current_adv_uri)) + if (0 == strcmp (expected_uri, + current_adv_uri)) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Received hostlist advertisement with URI `%s' as expected\n", @@ -352,25 +383,24 @@ ad_arrive_handler (void *cls, else GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Expected URI `%s' and received URI `%s' differ\n", - expected_uri, current_adv_uri); + expected_uri, + current_adv_uri); GNUNET_free (expected_uri); GNUNET_free_non_null (hostname); - return GNUNET_OK; } -/** - * List of handlers if we are learning. - */ -static struct GNUNET_CORE_MessageHandler learn_handlers[] = { - {&ad_arrive_handler, GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT, 0}, - {NULL, 0, 0} -}; - - static void -setup_learn_peer (struct PeerContext *p, const char *cfgname) +setup_learn_peer (struct PeerContext *p, + const char *cfgname) { + GNUNET_MQ_hd_var_size (ad_arrive, + GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT, + struct GNUNET_MessageHeader); + struct GNUNET_MQ_MessageHandler learn_handlers[] = { + make_ad_arrive_handler (NULL), + GNUNET_MQ_handler_end () + }; char *filename; unsigned int result; char *binary; @@ -383,9 +413,13 @@ setup_learn_peer (struct PeerContext *p, const char *cfgname) binary, "gnunet-service-arm", "-c", cfgname, NULL); - GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_load (p->cfg, cfgname)); + GNUNET_assert (GNUNET_OK == + GNUNET_CONFIGURATION_load (p->cfg, + cfgname)); if (GNUNET_OK == - GNUNET_CONFIGURATION_get_value_string (p->cfg, "HOSTLIST", "HOSTLISTFILE", + GNUNET_CONFIGURATION_get_value_string (p->cfg, + "HOSTLIST", + "HOSTLISTFILE", &filename)) { if (GNUNET_YES == GNUNET_DISK_file_test (filename)) @@ -393,34 +427,43 @@ setup_learn_peer (struct PeerContext *p, const char *cfgname) result = UNLINK (filename); if (result == 0) GNUNET_log (GNUNET_ERROR_TYPE_INFO, - _("Hostlist file `%s' was removed\n"), filename); + _("Hostlist file `%s' was removed\n"), + filename); } GNUNET_free (filename); } - p->core = - GNUNET_CORE_connect (p->cfg, NULL, NULL, NULL, NULL, NULL, GNUNET_NO, - NULL, GNUNET_NO, learn_handlers); + p->core = GNUNET_CORE_connecT (p->cfg, + NULL, + NULL, + NULL, + NULL, + learn_handlers); GNUNET_assert (NULL != p->core); - p->stats = GNUNET_STATISTICS_create ("hostlist", p->cfg); + p->stats = GNUNET_STATISTICS_create ("hostlist", + p->cfg); GNUNET_assert (NULL != p->stats); GNUNET_free (binary); } static void -setup_adv_peer (struct PeerContext *p, const char *cfgname) +setup_adv_peer (struct PeerContext *p, + const char *cfgname) { char *binary; binary = GNUNET_OS_get_libexec_binary_path ("gnunet-service-arm"); p->cfg = GNUNET_CONFIGURATION_create (); p->arm_proc = - GNUNET_OS_start_process (GNUNET_YES, GNUNET_OS_INHERIT_STD_OUT_AND_ERR, + GNUNET_OS_start_process (GNUNET_YES, + GNUNET_OS_INHERIT_STD_OUT_AND_ERR, NULL, NULL, NULL, binary, "gnunet-service-arm", "-c", cfgname, NULL); - GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_load (p->cfg, cfgname)); + GNUNET_assert (GNUNET_OK == + GNUNET_CONFIGURATION_load (p->cfg, + cfgname)); p->stats = GNUNET_STATISTICS_create ("hostlist", p->cfg); GNUNET_assert (NULL != p->stats); GNUNET_free (binary); @@ -428,7 +471,9 @@ setup_adv_peer (struct PeerContext *p, const char *cfgname) static void -run (void *cls, char *const *args, const char *cfgfile, +run (void *cls, + char *const *args, + const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *c) { timeout = GNUNET_NO; @@ -440,12 +485,17 @@ run (void *cls, char *const *args, const char *cfgfile, cfg = c; - setup_adv_peer (&adv_peer, "test_learning_adv_peer.conf"); - setup_learn_peer (&learn_peer, "test_learning_learn_peer.conf"); - timeout_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &timeout_error, NULL); - + setup_adv_peer (&adv_peer, + "test_learning_adv_peer.conf"); + setup_learn_peer (&learn_peer, + "test_learning_learn_peer.conf"); + timeout_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, + &timeout_error, + NULL); check_task = - GNUNET_SCHEDULER_add_delayed (CHECK_INTERVAL, &check_statistics, NULL); + GNUNET_SCHEDULER_add_delayed (CHECK_INTERVAL, + &check_statistics, + NULL); } @@ -463,13 +513,18 @@ check () GNUNET_GETOPT_OPTION_END }; - GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1, argv, - "test-gnunet-daemon-hostlist-learning", "nohelp", options, - &run, NULL); + GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1, + argv, + "test-gnunet-daemon-hostlist-learning", + "nohelp", + options, + &run, + NULL); failed = GNUNET_NO; if (timeout == GNUNET_YES) { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Testcase timeout\n"); + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Testcase timeout\n"); failed = GNUNET_YES; } if (adv_arrived != GNUNET_YES) @@ -522,7 +577,8 @@ main (int argc, char *argv[]) ret = check (); GNUNET_DISK_directory_remove ("/tmp/test-gnunet-hostlist-peer-1"); GNUNET_DISK_directory_remove ("/tmp/test-gnunet-hostlist-peer-2"); - if (GNUNET_YES == GNUNET_DISK_file_test ("hostlists_learn_peer.file")) + if (GNUNET_YES == + GNUNET_DISK_file_test ("hostlists_learn_peer.file")) { if (0 == UNLINK ("hostlists_learn_peer.file")) GNUNET_log (GNUNET_ERROR_TYPE_INFO, -- cgit v1.2.3