From 35d79cb1941c9f9607195b8760d8a14d836e6397 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Mon, 13 Jan 2014 16:56:41 +0000 Subject: implementing 0003268 --- src/ats/ats.h | 9 ++++ src/ats/ats_api_scheduling.c | 13 +++--- src/ats/gnunet-service-ats_addresses.c | 69 ++++++++++++++++++++--------- src/ats/gnunet-service-ats_addresses.h | 23 +++++++--- src/ats/gnunet-service-ats_performance.c | 76 ++++++++++++++------------------ src/ats/gnunet-service-ats_scheduling.c | 26 ++++++----- src/ats/gnunet-service-ats_scheduling.h | 20 ++++----- 7 files changed, 140 insertions(+), 96 deletions(-) (limited to 'src') diff --git a/src/ats/ats.h b/src/ats/ats.h index 4f8ab1b81..48c8a35d5 100644 --- a/src/ats/ats.h +++ b/src/ats/ats.h @@ -79,12 +79,15 @@ struct AddressUpdateMessage struct GNUNET_PeerIdentity peer; + uint16_t address_length GNUNET_PACKED; uint16_t plugin_name_length GNUNET_PACKED; uint32_t session_id GNUNET_PACKED; + uint32_t address_local_info GNUNET_PACKED; + /* followed by: * - struct GNUNET_ATS_Information [ats_count]; * - char address[address_length] @@ -107,6 +110,8 @@ struct AddressUseMessage uint32_t session_id GNUNET_PACKED; + uint32_t address_local_info GNUNET_PACKED; + /* followed by: * - char address[address_length] * - char plugin_name[plugin_name_length] (including '\0'-termination). @@ -129,6 +134,8 @@ struct AddressDestroyedMessage uint32_t session_id GNUNET_PACKED; + uint32_t address_local_info GNUNET_PACKED; + /* followed by: * - char address[address_length] * - char plugin_name[plugin_name_length] (including '\0'-termination). @@ -151,6 +158,8 @@ struct AddressSuggestionMessage uint32_t session_id GNUNET_PACKED; + uint32_t address_local_info GNUNET_PACKED; + struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out; struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in; diff --git a/src/ats/ats_api_scheduling.c b/src/ats/ats_api_scheduling.c index d23de8940..b9574ff5c 100644 --- a/src/ats/ats_api_scheduling.c +++ b/src/ats/ats_api_scheduling.c @@ -643,6 +643,7 @@ process_ats_message (void *cls, const struct GNUNET_MessageHeader *msg) address.address = plugin_address; address.address_length = plugin_address_length; address.transport_name = plugin_name; + address.local_info = ntohl(m->address_local_info); if ((s == NULL) && (0 == address.address_length)) { @@ -1200,11 +1201,9 @@ GNUNET_ATS_address_add (struct GNUNET_ATS_SchedulingHandle *sh, return GNUNET_SYSERR; } - namelen = - (address->transport_name == - NULL) ? 0 : strlen (address->transport_name) + 1; - msize = - sizeof (struct AddressUpdateMessage) + address->address_length + + namelen = (address->transport_name == NULL) ? 0 : strlen (address->transport_name) + 1; + + msize = sizeof (struct AddressUpdateMessage) + address->address_length + ats_count * sizeof (struct GNUNET_ATS_Information) + namelen; if ((msize >= GNUNET_SERVER_MAX_MESSAGE_SIZE) || (address->address_length >= GNUNET_SERVER_MAX_MESSAGE_SIZE) || @@ -1236,6 +1235,7 @@ GNUNET_ATS_address_add (struct GNUNET_ATS_SchedulingHandle *sh, m->ats_count = htonl (ats_count); m->peer = address->peer; m->address_length = htons (address->address_length); + m->address_local_info = htonl ((uint32_t) address->local_info); m->plugin_name_length = htons (namelen); m->session_id = htonl (s); @@ -1330,6 +1330,7 @@ GNUNET_ATS_address_update (struct GNUNET_ATS_SchedulingHandle *sh, m->ats_count = htonl (ats_count); m->peer = address->peer; m->address_length = htons (address->address_length); + m->address_local_info = htonl ((uint32_t) address->local_info); m->plugin_name_length = htons (namelen); m->session_id = htonl (s); @@ -1413,6 +1414,7 @@ GNUNET_ATS_address_in_use (struct GNUNET_ATS_SchedulingHandle *sh, m->peer = address->peer; m->in_use = htons (in_use); m->address_length = htons (address->address_length); + m->address_local_info = htonl ((uint32_t) address->local_info); m->plugin_name_length = htons (namelen); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -1488,6 +1490,7 @@ GNUNET_ATS_address_destroyed (struct GNUNET_ATS_SchedulingHandle *sh, m->reserved = htonl (0); m->peer = address->peer; m->address_length = htons (address->address_length); + m->address_local_info = htonl ((uint32_t) address->local_info); m->plugin_name_length = htons (namelen); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c index a82b21355..13bd656d4 100644 --- a/src/ats/gnunet-service-ats_addresses.c +++ b/src/ats/gnunet-service-ats_addresses.c @@ -476,8 +476,12 @@ free_address (struct ATS_Address *addr) * @return the ATS_Address */ static struct ATS_Address * -create_address (const struct GNUNET_PeerIdentity *peer, const char *plugin_name, - const void *plugin_addr, size_t plugin_addr_len, uint32_t session_id) +create_address (const struct GNUNET_PeerIdentity *peer, + const char *plugin_name, + const void *plugin_addr, + size_t plugin_addr_len, + uint32_t local_address_info, + uint32_t session_id) { struct ATS_Address *aa = NULL; int c1; @@ -490,6 +494,7 @@ create_address (const struct GNUNET_PeerIdentity *peer, const char *plugin_name, memcpy (&aa[1], plugin_addr, plugin_addr_len); aa->plugin = GNUNET_strdup (plugin_name); aa->session_id = session_id; + aa->local_address_info = local_address_info; aa->active = GNUNET_NO; aa->used = GNUNET_NO; aa->solver_information = NULL; @@ -642,14 +647,18 @@ find_equivalent_address (struct GAS_Addresses_Handle *handle, static struct ATS_Address * find_exact_address (struct GAS_Addresses_Handle *handle, - const struct GNUNET_PeerIdentity *peer, const char *plugin_name, - const void *plugin_addr, size_t plugin_addr_len, uint32_t session_id) + const struct GNUNET_PeerIdentity *peer, + const char *plugin_name, + const void *plugin_addr, + size_t plugin_addr_len, + uint32_t local_address_info, + uint32_t session_id) { struct ATS_Address *aa; struct ATS_Address *ea; aa = create_address (peer, plugin_name, plugin_addr, plugin_addr_len, - session_id); + local_address_info, session_id); /* Get existing address or address with session == 0 */ ea = find_equivalent_address (handle, peer, aa); @@ -727,9 +736,14 @@ get_performance_info (struct ATS_Address *address, uint32_t type) */ void GAS_addresses_add (struct GAS_Addresses_Handle *handle, - const struct GNUNET_PeerIdentity *peer, const char *plugin_name, - const void *plugin_addr, size_t plugin_addr_len, uint32_t session_id, - const struct GNUNET_ATS_Information *atsi, uint32_t atsi_count) + const struct GNUNET_PeerIdentity *peer, + const char *plugin_name, + const void *plugin_addr, + size_t plugin_addr_len, + uint32_t local_address_info, + uint32_t session_id, + const struct GNUNET_ATS_Information *atsi, + uint32_t atsi_count) { struct ATS_Address *new_address; struct ATS_Address *existing_address; @@ -748,7 +762,7 @@ GAS_addresses_add (struct GAS_Addresses_Handle *handle, GNUNET_assert(NULL != handle->addresses); new_address = create_address (peer, plugin_name, plugin_addr, plugin_addr_len, - session_id); + local_address_info, session_id); atsi_delta = NULL; disassemble_ats_information (new_address, atsi, atsi_count, &atsi_delta, &atsi_delta_count); @@ -891,9 +905,14 @@ GAS_addresses_add (struct GAS_Addresses_Handle *handle, */ void GAS_addresses_update (struct GAS_Addresses_Handle *handle, - const struct GNUNET_PeerIdentity *peer, const char *plugin_name, - const void *plugin_addr, size_t plugin_addr_len, uint32_t session_id, - const struct GNUNET_ATS_Information *atsi, uint32_t atsi_count) + const struct GNUNET_PeerIdentity *peer, + const char *plugin_name, + const void *plugin_addr, + size_t plugin_addr_len, + uint32_t local_address_info, + uint32_t session_id, + const struct GNUNET_ATS_Information *atsi, + uint32_t atsi_count) { struct ATS_Address *aa; struct GNUNET_ATS_Information *atsi_delta; @@ -908,7 +927,7 @@ GAS_addresses_update (struct GAS_Addresses_Handle *handle, /* Get existing address */ aa = find_exact_address (handle, peer, plugin_name, plugin_addr, - plugin_addr_len, session_id); + plugin_addr_len, local_address_info, session_id); if (aa == NULL ) return; if (NULL == aa->solver_information) @@ -1080,8 +1099,12 @@ destroy_by_session_id (void *cls, */ void GAS_addresses_destroy (struct GAS_Addresses_Handle *handle, - const struct GNUNET_PeerIdentity *peer, const char *plugin_name, - const void *plugin_addr, size_t plugin_addr_len, uint32_t session_id) + const struct GNUNET_PeerIdentity *peer, + const char *plugin_name, + const void *plugin_addr, + size_t plugin_addr_len, + uint32_t local_address_info, + uint32_t session_id) { struct ATS_Address *ea; struct DestroyContext dc; @@ -1090,7 +1113,7 @@ GAS_addresses_destroy (struct GAS_Addresses_Handle *handle, /* Get existing address */ ea = find_exact_address (handle, peer, plugin_name, plugin_addr, - plugin_addr_len, session_id); + plugin_addr_len, local_address_info, session_id); if (ea == NULL ) { GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, @@ -1106,7 +1129,7 @@ GAS_addresses_destroy (struct GAS_Addresses_Handle *handle, GNUNET_break(0 < strlen (plugin_name)); dc.handle = handle; dc.aa = create_address (peer, plugin_name, plugin_addr, plugin_addr_len, - session_id); + local_address_info, session_id); GNUNET_CONTAINER_multipeermap_get_multiple (handle->addresses, peer, @@ -1138,7 +1161,9 @@ GAS_addresses_destroy (struct GAS_Addresses_Handle *handle, int GAS_addresses_in_use (struct GAS_Addresses_Handle *handle, const struct GNUNET_PeerIdentity *peer, const char *plugin_name, - const void *plugin_addr, size_t plugin_addr_len, uint32_t session_id, + const void *plugin_addr, size_t plugin_addr_len, + uint32_t local_address_info, + uint32_t session_id, int in_use) { struct ATS_Address *ea; @@ -1149,7 +1174,7 @@ GAS_addresses_in_use (struct GAS_Addresses_Handle *handle, return GNUNET_SYSERR; ea = find_exact_address (handle, peer, plugin_name, plugin_addr, - plugin_addr_len, session_id); + plugin_addr_len, local_address_info, session_id); if (NULL == ea) { GNUNET_log(GNUNET_ERROR_TYPE_WARNING, @@ -1261,7 +1286,8 @@ GAS_addresses_request_address (struct GAS_Addresses_Handle *handle, aa, GNUNET_i2s (peer)); GAS_scheduling_transmit_address_suggestion (peer, aa->plugin, aa->addr, - aa->addr_len, aa->session_id, aa->atsi, aa->atsi_count, + aa->addr_len, aa->local_address_info, aa->session_id, + aa->atsi, aa->atsi_count, aa->assigned_bw_out, aa->assigned_bw_in); aa->block_interval = GNUNET_TIME_relative_add (aa->block_interval, @@ -2073,7 +2099,8 @@ bandwidth_changed_cb (void *cls, struct ATS_Address *address) /* *Notify scheduling clients about suggestion */ GAS_scheduling_transmit_address_suggestion (&address->peer, address->plugin, - address->addr, address->addr_len, address->session_id, address->atsi, + address->addr, address->addr_len, address->local_address_info, + address->session_id, address->atsi, address->atsi_count, address->assigned_bw_out, address->assigned_bw_in); } diff --git a/src/ats/gnunet-service-ats_addresses.h b/src/ats/gnunet-service-ats_addresses.h index 8b7a58d52..a793d35d8 100644 --- a/src/ats/gnunet-service-ats_addresses.h +++ b/src/ats/gnunet-service-ats_addresses.h @@ -312,6 +312,8 @@ struct ATS_Address */ uint32_t session_id; + uint32_t local_address_info; + /** * Address */ @@ -427,9 +429,14 @@ GAS_addresses_done (struct GAS_Addresses_Handle *handle); */ void GAS_addresses_add (struct GAS_Addresses_Handle *handle, - const struct GNUNET_PeerIdentity *peer, const char *plugin_name, - const void *plugin_addr, size_t plugin_addr_len, uint32_t session_id, - const struct GNUNET_ATS_Information *atsi, uint32_t atsi_count); + const struct GNUNET_PeerIdentity *peer, + const char *plugin_name, + const void *plugin_addr, + size_t plugin_addr_len, + uint32_t local_address_info, + uint32_t session_id, + const struct GNUNET_ATS_Information *atsi, + uint32_t atsi_count); /** * Notification about active use of an address. @@ -453,7 +460,9 @@ GAS_addresses_add (struct GAS_Addresses_Handle *handle, int GAS_addresses_in_use (struct GAS_Addresses_Handle *handle, const struct GNUNET_PeerIdentity *peer, const char *plugin_name, - const void *plugin_addr, size_t plugin_addr_len, uint32_t session_id, + const void *plugin_addr, size_t plugin_addr_len, + uint32_t local_address_info, + uint32_t session_id, int in_use); /** @@ -474,7 +483,8 @@ GAS_addresses_in_use (struct GAS_Addresses_Handle *handle, void GAS_addresses_update (struct GAS_Addresses_Handle *handle, const struct GNUNET_PeerIdentity *peer, const char *plugin_name, - const void *plugin_addr, size_t plugin_addr_len, uint32_t session_id, + const void *plugin_addr, size_t plugin_addr_len, + uint32_t local_address_info, uint32_t session_id, const struct GNUNET_ATS_Information *atsi, uint32_t atsi_count); /** @@ -490,7 +500,8 @@ GAS_addresses_update (struct GAS_Addresses_Handle *handle, void GAS_addresses_destroy (struct GAS_Addresses_Handle *handle, const struct GNUNET_PeerIdentity *peer, const char *plugin_name, - const void *plugin_addr, size_t plugin_addr_len, uint32_t session_id); + const void *plugin_addr, size_t plugin_addr_len, + uint32_t local_address_info, uint32_t session_id); /** * Remove all addresses diff --git a/src/ats/gnunet-service-ats_performance.c b/src/ats/gnunet-service-ats_performance.c index 7e9b4802e..5a1d8cc66 100644 --- a/src/ats/gnunet-service-ats_performance.c +++ b/src/ats/gnunet-service-ats_performance.c @@ -507,52 +507,42 @@ GAS_handle_request_address_list (void *cls, struct GNUNET_SERVER_Client *client, 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) + 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); + /* 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); + 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 } diff --git a/src/ats/gnunet-service-ats_scheduling.c b/src/ats/gnunet-service-ats_scheduling.c index 48fe536c1..2b77e0e5d 100644 --- a/src/ats/gnunet-service-ats_scheduling.c +++ b/src/ats/gnunet-service-ats_scheduling.c @@ -100,16 +100,16 @@ GAS_scheduling_remove_client (struct GNUNET_SERVER_Client *client) */ void GAS_scheduling_transmit_address_suggestion (const struct GNUNET_PeerIdentity - *peer, const char *plugin_name, - const void *plugin_addr, - size_t plugin_addr_len, - uint32_t session_id, - const struct GNUNET_ATS_Information - *atsi, uint32_t atsi_count, - struct GNUNET_BANDWIDTH_Value32NBO - bandwidth_out, - struct GNUNET_BANDWIDTH_Value32NBO - bandwidth_in) + *peer, + const char *plugin_name, + const void *plugin_addr, + size_t plugin_addr_len, + uint32_t local_address_info, + uint32_t session_id, + const struct GNUNET_ATS_Information *atsi, + uint32_t atsi_count, + struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, + struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in) { struct AddressSuggestionMessage *msg; size_t plugin_name_length = strlen (plugin_name) + 1; @@ -136,6 +136,7 @@ GAS_scheduling_transmit_address_suggestion (const struct GNUNET_PeerIdentity msg->peer = *peer; msg->address_length = htons (plugin_addr_len); msg->plugin_name_length = htons (plugin_name_length); + msg->address_local_info = htonl (local_address_info); msg->session_id = htonl (session_id); msg->bandwidth_out = bandwidth_out; msg->bandwidth_in = bandwidth_in; @@ -278,7 +279,7 @@ GAS_handle_address_add (void *cls, struct GNUNET_SERVER_Client *client, GNUNET_STATISTICS_update (GSA_stats, "# address updates received", 1, GNUNET_NO); GAS_addresses_add (address_handle, &m->peer, plugin_name, address, address_length, - ntohl (m->session_id), atsi, ats_count); + ntohl(m->address_local_info), ntohl (m->session_id), atsi, ats_count); GNUNET_SERVER_receive_done (client, GNUNET_OK); } @@ -337,6 +338,7 @@ GAS_handle_address_update (void *cls, struct GNUNET_SERVER_Client *client, GNUNET_STATISTICS_update (GSA_stats, "# address updates received", 1, GNUNET_NO); GAS_addresses_update (address_handle, &m->peer, plugin_name, address, address_length, + ntohl (m->address_local_info), ntohl (m->session_id), atsi, ats_count); GNUNET_SERVER_receive_done (client, GNUNET_OK); } @@ -397,6 +399,7 @@ GAS_handle_address_in_use (void *cls, struct GNUNET_SERVER_Client *client, plugin_name, address, address_length, + ntohl (m->address_local_info), ntohl (m->session_id), in_use); @@ -465,6 +468,7 @@ GAS_handle_address_destroyed (void *cls, struct GNUNET_SERVER_Client *client, GNUNET_STATISTICS_update (GSA_stats, "# addresses destroyed", 1, GNUNET_NO); GAS_addresses_destroy (address_handle, &m->peer, plugin_name, address, address_length, + ntohl (m->address_local_info), ntohl (m->session_id)); if (0 != ntohl (m->session_id)) { diff --git a/src/ats/gnunet-service-ats_scheduling.h b/src/ats/gnunet-service-ats_scheduling.h index d7b5e9cde..7733cdf88 100644 --- a/src/ats/gnunet-service-ats_scheduling.h +++ b/src/ats/gnunet-service-ats_scheduling.h @@ -79,16 +79,16 @@ GAS_handle_reset_backoff (void *cls, */ void GAS_scheduling_transmit_address_suggestion (const struct GNUNET_PeerIdentity - *peer, const char *plugin_name, - const void *plugin_addr, - size_t plugin_addr_len, - uint32_t session_id, - const struct GNUNET_ATS_Information - *atsi, uint32_t atsi_count, - struct GNUNET_BANDWIDTH_Value32NBO - bandwidth_out, - struct GNUNET_BANDWIDTH_Value32NBO - bandwidth_in); + *peer, + const char *plugin_name, + const void *plugin_addr, + size_t plugin_addr_len, + uint32_t local_address_info, + uint32_t session_id, + const struct GNUNET_ATS_Information *atsi, + uint32_t atsi_count, + struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out, + struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in); /** -- cgit v1.2.3