X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fats%2Fgnunet-service-ats_performance.c;h=f0986959c4180d689f8cf1ce84a447cdda718b6e;hb=bace3fe85e0dccc59a1d2352e028021e528608b5;hp=684749f42d46ea148eede144806d0b51440ad5a4;hpb=d4ab89faa8d364b3d4b96c223baef84c648bb206;p=oweals%2Fgnunet.git diff --git a/src/ats/gnunet-service-ats_performance.c b/src/ats/gnunet-service-ats_performance.c index 684749f42..f0986959c 100644 --- a/src/ats/gnunet-service-ats_performance.c +++ b/src/ats/gnunet-service-ats_performance.c @@ -31,7 +31,6 @@ #include "gnunet-service-ats_reservations.h" #include "ats.h" - /** * We keep clients that are interested in performance in a linked list. */ @@ -77,6 +76,10 @@ struct AddressIteration unsigned int msg_type; }; +/** + * Address handle + */ +static struct GAS_Addresses_Handle *GSA_addresses; /** * Head of linked list of all clients to this service. @@ -121,11 +124,11 @@ 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_SERVER_client_drop (client); GNUNET_free (pc); } @@ -222,7 +225,6 @@ GAS_performance_notify_all_clients (const struct GNUNET_PeerIdentity *peer, 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) { @@ -267,7 +269,9 @@ peerinfo_it (void *cls, ntohl (bandwidth_in.value__)); GAS_performance_notify_client(pc, id, - plugin_name, plugin_addr, plugin_addr_len, + plugin_name, + plugin_addr, + plugin_addr_len, active, atsi, atsi_count, bandwidth_out, bandwidth_in); @@ -288,7 +292,7 @@ peer_it (void *cls, if (NULL != id) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Callback for peer `%s'\n", GNUNET_i2s (id)); - GAS_addresses_get_peer_info (id, &peerinfo_it, pc); + GAS_addresses_get_peer_info (GSA_addresses, id, &peerinfo_it, pc); } } @@ -309,13 +313,13 @@ GAS_performance_add_client (struct GNUNET_SERVER_Client *client, pc->client = client; pc->flag = flag; GNUNET_SERVER_notification_context_add (nc, client); - GNUNET_SERVER_client_keep (client); GNUNET_CONTAINER_DLL_insert (pc_head, pc_tail, pc); /* Send information about clients */ - GAS_addresses_iterate_peers (&peer_it, pc); + GAS_addresses_iterate_peers (GSA_addresses, &peer_it, pc); } + static void transmit_req_addr (struct AddressIteration *ai, const struct GNUNET_PeerIdentity *id, const char *plugin_name, @@ -328,7 +332,6 @@ static void transmit_req_addr (struct AddressIteration *ai, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) { - struct GNUNET_ATS_Information *atsp; struct PeerInformationMessage *msg; char *addrp; @@ -392,7 +395,7 @@ req_addr_peerinfo_it (void *cls, if (NULL == find_client (ai->pc->client)) return; /* Client disconnected */ - if ((NULL == id) && (NULL == id) && (NULL == id)) + if ((NULL == id) && (NULL == plugin_name) && (NULL == plugin_addr)) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Address iteration done\n"); @@ -442,7 +445,7 @@ req_addr_peer_it (void *cls, if (NULL != id) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Callback for peer `%s'\n", GNUNET_i2s (id)); - GAS_addresses_get_peer_info (id, &req_addr_peerinfo_it, ai); + GAS_addresses_get_peer_info (GSA_addresses, id, &req_addr_peerinfo_it, ai); } else { @@ -450,6 +453,7 @@ req_addr_peer_it (void *cls, } } + /** * Handle 'address list request' messages from clients. * @@ -485,19 +489,70 @@ GAS_handle_request_address_list (void *cls, struct GNUNET_SERVER_Client *client, if (0 == memcmp (&alrm->peer, &allzeros, sizeof (struct GNUNET_PeerIdentity))) { /* Return addresses for all peers */ - GAS_addresses_iterate_peers (&req_addr_peer_it, &ai); + GAS_addresses_iterate_peers (GSA_addresses, &req_addr_peer_it, &ai); transmit_req_addr (&ai, NULL, NULL, NULL, 0, GNUNET_NO, NULL, 0, bandwidth_zero, bandwidth_zero); } else { /* Return addresses for a specific peer */ - GAS_addresses_get_peer_info (&alrm->peer, &req_addr_peerinfo_it, &ai); + GAS_addresses_get_peer_info (GSA_addresses, &alrm->peer, &req_addr_peerinfo_it, &ai); transmit_req_addr (&ai, NULL, NULL, NULL, 0, GNUNET_NO, NULL, 0, bandwidth_zero, bandwidth_zero); } GNUNET_SERVER_receive_done (client, GNUNET_OK); } +void +GAS_handle_performance_update (struct GNUNET_PeerIdentity *peer, + const char *plugin_name, + const void *plugin_addr, + size_t plugin_addr_len, + const int active, + struct GNUNET_ATS_Information *ats, + uint32_t ats_count, + struct GNUNET_BANDWIDTH_Value32NBO + bandwidth_out, + struct GNUNET_BANDWIDTH_Value32NBO + bandwidth_in) +{ +/* Notify here */ + GAS_performance_notify_all_clients (peer, + plugin_name, + plugin_addr, plugin_addr_len, + active, + ats, ats_count, + bandwidth_out, bandwidth_in); + +#if 0 + struct PerformanceClient *cur; + struct PerformanceMonitorClient *curm; + struct MonitorResponseMessage *mrm; + size_t msglen; + + msglen = sizeof (struct MonitorResponseMessage) + + ats_count * sizeof (struct GNUNET_ATS_Information); + mrm = GNUNET_malloc (msglen); + + mrm->header.type = htons (GNUNET_MESSAGE_TYPE_ATS_MONITOR_RESPONSE); + mrm->header.size = htons (msglen); + mrm->ats_count = htonl (ats_count); + mrm->peer = *peer; + memcpy (&mrm[1], ats, ats_count * sizeof (struct GNUNET_ATS_Information)); + + for (cur = pc_head; NULL != cur; cur = cur->next) + for (curm = cur->pm_head; NULL != curm; curm = curm->next) + { + /* Notify client about update */ + mrm->id = htonl (curm->id); + GNUNET_SERVER_notification_context_unicast (nc, + cur->client, + (struct GNUNET_MessageHeader *) mrm, + GNUNET_YES); + } + GNUNET_free (mrm); +#endif +} + /** * Handle 'reservation request' messages from clients. @@ -527,7 +582,7 @@ GAS_handle_reservation_request (void *cls, struct GNUNET_SERVER_Client *client, "RESERVATION_REQUEST"); amount = (int32_t) ntohl (msg->amount); res_delay = GAS_reservations_reserve (&msg->peer, amount); - if (res_delay.rel_value > 0) + 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); @@ -550,7 +605,8 @@ GAS_handle_reservation_request (void *cls, struct GNUNET_SERVER_Client *client, * @param message the request message */ void -GAS_handle_preference_change (void *cls, struct GNUNET_SERVER_Client *client, +GAS_handle_preference_change (void *cls, + struct GNUNET_SERVER_Client *client, const struct GNUNET_MessageHeader *message) { const struct ChangePreferenceMessage *msg; @@ -582,7 +638,9 @@ GAS_handle_preference_change (void *cls, struct GNUNET_SERVER_Client *client, 1, GNUNET_NO); pi = (const struct PreferenceInformation *) &msg[1]; for (i = 0; i < nump; i++) - GAS_addresses_change_preference (&msg->peer, + GAS_addresses_change_preference (GSA_addresses, + client, + &msg->peer, (enum GNUNET_ATS_PreferenceKind) ntohl (pi[i].preference_kind), pi[i].preference_value); @@ -594,10 +652,13 @@ GAS_handle_preference_change (void *cls, struct GNUNET_SERVER_Client *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) +GAS_performance_init (struct GNUNET_SERVER_Handle *server, + struct GAS_Addresses_Handle *addresses) { + GSA_addresses = addresses; nc = GNUNET_SERVER_notification_context_create (server, 128); }