Tor 0.4.9.13
Loading...
Searching...
No Matches
circuit_st.h
Go to the documentation of this file.
1/* Copyright (c) 2001 Matej Pfajfar.
2 * Copyright (c) 2001-2004, Roger Dingledine.
3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
4 * Copyright (c) 2007-2021, The Tor Project, Inc. */
5/* See LICENSE for licensing information */
6
7/**
8 * @file circuit_st.h
9 * @brief Base circuit structure.
10 **/
11
12#ifndef CIRCUIT_ST_H
13#define CIRCUIT_ST_H
14
15#include "core/or/or.h"
16
18
20#include "ext/ht.h"
21
22struct hs_token_t;
26
27/** Number of padding state machines on a circuit. */
28#define CIRCPAD_MAX_MACHINES (2)
29
30/** "magic" value for an origin_circuit_t */
31#define ORIGIN_CIRCUIT_MAGIC 0x35315243u
32/** "magic" value for an or_circuit_t */
33#define OR_CIRCUIT_MAGIC 0x98ABC04Fu
34/** "magic" value for a circuit that would have been freed by circuit_free,
35 * but which we're keeping around until a cpuworker reply arrives. See
36 * circuit_free() for more documentation. */
37#define DEAD_CIRCUIT_MAGIC 0xdeadc14c
38
39/**
40 * A circuit is a path over the onion routing
41 * network. Applications can connect to one end of the circuit, and can
42 * create exit connections at the other end of the circuit. AP and exit
43 * connections have only one circuit associated with them (and thus these
44 * connection types are closed when the circuit is closed), whereas
45 * OR connections multiplex many circuits at once, and stay standing even
46 * when there are no circuits running over them.
47 *
48 * A circuit_t structure can fill one of two roles. First, a or_circuit_t
49 * links two connections together: either an edge connection and an OR
50 * connection, or two OR connections. (When joined to an OR connection, a
51 * circuit_t affects only cells sent to a particular circID on that
52 * connection. When joined to an edge connection, a circuit_t affects all
53 * data.)
54
55 * Second, an origin_circuit_t holds the cipher keys and state for sending data
56 * along a given circuit. At the OP, it has a sequence of ciphers, each
57 * of which is shared with a single OR along the circuit. Separate
58 * ciphers are used for data going "forward" (away from the OP) and
59 * "backward" (towards the OP). At the OR, a circuit has only two stream
60 * ciphers: one for data going forward, and one for data going backward.
61 */
62struct circuit_t {
63 uint32_t magic; /**< For memory and type debugging: must equal
64 * ORIGIN_CIRCUIT_MAGIC or OR_CIRCUIT_MAGIC. */
65
66 /** Handle entry for handle-based lookup */
68
69 /** The channel that is next in this circuit. */
71
72 /**
73 * The circuit_id used in the next (forward) hop of this circuit;
74 * this is unique to n_chan, but this ordered pair is globally
75 * unique:
76 *
77 * (n_chan->global_identifier, n_circ_id)
78 */
80
81 /** Queue of cells waiting to be transmitted on n_chan */
83
84 /**
85 * The hop to which we want to extend this circuit. Should be NULL if
86 * the circuit has attached to a channel.
87 */
89
90 /** True iff we are waiting for n_chan_cells to become less full before
91 * allowing any more cells on this circuit. (Origin circuit only.) */
92 unsigned int circuit_blocked_on_n_chan : 1;
93 /** True iff we are waiting for p_chan_cells to become less full before
94 * allowing any more cells on this circuit. (OR circuit only.) */
95 unsigned int circuit_blocked_on_p_chan : 1;
96
97 /** True iff we have queued a delete backwards on this circuit, but not put
98 * it on the output buffer. */
99 unsigned int p_delete_pending : 1;
100 /** True iff we have queued a delete forwards on this circuit, but not put
101 * it on the output buffer. */
102 unsigned int n_delete_pending : 1;
103
104 /** True iff this circuit has received a DESTROY cell in either direction */
105 unsigned int received_destroy : 1;
106
107 /** True iff we have sent a sufficiently random data cell since last
108 * we reset send_randomness_after_n_cells. */
110
111 uint8_t state; /**< Current status of this circuit. */
112 uint8_t purpose; /**< Why are we creating this circuit? */
113
114 /** How many relay data cells can we package (read from edge streams)
115 * on this circuit before we receive a circuit-level sendme cell asking
116 * for more? */
118 /** How many relay data cells will we deliver (write to edge streams)
119 * on this circuit? When deliver_window gets low, we send some
120 * circuit-level sendme cells to indicate that we're willing to accept
121 * more. */
123 /**
124 * How many cells do we have until we need to send one that contains
125 * sufficient randomness? Used to ensure that authenticated SENDME cells
126 * will reflect some unpredictable information.
127 **/
129
130 /** FIFO containing the digest of the cells that are just before a SENDME is
131 * sent by the client. It is done at the last cell before our package_window
132 * goes down to 0 which is when we expect a SENDME.
133 *
134 * Our current circuit package window is capped to 1000
135 * (CIRCWINDOW_START_MAX) which is also the start value. The increment is
136 * set to 100 (CIRCWINDOW_INCREMENT) which means we don't allow more than
137 * 1000/100 = 10 outstanding SENDME cells worth of data. Meaning that this
138 * list can not contain more than 10 digests of DIGEST_LEN bytes (20).
139 *
140 * At position i in the list, the digest corresponds to the
141 * (CIRCWINDOW_INCREMENT * i)-nth cell received since we expect a SENDME to
142 * be received containing that cell digest.
143 *
144 * For example, position 2 (starting at 0) means that we've received 300
145 * cells so the 300th cell digest is kept at index 2.
146 *
147 * At maximum, this list contains 200 bytes plus the smartlist overhead.
148 *
149 * The elements in this list are always of length SENDME_TAG_LEN_TOR1
150 * (== DIGEST_LEN, == 20). The actual digests stored in those elements
151 * may be smaller, however, if another relay crypto algorithm is in use.
152 **/
153 /* Note that this is a per-circuit field, although logically it might make
154 * more sense for it to be a per-hop field. That doesn't matter in C tor,
155 * since we don't send more than a single window of cells to any given
156 * relay except for the exit.
157 */
159
160 /**
161 * If this is non-0, then this is the crypt_path_t for the hop
162 * which we expect sendme recorded in sendme_last_digests to arrive.
163 *
164 * NOTE: We only compare this pointer for equality. We never indirect
165 * into it.
166 **/
168
169 /** Temporary field used during circuits_handle_oom. */
170 uint32_t age_tmp;
171
172 /** For storage while n_chan is pending (state CIRCUIT_STATE_CHAN_WAIT). */
174
175 /** When did circuit construction actually begin (ie send the
176 * CREATE cell or begin cannibalization).
177 *
178 * Note: This timer will get reset if we decide to cannibalize
179 * a circuit. It may also get reset during certain phases of hidden
180 * service circuit use.
181 *
182 * We keep this timestamp with a higher resolution than most so that the
183 * circuit-build-time tracking code can get millisecond resolution.
184 */
186
187 /** This timestamp marks when the init_circuit_base constructor ran. */
189
190 /** When the circuit was first used, or 0 if the circuit is clean.
191 *
192 * XXXX Note that some code will artificially adjust this value backward
193 * in time in order to indicate that a circuit shouldn't be used for new
194 * streams, but that it can stay alive as long as it has streams on it.
195 * That's a kludge we should fix.
196 *
197 * XXX The CBT code uses this field to record when HS-related
198 * circuits entered certain states. This usage probably won't
199 * interfere with this field's primary purpose, but we should
200 * document it more thoroughly to make sure of that.
201 *
202 * XXX The SocksPort option KeepaliveIsolateSOCKSAuth will artificially
203 * adjust this value forward each time a suitable stream is attached to an
204 * already constructed circuit, potentially keeping the circuit alive
205 * indefinitely.
206 */
208
209 uint16_t marked_for_close; /**< Should we close this circuit at the end of
210 * the main loop? (If true, holds the line number
211 * where this circuit was marked.) */
212 const char *marked_for_close_file; /**< For debugging: in which file was this
213 * circuit marked for close? */
214 /** For what reason (See END_CIRC_REASON...) is this circuit being closed?
215 * This field is set in circuit_mark_for_close and used later in
216 * circuit_about_to_free. */
218 /** As marked_for_close_reason, but reflects the underlying reason for
219 * closing this circuit.
220 */
222
223 /** Unique ID for measuring tunneled network status requests. */
224 uint64_t dirreq_id;
225
226 /** Index in smartlist of all circuits (global_circuitlist). */
228
229 /** Various statistics about cells being added to or removed from this
230 * circuit's queues; used only if CELL_STATS events are enabled and
231 * cleared after being sent to control port. */
233
234 /** If set, points to an HS token that this circuit might be carrying.
235 * Used by the HS circuitmap. */
236 struct hs_token_t *hs_token;
237 /** Hashtable node: used to look up the circuit by its HS token using the HS
238 circuitmap. */
239 HT_ENTRY(circuit_t) hs_circuitmap_node;
240
241 /** Adaptive Padding state machines: these are immutable. The state machines
242 * that come from the consensus are saved to a global structure, to avoid
243 * per-circuit allocations. This merely points to the global copy in
244 * origin_padding_machines or relay_padding_machines that should never
245 * change or get deallocated.
246 *
247 * Each element of this array corresponds to a different padding machine,
248 * and we can have up to CIRCPAD_MAX_MACHINES such machines. */
250
251 /** Adaptive Padding machine runtime info for above machines. This is
252 * the per-circuit mutable information, such as the current state and
253 * histogram token counts. Some of it is optional (aka NULL).
254 * If a machine is being shut down, these indexes can be NULL
255 * without the corresponding padding_machine being NULL, while we
256 * wait for the other end to respond to our shutdown request.
257 *
258 * Each element of this array corresponds to a different padding machine,
259 * and we can have up to CIRCPAD_MAX_MACHINES such machines. */
261
262 /** padding_machine_ctr increments each time a new padding machine
263 * is negotiated. It is used for shutdown conditions, to ensure
264 * that STOP commands actually correspond to the current machine,
265 * and not a previous one. */
267
268 /** Congestion control fields */
270
271 /** Conflux linked circuit information.
272 *
273 * If this is non-NULL, the circuit is linked and part of a usable set,
274 * and for origin_circuit_t subtypes, the circuit purpose is
275 * CIRCUIT_PURPOSE_CONFLUX_LINKED.
276 *
277 * If this is NULL, the circuit could still be part of a pending conflux
278 * object, in which case the conflux_pending_nonce field is set, and for
279 * origin_circuit_t subtypes, the purpose is
280 * CIRCUIT_PURPOSE_CONFLUX_UNLINKED.
281 */
283
284 /** If set, this circuit is considered *unlinked* and in the pending pool.
285 * The nonce value is used to find the other legs. Origin circuits that
286 * have this set are in the CIRCUIT_PURPOSE_CONFLUX_UNLINKED purpose.
287 *
288 * If this is NULL, and conflux object is set, it means this circuit is
289 * linked and thus part of a usable set. */
291};
292
293#endif /* !defined(CIRCUIT_ST_H) */
Cell queue structures.
#define CIRCPAD_MAX_MACHINES
Definition circuit_st.h:28
Macros for C weak-handle implementation.
Master header file for Tor-specific functionality.
uint32_t circid_t
Definition or.h:588
uint32_t age_tmp
Definition circuit_st.h:170
unsigned int p_delete_pending
Definition circuit_st.h:99
struct hs_token_t * hs_token
Definition circuit_st.h:236
int marked_for_close_reason
Definition circuit_st.h:217
uint8_t state
Definition circuit_st.h:111
int global_circuitlist_idx
Definition circuit_st.h:227
unsigned int circuit_blocked_on_n_chan
Definition circuit_st.h:92
int marked_for_close_orig_reason
Definition circuit_st.h:221
uint16_t send_randomness_after_n_cells
Definition circuit_st.h:128
struct create_cell_t * n_chan_create_cell
Definition circuit_st.h:173
unsigned int circuit_blocked_on_p_chan
Definition circuit_st.h:95
unsigned int have_sent_sufficiently_random_cell
Definition circuit_st.h:109
uint64_t dirreq_id
Definition circuit_st.h:224
time_t timestamp_dirty
Definition circuit_st.h:207
cell_queue_t n_chan_cells
Definition circuit_st.h:82
uint32_t magic
Definition circuit_st.h:63
struct circpad_machine_runtime_t * padding_info[CIRCPAD_MAX_MACHINES]
Definition circuit_st.h:260
smartlist_t * sendme_last_digests
Definition circuit_st.h:158
unsigned int received_destroy
Definition circuit_st.h:105
uint16_t marked_for_close
Definition circuit_st.h:209
struct conflux_t * conflux
Definition circuit_st.h:282
const struct circpad_machine_spec_t * padding_machine[CIRCPAD_MAX_MACHINES]
Definition circuit_st.h:249
const struct crypt_path_t * sendme_digest_hop
Definition circuit_st.h:167
uint8_t purpose
Definition circuit_st.h:112
const char * marked_for_close_file
Definition circuit_st.h:212
uint32_t padding_machine_ctr
Definition circuit_st.h:266
unsigned int n_delete_pending
Definition circuit_st.h:102
HT_ENTRY(circuit_t) hs_circuitmap_node
struct timeval timestamp_began
Definition circuit_st.h:185
int deliver_window
Definition circuit_st.h:122
int package_window
Definition circuit_st.h:117
uint8_t * conflux_pending_nonce
Definition circuit_st.h:290
HANDLE_ENTRY(circuit, circuit_t)
smartlist_t * testing_cell_stats
Definition circuit_st.h:232
struct timeval timestamp_created
Definition circuit_st.h:188
channel_t * n_chan
Definition circuit_st.h:70
extend_info_t * n_hop
Definition circuit_st.h:88
circid_t n_circ_id
Definition circuit_st.h:79
struct congestion_control_t * ccontrol
Definition circuit_st.h:269