From 2f40f09726422b092245154cbe30a1cf4389b9fa Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Mon, 20 Feb 2012 21:42:26 +0000 Subject: - latest changes --- src/ats/gnunet-service-ats_addresses.c | 32 +++++++++++++++++++++++------- src/ats/gnunet-service-ats_addresses_mlp.c | 15 +++++++++----- src/ats/gnunet-service-ats_addresses_mlp.h | 9 ++++++++- src/ats/test_ats_mlp.c | 11 +++++----- 4 files changed, 48 insertions(+), 19 deletions(-) diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c index 12eaef113..843394a0f 100644 --- a/src/ats/gnunet-service-ats_addresses.c +++ b/src/ats/gnunet-service-ats_addresses.c @@ -600,23 +600,41 @@ GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer) /* 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) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Cannot suggest address for peer `%s'\n", GNUNET_i2s (peer)); - return; - } } if (ats_mode == MLP) { +#if HAVE_GLPK +#endif /* 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); + } + + 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++; - recalculate_assigned_bw (); + if (ats_mode == SIMPLE) + { + recalculate_assigned_bw (); + } + if (ats_mode == SIMPLE) + { + recalculate_assigned_bw (); + } } else { diff --git a/src/ats/gnunet-service-ats_addresses_mlp.c b/src/ats/gnunet-service-ats_addresses_mlp.c index b84e671f2..1e10370d9 100644 --- a/src/ats/gnunet-service-ats_addresses_mlp.c +++ b/src/ats/gnunet-service-ats_addresses_mlp.c @@ -1553,12 +1553,17 @@ static int mlp_get_preferred_address_it (void *cls, const GNUNET_HashCode * key, void *value) { - struct ATS_Address **aa = (struct ATS_Address **)cls; + struct ATS_PreferedAddress *aa = (struct ATS_PreferedAddress *) cls; struct ATS_Address *addr = value; struct MLP_information *mlpi = addr->mlp_information; if (mlpi->n == GNUNET_YES) { - *aa = addr; + aa->address = addr; + if (mlpi->b > (double) UINT32_MAX) + aa->bandwidth_out = UINT32_MAX; + else + aa->bandwidth_out = (uint32_t) mlpi->b; + aa->bandwidth_in = 0; return GNUNET_NO; } return GNUNET_YES; @@ -1572,14 +1577,14 @@ mlp_get_preferred_address_it (void *cls, const GNUNET_HashCode * key, void *valu * @param peer the peer * @return suggested address */ -struct ATS_Address * +struct ATS_PreferedAddress * GAS_mlp_get_preferred_address (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHashMap * addresses, const struct GNUNET_PeerIdentity *peer) { - struct ATS_Address * aa = NULL; + struct ATS_PreferedAddress * aa = GNUNET_malloc (sizeof (struct ATS_PreferedAddress)); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Getting preferred address for `%s'\n", GNUNET_i2s (peer)); - GNUNET_CONTAINER_multihashmap_get_multiple(addresses, &peer->hashPubKey, mlp_get_preferred_address_it, &aa); + GNUNET_CONTAINER_multihashmap_get_multiple(addresses, &peer->hashPubKey, mlp_get_preferred_address_it, aa); return aa; } diff --git a/src/ats/gnunet-service-ats_addresses_mlp.h b/src/ats/gnunet-service-ats_addresses_mlp.h index 9e7ca0533..1efcbf0e5 100644 --- a/src/ats/gnunet-service-ats_addresses_mlp.h +++ b/src/ats/gnunet-service-ats_addresses_mlp.h @@ -61,6 +61,13 @@ struct ATS_Peer struct ATS_Address *tail; }; +struct ATS_PreferedAddress +{ + uint32_t bandwidth_out; + uint32_t bandwidth_in; + struct ATS_Address *address; +}; + /** * MLP Handle */ @@ -366,7 +373,7 @@ GAS_mlp_address_change_preference (struct GAS_MLP_Handle *mlp, * @param peer the peer * @return suggested address */ -struct ATS_Address * +struct ATS_PreferedAddress * GAS_mlp_get_preferred_address (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHashMap * addresses, const struct GNUNET_PeerIdentity *peer); diff --git a/src/ats/test_ats_mlp.c b/src/ats/test_ats_mlp.c index 8af368c8e..ab8327dd9 100644 --- a/src/ats/test_ats_mlp.c +++ b/src/ats/test_ats_mlp.c @@ -74,7 +74,7 @@ check (void *cls, char *const *args, const char *cfgfile, return; #endif struct ATS_Address addr[10]; - struct ATS_Address *res[10]; + struct ATS_PreferedAddress *res[10]; stats = GNUNET_STATISTICS_create("ats", cfg); @@ -97,8 +97,7 @@ check (void *cls, char *const *args, const char *cfgfile, set_ats (&a1_ats[1], GNUNET_ATS_QUALITY_NET_DELAY, 2); set_ats (&a1_ats[2], GNUNET_ATS_ARRAY_TERMINATOR, 0); create_address (&addr[0], "dummy", 3, &a1_ats[0]); - addr[0].atsp_network_type = GNUNET_ATS_NET_LOOPBACK; - + addr[0].atsp_network_type = GNUNET_ATS_NET_WAN; /* Creating peer 1 address 2 */ addr[1].peer.hashPubKey = p[0].hashPubKey; @@ -116,7 +115,7 @@ check (void *cls, char *const *args, const char *cfgfile, set_ats (&a3_ats[1], GNUNET_ATS_QUALITY_NET_DISTANCE, 1); set_ats (&a3_ats[2], GNUNET_ATS_ARRAY_TERMINATOR, 0); create_address (&addr[2], "dummy3", 3, &a3_ats[0]); - addr[2].atsp_network_type = GNUNET_ATS_NET_WAN; + addr[2].atsp_network_type = GNUNET_ATS_NET_LAN; GNUNET_CONTAINER_multihashmap_put(addresses, &addr[0].peer.hashPubKey, &addr[0], GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); @@ -144,9 +143,9 @@ check (void *cls, char *const *args, const char *cfgfile, GNUNET_assert (GNUNET_OK == GAS_mlp_solve_problem(mlp)); res[0] = GAS_mlp_get_preferred_address(mlp, addresses, &p[0]); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Preferred address `%s' \n",res[0]->plugin); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Preferred address `%s' outbound bandwidth: %u Bps\n",res[0]->address->plugin, res[0]->bandwidth_out); res[1] = GAS_mlp_get_preferred_address(mlp, addresses, &p[1]); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Preferred address `%s' \n",res[1]->plugin); + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Preferred address `%s' outbound bandwidth: %u Bps\n",res[1]->address->plugin, res[1]->bandwidth_out); /* Delete an address */ GNUNET_CONTAINER_multihashmap_remove (addresses, &addr[0].peer.hashPubKey, &addr[0]); -- cgit v1.2.3