+set_feedback_task (void *cls)
+{
+ struct PreferenceGenerator *pg = cls;
+ struct TestPeer *p;
+ double feedback;
+ uint32_t bw_acc_out;
+ uint32_t bw_acc_in;
+ uint32_t delay_acc_in;
+ struct GNUNET_TIME_Relative dur;
+ double p_new;
+
+ pg->feedback_task = NULL;
+
+ if (NULL == (p = find_peer_by_id (pg->peer)))
+ {
+ GNUNET_break (0);
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Setting feedback for unknown peer %u\n", pg->peer);
+ return;
+ }
+
+ switch (pg->kind)
+ {
+ case GNUNET_ATS_PREFERENCE_BANDWIDTH:
+ dur = GNUNET_TIME_absolute_get_duration(pg->feedback_last_bw_update);
+ bw_acc_in = dur.rel_value_us *pg->last_assigned_bw_in + pg->feedback_bw_in_acc;
+ pg->feedback_bw_in_acc = 0;
+
+ bw_acc_out = dur.rel_value_us *pg->last_assigned_bw_out + pg->feedback_bw_out_acc;
+ p_new = get_preference (pg);
+ feedback = (p_new / pg->pref_bw_old) * (bw_acc_in + bw_acc_out) /
+ (2 *GNUNET_TIME_absolute_get_duration(pg->feedback_last).rel_value_us);
+
+ break;
+ case GNUNET_ATS_PREFERENCE_LATENCY:
+ dur = GNUNET_TIME_absolute_get_duration(pg->feedback_last_delay_update);
+ delay_acc_in =dur.rel_value_us *pg->last_delay_value + pg->feedback_delay_acc;
+ pg->feedback_delay_acc = 0;
+
+ p_new = get_preference (pg);
+ feedback = (p_new / pg->pref_latency_old) * (delay_acc_in) /
+ (GNUNET_TIME_absolute_get_duration(pg->feedback_last).rel_value_us);
+
+ break;
+ default:
+ GNUNET_break (0);
+ feedback = 0.0;
+ break;
+ }
+ GNUNET_log(GNUNET_ERROR_TYPE_INFO,
+ "Giving feedback for peer [%u] for client %p pref %s of %.3f\n",
+ pg->peer, NULL + (pg->client_id),
+ GNUNET_ATS_print_preference_type (pg->kind),
+ feedback);
+
+ sh->sf->s_feedback (sh->sf->cls, NULL + (pg->client_id), &p->peer_id,
+ pg->feedback_frequency, pg->kind, feedback);
+ pg->feedback_last = GNUNET_TIME_absolute_get();
+
+
+ pg->feedback_bw_out_acc = 0;
+ pg->feedback_bw_in_acc = 0;
+ pg->feedback_last_bw_update = GNUNET_TIME_absolute_get();
+
+ pg->feedback_delay_acc = 0;
+ pg->feedback_last_delay_update = GNUNET_TIME_absolute_get();
+
+
+ pg->feedback_task = GNUNET_SCHEDULER_add_delayed (pg->feedback_frequency,
+ &set_feedback_task, pg);
+}
+
+
+static void
+set_pref_task (void *cls)