tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

circuitlist.h (12695B)


      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 
     15 #include "lib/container/handles.h"
     16 #include "lib/testsupport/testsupport.h"
     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. */
    172 extern double cc_stats_circ_close_cwnd_ma;
    173 extern double cc_stats_circ_close_ss_cwnd_ma;
    174 extern uint64_t cc_stats_circs_closed;
    175 extern 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. */
    179 or_circuit_t *TO_OR_CIRCUIT(circuit_t *);
    180 const 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. */
    183 origin_circuit_t *TO_ORIGIN_CIRCUIT(circuit_t *);
    184 const origin_circuit_t *CONST_TO_ORIGIN_CIRCUIT(const circuit_t *);
    185 
    186 MOCK_DECL(smartlist_t *, circuit_get_global_list, (void));
    187 smartlist_t *circuit_get_global_origin_circuit_list(void);
    188 int circuit_any_opened_circuits(void);
    189 int circuit_any_opened_circuits_cached(void);
    190 void circuit_cache_opened_circuit_state(int circuits_are_opened);
    191 
    192 const char *circuit_state_to_string(int state);
    193 const char *circuit_purpose_to_controller_string(uint8_t purpose);
    194 const char *circuit_purpose_to_controller_hs_state_string(uint8_t purpose);
    195 const char *circuit_purpose_to_string(uint8_t purpose);
    196 void circuit_dump_by_conn(connection_t *conn, int severity);
    197 void circuit_set_p_circid_chan(or_circuit_t *circ, circid_t id,
    198                               channel_t *chan);
    199 void circuit_set_n_circid_chan(circuit_t *circ, circid_t id,
    200                               channel_t *chan);
    201 void channel_mark_circid_unusable(channel_t *chan, circid_t id);
    202 void channel_mark_circid_usable(channel_t *chan, circid_t id);
    203 time_t circuit_id_when_marked_unusable_on_channel(circid_t circ_id,
    204                                                  channel_t *chan);
    205 int circuit_event_status(origin_circuit_t *circ, circuit_status_event_t tp,
    206                         int reason_code);
    207 void circuit_set_state(circuit_t *circ, uint8_t state);
    208 void circuit_close_all_marked(void);
    209 int32_t circuit_initial_package_window(void);
    210 origin_circuit_t *origin_circuit_new(void);
    211 or_circuit_t *or_circuit_new(circid_t p_circ_id, channel_t *p_chan);
    212 circuit_t *circuit_get_by_circid_channel(circid_t circ_id,
    213                                         channel_t *chan);
    214 circuit_t *
    215 circuit_get_by_circid_channel_even_if_marked(circid_t circ_id,
    216                                             channel_t *chan);
    217 int circuit_id_in_use_on_channel(circid_t circ_id, channel_t *chan);
    218 circuit_t *circuit_get_by_edge_conn(edge_connection_t *conn);
    219 void circuit_unlink_all_from_channel(channel_t *chan, int reason);
    220 origin_circuit_t *circuit_get_by_global_id(uint32_t id);
    221 origin_circuit_t *circuit_get_next_by_purpose(origin_circuit_t *start,
    222                                              uint8_t purpose);
    223 origin_circuit_t *circuit_get_next_intro_circ(const origin_circuit_t *start,
    224                                              bool want_client_circ);
    225 origin_circuit_t *circuit_get_next_service_rp_circ(origin_circuit_t *start);
    226 origin_circuit_t *circuit_get_next_service_hsdir_circ(origin_circuit_t *start);
    227 origin_circuit_t *circuit_find_to_cannibalize(uint8_t purpose,
    228                                              extend_info_t *info, int flags);
    229 void circuit_mark_all_unused_circs(void);
    230 void circuit_mark_all_dirty_circs_as_unusable(void);
    231 void circuit_synchronize_written_or_bandwidth(const circuit_t *c,
    232                                              circuit_channel_direction_t dir);
    233 MOCK_DECL(void, circuit_mark_for_close_, (circuit_t *circ, int reason,
    234                                          int line, const char *cfile));
    235 int circuit_get_cpath_len(origin_circuit_t *circ);
    236 int circuit_get_cpath_opened_len(const origin_circuit_t *);
    237 void circuit_clear_cpath(origin_circuit_t *circ);
    238 crypt_path_t *circuit_get_cpath_hop(origin_circuit_t *circ, int hopnum);
    239 void circuit_get_all_pending_on_channel(smartlist_t *out,
    240                                        channel_t *chan);
    241 int circuit_count_pending_on_channel(channel_t *chan);
    242 
    243 #define circuit_mark_for_close(c, reason)                               \
    244  circuit_mark_for_close_((c), (reason), __LINE__, SHORT_FILE__)
    245 
    246 MOCK_DECL(void, assert_circuit_ok,(const circuit_t *c));
    247 void circuit_free_all(void);
    248 size_t circuits_handle_oom(size_t current_allocation);
    249 
    250 void circuit_clear_testing_cell_stats(circuit_t *circ);
    251 
    252 void channel_note_destroy_pending(channel_t *chan, circid_t id);
    253 MOCK_DECL(void, channel_note_destroy_not_pending,
    254          (channel_t *chan, circid_t id));
    255 
    256 smartlist_t *circuit_find_circuits_to_upgrade_from_guard_wait(void);
    257 
    258 bool circuit_is_queue_full(const circuit_t *circ, cell_direction_t direction);
    259 
    260 /* Declare the handle helpers */
    261 HANDLE_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
    266 STATIC void circuit_free_(circuit_t *circ);
    267 #define circuit_free(circ) FREE_AND_NULL(circuit_t, circuit_free_, (circ))
    268 STATIC size_t n_cells_in_circ_queues(const circuit_t *c);
    269 STATIC uint32_t circuit_max_queued_data_age(const circuit_t *c, uint32_t now);
    270 STATIC uint32_t circuit_max_queued_cell_age(const circuit_t *c, uint32_t now);
    271 STATIC 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) */