Record IPv6 bandwidth history as appropriate.

This commit is contained in:
Nick Mathewson 2020-07-10 08:44:46 -04:00
parent a81827d99f
commit 27c5cadf7e
4 changed files with 18 additions and 7 deletions

View File

@ -3366,11 +3366,12 @@ record_num_bytes_transferred_impl(connection_t *conn,
rep_hist_note_or_conn_bytes(conn->global_identifier, num_read, rep_hist_note_or_conn_bytes(conn->global_identifier, num_read,
num_written, now); num_written, now);
const bool is_ipv6 = (conn->socket_family == AF_INET6);
if (num_read > 0) { if (num_read > 0) {
bwhist_note_bytes_read(num_read, now); bwhist_note_bytes_read(num_read, now, is_ipv6);
} }
if (num_written > 0) { if (num_written > 0) {
bwhist_note_bytes_written(num_written, now); bwhist_note_bytes_written(num_written, now, is_ipv6);
} }
if (conn->type == CONN_TYPE_EXIT) if (conn->type == CONN_TYPE_EXIT)
rep_hist_note_exit_bytes(conn->port, num_written, num_read); rep_hist_note_exit_bytes(conn->port, num_written, num_read);

View File

@ -2167,6 +2167,12 @@ circuit_synchronize_written_or_bandwidth(const circuit_t *c,
else else
cell_size = CELL_MAX_NETWORK_SIZE; cell_size = CELL_MAX_NETWORK_SIZE;
/* If we know the channel, find out if it's IPv6. */
tor_addr_t remote_addr;
bool is_ipv6 = chan &&
channel_get_addr_if_possible(chan, &remote_addr) &&
tor_addr_family(&remote_addr) == AF_INET6;
/* The missing written bytes are the cell counts times their cell /* The missing written bytes are the cell counts times their cell
* size plus TLS per cell overhead */ * size plus TLS per cell overhead */
written_sync = cells*(cell_size+TLS_PER_CELL_OVERHEAD); written_sync = cells*(cell_size+TLS_PER_CELL_OVERHEAD);
@ -2174,7 +2180,7 @@ circuit_synchronize_written_or_bandwidth(const circuit_t *c,
/* Report the missing bytes as written, to avoid asymmetry. /* Report the missing bytes as written, to avoid asymmetry.
* We must use time() for consistency with rephist, even though on * We must use time() for consistency with rephist, even though on
* some very old rare platforms, approx_time() may be faster. */ * some very old rare platforms, approx_time() may be faster. */
bwhist_note_bytes_written(written_sync, time(NULL)); bwhist_note_bytes_written(written_sync, time(NULL), is_ipv6);
} }
/** Mark <b>circ</b> to be closed next time we call /** Mark <b>circ</b> to be closed next time we call

View File

@ -205,7 +205,7 @@ bwhist_init(void)
* earlier than the latest <b>when</b> you've heard of. * earlier than the latest <b>when</b> you've heard of.
*/ */
void void
bwhist_note_bytes_written(uint64_t num_bytes, time_t when) bwhist_note_bytes_written(uint64_t num_bytes, time_t when, bool ipv6)
{ {
/* Maybe a circular array for recent seconds, and step to a new point /* Maybe a circular array for recent seconds, and step to a new point
* every time a new second shows up. Or simpler is to just to have * every time a new second shows up. Or simpler is to just to have
@ -216,16 +216,20 @@ bwhist_note_bytes_written(uint64_t num_bytes, time_t when)
* somewhere. See bwhist_bandwidth_assess() below. * somewhere. See bwhist_bandwidth_assess() below.
*/ */
add_obs(write_array, when, num_bytes); add_obs(write_array, when, num_bytes);
if (ipv6)
add_obs(write_array_ipv6, when, num_bytes);
} }
/** Remember that we wrote <b>num_bytes</b> bytes in second <b>when</b>. /** Remember that we wrote <b>num_bytes</b> bytes in second <b>when</b>.
* (like bwhist_note_bytes_written() above) * (like bwhist_note_bytes_written() above)
*/ */
void void
bwhist_note_bytes_read(uint64_t num_bytes, time_t when) bwhist_note_bytes_read(uint64_t num_bytes, time_t when, bool ipv6)
{ {
/* if we're smart, we can make this func and the one above share code */ /* if we're smart, we can make this func and the one above share code */
add_obs(read_array, when, num_bytes); add_obs(read_array, when, num_bytes);
if (ipv6)
add_obs(read_array_ipv6, when, num_bytes);
} }
/** Remember that we wrote <b>num_bytes</b> directory bytes in second /** Remember that we wrote <b>num_bytes</b> directory bytes in second

View File

@ -15,8 +15,8 @@
void bwhist_init(void); void bwhist_init(void);
void bwhist_free_all(void); void bwhist_free_all(void);
void bwhist_note_bytes_read(uint64_t num_bytes, time_t when); void bwhist_note_bytes_read(uint64_t num_bytes, time_t when, bool ipv6);
void bwhist_note_bytes_written(uint64_t num_bytes, time_t when); void bwhist_note_bytes_written(uint64_t num_bytes, time_t when, bool ipv6);
void bwhist_note_dir_bytes_read(uint64_t num_bytes, time_t when); void bwhist_note_dir_bytes_read(uint64_t num_bytes, time_t when);
void bwhist_note_dir_bytes_written(uint64_t num_bytes, time_t when); void bwhist_note_dir_bytes_written(uint64_t num_bytes, time_t when);