statistics: Properly count all rendezvous cells (avoid undercounting).
commit248cbc2d2207a0bc3374cd18a17cda9d1b8a8ef1
authorGeorge Kadianakis <desnacked@riseup.net>
Mon, 7 Sep 2020 10:17:41 +0000 (7 13:17 +0300)
committerGeorge Kadianakis <desnacked@riseup.net>
Mon, 7 Sep 2020 10:29:44 +0000 (7 13:29 +0300)
tree10dd693cc93a50b04e4ece5114161d6646727d32
parent72484a4953d744754b3b6b025242ef668e3f017a
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.
changes/bug40117 [new file with mode: 0644]
src/feature/rend/rendmid.c