From b2a4dcbce4f56046fbdcd4b114ec7a3feb4793fd Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 5 Feb 2015 16:09:26 +0000 Subject: -cleaning up gnunet-service-ats_performance-* --- src/ats/gnunet-service-ats.c | 5 +- src/ats/gnunet-service-ats_addresses.c | 232 +++++++++++++++- src/ats/gnunet-service-ats_addresses.h | 18 +- src/ats/gnunet-service-ats_performance.c | 448 +++--------------------------- src/ats/gnunet-service-ats_performance.h | 70 +---- src/ats/gnunet-service-ats_preferences.h | 32 ++- src/ats/gnunet-service-ats_reservations.c | 67 ++++- src/ats/gnunet-service-ats_reservations.h | 17 +- 8 files changed, 404 insertions(+), 485 deletions(-) (limited to 'src') diff --git a/src/ats/gnunet-service-ats.c b/src/ats/gnunet-service-ats.c index b000ae99c..a93be5466 100644 --- a/src/ats/gnunet-service-ats.c +++ b/src/ats/gnunet-service-ats.c @@ -109,7 +109,6 @@ client_disconnect_handler (void *cls, if (NULL == client) return; GAS_scheduling_remove_client (client); - GAS_performance_remove_client (client); GAS_connectivity_remove_client (client); GAS_normalization_preference_client_disconnect (client); GAS_addresses_preference_client_disconnect (client); @@ -188,10 +187,10 @@ run (void *cls, }; GSA_server = server; GSA_stats = GNUNET_STATISTICS_create ("ats", cfg); - GAS_reservations_init (); + GAS_reservations_init (server); GAS_connectivity_init (); GAS_normalization_start (); - GAS_addresses_init (); + GAS_addresses_init (server); if (GNUNET_OK != GAS_plugins_init (cfg)) { diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c index d0028f9b0..e87bf487b 100644 --- a/src/ats/gnunet-service-ats_addresses.c +++ b/src/ats/gnunet-service-ats_addresses.c @@ -220,6 +220,11 @@ */ struct GNUNET_CONTAINER_MultiPeerMap *GSA_addresses; +/** + * Context for sending messages to performance clients without PIC. + */ +static struct GNUNET_SERVER_NotificationContext *nc; + /** * Update statistic on number of addresses. @@ -701,12 +706,15 @@ 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 () +GAS_addresses_init (struct GNUNET_SERVER_Handle *server) { GSA_addresses = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_NO); update_addresses_stat (); + nc = GNUNET_SERVER_notification_context_create (server, 32); } @@ -757,6 +765,8 @@ GAS_addresses_done () GAS_addresses_destroy_all (); GNUNET_CONTAINER_multipeermap_destroy (GSA_addresses); GSA_addresses = NULL; + GNUNET_SERVER_notification_context_destroy (nc); + nc = NULL; } @@ -850,4 +860,224 @@ GAS_addresses_get_peer_info (const struct GNUNET_PeerIdentity *peer, GNUNET_BANDWIDTH_ZERO); } + +/** + * Information we need for the callbacks to return a list of addresses + * back to the client. + */ +struct AddressIteration +{ + /** + * Actual handle to the client. + */ + struct GNUNET_SERVER_Client *client; + + /** + * Are we sending all addresses, or only those that are active? + */ + int all; + + /** + * Which ID should be included in the response? + */ + uint32_t id; + +}; + + +/** + * Send a #GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE with the + * given address details to the client identified in @a ai. + * + * @param ai our address information context (identifies the client) + * @param id the peer id this address is for + * @param plugin_name name of the plugin that supports this address + * @param plugin_addr address + * @param plugin_addr_len length of @a plugin_addr + * @param active #GNUNET_YES if this address is actively used + * @param atsi ats performance information + * @param atsi_count number of ats performance elements in @a atsi + * @param bandwidth_out current outbound bandwidth assigned to address + * @param bandwidth_in current inbound bandwidth assigned to address + */ +static void +transmit_req_addr (struct AddressIteration *ai, + const struct GNUNET_PeerIdentity *id, + const char *plugin_name, + const void *plugin_addr, + size_t plugin_addr_len, + int active, + const struct GNUNET_ATS_Information *atsi, + uint32_t atsi_count, + struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, + struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) + +{ + struct GNUNET_ATS_Information *atsp; + struct PeerInformationMessage *msg; + char *addrp; + size_t plugin_name_length; + size_t msize; + + if (NULL != plugin_name) + plugin_name_length = strlen (plugin_name) + 1; + else + plugin_name_length = 0; + msize = sizeof (struct PeerInformationMessage) + + atsi_count * sizeof (struct GNUNET_ATS_Information) + + plugin_addr_len + plugin_name_length; + char buf[msize] GNUNET_ALIGN; + + GNUNET_assert (msize < GNUNET_SERVER_MAX_MESSAGE_SIZE); + GNUNET_assert (atsi_count < + GNUNET_SERVER_MAX_MESSAGE_SIZE / + sizeof (struct GNUNET_ATS_Information)); + msg = (struct PeerInformationMessage *) buf; + msg->header.size = htons (msize); + msg->header.type = htons (GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE); + msg->ats_count = htonl (atsi_count); + 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); + msg->bandwidth_out = bandwidth_out; + msg->bandwidth_in = bandwidth_in; + atsp = (struct GNUNET_ATS_Information *) &msg[1]; + memcpy (atsp, atsi, sizeof (struct GNUNET_ATS_Information) * atsi_count); + addrp = (char *) &atsp[atsi_count]; + if (NULL != plugin_addr) + memcpy (addrp, plugin_addr, plugin_addr_len); + if (NULL != plugin_name) + strcpy (&addrp[plugin_addr_len], plugin_name); + GNUNET_SERVER_notification_context_unicast (nc, + ai->client, + &msg->header, + GNUNET_NO); +} + + +/** + * Iterator for #GAS_addresses_get_peer_info(), called with peer-specific + * information to be passed back to the client. + * + * @param cls closure with our `struct AddressIteration *` + * @param id the peer id + * @param plugin_name plugin name + * @param plugin_addr address + * @param plugin_addr_len length of @a plugin_addr + * @param active is address actively used + * @param atsi ats performance information + * @param atsi_count number of ats performance elements in @a atsi + * @param bandwidth_out current outbound bandwidth assigned to address + * @param bandwidth_in current inbound bandwidth assigned to address + */ +static void +req_addr_peerinfo_it (void *cls, + const struct GNUNET_PeerIdentity *id, + const char *plugin_name, + const void *plugin_addr, + size_t plugin_addr_len, + int active, + const struct GNUNET_ATS_Information *atsi, + uint32_t atsi_count, + struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, + struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) +{ + struct AddressIteration *ai = cls; + + if ( (NULL == id) && + (NULL == plugin_name) && + (NULL == plugin_addr) ) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Address iteration done for one peer\n"); + return; + } + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Callback for %s peer `%s' plugin `%s' BW out %u, BW in %u\n", + (active == GNUNET_YES) ? "ACTIVE" : "INACTIVE", + GNUNET_i2s (id), + plugin_name, + (unsigned int) ntohl (bandwidth_out.value__), + (unsigned int) ntohl (bandwidth_in.value__)); + /* Transmit result (either if address is active, or if + client wanted all addresses) */ + if ( (GNUNET_YES != ai->all) && + (GNUNET_YES != active)) + return; + transmit_req_addr (ai, + id, + plugin_name, + plugin_addr, plugin_addr_len, + active, + atsi, + atsi_count, + bandwidth_out, + bandwidth_in); +} + + +/** + * Handle 'address list request' messages from clients. + * + * @param cls unused, NULL + * @param client client that sent the request + * @param message the request message + */ +void +GAS_handle_request_address_list (void *cls, + struct GNUNET_SERVER_Client *client, + const struct GNUNET_MessageHeader *message) +{ + struct AddressIteration ai; + const struct AddressListRequestMessage *alrm; + struct GNUNET_PeerIdentity allzeros; + + GNUNET_SERVER_notification_context_add (nc, + client); + 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; + + memset (&allzeros, + '\0', + sizeof (struct GNUNET_PeerIdentity)); + if (0 == memcmp (&alrm->peer, + &allzeros, + sizeof (struct GNUNET_PeerIdentity))) + { + /* Return addresses for all peers */ + GAS_addresses_get_peer_info (NULL, + &req_addr_peerinfo_it, + &ai); + } + else + { + /* Return addresses for a specific peer */ + GAS_addresses_get_peer_info (&alrm->peer, + &req_addr_peerinfo_it, + &ai); + } + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Finished handling `%s' message\n", + "ADDRESSLIST_REQUEST"); + transmit_req_addr (&ai, + NULL, NULL, NULL, + 0, GNUNET_NO, + NULL, 0, + GNUNET_BANDWIDTH_ZERO, + GNUNET_BANDWIDTH_ZERO); + GNUNET_SERVER_receive_done (client, + GNUNET_OK); +} + + + /* end of gnunet-service-ats_addresses.c */ diff --git a/src/ats/gnunet-service-ats_addresses.h b/src/ats/gnunet-service-ats_addresses.h index 9895f0244..31d3ac8ac 100644 --- a/src/ats/gnunet-service-ats_addresses.h +++ b/src/ats/gnunet-service-ats_addresses.h @@ -359,9 +359,11 @@ 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 (void); +GAS_addresses_init (struct GNUNET_SERVER_Handle *server); /** @@ -466,6 +468,20 @@ GAS_addresses_get_peer_info (const struct GNUNET_PeerIdentity *peer, GNUNET_ATS_PeerInfo_Iterator pi_it, void *pi_it_cls); + +/** + * Handle 'address list request' messages from clients. + * + * @param cls unused, NULL + * @param client client that sent the request + * @param message the request message + */ +void +GAS_handle_request_address_list (void *cls, + struct GNUNET_SERVER_Client *client, + const struct GNUNET_MessageHeader *message); + + #endif /* end of gnunet-service-ats_addresses.h */ diff --git a/src/ats/gnunet-service-ats_performance.c b/src/ats/gnunet-service-ats_performance.c index c49821227..3f064308a 100644 --- a/src/ats/gnunet-service-ats_performance.c +++ b/src/ats/gnunet-service-ats_performance.c @@ -17,7 +17,6 @@ Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - /** * @file ats/gnunet-service-ats_performance.c * @brief ats service, interaction with 'performance' API @@ -31,92 +30,23 @@ #include "gnunet-service-ats_reservations.h" #include "ats.h" -/** - * We keep clients that are interested in performance in a linked list. - */ -struct PerformanceClient -{ - /** - * Next in doubly-linked list. - */ - struct PerformanceClient *next; - - /** - * Previous in doubly-linked list. - */ - struct PerformanceClient *prev; - - /** - * Actual handle to the client. - */ - struct GNUNET_SERVER_Client *client; - - /** - * Options for the client. - */ - enum StartFlag flag; - -}; - /** - * Head of linked list of all clients to this service. - */ -static struct PerformanceClient *pc_head; - -/** - * Tail of linked list of all clients to this service. - */ -static struct PerformanceClient *pc_tail; - - -/** - * Context for sending messages to performance clients. + * Context for sending messages to performance clients without PIC. */ static struct GNUNET_SERVER_NotificationContext *nc; - /** - * Find the performance client associated with the given handle. - * - * @param client server handle - * @return internal handle + * Context for sending messages to performance clients with PIC. */ -static struct PerformanceClient * -find_client (struct GNUNET_SERVER_Client *client) -{ - struct PerformanceClient *pc; - - for (pc = pc_head; pc != NULL; pc = pc->next) - if (pc->client == client) - return pc; - return NULL; -} - -/** - * Unregister a client (which may have been a performance client, - * but this is not assured). - * - * @param client handle of the (now dead) client - */ -void -GAS_performance_remove_client (struct GNUNET_SERVER_Client *client) -{ - struct PerformanceClient *pc; - - pc = find_client (client); - if (NULL == pc) - return; - GNUNET_CONTAINER_DLL_remove (pc_head, pc_tail, pc); - GNUNET_free (pc); -} +static struct GNUNET_SERVER_NotificationContext *nc_pic; /** * Transmit the given performance information to all performance * clients. * - * @param pc performance client to send to + * @param pc client to send to, NULL for all * @param peer peer for which this is an address suggestion * @param plugin_name 0-termintated string specifying the transport plugin * @param plugin_addr binary address for the plugin to use @@ -131,7 +61,7 @@ GAS_performance_remove_client (struct GNUNET_SERVER_Client *client) * @param bandwidth_in assigned inbound bandwidth */ void -GAS_performance_notify_client (struct PerformanceClient *pc, +GAS_performance_notify_client (struct GNUNET_SERVER_Client *client, const struct GNUNET_PeerIdentity *peer, const char *plugin_name, const void *plugin_addr, @@ -142,7 +72,6 @@ GAS_performance_notify_client (struct PerformanceClient *pc, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) { - struct PeerInformationMessage *msg; size_t plugin_name_length = strlen (plugin_name) + 1; size_t msize = @@ -153,10 +82,6 @@ GAS_performance_notify_client (struct PerformanceClient *pc, struct GNUNET_ATS_Information *atsp; char *addrp; - GNUNET_assert (NULL != pc); - if (NULL == find_client (pc->client)) - return; /* Client disconnected */ - GNUNET_assert (msize < GNUNET_SERVER_MAX_MESSAGE_SIZE); GNUNET_assert (atsi_count < GNUNET_SERVER_MAX_MESSAGE_SIZE / @@ -177,10 +102,19 @@ GAS_performance_notify_client (struct PerformanceClient *pc, addrp = (char *) &atsp[atsi_count]; memcpy (addrp, plugin_addr, plugin_addr_len); strcpy (&addrp[plugin_addr_len], plugin_name); - GNUNET_SERVER_notification_context_unicast (nc, - pc->client, - &msg->header, - GNUNET_YES); + if (NULL == client) + { + GNUNET_SERVER_notification_context_broadcast (nc_pic, + &msg->header, + GNUNET_YES); + } + else + { + GNUNET_SERVER_notification_context_unicast (nc, + client, + &msg->header, + GNUNET_YES); + } } @@ -212,31 +146,26 @@ GAS_performance_notify_all_clients (const struct GNUNET_PeerIdentity *peer, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) { - struct PerformanceClient *pc; - - for (pc = pc_head; pc != NULL; pc = pc->next) - if (pc->flag == START_FLAG_PERFORMANCE_WITH_PIC) - { - GAS_performance_notify_client (pc, - peer, - plugin_name, - plugin_addr, - plugin_addr_len, - active, - atsi, atsi_count, - bandwidth_out, bandwidth_in); - } + GAS_performance_notify_client (NULL, + peer, + plugin_name, + plugin_addr, + plugin_addr_len, + active, + atsi, atsi_count, + bandwidth_out, + bandwidth_in); GNUNET_STATISTICS_update (GSA_stats, - "# performance updates given to clients", 1, + "# performance updates given to clients", + 1, GNUNET_NO); } - /** * Iterator for called from #GAS_addresses_get_peer_info() * - * @param cls closure with the `struct PerformanceClient *` + * @param cls closure with the `struct GNUNET_SERVER_Client *` to inform. * @param id the peer id * @param plugin_name plugin name * @param plugin_addr address @@ -259,9 +188,8 @@ peerinfo_it (void *cls, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) { - struct PerformanceClient *pc = cls; + struct GNUNET_SERVER_Client *client = cls; - GNUNET_assert (NULL != pc); if (NULL == id) return; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -270,7 +198,7 @@ peerinfo_it (void *cls, plugin_name, (unsigned int) ntohl (bandwidth_out.value__), (unsigned int) ntohl (bandwidth_in.value__)); - GAS_performance_notify_client (pc, + GAS_performance_notify_client (client, id, plugin_name, plugin_addr, @@ -292,318 +220,32 @@ void GAS_performance_add_client (struct GNUNET_SERVER_Client *client, enum StartFlag flag) { - struct PerformanceClient *pc; - - GNUNET_break (NULL == find_client (client)); - pc = GNUNET_new (struct PerformanceClient); - pc->client = client; - pc->flag = flag; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Adding performance client %s PIC\n", - (flag == START_FLAG_PERFORMANCE_WITH_PIC) ? "with" : "without"); - - GNUNET_SERVER_notification_context_add (nc, - client); - GNUNET_CONTAINER_DLL_insert (pc_head, - pc_tail, - pc); - GAS_addresses_get_peer_info (NULL, - &peerinfo_it, - pc); -} - - -/** - * Information we need for the callbacks to return a list of addresses - * back to the client. - */ -struct AddressIteration -{ - /** - * Actual handle to the client. - */ - struct PerformanceClient *pc; - - /** - * Are we sending all addresses, or only those that are active? - */ - int all; - - /** - * Which ID should be included in the response? - */ - uint32_t id; - -}; - - -/** - * Send a #GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE with the - * given address details to the client identified in @a ai. - * - * @param ai our address information context (identifies the client) - * @param id the peer id this address is for - * @param plugin_name name of the plugin that supports this address - * @param plugin_addr address - * @param plugin_addr_len length of @a plugin_addr - * @param active #GNUNET_YES if this address is actively used - * @param atsi ats performance information - * @param atsi_count number of ats performance elements in @a atsi - * @param bandwidth_out current outbound bandwidth assigned to address - * @param bandwidth_in current inbound bandwidth assigned to address - */ -static void -transmit_req_addr (struct AddressIteration *ai, - const struct GNUNET_PeerIdentity *id, - const char *plugin_name, - const void *plugin_addr, - size_t plugin_addr_len, - int active, - const struct GNUNET_ATS_Information *atsi, - uint32_t atsi_count, - struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, - struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) - -{ - struct GNUNET_ATS_Information *atsp; - struct PeerInformationMessage *msg; - char *addrp; - size_t plugin_name_length; - size_t msize; - - if (NULL != plugin_name) - plugin_name_length = strlen (plugin_name) + 1; - else - plugin_name_length = 0; - msize = sizeof (struct PeerInformationMessage) + - atsi_count * sizeof (struct GNUNET_ATS_Information) + - plugin_addr_len + plugin_name_length; - char buf[msize] GNUNET_ALIGN; - - GNUNET_assert (msize < GNUNET_SERVER_MAX_MESSAGE_SIZE); - GNUNET_assert (atsi_count < - GNUNET_SERVER_MAX_MESSAGE_SIZE / - sizeof (struct GNUNET_ATS_Information)); - msg = (struct PeerInformationMessage *) buf; - msg->header.size = htons (msize); - msg->header.type = htons (GNUNET_MESSAGE_TYPE_ATS_ADDRESSLIST_RESPONSE); - msg->ats_count = htonl (atsi_count); - 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); - msg->bandwidth_out = bandwidth_out; - msg->bandwidth_in = bandwidth_in; - atsp = (struct GNUNET_ATS_Information *) &msg[1]; - memcpy (atsp, atsi, sizeof (struct GNUNET_ATS_Information) * atsi_count); - addrp = (char *) &atsp[atsi_count]; - if (NULL != plugin_addr) - memcpy (addrp, plugin_addr, plugin_addr_len); - if (NULL != plugin_name) - strcpy (&addrp[plugin_addr_len], plugin_name); - GNUNET_SERVER_notification_context_unicast (nc, - ai->pc->client, - &msg->header, - GNUNET_NO); -} - - -/** - * Iterator for #GAS_addresses_get_peer_info(), called with peer-specific - * information to be passed back to the client. - * - * @param cls closure with our `struct AddressIteration *` - * @param id the peer id - * @param plugin_name plugin name - * @param plugin_addr address - * @param plugin_addr_len length of @a plugin_addr - * @param active is address actively used - * @param atsi ats performance information - * @param atsi_count number of ats performance elements in @a atsi - * @param bandwidth_out current outbound bandwidth assigned to address - * @param bandwidth_in current inbound bandwidth assigned to address - */ -static void -req_addr_peerinfo_it (void *cls, - const struct GNUNET_PeerIdentity *id, - const char *plugin_name, - const void *plugin_addr, - size_t plugin_addr_len, - int active, - const struct GNUNET_ATS_Information *atsi, - uint32_t atsi_count, - struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, - struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) -{ - struct AddressIteration *ai = cls; - - if ( (NULL == id) && - (NULL == plugin_name) && - (NULL == plugin_addr) ) + if (START_FLAG_PERFORMANCE_WITH_PIC == flag) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Address iteration done for one peer\n"); - return; - } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Callback for %s peer `%s' plugin `%s' BW out %u, BW in %u\n", - (active == GNUNET_YES) ? "ACTIVE" : "INACTIVE", - GNUNET_i2s (id), - plugin_name, - (unsigned int) ntohl (bandwidth_out.value__), - (unsigned int) ntohl (bandwidth_in.value__)); - - /* Transmit result (either if address is active, or if - client wanted all addresses) */ - if ( (GNUNET_YES == ai->all) || - (GNUNET_YES == active)) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending result for %s peer `%s' plugin `%s' BW out %u, BW in %u\n", - (active == GNUNET_YES) ? "ACTIVE" : "INACTIVE", - GNUNET_i2s (id), - plugin_name, - (unsigned int) ntohl (bandwidth_out.value__), - (unsigned int) ntohl (bandwidth_in.value__)); - transmit_req_addr (ai, - id, - plugin_name, - plugin_addr, plugin_addr_len, - active, - atsi, - atsi_count, - bandwidth_out, - bandwidth_in); - } -} - - -/** - * Handle 'address list request' messages from clients. - * - * @param cls unused, NULL - * @param client client that sent the request - * @param message the request message - */ -void -GAS_handle_request_address_list (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message) -{ - struct PerformanceClient *pc; - struct AddressIteration ai; - const struct AddressListRequestMessage *alrm; - struct GNUNET_PeerIdentity allzeros; - struct GNUNET_BANDWIDTH_Value32NBO bandwidth_zero; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received `%s' message\n", - "ADDRESSLIST_REQUEST"); - if (NULL == (pc = find_client(client))) - { - GNUNET_break (0); - return; - } - alrm = (const struct AddressListRequestMessage *) message; - ai.all = ntohl (alrm->all); - ai.id = ntohl (alrm->id); - ai.pc = pc; - - memset (&allzeros, '\0', sizeof (struct GNUNET_PeerIdentity)); - bandwidth_zero.value__ = htonl (0); - if (0 == memcmp (&alrm->peer, - &allzeros, - sizeof (struct GNUNET_PeerIdentity))) - { - /* Return addresses for all peers */ - GAS_addresses_get_peer_info (NULL, - &req_addr_peerinfo_it, - &ai); + GNUNET_SERVER_notification_context_add (nc_pic, + client); + GNUNET_SERVER_notification_context_add (nc, + client); } else - { - /* Return addresses for a specific peer */ - GAS_addresses_get_peer_info (&alrm->peer, - &req_addr_peerinfo_it, - &ai); - } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Finished handling `%s' message\n", - "ADDRESSLIST_REQUEST"); - transmit_req_addr (&ai, - NULL, NULL, NULL, - 0, GNUNET_NO, - NULL, 0, - bandwidth_zero, - bandwidth_zero); - GNUNET_SERVER_receive_done (client, - GNUNET_OK); -} - - -/** - * 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) -{ - const struct ReservationRequestMessage *msg = - (const struct ReservationRequestMessage *) message; - struct ReservationResultMessage result; - int32_t amount; - struct GNUNET_TIME_Relative res_delay; - - if (NULL == find_client (client)) - { - /* missing start message! */ - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received `%s' message\n", - "RESERVATION_REQUEST"); - amount = (int32_t) ntohl (msg->amount); - res_delay = GAS_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); - 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_SERVER_notification_context_add (nc, + client); + GAS_addresses_get_peer_info (NULL, + &peerinfo_it, + client); } - - /** * Initialize performance subsystem. * * @param server handle to our server - * @param addresses the address handle to use */ void GAS_performance_init (struct GNUNET_SERVER_Handle *server) { - nc = GNUNET_SERVER_notification_context_create (server, 128); + nc = GNUNET_SERVER_notification_context_create (server, 32); + nc_pic = GNUNET_SERVER_notification_context_create (server, 32); } @@ -615,6 +257,8 @@ GAS_performance_done () { GNUNET_SERVER_notification_context_destroy (nc); nc = NULL; + GNUNET_SERVER_notification_context_destroy (nc_pic); + nc_pic = NULL; } /* end of gnunet-service-ats_performance.c */ diff --git a/src/ats/gnunet-service-ats_performance.h b/src/ats/gnunet-service-ats_performance.h index b1903fe04..24e9ec1ee 100644 --- a/src/ats/gnunet-service-ats_performance.h +++ b/src/ats/gnunet-service-ats_performance.h @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - (C) 2011 Christian Grothoff (and other contributing authors) + (C) 2011-2015 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -42,16 +42,6 @@ GAS_performance_add_client (struct GNUNET_SERVER_Client *client, enum StartFlag flag); -/** - * Unregister a client (which may have been a performance client, - * but this is not assured). - * - * @param client handle of the (now dead) client - */ -void -GAS_performance_remove_client (struct GNUNET_SERVER_Client *client); - - /** * Transmit the given performance information to all performance * clients. @@ -81,62 +71,6 @@ GAS_performance_notify_all_clients (const struct GNUNET_PeerIdentity *peer, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in); -/** - * Handle 'address list request' messages from clients. - * - * @param cls unused, NULL - * @param client client that sent the request - * @param message the request message - */ -void -GAS_handle_request_address_list (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message); - -/** - * 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); - - -/** - * Handle 'preference change' messages from clients. - * - * @param cls unused, NULL - * @param client client that sent the request - * @param message the request message - */ -void -GAS_handle_preference_change (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message); - - -/** - * 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_preference_feedback (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message); - - -void -GAS_handle_monitor (void *cls, - struct GNUNET_SERVER_Client *client, - const struct GNUNET_MessageHeader *message); - /** * Initialize performance subsystem. * @@ -154,7 +88,5 @@ void GAS_performance_done (void); -/* FIXME: add API to broadcast performance updates! */ - #endif /* end of gnunet-service-ats_performance.h */ diff --git a/src/ats/gnunet-service-ats_preferences.h b/src/ats/gnunet-service-ats_preferences.h index bab604d21..a214e81fc 100644 --- a/src/ats/gnunet-service-ats_preferences.h +++ b/src/ats/gnunet-service-ats_preferences.h @@ -39,8 +39,6 @@ #define DEFAULT_REL_PREFERENCE 0.0 - - /** * A preference client disconnected * @@ -50,8 +48,6 @@ void GAS_addresses_preference_client_disconnect (void *client); - - /** * Change the preference for a peer * @@ -67,6 +63,20 @@ GAS_addresses_preference_change (void *client, float score_abs); +/** + * Handle 'preference change' messages from clients. + * + * @param cls unused, NULL + * @param client client that sent the request + * @param message the request message + */ +void +GAS_handle_preference_change (void *cls, + struct GNUNET_SERVER_Client *client, + const struct GNUNET_MessageHeader *message); + + + /** * Application feedback on how good preference requirements are fulfilled * for a specific preference in the given time scope [now - scope .. now] @@ -91,6 +101,20 @@ GAS_addresses_preference_feedback (void *application, enum GNUNET_ATS_PreferenceKind kind, float 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_preference_feedback (void *cls, + struct GNUNET_SERVER_Client *client, + const struct GNUNET_MessageHeader *message); + + + /** * Shutdown preferences subsystem. */ diff --git a/src/ats/gnunet-service-ats_reservations.c b/src/ats/gnunet-service-ats_reservations.c index cb95ad80f..6e6c2b258 100644 --- a/src/ats/gnunet-service-ats_reservations.c +++ b/src/ats/gnunet-service-ats_reservations.c @@ -25,6 +25,8 @@ */ #include "platform.h" #include "gnunet-service-ats_reservations.h" +#include "gnunet-service-ats.h" +#include "ats.h" /** * Number of seconds that available bandwidth carries over @@ -38,6 +40,11 @@ */ static struct GNUNET_CONTAINER_MultiPeerMap *trackers; +/** + * Context for sending messages to performance clients without PIC. + */ +static struct GNUNET_SERVER_NotificationContext *nc; + /** * Reserve the given amount of incoming bandwidth (in bytes) from the @@ -119,13 +126,60 @@ 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) +{ + const struct ReservationRequestMessage *msg = + (const struct ReservationRequestMessage *) message; + struct ReservationResultMessage result; + int32_t amount; + struct GNUNET_TIME_Relative res_delay; + + GNUNET_SERVER_notification_context_add (nc, + client); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Received RESERVATION_REQUEST message\n"); + amount = (int32_t) ntohl (msg->amount); + res_delay = GAS_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); + 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); +} + + /** * Initialize reservations subsystem. + * + * @param server handle to our server */ void -GAS_reservations_init () +GAS_reservations_init (struct GNUNET_SERVER_Handle *server) { trackers = GNUNET_CONTAINER_multipeermap_create (128, GNUNET_NO); + nc = GNUNET_SERVER_notification_context_create (server, 128); } @@ -134,8 +188,8 @@ GAS_reservations_init () * * @param cls NULL * @param key peer identity (unused) - * @param value the 'struct GNUNET_BANDWIDTH_Tracker' to free - * @return GNUNET_OK (continue to iterate) + * @param value the `struct GNUNET_BANDWIDTH_Tracker` to free + * @return #GNUNET_OK (continue to iterate) */ static int free_tracker (void *cls, @@ -154,8 +208,13 @@ free_tracker (void *cls, void GAS_reservations_done () { - GNUNET_CONTAINER_multipeermap_iterate (trackers, &free_tracker, NULL); + GNUNET_CONTAINER_multipeermap_iterate (trackers, + &free_tracker, + NULL); GNUNET_CONTAINER_multipeermap_destroy (trackers); + GNUNET_SERVER_notification_context_destroy (nc); + nc = NULL; + } /* end of gnunet-service-ats_reservations.c */ diff --git a/src/ats/gnunet-service-ats_reservations.h b/src/ats/gnunet-service-ats_reservations.h index 5ddec9bd6..b22e809bb 100644 --- a/src/ats/gnunet-service-ats_reservations.h +++ b/src/ats/gnunet-service-ats_reservations.h @@ -59,11 +59,26 @@ GAS_reservations_reserve (const struct GNUNET_PeerIdentity *peer, int32_t amount); +/** + * 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); + + /** * Initialize reservations subsystem. + * + * @param server handle to our server */ void -GAS_reservations_init (void); +GAS_reservations_init (struct GNUNET_SERVER_Handle *server); /** -- cgit v1.2.3