- * @param c the preference client
- * @param p the peer
- * @param kind the preference kind
- * @return the result
- */
-static double
-recalculate_rel_preferences (struct PreferenceClient *c,
- struct PreferencePeer *p,
- enum GNUNET_ATS_PreferenceKind kind)
-{
- struct PreferencePeer *p_cur;
- struct PeerRelative *rp;
- double backup;
- double res;
- double ret;
-
- /* For this client: sum preferences to total preference */
- c->f_abs_sum[kind] = 0;
- for (p_cur = c->p_head; NULL != p_cur; p_cur = p_cur->next)
- c->f_abs_sum[kind] += p_cur->f_abs[kind];
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Client %p has total preference for %s of %.3f\n",
- c->client,
- GNUNET_ATS_print_preference_type (kind),
- c->f_abs_sum[kind]);
-
- ret = DEFAULT_REL_PREFERENCE;
- /* For all peers: calculate relative preference */
- for (p_cur = c->p_head; NULL != p_cur; p_cur = p_cur->next)
- {
- /* Calculate relative preference for specific kind */
- backup = p_cur->f_rel[kind];
- if (DEFAULT_ABS_PREFERENCE == c->f_abs_sum[kind])
- /* No peer has a preference for this property,
- * so set default preference */
- p_cur->f_rel[kind] = DEFAULT_REL_PREFERENCE;
- else
- p_cur->f_rel[kind] = (c->f_abs_sum[kind] + p_cur->f_abs[kind]) /
- c->f_abs_sum[kind];
-
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Client %p: peer `%s' has relative preference for %s of %.3f\n",
- c->client,
- GNUNET_i2s (&p_cur->id),
- GNUNET_ATS_print_preference_type (kind),
- p_cur->f_rel[kind]);
-
- res = 0.0;
- if (p_cur->f_rel[kind] != backup)
- {
- /* Value changed, recalculate */
- res = update_peers (&p_cur->id,kind);
- if (0 == memcmp (&p->id, &p_cur->id, sizeof (struct GNUNET_PeerIdentity)))
- ret = res;
- }
- else
- {
- /* Value did not chang, return old value*/
- GNUNET_assert (NULL != (rp = GNUNET_CONTAINER_multihashmap_get (preference_peers,
- &p->id.hashPubKey)));
- ret = rp->f_rel[kind];
- }
- }
- return ret;
-}
-
-
-/**
- * Update the absolute preference value for a peer
- * @param c the client
- * @param p the peer
- * @param kind the preference kind
- * @param score_abs the absolute value
- * @return the new relative preference value
- */
-static double
-update_preference (struct PreferenceClient *c,
- struct PreferencePeer *p,
- enum GNUNET_ATS_PreferenceKind kind,
- float score_abs)
-{
- double score = score_abs;
-
- /* Update preference value according to type */
- switch (kind) {
- case GNUNET_ATS_PREFERENCE_BANDWIDTH:
- case GNUNET_ATS_PREFERENCE_LATENCY:
- p->f_abs[kind] = (p->f_abs[kind] + score) / 2;
- break;
- case GNUNET_ATS_PREFERENCE_END:
- break;
- default:
- break;
- }
- return recalculate_rel_preferences (c, p, kind);
-}
-
-
-/**
- * Reduce absolute preferences since they got old
- *
- * @param cls the PreferencePeer
- * @param tc context