diff options
author | Mike Perry <mikeperry-git@torproject.org> | 2019-05-16 18:41:21 +0000 |
---|---|---|
committer | Mike Perry <mikeperry-git@torproject.org> | 2019-05-16 19:21:14 +0000 |
commit | f237fed7466e84e6b6399fe5c7cb80bd59e3e2d8 (patch) | |
tree | 8362ca2f24cd9d9389a6c285146384009128f5ea /src/core | |
parent | 42ea3a416e649eddf4bf9a0dee88a8b4fdbbef20 (diff) | |
download | tor-f237fed7466e84e6b6399fe5c7cb80bd59e3e2d8.tar.gz tor-f237fed7466e84e6b6399fe5c7cb80bd59e3e2d8.zip |
Refactor intro machines, stage 1/2: Move state transition code.
This just moves the state transition directives into the proper client/relay
side functions. It also allows us to remove some dead-code from the client
side (since the client doesn't send padding).
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/or/circuitpadding_machines.c | 91 |
1 files changed, 44 insertions, 47 deletions
diff --git a/src/core/or/circuitpadding_machines.c b/src/core/or/circuitpadding_machines.c index c096822899..4256a7be4a 100644 --- a/src/core/or/circuitpadding_machines.c +++ b/src/core/or/circuitpadding_machines.c @@ -57,49 +57,6 @@ #include "core/or/circuitpadding_machines.h" #include "core/or/circuitpadding.h" -/* Setup the simple state machine we use for all HS padding machines */ -static void -setup_state_machine_for_hiding_intro_circuits(circpad_machine_spec_t *machine) -{ - /* Two states: START, OBFUSCATE_CIRC_SETUP (and END) */ - circpad_machine_states_init(machine, 2); - - /* For the relay-side machine, we want to transition - * START -> OBFUSCATE_CIRC_SETUP upon first non-padding - * cell sent (PADDING_NEGOTIATED in this case). - * - * For the origin-side machine, we transition to OBFUSCATE_CIRC_SETUP after - * sending PADDING_NEGOTIATE, and we stay there (without sending any padding) - * until we receive a STOP from the other side. */ - machine->states[CIRCPAD_STATE_START]. - next_state[CIRCPAD_EVENT_NONPADDING_SENT] = - CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP; - - /* For the relay-side, we want to transition from OBFUSCATE_CIRC_SETUP to END - * state when the length finishes. - * - * For the origin-side, we don't care because the relay-side machine is gonna - * END us. */ - machine->states[CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP]. - next_state[CIRCPAD_EVENT_LENGTH_COUNT] = CIRCPAD_STATE_END; - - /* Now let's define the OBF -> OBF transitions that maintain our padding - * flow: - * - * For the relay-side machine, we want to keep on sending padding bytes even - * when nothing else happens on this circuit. */ - machine->states[CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP]. - next_state[CIRCPAD_EVENT_PADDING_SENT] = - CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP; - /* For the relay-side machine, we need this transition so that we re-enter - the state, after PADDING_NEGOTIATED is sent. Otherwise, the remove token - function will disable the timer, and nothing will restart it since there - is no other motion on an intro circuit. */ - machine->states[CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP]. - next_state[CIRCPAD_EVENT_NONPADDING_SENT] = - CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP; -} - /* Setup the OBFUSCATE_CIRC_SETUP state of the machine that hides client-side * intro circuits. */ static void @@ -202,8 +159,19 @@ circpad_machine_client_hide_intro_circuits(smartlist_t *machines_sl) client_machine->allowed_padding_count = INTRO_MACHINE_MAXIMUM_PADDING; client_machine->max_padding_percent = 1; - /* Setup states and histograms */ - setup_state_machine_for_hiding_intro_circuits(client_machine); + /* Two states: START, OBFUSCATE_CIRC_SETUP (and END) */ + circpad_machine_states_init(client_machine, 2); + + /* For the origin-side machine, we transition to OBFUSCATE_CIRC_SETUP after + * sending PADDING_NEGOTIATE, and we stay there (without sending any padding) + * until we receive a STOP from the other side. */ + client_machine->states[CIRCPAD_STATE_START]. + next_state[CIRCPAD_EVENT_NONPADDING_SENT] = + CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP; + + /* origin-side machine has no event reactions while in + * CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP, so no more state transitions here). */ + setup_obf_state_for_hiding_intro_circuits( &client_machine->states[CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP], true); @@ -243,8 +211,37 @@ circpad_machine_relay_hide_intro_circuits(smartlist_t *machines_sl) relay_machine->allowed_padding_count = INTRO_MACHINE_MAXIMUM_PADDING; relay_machine->max_padding_percent = 1; - /* Setup states and histograms */ - setup_state_machine_for_hiding_intro_circuits(relay_machine); + /* Two states: START, OBFUSCATE_CIRC_SETUP (and END) */ + circpad_machine_states_init(relay_machine, 2); + + /* For the relay-side machine, we want to transition + * START -> OBFUSCATE_CIRC_SETUP upon first non-padding + * cell sent (PADDING_NEGOTIATED in this case). */ + relay_machine->states[CIRCPAD_STATE_START]. + next_state[CIRCPAD_EVENT_NONPADDING_SENT] = + CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP; + + /* For the relay-side, we want to transition from OBFUSCATE_CIRC_SETUP to END + * state when the length finishes. */ + relay_machine->states[CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP]. + next_state[CIRCPAD_EVENT_LENGTH_COUNT] = CIRCPAD_STATE_END; + + /* Now let's define the OBF -> OBF transitions that maintain our padding + * flow: + * + * For the relay-side machine, we want to keep on sending padding bytes even + * when nothing else happens on this circuit. */ + relay_machine->states[CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP]. + next_state[CIRCPAD_EVENT_PADDING_SENT] = + CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP; + /* For the relay-side machine, we need this transition so that we re-enter + the state, after PADDING_NEGOTIATED is sent. Otherwise, the remove token + function will disable the timer, and nothing will restart it since there + is no other motion on an intro circuit. */ + relay_machine->states[CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP]. + next_state[CIRCPAD_EVENT_NONPADDING_SENT] = + CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP; + setup_obf_state_for_hiding_intro_circuits( &relay_machine->states[CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP], false); |