gnunet

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

commit 4eb6bd1f6824d21fa561d0c608d8688b80e8275b
parent e49f1df8421210cfcc285bdfd7d9bb89e5c8fea0
Author: Matthias Wachs <wachs@net.in.tum.de>
Date:   Tue, 18 Jun 2013 07:28:42 +0000

changes


Diffstat:
Msrc/ats/gnunet-service-ats-solver_proportional.c | 65+++++++++++++++++++++++++----------------------------------------
Msrc/ats/gnunet-service-ats-solver_proportional.h | 2+-
Msrc/ats/gnunet-service-ats_addresses.c | 16+++++++++-------
Msrc/ats/gnunet-service-ats_addresses.h | 8++++----
Msrc/ats/gnunet-service-ats_addresses_mlp.c | 28+++++++++++++++++-----------
Msrc/ats/gnunet-service-ats_addresses_mlp.h | 4++--
Msrc/ats/gnunet-service-ats_normalization.c | 6++++--
Msrc/ats/gnunet-service-ats_normalization.h | 5+++--
8 files changed, 65 insertions(+), 69 deletions(-)

diff --git a/src/ats/gnunet-service-ats-solver_proportional.c b/src/ats/gnunet-service-ats-solver_proportional.c @@ -432,24 +432,18 @@ distribute_bandwidth_in_network (struct GAS_PROPORTIONAL_Handle *s, { if (GNUNET_YES == cur->addr->active) { - t = GAS_normalization_get_preferences (&cur->addr->peer); - if (NULL == t) - { - total_prefs += DEFAULT_REL_PREFERENCE; - } - else - { - peer_prefs = 0.0; - for (c = 0; c < GNUNET_ATS_PreferenceCount; c++) - { - if (c != GNUNET_ATS_PREFERENCE_END) - { - //fprintf (stderr, "VALUE[%u] %s %.3f \n", c, GNUNET_i2s (&cur->addr->peer), t[c]); - peer_prefs += t[c]; - } - } - total_prefs += (peer_prefs / (GNUNET_ATS_PreferenceCount -1)); - } + GNUNET_assert (NULL != (t = GAS_normalization_get_preferences (&cur->addr->peer))); + + peer_prefs = 0.0; + for (c = 0; c < GNUNET_ATS_PreferenceCount; c++) + { + if (c != GNUNET_ATS_PREFERENCE_END) + { + //fprintf (stderr, "VALUE[%u] %s %.3f \n", c, GNUNET_i2s (&cur->addr->peer), t[c]); + peer_prefs += t[c]; + } + } + total_prefs += (peer_prefs / (GNUNET_ATS_PreferenceCount -1)); } } for (cur = net->head; NULL != cur; cur = cur->next) @@ -457,20 +451,14 @@ distribute_bandwidth_in_network (struct GAS_PROPORTIONAL_Handle *s, if (GNUNET_YES == cur->addr->active) { cur_pref = 0.0; - t = GAS_normalization_get_preferences (&cur->addr->peer); - if (NULL != t) - { - for (c = 0; c < GNUNET_ATS_PreferenceCount; c++) - { - if (c != GNUNET_ATS_PREFERENCE_END) - cur_pref += t[c]; - } - cur_pref /= 2; - } - else - { - cur_pref = DEFAULT_REL_PREFERENCE; - } + GNUNET_assert (NULL != (t = GAS_normalization_get_preferences (&cur->addr->peer))); + + for (c = 0; c < GNUNET_ATS_PreferenceCount; c++) + { + if (c != GNUNET_ATS_PREFERENCE_END) + cur_pref += t[c]; + } + cur_pref /= 2; assigned_quota_in = min_bw + ((cur_pref / total_prefs) * remaining_quota_in); assigned_quota_out = min_bw + ((cur_pref / total_prefs) * remaining_quota_out); @@ -851,19 +839,16 @@ get_performance_info (struct ATS_Address *address, uint32_t type) * @param score the score */ void -GAS_proportional_address_change_preference (void *solver, - void *client, - const struct GNUNET_PeerIdentity *peer, - enum GNUNET_ATS_PreferenceKind kind, - double pref_rel) +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) { struct GAS_PROPORTIONAL_Handle *s = solver; GNUNET_assert (NULL != solver); - GNUNET_assert (NULL != client); GNUNET_assert (NULL != peer); - distribute_bandwidth_in_all_networks (s); - } /** diff --git a/src/ats/gnunet-service-ats-solver_proportional.h b/src/ats/gnunet-service-ats-solver_proportional.h @@ -46,7 +46,7 @@ */ void GAS_proportional_address_change_preference (void *solver, - void *client, + struct GNUNET_CONTAINER_MultiHashMap *addresses, const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind, double pref_rel); diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c @@ -1296,11 +1296,15 @@ GAS_addresses_handle_backoff_reset (struct GAS_Addresses_Handle *handle, } static void -normalized_preference_changed_cb (const struct GNUNET_PeerIdentity *peer, +normalized_preference_changed_cb (void *cls, + const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind, double pref_rel) { - GNUNET_break (0); + 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); } @@ -1320,7 +1324,6 @@ GAS_addresses_change_preference (struct GAS_Addresses_Handle *handle, enum GNUNET_ATS_PreferenceKind kind, float score_abs) { - double pref_rel; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' for peer `%s' for client %p\n", "CHANGE PREFERENCE", @@ -1338,9 +1341,8 @@ GAS_addresses_change_preference (struct GAS_Addresses_Handle *handle, GNUNET_i2s (peer), client); return; } - pref_rel = GAS_normalization_change_preference (client, peer, kind, score_abs); - /* Tell solver about update */ - handle->s_pref (handle->solver, client, peer, kind, pref_rel); + /* Tell normalization about change, normalization will call callback if preference changed */ + GAS_normalization_change_preference (client, peer, kind, score_abs); } @@ -1605,7 +1607,7 @@ GAS_addresses_init (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_assert (NULL != ah->s_del); GNUNET_assert (NULL != ah->s_done); - GAS_normalization_start (&normalized_preference_changed_cb); + GAS_normalization_start (&normalized_preference_changed_cb, ah); 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, &bandwidth_changed_cb, ah); diff --git a/src/ats/gnunet-service-ats_addresses.h b/src/ats/gnunet-service-ats_addresses.h @@ -404,10 +404,10 @@ typedef void * */ typedef void (*GAS_solver_address_change_preference) (void *solver, - void *client, - const struct GNUNET_PeerIdentity *peer, - enum GNUNET_ATS_PreferenceKind kind, - double pref_rel); + struct GNUNET_CONTAINER_MultiHashMap *addresses, + const struct GNUNET_PeerIdentity *peer, + enum GNUNET_ATS_PreferenceKind kind, + double pref_rel); /** * Add a single address within a network to the solver diff --git a/src/ats/gnunet-service-ats_addresses_mlp.c b/src/ats/gnunet-service-ats_addresses_mlp.c @@ -619,7 +619,10 @@ mlp_create_problem_add_address_information (void *cls, const struct GNUNET_HashC /* c 7) Optimize quality */ /* For all quality metrics, set quality of this address */ for (c = 0; c < mlp->pv.m_q; c++) - mlp_create_problem_set_value (p, p->r_q[c], mlpi->c_b, mlpi->q_averaged[c], __LINE__); + { + + mlp_create_problem_set_value (p, p->r_q[c], mlpi->c_b, mlpi->q_averaged[c], __LINE__); + } return GNUNET_OK; } @@ -763,7 +766,7 @@ mlp_create_problem (struct GAS_MLP_Handle *mlp, struct GNUNET_CONTAINER_MultiHas /* Adding address independent constraint rows */ mlp_create_problem_add_invariant_rows (mlp, p); - /* Adding address independent constraint rows */ + /* Adding address dependent columns constraint rows */ GNUNET_CONTAINER_multihashmap_iterate (addresses, &mlp_create_problem_add_address_information, mlp); /* Load the matrix */ @@ -1521,24 +1524,27 @@ GAS_mlp_stop_get_preferred_address (void *solver, */ void GAS_mlp_address_change_preference (void *solver, - void *client, + struct GNUNET_CONTAINER_MultiHashMap *addresses, const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind, double pref_rel) { - //struct GAS_MLP_Handle *mlp = solver; - + struct GAS_MLP_Handle *mlp = solver; LOG (GNUNET_ERROR_TYPE_DEBUG, "Changing preference for address for peer `%s'\n", GNUNET_i2s(peer)); - return; -#if 0 GNUNET_STATISTICS_update (mlp->stats,"# LP address preference changes", 1, GNUNET_NO); - //struct ATS_Peer *p = mlp_find_peer (mlp, peer); - //FIXME to finish implementation - /* Here we have to do the matching */ -#endif + /* Update the constraints with changed preferences */ + /* Update quality constraint c7 */ + + /* Update relativity constraint c8 */ + + /* 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); + return; } diff --git a/src/ats/gnunet-service-ats_addresses_mlp.h b/src/ats/gnunet-service-ats_addresses_mlp.h @@ -436,10 +436,10 @@ GAS_mlp_address_delete (void *solver, */ void GAS_mlp_address_change_preference (void *solver, - void *client, + struct GNUNET_CONTAINER_MultiHashMap *addresses, const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind, - double pref_rel); + double pref_rel); /** diff --git a/src/ats/gnunet-service-ats_normalization.c b/src/ats/gnunet-service-ats_normalization.c @@ -130,6 +130,7 @@ struct PeerRelative }; GAS_Normalization_preference_changed_cb pref_changed_cb; +void *pref_changed_cb_cls; struct GNUNET_CONTAINER_MultiHashMap *peers; struct PreferenceClient *pc_head; struct PreferenceClient *pc_tail; @@ -192,7 +193,7 @@ update_peers (struct GNUNET_PeerIdentity *id, if ((backup != rp->f_rel[kind]) && (NULL != pref_changed_cb)) { - pref_changed_cb (&rp->id, kind, rp->f_rel[kind]); + pref_changed_cb (pref_changed_cb_cls, &rp->id, kind, rp->f_rel[kind]); } return rp->f_rel[kind]; @@ -431,11 +432,12 @@ GAS_normalization_get_preferences (struct GNUNET_PeerIdentity *id) void -GAS_normalization_start (GAS_Normalization_preference_changed_cb pref_ch_cb) +GAS_normalization_start (GAS_Normalization_preference_changed_cb pref_ch_cb, void *pref_ch_cb_cls) { int i; peers = GNUNET_CONTAINER_multihashmap_create(10, GNUNET_NO); pref_changed_cb = pref_ch_cb; + pref_changed_cb_cls = pref_ch_cb_cls; for (i = 0; i < GNUNET_ATS_PreferenceCount; i++) defvalues.f_rel[i] = DEFAULT_REL_PREFERENCE; return; diff --git a/src/ats/gnunet-service-ats_normalization.h b/src/ats/gnunet-service-ats_normalization.h @@ -35,7 +35,8 @@ typedef void -(*GAS_Normalization_preference_changed_cb) (const struct GNUNET_PeerIdentity *peer, +(*GAS_Normalization_preference_changed_cb) (void *cls, + const struct GNUNET_PeerIdentity *peer, enum GNUNET_ATS_PreferenceKind kind, double pref_rel); @@ -64,7 +65,7 @@ GAS_normalization_change_preference (void *src, float score_abs); void -GAS_normalization_start (GAS_Normalization_preference_changed_cb pref_ch_cb); +GAS_normalization_start (GAS_Normalization_preference_changed_cb pref_ch_cb, void *pref_ch_cb_cls); void GAS_normalization_stop ();