+ struct GNUNET_STATISTICS_Handle *stat;
+ unsigned int daemon;
+ unsigned int value;
+};
+
+struct StatValues
+{
+ const char *subsystem;
+ const char *name;
+ unsigned long long total;
+};
+
+/**
+ * Statistics we print out.
+ */
+static struct StatValues stats[] = {
+ {"core", "# bytes decrypted", 0},
+ {"core", "# bytes encrypted", 0},
+ {"core", "# type maps received", 0},
+ {"core", "# session keys confirmed via PONG", 0},
+ {"core", "# peers connected", 0},
+ {"core", "# key exchanges initiated", 0},
+ {"core", "# send requests dropped (disconnected)", 0},
+ {"core", "# transmissions delayed due to corking", 0},
+ {"core", "# messages discarded (expired prior to transmission)", 0},
+ {"core", "# messages discarded (disconnected)", 0},
+ {"core", "# discarded CORE_SEND requests", 0},
+ {"core", "# discarded lower priority CORE_SEND requests", 0},
+ {"transport", "# bytes received via TCP", 0},
+ {"transport", "# bytes transmitted via TCP", 0},
+ {"dht", "# PUT messages queued for transmission", 0},
+ {"dht", "# P2P PUT requests received", 0},
+ {"dht", "# GET messages queued for transmission", 0},
+ {"dht", "# P2P GET requests received", 0},
+ {"dht", "# RESULT messages queued for transmission", 0},
+ {"dht", "# P2P RESULTS received", 0},
+ {"dht", "# Queued messages discarded (peer disconnected)", 0},
+ {"dht", "# Peers excluded from routing due to Bloomfilter", 0},
+ {"dht", "# Peer selection failed", 0},
+ {"dht", "# FIND PEER requests ignored due to Bloomfilter", 0},
+ {"dht", "# FIND PEER requests ignored due to lack of HELLO", 0},
+ {"dht", "# P2P FIND PEER requests processed", 0},
+ {"dht", "# P2P GET requests ONLY routed", 0},
+ {"dht", "# Preference updates given to core", 0},
+ {"dht", "# REPLIES ignored for CLIENTS (no match)", 0},
+ {"dht", "# GET requests from clients injected", 0},
+ {"dht", "# GET requests received from clients", 0},
+ {"dht", "# GET STOP requests received from clients", 0},
+ {"dht", "# ITEMS stored in datacache", 0},
+ {"dht", "# Good RESULTS found in datacache", 0},
+ {"dht", "# GET requests given to datacache", 0},
+ {NULL, NULL, 0}
+};
+
+
+/**
+ * Callback function to process statistic values.
+ *
+ * @param cls closure
+ * @param subsystem name of subsystem that created the statistic
+ * @param name the name of the datum
+ * @param value the current value
+ * @param is_persistent GNUNET_YES if the value is persistent, GNUNET_NO if not
+ * @return GNUNET_OK to continue, GNUNET_SYSERR to abort iteration
+ */
+static int
+print_stat (void *cls, const char *subsystem, const char *name, uint64_t value,
+ int is_persistent)
+{
+ struct StatMaster *sm = cls;
+
+ stats[sm->value].total += value;
+ FPRINTF (stderr, "Peer %2u: %12s/%50s = %12llu\n", sm->daemon, subsystem,
+ name, (unsigned long long) value);
+ return GNUNET_OK;