From: Matthias Wachs Date: Thu, 13 Oct 2011 19:14:04 +0000 (+0000) Subject: missing X-Git-Tag: initial-import-from-subversion-38251~16553 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=9d3d595085088e316830652b6673fa6492d373bf;p=oweals%2Fgnunet.git missing --- diff --git a/src/ats/gnunet-service-ats.c b/src/ats/gnunet-service-ats.c new file mode 100644 index 000000000..03bbf5620 --- /dev/null +++ b/src/ats/gnunet-service-ats.c @@ -0,0 +1,241 @@ +/* + This file is part of GNUnet. + (C) 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 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 ats/gnunet-service-ats.c + * @brief ats service + * @author Matthias Wachs + */ +#include "platform.h" +#include "gnunet_getopt_lib.h" +#include "gnunet_service_lib.h" +#include "gnunet_container_lib.h" +#include "ats.h" + +struct ATS_Clients +{ + struct GNUNET_SERVER_Client *client; + + uint32_t flags; +}; + +struct ATS_Address +{ + struct GNUNET_PeerIdentity peer; + + size_t addr_len; + + uint32_t session_id; + + uint32_t ats_count; + + void * addr; + + char * plugin; + + struct GNUNET_TRANSPORT_ATS_Information * ats; +}; + +/** + * Head of linked list of all clients to this service. + */ +static struct ATS_Clients *ac_head; + +/** + * Tail of linked list of all clients to this service. + */ +static struct ATS_Clients *ac_tail; + +static struct GNUNET_CONTAINER_MultiHashMap * addresses; + +int address_it (void *cls, + const GNUNET_HashCode * key, + void *value) +{ + struct ATS_Address * aa = cls; + GNUNET_free (aa); + GNUNET_OK; +} + +/** + * Task run during shutdown. + * + * @param cls unused + * @param tc unused + */ +static void +cleanup_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + struct ATS_Clients * t; + + while (ac_head != NULL) + { + t = ac_head; + GNUNET_CONTAINER_DLL_remove(ac_head,ac_tail, t); + GNUNET_free (ac); + } + + GNUNET_CONTAINER_multihashmap_iterate(addresses, address_it, NULL); + + GNUNET_CONTAINER_multihashmap_create(addresses); +} + +static void +handle_ats_start (void *cls, struct GNUNET_SERVER_Client *client, + const struct GNUNET_MessageHeader *message) + +{ + struct ClientStartMessage * msg = (struct ClientStartMessage *) msg; + struct ATS_Clients * ac = NULL; + + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", "ATS_START"); + + GNUNET_assert (find_client(client) == NULL); + + ac = GNUNET_malloc (sizeof (struct ATS_Clients)); + ac->client = client; + ac->flags = ntohl (msg->start_flag); + + GNUNET_CONTAINER_DLL_insert(ac_head, ac_tail, ac); +} + +static void +handle_request_address (void *cls, struct GNUNET_SERVER_Client *client, + const struct GNUNET_MessageHeader *message) + +{ + struct RequestAddressMessage * msg = (struct RequestAddressMessage *) msg; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", "REQUEST_ADDRESS"); + +} + +static void +handle_address_update (void *cls, struct GNUNET_SERVER_Client *client, + const struct GNUNET_MessageHeader *message) + +{ + struct AddressUpdateMessage * msg = (struct AddressUpdateMessage *) msg; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", "ADDRESS_UPDATE"); + + struct GNUNET_TRANSPORT_ATS_Information *am; + char *pm; + + if (size <= sizeof (struct AddressUpdateMessage)) + GNUNET_break (0); + + struct ATS_Address * aa = GNUNET_malloc (sizeof (struct ATS_Address) + + ats_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information) + + addr_len + + plugin_len); + + size_t size = ntohs (msg->header.size); + size_t ats_count = ntohs (msg->ats_count); + size_t addr_len = ntohs (msg->address_length); + size_t plugin_len = ntohs (msg->plugin_name_length) + 1 ; + + memcpy (&aa->peer, &msg->peer, sizeof (struct GNUNET_PeerIdentity)); + aa->addr_len = addr_len; + aa->ats_count = ats_count; + aa->ats = &aa[1]; + + am = (struct GNUNET_TRANSPORT_ATS_Information*) &msg[1]; + memcpy (&aa->ats, am, ats_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information)); + pm = (char *) &am[ats_count]; + memcpy (aa->addr, pm, addr_len); + memcpy (aa->plugin, &pm[plugin_addr_len], plugin_len); + aa->session_id = ntohl(msg->session_id); + + GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put(addresses, aa->peer.hashPubKey, aa, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); +} + +static void +handle_address_destroyed (void *cls, struct GNUNET_SERVER_Client *client, + const struct GNUNET_MessageHeader *message) + +{ + struct AddressDestroyedMessage * msg = (struct AddressDestroyedMessage *) msg; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", "ADDRESS_DESTROYED"); + +} + +static void +handle_reservation_request (void *cls, struct GNUNET_SERVER_Client *client, + const struct GNUNET_MessageHeader *message) + +{ + struct AddressUpdateMessage * msg = (struct AddressUpdateMessage *) msg; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", "RESERVATION_REQUEST"); +} + +static void +handle_preference_change (void *cls, struct GNUNET_SERVER_Client *client, + const struct GNUNET_MessageHeader *message) + +{ + struct ChangePreferenceMessage * msg = (struct ChangePreferenceMessage *) msg; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", "PREFERENCE_CHANGE"); +} + +/** + * Process template requests. + * + * @param cls closure + * @param server the initialized server + * @param cfg configuration to use + */ +static void +run (void *cls, struct GNUNET_SERVER_Handle *server, + const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + static const struct GNUNET_SERVER_MessageHandler handlers[] = { + {&handle_ats_start, NULL, GNUNET_MESSAGE_TYPE_ATS_START, sizeof (struct ClientStartMessage)}, + {&handle_request_address, NULL, GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS, sizeof (struct RequestAddressMessage)}, + {&handle_address_update, NULL, GNUNET_MESSAGE_TYPE_ATS_ADDRESS_UPDATE, 0}, + {&handle_address_destroyed, NULL, GNUNET_MESSAGE_TYPE_ATS_ADDRESS_DESTROYED, 0}, + {&handle_reservation_request, NULL, GNUNET_MESSAGE_TYPE_ATS_RESERVATION_REQUEST, sizeof (struct ReservationRequestMessage)}, + {&handle_preference_change, NULL, GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_CHANGE, 0}, + {NULL, NULL, 0, 0} + }; + + addresses = GNUNET_CONTAINER_multihashmap_create(100); + + GNUNET_SERVER_add_handlers (server, handlers); + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &cleanup_task, + NULL); +} + + +/** + * The main function for the ats service. + * + * @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_SERVICE_run (argc, argv, "gnunet-service-ats", + GNUNET_SERVICE_OPTION_NONE, &run, NULL)) ? 0 : 1; +} + +/* end of gnunet-service-ats.c */