Tor  0.4.3.1-alpha-dev
circuitpadding.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017-2020, The Tor Project, Inc. */
3 /* See LICENSE for licensing information */
4 
5 /**
6  * \file circuitpadding.h
7  * \brief Header file for circuitpadding.c.
8  **/
9 
10 #ifndef TOR_CIRCUITPADDING_H
11 #define TOR_CIRCUITPADDING_H
12 
13 #include "trunnel/circpad_negotiation.h"
14 #include "lib/evloop/timers.h"
15 
16 struct circuit_t;
17 struct origin_circuit_t;
18 struct cell_t;
19 
20 /**
21  * Signed error return with the specific property that negative
22  * values mean error codes of various semantics, 0 means success,
23  * and positive values are unused.
24  *
25  * XXX: Tor uses this concept a lot but just calls it int. Should we move
26  * this somewhere centralized? Where?
27  */
28 typedef int signed_error_t;
29 
30 /**
31  * These constants specify the types of events that can cause
32  * transitions between state machine states.
33  *
34  * Note that SENT and RECV are relative to this endpoint. For
35  * relays, SENT means packets destined towards the client and
36  * RECV means packets destined towards the relay. On the client,
37  * SENT means packets destined towards the relay, where as RECV
38  * means packets destined towards the client.
39  */
40 typedef enum {
41  /* A non-padding cell was received. */
42  CIRCPAD_EVENT_NONPADDING_RECV = 0,
43  /* A non-padding cell was sent. */
44  CIRCPAD_EVENT_NONPADDING_SENT = 1,
45  /* A padding cell (RELAY_COMMAND_DROP) was sent. */
46  CIRCPAD_EVENT_PADDING_SENT = 2,
47  /* A padding cell was received. */
48  CIRCPAD_EVENT_PADDING_RECV = 3,
49  /* We tried to schedule padding but we ended up picking the infinity bin
50  * which means that padding was delayed infinitely */
51  CIRCPAD_EVENT_INFINITY = 4,
52  /* All histogram bins are empty (we are out of tokens) */
53  CIRCPAD_EVENT_BINS_EMPTY = 5,
54  /* This state has used up its cell count */
55  CIRCPAD_EVENT_LENGTH_COUNT = 6
57 #define CIRCPAD_NUM_EVENTS ((int)CIRCPAD_EVENT_LENGTH_COUNT+1)
58 
59 /** Boolean type that says if we decided to transition states or not */
60 typedef enum {
61  CIRCPAD_STATE_UNCHANGED = 0,
62  CIRCPAD_STATE_CHANGED = 1
64 
65 /** The type for the things in histogram bins (aka tokens) */
66 typedef uint32_t circpad_hist_token_t;
67 
68 /** The type for histogram indexes (needs to be negative for errors) */
69 typedef int8_t circpad_hist_index_t;
70 
71 /** The type for absolute time, from monotime_absolute_usec() */
72 typedef uint64_t circpad_time_t;
73 
74 /** The type for timer delays, in microseconds */
75 typedef uint32_t circpad_delay_t;
76 #define CIRCPAD_DELAY_UNITS_PER_SECOND (1000*1000)
77 
78 /**
79  * An infinite padding cell delay means don't schedule any padding --
80  * simply wait until a different event triggers a transition.
81  *
82  * This means that the maximum delay we can schedule is UINT32_MAX-1
83  * microseconds, or about 4300 seconds (1.25 hours).
84  * XXX: Is this enough if we want to simulate light, intermittent
85  * activity on an onion service?
86  */
87 #define CIRCPAD_DELAY_INFINITE (UINT32_MAX)
88 
89 /**
90  * This is the maximum delay that the circuit padding system can have, in
91  * seconds.
92  */
93 #define CIRCPAD_DELAY_MAX_SECS \
94  ((CIRCPAD_DELAY_INFINITE/CIRCPAD_DELAY_UNITS_PER_SECOND)+1)
95 
96 /**
97  * Macro to clarify when we're checking the infinity bin.
98  *
99  * Works with either circpad_state_t or circpad_machine_runtime_t
100  */
101 #define CIRCPAD_INFINITY_BIN(mi) ((mi)->histogram_len-1)
102 
103 /**
104  * These constants form a bitfield that specifies when a state machine
105  * should be applied to a circuit.
106  *
107  * If any of these elements is set, then the circuit will be tested against
108  * that specific condition. If an element is unset, then we don't test it.
109  * (E.g., if neither NO_STREAMS or STREAMS are set, then we will not care
110  * whether a circuit has streams attached when we apply a state machine.)
111  *
112  * The helper function circpad_circuit_state() converts circuit state
113  * flags into this more compact representation.
114  */
115 typedef enum {
116  /* Only apply machine if the circuit is still building */
117  CIRCPAD_CIRC_BUILDING = 1<<0,
118  /* Only apply machine if the circuit is open */
119  CIRCPAD_CIRC_OPENED = 1<<1,
120  /* Only apply machine if the circuit has no attached streams */
121  CIRCPAD_CIRC_NO_STREAMS = 1<<2,
122  /* Only apply machine if the circuit has attached streams */
123  CIRCPAD_CIRC_STREAMS = 1<<3,
124  /* Only apply machine if the circuit still allows RELAY_EARLY cells */
125  CIRCPAD_CIRC_HAS_RELAY_EARLY = 1<<4,
126  /* Only apply machine if the circuit has depleted its RELAY_EARLY cells
127  * allowance. */
128  CIRCPAD_CIRC_HAS_NO_RELAY_EARLY = 1<<5
130 
131 /** Bitmask that says "apply this machine to all states" */
132 #define CIRCPAD_STATE_ALL \
133  (CIRCPAD_CIRC_BUILDING|CIRCPAD_CIRC_OPENED| \
134  CIRCPAD_CIRC_STREAMS|CIRCPAD_CIRC_NO_STREAMS| \
135  CIRCPAD_CIRC_HAS_RELAY_EARLY|CIRCPAD_CIRC_HAS_NO_RELAY_EARLY)
136 
137 /**
138  * A compact circuit purpose bitfield mask that allows us to compactly
139  * specify which circuit purposes a machine should apply to.
140  *
141  * The helper function circpad_circ_purpose_to_mask() converts circuit
142  * purposes into bit positions in this bitmask.
143  */
144 typedef uint32_t circpad_purpose_mask_t;
145 
146 /** Bitmask that says "apply this machine to all purposes". */
147 #define CIRCPAD_PURPOSE_ALL (0xFFFFFFFF)
148 
149 /**
150  * This type specifies all of the conditions that must be met before
151  * a client decides to initiate padding on a circuit.
152  *
153  * A circuit must satisfy every sub-field in this type in order
154  * to be considered to match the conditions.
155  */
157  /** Only apply the machine *if* the circuit has at least this many hops */
158  unsigned min_hops : 3;
159 
160  /** Only apply the machine *if* vanguards are enabled */
161  unsigned requires_vanguards : 1;
162 
163  /**
164  * This machine is ok to use if reduced padding is set in consensus
165  * or torrc. This machine will still be applied even if reduced padding
166  * is not set; this flag only acts to exclude machines that don't have
167  * it set when reduced padding is requested. Therefore, reduced padding
168  * machines should appear at the lowest priority in the padding machine
169  * lists (aka first in the list), so that non-reduced padding machines
170  * for the same purpose are given a chance to apply when reduced padding
171  * is not requested. */
172  unsigned reduced_padding_ok : 1;
173 
174  /** Only apply the machine *if* the circuit's state matches any of
175  * the bits set in this bitmask. */
177 
178  /** Only apply a machine *if* the circuit's purpose matches one
179  * of the bits set in this bitmask */
181 
183 
184 /**
185  * Token removal strategy options.
186  *
187  * The WTF-PAD histograms are meant to specify a target distribution to shape
188  * traffic towards. This is accomplished by removing tokens from the histogram
189  * when either padding or non-padding cells are sent.
190  *
191  * When we see a non-padding cell at a particular time since the last cell, you
192  * remove a token from the corresponding delay bin. These flags specify
193  * which bin to choose if that bin is already empty.
194  */
195 typedef enum {
196  /** Don't remove any tokens */
198  /**
199  * Remove from the first non-zero higher bin index when current is zero.
200  * This is the recommended strategy from the Adaptive Padding paper. */
202  /** Remove from the first non-zero lower bin index when current is empty. */
204  /** Remove from the closest non-zero bin index when current is empty. */
206  /** Remove from the closest bin by time value (since bins are
207  * exponentially spaced). */
209  /** Only remove from the exact bin corresponding to this delay. If
210  * the bin is 0, simply do nothing. Don't pick another bin. */
213 
214 /**
215  * Distribution types supported by circpad_distribution_sample().
216  *
217  * These can be used instead of histograms for the inter-packet
218  * timing distribution, or to specify a distribution on the number
219  * of cells that can be sent while in a specific state of the state
220  * machine.
221  *
222  * Each distribution takes up to two parameters which are described below. */
223 typedef enum {
224  /* No probability distribution is used */
225  CIRCPAD_DIST_NONE = 0,
226  /* Uniform distribution: param1 is lower bound and param2 is upper bound */
227  CIRCPAD_DIST_UNIFORM = 1,
228  /* Logistic distribution: param1 is Mu, param2 is sigma. */
229  CIRCPAD_DIST_LOGISTIC = 2,
230  /* Log-logistic distribution: param1 is Alpha, param2 is 1.0/Beta */
231  CIRCPAD_DIST_LOG_LOGISTIC = 3,
232  /* Geometric distribution: param1 is 'p' (success probability) */
233  CIRCPAD_DIST_GEOMETRIC = 4,
234  /* Weibull distribution: param1 is k, param2 is Lambda */
235  CIRCPAD_DIST_WEIBULL = 5,
236  /* Generalized Pareto distribution: param1 is sigma, param2 is xi */
237  CIRCPAD_DIST_PARETO = 6
239 
240 /**
241  * Distribution information.
242  *
243  * This type specifies a specific distribution above, as well as
244  * up to two parameters for that distribution. The specific
245  * per-distribution meaning of these parameters is specified
246  * in circpad_distribution_sample().
247  */
248 typedef struct circpad_distribution_t {
250  double param1;
251  double param2;
253 
254 /** State number type. Represents current state of state machine. */
255 typedef uint16_t circpad_statenum_t;
256 #define CIRCPAD_STATENUM_MAX (UINT16_MAX)
257 
258 /** A histogram can be used to sample padding delays given a machine state.
259  * This constant defines the maximum histogram width (i.e. the max number of
260  * bins).
261  *
262  * The current limit is arbitrary and could be raised if there is a need,
263  * however too many bins will be hard to serialize in the future.
264  *
265  * Memory concerns are not so great here since the corresponding histogram and
266  * histogram_edges arrays are global and not per-circuit.
267  *
268  * If we ever upgrade this to a value that can't be represented by 8-bits we
269  * also need to upgrade circpad_hist_index_t.
270  */
271 #define CIRCPAD_MAX_HISTOGRAM_LEN (100)
272 
273 /**
274  * A state of a padding state machine. The information here are immutable and
275  * represent the initial form of the state; it does not get updated as things
276  * happen. The mutable information that gets updated in runtime are carried in
277  * a circpad_machine_runtime_t.
278  *
279  * This struct describes the histograms and/or probability distributions, as
280  * well as parameters of a single state in the adaptive padding machine.
281  * Instances of this struct exist in global circpad machine definitions that
282  * come from torrc or the consensus.
283  */
284 typedef struct circpad_state_t {
285  /**
286  * If a histogram is used for this state, this specifies the number of bins
287  * of this histogram. Histograms must have at least 2 bins.
288  *
289  * In particular, the following histogram:
290  *
291  * Tokens
292  * +
293  * 10 | +----+
294  * 9 | | | +---------+
295  * 8 | | | | |
296  * 7 | | | +-----+ |
297  * 6 +----+ Bin+-----+ | +---------------+
298  * 5 | | #1 | | | | |
299  * | Bin| | Bin | Bin | Bin #4 | Bin #5 |
300  * | #0 | | #2 | #3 | | (infinity bin)|
301  * | | | | | | |
302  * | | | | | | |
303  * 0 +----+----+-----+-----+---------+---------------+
304  * 0 100 200 350 500 1000 inf microseconds
305  *
306  * would be specified the following way:
307  * histogram_len = 6;
308  * histogram[] = { 6, 10, 6, 7, 9, 6 }
309  * histogram_edges[] = { 0, 100, 200, 350, 500, 1000 }
310  *
311  * The final bin is called the "infinity bin" and if it's chosen we don't
312  * schedule any padding. The infinity bin is strange because its lower edge
313  * is the max value of possible non-infinite delay allowed by this histogram,
314  * and its upper edge is CIRCPAD_DELAY_INFINITE. You can tell if the infinity
315  * bin is chosen by inspecting its bin index or inspecting its upper edge.
316  *
317  * If a delay probability distribution is used for this state, this is set
318  * to 0. */
320  /** The histogram itself: an array of uint16s of tokens, whose
321  * widths are exponentially spaced, in microseconds.
322  *
323  * This array must have histogram_len elements that are strictly
324  * monotonically increasing. */
326  /* The histogram bin edges in usec.
327  *
328  * Each element of this array specifies the left edge of the corresponding
329  * bin. The rightmost edge is always infinity and is not specified in this
330  * array.
331  *
332  * This array must have histogram_len elements. */
333  circpad_delay_t histogram_edges[CIRCPAD_MAX_HISTOGRAM_LEN+1];
334  /** Total number of tokens in this histogram. This is a constant and is *not*
335  * decremented every time we spend a token. It's used for initializing and
336  * refilling the histogram. */
338 
339  /**
340  * Represents a delay probability distribution (aka IAT distribution). It's a
341  * parametrized way of encoding inter-packet delay information in
342  * microseconds. It can be used instead of histograms.
343  *
344  * If it is used, token_removal below must be set to
345  * CIRCPAD_TOKEN_REMOVAL_NONE.
346  *
347  * Start_usec, range_sec, and rtt_estimates are still applied to the
348  * results of sampling from this distribution (range_sec is used as a max).
349  */
351  /* If a delay probability distribution is used, this is used as the max
352  * value we can sample from the distribution. However, RTT measurements and
353  * dist_added_shift gets applied on top of this value to derive the final
354  * padding delay. */
355  circpad_delay_t dist_max_sample_usec;
356  /* If a delay probability distribution is used and this is set, we will add
357  * this value on top of the value sampled from the IAT distribution to
358  * derive the final padding delay (We also add the RTT measurement if it's
359  * enabled.). */
360  circpad_delay_t dist_added_shift_usec;
361 
362  /**
363  * The length dist is a parameterized way of encoding how long this
364  * state machine runs in terms of sent padding cells or all
365  * sent cells. Values are sampled from this distribution, clamped
366  * to max_len, and then start_len is added to that value.
367  *
368  * It may be specified instead of or in addition to
369  * the infinity bins and bins empty conditions. */
371  /** A minimum length value, added to the output of length_dist */
372  uint16_t start_length;
373  /** A cap on the length value that can be sampled from the length_dist */
374  uint64_t max_length;
375 
376  /** Should we decrement length when we see a nonpadding packet?
377  * XXX: Are there any machines that actually want to set this to 0? There may
378  * not be. OTOH, it's only a bit.. */
380 
381  /**
382  * This is an array that specifies the next state to transition to upon
383  * receipt an event matching the indicated array index.
384  *
385  * This aborts our scheduled packet and switches to the state
386  * corresponding to the index of the array. Tokens are filled upon
387  * this transition.
388  *
389  * States are allowed to transition to themselves, which means re-schedule
390  * a new padding timer. They are also allowed to temporarily "transition"
391  * to the "IGNORE" and "CANCEL" pseudo-states. See defines below
392  * for details on state behavior and meaning.
393  */
394  circpad_statenum_t next_state[CIRCPAD_NUM_EVENTS];
395 
396  /**
397  * If true, estimate the RTT from this relay to the exit/website and add that
398  * to start_usec for use as the histogram bin 0 start delay.
399  *
400  * Right now this is only supported for relay-side state machines.
401  */
402  unsigned use_rtt_estimate : 1;
403 
404  /** This specifies the token removal strategy to use upon padding and
405  * non-padding activity. */
408 
409 /**
410  * The start state for this machine.
411  *
412  * In the original WTF-PAD, this is only used for transition to/from
413  * the burst state. All other fields are not used. But to simplify the
414  * code we've made it a first-class state. This has no performance
415  * consequences, but may make naive serialization of the state machine
416  * large, if we're not careful about how we represent empty fields.
417  */
418 #define CIRCPAD_STATE_START 0
419 
420 /**
421  * The burst state for this machine.
422  *
423  * In the original Adaptive Padding algorithm and in WTF-PAD
424  * (https://www.freehaven.net/anonbib/cache/ShWa-Timing06.pdf and
425  * https://www.cs.kau.se/pulls/hot/thebasketcase-wtfpad/), the burst
426  * state serves to detect bursts in traffic. This is done by using longer
427  * delays in its histogram, which represent the expected delays between
428  * bursts of packets in the target stream. If this delay expires without a
429  * real packet being sent, the burst state sends a padding packet and then
430  * immediately transitions to the gap state, which is used to generate
431  * a synthetic padding packet train. In this implementation, this transition
432  * needs to be explicitly specified in the burst state's transition events.
433  *
434  * Because of this flexibility, other padding mechanisms can transition
435  * between these two states arbitrarily, to encode other dynamics of
436  * target traffic.
437  */
438 #define CIRCPAD_STATE_BURST 1
439 
440 /**
441  * The gap state for this machine.
442  *
443  * In the original Adaptive Padding algorithm and in WTF-PAD, the gap
444  * state serves to simulate an artificial packet train composed of padding
445  * packets. It does this by specifying much lower inter-packet delays than
446  * the burst state, and transitioning back to itself after padding is sent
447  * if these timers expire before real traffic is sent. If real traffic is
448  * sent, it transitions back to the burst state.
449  *
450  * Again, in this implementation, these transitions must be specified
451  * explicitly, and other transitions are also permitted.
452  */
453 #define CIRCPAD_STATE_GAP 2
454 
455 /**
456  * End is a pseudo-state that causes the machine to go completely
457  * idle, and optionally get torn down (depending on the
458  * value of circpad_machine_spec_t.should_negotiate_end)
459  *
460  * End MUST NOT occupy a slot in the machine state array.
461  */
462 #define CIRCPAD_STATE_END CIRCPAD_STATENUM_MAX
463 
464 /**
465  * "Ignore" is a pseudo-state that means "do not react to this
466  * event".
467  *
468  * "Ignore" MUST NOT occupy a slot in the machine state array.
469  */
470 #define CIRCPAD_STATE_IGNORE (CIRCPAD_STATENUM_MAX-1)
471 
472 /**
473  * "Cancel" is a pseudo-state that means "cancel pending timers,
474  * but remain in your current state".
475  *
476  * Cancel MUST NOT occupy a slot in the machine state array.
477  */
478 #define CIRCPAD_STATE_CANCEL (CIRCPAD_STATENUM_MAX-2)
479 
480 /**
481  * Since we have 3 pseudo-states, the max state array length is
482  * up to one less than cancel's statenum.
483  */
484 #define CIRCPAD_MAX_MACHINE_STATES (CIRCPAD_STATE_CANCEL-1)
485 
486 /**
487  * Mutable padding machine info.
488  *
489  * This structure contains mutable information about a padding
490  * machine. The mutable information must be kept separate because
491  * it exists per-circuit, where as the machines themselves are global.
492  * This separation is done to conserve space in the circuit structure.
493  *
494  * This is the per-circuit state that changes regarding the global state
495  * machine. Some parts of it are optional (ie NULL).
496  *
497  * XXX: Play with layout to minimize space on x64 Linux (most common relay).
498  */
500  /** The callback pointer for the padding callbacks.
501  *
502  * These timers stick around the machineinfo until the machineinfo's circuit
503  * is closed, at which point the timer is cancelled. For this reason it's
504  * safe to assume that the machineinfo exists if this timer gets
505  * triggered. */
506  tor_timer_t *padding_timer;
507 
508  /** The circuit for this machine */
510 
511  /** A mutable copy of the histogram for the current state.
512  * NULL if remove_tokens is false for that state */
514  /** Length of the above histogram.
515  * XXX: This field *could* be removed at the expense of added
516  * complexity+overhead for reaching back into the immutable machine
517  * state every time we need to inspect the histogram. It's only a byte,
518  * though, so it seemed worth it.
519  */
521  /** Remove token from this index upon sending padding */
523 
524  /** Stop padding/transition if this many cells sent */
525  uint64_t state_length;
526 #define CIRCPAD_STATE_LENGTH_INFINITE UINT64_MAX
527 
528  /** A scaled count of padding packets sent, used to limit padding overhead.
529  * When this reaches UINT16_MAX, we cut it and nonpadding_sent in half. */
530  uint16_t padding_sent;
531  /** A scaled count of non-padding packets sent, used to limit padding
532  * overhead. When this reaches UINT16_MAX, we cut it and padding_sent in
533  * half. */
534  uint16_t nonpadding_sent;
535 
536  /**
537  * Timestamp of the most recent cell event (sent, received, padding,
538  * non-padding), in seconds from approx_time().
539  *
540  * Used as an emergency break to stop holding padding circuits open.
541  */
543 
544  /**
545  * EWMA estimate of the RTT of the circuit from this hop
546  * to the exit end, in microseconds. */
548 
549  /**
550  * The last time we got an event relevant to estimating
551  * the RTT. Monotonic time in microseconds since system
552  * start.
553  */
555 
556  /**
557  * The time at which we scheduled a non-padding packet,
558  * or selected an infinite delay.
559  *
560  * Monotonic time in microseconds since system start.
561  * This is 0 if we haven't chosen a padding delay.
562  */
564 
565  /** What state is this machine in? */
567 
568  /**
569  * True if we have scheduled a timer for padding.
570  *
571  * This is 1 if a timer is pending. It is 0 if
572  * no timer is scheduled. (It can be 0 even when
573  * padding_was_scheduled_at_usec is non-zero).
574  */
576 
577  /**
578  * If this is true, we have seen full duplex behavior.
579  * Stop updating the RTT.
580  */
581  unsigned stop_rtt_update : 1;
582 
583 /** Max number of padding machines on each circuit. If changed,
584  * also ensure the machine_index bitwith supports the new size. */
585 #define CIRCPAD_MAX_MACHINES (2)
586  /** Which padding machine index was this for.
587  * (make sure changes to the bitwidth can support the
588  * CIRCPAD_MAX_MACHINES define). */
589  unsigned machine_index : 1;
590 
592 
593 /** Helper macro to get an actual state machine from a machineinfo */
594 #define CIRCPAD_GET_MACHINE(machineinfo) \
595  ((machineinfo)->on_circ->padding_machine[(machineinfo)->machine_index])
596 
597 /**
598  * This specifies a particular padding machine to use after negotiation.
599  *
600  * The constants for machine_num_t are in trunnel.
601  * We want to be able to define extra numbers in the consensus/torrc, though.
602  */
603 typedef uint8_t circpad_machine_num_t;
604 
605 /** Global state machine structure from the consensus */
606 typedef struct circpad_machine_spec_t {
607  /* Just a user-friendly machine name for logs */
608  const char *name;
609 
610  /** Global machine number */
612 
613  /** Which machine index slot should this machine go into in
614  * the array on the circuit_t */
615  unsigned machine_index : 1;
616 
617  /** Send a padding negotiate to shut down machine at end state? */
618  unsigned should_negotiate_end : 1;
619 
620  // These next three fields are origin machine-only...
621  /** Origin side or relay side */
622  unsigned is_origin_side : 1;
623 
624  /** Which hop in the circuit should we send padding to/from?
625  * 1-indexed (ie: hop #1 is guard, #2 middle, #3 exit). */
626  unsigned target_hopnum : 3;
627 
628  /** If this flag is enabled, don't close circuits that use this machine even
629  * if another part of Tor wants to close this circuit.
630  *
631  * If this flag is set, the circuitpadding subsystem will close circuits the
632  * moment the machine transitions to the END state, and only if the circuit
633  * has already been asked to be closed by another part of Tor.
634  *
635  * Circuits that should have been closed but were kept open by a padding
636  * machine are re-purposed to CIRCUIT_PURPOSE_C_CIRCUIT_PADDING, hence
637  * machines should take that purpose into account if they are filtering
638  * circuits by purpose. */
639  unsigned manage_circ_lifetime : 1;
640 
641  /** This machine only kills fascists if the following conditions are met. */
643 
644  /** How many padding cells can be sent before we apply overhead limits?
645  * XXX: Note that we can only allow up to 64k of padding cells on an
646  * otherwise quiet circuit. Is this enough? It's 33MB. */
648 
649  /** Padding percent cap: Stop padding if we exceed this percent overhead.
650  * 0 means no limit. Overhead is defined as percent of total traffic, so
651  * that we can use 0..100 here. This is the same definition as used in
652  * Prop#265. */
654 
655  /** State array: indexed by circpad_statenum_t */
657 
658  /**
659  * Number of states this machine has (ie: length of the states array).
660  * XXX: This field is not needed other than for safety. */
663 
665 
666 int circpad_marked_circuit_for_padding(circuit_t *circ, int reason);
667 
668 /**
669  * The following are event call-in points that are of interest to
670  * the state machines. They are called during cell processing. */
672  cell_direction_t dir);
674  uint8_t relay_command);
676  uint8_t relay_command,
677  crypt_path_t *layer_hint);
678 
679 /** Cell events are delivered by the above delivery functions */
680 void circpad_cell_event_nonpadding_sent(struct circuit_t *on_circ);
682 void circpad_cell_event_padding_sent(struct circuit_t *on_circ);
683 void circpad_cell_event_padding_received(struct circuit_t *on_circ);
684 
685 /** Internal events are events the machines send to themselves */
692 
693 /** Machine creation events are events that cause us to set up or
694  * tear down padding state machines. */
700 void
702 
703 void circpad_machines_init(void);
704 void circpad_machines_free(void);
705 void circpad_register_padding_machine(circpad_machine_spec_t *machine,
706  smartlist_t *machine_list);
707 
709  circpad_statenum_t num_states);
710 
712 
714  crypt_path_t *from_hop);
715 
716 /** Serializaton functions for writing to/from torrc and consensus */
718 const circpad_machine_spec_t *circpad_string_to_machine(const char *str);
719 
720 /* Padding negotiation between client and middle */
722  struct cell_t *cell);
724  struct cell_t *cell,
725  crypt_path_t *layer_hint);
727  circpad_machine_num_t machine,
728  uint8_t target_hopnum,
729  uint8_t command);
730 bool circpad_padding_negotiated(struct circuit_t *circ,
731  circpad_machine_num_t machine,
732  uint8_t command,
733  uint8_t response);
734 
736 
738  crypt_path_t *layer_hint,
739  const relay_header_t *rh);
740 
743 
746  circpad_event_t event));
747 
750 
751 void circpad_free_all(void);
752 
753 #ifdef CIRCUITPADDING_PRIVATE
755 #define machine_spec_free(chan) \
756  FREE_AND_NULL(circpad_machine_spec_t,machine_spec_free_, (m))
757 
760 
761 STATIC bool
763 
767 
768 STATIC const circpad_state_t *
770 
772 
774  const circpad_machine_runtime_t *mi,
775  circpad_delay_t us);
776 
778  struct circuit_t *on_circ,
779  int machine_index);
781  circpad_delay_t target_bin_us);
783  circpad_delay_t target_bin_us);
785  circpad_delay_t target_bin_us,
786  bool use_usec);
788 
790 circpad_send_command_to_hop,(struct origin_circuit_t *circ, uint8_t hopnum,
791  uint8_t relay_command, const uint8_t *payload,
792  ssize_t payload_len));
793 
794 MOCK_DECL(STATIC const node_t *,
795 circuit_get_nth_node,(origin_circuit_t *circ, int hop));
796 
800 
801 STATIC void
803  smartlist_t *machines_sl);
804 
805 #ifdef TOR_UNIT_TESTS
808 
809 #endif
810 
811 #endif /* defined(CIRCUITPADDING_PRIVATE) */
812 
813 #endif /* !defined(TOR_CIRCUITPADDING_H) */
void circpad_machine_event_circ_built(struct origin_circuit_t *circ)
STATIC circpad_machine_runtime_t * circpad_circuit_machineinfo_new(circuit_t *on_circ, int machine_index)
circpad_decision_t
int circpad_marked_circuit_for_padding(circuit_t *circ, int reason)
Definition: node_st.h:34
uint32_t circpad_delay_t
STATIC void machine_spec_free_(circpad_machine_spec_t *m)
circpad_decision_t circpad_machine_schedule_padding(circpad_machine_runtime_t *)
void circpad_machine_event_circ_added_hop(struct origin_circuit_t *on_circ)
uint64_t circpad_time_t
void circpad_free_all(void)
circpad_distribution_type_t
circpad_removal_t
int signed_error_t
circpad_hist_index_t chosen_bin
circpad_hist_token_t histogram[CIRCPAD_MAX_HISTOGRAM_LEN]
Definition: cell_st.h:17
void circpad_machine_event_circ_has_no_relay_early(struct origin_circuit_t *circ)
circpad_purpose_mask_t circpad_circ_purpose_to_mask(uint8_t circ_purpose)
bool circpad_padding_negotiated(struct circuit_t *circ, circpad_machine_num_t machine, uint8_t command, uint8_t response)
STATIC signed_error_t circpad_send_command_to_hop(origin_circuit_t *circ, uint8_t hopnum, uint8_t relay_command, const uint8_t *payload, ssize_t payload_len)
void circpad_circuit_free_all_machineinfos(struct circuit_t *circ)
circpad_state_t * states
STATIC const node_t * circuit_get_nth_node(origin_circuit_t *circ, int hop)
circpad_removal_t token_removal
void circpad_cell_event_padding_sent(struct circuit_t *on_circ)
STATIC void circpad_machine_remove_token(circpad_machine_runtime_t *mi)
void circpad_machines_free(void)
circpad_machine_conditions_t conditions
void circpad_cell_event_nonpadding_received(struct circuit_t *on_circ)
STATIC smartlist_t * relay_padding_machines
void circpad_deliver_sent_relay_cell_events(struct circuit_t *circ, uint8_t relay_command)
STATIC circpad_delay_t circpad_machine_sample_delay(circpad_machine_runtime_t *mi)
circpad_statenum_t next_state[CIRCPAD_NUM_EVENTS]
#define STATIC
Definition: testsupport.h:32
cell_direction_t
Definition: or.h:482
STATIC void circpad_add_matching_machines(origin_circuit_t *on_circ, smartlist_t *machines_sl)
circpad_hist_index_t histogram_len
STATIC bool circpad_machine_reached_padding_limit(circpad_machine_runtime_t *mi)
STATIC void circpad_machine_remove_lower_token(circpad_machine_runtime_t *mi, circpad_delay_t target_bin_usec)
uint32_t circpad_hist_token_t
void circpad_deliver_unrecognized_cell_events(struct circuit_t *circ, cell_direction_t dir)
STATIC circpad_hist_index_t circpad_histogram_usec_to_bin(const circpad_machine_runtime_t *mi, circpad_delay_t usec)
STATIC void circpad_machine_remove_closest_token(circpad_machine_runtime_t *mi, circpad_delay_t target_bin_usec, bool use_usec)
STATIC void circpad_machine_remove_higher_token(circpad_machine_runtime_t *mi, circpad_delay_t target_bin_usec)
void circpad_machine_event_circ_purpose_changed(struct origin_circuit_t *circ)
circpad_decision_t circpad_internal_event_bins_empty(circpad_machine_runtime_t *)
circpad_decision_t circpad_internal_event_infinity(circpad_machine_runtime_t *mi)
uint32_t circpad_purpose_mask_t
circpad_decision_t circpad_send_padding_cell_for_callback(circpad_machine_runtime_t *mi)
circpad_time_t last_received_time_usec
void circpad_cell_event_nonpadding_sent(struct circuit_t *on_circ)
STATIC circpad_delay_t histogram_get_bin_upper_bound(const circpad_machine_runtime_t *mi, circpad_hist_index_t bin)
circpad_statenum_t current_state
void circpad_machines_init(void)
circpad_distribution_t length_dist
void circpad_machine_event_circ_has_no_streams(struct origin_circuit_t *circ)
#define CIRCPAD_MAX_HISTOGRAM_LEN
circpad_decision_t circpad_internal_event_state_length_up(circpad_machine_runtime_t *)
unsigned use_rtt_estimate
struct circuit_t * on_circ
uint16_t circpad_statenum_t
void circpad_machine_event_circ_has_streams(struct origin_circuit_t *circ)
circpad_machine_num_t machine_num
circpad_distribution_t iat_dist
STATIC void circpad_machine_setup_tokens(circpad_machine_runtime_t *mi)
void circpad_new_consensus_params(const networkstatus_t *ns)
circpad_hist_token_t * histogram
STATIC circpad_delay_t circpad_histogram_bin_to_usec(const circpad_machine_runtime_t *mi, circpad_hist_index_t bin)
Header for timers.c.
circpad_circuit_state_t
uint32_t histogram_total_tokens
circpad_statenum_t num_states
char * circpad_machine_spec_to_string(const circpad_machine_spec_t *machine)
bool circpad_padding_is_from_expected_hop(struct circuit_t *circ, crypt_path_t *from_hop)
signed_error_t circpad_handle_padding_negotiate(struct circuit_t *circ, struct cell_t *cell)
#define MOCK_DECL(rv, funcname, arglist)
Definition: testsupport.h:127
STATIC smartlist_t * origin_padding_machines
tor_cmdline_mode_t command
Definition: config.c:2445
int circpad_check_received_cell(cell_t *cell, circuit_t *circ, crypt_path_t *layer_hint, const relay_header_t *rh)
void circpad_deliver_recognized_relay_cell_events(struct circuit_t *circ, uint8_t relay_command, crypt_path_t *layer_hint)
circpad_time_t padding_scheduled_at_usec
void circpad_cell_event_padding_received(struct circuit_t *on_circ)
circpad_purpose_mask_t purpose_mask
signed_error_t circpad_negotiate_padding(struct origin_circuit_t *circ, circpad_machine_num_t machine, uint8_t target_hopnum, uint8_t command)
circpad_event_t
void circpad_machine_states_init(circpad_machine_spec_t *machine, circpad_statenum_t num_states)
uint16_t start_length
int8_t circpad_hist_index_t
uint8_t circpad_machine_num_t
unsigned length_includes_nonpadding
circpad_decision_t circpad_machine_spec_transition(circpad_machine_runtime_t *mi, circpad_event_t event)
circpad_hist_index_t histogram_len
circpad_circuit_state_t state_mask
STATIC const circpad_state_t * circpad_machine_current_state(const circpad_machine_runtime_t *mi)
signed_error_t circpad_handle_padding_negotiated(struct circuit_t *circ, struct cell_t *cell, crypt_path_t *layer_hint)
circpad_delay_t rtt_estimate_usec