control: Add a key to GETINFO to fetch the circuit onion handshake rephist values

This commit is contained in:
Neel Chauhan 2020-05-27 20:40:02 -07:00 committed by David Goulet
parent 8d8a9d7f1d
commit 4477317cbe
4 changed files with 71 additions and 0 deletions

View File

@ -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 }
};

View File

@ -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) */

View File

@ -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)

View File

@ -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);