gnunet

Main GNUnet Logic
Log | Files | Refs | Submodules | README | LICENSE

commit 8042ec745551791cdd06aa6f7aec4a766fe0ded3
parent bfa3b153493bc4d15f0be2d3dfa0b77e45065a61
Author: Matthias Wachs <wachs@net.in.tum.de>
Date:   Wed,  3 Jul 2013 13:40:31 +0000

changing solver api: remove address hashmap from functions and pass instead with init


Diffstat:
Msrc/ats/gnunet-service-ats-solver_mlp.c | 70+++++++++++++++++++++++++++++++++-------------------------------------
Msrc/ats/gnunet-service-ats-solver_mlp.h | 40++++++++++++++++++++++++----------------
Msrc/ats/gnunet-service-ats-solver_proportional.c | 157++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Msrc/ats/gnunet-service-ats-solver_proportional.h | 13+++++--------
Msrc/ats/gnunet-service-ats_addresses.c | 32+++++++++++++++++---------------
Msrc/ats/gnunet-service-ats_addresses.h | 22+++++++++++++---------
Msrc/ats/gnunet-service-ats_normalization.c | 1+
Msrc/ats/perf_ats_mlp.c | 29+++++++++++++++++++----------
Msrc/ats/test_ats_api.conf | 2+-
Msrc/ats/test_ats_mlp.c | 31+++++++++++++++++++++----------
Msrc/ats/test_ats_mlp_update.c | 26++++++++++++++++++--------
11 files changed, 244 insertions(+), 179 deletions(-)

diff --git a/src/ats/gnunet-service-ats-solver_mlp.c b/src/ats/gnunet-service-ats-solver_mlp.c @@ -401,7 +401,7 @@ mlp_create_problem_count_addresses_it (void *cls, const struct GNUNET_HashCode * static int mlp_create_problem_count_addresses ( struct GNUNET_CONTAINER_MultiHashMap * peers, - struct GNUNET_CONTAINER_MultiHashMap * addresses) + const struct GNUNET_CONTAINER_MultiHashMap * addresses) { struct CountContext cctx; cctx.peers = peers; @@ -716,7 +716,7 @@ mlp_create_problem_add_invariant_columns (struct GAS_MLP_Handle *mlp, struct MLP * @return GNUNET_OK or GNUNET_SYSERR */ static int -mlp_create_problem (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHashMap * addresses) +mlp_create_problem (struct GAS_MLP_Handle *mlp) { struct MLP_Problem *p = &mlp->p; int res = GNUNET_OK; @@ -731,7 +731,7 @@ mlp_create_problem (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHas p->prob = glp_create_prob (); GNUNET_assert (NULL != p->prob); p->num_peers = GNUNET_CONTAINER_multihashmap_size (mlp->peers); - p->num_addresses = mlp_create_problem_count_addresses (mlp->peers, addresses); + p->num_addresses = mlp_create_problem_count_addresses (mlp->peers, mlp->addresses); /* Create problem matrix: 10 * #addresses + #q * #addresses + #q, + #peer + 2 + 1 */ p->num_elements = (10 * p->num_addresses + mlp->pv.m_q * p->num_addresses + mlp->pv.m_q + p->num_peers + 2 + 1); @@ -766,7 +766,7 @@ mlp_create_problem (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHas mlp_create_problem_add_invariant_rows (mlp, p); /* Adding address dependent columns constraint rows */ - GNUNET_CONTAINER_multihashmap_iterate (addresses, &mlp_create_problem_add_address_information, mlp); + GNUNET_CONTAINER_multihashmap_iterate (mlp->addresses, &mlp_create_problem_add_address_information, mlp); /* Load the matrix */ LOG (GNUNET_ERROR_TYPE_DEBUG, "Loading matrix\n"); @@ -935,11 +935,10 @@ mlp_propagate_results (void *cls, const struct GNUNET_HashCode *key, void *value * Solves the MLP problem * * @param solver the MLP Handle - * @param addresses the address hashmap * @return GNUNET_OK if could be solved, GNUNET_SYSERR on failure */ int -GAS_mlp_solve_problem (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addresses) +GAS_mlp_solve_problem (void *solver) { struct GAS_MLP_Handle *mlp = solver; char *filename; @@ -964,13 +963,12 @@ GAS_mlp_solve_problem (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addr LOG (GNUNET_ERROR_TYPE_DEBUG, "No changes to problem\n"); return GNUNET_OK; } - mlp->addresses = addresses; if (GNUNET_YES == mlp->mlp_prob_changed) { LOG (GNUNET_ERROR_TYPE_DEBUG, "Problem size changed, rebuilding\n"); mlp_delete_problem (mlp); start_build = GNUNET_TIME_absolute_get(); - if (GNUNET_SYSERR == mlp_create_problem (mlp, addresses)) + if (GNUNET_SYSERR == mlp_create_problem (mlp)) return GNUNET_SYSERR; duration_build = GNUNET_TIME_absolute_get_duration (start_build); mlp->control_param_lp.presolve = GLP_YES; @@ -1015,7 +1013,7 @@ GAS_mlp_solve_problem (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addr /* Propagate result*/ if ((GNUNET_OK == res_lp) && (GNUNET_OK == res_mip)) - GNUNET_CONTAINER_multihashmap_iterate (addresses, &mlp_propagate_results, mlp); + GNUNET_CONTAINER_multihashmap_iterate (mlp->addresses, &mlp_propagate_results, mlp); struct GNUNET_TIME_Absolute time = GNUNET_TIME_absolute_get(); if (GNUNET_YES == mlp->write_mip_mps) @@ -1053,7 +1051,6 @@ GAS_mlp_solve_problem (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addr */ void GAS_mlp_address_add (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, struct ATS_Address *address, uint32_t network) { @@ -1064,10 +1061,8 @@ GAS_mlp_address_add (void *solver, int c2; GNUNET_assert (NULL != solver); - GNUNET_assert (NULL != addresses); GNUNET_assert (NULL != address); - mlp->addresses = addresses; if (NULL == address->solver_information) { address->solver_information = GNUNET_malloc (sizeof (struct MLP_information)); @@ -1093,13 +1088,13 @@ GAS_mlp_address_add (void *solver, /* Problem size changed: new address for peer with pending request */ mlp->mlp_prob_changed = GNUNET_YES; if (GNUNET_YES == mlp->mlp_auto_solve) - GAS_mlp_solve_problem (solver, addresses); + GAS_mlp_solve_problem (solver); } static void mlp_update_quality (struct GAS_MLP_Handle *mlp, - struct GNUNET_CONTAINER_MultiHashMap *addresses, + const struct GNUNET_CONTAINER_MultiHashMap *addresses, struct ATS_Address * address, const struct GNUNET_ATS_Information *ats_prev, uint32_t ats_prev_count) { @@ -1272,7 +1267,7 @@ mlp_update_quality (struct GAS_MLP_Handle *mlp, if ((GNUNET_YES == mlp->mlp_prob_changed) && (GNUNET_YES == mlp->mlp_auto_solve)) { - GAS_mlp_solve_problem (mlp, addresses); + GAS_mlp_solve_problem (mlp); return; } @@ -1328,7 +1323,6 @@ mlp_update_quality (struct GAS_MLP_Handle *mlp, */ void GAS_mlp_address_update (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, struct ATS_Address *address, uint32_t prev_session, int prev_in_use, @@ -1340,17 +1334,15 @@ GAS_mlp_address_update (void *solver, struct MLP_information *mlpi = address->solver_information; GNUNET_assert (NULL != solver); - GNUNET_assert (NULL != addresses); GNUNET_assert (NULL != address); GNUNET_assert ((NULL != prev_atsi) || (0 == prev_atsi_count)); - mlp->addresses = addresses; if (NULL == mlpi) { LOG (GNUNET_ERROR_TYPE_ERROR, _("Updating address for peer `%s' not added before\n"), GNUNET_i2s(&address->peer)); return; } - mlp_update_quality (mlp, addresses, address, prev_atsi, prev_atsi_count); + mlp_update_quality (mlp, mlp->addresses, address, prev_atsi, prev_atsi_count); /* Is this peer included in the problem? */ if (NULL == (p = GNUNET_CONTAINER_multihashmap_get (mlp->peers, &address->peer.hashPubKey))) @@ -1364,7 +1356,7 @@ GAS_mlp_address_update (void *solver, mlp->mlp_prob_updated = GNUNET_YES; if (GNUNET_YES == mlp->mlp_auto_solve) - GAS_mlp_solve_problem (solver, addresses); + GAS_mlp_solve_problem (solver); return; } @@ -1381,7 +1373,6 @@ GAS_mlp_address_update (void *solver, */ void GAS_mlp_address_delete (void *solver, - struct GNUNET_CONTAINER_MultiHashMap * addresses, struct ATS_Address *address, int session_only) { @@ -1389,12 +1380,10 @@ GAS_mlp_address_delete (void *solver, struct GAS_MLP_Handle *mlp = solver; struct MLP_information *mlpi; - GNUNET_assert (NULL != solver); - GNUNET_assert (NULL != addresses); + GNUNET_assert (NULL != solver);; GNUNET_assert (NULL != address); mlpi = address->solver_information; - mlp->addresses = addresses; if (NULL != mlpi) { GNUNET_free (mlpi); @@ -1412,7 +1401,7 @@ GAS_mlp_address_delete (void *solver, /* Problem size changed: new address for peer with pending request */ mlp->mlp_prob_changed = GNUNET_YES; if (GNUNET_YES == mlp->mlp_auto_solve) - GAS_mlp_solve_problem (solver, addresses); + GAS_mlp_solve_problem (solver); return; } @@ -1475,7 +1464,6 @@ static double get_peer_pref_value (struct GAS_MLP_Handle *mlp, const struct GNUN */ const struct ATS_Address * GAS_mlp_get_preferred_address (void *solver, - struct GNUNET_CONTAINER_MultiHashMap * addresses, const struct GNUNET_PeerIdentity *peer) { struct GAS_MLP_Handle *mlp = solver; @@ -1483,12 +1471,11 @@ GAS_mlp_get_preferred_address (void *solver, struct ATS_Address *res = NULL; GNUNET_assert (NULL != solver); - GNUNET_assert (NULL != addresses); GNUNET_assert (NULL != peer); LOG (GNUNET_ERROR_TYPE_DEBUG, "Getting preferred address for `%s'\n", GNUNET_i2s (peer)); - mlp->addresses = addresses; + /* Is this peer included in the problem? */ if (NULL == (p = GNUNET_CONTAINER_multihashmap_get (mlp->peers, &peer->hashPubKey))) { @@ -1504,10 +1491,10 @@ GAS_mlp_get_preferred_address (void *solver, mlp->mlp_prob_changed = GNUNET_YES; } if (GNUNET_YES == mlp->mlp_auto_solve) - GAS_mlp_solve_problem (mlp, addresses); + GAS_mlp_solve_problem (mlp); /* Get prefered address */ - GNUNET_CONTAINER_multihashmap_get_multiple (addresses, &peer->hashPubKey, + GNUNET_CONTAINER_multihashmap_get_multiple (mlp->addresses, &peer->hashPubKey, mlp_get_preferred_address_it, res); return res; @@ -1547,7 +1534,7 @@ GAS_mlp_bulk_stop (void *solver) if (0 < s->bulk_request) { - GAS_mlp_solve_problem (solver, s->addresses); + GAS_mlp_solve_problem (solver); s->bulk_request= 0; } } @@ -1563,14 +1550,12 @@ GAS_mlp_bulk_stop (void *solver) */ void GAS_mlp_stop_get_preferred_address (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, const struct GNUNET_PeerIdentity *peer) { struct GAS_MLP_Handle *mlp = solver; struct ATS_Peer *p = NULL; GNUNET_assert (NULL != solver); - GNUNET_assert (NULL != addresses); GNUNET_assert (NULL != peer); if (NULL != (p = GNUNET_CONTAINER_multihashmap_get (mlp->peers, &peer->hashPubKey))) @@ -1592,7 +1577,6 @@ GAS_mlp_stop_get_preferred_address (void *solver, */ void GAS_mlp_address_change_preference (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind, double pref_rel) @@ -1604,7 +1588,6 @@ GAS_mlp_address_change_preference (void *solver, GNUNET_i2s(peer)); GNUNET_STATISTICS_update (mlp->stats,"# LP address preference changes", 1, GNUNET_NO); - mlp->addresses = addresses; /* Update the constraints with changed preferences */ /* Update quality constraint c7 */ @@ -1621,7 +1604,7 @@ GAS_mlp_address_change_preference (void *solver, /* Problem size changed: new address for peer with pending request */ mlp->mlp_prob_updated = GNUNET_YES; if (GNUNET_YES == mlp->mlp_auto_solve) - GAS_mlp_solve_problem (solver, addresses); + GAS_mlp_solve_problem (solver); return; } @@ -1683,6 +1666,7 @@ GAS_mlp_done (void *solver) void * GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_STATISTICS_Handle *stats, + const struct GNUNET_CONTAINER_MultiHashMap *addresses, int *network, unsigned long long *out_dest, unsigned long long *in_dest, @@ -1690,7 +1674,9 @@ GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, GAS_bandwidth_changed_cb bw_changed_cb, void *bw_changed_cb_cls, GAS_get_preferences get_preference, - void *get_preference_cls) + void *get_preference_cls, + GAS_get_properties get_properties, + void *get_properties_cls) { struct GAS_MLP_Handle * mlp = GNUNET_malloc (sizeof (struct GAS_MLP_Handle)); @@ -1707,6 +1693,13 @@ GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, struct GNUNET_TIME_Relative max_duration; long long unsigned int max_iterations; + GNUNET_assert (NULL != cfg); + GNUNET_assert (NULL != stats); + GNUNET_assert (NULL != addresses); + GNUNET_assert (NULL != bw_changed_cb); + GNUNET_assert (NULL != get_preference); + GNUNET_assert (NULL != get_properties); + /* Init GLPK environment */ int res = glp_init_env(); switch (res) { @@ -1892,10 +1885,13 @@ GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, /* Assign options to handle */ mlp->stats = (struct GNUNET_STATISTICS_Handle *) stats; + mlp->addresses = addresses; mlp->bw_changed_cb = bw_changed_cb; mlp->bw_changed_cb_cls = bw_changed_cb_cls; mlp->get_preferences = get_preference; mlp->get_preferences_cls = get_preference_cls; + mlp->get_properties = get_properties; + mlp->get_properties_cls = get_properties_cls; /* Setting MLP Input variables */ mlp->pv.co_D = D; mlp->pv.co_R = R; diff --git a/src/ats/gnunet-service-ats-solver_mlp.h b/src/ats/gnunet-service-ats-solver_mlp.h @@ -90,12 +90,6 @@ struct ATS_Peer /* Legacy preference value */ double f; - -#if 0 - /* Array of quality preferences */ - double f_q[GNUNET_ATS_QualityPropertiesCount]; - -#endif }; @@ -223,7 +217,7 @@ struct GAS_MLP_Handle /** * Address hashmap for lookups */ - struct GNUNET_CONTAINER_MultiHashMap *addresses; + const struct GNUNET_CONTAINER_MultiHashMap *addresses; /** * Addresses' bandwidth changed callback @@ -235,10 +229,28 @@ struct GAS_MLP_Handle */ void *bw_changed_cb_cls; + + + /** + * ATS function to get preferences + */ GAS_get_preferences get_preferences; + /** + * Closure for ATS function to get preferences + */ void *get_preferences_cls; + /** + * ATS function to get properties + */ + GAS_get_properties get_properties; + + /** + * Closure for ATS function to get properties + */ + void *get_properties_cls; + struct MLP_Problem p; struct MLP_Variables pv; @@ -353,11 +365,10 @@ struct MLP_information * Solves the MLP problem * * @param solver the MLP Handle - * @param addresses the address hashmap * @return GNUNET_OK if could be solved, GNUNET_SYSERR on failure */ int -GAS_mlp_solve_problem (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addresses); +GAS_mlp_solve_problem (void *solver); /** @@ -378,6 +389,7 @@ GAS_mlp_solve_problem (void *solver, struct GNUNET_CONTAINER_MultiHashMap * addr void * GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_STATISTICS_Handle *stats, + const struct GNUNET_CONTAINER_MultiHashMap *addresses, int *network, unsigned long long *out_dest, unsigned long long *in_dest, @@ -385,7 +397,9 @@ GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, GAS_bandwidth_changed_cb bw_changed_cb, void *bw_changed_cb_cls, GAS_get_preferences get_preference, - void *get_preference_cls); + void *get_preference_cls, + GAS_get_properties get_properties, + void *get_properties_cls); /** @@ -398,7 +412,6 @@ GAS_mlp_init (const struct GNUNET_CONFIGURATION_Handle *cfg, */ void GAS_mlp_address_add (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, struct ATS_Address *address, uint32_t network); @@ -424,7 +437,6 @@ GAS_mlp_address_add (void *solver, */ void GAS_mlp_address_update (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, struct ATS_Address *address, uint32_t prev_session, int prev_in_use, @@ -445,7 +457,6 @@ GAS_mlp_address_update (void *solver, */ void GAS_mlp_address_delete (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, struct ATS_Address *address, int session_only); @@ -461,7 +472,6 @@ GAS_mlp_address_delete (void *solver, */ void GAS_mlp_address_change_preference (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind, double pref_rel); @@ -493,7 +503,6 @@ GAS_mlp_bulk_stop (void *solver); */ const struct ATS_Address * GAS_mlp_get_preferred_address (void *solver, - struct GNUNET_CONTAINER_MultiHashMap * addresses, const struct GNUNET_PeerIdentity *peer); @@ -507,7 +516,6 @@ GAS_mlp_get_preferred_address (void *solver, void GAS_mlp_stop_get_preferred_address (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, const struct GNUNET_PeerIdentity *peer); diff --git a/src/ats/gnunet-service-ats-solver_proportional.c b/src/ats/gnunet-service-ats-solver_proportional.c @@ -224,6 +224,11 @@ struct GAS_PROPORTIONAL_Handle struct GNUNET_STATISTICS_Handle *stats; /** + * Hashmap containing all valid addresses + */ + const struct GNUNET_CONTAINER_MultiHashMap *addresses; + + /** * Bandwidth changed callback */ GAS_bandwidth_changed_cb bw_changed; @@ -244,6 +249,16 @@ struct GAS_PROPORTIONAL_Handle void *get_preferences_cls; /** + * ATS function to get properties + */ + GAS_get_properties get_properties; + + /** + * Closure for ATS function to get properties + */ + void *get_properties_cls; + + /** * Bulk lock */ int bulk_lock; @@ -551,6 +566,15 @@ distribute_bandwidth_in_network (struct GAS_PROPORTIONAL_Handle *s, static int get_performance_info (struct ATS_Address *address, uint32_t type); + + +struct FindBestAddressCtx +{ + struct GAS_PROPORTIONAL_Handle *s; + struct ATS_Address *best; +}; + + /** * Find a "good" address to use for a peer by iterating over the addresses for this peer. * If we already have an existing address, we stick to it. @@ -564,15 +588,12 @@ get_performance_info (struct ATS_Address *address, uint32_t type); static int find_best_address_it (void *cls, const struct GNUNET_HashCode * key, void *value) { - struct ATS_Address **previous_p = cls; + struct FindBestAddressCtx *fba_ctx = (struct FindBestAddressCtx *) cls; struct ATS_Address *current = (struct ATS_Address *) value; - struct ATS_Address *previous = *previous_p; struct GNUNET_TIME_Absolute now; struct Network *net = (struct Network *) current->solver_information; - uint32_t p_distance_cur; - uint32_t p_distance_prev; - uint32_t p_delay_cur; - uint32_t p_delay_prev; + const double *norm_prop_cur; + const double *norm_prop_prev; now = GNUNET_TIME_absolute_get(); @@ -585,61 +606,57 @@ find_best_address_it (void *cls, const struct GNUNET_HashCode * key, void *value GNUNET_TIME_absolute_get_difference(now, current->blocked_until).rel_value); return GNUNET_OK; } - if (GNUNET_NO == is_bandwidth_available_in_network (net)) return GNUNET_OK; /* There's no bandwidth available in this network */ - - if (NULL != previous) + if (NULL != fba_ctx->best) { - GNUNET_assert (NULL != previous->plugin); + GNUNET_assert (NULL != fba_ctx->best->plugin); GNUNET_assert (NULL != current->plugin); - if (0 == strcmp (previous->plugin, current->plugin)) + if (0 == strcmp (fba_ctx->best->plugin, current->plugin)) { - if ((0 != previous->addr_len) && + if ((0 != fba_ctx->best->addr_len) && (0 == current->addr_len)) { /* saved address was an outbound address, but we have an inbound address */ - *previous_p = current; + fba_ctx->best = current; return GNUNET_OK; } - if (0 == previous->addr_len) + if (0 == fba_ctx->best->addr_len) { /* saved address was an inbound address, so do not overwrite */ return GNUNET_OK; } } } - - if (NULL == previous) + if (NULL == fba_ctx->best) { - *previous_p = current; + fba_ctx->best = current; return GNUNET_OK; } - if ((ntohl (previous->assigned_bw_in.value__) == 0) && + if ((ntohl (fba_ctx->best->assigned_bw_in.value__) == 0) && (ntohl (current->assigned_bw_in.value__) > 0)) { /* stick to existing connection */ - *previous_p = current; + fba_ctx->best = current; return GNUNET_OK; } - p_distance_prev = get_performance_info (previous, GNUNET_ATS_QUALITY_NET_DISTANCE); - p_distance_cur = get_performance_info (current, GNUNET_ATS_QUALITY_NET_DISTANCE); - if ((p_distance_prev != GNUNET_ATS_VALUE_UNDEFINED) && (p_distance_cur != GNUNET_ATS_VALUE_UNDEFINED) && - (p_distance_prev > p_distance_cur)) + norm_prop_cur = fba_ctx->s->get_properties (fba_ctx->s->get_properties_cls, + (const struct ATS_Address *) current); + GNUNET_break (0); + norm_prop_prev = fba_ctx->s->get_properties (fba_ctx->s->get_properties_cls, + (const struct ATS_Address *) fba_ctx->best); + + if (norm_prop_cur[1] < norm_prop_prev[1]) { /* user shorter distance */ - *previous_p = current; + fba_ctx->best = current; return GNUNET_OK; } - - p_delay_prev = get_performance_info (previous, GNUNET_ATS_QUALITY_NET_DELAY); - p_delay_cur = get_performance_info (current, GNUNET_ATS_QUALITY_NET_DELAY); - if ((p_delay_prev != GNUNET_ATS_VALUE_UNDEFINED) && (p_delay_cur != GNUNET_ATS_VALUE_UNDEFINED) && - (p_delay_prev > p_delay_cur)) + if (norm_prop_cur[0] < norm_prop_prev[0]) { - /* user lower latency */ - *previous_p = current; + /* user shorter distance */ + fba_ctx->best = current; return GNUNET_OK; } @@ -857,14 +874,12 @@ get_performance_info (struct ATS_Address *address, uint32_t type) * Changes the preferences for a peer in the problem * * @param solver the solver handle - * @param addresses the address hashmap * @param peer the peer to change the preference for * @param kind the kind to change the preference * @param pref_rel the normalized preference value for this kind over all clients */ void GAS_proportional_address_change_preference (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind, double pref_rel) @@ -876,6 +891,7 @@ GAS_proportional_address_change_preference (void *solver, distribute_bandwidth_in_all_networks (s); } + /** * Get the preferred address for a specific peer * @@ -885,41 +901,44 @@ GAS_proportional_address_change_preference (void *solver, */ const struct ATS_Address * GAS_proportional_get_preferred_address (void *solver, - struct GNUNET_CONTAINER_MultiHashMap * addresses, const struct GNUNET_PeerIdentity *peer) { struct GAS_PROPORTIONAL_Handle *s = solver; struct Network *net_prev; struct Network *net_cur; - struct ATS_Address *cur; struct ATS_Address *prev; + struct FindBestAddressCtx fba_ctx; GNUNET_assert (s != NULL); - cur = NULL; + GNUNET_assert (peer != NULL); + /* Get address with: stick to current address, lower distance, lower latency */ - GNUNET_CONTAINER_multihashmap_get_multiple (addresses, &peer->hashPubKey, - &find_best_address_it, &cur); - if (NULL == cur) + fba_ctx.s = s; + fba_ctx.best = NULL; + GNUNET_break (0); + GNUNET_CONTAINER_multihashmap_get_multiple (s->addresses, &peer->hashPubKey, + &find_best_address_it, &fba_ctx); + if (NULL == fba_ctx.best) { LOG (GNUNET_ERROR_TYPE_DEBUG, "Cannot suggest address for peer `%s'\n", GNUNET_i2s (peer)); return NULL; } LOG (GNUNET_ERROR_TYPE_DEBUG, "Suggesting %s address %p for peer `%s'\n", - (GNUNET_NO == cur->active) ? "inactive" : "active", - cur, GNUNET_i2s (peer)); - net_cur = (struct Network *) cur->solver_information; - if (NULL == cur) + (GNUNET_NO == fba_ctx.best->active) ? "inactive" : "active", + fba_ctx.best, GNUNET_i2s (peer)); + net_cur = (struct Network *) fba_ctx.best->solver_information; + if (NULL == fba_ctx.best) { LOG (GNUNET_ERROR_TYPE_ERROR, "Trying to suggesting unknown address peer `%s'\n", GNUNET_i2s (peer)); GNUNET_break (0); return NULL; } - if (GNUNET_YES == cur->active) + if (GNUNET_YES == fba_ctx.best->active) { /* This address was selected previously, so no need to update quotas */ - return cur; + return fba_ctx.best; } /* This address was not active, so we have to: @@ -929,7 +948,7 @@ GAS_proportional_get_preferred_address (void *solver, * - update quota for this address network */ - prev = get_active_address (s, addresses, peer); + prev = get_active_address (s, (struct GNUNET_CONTAINER_MultiHashMap *) s->addresses, peer); if (NULL != prev) { net_prev = (struct Network *) prev->solver_information; @@ -942,16 +961,16 @@ GAS_proportional_get_preferred_address (void *solver, distribute_bandwidth_in_network (s, net_prev, NULL); } - if (GNUNET_NO == (is_bandwidth_available_in_network (cur->solver_information))) + if (GNUNET_NO == (is_bandwidth_available_in_network (fba_ctx.best->solver_information))) { GNUNET_break (0); /* This should never happen*/ return NULL; } - cur->active = GNUNET_YES; + fba_ctx.best->active = GNUNET_YES; addresse_increment(s, net_cur, GNUNET_NO, GNUNET_YES); - distribute_bandwidth_in_network (s, net_cur, cur); - return cur; + distribute_bandwidth_in_network (s, net_cur, fba_ctx.best); + return fba_ctx.best; } @@ -964,7 +983,6 @@ GAS_proportional_get_preferred_address (void *solver, */ void GAS_proportional_stop_get_preferred_address (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, const struct GNUNET_PeerIdentity *peer) { return; @@ -981,8 +999,8 @@ GAS_proportional_stop_get_preferred_address (void *solver, */ void GAS_proportional_address_delete (void *solver, - struct GNUNET_CONTAINER_MultiHashMap * addresses, - struct ATS_Address *address, int session_only) + struct ATS_Address *address, + int session_only) { struct GAS_PROPORTIONAL_Handle *s = solver; struct Network *net; @@ -1090,15 +1108,13 @@ GAS_proportional_bulk_stop (void *solver) * Add a new single address to a network * * @param solver the solver Handle - * @param addresses the address hashmap containing all addresses * @param address the address to add * @param network network type of this address */ void GAS_proportional_address_add (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, - struct ATS_Address *address, - uint32_t network); + struct ATS_Address *address, + uint32_t network); /** * Updates a single address in the solver and checks previous values @@ -1113,7 +1129,6 @@ GAS_proportional_address_add (void *solver, */ void GAS_proportional_address_update (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, struct ATS_Address *address, uint32_t session, int in_use, @@ -1163,7 +1178,7 @@ GAS_proportional_address_update (void *solver, save_active = address->active; /* remove from old network */ - GAS_proportional_address_delete (solver, addresses, address, GNUNET_NO); + GAS_proportional_address_delete (solver, address, GNUNET_NO); /* set new network type */ new_net = get_network (solver, addr_net); @@ -1180,7 +1195,7 @@ GAS_proportional_address_update (void *solver, address->solver_information = new_net; /* Add to new network and update*/ - GAS_proportional_address_add (solver, addresses, address, addr_net); + GAS_proportional_address_add (solver, address, addr_net); if (GNUNET_YES == save_active) { /* check if bandwidth available in new network */ @@ -1201,7 +1216,7 @@ GAS_proportional_address_update (void *solver, s->bw_changed (s->bw_changed_cls, address); /* Find new address to suggest since no bandwidth in network*/ - new = (struct ATS_Address *) GAS_proportional_get_preferred_address (s, addresses, &address->peer); + new = (struct ATS_Address *) GAS_proportional_get_preferred_address (s, &address->peer); if (NULL != new) { /* Have an alternative address to suggest */ @@ -1248,9 +1263,8 @@ GAS_proportional_address_update (void *solver, */ void GAS_proportional_address_add (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, - struct ATS_Address *address, - uint32_t network) + struct ATS_Address *address, + uint32_t network) { struct GAS_PROPORTIONAL_Handle *s = solver; struct Network *net = NULL; @@ -1293,6 +1307,7 @@ GAS_proportional_address_add (void *solver, * * @param cfg configuration handle * @param stats the GNUNET_STATISTICS handle + * @param addresses hashmap containing all addresses * @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 @@ -1306,6 +1321,7 @@ GAS_proportional_address_add (void *solver, void * GAS_proportional_init (const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_STATISTICS_Handle *stats, + const struct GNUNET_CONTAINER_MultiHashMap *addresses, int *network, unsigned long long *out_quota, unsigned long long *in_quota, @@ -1313,24 +1329,35 @@ GAS_proportional_init (const struct GNUNET_CONFIGURATION_Handle *cfg, GAS_bandwidth_changed_cb bw_changed_cb, void *bw_changed_cb_cls, GAS_get_preferences get_preference, - void *get_preference_cls) + void *get_preference_cls, + GAS_get_properties get_properties, + void *get_properties_cls) { int c; struct GAS_PROPORTIONAL_Handle *s = GNUNET_malloc (sizeof (struct GAS_PROPORTIONAL_Handle)); struct Network * cur; char * net_str[GNUNET_ATS_NetworkTypeCount] = GNUNET_ATS_NetworkTypeString; + GNUNET_assert (NULL != cfg); + GNUNET_assert (NULL != stats); + GNUNET_assert (NULL != network); + GNUNET_assert (NULL != bw_changed_cb); + GNUNET_assert (NULL != get_preference); + GNUNET_assert (NULL != get_properties); s->stats = (struct GNUNET_STATISTICS_Handle *) stats; s->bw_changed = bw_changed_cb; s->bw_changed_cls = bw_changed_cb_cls; s->get_preferences = get_preference; s->get_preferences_cls = get_preference_cls; + s->get_properties = get_properties; + s->get_properties_cls = get_properties_cls; s->networks = dest_length; s->network_entries = GNUNET_malloc (dest_length * sizeof (struct Network)); s->active_addresses = 0; s->total_addresses = 0; s->bulk_lock = GNUNET_NO; + s->addresses = addresses; for (c = 0; c < dest_length; c++) { diff --git a/src/ats/gnunet-service-ats-solver_proportional.h b/src/ats/gnunet-service-ats-solver_proportional.h @@ -45,7 +45,6 @@ */ void GAS_proportional_address_change_preference (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind, double pref_rel); @@ -68,6 +67,7 @@ GAS_proportional_address_change_preference (void *solver, * @param cfg configuration handle * @param stats the GNUNET_STATISTICS handle * @param network array of GNUNET_ATS_NetworkType with length dest_length + * @param addresses hashmap containing all addresses * @param out_quota array of outbound quotas * @param in_quota array of outbound quota * @param dest_length array length for quota arrays @@ -80,6 +80,7 @@ GAS_proportional_address_change_preference (void *solver, void * GAS_proportional_init (const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_STATISTICS_Handle *stats, + const struct GNUNET_CONTAINER_MultiHashMap *addresses, int *network, unsigned long long *out_quota, unsigned long long *in_quota, @@ -87,8 +88,9 @@ GAS_proportional_init (const struct GNUNET_CONFIGURATION_Handle *cfg, GAS_bandwidth_changed_cb bw_changed_cb, void *bw_changed_cb_cls, GAS_get_preferences get_preference, - void *get_preference_cls); - + void *get_preference_cls, + GAS_get_properties get_properties, + void *get_properties_cls); /** * Shutdown the proportional problem solver @@ -109,7 +111,6 @@ GAS_proportional_done (void * solver); */ void GAS_proportional_address_add (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, struct ATS_Address *address, uint32_t network); @@ -127,7 +128,6 @@ GAS_proportional_address_add (void *solver, */ void GAS_proportional_address_update (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, struct ATS_Address *address, uint32_t session, int in_use, @@ -145,7 +145,6 @@ GAS_proportional_address_update (void *solver, */ void GAS_proportional_address_delete (void *solver, - struct GNUNET_CONTAINER_MultiHashMap * addresses, struct ATS_Address *address, int session_only); @@ -173,7 +172,6 @@ GAS_proportional_bulk_stop (void *solver); */ void GAS_proportional_stop_get_preferred_address (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, const struct GNUNET_PeerIdentity *peer); @@ -186,7 +184,6 @@ GAS_proportional_stop_get_preferred_address (void *solver, */ const struct ATS_Address * GAS_proportional_get_preferred_address (void *solver, - struct GNUNET_CONTAINER_MultiHashMap * addresses, const struct GNUNET_PeerIdentity *peer); /* end of gnunet-service-ats-solver_proportional.c */ diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c @@ -822,7 +822,7 @@ GAS_addresses_add (struct GAS_Addresses_Handle *handle, handle->s_bulk_start (handle->solver); GAS_normalization_normalize_property (handle->addresses, aa, atsi, atsi_count); handle->s_bulk_stop (handle->solver); - handle->s_add (handle->solver, handle->addresses, aa, addr_net); + handle->s_add (handle->solver, aa, addr_net); /* Notify performance clients about new address */ GAS_performance_notify_all_clients (&aa->peer, aa->plugin, @@ -868,7 +868,7 @@ GAS_addresses_add (struct GAS_Addresses_Handle *handle, handle->s_bulk_start (handle->solver); GAS_normalization_normalize_property (handle->addresses, ea, atsi, atsi_count); handle->s_bulk_stop (handle->solver); - handle->s_update (handle->solver, handle->addresses, ea, session_id, ea->used, atsi_delta, atsi_delta_count); + handle->s_update (handle->solver, ea, session_id, ea->used, atsi_delta, atsi_delta_count); GNUNET_free_non_null (atsi_delta); /* Do the update */ @@ -957,7 +957,7 @@ GAS_addresses_update (struct GAS_Addresses_Handle *handle, handle->s_bulk_stop (handle->solver); /* Tell solver about update */ - handle->s_update (handle->solver, handle->addresses, aa, prev_session, aa->used, atsi_delta, atsi_delta_count); + handle->s_update (handle->solver, aa, prev_session, aa->used, atsi_delta, atsi_delta_count); GNUNET_free_non_null (atsi_delta); } @@ -1013,7 +1013,7 @@ destroy_by_session_id (void *cls, const struct GNUNET_HashCode * key, void *valu GNUNET_i2s (&aa->peer), aa->session_id, aa); /* Notify solver about deletion */ - handle->s_del (handle->solver, handle->addresses, aa, GNUNET_NO); + handle->s_del (handle->solver, aa, GNUNET_NO); destroy_address (handle, aa); dc->result = GNUNET_NO; return GNUNET_OK; /* Continue iteration */ @@ -1043,7 +1043,7 @@ destroy_by_session_id (void *cls, const struct GNUNET_HashCode * key, void *valu GNUNET_i2s (&aa->peer), aa->plugin, aa->session_id); /* Notify solver about deletion */ - handle->s_del (handle->solver, handle->addresses, aa, GNUNET_NO); + handle->s_del (handle->solver, aa, GNUNET_NO); destroy_address (handle, aa); dc->result = GNUNET_NO; return GNUNET_OK; /* Continue iteration */ @@ -1055,7 +1055,7 @@ destroy_by_session_id (void *cls, const struct GNUNET_HashCode * key, void *valu "Deleting session for peer `%s': `%s' %u\n", GNUNET_i2s (&aa->peer), aa->plugin, aa->session_id); /* Notify solver to delete session */ - handle->s_del (handle->solver, handle->addresses, aa, GNUNET_YES); + handle->s_del (handle->solver, aa, GNUNET_YES); aa->session_id = 0; return GNUNET_OK; } @@ -1180,7 +1180,7 @@ GAS_addresses_in_use (struct GAS_Addresses_Handle *handle, /* Tell solver about update */ prev_inuse = ea->used; ea->used = in_use; - handle->s_update (handle->solver, handle->addresses, ea, session_id, prev_inuse, NULL, 0); + handle->s_update (handle->solver, ea, session_id, prev_inuse, NULL, 0); return GNUNET_OK; @@ -1215,7 +1215,7 @@ GAS_addresses_request_address_cancel (struct GAS_Addresses_Handle *handle, "No address requests pending for peer `%s', cannot remove!\n", GNUNET_i2s (peer)); return; } - handle->s_get_stop (handle->solver, handle->addresses, peer); + handle->s_get_stop (handle->solver, peer); GAS_addresses_handle_backoff_reset (handle, peer); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Removed request pending for peer `%s\n", GNUNET_i2s (peer)); @@ -1258,7 +1258,7 @@ GAS_addresses_request_address (struct GAS_Addresses_Handle *handle, } /* Get prefered address from solver */ - aa = (struct ATS_Address *) handle->s_get (handle->solver, handle->addresses, peer); + aa = (struct ATS_Address *) handle->s_get (handle->solver, peer); if (NULL == aa) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -1351,7 +1351,7 @@ normalized_preference_changed_cb (void *cls, GNUNET_assert (NULL != cls); struct GAS_Addresses_Handle *handle = cls; /* Tell solver about update */ - handle->s_pref (handle->solver, handle->addresses, peer, kind, pref_rel); + handle->s_pref (handle->solver, peer, kind, pref_rel); } @@ -1403,9 +1403,9 @@ get_preferences_cb (void *cls, const struct GNUNET_PeerIdentity *id) * @return array of double values with |GNUNET_ATS_QualityPropertiesCount| elements */ const double * -get_property_cb (void *cls, struct ATS_Address *address) +get_property_cb (void *cls, const struct ATS_Address *address) { - return GAS_normalization_get_properties (address); + return GAS_normalization_get_properties ((struct ATS_Address *) address); } /** @@ -1681,6 +1681,7 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg, ah->s_bulk_stop = &GAS_mlp_bulk_stop; ah->s_done = &GAS_mlp_done; #else + GNUNET_free (ah); return NULL; #endif @@ -1720,10 +1721,11 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg, &normalized_property_changed_cb, ah); quota_count = load_quotas(cfg, quotas_in, quotas_out, GNUNET_ATS_NetworkTypeCount); - ah->solver = ah->s_init (cfg, stats, + ah->solver = ah->s_init (cfg, stats, ah->addresses, quotas, quotas_in, quotas_out, quota_count, &bandwidth_changed_cb, ah, - &get_preferences_cb, NULL); + &get_preferences_cb, NULL, + &get_property_cb, NULL); if (NULL == ah->solver) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to initialize solver!\n"); @@ -1750,7 +1752,7 @@ free_address_it (void *cls, const struct GNUNET_HashCode * key, void *value) { struct GAS_Addresses_Handle *handle = cls; struct ATS_Address *aa = value; - handle->s_del (handle->solver, handle->addresses, aa, GNUNET_NO); + handle->s_del (handle->solver, aa, GNUNET_NO); destroy_address (handle, aa); return GNUNET_OK; } diff --git a/src/ats/gnunet-service-ats_addresses.h b/src/ats/gnunet-service-ats_addresses.h @@ -365,6 +365,11 @@ typedef const double * (*GAS_get_preferences) (void *cls, const struct GNUNET_PeerIdentity *id); +typedef const double * + (*GAS_get_properties) (void *cls, const struct ATS_Address *address); + + + /* * Solver API * ---------- @@ -372,6 +377,7 @@ typedef const double * /** * Init the simplistic problem solving component + *==32673== by 0x40571F: GAS_addresses_request_address (gnunet-service-ats_addresses.c:1261) * * Quotas: * network[i] contains the network type as type GNUNET_ATS_NetworkType[i] @@ -386,6 +392,7 @@ typedef const double * * * @param cfg configuration handle * @param stats the GNUNET_STATISTICS handle + * @param addresses hashmap containing all addresses * @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 @@ -395,6 +402,7 @@ typedef const double * typedef void * (*GAS_solver_init) (const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_STATISTICS_Handle *stats, + const struct GNUNET_CONTAINER_MultiHashMap *addresses, int *network, unsigned long long *out_quota, unsigned long long *in_quota, @@ -402,7 +410,9 @@ typedef void * GAS_bandwidth_changed_cb bw_changed_cb, void *bw_changed_cb_cls, GAS_get_preferences get_preference, - void *get_preference_cls); + void *get_preference_cls, + GAS_get_properties get_properties, + void *get_properties_cls); /** @@ -417,7 +427,6 @@ typedef void * */ typedef void (*GAS_solver_address_change_preference) (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind, double pref_rel); @@ -438,9 +447,8 @@ typedef void */ typedef void (*GAS_solver_address_add) (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, - struct ATS_Address *address, - uint32_t network); + struct ATS_Address *address, + uint32_t network); /** @@ -453,7 +461,6 @@ typedef void */ typedef void (*GAS_solver_address_delete) (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, struct ATS_Address *address, int session_only); @@ -471,7 +478,6 @@ typedef void */ typedef void (*GAS_solver_address_update) (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, struct ATS_Address *address, uint32_t prev_session, int in_use, @@ -488,7 +494,6 @@ typedef void */ typedef const struct ATS_Address * (*GAS_solver_get_preferred_address) (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, const struct GNUNET_PeerIdentity *peer); @@ -501,7 +506,6 @@ typedef const struct ATS_Address * */ typedef void (*GAS_solver_stop_get_preferred_address) (void *solver, - struct GNUNET_CONTAINER_MultiHashMap *addresses, const struct GNUNET_PeerIdentity *peer); /** diff --git a/src/ats/gnunet-service-ats_normalization.c b/src/ats/gnunet-service-ats_normalization.c @@ -534,6 +534,7 @@ GAS_normalization_get_properties (struct ATS_Address *address) else norm_values[i] = DEFAULT_REL_QUALITY; } + GNUNET_break (0); return norm_values; } diff --git a/src/ats/perf_ats_mlp.c b/src/ats/perf_ats_mlp.c @@ -150,6 +150,12 @@ normalized_property_changed_cb (void *cls, /* TODO */ } +const double * +get_property_cb (void *cls, const struct ATS_Address *address) +{ + return GAS_normalization_get_properties ((struct ATS_Address *) address); +} + static const double * get_preferences_cb (void *cls, const struct GNUNET_PeerIdentity *id) @@ -184,7 +190,7 @@ address_initial_update (void *solver, struct GNUNET_CONTAINER_MultiHashMap * add ats[1].type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE); ats[1].value = htonl (GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK, 10)); - GAS_mlp_address_update (mlp, addresses, address, 0, GNUNET_YES, ats, 2); + GAS_mlp_address_update (mlp, address, 0, GNUNET_YES, ats, 2); } @@ -215,7 +221,7 @@ update_single_addresses (struct ATS_Address *cur) default: break; } - GAS_mlp_address_update (mlp, addresses, cur, 0, GNUNET_YES, ats, 1); + GAS_mlp_address_update (mlp, cur, 0, GNUNET_YES, ats, 1); } static void @@ -314,8 +320,11 @@ check (void *cls, char *const *args, const char *cfgfile, addresses = GNUNET_CONTAINER_multihashmap_create (N_address, GNUNET_NO); /* Init MLP solver */ - mlp = GAS_mlp_init (cfg, stats, quotas, quotas_out, quotas_in, - GNUNET_ATS_NetworkTypeCount, &bandwidth_changed_cb, NULL, &get_preferences_cb, NULL); + mlp = GAS_mlp_init (cfg, stats, addresses, + quotas, quotas_out, quotas_in, + GNUNET_ATS_NetworkTypeCount, &bandwidth_changed_cb, NULL, + &get_preferences_cb, NULL, + &get_property_cb, NULL); if (NULL == mlp) { GNUNET_break (0); @@ -338,16 +347,16 @@ check (void *cls, char *const *args, const char *cfgfile, { cur_addr = perf_create_address(cp, ca); /* add address */ - GAS_mlp_address_add (mlp, addresses, cur_addr, GNUNET_ATS_NET_UNSPECIFIED); + GAS_mlp_address_add (mlp, cur_addr, GNUNET_ATS_NET_UNSPECIFIED); address_initial_update (mlp, addresses, cur_addr); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding address for peer %u address %u: \n", cp, ca); } - GAS_mlp_get_preferred_address( mlp, addresses, &peers[cp].id); + GAS_mlp_get_preferred_address( mlp, &peers[cp].id); /* solve */ if (cp + 1 >= N_peers_start) { /* Solve the full problem */ - GAS_mlp_solve_problem (mlp, addresses); + GAS_mlp_solve_problem (mlp); full_lp_res = mlp->ps.lp_res; full_mip_res = mlp->ps.mip_res; full_lp_presolv = mlp->ps.lp_presolv; @@ -361,8 +370,8 @@ check (void *cls, char *const *args, const char *cfgfile, { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Updating problem with %u peers and %u addresses\n", cp + 1, ca); update_addresses (cp + 1, ca, opt_update_quantity); - GAS_mlp_solve_problem (mlp, addresses); - GAS_mlp_solve_problem (mlp, addresses); + GAS_mlp_solve_problem (mlp); + GAS_mlp_solve_problem (mlp); update_lp_res = mlp->ps.lp_res; update_mip_res = mlp->ps.mip_res; update_lp_presolv = mlp->ps.lp_presolv; @@ -418,7 +427,7 @@ check (void *cls, char *const *args, const char *cfgfile, { for (cur = peers[cp].head; cur != NULL; cur = next) { - GAS_mlp_address_delete (mlp, addresses, cur, GNUNET_NO); + GAS_mlp_address_delete (mlp, cur, GNUNET_NO); next = cur->next; GNUNET_CONTAINER_DLL_remove (peers[cp].head, peers[cp].tail, cur); GNUNET_free (cur); diff --git a/src/ats/test_ats_api.conf b/src/ats/test_ats_api.conf @@ -7,7 +7,7 @@ DEFAULTSERVICES = ats UNIXPATH = /tmp/test-ats-scheduling-arm.sock [ats] -#PREFIX = valgrind --leak-check=full --track-origins=yes --num-callers=25 +PREFIX = valgrind --leak-check=full --track-origins=yes --num-callers=25 AUTOSTART = YES PORT = 12002 HOSTNAME = localhost diff --git a/src/ats/test_ats_mlp.c b/src/ats/test_ats_mlp.c @@ -75,7 +75,7 @@ int addr_it (void *cls, void *value) { struct ATS_Address *address = (struct ATS_Address *) value; - GAS_mlp_address_delete (mlp, addresses, address, GNUNET_NO); + GAS_mlp_address_delete (mlp, address, GNUNET_NO); GNUNET_CONTAINER_multihashmap_remove (addresses, key, value); GNUNET_free (address); return GNUNET_OK; @@ -133,6 +133,13 @@ get_preferences_cb (void *cls, const struct GNUNET_PeerIdentity *id) return GAS_normalization_get_preferences (id); } +const double * +get_property_cb (void *cls, const struct ATS_Address *address) +{ + return GAS_normalization_get_properties ((struct ATS_Address *) address); +} + + static void normalized_property_changed_cb (void *cls, const struct ATS_Address *peer, @@ -214,8 +221,12 @@ check (void *cls, char *const *args, const char *cfgfile, addresses = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO); /* Init MLP solver */ - mlp = GAS_mlp_init (cfg, stats, quotas, quotas_out, quotas_in, - GNUNET_ATS_NetworkTypeCount, &bandwidth_changed_cb, NULL, &get_preferences_cb, NULL); + mlp = GAS_mlp_init (cfg, stats, addresses, + quotas, quotas_out, quotas_in, + GNUNET_ATS_NetworkTypeCount, + &bandwidth_changed_cb, NULL, + &get_preferences_cb, NULL, + &get_property_cb, NULL); if (NULL == mlp) { GNUNET_break (0); @@ -251,7 +262,7 @@ check (void *cls, char *const *args, const char *cfgfile, GNUNET_CONTAINER_multihashmap_put (addresses, &p[0].hashPubKey, address[0], GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); /* Adding address 0 */ - GAS_mlp_address_add (mlp, addresses, address[0], GNUNET_ATS_NET_UNSPECIFIED); + GAS_mlp_address_add (mlp, address[0], GNUNET_ATS_NET_UNSPECIFIED); /* Create address 1 */ address[1] = create_address (&p[0], "test_plugin1", "test_addr1", strlen("test_addr1")+1, 0); @@ -264,7 +275,7 @@ check (void *cls, char *const *args, const char *cfgfile, GNUNET_CONTAINER_multihashmap_put (addresses, &p[0].hashPubKey, address[1], GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); /* Adding address 1*/ - GAS_mlp_address_add (mlp, addresses, address[1], GNUNET_ATS_NET_UNSPECIFIED); + GAS_mlp_address_add (mlp, address[1], GNUNET_ATS_NET_UNSPECIFIED); /* Create address 3 */ @@ -278,22 +289,22 @@ check (void *cls, char *const *args, const char *cfgfile, GNUNET_CONTAINER_multihashmap_put (addresses, &p[1].hashPubKey, address[2], GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); /* Adding address 3*/ - GAS_mlp_address_add (mlp, addresses, address[2], GNUNET_ATS_NET_UNSPECIFIED); + GAS_mlp_address_add (mlp, address[2], GNUNET_ATS_NET_UNSPECIFIED); /* Updating address 0*/ ats.type = htonl (GNUNET_ATS_NETWORK_TYPE); ats.value = htonl (GNUNET_ATS_NET_WAN); - GAS_mlp_address_update (mlp, addresses, address[0], 1, GNUNET_NO, &ats, 1); + GAS_mlp_address_update (mlp, address[0], 1, GNUNET_NO, &ats, 1); /* Retrieving preferred address for peer and wait for callback */ - GAS_mlp_get_preferred_address (mlp, addresses, &p[0]); - GAS_mlp_get_preferred_address (mlp, addresses, &p[1]); + GAS_mlp_get_preferred_address (mlp, &p[0]); + GAS_mlp_get_preferred_address (mlp, &p[1]); mlp->write_mip_mps = GNUNET_NO; mlp->write_mip_sol = GNUNET_NO; - GAS_mlp_solve_problem (mlp, addresses); + GAS_mlp_solve_problem (mlp); } diff --git a/src/ats/test_ats_mlp_update.c b/src/ats/test_ats_mlp_update.c @@ -81,7 +81,7 @@ int addr_it (void *cls, void *value) { struct ATS_Address *address = (struct ATS_Address *) value; - GAS_mlp_address_delete (mlp, addresses, address, GNUNET_NO); + GAS_mlp_address_delete (mlp, address, GNUNET_NO); GNUNET_CONTAINER_multihashmap_remove (addresses, key, value); GNUNET_free (address); return GNUNET_OK; @@ -139,6 +139,12 @@ get_preferences_cb (void *cls, const struct GNUNET_PeerIdentity *id) return GAS_normalization_get_preferences (id); } +const double * +get_property_cb (void *cls, const struct ATS_Address *address) +{ + return GAS_normalization_get_properties ((struct ATS_Address *) address); +} + static void normalized_property_changed_cb (void *cls, const struct ATS_Address *peer, @@ -210,8 +216,12 @@ check (void *cls, char *const *args, const char *cfgfile, addresses = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO); /* Init MLP solver */ - mlp = GAS_mlp_init (cfg, stats, quotas, quotas_out, quotas_in, - GNUNET_ATS_NetworkTypeCount, &bandwidth_changed_cb, NULL, &get_preferences_cb, NULL); + mlp = GAS_mlp_init (cfg, stats, addresses, + quotas, quotas_out, quotas_in, + GNUNET_ATS_NetworkTypeCount, + &bandwidth_changed_cb, NULL, + &get_preferences_cb, NULL, + &get_property_cb, NULL); if (NULL == mlp) { GNUNET_break (0); @@ -239,13 +249,13 @@ check (void *cls, char *const *args, const char *cfgfile, GNUNET_CONTAINER_multihashmap_put (addresses, &p[0].hashPubKey, address[0], GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); /* Adding address 0 */ - GAS_mlp_address_add (mlp, addresses, address[0], GNUNET_ATS_NET_UNSPECIFIED); + GAS_mlp_address_add (mlp, address[0], GNUNET_ATS_NET_UNSPECIFIED); /* Retrieving preferred address for peer and wait for callback */ - GAS_mlp_get_preferred_address (mlp, addresses, &p[0]); + GAS_mlp_get_preferred_address (mlp, &p[0]); /* Solve problem to build matrix */ - GAS_mlp_solve_problem (mlp, addresses); + GAS_mlp_solve_problem (mlp); address[0]->atsi = ats; address[0]->atsi_count = 4; @@ -268,10 +278,10 @@ check (void *cls, char *const *args, const char *cfgfile, ats_prev[3].type = htonl (GNUNET_ATS_ARRAY_TERMINATOR); ats_prev[3].value = htonl (GNUNET_ATS_VALUE_UNDEFINED); - GAS_mlp_address_update (mlp, addresses, address[0], 1, GNUNET_NO, ats_prev, 4); + GAS_mlp_address_update (mlp, address[0], 1, GNUNET_NO, ats_prev, 4); /* Solve problem to build matrix */ - GAS_mlp_solve_problem (mlp, addresses); + GAS_mlp_solve_problem (mlp); }