aboutsummaryrefslogtreecommitdiff
path: root/src/core/or/circuitpadding.c
diff options
context:
space:
mode:
authorMike Perry <mikeperry-git@torproject.org>2019-05-11 03:26:53 +0000
committerMike Perry <mikeperry-git@torproject.org>2019-05-15 04:57:11 +0000
commit1c46790e0d3d6c722a0f3e74f24d60d03650e7d8 (patch)
treee61986ce41509bc4f7cb17ec5d544102fe1ea3b0 /src/core/or/circuitpadding.c
parent010779176bb959c8106a95806ede2c80b4397f60 (diff)
downloadtor-1c46790e0d3d6c722a0f3e74f24d60d03650e7d8.tar.gz
tor-1c46790e0d3d6c722a0f3e74f24d60d03650e7d8.zip
Bug 29085: Refactor padding sent accounting out of callback.
This commit moves code that updates the state length and padding limit counts out from the callback to its own function, for clarity. It does not change functionality.
Diffstat (limited to 'src/core/or/circuitpadding.c')
-rw-r--r--src/core/or/circuitpadding.c73
1 files changed, 45 insertions, 28 deletions
diff --git a/src/core/or/circuitpadding.c b/src/core/or/circuitpadding.c
index 1386bd22c8..d6a79004f5 100644
--- a/src/core/or/circuitpadding.c
+++ b/src/core/or/circuitpadding.c
@@ -831,6 +831,50 @@ check_machine_token_supply(circpad_machine_runtime_t *mi)
}
/**
+ * Count that a padding packet was sent.
+ *
+ * This updates our state length count, our machine rate limit counts,
+ * and if token removal is used, decrements the histogram.
+ */
+static inline void
+circpad_machine_count_padding_sent(circpad_machine_runtime_t *mi)
+{
+ /* If we have a valid state length bound, consider it */
+ if (mi->state_length != CIRCPAD_STATE_LENGTH_INFINITE &&
+ !BUG(mi->state_length <= 0)) {
+ mi->state_length--;
+ }
+
+ /*
+ * Update non-padding counts for rate limiting: We scale at UINT16_MAX
+ * because we only use this for a percentile limit of 2 sig figs, and
+ * space is scare in the machineinfo struct.
+ */
+ mi->padding_sent++;
+ if (mi->padding_sent == UINT16_MAX) {
+ mi->padding_sent /= 2;
+ mi->nonpadding_sent /= 2;
+ }
+
+ circpad_global_padding_sent++;
+
+ /* If we have a mutable histogram, reduce the token count from
+ * the chosen padding bin (this assumes we always send padding
+ * when we intended to). */
+ if (mi->histogram && mi->histogram_len) {
+ /* Ensure that we have a token removal strategy set */
+ const circpad_state_t *state = circpad_machine_current_state(mi);
+ tor_assert_nonfatal(state->token_removal != CIRCPAD_TOKEN_REMOVAL_NONE);
+
+ /* Basic sanity check on the histogram before removing anything */
+ if (!BUG(mi->chosen_bin >= mi->histogram_len) &&
+ !BUG(mi->histogram[mi->chosen_bin] == 0)) {
+ mi->histogram[mi->chosen_bin]--;
+ }
+ }
+}
+
+/**
* Count a nonpadding packet as being sent.
*
* This function updates our overhead accounting variables, as well
@@ -1023,34 +1067,7 @@ circpad_send_padding_cell_for_callback(circpad_machine_runtime_t *mi)
return CIRCPAD_STATE_CHANGED;
}
- /* If it's a histogram, reduce the token count */
- if (mi->histogram && mi->histogram_len) {
- /* Basic sanity check on the histogram before removing anything */
- if (BUG(mi->chosen_bin >= mi->histogram_len) ||
- BUG(mi->histogram[mi->chosen_bin] == 0)) {
- return CIRCPAD_STATE_CHANGED;
- }
-
- mi->histogram[mi->chosen_bin]--;
- }
-
- /* If we have a valid state length bound, consider it */
- if (mi->state_length != CIRCPAD_STATE_LENGTH_INFINITE &&
- !BUG(mi->state_length <= 0)) {
- mi->state_length--;
- }
-
- /*
- * Update non-padding counts for rate limiting: We scale at UINT16_MAX
- * because we only use this for a percentile limit of 2 sig figs, and
- * space is scare in the machineinfo struct.
- */
- mi->padding_sent++;
- if (mi->padding_sent == UINT16_MAX) {
- mi->padding_sent /= 2;
- mi->nonpadding_sent /= 2;
- }
- circpad_global_padding_sent++;
+ circpad_machine_count_padding_sent(mi);
if (CIRCUIT_IS_ORIGIN(mi->on_circ)) {
circpad_send_command_to_hop(TO_ORIGIN_CIRCUIT(mi->on_circ),