diff --git a/changes/ticket29113 b/changes/ticket29113 new file mode 100644 index 0000000000..b883999f5b --- /dev/null +++ b/changes/ticket29113 @@ -0,0 +1,3 @@ + o Minor features (heartbeat): + - Include the total number of inbound and outbound IPv4 and IPv6 + connections in the heartbeat message . Closes ticket 29113. diff --git a/src/core/mainloop/connection.c b/src/core/mainloop/connection.c index b89a4ae796..2b926a076c 100644 --- a/src/core/mainloop/connection.c +++ b/src/core/mainloop/connection.c @@ -82,6 +82,7 @@ #include "core/or/policies.h" #include "core/or/reasons.h" #include "core/or/relay.h" +#include "core/or/status.h" #include "core/or/crypt_path.h" #include "core/proto/proto_haproxy.h" #include "core/proto/proto_http.h" @@ -2042,6 +2043,9 @@ connection_handle_listener_read(connection_t *conn, int new_type) connection_mark_for_close(newconn); return 0; } + + note_connection(true /* inbound */, conn->socket_family); + return 0; } @@ -2213,6 +2217,8 @@ connection_connect_sockaddr,(connection_t *conn, } } + note_connection(false /* outbound */, conn->socket_family); + /* it succeeded. we're connected. */ log_fn(inprogress ? LOG_DEBUG : LOG_INFO, LD_NET, "Connection to socket %s (sock "TOR_SOCKET_T_FORMAT").", diff --git a/src/core/or/status.c b/src/core/or/status.c index ed8448883c..00a88a3178 100644 --- a/src/core/or/status.c +++ b/src/core/or/status.c @@ -113,6 +113,41 @@ log_onion_service_stats(void) hs_stats_get_n_rendezvous_launches()); } +/** + * @name connection counts for heartbeat + * + * Tracks incoming and outgoing connections on IPv4/IPv6, for heartbeat + * logs. + **/ +/**@{*/ +static unsigned n_incoming_ipv4; +static unsigned n_incoming_ipv6; +static unsigned n_outgoing_ipv4; +static unsigned n_outgoing_ipv6; +/**@}*/ + +/** + * Note that a connection has arrived or has been made, for use in the + * heartbeat message. + **/ +void +note_connection(bool inbound, int family) +{ + if (family == AF_INET) { + if (inbound) { + ++n_incoming_ipv4; + } else { + ++n_outgoing_ipv4; + } + } else if (family == AF_INET6) { + if (inbound) { + ++n_incoming_ipv6; + } else { + ++n_outgoing_ipv6; + } + } +} + /** Log a "heartbeat" message describing Tor's status and history so that the * user can know that there is indeed a running Tor. Return 0 on success and * -1 on failure. */ @@ -143,8 +178,12 @@ log_heartbeat(time_t now) bw_sent = bytes_to_usage(get_bytes_written()); log_fn(LOG_NOTICE, LD_HEARTBEAT, "Heartbeat: Tor's uptime is %s, with %d " - "circuits open. I've sent %s and received %s.%s", + "circuits open. I've sent %s and received %s. I've received %u " + "connections on IPv4 and %u on IPv6. I've made %u connections " + "with IPv4 and %u with IPv6.%s", uptime, count_circuits(), bw_sent, bw_rcvd, + n_incoming_ipv4, n_incoming_ipv6, + n_outgoing_ipv4, n_outgoing_ipv6, hibernating?" We are currently hibernating.":""); dirclient_dump_total_dls(); diff --git a/src/core/or/status.h b/src/core/or/status.h index 639f8cdf51..271e0dbc9a 100644 --- a/src/core/or/status.h +++ b/src/core/or/status.h @@ -11,6 +11,7 @@ #include "lib/testsupport/testsupport.h" +void note_connection(bool inbound, int family); int log_heartbeat(time_t now); #ifdef STATUS_PRIVATE diff --git a/src/test/test_status.c b/src/test/test_status.c index 0edc729b00..b938b86326 100644 --- a/src/test/test_status.c +++ b/src/test/test_status.c @@ -347,7 +347,9 @@ test_status_hb_not_in_consensus(void *arg) "not in the cached consensus.\n"); expect_log_msg("Heartbeat: Tor's uptime is 0:00 hours, " "with 0 circuits open. " - "I've sent 0 kB and received 0 kB.\n"); + "I've sent 0 kB and received 0 kB. " + "I've received 0 connections on IPv4 and 0 on IPv6. " + "I've made 0 connections with IPv4 and 0 with IPv6.\n"); expect_log_msg("Average packaged cell fullness: 100.000%. " "TLS write overhead: 0%\n"); expect_log_msg("Circuit handshake stats since last time: 1/1 TAP, " @@ -462,6 +464,8 @@ test_status_hb_simple(void *arg) expect_log_msg("Heartbeat: Tor's uptime is 0:00 hours, " "with 0 circuits open. " "I've sent 0 kB and received 0 kB. " + "I've received 0 connections on IPv4 and 0 on IPv6. " + "I've made 0 connections with IPv4 and 0 with IPv6. " "We are currently hibernating.\n"); done: @@ -581,7 +585,10 @@ test_status_hb_calls_log_accounting(void *arg) expect_log_msg("Heartbeat: Tor's uptime is 0:00 hours, " "with 0 circuits open. " - "I've sent 0 kB and received 0 kB.\n"); + "I've sent 0 kB and received 0 kB. " + "I've received 0 connections on IPv4 and 0 on IPv6. " + "I've made 0 connections with IPv4 and 0 with IPv6.\n"); + expect_log_msg_containing("Heartbeat: Accounting enabled. Sent: 0 kB, " "Received: 0 kB, Used: 0 kB / 0 kB, Rule: max. " "The current accounting interval ends on "); @@ -727,7 +734,9 @@ test_status_hb_packaged_cell_fullness(void *arg) tt_int_op(actual, OP_EQ, expected); expect_log_msg("Heartbeat: Tor's uptime is 0:00 hours, " "with 0 circuits open. " - "I've sent 0 kB and received 0 kB.\n"); + "I've sent 0 kB and received 0 kB. " + "I've received 0 connections on IPv4 and 0 on IPv6. " + "I've made 0 connections with IPv4 and 0 with IPv6.\n"); expect_log_msg("Average packaged cell fullness: 50.000%. " "TLS write overhead: 0%\n"); @@ -850,7 +859,9 @@ test_status_hb_tls_write_overhead(void *arg) tt_int_op(actual, OP_EQ, expected); expect_log_msg("Heartbeat: Tor's uptime is 0:00 hours, " "with 0 circuits open. " - "I've sent 0 kB and received 0 kB.\n"); + "I've sent 0 kB and received 0 kB. " + "I've received 0 connections on IPv4 and 0 on IPv6. " + "I've made 0 connections with IPv4 and 0 with IPv6.\n"); expect_log_msg("Average packaged cell fullness: 100.000%. " "TLS write overhead: 100%\n");