Tor 0.4.9.0-alpha-dev
circuitlist.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 circuitlist.h
9 * \brief Header file for circuitlist.c.
10 **/
11
12#ifndef TOR_CIRCUITLIST_H
13#define TOR_CIRCUITLIST_H
14
17#include "feature/hs/hs_ident.h"
18#include "core/or/ocirc_event.h"
19
20/** Circuit state: I'm the origin, still haven't done all my handshakes. */
21#define CIRCUIT_STATE_BUILDING 0
22/** Circuit state: Waiting to process the onionskin. */
23#define CIRCUIT_STATE_ONIONSKIN_PENDING 1
24/** Circuit state: I'd like to deliver a create, but my n_chan is still
25 * connecting. */
26#define CIRCUIT_STATE_CHAN_WAIT 2
27/** Circuit state: the circuit is open but we don't want to actually use it
28 * until we find out if a better guard will be available.
29 */
30#define CIRCUIT_STATE_GUARD_WAIT 3
31/** Circuit state: onionskin(s) processed, ready to send/receive cells. */
32#define CIRCUIT_STATE_OPEN 4
33
34#define CIRCUIT_PURPOSE_MIN_ 1
35
36/* these circuits were initiated elsewhere */
37#define CIRCUIT_PURPOSE_OR_MIN_ 1
38/** OR-side circuit purpose: normal circuit, at OR. */
39#define CIRCUIT_PURPOSE_OR 1
40/** OR-side circuit purpose: At OR, from the service, waiting for intro from
41 * clients. */
42#define CIRCUIT_PURPOSE_INTRO_POINT 2
43/** OR-side circuit purpose: At OR, from the client, waiting for the service.
44 */
45#define CIRCUIT_PURPOSE_REND_POINT_WAITING 3
46/** OR-side circuit purpose: At OR, both circuits have this purpose. */
47#define CIRCUIT_PURPOSE_REND_ESTABLISHED 4
48#define CIRCUIT_PURPOSE_OR_MAX_ 4
49
50/* these circuits originate at this node */
51
52/* here's how circ client-side purposes work:
53 * normal circuits are C_GENERAL.
54 * circuits that are c_introducing are either on their way to
55 * becoming open, or they are open and waiting for a
56 * suitable rendcirc before they send the intro.
57 * circuits that are c_introduce_ack_wait have sent the intro,
58 * but haven't gotten a response yet.
59 * circuits that are c_establish_rend are either on their way
60 * to becoming open, or they are open and have sent the
61 * establish_rendezvous cell but haven't received an ack.
62 * circuits that are c_rend_ready are open and have received a
63 * rend ack, but haven't heard from the service yet.
64 * circuits that are c_rend_ready_intro_acked are open, and
65 * some intro circ has sent its intro and received an ack.
66 * circuits that are c_rend_joined are open, have heard from
67 * the service, and are talking to it.
68 */
69/** Client-side circuit purpose: Normal circuit, with cpath. */
70#define CIRCUIT_PURPOSE_C_GENERAL 5
71#define CIRCUIT_PURPOSE_C_HS_MIN_ 6
72/** Client-side circuit purpose: at the client, connecting to intro point. */
73#define CIRCUIT_PURPOSE_C_INTRODUCING 6
74/** Client-side circuit purpose: at the client, sent INTRODUCE1 to intro point,
75 * waiting for ACK/NAK. */
76#define CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT 7
77/** Client-side circuit purpose: at the client, introduced and acked, closing.
78 */
79#define CIRCUIT_PURPOSE_C_INTRODUCE_ACKED 8
80/** Client-side circuit purpose: at the client, waiting for ack. */
81#define CIRCUIT_PURPOSE_C_ESTABLISH_REND 9
82/** Client-side circuit purpose: at the client, waiting for the service. */
83#define CIRCUIT_PURPOSE_C_REND_READY 10
84/** Client-side circuit purpose: at the client, waiting for the service,
85 * INTRODUCE has been acknowledged. */
86#define CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED 11
87/** Client-side circuit purpose: at the client, rendezvous established. */
88#define CIRCUIT_PURPOSE_C_REND_JOINED 12
89/** This circuit is used for getting hsdirs */
90#define CIRCUIT_PURPOSE_C_HSDIR_GET 13
91#define CIRCUIT_PURPOSE_C_HS_MAX_ 13
92/** This circuit is used for build time measurement only */
93#define CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT 14
94/** This circuit is being held open by circuit padding */
95#define CIRCUIT_PURPOSE_C_CIRCUIT_PADDING 15
96#define CIRCUIT_PURPOSE_C_MAX_ 15
97
98#define CIRCUIT_PURPOSE_S_HS_MIN_ 16
99/** Hidden-service-side circuit purpose: at the service, waiting for
100 * introductions. */
101#define CIRCUIT_PURPOSE_S_ESTABLISH_INTRO 16
102/** Hidden-service-side circuit purpose: at the service, successfully
103 * established intro. */
104#define CIRCUIT_PURPOSE_S_INTRO 17
105/** Hidden-service-side circuit purpose: at the service, connecting to rend
106 * point. */
107#define CIRCUIT_PURPOSE_S_CONNECT_REND 18
108/** Hidden-service-side circuit purpose: at the service, rendezvous
109 * established. */
110#define CIRCUIT_PURPOSE_S_REND_JOINED 19
111/** This circuit is used for uploading hsdirs */
112#define CIRCUIT_PURPOSE_S_HSDIR_POST 20
113#define CIRCUIT_PURPOSE_S_HS_MAX_ 20
114
115/** A testing circuit; not meant to be used for actual traffic. It is used for
116 * bandwidth measurement, reachability test and address discovery from an
117 * authority using the NETINFO cell. */
118#define CIRCUIT_PURPOSE_TESTING 21
119/** A controller made this circuit and Tor should not cannibalize it or attach
120 * streams to it without explicitly being told. */
121#define CIRCUIT_PURPOSE_CONTROLLER 22
122/** This circuit is used for path bias probing only */
123#define CIRCUIT_PURPOSE_PATH_BIAS_TESTING 23
124
125/** This circuit is used for vanguards/restricted paths.
126 *
127 * This type of circuit is *only* created preemptively and never
128 * on-demand. When an HS operation needs to take place (e.g. connect to an
129 * intro point), these circuits are then cannibalized and repurposed to the
130 * actual needed HS purpose. */
131#define CIRCUIT_PURPOSE_HS_VANGUARDS 24
132
133/**
134 * These two purposes are for conflux. The first is for circuits that are
135 * being built, but not yet linked. The second is for circuits that are
136 * linked and ready to use for streams. */
137#define CIRCUIT_PURPOSE_CONFLUX_UNLINKED 25
138#define CIRCUIT_PURPOSE_CONFLUX_LINKED 26
139
140#define CIRCUIT_PURPOSE_MAX_ 26
141/** A catch-all for unrecognized purposes. Currently we don't expect
142 * to make or see any circuits with this purpose. */
143#define CIRCUIT_PURPOSE_UNKNOWN 255
144
145/** True iff the circuit purpose <b>p</b> is for a circuit that
146 * originated at this node. */
147#define CIRCUIT_PURPOSE_IS_ORIGIN(p) ((p)>CIRCUIT_PURPOSE_OR_MAX_)
148/** True iff the circuit purpose <b>p</b> is for a circuit that originated
149 * here to serve as a client. (Hidden services don't count here.) */
150#define CIRCUIT_PURPOSE_IS_CLIENT(p) \
151 ((p)> CIRCUIT_PURPOSE_OR_MAX_ && \
152 (p)<=CIRCUIT_PURPOSE_C_MAX_)
153/** True iff the circuit_t <b>c</b> is actually an origin_circuit_t. */
154#define CIRCUIT_IS_ORIGIN(c) (CIRCUIT_PURPOSE_IS_ORIGIN((c)->purpose))
155/** True iff the circuit purpose <b>p</b> is for an established rendezvous
156 * circuit. */
157#define CIRCUIT_PURPOSE_IS_ESTABLISHED_REND(p) \
158 ((p) == CIRCUIT_PURPOSE_C_REND_JOINED || \
159 (p) == CIRCUIT_PURPOSE_S_REND_JOINED)
160/** True iff the circuit_t c is actually an or_circuit_t */
161#define CIRCUIT_IS_ORCIRC(c) (((circuit_t *)(c))->magic == OR_CIRCUIT_MAGIC)
162
163/** True iff this circuit purpose should count towards the global
164 * pending rate limit (set by MaxClientCircuitsPending). We count all
165 * general purpose circuits, as well as the first step of client onion
166 * service connections (HSDir gets). */
167#define CIRCUIT_PURPOSE_COUNTS_TOWARDS_MAXPENDING(p) \
168 ((p) == CIRCUIT_PURPOSE_C_GENERAL || \
169 (p) == CIRCUIT_PURPOSE_C_HSDIR_GET)
170
171/** Stats. */
172extern double cc_stats_circ_close_cwnd_ma;
174extern uint64_t cc_stats_circs_closed;
175extern uint64_t circ_n_proto_violation;
176
177/** Convert a circuit_t* to a pointer to the enclosing or_circuit_t. Assert
178 * if the cast is impossible. */
180const or_circuit_t *CONST_TO_OR_CIRCUIT(const circuit_t *);
181/** Convert a circuit_t* to a pointer to the enclosing origin_circuit_t.
182 * Assert if the cast is impossible. */
184const origin_circuit_t *CONST_TO_ORIGIN_CIRCUIT(const circuit_t *);
185
190void circuit_cache_opened_circuit_state(int circuits_are_opened);
191
192const char *circuit_state_to_string(int state);
193const char *circuit_purpose_to_controller_string(uint8_t purpose);
194const char *circuit_purpose_to_controller_hs_state_string(uint8_t purpose);
195const char *circuit_purpose_to_string(uint8_t purpose);
196void circuit_dump_by_conn(connection_t *conn, int severity);
198 channel_t *chan);
200 channel_t *chan);
204 channel_t *chan);
206 int reason_code);
207void circuit_set_state(circuit_t *circ, uint8_t state);
208void circuit_close_all_marked(void);
211or_circuit_t *or_circuit_new(circid_t p_circ_id, channel_t *p_chan);
213 channel_t *chan);
214circuit_t *
216 channel_t *chan);
219void circuit_unlink_all_from_channel(channel_t *chan, int reason);
222 uint8_t purpose);
224 bool want_client_circ);
226origin_circuit_t *circuit_get_next_service_hsdir_circ(origin_circuit_t *start);
228 extend_info_t *info, int flags);
233MOCK_DECL(void, circuit_mark_for_close_, (circuit_t *circ, int reason,
234 int line, const char *cfile));
240 channel_t *chan);
242
243#define circuit_mark_for_close(c, reason) \
244 circuit_mark_for_close_((c), (reason), __LINE__, SHORT_FILE__)
245
246MOCK_DECL(void, assert_circuit_ok,(const circuit_t *c));
247void circuit_free_all(void);
248size_t circuits_handle_oom(size_t current_allocation);
249
251
254 (channel_t *chan, circid_t id));
255
257
258bool circuit_is_queue_full(const circuit_t *circ, cell_direction_t direction);
259
260/* Declare the handle helpers */
261HANDLE_DECL(circuit, circuit_t, )
262#define circuit_handle_free(h) \
263 FREE_AND_NULL(circuit_handle_t, circuit_handle_free_, (h))
264
265#ifdef CIRCUITLIST_PRIVATE
266STATIC void circuit_free_(circuit_t *circ);
267#define circuit_free(circ) FREE_AND_NULL(circuit_t, circuit_free_, (circ))
269STATIC uint32_t circuit_max_queued_data_age(const circuit_t *c, uint32_t now);
270STATIC uint32_t circuit_max_queued_cell_age(const circuit_t *c, uint32_t now);
271STATIC uint32_t circuit_max_queued_item_age(const circuit_t *c, uint32_t now);
272#endif /* defined(CIRCUITLIST_PRIVATE) */
273
274#endif /* !defined(TOR_CIRCUITLIST_H) */
STATIC uint32_t circuit_max_queued_item_age(const circuit_t *c, uint32_t now)
Definition: circuitlist.c:2620
STATIC void circuit_free_(circuit_t *circ)
Definition: circuitlist.c:1159
STATIC size_t n_cells_in_circ_queues(const circuit_t *c)
Definition: circuitlist.c:2507
STATIC uint32_t circuit_max_queued_data_age(const circuit_t *c, uint32_t now)
Definition: circuitlist.c:2605
STATIC uint32_t circuit_max_queued_cell_age(const circuit_t *c, uint32_t now)
Definition: circuitlist.c:2540
void circuit_mark_for_close_(circuit_t *circ, int reason, int line, const char *cfile)
Definition: circuitlist.c:2197
void circuit_close_all_marked(void)
Definition: circuitlist.c:681
const char * circuit_purpose_to_controller_hs_state_string(uint8_t purpose)
Definition: circuitlist.c:867
int circuit_any_opened_circuits_cached(void)
Definition: circuitlist.c:774
void channel_note_destroy_pending(channel_t *chan, circid_t id)
Definition: circuitlist.c:428
uint64_t circ_n_proto_violation
Definition: circuitlist.c:165
circuit_t * circuit_get_by_circid_channel_even_if_marked(circid_t circ_id, channel_t *chan)
Definition: circuitlist.c:1560
origin_circuit_t * circuit_get_next_by_purpose(origin_circuit_t *start, uint8_t purpose)
Definition: circuitlist.c:1804
int circuit_id_in_use_on_channel(circid_t circ_id, channel_t *chan)
Definition: circuitlist.c:1574
or_circuit_t * or_circuit_new(circid_t p_circ_id, channel_t *p_chan)
Definition: circuitlist.c:1123
void circuit_synchronize_written_or_bandwidth(const circuit_t *c, circuit_channel_direction_t dir)
Definition: circuitlist.c:2134
void circuit_set_n_circid_chan(circuit_t *circ, circid_t id, channel_t *chan)
Definition: circuitlist.c:493
double cc_stats_circ_close_ss_cwnd_ma
Definition: circuitlist.c:159
void circuit_mark_all_dirty_circs_as_unusable(void)
Definition: circuitlist.c:2106
origin_circuit_t * circuit_find_to_cannibalize(uint8_t purpose, extend_info_t *info, int flags)
Definition: circuitlist.c:1893
void circuit_clear_cpath(origin_circuit_t *circ)
Definition: circuitlist.c:1313
void circuit_set_state(circuit_t *circ, uint8_t state)
Definition: circuitlist.c:562
void circuit_free_all(void)
Definition: circuitlist.c:1337
circuit_t * circuit_get_by_edge_conn(edge_connection_t *conn)
Definition: circuitlist.c:1606
smartlist_t * circuit_find_circuits_to_upgrade_from_guard_wait(void)
Definition: circuitlist.c:2007
origin_circuit_t * circuit_get_next_intro_circ(const origin_circuit_t *start, bool want_client_circ)
Definition: circuitlist.c:1721
origin_circuit_t * circuit_get_by_global_id(uint32_t id)
Definition: circuitlist.c:1453
int circuit_get_cpath_opened_len(const origin_circuit_t *)
Definition: circuitlist.c:2051
origin_circuit_t * origin_circuit_new(void)
Definition: circuitlist.c:1050
void channel_mark_circid_unusable(channel_t *chan, circid_t id)
Definition: circuitlist.c:372
void circuit_dump_by_conn(connection_t *conn, int severity)
Definition: circuitlist.c:1412
or_circuit_t * TO_OR_CIRCUIT(circuit_t *)
Definition: circuitlist.c:173
int circuit_any_opened_circuits(void)
Definition: circuitlist.c:737
int circuit_get_cpath_len(origin_circuit_t *circ)
Definition: circuitlist.c:2035
void channel_mark_circid_usable(channel_t *chan, circid_t id)
Definition: circuitlist.c:405
void circuit_set_p_circid_chan(or_circuit_t *circ, circid_t id, channel_t *chan)
Definition: circuitlist.c:470
const char * circuit_purpose_to_controller_string(uint8_t purpose)
Definition: circuitlist.c:801
void assert_circuit_ok(const circuit_t *c)
Definition: circuitlist.c:2809
const char * circuit_state_to_string(int state)
Definition: circuitlist.c:781
int circuit_count_pending_on_channel(channel_t *chan)
Definition: circuitlist.c:628
origin_circuit_t * TO_ORIGIN_CIRCUIT(circuit_t *)
Definition: circuitlist.c:185
size_t circuits_handle_oom(size_t current_allocation)
Definition: circuitlist.c:2676
void circuit_get_all_pending_on_channel(smartlist_t *out, channel_t *chan)
Definition: circuitlist.c:597
int circuit_event_status(origin_circuit_t *circ, circuit_status_event_t tp, int reason_code)
Definition: circuitlist.c:518
time_t circuit_id_when_marked_unusable_on_channel(circid_t circ_id, channel_t *chan)
Definition: circuitlist.c:1587
void circuit_cache_opened_circuit_state(int circuits_are_opened)
Definition: circuitlist.c:763
origin_circuit_t * circuit_get_next_service_rp_circ(origin_circuit_t *start)
Definition: circuitlist.c:1773
circuit_t * circuit_get_by_circid_channel(circid_t circ_id, channel_t *chan)
Definition: circuitlist.c:1545
double cc_stats_circ_close_cwnd_ma
Definition: circuitlist.c:157
crypt_path_t * circuit_get_cpath_hop(origin_circuit_t *circ, int hopnum)
Definition: circuitlist.c:2071
const char * circuit_purpose_to_string(uint8_t purpose)
Definition: circuitlist.c:929
void channel_note_destroy_not_pending(channel_t *chan, circid_t id)
Definition: circuitlist.c:448
void circuit_clear_testing_cell_stats(circuit_t *circ)
Definition: circuitlist.c:1146
smartlist_t * circuit_get_global_origin_circuit_list(void)
Definition: circuitlist.c:722
bool circuit_is_queue_full(const circuit_t *circ, cell_direction_t direction)
Definition: circuitlist.c:2883
smartlist_t * circuit_get_global_list(void)
Definition: circuitlist.c:713
void circuit_unlink_all_from_channel(channel_t *chan, int reason)
Definition: circuitlist.c:1623
void circuit_mark_all_unused_circs(void)
Definition: circuitlist.c:2087
int32_t circuit_initial_package_window(void)
Definition: circuitlist.c:1007
Macros for C weak-handle implementation.
Header file containing circuit and connection identifier data for the whole HS subsystem.
Header file for ocirc_event.c.
circuit_status_event_t
Definition: ocirc_event.h:19
uint32_t circid_t
Definition: or.h:497
cell_direction_t
Definition: or.h:375
circuit_channel_direction_t
Definition: or.h:387
Macros to implement mocking and selective exposure for the test code.
#define STATIC
Definition: testsupport.h:32
#define MOCK_DECL(rv, funcname, arglist)
Definition: testsupport.h:127