diff options
author | Christian Grothoff <christian@grothoff.org> | 2016-09-21 10:56:28 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2016-09-21 10:56:28 +0000 |
commit | d4afc6e37a14fe3257263c377a243c1a22ed9ee5 (patch) | |
tree | ccfce6d4f92808372d3e7ebfe9f5372e9f21f50c | |
parent | 60d02b5b0899f454cb65408bd2ed4c453fa75a3d (diff) |
migrating more services to new service API
23 files changed, 844 insertions, 998 deletions
diff --git a/src/ats/Makefile.am b/src/ats/Makefile.am index ffe2c96167..aa3612c2d9 100644 --- a/src/ats/Makefile.am +++ b/src/ats/Makefile.am @@ -83,7 +83,6 @@ gnunet_service_ats_SOURCES = \ gnunet-service-ats.c gnunet-service-ats.h \ gnunet-service-ats_addresses.c gnunet-service-ats_addresses.h \ gnunet-service-ats_connectivity.c gnunet-service-ats_connectivity.h \ - gnunet-service-ats_feedback.c gnunet-service-ats_feedback.h \ gnunet-service-ats_normalization.c gnunet-service-ats_normalization.h \ gnunet-service-ats_performance.c gnunet-service-ats_performance.h \ gnunet-service-ats_plugins.c gnunet-service-ats_plugins.h \ diff --git a/src/ats/gnunet-service-ats.c b/src/ats/gnunet-service-ats.c index 045a5bb673..9762faa511 100644 --- a/src/ats/gnunet-service-ats.c +++ b/src/ats/gnunet-service-ats.c @@ -28,7 +28,6 @@ #include "gnunet-service-ats.h" #include "gnunet-service-ats_addresses.h" #include "gnunet-service-ats_connectivity.h" -#include "gnunet-service-ats_feedback.h" #include "gnunet-service-ats_normalization.h" #include "gnunet-service-ats_performance.h" #include "gnunet-service-ats_preferences.h" @@ -42,27 +41,19 @@ */ struct GNUNET_STATISTICS_Handle *GSA_stats; -/** - * Handle to the ATS server. - */ -static struct GNUNET_SERVER_Handle *GSA_server; - /** * We have received a `struct ClientStartMessage` from a client. Find * out which type of client it is and notify the respective subsystem. * - * @param cls closure, unused - * @param client handle to the client - * @param message the start message + * @param cls handle to the client + * @param msg the start message */ static void handle_ats_start (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) + const struct ClientStartMessage *msg) { - const struct ClientStartMessage *msg = - (const struct ClientStartMessage *) message; + struct GNUNET_SERVICE_Client *client = cls; enum StartFlag flag; flag = ntohl (msg->start_flag); @@ -72,10 +63,10 @@ handle_ats_start (void *cls, switch (flag) { case START_FLAG_SCHEDULING: - if (GNUNET_OK != GAS_scheduling_add_client (client)) + if (GNUNET_OK != + GAS_scheduling_add_client (client)) { - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (client); return; } break; @@ -92,12 +83,310 @@ handle_ats_start (void *cls, break; default: GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (client); return; } - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (client); +} + + + +/** + * Handle 'reservation request' messages from clients. + * + * @param cls client that sent the request + * @param message the request message + */ +static void +handle_reservation_request (void *cls, + const struct ReservationRequestMessage *message) +{ + struct GNUNET_SERVICE_Client *client = cls; + + GAS_handle_reservation_request (client, + message); + GNUNET_SERVICE_client_continue (client); +} + + +/** + * Check 'preference feedback' message is well-formed + * + * @param cls client that sent the request + * @param message the request message + * @return #GNUNET_OK if @a message is well-formed + */ +static int +check_feedback (void *cls, + const struct FeedbackPreferenceMessage *message) +{ + uint16_t msize; + uint32_t nump; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Received PREFERENCE_FEEDBACK message\n"); + msize = ntohs (message->header.size); + nump = ntohl (message->num_feedback); + if (msize != + sizeof (struct FeedbackPreferenceMessage) + + nump * sizeof (struct PreferenceInformation)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + return GNUNET_OK; +} + + +/** + * Handle 'preference feedback' messages from clients. + * + * @param cls client that sent the request + * @param msg the request message + */ +static void +handle_feedback (void *cls, + const struct FeedbackPreferenceMessage *msg) +{ + struct GNUNET_SERVICE_Client *client = cls; + const struct PreferenceInformation *pi; + uint32_t nump; + + nump = ntohl (msg->num_feedback); + if (GNUNET_NO == + GNUNET_CONTAINER_multipeermap_contains (GSA_addresses, + &msg->peer)) + { + GNUNET_log(GNUNET_ERROR_TYPE_WARNING, + "Received PREFERENCE FEEDBACK for unknown peer `%s'\n", + GNUNET_i2s (&msg->peer)); + GNUNET_SERVICE_client_continue (client); + return; + } + + GNUNET_STATISTICS_update (GSA_stats, + "# preference feedbacks requests processed", + 1, + GNUNET_NO); + pi = (const struct PreferenceInformation *) &msg[1]; + for (uint32_t i = 0; i < nump; i++) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Received PREFERENCE FEEDBACK for peer `%s'\n", + GNUNET_i2s (&msg->peer)); + GAS_plugin_notify_feedback (client, + &msg->peer, + GNUNET_TIME_relative_ntoh (msg->scope), + (enum GNUNET_ATS_PreferenceKind) ntohl (pi[i].preference_kind), + pi[i].preference_value); + } + GNUNET_SERVICE_client_continue (client); +} + + +/** + * Handle 'request address list' messages from clients. + * + * @param cls client that sent the request + * @param message the request message + */ +static void +handle_request_address_list (void *cls, + const struct AddressListRequestMessage *message) +{ + struct GNUNET_SERVICE_Client *client = cls; + + GAS_handle_request_address_list (client, + message); + GNUNET_SERVICE_client_continue (client); +} + + +/** + * Handle 'request address' messages from clients. + * + * @param cls client that sent the request + * @param message the request message + */ +static void +handle_request_address (void *cls, + const struct RequestAddressMessage * message) +{ + struct GNUNET_SERVICE_Client *client = cls; + + GAS_handle_request_address (client, + message); + GNUNET_SERVICE_client_continue (client); +} + + +/** + * Cancel 'request address' messages from clients. + * + * @param cls client that sent the request + * @param message the request message + */ +static void +handle_request_address_cancel (void *cls, + const struct RequestAddressMessage *message) +{ + struct GNUNET_SERVICE_Client *client = cls; + + GAS_handle_request_address_cancel (client, + message); + GNUNET_SERVICE_client_continue (client); +} + + +/** + * Handle 'address add' messages from clients. + * + * @param cls client that sent the request + * @param m the request message + */ +static int +check_address_add (void *cls, + const struct AddressAddMessage *m) +{ + const char *address; + const char *plugin_name; + uint16_t address_length; + uint16_t plugin_name_length; + uint16_t size; + + size = ntohs (m->header.size); + address_length = ntohs (m->address_length); + plugin_name_length = ntohs (m->plugin_name_length); + address = (const char *) &m[1]; + if (plugin_name_length != 0) + plugin_name = &address[address_length]; + else + plugin_name = ""; + + if ( (address_length + plugin_name_length + + sizeof (struct AddressAddMessage) != size) || + ( (plugin_name_length > 0) && + (plugin_name[plugin_name_length - 1] != '\0') ) ) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + return GNUNET_OK; +} + + +/** + * Handle 'address add' messages from clients. + * + * @param cls client that sent the request + * @param message the request message + */ +static void +handle_address_add (void *cls, + const struct AddressAddMessage *message) +{ + struct GNUNET_SERVICE_Client *client = cls; + + GAS_handle_address_add (message); + GNUNET_SERVICE_client_continue (client); +} + + +/** + * Handle 'address update' messages from clients. + * + * @param cls client that sent the request + * @param message the request message + */ +static void +handle_address_update (void *cls, + const struct AddressUpdateMessage *message) +{ + struct GNUNET_SERVICE_Client *client = cls; + + GAS_handle_address_update (message); + GNUNET_SERVICE_client_continue (client); +} + + +/** + * Handle 'address destroyed' messages from clients. + * + * @param cls client that sent the request + * @param message the request message + */ +static void +handle_address_destroyed (void *cls, + const struct AddressDestroyedMessage *message) +{ + struct GNUNET_SERVICE_Client *client = cls; + + GAS_handle_address_destroyed (message); + GNUNET_SERVICE_client_continue (client); +} + + +/** + * Check that 'change preference' message is well-formed. + * + * @param cls client that sent the request + * @param message the request message + * @return #GNUNET_OK if @a message is well-formed + */ +static int +check_preference_change (void *cls, + const struct ChangePreferenceMessage *message) +{ + uint16_t msize; + uint32_t nump; + + msize = ntohs (message->header.size); + nump = ntohl (message->num_preferences); + if ( (msize != + sizeof (struct ChangePreferenceMessage) + + nump * sizeof (struct PreferenceInformation)) || + (UINT16_MAX / sizeof (struct PreferenceInformation) < nump) ) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + return GNUNET_OK; +} + + +/** + * Handle 'change preference' messages from clients. + * + * @param cls client that sent the request + * @param message the request message + */ +static void +handle_preference_change (void *cls, + const struct ChangePreferenceMessage *message) +{ + struct GNUNET_SERVICE_Client *client = cls; + + GAS_handle_preference_change (client, + message); + GNUNET_SERVICE_client_continue (client); +} + + +/** + * A client connected to us. Setup the local client + * record. + * + * @param cls unused + * @param client handle of the client + * @param mq message queue to talk to @a client + * @return @a client + */ +static void * +client_connect_cb (void *cls, + struct GNUNET_SERVICE_Client *client, + struct GNUNET_MQ_Handle *mq) +{ + return client; } @@ -107,10 +396,12 @@ handle_ats_start (void *cls, * * @param cls unused * @param client handle of the client + * @param app_ctx */ static void -client_disconnect_handler (void *cls, - struct GNUNET_SERVER_Client *client) +client_disconnect_cb (void *cls, + struct GNUNET_SERVICE_Client *client, + void *app_ctx) { if (NULL == client) return; @@ -134,7 +425,6 @@ cleanup_task (void *cls) GAS_addresses_done (); GAS_plugin_done (); GAS_normalization_stop (); - GAS_scheduling_done (); GAS_performance_done (); GAS_preference_done (); GAS_reservations_done (); @@ -150,51 +440,21 @@ cleanup_task (void *cls) * Process template requests. * * @param cls closure - * @param server the initialized server * @param cfg configuration to use + * @param service the initialized service */ 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)}, - {&GAS_handle_request_address, NULL, - GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS, - sizeof (struct RequestAddressMessage)}, - {&GAS_handle_request_address_cancel, NULL, - GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS_CANCEL, - sizeof (struct RequestAddressMessage)}, - {&GAS_handle_request_address_list, NULL, - GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_REQUEST, - sizeof (struct AddressListRequestMessage)}, - {&GAS_handle_address_add, NULL, - GNUNET_MESSAGE_TYPE_ATS_ADDRESS_ADD, 0}, - {&GAS_handle_address_update, NULL, - GNUNET_MESSAGE_TYPE_ATS_ADDRESS_UPDATE, - sizeof (struct AddressUpdateMessage) }, - {&GAS_handle_address_destroyed, NULL, - GNUNET_MESSAGE_TYPE_ATS_ADDRESS_DESTROYED, - sizeof (struct AddressDestroyedMessage) }, - {&GAS_handle_reservation_request, NULL, - GNUNET_MESSAGE_TYPE_ATS_RESERVATION_REQUEST, - sizeof (struct ReservationRequestMessage)}, - {&GAS_handle_preference_change, NULL, - GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_CHANGE, 0}, - {&GAS_handle_feedback, NULL, - GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_FEEDBACK, 0}, - {NULL, NULL, 0, 0} - }; - GSA_server = server; - GSA_stats = GNUNET_STATISTICS_create ("ats", cfg); - GAS_reservations_init (server); + const struct GNUNET_CONFIGURATION_Handle *cfg, + struct GNUNET_SERVICE_Handle *service) +{ + GSA_stats = GNUNET_STATISTICS_create ("ats", + cfg); + GAS_reservations_init (); GAS_connectivity_init (); GAS_preference_init (); GAS_normalization_start (); - GAS_addresses_init (server); + GAS_addresses_init (); if (GNUNET_OK != GAS_plugin_init (cfg)) { @@ -206,37 +466,69 @@ run (void *cls, GAS_preference_done (); if (NULL != GSA_stats) { - GNUNET_STATISTICS_destroy (GSA_stats, GNUNET_NO); + GNUNET_STATISTICS_destroy (GSA_stats, + GNUNET_NO); GSA_stats = NULL; } return; } - GAS_performance_init (server); - GAS_scheduling_init (server); - - GNUNET_SERVER_disconnect_notify (server, - &client_disconnect_handler, - NULL); - GNUNET_SERVER_add_handlers (server, handlers); + GAS_performance_init (); GNUNET_SCHEDULER_add_shutdown (&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 + * Define "main" method using service macro. */ -int -main (int argc, char *const *argv) -{ - return (GNUNET_OK == - GNUNET_SERVICE_run (argc, argv, "ats", - GNUNET_SERVICE_OPTION_NONE, - &run, NULL)) ? 0 : 1; -} +GNUNET_SERVICE_MAIN +("ats", + GNUNET_SERVICE_OPTION_NONE, + &run, + &client_connect_cb, + &client_disconnect_cb, + NULL, + GNUNET_MQ_hd_fixed_size (ats_start, + GNUNET_MESSAGE_TYPE_ATS_START, + struct ClientStartMessage, + NULL), + GNUNET_MQ_hd_fixed_size (request_address, + GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS, + struct RequestAddressMessage, + NULL), + GNUNET_MQ_hd_fixed_size (request_address_cancel, + GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS_CANCEL, + struct RequestAddressMessage, + NULL), + GNUNET_MQ_hd_fixed_size (request_address_list, + GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_REQUEST, + struct AddressListRequestMessage, + NULL), + GNUNET_MQ_hd_var_size (address_add, + GNUNET_MESSAGE_TYPE_ATS_ADDRESS_ADD, + struct AddressAddMessage, + NULL), + GNUNET_MQ_hd_fixed_size (address_update, + GNUNET_MESSAGE_TYPE_ATS_ADDRESS_UPDATE, + struct AddressUpdateMessage, + NULL), + GNUNET_MQ_hd_fixed_size (address_destroyed, + GNUNET_MESSAGE_TYPE_ATS_ADDRESS_DESTROYED, + struct AddressDestroyedMessage, + NULL), + GNUNET_MQ_hd_fixed_size (reservation_request, + GNUNET_MESSAGE_TYPE_ATS_RESERVATION_REQUEST, + struct ReservationRequestMessage, + NULL), + GNUNET_MQ_hd_var_size (preference_change, + GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_CHANGE, + struct ChangePreferenceMessage, + NULL), + GNUNET_MQ_hd_var_size (feedback, + GNUNET_MESSAGE_TYPE_ATS_PREFERENCE_FEEDBACK, + struct FeedbackPreferenceMessage, + NULL), + GNUNET_MQ_handler_end ()); + /* end of gnunet-service-ats.c */ diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c index 44a4782d5a..1a4a332066 100644 --- a/src/ats/gnunet-service-ats_addresses.c +++ b/src/ats/gnunet-service-ats_addresses.c @@ -347,13 +347,13 @@ GAS_addresses_destroy (const struct GNUNET_PeerIdentity *peer, * known and current performance information. It has a solver component * responsible for the resource allocation. It tells the solver about changes * and receives updates when the solver changes the resource allocation. - * - * @param server handle to our server */ void -GAS_addresses_init (struct GNUNET_SERVER_Handle *server) +GAS_addresses_init () { - GSA_addresses = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_NO); + GSA_addresses + = GNUNET_CONTAINER_multipeermap_create (128, + GNUNET_NO); update_addresses_stat (); } @@ -515,7 +515,7 @@ struct AddressIteration /** * Actual handle to the client. */ - struct GNUNET_SERVER_Client *client; + struct GNUNET_SERVICE_Client *client; /** * Are we sending all addresses, or only those that are active? @@ -558,30 +558,26 @@ transmit_req_addr (struct AddressIteration *ai, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) { + struct GNUNET_MQ_Envelope *env; struct PeerInformationMessage *msg; char *addrp; size_t plugin_name_length; size_t msize; - struct GNUNET_SERVER_NotificationContext **uc; - struct GNUNET_SERVER_NotificationContext *nc; if (NULL != plugin_name) plugin_name_length = strlen (plugin_name) + 1; else plugin_name_length = 0; - msize = sizeof (struct PeerInformationMessage) + - plugin_addr_len + plugin_name_length; - char buf[msize] GNUNET_ALIGN; - - GNUNET_assert (msize < GNUNET_SERVER_MAX_MESSAGE_SIZE); - msg = (struct PeerInformationMessage *) buf; - msg->header.size = htons (msize); - msg->header.type = htons (GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE); + msize = plugin_addr_len + plugin_name_length; + + GNUNET_assert (sizeof (struct PeerInformationMessage) + msize + < GNUNET_SERVER_MAX_MESSAGE_SIZE); + env = GNUNET_MQ_msg_extra (msg, + msize, + GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE); msg->id = htonl (ai->id); if (NULL != id) msg->peer = *id; - else - memset (&msg->peer, '\0', sizeof (struct GNUNET_PeerIdentity)); msg->address_length = htons (plugin_addr_len); msg->address_active = ntohl (active); msg->plugin_name_length = htons (plugin_name_length); @@ -590,28 +586,16 @@ transmit_req_addr (struct AddressIteration *ai, if (NULL != prop) GNUNET_ATS_properties_hton (&msg->properties, prop); - else - memset (&msg->properties, - 0, - sizeof (struct GNUNET_ATS_Properties)); msg->address_local_info = htonl ((uint32_t) local_address_info); addrp = (char *) &msg[1]; - if (NULL != plugin_addr) - GNUNET_memcpy (addrp, plugin_addr, plugin_addr_len); + GNUNET_memcpy (addrp, + plugin_addr, + plugin_addr_len); if (NULL != plugin_name) - strcpy (&addrp[plugin_addr_len], plugin_name); - uc = GNUNET_SERVER_client_get_user_context (ai->client, - struct GNUNET_SERVER_NotificationContext *); - if (NULL == uc) - { - GNUNET_break (0); - return; - } - nc = *uc; - GNUNET_SERVER_notification_context_unicast (nc, - ai->client, - &msg->header, - GNUNET_NO); + strcpy (&addrp[plugin_addr_len], + plugin_name); + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (ai->client), + env); } @@ -679,22 +663,18 @@ req_addr_peerinfo_it (void *cls, /** * Handle 'address list request' messages from clients. * - * @param cls unused, NULL - * @param client client that sent the request - * @param message the request message + * @param cls client that sent the request + * @param alrm the request message */ void -GAS_handle_request_address_list (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) +GAS_handle_request_address_list (struct GNUNET_SERVICE_Client *client, + const struct AddressListRequestMessage *alrm) { struct AddressIteration ai; - const struct AddressListRequestMessage *alrm; struct GNUNET_PeerIdentity allzeros; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received ADDRESSLIST_REQUEST message\n"); - alrm = (const struct AddressListRequestMessage *) message; ai.all = ntohl (alrm->all); ai.id = ntohl (alrm->id); ai.client = client; @@ -728,8 +708,6 @@ GAS_handle_request_address_list (void *cls, GNUNET_HELLO_ADDRESS_INFO_NONE, GNUNET_BANDWIDTH_ZERO, GNUNET_BANDWIDTH_ZERO); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); } diff --git a/src/ats/gnunet-service-ats_addresses.h b/src/ats/gnunet-service-ats_addresses.h index 274985e668..61de1cd31f 100644 --- a/src/ats/gnunet-service-ats_addresses.h +++ b/src/ats/gnunet-service-ats_addresses.h @@ -30,6 +30,7 @@ #include "gnunet_util_lib.h" #include "gnunet_ats_service.h" #include "gnunet-service-ats.h" +#include "ats.h" /** * NOTE: Do not change this documentation. This documentation is based on @@ -366,11 +367,9 @@ extern struct GNUNET_CONTAINER_MultiPeerMap *GSA_addresses; /** * Initialize address subsystem. The addresses subsystem manages the addresses * known and current performance information. - * - * @param server handle to our server */ void -GAS_addresses_init (struct GNUNET_SERVER_Handle *server); +GAS_addresses_init (void); /** @@ -475,14 +474,12 @@ GAS_addresses_get_peer_info (const struct GNUNET_PeerIdentity *peer, /** * Handle 'address list request' messages from clients. * - * @param cls unused, NULL * @param client client that sent the request - * @param message the request message + * @param alrm the request message */ void -GAS_handle_request_address_list (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message); +GAS_handle_request_address_list (struct GNUNET_SERVICE_Client *client, + const struct AddressListRequestMessage *alrm); #endif diff --git a/src/ats/gnunet-service-ats_connectivity.c b/src/ats/gnunet-service-ats_connectivity.c index 2cf434c70b..c47ee03e66 100644 --- a/src/ats/gnunet-service-ats_connectivity.c +++ b/src/ats/gnunet-service-ats_connectivity.c @@ -40,7 +40,7 @@ struct ConnectionRequest /** * Client that made the request. */ - struct GNUNET_SERVER_Client *client; + struct GNUNET_SERVICE_Client *client; /* TODO: allow client to express a 'strength' for this request */ }; @@ -75,17 +75,13 @@ GAS_connectivity_has_peer (void *cls, /** * Handle #GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS messages from clients. * - * @param cls unused, NULL * @param client client that sent the request * @param message the request message */ void -GAS_handle_request_address (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) +GAS_handle_request_address (struct GNUNET_SERVICE_Client *client, + const struct RequestAddressMessage *msg) { - const struct RequestAddressMessage *msg = - (const struct RequestAddressMessage *) message; struct ConnectionRequest *cr; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -99,7 +95,6 @@ GAS_handle_request_address (void *cls, cr, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); GAS_plugin_request_connect_start (&msg->peer); - GNUNET_SERVER_receive_done (client, GNUNET_OK); } @@ -117,7 +112,7 @@ free_matching_requests (void *cls, const struct GNUNET_PeerIdentity *pid, void *value) { - struct GNUNET_SERVER_Client *client = cls; + struct GNUNET_SERVICE_Client *client = cls; struct ConnectionRequest *cr = value; if (cr->client == client) @@ -140,18 +135,13 @@ free_matching_requests (void *cls, * Handle #GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS_CANCEL messages * from clients. * - * @param cls unused, NULL - * @param client client that sent the request - * @param message the request message + * @param client the client that sent the request + * @param msg the request message */ void -GAS_handle_request_address_cancel (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) +GAS_handle_request_address_cancel (struct GNUNET_SERVICE_Client *client, + const struct RequestAddressMessage *msg) { - const struct RequestAddressMessage *msg = - (const struct RequestAddressMessage *) message; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received GNUNET_MESSAGE_TYPE_ATS_REQUEST_ADDRESS_CANCEL message for peer %s\n", GNUNET_i2s (&msg->peer)); @@ -160,7 +150,6 @@ GAS_handle_request_address_cancel (void *cls, &msg->peer, &free_matching_requests, client); - GNUNET_SERVER_receive_done (client, GNUNET_OK); } @@ -171,7 +160,7 @@ GAS_handle_request_address_cancel (void *cls, * @param client handle of the (now dead) client */ void -GAS_connectivity_remove_client (struct GNUNET_SERVER_Client *client) +GAS_connectivity_remove_client (struct GNUNET_SERVICE_Client *client) { GNUNET_CONTAINER_multipeermap_iterate (connection_requests, &free_matching_requests, @@ -185,7 +174,9 @@ GAS_connectivity_remove_client (struct GNUNET_SERVER_Client *client) void GAS_connectivity_init () { - connection_requests = GNUNET_CONTAINER_multipeermap_create (32, GNUNET_NO); + connection_requests + = GNUNET_CONTAINER_multipeermap_create (32, + GNUNET_NO); } diff --git a/src/ats/gnunet-service-ats_connectivity.h b/src/ats/gnunet-service-ats_connectivity.h index f10f9de0e9..b8f194b364 100644 --- a/src/ats/gnunet-service-ats_connectivity.h +++ b/src/ats/gnunet-service-ats_connectivity.h @@ -26,6 +26,8 @@ #ifndef GNUNET_SERVICE_ATS_CONNECTIVITY_H #define GNUNET_SERVICE_ATS_CONNECTIVITY_H +#include "ats.h" + /** * Is the given peer in the list of peers for which we @@ -43,27 +45,23 @@ GAS_connectivity_has_peer (void *cls, /** * Handle 'request address' messages from clients. * - * @param cls unused, NULL * @param client client that sent the request - * @param message the request message + * @param msg the request message */ void -GAS_handle_request_address (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message); +GAS_handle_request_address (struct GNUNET_SERVICE_Client *client, + const struct RequestAddressMessage *msg); /** * Cancel 'request address' messages from clients. * - * @param cls unused, NULL * @param client client that sent the request - * @param message the request message + * @param msg the request message */ void -GAS_handle_request_address_cancel (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message); +GAS_handle_request_address_cancel (struct GNUNET_SERVICE_Client *client, + const struct RequestAddressMessage *msg); /** @@ -73,7 +71,7 @@ GAS_handle_request_address_cancel (void *cls, * @param client handle of the (now dead) client */ void -GAS_connectivity_remove_client (struct GNUNET_SERVER_Client *client); +GAS_connectivity_remove_client (struct GNUNET_SERVICE_Client *client); /** diff --git a/src/ats/gnunet-service-ats_feedback.c b/src/ats/gnunet-service-ats_feedback.c deleted file mode 100644 index deb8e3d5d4..0000000000 --- a/src/ats/gnunet-service-ats_feedback.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) 2011-2015 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 - 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., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ -/** - * @file ats/gnunet-service-ats_feedback.c - * @brief ats service, handling of feedback - * @author Matthias Wachs - * @author Christian Grothoff - */ -#include "platform.h" -#include "gnunet-service-ats_plugins.h" -#include "gnunet-service-ats_feedback.h" -#include "ats.h" - - -/** - * Change the preference for a peer - * - * @param application the client sending this request - * @param peer the peer id - * @param scope the time interval for this feedback: [now - scope .. now] - * @param kind the preference kind to change - * @param score_abs the new preference score - */ -static void -preference_feedback (struct GNUNET_SERVER_Client *application, - const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_TIME_Relative scope, - enum GNUNET_ATS_PreferenceKind kind, - float score_abs) -{ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received PREFERENCE FEEDBACK for peer `%s'\n", - GNUNET_i2s (peer)); - GAS_plugin_notify_feedback (application, - peer, - scope, - kind, - score_abs); -} - - -/** - * Handle 'preference feedback' messages from clients. - * - * @param cls unused, NULL - * @param client client that sent the request - * @param message the request message - */ -void -GAS_handle_feedback (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) -{ - const struct FeedbackPreferenceMessage *msg; - const struct PreferenceInformation *pi; - uint16_t msize; - uint32_t nump; - uint32_t i; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received PREFERENCE_FEEDBACK message\n"); - msize = ntohs (message->size); - if (msize < sizeof (struct FeedbackPreferenceMessage)) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; - } - msg = (const struct FeedbackPreferenceMessage *) message; - nump = ntohl (msg->num_feedback); - if (msize != - sizeof (struct FeedbackPreferenceMessage) + - nump * sizeof (struct PreferenceInformation)) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; - } - if (GNUNET_NO == - GNUNET_CONTAINER_multipeermap_contains (GSA_addresses, - &msg->peer)) - { - GNUNET_log(GNUNET_ERROR_TYPE_WARNING, - "Received PREFERENCE FEEDBACK for unknown peer `%s'\n", - GNUNET_i2s (&msg->peer)); - return; - } - - GNUNET_STATISTICS_update (GSA_stats, - "# preference feedbacks requests processed", - 1, - GNUNET_NO); - pi = (const struct PreferenceInformation *) &msg[1]; - for (i = 0; i < nump; i++) - preference_feedback (client, - &msg->peer, - GNUNET_TIME_relative_ntoh(msg->scope), - (enum GNUNET_ATS_PreferenceKind) ntohl (pi[i].preference_kind), - pi[i].preference_value); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); -} - -/* end of gnunet-service-ats_feedback.c */ diff --git a/src/ats/gnunet-service-ats_feedback.h b/src/ats/gnunet-service-ats_feedback.h deleted file mode 100644 index 0ecb5d9b41..0000000000 --- a/src/ats/gnunet-service-ats_feedback.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - This file is part of GNUnet. - Copyright (C) 2011-2014 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 - 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., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. - */ -/** - * @file ats/gnunet-service-ats_feedback.h - * @brief handle client feedback - * @author Matthias Wachs - * @author Christian Grothoff - */ -#ifndef GNUNET_SERVICE_ATS_FEEDBACK_H -#define GNUNET_SERVICE_ATS_FEEDBACK_H - -#include "gnunet_util_lib.h" - -/** - * Handle 'preference feedback' messages from clients. - * - * @param cls unused, NULL - * @param client client that sent the request - * @param message the request message - */ -void -GAS_handle_feedback (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message); - -#endif diff --git a/src/ats/gnunet-service-ats_performance.c b/src/ats/gnunet-service-ats_performance.c index 8702716f9f..5252a71bc1 100644 --- a/src/ats/gnunet-service-ats_performance.c +++ b/src/ats/gnunet-service-ats_performance.c @@ -36,12 +36,12 @@ /** * Context for sending messages to performance clients without PIC. */ -static struct GNUNET_SERVER_NotificationContext *nc_no_pic; +static struct GNUNET_NotificationContext *nc_no_pic; /** * Context for sending messages to performance clients with PIC. */ -static struct GNUNET_SERVER_NotificationContext *nc_pic; +static struct GNUNET_NotificationContext *nc_pic; /** @@ -63,7 +63,7 @@ static struct GNUNET_SERVER_NotificationContext *nc_pic; * @param bandwidth_in assigned inbound bandwidth */ static void -notify_client (struct GNUNET_SERVER_Client *client, +notify_client (struct GNUNET_SERVICE_Client *client, const struct GNUNET_PeerIdentity *peer, const char *plugin_name, const void *plugin_addr, @@ -81,8 +81,6 @@ notify_client (struct GNUNET_SERVER_Client *client, plugin_addr_len + plugin_name_length; char buf[msize] GNUNET_ALIGN; - struct GNUNET_SERVER_NotificationContext **uc; - struct GNUNET_SERVER_NotificationContext *nc; char *addrp; if (NULL != prop) @@ -111,24 +109,17 @@ notify_client (struct GNUNET_SERVER_Client *client, strcpy (&addrp[plugin_addr_len], plugin_name); if (NULL == client) { - GNUNET_SERVER_notification_context_broadcast (nc_pic, - &msg->header, - GNUNET_YES); + GNUNET_notification_context_broadcast (nc_pic, + &msg->header, + GNUNET_YES); } else { - uc = GNUNET_SERVER_client_get_user_context (client, - struct GNUNET_SERVER_NotificationContext *); - if (NULL == uc) - { - GNUNET_break (0); - return; - } - nc = *uc; - GNUNET_SERVER_notification_context_unicast (nc, - client, - &msg->header, - GNUNET_YES); + struct GNUNET_MQ_Envelope *env; + + env = GNUNET_MQ_msg_copy (&msg->header); + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), + env); } } @@ -183,7 +174,7 @@ GAS_performance_notify_all_clients (const struct GNUNET_PeerIdentity *peer, /** * Iterator for called from #GAS_addresses_get_peer_info() * - * @param cls closure with the `struct GNUNET_SERVER_Client *` to inform. + * @param cls closure with the `struct GNUNET_SERVICE_Client *` to inform. * @param id the peer id * @param plugin_name plugin name * @param plugin_addr address @@ -206,7 +197,7 @@ peerinfo_it (void *cls, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) { - struct GNUNET_SERVER_Client *client = cls; + struct GNUNET_SERVICE_Client *client = cls; if (NULL == id) return; @@ -237,25 +228,24 @@ peerinfo_it (void *cls, * @param flag flag specifying the type of the client */ void -GAS_performance_add_client (struct GNUNET_SERVER_Client *client, +GAS_performance_add_client (struct GNUNET_SERVICE_Client *client, enum StartFlag flag) { + struct GNUNET_MQ_Handle *mq; + + mq = GNUNET_SERVICE_client_get_mq (client); if (START_FLAG_PERFORMANCE_WITH_PIC == flag) { - GNUNET_SERVER_notification_context_add (nc_pic, - client); - GNUNET_SERVER_client_set_user_context (client, - &nc_pic); + GNUNET_notification_context_add (nc_pic, + mq); GAS_addresses_get_peer_info (NULL, &peerinfo_it, client); } else { - GNUNET_SERVER_notification_context_add (nc_no_pic, - client); - GNUNET_SERVER_client_set_user_context (client, - &nc_no_pic); + GNUNET_notification_context_add (nc_no_pic, + mq); } } @@ -266,10 +256,10 @@ GAS_performance_add_client (struct GNUNET_SERVER_Client *client, * @param server handle to our server */ void -GAS_performance_init (struct GNUNET_SERVER_Handle *server) +GAS_performance_init () { - nc_no_pic = GNUNET_SERVER_notification_context_create (server, 32); - nc_pic = GNUNET_SERVER_notification_context_create (server, 32); + nc_no_pic = GNUNET_notification_context_create (32); + nc_pic = GNUNET_notification_context_create (32); } @@ -279,9 +269,9 @@ GAS_performance_init (struct GNUNET_SERVER_Handle *server) void GAS_performance_done () { - GNUNET_SERVER_notification_context_destroy (nc_no_pic); + GNUNET_notification_context_destroy (nc_no_pic); nc_no_pic = NULL; - GNUNET_SERVER_notification_context_destroy (nc_pic); + GNUNET_notification_context_destroy (nc_pic); nc_pic = NULL; } diff --git a/src/ats/gnunet-service-ats_performance.h b/src/ats/gnunet-service-ats_performance.h index bbaa8bc2b5..7958a84e51 100644 --- a/src/ats/gnunet-service-ats_performance.h +++ b/src/ats/gnunet-service-ats_performance.h @@ -68,7 +68,7 @@ GAS_performance_notify_all_clients (const struct GNUNET_PeerIdentity *peer, * @param flag flag specifying the type of the client */ void -GAS_performance_add_client (struct GNUNET_SERVER_Client *client, +GAS_performance_add_client (struct GNUNET_SERVICE_Client *client, enum StartFlag flag); @@ -79,7 +79,7 @@ GAS_performance_add_client (struct GNUNET_SERVER_Client *client, * @param addresses the address handle to use */ void -GAS_performance_init (struct GNUNET_SERVER_Handle *server); +GAS_performance_init (void); /** diff --git a/src/ats/gnunet-service-ats_plugins.c b/src/ats/gnunet-service-ats_plugins.c index c2388e28b6..f70c4cd9b8 100644 --- a/src/ats/gnunet-service-ats_plugins.c +++ b/src/ats/gnunet-service-ats_plugins.c @@ -510,7 +510,7 @@ GAS_plugin_delete_address (struct ATS_Address *address) * @param score_abs degree of the appreciation */ void -GAS_plugin_notify_feedback (struct GNUNET_SERVER_Client *application, +GAS_plugin_notify_feedback (struct GNUNET_SERVICE_Client *application, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_TIME_Relative scope, enum GNUNET_ATS_PreferenceKind kind, diff --git a/src/ats/gnunet-service-ats_plugins.h b/src/ats/gnunet-service-ats_plugins.h index 3f3261767e..8b12416c6f 100644 --- a/src/ats/gnunet-service-ats_plugins.h +++ b/src/ats/gnunet-service-ats_plugins.h @@ -105,7 +105,7 @@ GAS_plugin_delete_address (struct ATS_Address *address); * @param score_abs degree of the appreciation */ void -GAS_plugin_notify_feedback (struct GNUNET_SERVER_Client *application, +GAS_plugin_notify_feedback (struct GNUNET_SERVICE_Client *application, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_TIME_Relative scope, enum GNUNET_ATS_PreferenceKind kind, diff --git a/src/ats/gnunet-service-ats_preferences.c b/src/ats/gnunet-service-ats_preferences.c index 64779bbca4..9f11dc6a8d 100644 --- a/src/ats/gnunet-service-ats_preferences.c +++ b/src/ats/gnunet-service-ats_preferences.c @@ -132,7 +132,7 @@ struct PreferenceClient /** * Client handle */ - struct GNUNET_SERVER_Client *client; + struct GNUNET_SERVICE_Client *client; /** * Mapping peer identities to `struct PreferencePeer` entry @@ -553,7 +553,7 @@ update_iterator (void *cls, * @param score_abs the normalized score */ static void -update_preference (struct GNUNET_SERVER_Client *client, +update_preference (struct GNUNET_SERVICE_Client *client, const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind, float score_abs) @@ -646,41 +646,17 @@ update_preference (struct GNUNET_SERVER_Client *client, /** * Handle 'preference change' messages from clients. * - * @param cls unused, NULL - * @param client client that sent the request - * @param message the request message + * @param client the client that sent the request + * @param msg the request message */ void -GAS_handle_preference_change (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) +GAS_handle_preference_change (struct GNUNET_SERVICE_Client *client, + const struct ChangePreferenceMessage *msg) { - const struct ChangePreferenceMessage *msg; const struct PreferenceInformation *pi; - uint16_t msize; uint32_t nump; - uint32_t i; - msize = ntohs (message->size); - if (msize < sizeof (struct ChangePreferenceMessage)) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; - } - msg = (const struct ChangePreferenceMessage *) message; nump = ntohl (msg->num_preferences); - if ( (msize != - sizeof (struct ChangePreferenceMessage) + - nump * sizeof (struct PreferenceInformation)) || - (UINT16_MAX / sizeof (struct PreferenceInformation) < nump) ) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; - } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received PREFERENCE_CHANGE message for peer `%s'\n", GNUNET_i2s (&msg->peer)); @@ -690,14 +666,12 @@ GAS_handle_preference_change (void *cls, GNUNET_NO); pi = (const struct PreferenceInformation *) &msg[1]; GAS_plugin_solver_lock (); - for (i = 0; i < nump; i++) + for (uint32_t i = 0; i < nump; i++) update_preference (client, &msg->peer, (enum GNUNET_ATS_PreferenceKind) ntohl (pi[i].preference_kind), pi[i].preference_value); GAS_plugin_solver_unlock (); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); } @@ -782,7 +756,7 @@ GAS_preference_get_by_peer (void *cls, * @param client the client */ void -GAS_preference_client_disconnect (struct GNUNET_SERVER_Client *client) +GAS_preference_client_disconnect (struct GNUNET_SERVICE_Client *client) { struct PreferenceClient *c_cur; diff --git a/src/ats/gnunet-service-ats_preferences.h b/src/ats/gnunet-service-ats_preferences.h index 3a483d8164..fe01aa573b 100644 --- a/src/ats/gnunet-service-ats_preferences.h +++ b/src/ats/gnunet-service-ats_preferences.h @@ -46,14 +46,12 @@ /** * Handle 'preference change' messages from clients. * - * @param cls unused, NULL - * @param client client that sent the request - * @param message the request message + * @param client the client that sent the request + * @param msg the request message */ void -GAS_handle_preference_change (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message); +GAS_handle_preference_change (struct GNUNET_SERVICE_Client *client, + const struct ChangePreferenceMessage *msg); /** @@ -89,7 +87,7 @@ GAS_preference_get_by_peer (void *cls, * @param client the disconnecting client */ void -GAS_preference_client_disconnect (struct GNUNET_SERVER_Client *client); +GAS_preference_client_disconnect (struct GNUNET_SERVICE_Client *client); #endif diff --git a/src/ats/gnunet-service-ats_reservations.c b/src/ats/gnunet-service-ats_reservations.c index 97098c8192..95952e96fc 100644 --- a/src/ats/gnunet-service-ats_reservations.c +++ b/src/ats/gnunet-service-ats_reservations.c @@ -138,63 +138,43 @@ GAS_reservations_set_bandwidth (const struct GNUNET_PeerIdentity *peer, /** * Handle 'reservation request' messages from clients. * - * @param cls unused, NULL * @param client client that sent the request - * @param message the request message + * @param msg the request message */ void -GAS_handle_reservation_request (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) +GAS_handle_reservation_request (struct GNUNET_SERVICE_Client *client, + const struct ReservationRequestMessage *msg) { - const struct ReservationRequestMessage *msg = - (const struct ReservationRequestMessage *) message; - struct ReservationResultMessage result; + struct GNUNET_MQ_Envelope *env; + struct ReservationResultMessage *result; int32_t amount; struct GNUNET_TIME_Relative res_delay; - struct GNUNET_SERVER_NotificationContext **uc; - struct GNUNET_SERVER_NotificationContext *nc; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received RESERVATION_REQUEST message\n"); - uc = GNUNET_SERVER_client_get_user_context (client, - struct GNUNET_SERVER_NotificationContext *); - if (NULL == uc) - { - GNUNET_break (0); - return; - } - nc = *uc; amount = (int32_t) ntohl (msg->amount); res_delay = reservations_reserve (&msg->peer, amount); if (res_delay.rel_value_us > 0) amount = 0; - result.header.size = htons (sizeof (struct ReservationResultMessage)); - result.header.type = htons (GNUNET_MESSAGE_TYPE_ATS_RESERVATION_RESULT); - result.amount = htonl (amount); - result.peer = msg->peer; - result.res_delay = GNUNET_TIME_relative_hton (res_delay); + env = GNUNET_MQ_msg (result, + GNUNET_MESSAGE_TYPE_ATS_RESERVATION_RESULT); + result->amount = htonl (amount); + result->peer = msg->peer; + result->res_delay = GNUNET_TIME_relative_hton (res_delay); GNUNET_STATISTICS_update (GSA_stats, "# reservation requests processed", 1, GNUNET_NO); - - GNUNET_SERVER_notification_context_unicast (nc, - client, - &result.header, - GNUNET_NO); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (client), + env); } /** * Initialize reservations subsystem. - * - * @param server handle to our server */ void -GAS_reservations_init (struct GNUNET_SERVER_Handle *server) +GAS_reservations_init () { trackers = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_NO); @@ -211,7 +191,8 @@ GAS_reservations_init (struct GNUNET_SERVER_Handle *server) */ static int free_tracker (void *cls, - const struct GNUNET_PeerIdentity *key, void *value) + const struct GNUNET_PeerIdentity *key, + void *value) { struct GNUNET_BANDWIDTH_Tracker *tracker = value; diff --git a/src/ats/gnunet-service-ats_reservations.h b/src/ats/gnunet-service-ats_reservations.h index cc51e82a5b..ec28053b5a 100644 --- a/src/ats/gnunet-service-ats_reservations.h +++ b/src/ats/gnunet-service-ats_reservations.h @@ -27,6 +27,7 @@ #define GNUNET_SERVICE_ATS_RESERVATIONS_H #include "gnunet_util_lib.h" +#include "ats.h" /** @@ -46,14 +47,12 @@ GAS_reservations_set_bandwidth (const struct GNUNET_PeerIdentity *peer, /** * Handle 'reservation request' messages from clients. * - * @param cls unused, NULL * @param client client that sent the request * @param message the request message */ void -GAS_handle_reservation_request (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message); +GAS_handle_reservation_request (struct GNUNET_SERVICE_Client *client, + const struct ReservationRequestMessage *message); /** @@ -62,7 +61,7 @@ GAS_handle_reservation_request (void *cls, * @param server handle to our server */ void -GAS_reservations_init (struct GNUNET_SERVER_Handle *server); +GAS_reservations_init (void); /** diff --git a/src/ats/gnunet-service-ats_scheduling.c b/src/ats/gnunet-service-ats_scheduling.c index f19370f7a6..fd7eff8fbe 100644 --- a/src/ats/gnunet-service-ats_scheduling.c +++ b/src/ats/gnunet-service-ats_scheduling.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2011-2014 GNUnet e.V. + Copyright (C) 2011-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 @@ -29,16 +29,10 @@ #include "gnunet-service-ats_scheduling.h" #include "ats.h" - -/** - * Context for sending messages to clients. - */ -static struct GNUNET_SERVER_NotificationContext *nc; - /** * Actual handle to the client. */ -static struct GNUNET_SERVER_Client *my_client; +static struct GNUNET_SERVICE_Client *my_client; /** @@ -48,7 +42,7 @@ static struct GNUNET_SERVER_Client *my_client; * @return #GNUNET_OK on success, #GNUNET_SYSERR on error */ int -GAS_scheduling_add_client (struct GNUNET_SERVER_Client *client) +GAS_scheduling_add_client (struct GNUNET_SERVICE_Client *client) { if (NULL != my_client) { @@ -57,10 +51,6 @@ GAS_scheduling_add_client (struct GNUNET_SERVER_Client *client) return GNUNET_SYSERR; } my_client = client; - GNUNET_SERVER_notification_context_add (nc, - client); - GNUNET_SERVER_client_set_user_context (client, - &nc); return GNUNET_OK; } @@ -72,7 +62,7 @@ GAS_scheduling_add_client (struct GNUNET_SERVER_Client *client) * @param client handle of the (now dead) client */ void -GAS_scheduling_remove_client (struct GNUNET_SERVER_Client *client) +GAS_scheduling_remove_client (struct GNUNET_SERVICE_Client *client) { if (my_client != client) return; @@ -96,7 +86,8 @@ GAS_scheduling_transmit_address_suggestion (const struct GNUNET_PeerIdentity *pe struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) { - struct AddressSuggestionMessage msg; + struct GNUNET_MQ_Envelope *env; + struct AddressSuggestionMessage *msg; if (NULL == my_client) return; @@ -104,55 +95,39 @@ GAS_scheduling_transmit_address_suggestion (const struct GNUNET_PeerIdentity *pe "# address suggestions made", 1, GNUNET_NO); - msg.header.size = htons (sizeof (struct AddressSuggestionMessage)); - msg.header.type = htons (GNUNET_MESSAGE_TYPE_ATS_ADDRESS_SUGGESTION); - msg.peer = *peer; - msg.session_id = htonl (session_id); - msg.bandwidth_out = bandwidth_out; - msg.bandwidth_in = bandwidth_in; + env = GNUNET_MQ_msg (msg, + GNUNET_MESSAGE_TYPE_ATS_ADDRESS_SUGGESTION); + msg->peer = *peer; + msg->session_id = htonl (session_id); + msg->bandwidth_out = bandwidth_out; + msg->bandwidth_in = bandwidth_in; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "ATS sends quota for peer `%s': (in/out) %u/%u\n", GNUNET_i2s (peer), (unsigned int) ntohl (bandwidth_in.value__), (unsigned int) ntohl (bandwidth_out.value__)); - GNUNET_SERVER_notification_context_unicast (nc, - my_client, - &msg.header, - GNUNET_YES); + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (my_client), + env); } /** * Handle 'address add' messages from clients. * - * @param cls unused, NULL - * @param client client that sent the request - * @param message the request message + * @param m the request message */ void -GAS_handle_address_add (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) +GAS_handle_address_add (const struct AddressAddMessage *m) { - const struct AddressAddMessage *m; const char *address; const char *plugin_name; uint16_t address_length; uint16_t plugin_name_length; - uint16_t size; struct GNUNET_ATS_Properties prop; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", "ADDRESS_ADD"); - size = ntohs (message->size); - if (size < sizeof (struct AddressAddMessage)) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - m = (const struct AddressAddMessage *) message; address_length = ntohs (m->address_length); plugin_name_length = ntohs (m->plugin_name_length); address = (const char *) &m[1]; @@ -160,16 +135,6 @@ GAS_handle_address_add (void *cls, plugin_name = &address[address_length]; else plugin_name = ""; - - if ((address_length + plugin_name_length + - sizeof (struct AddressAddMessage) != ntohs (message->size)) || - ( (plugin_name_length > 0) && - (plugin_name[plugin_name_length - 1] != '\0') ) ) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } GNUNET_STATISTICS_update (GSA_stats, "# addresses created", 1, @@ -184,27 +149,19 @@ GAS_handle_address_add (void *cls, ntohl (m->address_local_info), ntohl (m->session_id), &prop); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); } /** * Handle 'address update' messages from clients. * - * @param cls unused, NULL - * @param client client that sent the request - * @param message the request message + * @param m the request message */ void -GAS_handle_address_update (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) +GAS_handle_address_update (const struct AddressUpdateMessage *m) { - const struct AddressUpdateMessage *m; struct GNUNET_ATS_Properties prop; - m = (const struct AddressUpdateMessage *) message; GNUNET_STATISTICS_update (GSA_stats, "# address updates received", 1, @@ -214,27 +171,20 @@ GAS_handle_address_update (void *cls, GAS_addresses_update (&m->peer, ntohl (m->session_id), &prop); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); } /** * Handle 'address destroyed' messages from clients. * - * @param cls unused, NULL - * @param client client that sent the request - * @param message the request message + * @param m the request message */ void -GAS_handle_address_destroyed (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) +GAS_handle_address_destroyed (const struct AddressDestroyedMessage *m) { - const struct AddressDestroyedMessage *m; - struct GNUNET_ATS_SessionReleaseMessage srm; + struct GNUNET_MQ_Envelope *env; + struct GNUNET_ATS_SessionReleaseMessage *srm; - m = (const struct AddressDestroyedMessage *) message; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", "ADDRESS_DESTROYED"); @@ -244,42 +194,12 @@ GAS_handle_address_destroyed (void *cls, GNUNET_NO); GAS_addresses_destroy (&m->peer, ntohl (m->session_id)); - srm.header.type = ntohs (GNUNET_MESSAGE_TYPE_ATS_SESSION_RELEASE); - srm.header.size = ntohs (sizeof (struct GNUNET_ATS_SessionReleaseMessage)); - srm.session_id = m->session_id; - srm.peer = m->peer; - GNUNET_SERVER_notification_context_unicast (nc, - client, - &srm.header, - GNUNET_NO); - GNUNET_SERVER_receive_done (client, GNUNET_OK); -} - - -/** - * Initialize scheduling subsystem. - * - * @param server handle to our server - */ -void -GAS_scheduling_init (struct GNUNET_SERVER_Handle *server) -{ - nc = GNUNET_SERVER_notification_context_create (server, 128); -} - - -/** - * Shutdown scheduling subsystem. - */ -void -GAS_scheduling_done () -{ - if (NULL != my_client) - { - my_client = NULL; - } - GNUNET_SERVER_notification_context_destroy (nc); - nc = NULL; + env = GNUNET_MQ_msg (srm, + GNUNET_MESSAGE_TYPE_ATS_SESSION_RELEASE); + srm->session_id = m->session_id; + srm->peer = m->peer; + GNUNET_MQ_send (GNUNET_SERVICE_client_get_mq (my_client), + env); } diff --git a/src/ats/gnunet-service-ats_scheduling.h b/src/ats/gnunet-service-ats_scheduling.h index 99dc6084bc..26cb2c73af 100644 --- a/src/ats/gnunet-service-ats_scheduling.h +++ b/src/ats/gnunet-service-ats_scheduling.h @@ -37,7 +37,7 @@ * @return #GNUNET_OK on success, #GNUNET_SYSERR on error */ int -GAS_scheduling_add_client (struct GNUNET_SERVER_Client *client); +GAS_scheduling_add_client (struct GNUNET_SERVICE_Client *client); /** @@ -47,7 +47,7 @@ GAS_scheduling_add_client (struct GNUNET_SERVER_Client *client); * @param client handle of the (now dead) client */ void -GAS_scheduling_remove_client (struct GNUNET_SERVER_Client *client); +GAS_scheduling_remove_client (struct GNUNET_SERVICE_Client *client); /** @@ -69,57 +69,29 @@ GAS_scheduling_transmit_address_suggestion (const struct GNUNET_PeerIdentity *pe /** * Handle 'address add' messages from clients. * - * @param cls unused, NULL * @param client client that sent the request - * @param message the request message + * @param m the request message */ void -GAS_handle_address_add (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message); +GAS_handle_address_add (const struct AddressAddMessage *m); /** * Handle 'address update' messages from clients. * - * @param cls unused, NULL - * @param client client that sent the request - * @param message the request message + * @param m the request message */ void -GAS_handle_address_update (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message); +GAS_handle_address_update (const struct AddressUpdateMessage *m); /** * Handle 'address destroyed' messages from clients. * - * @param cls unused, NULL - * @param client client that sent the request - * @param message the request message - */ -void -GAS_handle_address_destroyed (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message); - - -/** - * Initialize scheduling subsystem. - * - * @param server handle to our server - * @param ah the address handle to use - */ -void -GAS_scheduling_init (struct GNUNET_SERVER_Handle *server); - - -/** - * Shutdown scheduling subsystem. + * @param m the request message */ void -GAS_scheduling_done (void); +GAS_handle_address_destroyed (const struct AddressDestroyedMessage *m); #endif diff --git a/src/ats/plugin_ats_mlp.c b/src/ats/plugin_ats_mlp.c index e6a7903777..90f99cb5d6 100644 --- a/src/ats/plugin_ats_mlp.c +++ b/src/ats/plugin_ats_mlp.c @@ -2281,7 +2281,7 @@ GAS_mlp_address_change_preference (void *solver, */ static void GAS_mlp_address_preference_feedback (void *solver, - struct GNUNET_SERVER_Client *application, + struct GNUNET_SERVICE_Client *application, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_TIME_Relative scope, enum GNUNET_ATS_PreferenceKind kind, diff --git a/src/ats/plugin_ats_proportional.c b/src/ats/plugin_ats_proportional.c index 7d55fcad3d..9309bc2ea7 100644 --- a/src/ats/plugin_ats_proportional.c +++ b/src/ats/plugin_ats_proportional.c @@ -879,7 +879,7 @@ GAS_proportional_change_preference (void *solver, */ static void GAS_proportional_feedback (void *solver, - struct GNUNET_SERVER_Client *application, + struct GNUNET_SERVICE_Client *application, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_TIME_Relative scope, enum GNUNET_ATS_PreferenceKind kind, diff --git a/src/ats/plugin_ats_ril.c b/src/ats/plugin_ats_ril.c index eac62c4404..a3bdf200c5 100644 --- a/src/ats/plugin_ats_ril.c +++ b/src/ats/plugin_ats_ril.c @@ -2373,7 +2373,7 @@ GAS_ril_address_property_changed (void *solver, */ static void GAS_ril_address_preference_feedback (void *solver, - struct GNUNET_SERVER_Client *application, + struct GNUNET_SERVICE_Client *application, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_TIME_Relative scope, enum GNUNET_ATS_PreferenceKind kind, diff --git a/src/include/gnunet_ats_plugin.h b/src/include/gnunet_ats_plugin.h index 731e39d866..27f4a6f0f3 100644 --- a/src/include/gnunet_ats_plugin.h +++ b/src/include/gnunet_ats_plugin.h @@ -74,7 +74,7 @@ typedef void */ typedef void (*GAS_solver_address_feedback_preference) (void *solver, - struct GNUNET_SERVER_Client *application, + struct GNUNET_SERVICE_Client *application, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_TIME_Relative scope, enum GNUNET_ATS_PreferenceKind kind, diff --git a/src/namestore/gnunet-service-namestore.c b/src/namestore/gnunet-service-namestore.c index effb33e515..ae65802b05 100644 --- a/src/namestore/gnunet-service-namestore.c +++ b/src/namestore/gnunet-service-namestore.c @@ -61,7 +61,7 @@ struct ZoneIteration /** * Namestore client which intiated this zone iteration */ - struct NamestoreClient *client; + struct NamestoreClient *nc; /** * The nick to add to the records @@ -95,21 +95,17 @@ struct ZoneIteration */ struct NamestoreClient { - /** - * Next element in the DLL - */ - struct NamestoreClient *next; /** - * Previous element in the DLL + * The client */ - struct NamestoreClient *prev; + struct GNUNET_SERVICE_Client *client; /** - * The client + * Message queue for transmission to @e client */ - struct GNUNET_SERVER_Client *client; - + struct GNUNET_MQ_Handle *mq; + /** * Head of the DLL of * Zone iteration operations in progress initiated by this client @@ -152,7 +148,7 @@ struct ZoneMonitor /** * Task active during initial iteration. */ - struct GNUNET_SCHEDULER_Task * task; + struct GNUNET_SCHEDULER_Task *task; /** * Offset of the zone iteration used to address next result of the zone @@ -190,7 +186,7 @@ struct CacheOperation /** * Client to notify about the result. */ - struct GNUNET_SERVER_Client *client; + struct NamestoreClient *nc; /** * Client's request ID. @@ -225,21 +221,6 @@ static struct GNUNET_NAMESTORE_PluginFunctions *GSN_database; static char *db_lib_name; /** - * Our notification context. - */ -static struct GNUNET_SERVER_NotificationContext *snc; - -/** - * Head of the Client DLL - */ -static struct NamestoreClient *client_head; - -/** - * Tail of the Client DLL - */ -static struct NamestoreClient *client_tail; - -/** * Head of cop DLL. */ static struct CacheOperation *cop_head; @@ -262,8 +243,7 @@ static struct ZoneMonitor *monitor_tail; /** * Notification context shared by all monitors. */ -static struct GNUNET_SERVER_NotificationContext *monitor_nc; - +static struct GNUNET_NotificationContext *monitor_nc; /** @@ -274,17 +254,10 @@ static struct GNUNET_SERVER_NotificationContext *monitor_nc; static void cleanup_task (void *cls) { - struct ZoneIteration *no; - struct NamestoreClient *nc; struct CacheOperation *cop; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopping namestore service\n"); - if (NULL != snc) - { - GNUNET_SERVER_notification_context_destroy (snc); - snc = NULL; - } while (NULL != (cop = cop_head)) { GNUNET_NAMECACHE_cancel (cop->qe); @@ -295,23 +268,13 @@ cleanup_task (void *cls) } GNUNET_NAMECACHE_disconnect (namecache); namecache = NULL; - while (NULL != (nc = client_head)) - { - while (NULL != (no = nc->op_head)) - { - GNUNET_CONTAINER_DLL_remove (nc->op_head, nc->op_tail, no); - GNUNET_free (no); - } - GNUNET_CONTAINER_DLL_remove (client_head, client_tail, nc); - GNUNET_SERVER_client_set_user_context (nc->client, NULL); - GNUNET_free (nc); - } - GNUNET_break (NULL == GNUNET_PLUGIN_unload (db_lib_name, GSN_database)); + GNUNET_break (NULL == GNUNET_PLUGIN_unload (db_lib_name, + GSN_database)); GNUNET_free (db_lib_name); db_lib_name = NULL; if (NULL != monitor_nc) { - GNUNET_SERVER_notification_context_destroy (monitor_nc); + GNUNET_notification_context_destroy (monitor_nc); monitor_nc = NULL; } } @@ -323,26 +286,24 @@ cleanup_task (void *cls) * * @param cls closure * @param client identification of the client + * @param app_ctx the `struct NamestoreClient` of @a client */ static void -client_disconnect_notification (void *cls, - struct GNUNET_SERVER_Client *client) +client_disconnect_cb (void *cls, + struct GNUNET_SERVICE_Client *client, + void *app_ctx) { + struct NamestoreClient *nc = app_ctx; struct ZoneIteration *no; - struct NamestoreClient *nc; struct ZoneMonitor *zm; struct CacheOperation *cop; - if (NULL == client) - return; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client %p disconnected\n", client); - if (NULL == (nc = GNUNET_SERVER_client_get_user_context (client, struct NamestoreClient))) - return; for (zm = monitor_head; NULL != zm; zm = zm->next) { - if (client == zm->nc->client) + if (nc == zm->nc) { GNUNET_CONTAINER_DLL_remove (monitor_head, monitor_tail, @@ -358,40 +319,39 @@ client_disconnect_notification (void *cls, } while (NULL != (no = nc->op_head)) { - GNUNET_CONTAINER_DLL_remove (nc->op_head, nc->op_tail, no); + GNUNET_CONTAINER_DLL_remove (nc->op_head, + nc->op_tail, + no); GNUNET_free (no); } - GNUNET_CONTAINER_DLL_remove (client_head, client_tail, nc); - GNUNET_free (nc); for (cop = cop_head; NULL != cop; cop = cop->next) - if (client == cop->client) - cop->client = NULL; + if (nc == cop->nc) + cop->nc = NULL; + GNUNET_free (nc); } /** - * Add a client to our list of active clients, if it is not yet - * in there. + * Add a client to our list of active clients. * + * @param cls NULL * @param client client to add + * @param mq message queue for @a client * @return internal namestore client structure for this client */ -static struct NamestoreClient * -client_lookup (struct GNUNET_SERVER_Client *client) +static void * +client_connect_cb (void *cls, + struct GNUNET_SERVICE_Client *client, + struct GNUNET_MQ_Handle *mq) { struct NamestoreClient *nc; - nc = GNUNET_SERVER_client_get_user_context (client, struct NamestoreClient); - if (NULL != nc) - return nc; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client %p connected\n", client); nc = GNUNET_new (struct NamestoreClient); nc->client = client; - GNUNET_SERVER_notification_context_add (snc, client); - GNUNET_CONTAINER_DLL_insert (client_head, client_tail, nc); - GNUNET_SERVER_client_set_user_context (client, nc); + nc->mq = mq; return nc; } @@ -415,14 +375,13 @@ lookup_nick_it (void *cls, const struct GNUNET_GNSRECORD_Data *rd) { struct GNUNET_GNSRECORD_Data **res = cls; - int c; if (0 != strcmp (label, GNUNET_GNS_MASTERZONE_STR)) { GNUNET_break (0); return; } - for (c = 0; c < rd_count; c++) + for (unsigned int c = 0; c < rd_count; c++) { if (GNUNET_GNSRECORD_TYPE_NICK == rd[c].record_type) { @@ -537,8 +496,7 @@ merge_with_nick_records (const struct GNUNET_GNSRECORD_Data *nick_rd, * Generate a `struct LookupNameResponseMessage` and send it to the * given client using the given notification context. * - * @param nc notification context to use - * @param client client to unicast to + * @param nc client to unicast to * @param request_id request ID to use * @param zone_key zone key of the zone * @param name name @@ -546,21 +504,20 @@ merge_with_nick_records (const struct GNUNET_GNSRECORD_Data *nick_rd, * @param rd array of records */ static void -send_lookup_response (struct GNUNET_SERVER_NotificationContext *nc, - struct GNUNET_SERVER_Client *client, +send_lookup_response (struct NamestoreClient *nc, uint32_t request_id, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key, const char *name, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd) { + struct GNUNET_MQ_Envelope *env; struct RecordResultMessage *zir_msg; struct GNUNET_GNSRECORD_Data *nick; struct GNUNET_GNSRECORD_Data *res; unsigned int res_count; size_t name_len; size_t rd_ser_len; - size_t msg_size; char *name_tmp; char *rd_ser; @@ -583,31 +540,30 @@ send_lookup_response (struct GNUNET_SERVER_NotificationContext *nc, name_len = strlen (name) + 1; rd_ser_len = GNUNET_GNSRECORD_records_get_size (res_count, res); - msg_size = sizeof (struct RecordResultMessage) + name_len + rd_ser_len; - (void) client_lookup (client); - zir_msg = GNUNET_malloc (msg_size); - zir_msg->gns_header.header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_RESULT); - zir_msg->gns_header.header.size = htons (msg_size); + env = GNUNET_MQ_msg_extra (zir_msg, + name_len + rd_ser_len, + GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_RESULT); zir_msg->gns_header.r_id = htonl (request_id); zir_msg->name_len = htons (name_len); zir_msg->rd_count = htons (res_count); zir_msg->rd_len = htons (rd_ser_len); zir_msg->private_key = *zone_key; name_tmp = (char *) &zir_msg[1]; - GNUNET_memcpy (name_tmp, name, name_len); + GNUNET_memcpy (name_tmp, + name, + name_len); rd_ser = &name_tmp[name_len]; - GNUNET_GNSRECORD_records_serialize (res_count, res, rd_ser_len, rd_ser); + GNUNET_GNSRECORD_records_serialize (res_count, + res, + rd_ser_len, + rd_ser); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending RECORD_RESULT message with %u records and size %zu\n", - res_count, - msg_size); - GNUNET_SERVER_notification_context_unicast (nc, - client, - &zir_msg->gns_header.header, - GNUNET_NO); + "Sending RECORD_RESULT message with %u records\n", + res_count); + GNUNET_MQ_send (nc->mq, + env); if (rd != res) GNUNET_free (res); - GNUNET_free (zir_msg); } @@ -619,22 +575,21 @@ send_lookup_response (struct GNUNET_SERVER_NotificationContext *nc, * @param rid client's request ID */ static void -send_store_response (struct GNUNET_SERVER_Client *client, +send_store_response (struct NamestoreClient *nc, int res, uint32_t rid) { - struct RecordStoreResponseMessage rcr_msg; + struct GNUNET_MQ_Envelope *env; + struct RecordStoreResponseMessage *rcr_msg; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending `%s' message\n", - "RECORD_STORE_RESPONSE"); - rcr_msg.gns_header.header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE_RESPONSE); - rcr_msg.gns_header.header.size = htons (sizeof (struct RecordStoreResponseMessage)); - rcr_msg.gns_header.r_id = htonl (rid); - rcr_msg.op_result = htonl (res); - GNUNET_SERVER_notification_context_unicast (snc, client, - &rcr_msg.gns_header.header, - GNUNET_NO); + "Sending RECORD_STORE_RESPONSE message\n"); + env = GNUNET_MQ_msg (rcr_msg, + GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE_RESPONSE); + rcr_msg->gns_header.r_id = htonl (rid); + rcr_msg->op_result = htonl (res); + GNUNET_MQ_send (nc->mq, + env); } @@ -662,8 +617,8 @@ finish_cache_operation (void *cls, GNUNET_CONTAINER_DLL_remove (cop_head, cop_tail, cop); - if (NULL != cop->client) - send_store_response (cop->client, + if (NULL != cop->nc) + send_store_response (cop->nc, success, cop->rid); GNUNET_free (cop); @@ -674,7 +629,7 @@ finish_cache_operation (void *cls, * We just touched the plaintext information about a name in our zone; * refresh the corresponding (encrypted) block in the namecache. * - * @param client client responsible for the request + * @param nc client responsible for the request, can be NULL * @param rid request ID of the client * @param zone_key private key of the zone * @param name label for the records @@ -682,7 +637,7 @@ finish_cache_operation (void *cls, * @param rd records stored under the given @a name */ static void -refresh_block (struct GNUNET_SERVER_Client *client, +refresh_block (struct NamestoreClient *nc, uint32_t rid, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key, const char *name, @@ -702,7 +657,10 @@ refresh_block (struct GNUNET_SERVER_Client *client, if (NULL != nick) { nick->flags = (nick->flags | GNUNET_GNSRECORD_RF_PRIVATE) ^ GNUNET_GNSRECORD_RF_PRIVATE; - merge_with_nick_records (nick, rd_count,rd, &res_count, &res); + merge_with_nick_records (nick, + rd_count,rd, + &res_count, + &res); GNUNET_free (nick); } @@ -726,7 +684,7 @@ refresh_block (struct GNUNET_SERVER_Client *client, res_count, GNUNET_GNSRECORD_z2s (&pkey)); cop = GNUNET_new (struct CacheOperation); - cop->client = client; + cop->nc = nc; cop->rid = rid; GNUNET_CONTAINER_DLL_insert (cop_head, cop_tail, @@ -824,75 +782,70 @@ lookup_it (void *cls, /** * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP message * - * @param cls unused - * @param client client sending the message - * @param message message of type 'struct RecordCreateMessage' + * @param cls client sending the message + * @param ll_msg message of type `struct LabelLookupMessage` + * @return #GNUNET_OK if @a ll_msg is well-formed */ -static void -handle_record_lookup (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) +static int +check_record_lookup (void *cls, + const struct LabelLookupMessage *ll_msg) { - const struct LabelLookupMessage *ll_msg; - struct LabelLookupResponseMessage *llr_msg; - struct RecordLookupContext rlc; - const char *name_tmp; - char *res_name; - char *conv_name; uint32_t name_len; size_t src_size; - size_t res_size; - int res; - - if (ntohs (message->size) < sizeof (struct LabelLookupMessage)) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } + const char *name_tmp; - ll_msg = (const struct LabelLookupMessage *) message; name_len = ntohl (ll_msg->label_len); - src_size = ntohs (message->size); - - if (name_len != src_size - sizeof (struct LabelLookupMessage)) + src_size = ntohs (ll_msg->gns_header.header.size); + if (name_len != src_size - sizeof (struct LabelLookupMessage)) { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; + return GNUNET_SYSERR; } name_tmp = (const char *) &ll_msg[1]; if ('\0' != name_tmp[name_len -1]) { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; + return GNUNET_SYSERR; } + return GNUNET_OK; +} - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + +/** + * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP message + * + * @param cls client sending the message + * @param ll_msg message of type `struct LabelLookupMessage` + */ +static void +handle_record_lookup (void *cls, + const struct LabelLookupMessage *ll_msg) +{ + struct NamestoreClient *nc = cls; + struct GNUNET_MQ_Envelope *env; + struct LabelLookupResponseMessage *llr_msg; + struct RecordLookupContext rlc; + const char *name_tmp; + char *res_name; + char *conv_name; + uint32_t name_len; + int res; + + name_len = ntohl (ll_msg->label_len); + name_tmp = (const char *) &ll_msg[1]; + GNUNET_SERVICE_client_continue (nc->client); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received NAMESTORE_RECORD_LOOKUP message for name `%s'\n", name_tmp); - if (NULL == (client_lookup (client))) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; - } - conv_name = GNUNET_GNSRECORD_string_to_lowercase (name_tmp); if (NULL == conv_name) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Error converting name `%s'\n", name_tmp); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (nc->client); return; } rlc.label = conv_name; @@ -907,10 +860,9 @@ handle_record_lookup (void *cls, &lookup_it, &rlc); GNUNET_free (conv_name); - res_size = sizeof (struct LabelLookupResponseMessage) + name_len + rlc.rd_ser_len; - llr_msg = GNUNET_malloc (res_size); - llr_msg->gns_header.header.size = htons (res_size); - llr_msg->gns_header.header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP_RESPONSE); + env = GNUNET_MQ_msg_extra (llr_msg, + name_len + rlc.rd_ser_len, + GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP_RESPONSE); llr_msg->gns_header.r_id = ll_msg->gns_header.r_id; llr_msg->private_key = ll_msg->zone; llr_msg->name_len = htons (name_len); @@ -927,31 +879,65 @@ handle_record_lookup (void *cls, GNUNET_memcpy (&res_name[name_len], rlc.res_rd, rlc.rd_ser_len); - GNUNET_SERVER_notification_context_unicast (snc, - client, - &llr_msg->gns_header.header, - GNUNET_NO); + GNUNET_MQ_send (nc->mq, + env); GNUNET_free_non_null (rlc.res_rd); - GNUNET_free (llr_msg); +} + + +/** + * Checks a #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE message + * + * @param cls client sending the message + * @param rp_msg message of type `struct RecordStoreMessage` + * @return #GNUNET_OK if @a rp_msg is well-formed + */ +static int +check_record_store (void *cls, + const struct RecordStoreMessage *rp_msg) +{ + size_t name_len; + size_t msg_size; + size_t msg_size_exp; + size_t rd_ser_len; + const char *name_tmp; + + name_len = ntohs (rp_msg->name_len); + msg_size = ntohs (rp_msg->gns_header.header.size); + rd_ser_len = ntohs (rp_msg->rd_len); + msg_size_exp = sizeof (struct RecordStoreMessage) + name_len + rd_ser_len; + if (msg_size != msg_size_exp) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + if ((0 == name_len) || (name_len > MAX_NAME_LEN)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + name_tmp = (const char *) &rp_msg[1]; + if ('\0' != name_tmp[name_len -1]) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + return GNUNET_OK; } /** * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE message * - * @param cls unused - * @param client client sending the message - * @param message message of type 'struct RecordCreateMessage' + * @param cls client sending the message + * @param rp_msg message of type `struct RecordStoreMessage` */ static void handle_record_store (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) + const struct RecordStoreMessage *rp_msg) { - const struct RecordStoreMessage *rp_msg; + struct NamestoreClient *nc = cls; size_t name_len; - size_t msg_size; - size_t msg_size_exp; size_t rd_ser_len; uint32_t rid; const char *name_tmp; @@ -964,44 +950,13 @@ handle_record_store (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received NAMESTORE_RECORD_STORE message\n"); - if (ntohs (message->size) < sizeof (struct RecordStoreMessage)) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - rp_msg = (const struct RecordStoreMessage *) message; rid = ntohl (rp_msg->gns_header.r_id); name_len = ntohs (rp_msg->name_len); - msg_size = ntohs (message->size); rd_count = ntohs (rp_msg->rd_count); rd_ser_len = ntohs (rp_msg->rd_len); GNUNET_break (0 == ntohs (rp_msg->reserved)); - msg_size_exp = sizeof (struct RecordStoreMessage) + name_len + rd_ser_len; - if (msg_size != msg_size_exp) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; - } - if ((0 == name_len) || (name_len > MAX_NAME_LEN)) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; - } name_tmp = (const char *) &rp_msg[1]; rd_ser = &name_tmp[name_len]; - if ('\0' != name_tmp[name_len -1]) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); - return; - } - (void) client_lookup (client); { struct GNUNET_GNSRECORD_Data rd[rd_count]; @@ -1012,8 +967,7 @@ handle_record_store (void *cls, rd)) { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, - GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (nc->client); return; } @@ -1026,7 +980,7 @@ handle_record_store (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Error converting name `%s'\n", name_tmp); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (nc->client); return; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -1052,12 +1006,11 @@ handle_record_store (void *cls, else { struct GNUNET_GNSRECORD_Data rd_clean[rd_count]; - unsigned int i; unsigned int rd_clean_off; /* remove "NICK" records, unless this is for the "+" label */ rd_clean_off = 0; - for (i=0;i<rd_count;i++) + for (unsigned int i=0;i<rd_count;i++) { rd_clean[rd_clean_off] = rd[i]; if ( (0 == strcmp (GNUNET_GNS_MASTERZONE_STR, @@ -1083,8 +1036,7 @@ handle_record_store (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Notifying monitor about changes under label `%s'\n", conv_name); - send_lookup_response (monitor_nc, - zm->nc->client, + send_lookup_response (zm->nc, 0, &rp_msg->private_key, conv_name, @@ -1107,22 +1059,22 @@ handle_record_store (void *cls, } if (GNUNET_OK == res) { - refresh_block (client, rid, + refresh_block (nc, + rid, &rp_msg->private_key, conv_name, - rd_count, rd); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + rd_count, + rd); + GNUNET_SERVICE_client_continue (nc->client); GNUNET_free (conv_name); return; } GNUNET_free (conv_name); } - send_store_response (client, + send_store_response (nc, res, rid); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); + GNUNET_SERVICE_client_continue (nc->client); } @@ -1168,6 +1120,7 @@ handle_zone_to_name_it (void *cls, const struct GNUNET_GNSRECORD_Data *rd) { struct ZoneToNameCtx *ztn_ctx = cls; + struct GNUNET_MQ_Envelope *env; struct ZoneToNameResponseMessage *ztnr_msg; int16_t res; size_t name_len; @@ -1189,8 +1142,9 @@ handle_zone_to_name_it (void *cls, ztn_ctx->success = GNUNET_SYSERR; return; } - ztnr_msg = GNUNET_malloc (msg_size); - ztnr_msg->gns_header.header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME_RESPONSE); + env = GNUNET_MQ_msg_extra (ztnr_msg, + name_len + rd_ser_len, + GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME_RESPONSE); ztnr_msg->gns_header.header.size = htons (msg_size); ztnr_msg->gns_header.r_id = htonl (ztn_ctx->rid); ztnr_msg->res = htons (res); @@ -1199,40 +1153,38 @@ handle_zone_to_name_it (void *cls, ztnr_msg->name_len = htons (name_len); ztnr_msg->zone = *zone_key; name_tmp = (char *) &ztnr_msg[1]; - if (NULL != name) - GNUNET_memcpy (name_tmp, name, name_len); + GNUNET_memcpy (name_tmp, + name, + name_len); rd_tmp = &name_tmp[name_len]; - GNUNET_GNSRECORD_records_serialize (rd_count, rd, rd_ser_len, rd_tmp); + GNUNET_GNSRECORD_records_serialize (rd_count, + rd, + rd_ser_len, + rd_tmp); ztn_ctx->success = GNUNET_OK; - GNUNET_SERVER_notification_context_unicast (snc, ztn_ctx->nc->client, - &ztnr_msg->gns_header.header, - GNUNET_NO); - GNUNET_free (ztnr_msg); + GNUNET_MQ_send (ztn_ctx->nc->mq, + env); } /** * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME message * - * @param cls unused - * @param client client sending the message - * @param message message of type 'struct ZoneToNameMessage' + * @param cls client client sending the message + * @param ztn_msg message of type 'struct ZoneToNameMessage' */ static void handle_zone_to_name (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) + const struct ZoneToNameMessage *ztn_msg) { - struct NamestoreClient *nc; - const struct ZoneToNameMessage *ztn_msg; + struct NamestoreClient *nc = cls; struct ZoneToNameCtx ztn_ctx; - struct ZoneToNameResponseMessage ztnr_msg; + struct GNUNET_MQ_Envelope *env; + struct ZoneToNameResponseMessage *ztnr_msg; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", "ZONE_TO_NAME"); - ztn_msg = (const struct ZoneToNameMessage *) message; - nc = client_lookup (client); ztn_ctx.rid = ntohl (ztn_msg->gns_header.r_id); ztn_ctx.nc = nc; ztn_ctx.success = GNUNET_NO; @@ -1245,7 +1197,7 @@ handle_zone_to_name (void *cls, /* internal error, hang up instead of signalling something that might be wrong */ GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (nc->client); return; } if (GNUNET_NO == ztn_ctx.success) @@ -1253,17 +1205,14 @@ handle_zone_to_name (void *cls, /* no result found, send empty response */ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found no result for zone-to-name lookup.\n"); - memset (&ztnr_msg, 0, sizeof (ztnr_msg)); - ztnr_msg.gns_header.header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME_RESPONSE); - ztnr_msg.gns_header.header.size = htons (sizeof (ztnr_msg)); - ztnr_msg.gns_header.r_id = ztn_msg->gns_header.r_id; - ztnr_msg.res = htons (GNUNET_NO); - GNUNET_SERVER_notification_context_unicast (snc, - client, - &ztnr_msg.gns_header.header, - GNUNET_NO); + env = GNUNET_MQ_msg (ztnr_msg, + GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME_RESPONSE); + ztnr_msg->gns_header.r_id = ztn_msg->gns_header.r_id; + ztnr_msg->res = htons (GNUNET_NO); + GNUNET_MQ_send (nc->mq, + env); } - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_continue (nc->client); } @@ -1324,13 +1273,12 @@ struct ZoneIterationProcResult */ static void zone_iterate_proc (void *cls, - const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key, - const char *name, - unsigned int rd_count, - const struct GNUNET_GNSRECORD_Data *rd) + const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key, + const char *name, + unsigned int rd_count, + const struct GNUNET_GNSRECORD_Data *rd) { struct ZoneIterationProcResult *proc = cls; - unsigned int i; int do_refresh_block; if ((NULL == zone_key) && (NULL == name)) @@ -1348,22 +1296,22 @@ zone_iterate_proc (void *cls, return; } proc->res_iteration_finished = IT_SUCCESS_MORE_AVAILABLE; - send_lookup_response (snc, - proc->zi->client->client, + send_lookup_response (proc->zi->nc, proc->zi->request_id, zone_key, name, rd_count, rd); do_refresh_block = GNUNET_NO; - for (i=0;i<rd_count;i++) + for (unsigned int i=0;i<rd_count;i++) if (0 != (rd[i].flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION)) { do_refresh_block = GNUNET_YES; break; } if (GNUNET_YES == do_refresh_block) - refresh_block (NULL, 0, + refresh_block (NULL, + 0, zone_key, name, rd_count, @@ -1381,7 +1329,8 @@ static void run_zone_iteration_round (struct ZoneIteration *zi) { struct ZoneIterationProcResult proc; - struct RecordResultMessage rrm; + struct GNUNET_MQ_Envelope *env; + struct RecordResultMessage *rrm; int ret; memset (&proc, 0, sizeof (proc)); @@ -1411,16 +1360,13 @@ run_zone_iteration_round (struct ZoneIteration *zi) return; /* more results later */ } /* send empty response to indicate end of list */ - memset (&rrm, 0, sizeof (rrm)); - rrm.gns_header.header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_RESULT); - rrm.gns_header.header.size = htons (sizeof (rrm)); - rrm.gns_header.r_id = htonl (zi->request_id); - GNUNET_SERVER_notification_context_unicast (snc, - zi->client->client, - &rrm.gns_header.header, - GNUNET_NO); - GNUNET_CONTAINER_DLL_remove (zi->client->op_head, - zi->client->op_tail, + env = GNUNET_MQ_msg (rrm, + GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_RESULT); + rrm->gns_header.r_id = htonl (zi->request_id); + GNUNET_MQ_send (zi->nc->mq, + env); + GNUNET_CONTAINER_DLL_remove (zi->nc->op_head, + zi->nc->op_tail, zi); GNUNET_free (zi); } @@ -1429,67 +1375,49 @@ run_zone_iteration_round (struct ZoneIteration *zi) /** * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_START message * - * @param cls unused - * @param client the client sending the message - * @param message message of type 'struct ZoneIterationStartMessage' + * @param cls the client sending the message + * @param zis_msg message from the client */ static void handle_iteration_start (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) + const struct ZoneIterationStartMessage *zis_msg) { - const struct ZoneIterationStartMessage *zis_msg; - struct NamestoreClient *nc; + struct NamestoreClient *nc = cls; struct ZoneIteration *zi; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", "ZONE_ITERATION_START"); - if (NULL == (nc = client_lookup (client))) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - zis_msg = (const struct ZoneIterationStartMessage *) message; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Received ZONE_ITERATION_START message\n"); zi = GNUNET_new (struct ZoneIteration); zi->request_id = ntohl (zis_msg->gns_header.r_id); zi->offset = 0; - zi->client = nc; + zi->nc = nc; zi->zone = zis_msg->zone; - - GNUNET_CONTAINER_DLL_insert (nc->op_head, nc->op_tail, zi); + GNUNET_CONTAINER_DLL_insert (nc->op_head, + nc->op_tail, + zi); run_zone_iteration_round (zi); - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_continue (nc->client); } /** * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_STOP message * - * @param cls unused - * @param client GNUNET_SERVER_Client sending the message - * @param message message of type 'struct ZoneIterationStopMessage' + * @param cls the client sending the message + * @param zis_msg message from the client */ static void handle_iteration_stop (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) + const struct ZoneIterationStopMessage *zis_msg) { - struct NamestoreClient *nc; + struct NamestoreClient *nc = cls; struct ZoneIteration *zi; - const struct ZoneIterationStopMessage *zis_msg; uint32_t rid; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", "ZONE_ITERATION_STOP"); - if (NULL == (nc = client_lookup(client))) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - zis_msg = (const struct ZoneIterationStopMessage *) message; rid = ntohl (zis_msg->gns_header.r_id); for (zi = nc->op_head; NULL != zi; zi = zi->next) if (zi->request_id == rid) @@ -1497,42 +1425,33 @@ handle_iteration_stop (void *cls, if (NULL == zi) { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (nc->client); return; } - GNUNET_CONTAINER_DLL_remove (nc->op_head, nc->op_tail, zi); + GNUNET_CONTAINER_DLL_remove (nc->op_head, + nc->op_tail, + zi); GNUNET_free (zi); - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_continue (nc->client); } /** * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_NEXT message * - * @param cls unused - * @param client GNUNET_SERVER_Client sending the message - * @param message message of type 'struct ZoneIterationNextMessage' + * @param cls the client sending the message + * @param message message from the client */ static void handle_iteration_next (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) + const struct ZoneIterationNextMessage *zis_msg) { - struct NamestoreClient *nc; + struct NamestoreClient *nc = cls; struct ZoneIteration *zi; - const struct ZoneIterationNextMessage *zis_msg; uint32_t rid; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received `%s' message\n", - "ZONE_ITERATION_NEXT"); - if (NULL == (nc = client_lookup(client))) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - zis_msg = (const struct ZoneIterationNextMessage *) message; + "Received ZONE_ITERATION_NEXT message\n"); rid = ntohl (zis_msg->gns_header.r_id); for (zi = nc->op_head; NULL != zi; zi = zi->next) if (zi->request_id == rid) @@ -1540,11 +1459,11 @@ handle_iteration_next (void *cls, if (NULL == zi) { GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); + GNUNET_SERVICE_client_drop (nc->client); return; } run_zone_iteration_round (zi); - GNUNET_SERVER_receive_done (client, GNUNET_OK); + GNUNET_SERVICE_client_continue (nc->client); } @@ -1556,14 +1475,13 @@ handle_iteration_next (void *cls, static void monitor_sync (struct ZoneMonitor *zm) { - struct GNUNET_MessageHeader sync; - - sync.size = htons (sizeof (struct GNUNET_MessageHeader)); - sync.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_MONITOR_SYNC); - GNUNET_SERVER_notification_context_unicast (monitor_nc, - zm->nc->client, - &sync, - GNUNET_NO); + struct GNUNET_MQ_Envelope *env; + struct GNUNET_MessageHeader *sync; + + env = GNUNET_MQ_msg (sync, + GNUNET_MESSAGE_TYPE_NAMESTORE_MONITOR_SYNC); + GNUNET_MQ_send (zm->nc->mq, + env); } @@ -1600,47 +1518,45 @@ monitor_iterate_cb (void *cls, monitor_sync (zm); return; } - send_lookup_response (monitor_nc, - zm->nc->client, + send_lookup_response (zm->nc, 0, zone_key, name, rd_count, rd); - zm->task = GNUNET_SCHEDULER_add_now (&monitor_next, zm); + zm->task = GNUNET_SCHEDULER_add_now (&monitor_next, + zm); } /** * Handles a #GNUNET_MESSAGE_TYPE_NAMESTORE_MONITOR_START message * - * @param cls unused - * @param client the client sending the message - * @param message message of type 'struct ZoneMonitorStartMessage' + * @param cls the client sending the message + * @param message message from the client */ static void handle_monitor_start (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) + const struct ZoneMonitorStartMessage *zis_msg) { - const struct ZoneMonitorStartMessage *zis_msg; + struct NamestoreClient *nc = cls; struct ZoneMonitor *zm; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received `%s' message\n", - "ZONE_MONITOR_START"); - zis_msg = (const struct ZoneMonitorStartMessage *) message; + "Received ZONE_MONITOR_START message\n"); zm = GNUNET_new (struct ZoneMonitor); - zm->offset = 0; - zm->nc = client_lookup (client); + zm->nc = nc; zm->zone = zis_msg->zone; - GNUNET_CONTAINER_DLL_insert (monitor_head, monitor_tail, zm); - GNUNET_SERVER_client_mark_monitor (client); - GNUNET_SERVER_disable_receive_done_warning (client); - GNUNET_SERVER_notification_context_add (monitor_nc, - client); + GNUNET_CONTAINER_DLL_insert (monitor_head, + monitor_tail, + zm); + GNUNET_SERVICE_client_mark_monitor (nc->client); + GNUNET_SERVICE_client_disable_continue_warning (nc->client); + GNUNET_notification_context_add (monitor_nc, + nc->mq); if (GNUNET_YES == ntohl (zis_msg->iterate_first)) - zm->task = GNUNET_SCHEDULER_add_now (&monitor_next, zm); + zm->task = GNUNET_SCHEDULER_add_now (&monitor_next, + zm); else monitor_sync (zm); } @@ -1659,14 +1575,17 @@ monitor_next (void *cls) zm->task = NULL; ret = GSN_database->iterate_records (GSN_database->cls, - (0 == memcmp (&zm->zone, &zero, sizeof (zero))) + (0 == memcmp (&zm->zone, + &zero, + sizeof (zero))) ? NULL : &zm->zone, zm->offset++, - &monitor_iterate_cb, zm); + &monitor_iterate_cb, + zm); if (GNUNET_SYSERR == ret) { - GNUNET_SERVER_client_disconnect (zm->nc->client); + GNUNET_SERVICE_client_drop (zm->nc->client); return; } if (GNUNET_NO == ret) @@ -1682,35 +1601,20 @@ monitor_next (void *cls) * Process namestore requests. * * @param cls closure - * @param server the initialized server * @param cfg configuration to use + * @param service the initialized service */ static void -run (void *cls, struct GNUNET_SERVER_Handle *server, - const struct GNUNET_CONFIGURATION_Handle *cfg) +run (void *cls, + const struct GNUNET_CONFIGURATION_Handle *cfg, + struct GNUNET_SERVICE_Handle *service) { - static const struct GNUNET_SERVER_MessageHandler handlers[] = { - {&handle_record_store, NULL, - GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE, 0}, - {&handle_record_lookup, NULL, - GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP, 0}, - {&handle_zone_to_name, NULL, - GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME, sizeof (struct ZoneToNameMessage) }, - {&handle_iteration_start, NULL, - GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_START, sizeof (struct ZoneIterationStartMessage) }, - {&handle_iteration_next, NULL, - GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_NEXT, sizeof (struct ZoneIterationNextMessage) }, - {&handle_iteration_stop, NULL, - GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_STOP, sizeof (struct ZoneIterationStopMessage) }, - {&handle_monitor_start, NULL, - GNUNET_MESSAGE_TYPE_NAMESTORE_MONITOR_START, sizeof (struct ZoneMonitorStartMessage) }, - {NULL, NULL, 0, 0} - }; char *database; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting namestore service\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Starting namestore service\n"); GSN_cfg = cfg; - monitor_nc = GNUNET_SERVER_notification_context_create (server, 1); + monitor_nc = GNUNET_notification_context_create (1); namecache = GNUNET_NAMECACHE_connect (cfg); /* Loading database plugin */ if (GNUNET_OK != @@ -1727,39 +1631,58 @@ run (void *cls, struct GNUNET_SERVER_Handle *server, GSN_database = GNUNET_PLUGIN_load (db_lib_name, (void *) GSN_cfg); GNUNET_free (database); + GNUNET_SCHEDULER_add_shutdown (&cleanup_task, + NULL); if (NULL == GSN_database) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Could not load database backend `%s'\n", db_lib_name); - GNUNET_SCHEDULER_add_now (&cleanup_task, NULL); + GNUNET_SCHEDULER_shutdown (); return; } - - /* Configuring server handles */ - GNUNET_SERVER_add_handlers (server, handlers); - snc = GNUNET_SERVER_notification_context_create (server, 16); - GNUNET_SERVER_disconnect_notify (server, - &client_disconnect_notification, - NULL); - GNUNET_SCHEDULER_add_shutdown (&cleanup_task, - NULL); } /** - * The main function for the template service. - * - * @param argc number of arguments from the command line - * @param argv command line arguments - * @return 0 ok, 1 on error + * Define "main" method using service macro. */ -int -main (int argc, char *const *argv) -{ - return (GNUNET_OK == - GNUNET_SERVICE_run (argc, argv, "namestore", - GNUNET_SERVICE_OPTION_NONE, &run, NULL)) ? 0 : 1; -} +GNUNET_SERVICE_MAIN +("namestore", + GNUNET_SERVICE_OPTION_NONE, + &run, + &client_connect_cb, + &client_disconnect_cb, + NULL, + GNUNET_MQ_hd_var_size (record_store, + GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE, + struct RecordStoreMessage, + NULL), + GNUNET_MQ_hd_var_size (record_lookup, + GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_LOOKUP, + struct LabelLookupMessage, + NULL), + GNUNET_MQ_hd_fixed_size (zone_to_name, + GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_TO_NAME, + struct ZoneToNameMessage, + NULL), + GNUNET_MQ_hd_fixed_size (iteration_start, + GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_START, + struct ZoneIterationStartMessage, + NULL), + GNUNET_MQ_hd_fixed_size (iteration_next, + GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_NEXT, + struct ZoneIterationNextMessage, + NULL), + GNUNET_MQ_hd_fixed_size (iteration_stop, + GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_STOP, + struct ZoneIterationStopMessage, + NULL), + GNUNET_MQ_hd_fixed_size (monitor_start, + GNUNET_MESSAGE_TYPE_NAMESTORE_MONITOR_START, + struct ZoneMonitorStartMessage, + NULL), + GNUNET_MQ_handler_end ()); + /* end of gnunet-service-namestore.c */ |