[tor-commits] [tor/master] control: Add a key to GETINFO to fetch the circuit onion handshake rephist values

dgoulet at torproject.org dgoulet at torproject.org
Wed Jul 1 16:35:33 UTC 2020


commit 4477317cbec059eefb4b86b88efa16f3a5ba7e52
Author: Neel Chauhan <neel at neelc.org>
Date:   Wed May 27 20:40:02 2020 -0700

    control: Add a key to GETINFO to fetch the circuit onion handshake rephist values
---
 src/feature/control/control_getinfo.c | 44 +++++++++++++++++++++++++++++++++++
 src/feature/control/control_getinfo.h |  4 ++++
 src/feature/stats/rephist.c           | 20 ++++++++++++++++
 src/feature/stats/rephist.h           |  3 +++
 4 files changed, 71 insertions(+)

diff --git a/src/feature/control/control_getinfo.c b/src/feature/control/control_getinfo.c
index b2d0c9680..23f8a6124 100644
--- a/src/feature/control/control_getinfo.c
+++ b/src/feature/control/control_getinfo.c
@@ -51,6 +51,7 @@
 #include "feature/rend/rendcache.h"
 #include "feature/stats/geoip_stats.h"
 #include "feature/stats/predict_ports.h"
+#include "feature/stats/rephist.h"
 #include "lib/version/torversion.h"
 #include "lib/encoding/kvline.h"
 
@@ -1436,6 +1437,39 @@ getinfo_helper_liveness(control_connection_t *control_conn,
   return 0;
 }
 
+/** Implementation helper for GETINFO: answers queries about circuit onion
+ * handshake rephist values */
+STATIC int
+getinfo_helper_rephist(control_connection_t *control_conn,
+                       const char *question, char **answer,
+                       const char **errmsg)
+{
+  (void) control_conn;
+  (void) errmsg;
+  int result;
+
+  if (!strcmp(question, "stats/ntor/assigned")) {
+    result =
+      rep_hist_get_circuit_handshake_assigned(ONION_HANDSHAKE_TYPE_NTOR);
+  } else if (!strcmp(question, "stats/ntor/requested")) {
+    result =
+      rep_hist_get_circuit_handshake_requested(ONION_HANDSHAKE_TYPE_NTOR);
+  } else if (!strcmp(question, "stats/tap/assigned")) {
+    result =
+      rep_hist_get_circuit_handshake_assigned(ONION_HANDSHAKE_TYPE_TAP);
+  } else if (!strcmp(question, "stats/tap/requested")) {
+    result =
+      rep_hist_get_circuit_handshake_requested(ONION_HANDSHAKE_TYPE_TAP);
+  } else {
+    *errmsg = "Unrecognized handshake type";
+    return -1;
+  }
+
+  tor_asprintf(answer, "%d", result);
+
+  return 0;
+}
+
 /** Implementation helper for GETINFO: answers queries about shared random
  * value. */
 static int
@@ -1660,6 +1694,16 @@ static const getinfo_item_t getinfo_items[] = {
        "Onion services detached from the control connection."),
   ITEM("sr/current", sr, "Get current shared random value."),
   ITEM("sr/previous", sr, "Get previous shared random value."),
+  PREFIX("stats/ntor/", rephist, "NTor circuit handshake stats."),
+  ITEM("stats/ntor/assigned", rephist,
+       "Assigned NTor circuit handshake stats."),
+  ITEM("stats/ntor/requested", rephist,
+       "Requested NTor circuit handshake stats."),
+  PREFIX("stats/tap/", rephist, "TAP circuit handshake stats."),
+  ITEM("stats/tap/assigned", rephist,
+       "Assigned TAP circuit handshake stats."),
+  ITEM("stats/tap/requested", rephist,
+       "Requested TAP circuit handshake stats."),
   { NULL, NULL, NULL, 0 }
 };
 
diff --git a/src/feature/control/control_getinfo.h b/src/feature/control/control_getinfo.h
index 0ada49258..f61d63244 100644
--- a/src/feature/control/control_getinfo.h
+++ b/src/feature/control/control_getinfo.h
@@ -60,6 +60,10 @@ STATIC int getinfo_helper_current_time(
     control_connection_t *control_conn,
     const char *question, char **answer,
     const char **errmsg);
+STATIC int getinfo_helper_rephist(
+    control_connection_t *control_conn,
+    const char *question, char **answer,
+    const char **errmsg);
 #endif /* defined(CONTROL_GETINFO_PRIVATE) */
 
 #endif /* !defined(TOR_CONTROL_GETINFO_H) */
diff --git a/src/feature/stats/rephist.c b/src/feature/stats/rephist.c
index 71e2e0008..d4826cd1a 100644
--- a/src/feature/stats/rephist.c
+++ b/src/feature/stats/rephist.c
@@ -2455,6 +2455,26 @@ rep_hist_note_circuit_handshake_assigned(uint16_t type)
     onion_handshakes_assigned[type]++;
 }
 
+/** Get the circuit handshake value that is requested. */
+MOCK_IMPL(int,
+rep_hist_get_circuit_handshake_requested, (uint16_t type))
+{
+  if (BUG(type > MAX_ONION_HANDSHAKE_TYPE)) {
+    return 0;
+  }
+  return onion_handshakes_requested[type];
+}
+
+/** Get the circuit handshake value that is assigned. */
+MOCK_IMPL(int,
+rep_hist_get_circuit_handshake_assigned, (uint16_t type))
+{
+  if (BUG(type > MAX_ONION_HANDSHAKE_TYPE)) {
+    return 0;
+  }
+  return onion_handshakes_assigned[type];
+}
+
 /** Log our onionskin statistics since the last time we were called. */
 void
 rep_hist_log_circuit_handshake_stats(time_t now)
diff --git a/src/feature/stats/rephist.h b/src/feature/stats/rephist.h
index 92c3d2a5a..d08b8833c 100644
--- a/src/feature/stats/rephist.h
+++ b/src/feature/stats/rephist.h
@@ -77,6 +77,9 @@ void rep_hist_note_circuit_handshake_requested(uint16_t type);
 void rep_hist_note_circuit_handshake_assigned(uint16_t type);
 void rep_hist_log_circuit_handshake_stats(time_t now);
 
+MOCK_DECL(int, rep_hist_get_circuit_handshake_requested, (uint16_t type));
+MOCK_DECL(int, rep_hist_get_circuit_handshake_assigned, (uint16_t type));
+
 void rep_hist_hs_stats_init(time_t now);
 void rep_hist_hs_stats_term(void);
 time_t rep_hist_hs_stats_write(time_t now);





More information about the tor-commits mailing list