From 950fd061acfb62dd00922dd582152b78d4f96ef9 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Mon, 10 Dec 2012 14:25:53 +0000 Subject: [PATCH] more changes --- src/ats/gnunet-service-ats_addresses.c | 38 +++++++++++++- src/ats/gnunet-service-ats_addresses.h | 15 +++++- src/ats/gnunet-service-ats_addresses_mlp.c | 5 +- src/ats/gnunet-service-ats_addresses_mlp.h | 6 ++- .../gnunet-service-ats_addresses_simplistic.c | 51 ++++++++++++++++--- .../gnunet-service-ats_addresses_simplistic.h | 4 +- 6 files changed, 104 insertions(+), 15 deletions(-) diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c index 3b6e23522..1066b78aa 100644 --- a/src/ats/gnunet-service-ats_addresses.c +++ b/src/ats/gnunet-service-ats_addresses.c @@ -806,7 +806,6 @@ GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer) "Address %p ready for suggestion, block interval now %llu \n", aa, aa->block_interval); - GNUNET_free (ats); } @@ -940,6 +939,41 @@ load_quotas (const struct GNUNET_CONFIGURATION_Handle *cfg, unsigned long long * } +static void +bandwidth_changed_cb (struct ATS_Address *address) +{ + struct GAS_Addresses_Suggestion_Requests *cur; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Bandwidth assignment changed for peer %s \n", GNUNET_i2s(&address->peer)); + struct GNUNET_ATS_Information *ats; + unsigned int ats_count; + + cur = handle->r_head; + while (NULL != cur) + { + if (0 == memcmp (&address->peer, &cur->id, sizeof (cur->id))) + break; /* we have an address request pending*/ + cur = cur->next; + } + if (NULL == cur) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Nobody is interested in peer `%s' :(\n",GNUNET_i2s (&address->peer)); + return; + } + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Sending bandwidth update for peer `%s'\n",GNUNET_i2s (&address->peer)); + + ats_count = assemble_ats_information (address, &ats); + GAS_scheduling_transmit_address_suggestion (&address->peer, + address->plugin, + address->addr, address->addr_len, + address->session_id, + ats, ats_count, + address->assigned_bw_out, + address->assigned_bw_in); +} + /** * Initialize address subsystem. @@ -1042,7 +1076,7 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg, quota_count = load_quotas(cfg, quotas_in, quotas_out, GNUNET_ATS_NetworkTypeCount); - ah->solver = ah->s_init (cfg, stats, quotas, quotas_in, quotas_out, quota_count); + ah->solver = ah->s_init (cfg, stats, quotas, quotas_in, quotas_out, quota_count, &bandwidth_changed_cb); if (NULL == ah->solver) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to initialize solver!\n"); diff --git a/src/ats/gnunet-service-ats_addresses.h b/src/ats/gnunet-service-ats_addresses.h index ae1215954..c856b09b0 100644 --- a/src/ats/gnunet-service-ats_addresses.h +++ b/src/ats/gnunet-service-ats_addresses.h @@ -147,6 +147,15 @@ struct ATS_Address }; +/** + * Callback to call from solver when bandwidth for address has changed + * + * @param address the with changed bandwidth assigned + */ + +typedef void + (*GAS_bandwidth_changed_cb) (struct ATS_Address *address); + /** * Init the simplistic problem solving component * @@ -165,7 +174,8 @@ struct ATS_Address * @param stats the GNUNET_STATISTICS handle * @param network array of GNUNET_ATS_NetworkType with length dest_length * @param out_quota array of outbound quotas - * param in_quota array of outbound quota + * @param in_quota array of outbound quota + * @param bw_changed_cb callback to call when assigned changes * @return handle for the solver on success, NULL on fail */ typedef void * @@ -174,7 +184,8 @@ typedef void * int *network, unsigned long long *out_quota, unsigned long long *in_quota, - int dest_length); + int dest_length, + GAS_bandwidth_changed_cb bw_changed_cb); typedef void diff --git a/src/ats/gnunet-service-ats_addresses_mlp.c b/src/ats/gnunet-service-ats_addresses_mlp.c index c493517a9..ef0f18160 100644 --- a/src/ats/gnunet-service-ats_addresses_mlp.c +++ b/src/ats/gnunet-service-ats_addresses_mlp.c @@ -1079,7 +1079,10 @@ void * GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_STATISTICS_Handle *stats, int *network, - unsigned long long *out_dest, unsigned long long *in_dest, int dest_length) + unsigned long long *out_dest, + unsigned long long *in_dest, + int dest_length, + GAS_bandwidth_changed_cb bw_changed_cb) { struct GAS_MLP_Handle * mlp = GNUNET_malloc (sizeof (struct GAS_MLP_Handle)); diff --git a/src/ats/gnunet-service-ats_addresses_mlp.h b/src/ats/gnunet-service-ats_addresses_mlp.h index 646b65824..78010a0cf 100644 --- a/src/ats/gnunet-service-ats_addresses_mlp.h +++ b/src/ats/gnunet-service-ats_addresses_mlp.h @@ -316,13 +316,17 @@ struct MLP_information * * @param cfg configuration handle * @param stats the GNUNET_STATISTICS handle + * @param bw_changed_cb callback to call when assigned changes * @return struct GAS_MLP_Handle on success, NULL on fail */ void * GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_STATISTICS_Handle *stats, int *network, - unsigned long long *out_dest, unsigned long long *in_dest, int dest_length); + unsigned long long *out_dest, + unsigned long long *in_dest, + int dest_length, + GAS_bandwidth_changed_cb bw_changed_cb); /** diff --git a/src/ats/gnunet-service-ats_addresses_simplistic.c b/src/ats/gnunet-service-ats_addresses_simplistic.c index c9c9bd7af..39b7cd107 100644 --- a/src/ats/gnunet-service-ats_addresses_simplistic.c +++ b/src/ats/gnunet-service-ats_addresses_simplistic.c @@ -41,6 +41,7 @@ struct GAS_SIMPLISTIC_Handle struct Network *network_entries; unsigned int networks; + GAS_bandwidth_changed_cb bw_changed; }; struct Network @@ -71,6 +72,17 @@ struct Network * Number of active addresses for this network */ unsigned int active_addresses; + + struct AddressWrapper *head; + struct AddressWrapper *tail; +}; + +struct AddressWrapper +{ + struct AddressWrapper *next; + struct AddressWrapper *prev; + + struct ATS_Address *addr; }; /** @@ -100,13 +112,15 @@ GAS_simplistic_init (const struct GNUNET_CONFIGURATION_Handle *cfg, int *network, unsigned long long *out_quota, unsigned long long *in_quota, - int dest_length) + int dest_length, + GAS_bandwidth_changed_cb bw_changed_cb) { int c; struct GAS_SIMPLISTIC_Handle *s = GNUNET_malloc (sizeof (struct GAS_SIMPLISTIC_Handle)); struct Network * cur; char * net_str[GNUNET_ATS_NetworkTypeCount] = {"UNSPECIFIED", "LOOPBACK", "LAN", "WAN", "WLAN"}; + s->bw_changed = bw_changed_cb; s->networks = dest_length; s->network_entries = GNUNET_malloc (dest_length * sizeof (struct Network)); @@ -141,6 +155,7 @@ update_quota (struct GAS_SIMPLISTIC_Handle *s, struct Network *net) { unsigned long long quota_in; unsigned long long quota_out; + struct AddressWrapper *cur; quota_in = net->total_quota_in / net->active_addresses; quota_out = net->total_quota_out / net->active_addresses; @@ -148,6 +163,22 @@ update_quota (struct GAS_SIMPLISTIC_Handle *s, struct Network *net) LOG (GNUNET_ERROR_TYPE_DEBUG, "New quota for network type `%s' (in/out): %llu/%llu \n", net->desc, quota_in, quota_out); + + cur = net->head; + while (NULL != cur) + { + /* Compare to current bandwidth assigned */ + if ((quota_in != ntohl(cur->addr->assigned_bw_in.value__)) || + (quota_out != ntohl(cur->addr->assigned_bw_out.value__))) + { + cur->addr->assigned_bw_in.value__ = htonl (quota_in); + cur->addr->assigned_bw_out.value__ = htonl (quota_out); + /* Notify on change */ + s->bw_changed (cur->addr); + } + cur = cur->next; + } + } /** @@ -162,20 +193,14 @@ GAS_simplistic_address_add (void *solver, struct GNUNET_CONTAINER_MultiHashMap * { struct GAS_SIMPLISTIC_Handle *s = solver; struct Network *cur = NULL; + struct AddressWrapper *aw = NULL; GNUNET_assert (NULL != s); int c; for (c = 0; c < s->networks; c++) { cur = &s->network_entries[c]; if (address->atsp_network_type == cur->type) - { - cur->active_addresses ++; - LOG (GNUNET_ERROR_TYPE_DEBUG, - "Adding new address for network type `%s' (now %u total)\n", - cur->desc, - cur->active_addresses); break; - } } if (NULL == cur) { @@ -183,6 +208,16 @@ GAS_simplistic_address_add (void *solver, struct GNUNET_CONTAINER_MultiHashMap * return; } + aw = GNUNET_malloc (sizeof (struct AddressWrapper)); + aw->addr = address; + GNUNET_CONTAINER_DLL_insert (cur->head, cur->tail, aw); + cur->active_addresses ++; + + LOG (GNUNET_ERROR_TYPE_DEBUG, + "Adding new address for network type `%s' (now %u total)\n", + cur->desc, + cur->active_addresses); + /* Update quota for this network type */ update_quota (s, cur); diff --git a/src/ats/gnunet-service-ats_addresses_simplistic.h b/src/ats/gnunet-service-ats_addresses_simplistic.h index da60f6edc..f2005b889 100644 --- a/src/ats/gnunet-service-ats_addresses_simplistic.h +++ b/src/ats/gnunet-service-ats_addresses_simplistic.h @@ -49,6 +49,7 @@ * @param network array of GNUNET_ATS_NetworkType with length dest_length * @param out_quota array of outbound quotas * param in_quota array of outbound quota + * @param bw_changed_cb callback to call when assigned changes * @return handle for the solver on success, NULL on fail */ void * @@ -57,7 +58,8 @@ GAS_simplistic_init (const struct GNUNET_CONFIGURATION_Handle *cfg, int *network, unsigned long long *out_quota, unsigned long long *in_quota, - int dest_length); + int dest_length, + GAS_bandwidth_changed_cb bw_changed_cb); /** * Shutdown the simplistic problem solving component -- 2.25.1