Commit 85a1e6c6 authored by George Kadianakis's avatar George Kadianakis
Browse files

statistics: Properly count all rendezvous cells (avoid undercounting).

tl;dr We were not counting cells flying from the client to the service, but we
were counting cells flying from the service to the client.

When a rendezvous cell arrives from the client to the RP, the RP forwards it to
the service.

For this to happen, the cell first passes through command_process_relay_cell()
which normally does the statistics counting. However because the `rend_circ`
circuit was not flagged with `circuit_carries_hs_traffic_stats` in
rend_mid_rendezvous(), the cell is not counted there.

Then the cell goes to circuit_receive_relay_cell() which has a special code
block based on `rend_splice` specifically for rendezvous cells, and the cell
gets directly passed to `rend_circ` via a direct call to
circuit_receive_relay_cell(). The cell never passes through
command_process_relay_cell() ever again and hence is never counted by our
rephist module.

The fix here is to flag the `rend_circ` circuit with
`circuit_carries_hs_traffic_stats` so that the cell is counted as soon as it
hits command_process_relay_cell().

Furthermore we avoid double-counting cells since the special code block of
circuit_receive_relay_cell() makes us count rendezvous cells only as they enter
the RP and not as they exit it.

Fixes #40117.
parent 53cd1c97
o Major bugfixes (stats, onion services):
- Fix a bug where we were undercounting the Tor network's total onion
service traffic, by only counting rendezvous traffic originating from
services and ignoring any traffic originating from clients. Fixes bug
40117; bugfix on
...@@ -343,10 +343,12 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request, ...@@ -343,10 +343,12 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request,
goto err; goto err;
} }
/* Statistics: Mark this circuit as an RP circuit so that we collect /* Statistics: Mark circuits as RP circuits */
stats from it. */
if (options->HiddenServiceStatistics) { if (options->HiddenServiceStatistics) {
/* `circ` is the RP <-> service circuit */
circ->circuit_carries_hs_traffic_stats = 1; circ->circuit_carries_hs_traffic_stats = 1;
/* `rend_circ` is the client <-> RP circuit */
rend_circ->circuit_carries_hs_traffic_stats = 1;
} }
/* Send the RENDEZVOUS2 cell to the client. */ /* Send the RENDEZVOUS2 cell to the client. */
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment