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).
This commit is contained in:
Mike Perry 2019-05-16 18:41:21 +00:00
parent 42ea3a416e
commit f237fed746

View File

@ -57,49 +57,6 @@
#include "core/or/circuitpadding_machines.h" #include "core/or/circuitpadding_machines.h"
#include "core/or/circuitpadding.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 /* Setup the OBFUSCATE_CIRC_SETUP state of the machine that hides client-side
* intro circuits. */ * intro circuits. */
static void 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->allowed_padding_count = INTRO_MACHINE_MAXIMUM_PADDING;
client_machine->max_padding_percent = 1; client_machine->max_padding_percent = 1;
/* Setup states and histograms */ /* Two states: START, OBFUSCATE_CIRC_SETUP (and END) */
setup_state_machine_for_hiding_intro_circuits(client_machine); 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( setup_obf_state_for_hiding_intro_circuits(
&client_machine->states[CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP], &client_machine->states[CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP],
true); 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->allowed_padding_count = INTRO_MACHINE_MAXIMUM_PADDING;
relay_machine->max_padding_percent = 1; relay_machine->max_padding_percent = 1;
/* Setup states and histograms */ /* Two states: START, OBFUSCATE_CIRC_SETUP (and END) */
setup_state_machine_for_hiding_intro_circuits(relay_machine); 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( setup_obf_state_for_hiding_intro_circuits(
&relay_machine->states[CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP], &relay_machine->states[CIRCPAD_STATE_OBFUSCATE_CIRC_SETUP],
false); false);