+static int
+util_it (void *cls,
+ const struct GNUNET_PeerIdentity *key,
+ void *value)
+{
+ struct NeighbourMapEntry *n = value;
+ struct GNUNET_ATS_Information atsi[2];
+ uint32_t bps_in;
+ uint32_t bps_out;
+ struct GNUNET_TIME_Relative delta;
+
+ delta = GNUNET_TIME_absolute_get_difference(n->last_util_transmission, GNUNET_TIME_absolute_get());
+ bps_in = 0;
+ if (0 != n->util_bytes_recv)
+ bps_in = ((1000 * 1000) * n->util_bytes_recv) / (delta.rel_value_us);
+ bps_out = 0;
+ if (0 != n->util_bytes_sent)
+ bps_out = ((1000 * 1000) * n->util_bytes_sent) / (delta.rel_value_us);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "`%s': Bytes sent: %u recv %u in %llu sec.\n",
+ GNUNET_i2s (key), bps_out, bps_in, delta.rel_value_us / (1000 * 1000));
+ atsi[0].type = htonl (GNUNET_ATS_UTILIZATION_UP);
+ atsi[0].value = htonl (bps_out);
+ atsi[1].type = htonl (GNUNET_ATS_UTILIZATION_DOWN);
+ atsi[1].value = htonl (bps_in);
+ GNUNET_ATS_address_update (GST_ats, n->primary_address.address,
+ n->primary_address.session, atsi, 2);
+ n->util_bytes_recv = 0;
+ n->util_bytes_sent = 0;
+ n->last_util_transmission = GNUNET_TIME_absolute_get();
+ return GNUNET_OK;
+}
+
+/**
+ * Task transmitting utilization in a regular interval
+ *
+ * @param cls the 'struct NeighbourMapEntry' for which we are running
+ * @param tc scheduler context (unused)
+ */
+static void
+utilization_transmission (void *cls,
+ const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+ util_transmission_tk = GNUNET_SCHEDULER_NO_TASK;
+
+ if (0 < GNUNET_CONTAINER_multipeermap_size (neighbours))
+ GNUNET_CONTAINER_multipeermap_iterate (neighbours, util_it, NULL);
+
+ util_transmission_tk = GNUNET_SCHEDULER_add_delayed (UTIL_TRANSMISSION_INTERVAL,
+ utilization_transmission, NULL);
+
+}
+
+void
+GST_neighbours_notify_payload (const struct GNUNET_PeerIdentity *peer,
+ const struct GNUNET_HELLO_Address *address,
+ struct Session *session,
+ const struct GNUNET_MessageHeader *message)
+{
+ struct NeighbourMapEntry *n;
+ n = lookup_neighbour (peer);
+ if (NULL == n)
+ {
+ GNUNET_break (0);
+ return;
+ }
+ n->util_bytes_recv += ntohs(message->size);
+}
+