X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fats%2Fgnunet-service-ats_addresses.c;h=fb9bad037049020cc516ffe003e49c3aab27bf06;hb=82c4c89493dcbfc6ee7fd1232a9088d02e2cd0a2;hp=556214f8041d752da90b074f8db3c09a0fa619b4;hpb=1d70588544ceb846af6926f508bc639613a91c2b;p=oweals%2Fgnunet.git diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c index 556214f80..fb9bad037 100644 --- a/src/ats/gnunet-service-ats_addresses.c +++ b/src/ats/gnunet-service-ats_addresses.c @@ -35,18 +35,18 @@ #include "gnunet-service-ats_addresses_mlp.h" #endif -#define VERBOSE GNUNET_EXTRA_LOGGING +#define VERBOSE GNUNET_NO enum ATS_Mode { - /** + /* * Assign each peer an equal amount of bandwidth (bw) * * bw_per_peer = bw_total / #active addresses */ SIMPLE, - /** + /* * Use MLP solver to assign bandwidth */ MLP @@ -77,17 +77,19 @@ static int ats_mode; * @return GNUNET_OK (continue to iterate) */ static int -update_bw_it (void *cls, const GNUNET_HashCode * key, void *value) +update_bw_simple_it (void *cls, const GNUNET_HashCode * key, void *value) { struct ATS_Address *aa = value; - - /* Simple method */ if (GNUNET_YES != aa->active) return GNUNET_OK; GNUNET_assert (active_addr_count > 0); + + + /* Simple method */ aa->assigned_bw_in.value__ = htonl (wan_quota_in / active_addr_count); aa->assigned_bw_out.value__ = htonl (wan_quota_out / active_addr_count); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "New bandwidth for peer %s is %u/%u\n", GNUNET_i2s (&aa->peer), ntohl (aa->assigned_bw_in.value__), ntohl (aa->assigned_bw_out.value__)); @@ -117,7 +119,8 @@ recalculate_assigned_bw () 1, GNUNET_NO); GNUNET_STATISTICS_set (GSA_stats, "# active addresses", active_addr_count, GNUNET_NO); - GNUNET_CONTAINER_multihashmap_iterate (addresses, &update_bw_it, NULL); + + GNUNET_CONTAINER_multihashmap_iterate (addresses, &update_bw_simple_it, NULL); } /** @@ -585,12 +588,66 @@ GAS_addresses_in_use (const struct GNUNET_PeerIdentity *peer, #endif } -void -GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer) + +void request_address_mlp (const struct GNUNET_PeerIdentity *peer) { struct ATS_Address *aa; + aa = NULL; + +#if HAVE_GLPK + /* Get preferred address from MLP */ + struct ATS_PreferedAddress * paddr = NULL; + paddr = GAS_mlp_get_preferred_address (mlp, addresses, peer); + aa = paddr->address; + aa->assigned_bw_out = GNUNET_BANDWIDTH_value_init(paddr->bandwidth_out); + /* FIXME use bw in value */ + paddr->bandwidth_in = paddr->bandwidth_out; + aa->assigned_bw_in = GNUNET_BANDWIDTH_value_init (paddr->bandwidth_in); + GNUNET_free (paddr); +#endif + if (aa == NULL) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Cannot suggest address for peer `%s'\n", GNUNET_i2s (peer)); + return; + } + if (aa->active == GNUNET_NO) + { + aa->active = GNUNET_YES; + active_addr_count++; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "New bandwidth for peer %s is %u/%u\n", + GNUNET_i2s (&aa->peer), ntohl (aa->assigned_bw_in.value__), + ntohl (aa->assigned_bw_out.value__)); + GAS_scheduling_transmit_address_suggestion (&aa->peer, aa->plugin, aa->addr, + aa->addr_len, aa->session_id, + aa->ats, aa->ats_count, + aa->assigned_bw_out, + aa->assigned_bw_in); + GAS_reservations_set_bandwidth (&aa->peer, aa->assigned_bw_in); + GAS_performance_notify_clients (&aa->peer, aa->plugin, aa->addr, aa->addr_len, + aa->ats, aa->ats_count, aa->assigned_bw_out, + aa->assigned_bw_in); + } + else + { + /* just to be sure... */ + GAS_scheduling_transmit_address_suggestion (peer, aa->plugin, aa->addr, + aa->addr_len, aa->session_id, + aa->ats, aa->ats_count, + aa->assigned_bw_out, + aa->assigned_bw_in); + } + +} + +void request_address_simple (const struct GNUNET_PeerIdentity *peer) +{ + struct ATS_Address *aa; aa = NULL; + + /* Get address with: stick to current address, lower distance, lower latency */ GNUNET_CONTAINER_multihashmap_get_multiple (addresses, &peer->hashPubKey, &find_address_it, &aa); if (aa == NULL) @@ -599,11 +656,15 @@ GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer) "Cannot suggest address for peer `%s'\n", GNUNET_i2s (peer)); return; } + if (aa->active == GNUNET_NO) { aa->active = GNUNET_YES; active_addr_count++; - recalculate_assigned_bw (); + if (ats_mode == SIMPLE) + { + recalculate_assigned_bw (); + } } else { @@ -617,6 +678,20 @@ GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer) } +void +GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer) +{ + if (ats_mode == SIMPLE) + { + request_address_simple (peer); + } + if (ats_mode == MLP) + { + request_address_mlp(peer); + } +} + + // FIXME: this function should likely end up in the LP-subsystem and // not with 'addresses' in the future... void @@ -661,7 +736,6 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg, mlp = GAS_mlp_init (cfg, stats, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS); break; #else - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "MLP mode was configured, but libglpk is not installed, switching to simple mode"); ats_mode = SIMPLE; break;