commit 4eb6bd1f6824d21fa561d0c608d8688b80e8275b
parent e49f1df8421210cfcc285bdfd7d9bb89e5c8fea0
Author: Matthias Wachs <wachs@net.in.tum.de>
Date: Tue, 18 Jun 2013 07:28:42 +0000
changes
Diffstat:
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 ();