Tor 0.5.0.0-alpha-dev
Loading...
Searching...
No Matches
circuituse.c
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 circuituse.c
9 * \brief Launch the right sort of circuits and attach the right streams to
10 * them.
11 *
12 * As distinct from circuitlist.c, which manages lookups to find circuits, and
13 * circuitbuild.c, which handles the logistics of circuit construction, this
14 * module keeps track of which streams can be attached to which circuits (in
15 * circuit_get_best()), and attaches streams to circuits (with
16 * circuit_try_attaching_streams(), connection_ap_handshake_attach_circuit(),
17 * and connection_ap_handshake_attach_chosen_circuit() ).
18 *
19 * This module also makes sure that we are building circuits for all of the
20 * predicted ports, using circuit_remove_handled_ports(),
21 * circuit_stream_is_being_handled(), and circuit_build_needed_cirs(). It
22 * handles launching circuits for specific targets using
23 * circuit_launch_by_extend_info().
24 *
25 * This is also where we handle expiring circuits that have been around for
26 * too long without actually completing, along with the circuit_build_timeout
27 * logic in circuitstats.c.
28 **/
29
30#include "core/or/or.h"
31#include "app/config/config.h"
33#include "core/or/channel.h"
35#include "core/or/circuitlist.h"
37#include "core/or/circuituse.h"
41#include "core/or/extendinfo.h"
42#include "core/or/policies.h"
43#include "core/or/trace_probes_circuit.h"
46#include "feature/client/circpathbias.h"
54#include "feature/hs/hs_ident.h"
56#include "feature/hs/hs_stats.h"
64#include "lib/math/fp.h"
65#include "lib/time/tvdiff.h"
66#include "lib/trace/events.h"
68#include "core/or/conflux.h"
69
74#include "core/or/or_circuit_st.h"
77
79
81static void circuit_increment_failure_count(void);
83 const entry_connection_t *);
84
85/** Check whether the hidden service destination of the stream at
86 * <b>edge_conn</b> is the same as the destination of the circuit at
87 * <b>origin_circ</b>. */
88static int
90 const origin_circuit_t *origin_circ)
91{
92 /* Check if this is a v3 rendezvous circ/stream */
93 if ((edge_conn->hs_ident && !origin_circ->hs_ident) ||
94 (!edge_conn->hs_ident && origin_circ->hs_ident) ||
95 (edge_conn->hs_ident && origin_circ->hs_ident &&
96 !ed25519_pubkey_eq(&edge_conn->hs_ident->identity_pk,
97 &origin_circ->hs_ident->identity_pk))) {
98 /* this circ is not for this conn */
99 return 0;
100 }
101
102 return 1;
103}
104
105/** Return 1 if <b>circ</b> could be returned by circuit_get_best().
106 * Else return 0.
107 */
108int
110 const entry_connection_t *conn,
111 int must_be_open, uint8_t purpose,
112 int need_uptime, int need_internal,
113 time_t now)
114{
115 const circuit_t *circ = TO_CIRCUIT(origin_circ);
116 const node_t *exitnode;
117 cpath_build_state_t *build_state;
118 tor_assert(circ);
119 tor_assert(conn);
121
122 if (must_be_open && (circ->state != CIRCUIT_STATE_OPEN || !circ->n_chan))
123 return 0; /* ignore non-open circs */
124 if (circ->marked_for_close)
125 return 0;
126
127 /* if this circ isn't our purpose, skip. */
128 if (purpose == CIRCUIT_PURPOSE_C_REND_JOINED && !must_be_open) {
133 return 0;
134 } else if (purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT &&
135 !must_be_open) {
138 return 0;
139 } else {
140 if (purpose != circ->purpose)
141 return 0;
142 }
143
144 if (purpose == CIRCUIT_PURPOSE_C_GENERAL ||
145 purpose == CIRCUIT_PURPOSE_C_HSDIR_GET ||
146 purpose == CIRCUIT_PURPOSE_S_HSDIR_POST ||
147 purpose == CIRCUIT_PURPOSE_HS_VANGUARDS ||
149 purpose == CIRCUIT_PURPOSE_CONFLUX_LINKED) {
150 if (circ->timestamp_dirty &&
151 circ->timestamp_dirty+get_options()->MaxCircuitDirtiness <= now)
152 return 0;
153 }
154
155 if (origin_circ->unusable_for_new_conns)
156 return 0;
157
158 /* decide if this circ is suitable for this conn */
159
160 /* for rend circs, circ->cpath->prev is not the last router in the
161 * circuit, it's the magical extra service hop. so just check the nickname
162 * of the one we meant to finish at.
163 */
164 build_state = origin_circ->build_state;
165 exitnode = build_state_get_exit_node(build_state);
166
167 if (need_uptime && !build_state->need_uptime)
168 return 0;
169 if (need_internal != build_state->is_internal)
170 return 0;
171
172 if (purpose == CIRCUIT_PURPOSE_C_GENERAL ||
174 purpose == CIRCUIT_PURPOSE_CONFLUX_LINKED ||
175 purpose == CIRCUIT_PURPOSE_S_HSDIR_POST ||
176 purpose == CIRCUIT_PURPOSE_C_HSDIR_GET) {
177 tor_addr_t addr;
178 if (!exitnode && !build_state->onehop_tunnel) {
179 log_debug(LD_CIRC,"Not considering circuit with unknown router.");
180 return 0; /* this circuit is screwed and doesn't know it yet,
181 * or is a rendezvous circuit. */
182 }
183 if (build_state->onehop_tunnel) {
184 if (!conn->want_onehop) {
185 log_debug(LD_CIRC,"Skipping one-hop circuit.");
186 return 0;
187 }
189 if (build_state->chosen_exit) {
190 char digest[DIGEST_LEN];
191 if (hexdigest_to_digest(conn->chosen_exit_name, digest) < 0)
192 return 0; /* broken digest, we don't want it */
193 if (tor_memneq(digest, build_state->chosen_exit->identity_digest,
194 DIGEST_LEN))
195 return 0; /* this is a circuit to somewhere else */
196 if (tor_digest_is_zero(digest)) {
197 /* we don't know the digest; have to compare addr:port */
198 const int family = tor_addr_parse(&addr,
199 conn->socks_request->address);
200 if (family < 0 ||
201 !extend_info_has_orport(build_state->chosen_exit, &addr,
202 conn->socks_request->port))
203 return 0;
204 }
205 }
206 } else {
207 if (conn->want_onehop) {
208 /* don't use three-hop circuits -- that could hurt our anonymity. */
209 return 0;
210 }
211 }
212 if (origin_circ->prepend_policy) {
213 if (tor_addr_parse(&addr, conn->socks_request->address) != -1) {
215 conn->socks_request->port,
216 origin_circ->prepend_policy);
217 if (r == ADDR_POLICY_REJECTED)
218 return 0;
219 }
220 }
221 if (exitnode && !connection_ap_can_use_exit(conn, exitnode)) {
222 /* can't exit from this router */
223 return 0;
224 }
225 } else { /* not general: this might be a rend circuit */
226 const edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(conn);
227 if (!circuit_matches_with_rend_stream(edge_conn, origin_circ)) {
228 return 0;
229 }
230 }
231
232 if (!connection_edge_compatible_with_circuit(conn, origin_circ)) {
233 /* conn needs to be isolated from other conns that have already used
234 * origin_circ */
235 return 0;
236 }
237
238 return 1;
239}
240
241/** Return 1 if circuit <b>a</b> is better than circuit <b>b</b> for
242 * <b>conn</b>, and return 0 otherwise. Used by circuit_get_best.
243 */
244static int
246 const entry_connection_t *conn)
247{
248 const circuit_t *a = TO_CIRCUIT(oa);
249 const circuit_t *b = TO_CIRCUIT(ob);
250 const uint8_t purpose = ENTRY_TO_CONN(conn)->purpose;
251 int a_bits, b_bits;
252
253 /* If one of the circuits was allowed to live due to relaxing its timeout,
254 * it is definitely worse (it's probably a much slower path). */
255 if (oa->relaxed_timeout && !ob->relaxed_timeout)
256 return 0; /* ob is better. It's not relaxed. */
257 if (!oa->relaxed_timeout && ob->relaxed_timeout)
258 return 1; /* oa is better. It's not relaxed. */
259
260 switch (purpose) {
264 /* if it's used but less dirty it's best;
265 * else if it's more recently created it's best
266 */
267 if (b->timestamp_dirty) {
268 if (a->timestamp_dirty &&
270 return 1;
271 } else {
272 if (a->timestamp_dirty ||
274 return 1;
275 if (ob->build_state->is_internal)
276 /* XXXX++ what the heck is this internal thing doing here. I
277 * think we can get rid of it. circuit_is_acceptable() already
278 * makes sure that is_internal is exactly what we need it to
279 * be. -RD */
280 return 1;
281 }
282 break;
284 /* the closer it is to ack_wait the better it is */
285 if (a->purpose > b->purpose)
286 return 1;
287 break;
289 /* the closer it is to rend_joined the better it is */
290 if (a->purpose > b->purpose)
291 return 1;
292 break;
293 }
294
295 /* XXXX Maybe this check should get a higher priority to avoid
296 * using up circuits too rapidly. */
297
299 (origin_circuit_t*)oa, 1);
301 (origin_circuit_t*)ob, 1);
302 /* if x_bits < 0, then we have not used x for anything; better not to dirty
303 * a connection if we can help it. */
304 if (a_bits < 0) {
305 return 0;
306 } else if (b_bits < 0) {
307 return 1;
308 }
309 a_bits &= ~ oa->isolation_flags_mixed;
310 a_bits &= ~ ob->isolation_flags_mixed;
311 if (n_bits_set_u8(a_bits) < n_bits_set_u8(b_bits)) {
312 /* The fewer new restrictions we need to make on a circuit for stream
313 * isolation, the better. */
314 return 1;
315 }
316
317 return 0;
318}
319
320/** Find the best circ that conn can use, preferably one which is
321 * dirty. Circ must not be too old.
322 *
323 * Conn must be defined.
324 *
325 * If must_be_open, ignore circs not in CIRCUIT_STATE_OPEN.
326 *
327 * circ_purpose specifies what sort of circuit we must have.
328 * It can be C_GENERAL, C_INTRODUCE_ACK_WAIT, or C_REND_JOINED.
329 *
330 * If it's REND_JOINED and must_be_open==0, then return the closest
331 * rendezvous-purposed circuit that you can find.
332 *
333 * If it's INTRODUCE_ACK_WAIT and must_be_open==0, then return the
334 * closest introduce-purposed circuit that you can find.
335 */
336static origin_circuit_t *
338 int must_be_open, uint8_t purpose,
339 int need_uptime, int need_internal)
340{
341 origin_circuit_t *best=NULL;
342 struct timeval now;
343 time_t now_sec;
344
345 tor_assert(conn);
346
348 purpose == CIRCUIT_PURPOSE_HS_VANGUARDS ||
349 purpose == CIRCUIT_PURPOSE_C_HSDIR_GET ||
350 purpose == CIRCUIT_PURPOSE_S_HSDIR_POST ||
353
354 tor_gettimeofday(&now);
355 now_sec = now.tv_sec;
356
357 // Prefer pre-built conflux circuits here, if available but only for general
358 // purposes. We don't have onion service conflux support at the moment.
359 if (purpose == CIRCUIT_PURPOSE_C_GENERAL &&
360 (best = conflux_get_circ_for_conn(conn, now_sec))) {
361 return best;
362 }
363
365 origin_circuit_t *origin_circ;
366 if (!CIRCUIT_IS_ORIGIN(circ))
367 continue;
368 origin_circ = TO_ORIGIN_CIRCUIT(circ);
369
370 if (!circuit_is_acceptable(origin_circ,conn,must_be_open,purpose,
371 need_uptime,need_internal, now_sec))
372 continue;
373
374 /* now this is an acceptable circ to hand back. but that doesn't
375 * mean it's the *best* circ to hand back. try to decide.
376 */
377 if (!best || circuit_is_better(origin_circ,best,conn))
378 best = origin_circ;
379 }
380 SMARTLIST_FOREACH_END(circ);
381
382 return best;
383}
384
385/** Return the number of not-yet-open general-purpose origin circuits. */
386static int
388{
389 int count = 0;
390
392 if (circ->marked_for_close ||
393 circ->state == CIRCUIT_STATE_OPEN ||
395 !CIRCUIT_IS_ORIGIN(circ))
396 continue;
397
398 ++count;
399 }
400 SMARTLIST_FOREACH_END(circ);
401
402 return count;
403}
404
405#if 0
406/** Check whether, according to the policies in <b>options</b>, the
407 * circuit <b>circ</b> makes sense. */
408/* XXXX currently only checks Exclude{Exit}Nodes; it should check more.
409 * Also, it doesn't have the right definition of an exit circuit. Also,
410 * it's never called. */
411int
412circuit_conforms_to_options(const origin_circuit_t *circ,
413 const or_options_t *options)
414{
415 const crypt_path_t *cpath, *cpath_next = NULL;
416
417 /* first check if it includes any excluded nodes */
418 for (cpath = circ->cpath; cpath_next != circ->cpath; cpath = cpath_next) {
419 cpath_next = cpath->next;
421 cpath->extend_info))
422 return 0;
423 }
424
425 /* then consider the final hop */
427 circ->cpath->prev->extend_info))
428 return 0;
429
430 return 1;
431}
432#endif /* 0 */
433
434/**
435 * Close all circuits that start at us, aren't open, and were born
436 * at least CircuitBuildTimeout seconds ago.
437 *
438 * TODO: This function is now partially redundant to
439 * circuit_build_times_handle_completed_hop(), but that function only
440 * covers circuits up to and including 3 hops that are still actually
441 * completing hops. However, circuit_expire_building() also handles longer
442 * circuits, as well as circuits that are completely stalled.
443 * In the future (after prop247/other path selection revamping), we probably
444 * want to eliminate this rats nest in favor of a simpler approach.
445 */
446void
448{
449 /* circ_times.timeout_ms and circ_times.close_ms are from
450 * circuit_build_times_get_initial_timeout() if we haven't computed
451 * custom timeouts yet */
452 struct timeval general_cutoff, begindir_cutoff, fourhop_cutoff,
453 close_cutoff, extremely_old_cutoff,
454 cannibalized_cutoff, c_intro_cutoff, s_intro_cutoff, stream_cutoff,
455 c_rend_ready_cutoff;
456 const or_options_t *options = get_options();
457 struct timeval now;
458 cpath_build_state_t *build_state;
459 int any_opened_circs = 0;
460
461 tor_gettimeofday(&now);
462
463 /* Check to see if we have any opened circuits. If we don't,
464 * we want to be more lenient with timeouts, in case the
465 * user has relocated and/or changed network connections.
466 * See bug #3443. */
467 any_opened_circs = circuit_any_opened_circuits();
468
469#define SET_CUTOFF(target, msec) do { \
470 long ms = tor_lround(msec); \
471 struct timeval diff; \
472 diff.tv_sec = ms / 1000; \
473 diff.tv_usec = (int)((ms % 1000) * 1000); \
474 timersub(&now, &diff, &target); \
475 } while (0)
476
477 /**
478 * Because circuit build timeout is calculated only based on 3 hop
479 * general purpose circuit construction, we need to scale the timeout
480 * to make it properly apply to longer circuits, and circuits of
481 * certain usage types. The following diagram illustrates how we
482 * derive the scaling below. In short, we calculate the number
483 * of times our telescoping-based circuit construction causes cells
484 * to traverse each link for the circuit purpose types in question,
485 * and then assume each link is equivalent.
486 *
487 * OP --a--> A --b--> B --c--> C
488 * OP --a--> A --b--> B --c--> C --d--> D
489 *
490 * Let h = a = b = c = d
491 *
492 * Three hops (general_cutoff)
493 * RTTs = 3a + 2b + c
494 * RTTs = 6h
495 * Cannibalized:
496 * RTTs = a+b+c+d
497 * RTTs = 4h
498 * Four hops:
499 * RTTs = 4a + 3b + 2c + d
500 * RTTs = 10h
501 * Client INTRODUCE1+ACK: // XXX: correct?
502 * RTTs = 5a + 4b + 3c + 2d
503 * RTTs = 14h
504 * Server intro:
505 * RTTs = 4a + 3b + 2c
506 * RTTs = 9h
507 */
508 SET_CUTOFF(general_cutoff, get_circuit_build_timeout_ms());
509 SET_CUTOFF(begindir_cutoff, get_circuit_build_timeout_ms());
510
511 // TODO: We should probably use route_len_for_purpose() here instead,
512 // except that does not count the extra round trip for things like server
513 // intros and rends.
514
515 /* > 3hop circs seem to have a 1.0 second delay on their cannibalized
516 * 4th hop. */
517 SET_CUTOFF(fourhop_cutoff, get_circuit_build_timeout_ms() * (10/6.0) + 1000);
518
519 /* CIRCUIT_PURPOSE_C_ESTABLISH_REND behaves more like a RELAY cell.
520 * Use the stream cutoff (more or less). */
521 SET_CUTOFF(stream_cutoff, MAX(options->CircuitStreamTimeout,15)*1000 + 1000);
522
523 /* Be lenient with cannibalized circs. They already survived the official
524 * CBT, and they're usually not performance-critical. */
525 SET_CUTOFF(cannibalized_cutoff,
527 options->CircuitStreamTimeout * 1000) + 1000);
528
529 /* Intro circs have an extra round trip (and are also 4 hops long) */
530 SET_CUTOFF(c_intro_cutoff, get_circuit_build_timeout_ms() * (14/6.0) + 1000);
531
532 /* Server intro circs have an extra round trip */
533 SET_CUTOFF(s_intro_cutoff, get_circuit_build_timeout_ms() * (9/6.0) + 1000);
534
535 /* For circuit purpose set to: CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED.
536 *
537 * The cutoff of such circuit is very high because we end up in this state if
538 * once the INTRODUCE_ACK is received which could be before the service
539 * receives the INTRODUCE2 cell. The worst case is a full 3-hop latency
540 * (intro -> service), 4-hop circuit creation latency (service -> RP), and
541 * finally a 7-hop latency for the RENDEZVOUS2 cell to arrive (service ->
542 * client). */
543 SET_CUTOFF(c_rend_ready_cutoff, get_circuit_build_timeout_ms() * 3 + 1000);
544
545 SET_CUTOFF(close_cutoff, get_circuit_build_close_time_ms());
546 SET_CUTOFF(extremely_old_cutoff, get_circuit_build_close_time_ms()*2 + 1000);
547
548 bool fixed_time = circuit_build_times_disabled(get_options());
549
551 struct timeval cutoff;
552
553 if (!CIRCUIT_IS_ORIGIN(victim) || /* didn't originate here */
554 victim->marked_for_close) /* don't mess with marked circs */
555 continue;
556
557 /* If we haven't yet started the first hop, it means we don't have
558 * any orconns available, and thus have not started counting time yet
559 * for this circuit. See circuit_deliver_create_cell() and uses of
560 * timestamp_began.
561 *
562 * Continue to wait in this case. The ORConn should timeout
563 * independently and kill us then.
564 */
565 if (TO_ORIGIN_CIRCUIT(victim)->cpath->state == CPATH_STATE_CLOSED) {
566 continue;
567 }
568
569 build_state = TO_ORIGIN_CIRCUIT(victim)->build_state;
570 if (build_state && build_state->onehop_tunnel)
571 cutoff = begindir_cutoff;
572 else if (victim->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT)
573 cutoff = close_cutoff;
574 else if (victim->purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT)
575 cutoff = c_intro_cutoff;
576 else if (victim->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO)
577 cutoff = s_intro_cutoff;
578 else if (victim->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND) {
579 /* Service connecting to a rendezvous point is a four hop circuit. We set
580 * it explicitly here because this function is a clusterf***. */
581 cutoff = fourhop_cutoff;
582 } else if (victim->purpose == CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED)
583 cutoff = c_rend_ready_cutoff;
584 else if (victim->purpose == CIRCUIT_PURPOSE_PATH_BIAS_TESTING)
585 cutoff = close_cutoff;
586 else if (TO_ORIGIN_CIRCUIT(victim)->has_opened &&
587 victim->state != CIRCUIT_STATE_OPEN)
588 cutoff = cannibalized_cutoff;
589 else if (build_state && build_state->desired_path_len >= 4)
590 cutoff = fourhop_cutoff;
591 else
592 cutoff = general_cutoff;
593
594 if (timercmp(&victim->timestamp_began, &cutoff, OP_GT))
595 continue; /* it's still young, leave it alone */
596
597 /* We need to double-check the opened state here because
598 * we don't want to consider opened 1-hop dircon circuits for
599 * deciding when to relax the timeout, but we *do* want to relax
600 * those circuits too if nothing else is opened *and* they still
601 * aren't either. */
602 if (!any_opened_circs && victim->state != CIRCUIT_STATE_OPEN) {
603 /* It's still young enough that we wouldn't close it, right? */
604 if (timercmp(&victim->timestamp_began, &close_cutoff, OP_GT)) {
605 if (!TO_ORIGIN_CIRCUIT(victim)->relaxed_timeout) {
606 int first_hop_succeeded = TO_ORIGIN_CIRCUIT(victim)->cpath->state
607 == CPATH_STATE_OPEN;
608 if (!fixed_time) {
609 log_info(LD_CIRC,
610 "No circuits are opened. Relaxing timeout for circuit %d "
611 "(a %s %d-hop circuit in state %s with channel state %s).",
612 TO_ORIGIN_CIRCUIT(victim)->global_identifier,
613 circuit_purpose_to_string(victim->purpose),
614 TO_ORIGIN_CIRCUIT(victim)->build_state ?
615 TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len :
616 -1,
617 circuit_state_to_string(victim->state),
618 victim->n_chan ?
619 channel_state_to_string(victim->n_chan->state) : "none");
620 }
621
622 /* We count the timeout here for CBT, because technically this
623 * was a timeout, and the timeout value needs to reset if we
624 * see enough of them. Note this means we also need to avoid
625 * double-counting below, too. */
627 first_hop_succeeded);
629 }
630 continue;
631 } else {
632 static ratelim_t relax_timeout_limit = RATELIM_INIT(3600);
633 const double build_close_ms = get_circuit_build_close_time_ms();
634 if (!fixed_time) {
635 log_fn_ratelim(&relax_timeout_limit, LOG_NOTICE, LD_CIRC,
636 "No circuits are opened. Relaxed timeout for circuit %d "
637 "(a %s %d-hop circuit in state %s with channel state %s) to "
638 "%ldms. However, it appears the circuit has timed out "
639 "anyway.",
640 TO_ORIGIN_CIRCUIT(victim)->global_identifier,
641 circuit_purpose_to_string(victim->purpose),
642 TO_ORIGIN_CIRCUIT(victim)->build_state ?
643 TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len :
644 -1,
645 circuit_state_to_string(victim->state),
646 victim->n_chan ?
647 channel_state_to_string(victim->n_chan->state) : "none",
648 (long)build_close_ms);
649 }
650 }
651 }
652
653#if 0
654 /* some debug logs, to help track bugs */
655 if (victim->purpose >= CIRCUIT_PURPOSE_C_INTRODUCING &&
656 victim->purpose <= CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED) {
657 if (!victim->timestamp_dirty)
658 log_fn(LOG_DEBUG,"Considering %sopen purpose %d to %s (circid %d)."
659 "(clean).",
660 victim->state == CIRCUIT_STATE_OPEN ? "" : "non",
661 victim->purpose, victim->build_state->chosen_exit_name,
662 victim->n_circ_id);
663 else
664 log_fn(LOG_DEBUG,"Considering %sopen purpose %d to %s (circid %d). "
665 "%d secs since dirty.",
666 victim->state == CIRCUIT_STATE_OPEN ? "" : "non",
667 victim->purpose, victim->build_state->chosen_exit_name,
668 victim->n_circ_id,
669 (int)(now - victim->timestamp_dirty));
670 }
671#endif /* 0 */
672
673 /* if circ is !open, or if it's open but purpose is a non-finished
674 * intro or rend, then mark it for close */
675 if (victim->state == CIRCUIT_STATE_OPEN) {
676 switch (victim->purpose) {
677 default: /* most open circuits can be left alone. */
678 continue; /* yes, continue inside a switch refers to the nearest
679 * enclosing loop. C is smart. */
681 break; /* too old, need to die */
683 /* it's a rend_ready circ -- has it already picked a query? */
684 /* c_rend_ready circs measure age since timestamp_dirty,
685 * because that's set when they switch purposes
686 */
687 if (TO_ORIGIN_CIRCUIT(victim)->hs_ident ||
688 victim->timestamp_dirty > cutoff.tv_sec)
689 continue;
690 break;
692 /* Open path bias testing circuits are given a long
693 * time to complete the test, but not forever */
695 break;
697 /* That purpose means that the intro point circuit has been opened
698 * successfully but the INTRODUCE1 cell hasn't been sent yet because
699 * the client is waiting for the rendezvous point circuit to open.
700 * Keep this circuit open while waiting for the rendezvous circuit.
701 * We let the circuit idle timeout take care of cleaning this
702 * circuit if it never used. */
703 continue;
707 /* rend and intro circs become dirty each time they
708 * make an introduction attempt. so timestamp_dirty
709 * will reflect the time since the last attempt.
710 */
711 if (victim->timestamp_dirty > cutoff.tv_sec)
712 continue;
713 break;
714 }
715 } else { /* circuit not open, consider recording failure as timeout */
716 int first_hop_succeeded = TO_ORIGIN_CIRCUIT(victim)->cpath &&
717 TO_ORIGIN_CIRCUIT(victim)->cpath->state == CPATH_STATE_OPEN;
718 if (TO_ORIGIN_CIRCUIT(victim)->p_streams != NULL) {
719 log_warn(LD_BUG, "Circuit %d (purpose %d, %s) has timed out, "
720 "yet has attached streams!",
721 TO_ORIGIN_CIRCUIT(victim)->global_identifier,
722 victim->purpose,
723 circuit_purpose_to_string(victim->purpose));
725 continue;
726 }
727
730
731 log_info(LD_CIRC,
732 "Deciding to count the timeout for circuit %"PRIu32,
733 TO_ORIGIN_CIRCUIT(victim)->global_identifier);
734
735 /* Circuits are allowed to last longer for measurement.
736 * Switch their purpose and wait. */
737 if (victim->purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT) {
739 victim));
740 continue;
741 }
742
743 /*
744 * If the circuit build time is much greater than we would have cut
745 * it off at, we probably had a suspend event along this codepath,
746 * and we should discard the value.
747 */
748 if (timercmp(&victim->timestamp_began, &extremely_old_cutoff, OP_LT)) {
749 log_notice(LD_CIRC,
750 "Extremely large value for circuit build timeout: %lds. "
751 "Assuming clock jump. Purpose %d (%s)",
752 (long)(now.tv_sec - victim->timestamp_began.tv_sec),
753 victim->purpose,
754 circuit_purpose_to_string(victim->purpose));
757 first_hop_succeeded,
758 (time_t)victim->timestamp_created.tv_sec)) {
760 }
761 }
762 }
763
764 /* Special checks for onion service circuits. */
765 switch (victim->purpose) {
767 /* We only want to spare a rend circ iff it has been specified in an
768 * INTRODUCE1 cell sent to a hidden service. */
769 if (hs_circ_is_rend_sent_in_intro1(CONST_TO_ORIGIN_CIRCUIT(victim))) {
770 continue;
771 }
772 break;
774 /* The connection to the rendezvous point has timed out, close it and
775 * retry if possible. */
776 log_info(LD_CIRC,"Rendezvous circ %u (state %d:%s, purpose %d) "
777 "as timed-out, closing it. Relaunching rendezvous attempt.",
778 (unsigned)victim->n_circ_id,
779 victim->state, circuit_state_to_string(victim->state),
780 victim->purpose);
781 /* We'll close as a timeout the victim circuit. The rendezvous point
782 * won't keep both circuits, it only keeps the newest (for the same
783 * cookie). */
784 break;
785 default:
786 break;
787 }
788
789 if (victim->n_chan)
790 log_info(LD_CIRC,
791 "Abandoning circ %u %s:%u (state %d,%d:%s, purpose %d, "
792 "len %d)", TO_ORIGIN_CIRCUIT(victim)->global_identifier,
793 channel_describe_peer(victim->n_chan),
794 (unsigned)victim->n_circ_id,
795 TO_ORIGIN_CIRCUIT(victim)->has_opened,
796 victim->state, circuit_state_to_string(victim->state),
797 victim->purpose,
798 TO_ORIGIN_CIRCUIT(victim)->build_state ?
799 TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len :
800 -1);
801 else
802 log_info(LD_CIRC,
803 "Abandoning circ %u %u (state %d,%d:%s, purpose %d, len %d)",
804 TO_ORIGIN_CIRCUIT(victim)->global_identifier,
805 (unsigned)victim->n_circ_id,
806 TO_ORIGIN_CIRCUIT(victim)->has_opened,
807 victim->state,
808 circuit_state_to_string(victim->state), victim->purpose,
809 TO_ORIGIN_CIRCUIT(victim)->build_state ?
810 TO_ORIGIN_CIRCUIT(victim)->build_state->desired_path_len :
811 -1);
812
814 tor_trace(TR_SUBSYS(circuit), TR_EV(timeout), TO_ORIGIN_CIRCUIT(victim));
815 if (victim->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT)
816 circuit_mark_for_close(victim, END_CIRC_REASON_MEASUREMENT_EXPIRED);
817 else
818 circuit_mark_for_close(victim, END_CIRC_REASON_TIMEOUT);
819
821 } SMARTLIST_FOREACH_END(victim);
822}
823
824/**
825 * Mark for close all circuits that start here, that were built through a
826 * guard we weren't sure if we wanted to use, and that have been waiting
827 * around for way too long.
828 */
829void
831{
833 origin_circuit_t *, circ) {
834 if (TO_CIRCUIT(circ)->marked_for_close)
835 continue;
836 if (circ->guard_state == NULL)
837 continue;
839 circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_NONE);
840 } SMARTLIST_FOREACH_END(circ);
841}
842
843/** For debugging #8387: track when we last called
844 * circuit_expire_old_circuits_clientside. */
846
847/**
848 * As a diagnostic for bug 8387, log information about how many one-hop
849 * circuits we have around that have been there for at least <b>age</b>
850 * seconds. Log a few of them. Ignores Single Onion Service intro, it is
851 * expected to be long-term one-hop circuits.
852 */
853void
855{
856#define MAX_ANCIENT_ONEHOP_CIRCUITS_TO_LOG 10
857 time_t now = time(NULL);
858 time_t cutoff = now - age;
859 int n_found = 0;
860 smartlist_t *log_these = smartlist_new();
861 const or_options_t *options = get_options();
862
864 const origin_circuit_t *ocirc;
865 if (! CIRCUIT_IS_ORIGIN(circ))
866 continue;
867 if (circ->timestamp_created.tv_sec >= cutoff)
868 continue;
869 /* Single Onion Services deliberately make long term one-hop intro
870 * and rendezvous connections. Don't log the established ones. */
871 if (hs_service_allow_non_anonymous_connection(options) &&
872 (circ->purpose == CIRCUIT_PURPOSE_S_INTRO ||
873 circ->purpose == CIRCUIT_PURPOSE_S_REND_JOINED))
874 continue;
875 ocirc = CONST_TO_ORIGIN_CIRCUIT(circ);
876
877 if (ocirc->build_state && ocirc->build_state->onehop_tunnel) {
878 ++n_found;
879
880 if (smartlist_len(log_these) < MAX_ANCIENT_ONEHOP_CIRCUITS_TO_LOG)
881 smartlist_add(log_these, (origin_circuit_t*) ocirc);
882 }
883 }
884 SMARTLIST_FOREACH_END(circ);
885
886 if (n_found == 0)
887 goto done;
888
889 log_notice(LD_HEARTBEAT,
890 "Diagnostic for issue 8387: Found %d one-hop circuits more "
891 "than %d seconds old! Logging %d...",
892 n_found, age, smartlist_len(log_these));
893
894 SMARTLIST_FOREACH_BEGIN(log_these, const origin_circuit_t *, ocirc) {
895 char created[ISO_TIME_LEN+1];
896 int stream_num;
897 const edge_connection_t *conn;
898 char *dirty = NULL;
899 const circuit_t *circ = TO_CIRCUIT(ocirc);
900
901 format_local_iso_time(created,
902 (time_t)circ->timestamp_created.tv_sec);
903
904 if (circ->timestamp_dirty) {
905 char dirty_since[ISO_TIME_LEN+1];
906 format_local_iso_time(dirty_since, circ->timestamp_dirty);
907
908 tor_asprintf(&dirty, "Dirty since %s (%ld seconds vs %ld-second cutoff)",
909 dirty_since, (long)(now - circ->timestamp_dirty),
910 (long) options->MaxCircuitDirtiness);
911 } else {
912 dirty = tor_strdup("Not marked dirty");
913 }
914
915 log_notice(LD_HEARTBEAT, " #%d created at %s. %s, %s. %s for close. "
916 "Package window: %d. "
917 "%s for new conns. %s.",
918 ocirc_sl_idx,
919 created,
922 circ->marked_for_close ? "Marked" : "Not marked",
923 circ->package_window,
924 ocirc->unusable_for_new_conns ? "Not usable" : "usable",
925 dirty);
926 tor_free(dirty);
927
928 stream_num = 0;
929 for (conn = ocirc->p_streams; conn; conn = conn->next_stream) {
930 const connection_t *c = TO_CONN(conn);
931 char stream_created[ISO_TIME_LEN+1];
932 if (++stream_num >= 5)
933 break;
934
935 format_local_iso_time(stream_created, c->timestamp_created);
936
937 log_notice(LD_HEARTBEAT, " Stream#%d created at %s. "
938 "%s conn in state %s. "
939 "It is %slinked and %sreading from a linked connection %p. "
940 "Package window %d. "
941 "%s for close (%s:%d). Hold-open is %sset. "
942 "Has %ssent RELAY_END. %s on circuit.",
943 stream_num,
944 stream_created,
947 c->linked ? "" : "not ",
948 c->reading_from_linked_conn ? "": "not",
949 c->linked_conn,
950 conn->package_window,
951 c->marked_for_close ? "Marked" : "Not marked",
954 c->hold_open_until_flushed ? "" : "not ",
955 conn->edge_has_sent_end ? "" : "not ",
956 connection_is_reading(c) ? "Not blocked" : "Blocked");
957 if (! c->linked_conn)
958 continue;
959
960 c = c->linked_conn;
961
962 log_notice(LD_HEARTBEAT, " Linked to %s connection in state %s "
963 "(Purpose %d). %s for close (%s:%d). Hold-open is %sset. ",
966 c->purpose,
967 c->marked_for_close ? "Marked" : "Not marked",
970 c->hold_open_until_flushed ? "" : "not ");
971 }
972 } SMARTLIST_FOREACH_END(ocirc);
973
974 log_notice(LD_HEARTBEAT, "It has been %ld seconds since I last called "
975 "circuit_expire_old_circuits_clientside().",
977
978 done:
979 smartlist_free(log_these);
980}
981
982/** Remove any elements in <b>needed_ports</b> that are handled by an
983 * open or in-progress circuit.
984 */
985void
987{
988 int i;
989 uint16_t *port;
990
991 for (i = 0; i < smartlist_len(needed_ports); ++i) {
992 port = smartlist_get(needed_ports, i);
993 tor_assert(*port);
994 if (circuit_stream_is_being_handled(NULL, *port,
996 log_debug(LD_CIRC,"Port %d is already being handled; removing.", *port);
997 smartlist_del(needed_ports, i--);
998 tor_free(port);
999 } else {
1000 log_debug(LD_CIRC,"Port %d is not handled.", *port);
1001 }
1002 }
1003}
1004
1005/** Return 1 if at least <b>min</b> general-purpose non-internal circuits
1006 * will have an acceptable exit node for exit stream <b>conn</b> if it
1007 * is defined, else for "*:port".
1008 * Else return 0.
1009 */
1010int
1012 uint16_t port, int min)
1013{
1014 const node_t *exitnode;
1015 int num=0;
1016 time_t now = time(NULL);
1017 int need_uptime = smartlist_contains_int_as_string(
1018 get_options()->LongLivedPorts,
1019 conn ? conn->socks_request->port : port);
1020
1022 if (CIRCUIT_IS_ORIGIN(circ) &&
1023 !circ->marked_for_close &&
1024 (circ->purpose == CIRCUIT_PURPOSE_C_GENERAL ||
1025 circ->purpose == CIRCUIT_PURPOSE_CONFLUX_LINKED) &&
1026 (!circ->timestamp_dirty ||
1027 circ->timestamp_dirty + get_options()->MaxCircuitDirtiness > now)) {
1028 origin_circuit_t *origin_circ = TO_ORIGIN_CIRCUIT(circ);
1029 cpath_build_state_t *build_state = origin_circ->build_state;
1030 if (build_state->is_internal || build_state->onehop_tunnel)
1031 continue;
1032 if (origin_circ->unusable_for_new_conns)
1033 continue;
1034 if (origin_circ->isolation_values_set &&
1035 (conn == NULL ||
1036 !connection_edge_compatible_with_circuit(conn, origin_circ)))
1037 continue;
1038
1039 exitnode = build_state_get_exit_node(build_state);
1040 if (exitnode && (!need_uptime || build_state->need_uptime)) {
1041 int ok;
1042 if (conn) {
1043 ok = connection_ap_can_use_exit(conn, exitnode);
1044 } else {
1046 r = compare_tor_addr_to_node_policy(NULL, port, exitnode);
1048 }
1049 if (ok) {
1050 if (++num >= min)
1051 return 1;
1052 }
1053 }
1054 }
1055 }
1056 SMARTLIST_FOREACH_END(circ);
1057 return 0;
1058}
1059
1060/** Don't keep more than this many unused open circuits around. */
1061#define MAX_UNUSED_OPEN_CIRCUITS 14
1062
1063/* Return true if a circuit is available for use, meaning that it is open,
1064 * clean, usable for new multi-hop connections, and a general purpose origin
1065 * circuit.
1066 * Accept any kind of circuit, return false if the above conditions are not
1067 * met. */
1068STATIC int
1069circuit_is_available_for_use(const circuit_t *circ)
1070{
1071 const origin_circuit_t *origin_circ;
1072 cpath_build_state_t *build_state;
1073
1074 if (!CIRCUIT_IS_ORIGIN(circ))
1075 return 0; /* We first filter out only origin circuits before doing the
1076 following checks. */
1077 if (circ->marked_for_close)
1078 return 0; /* Don't mess with marked circs */
1079 if (circ->timestamp_dirty)
1080 return 0; /* Only count clean circs */
1081 if (circ->purpose != CIRCUIT_PURPOSE_C_GENERAL &&
1083 return 0; /* We only pay attention to general purpose circuits.
1084 General purpose circuits are always origin circuits. */
1085
1086 origin_circ = CONST_TO_ORIGIN_CIRCUIT(circ);
1087 if (origin_circ->unusable_for_new_conns)
1088 return 0;
1089
1090 build_state = origin_circ->build_state;
1091 if (build_state->onehop_tunnel)
1092 return 0;
1093
1094 return 1;
1095}
1096
1097/* Return true if we need any more exit circuits.
1098 * needs_uptime and needs_capacity are set only if we need more exit circuits.
1099 * Check if we know of a port that's been requested recently and no circuit
1100 * is currently available that can handle it. */
1101STATIC int
1102needs_exit_circuits(time_t now, int *needs_uptime, int *needs_capacity)
1103{
1104 return (!circuit_all_predicted_ports_handled(now, needs_uptime,
1105 needs_capacity) &&
1106 router_have_consensus_path() == CONSENSUS_PATH_EXIT);
1107}
1108
1109/* Hidden services need at least this many internal circuits */
1110#define SUFFICIENT_UPTIME_INTERNAL_HS_SERVERS 3
1111
1112/* Return true if we need any more hidden service server circuits.
1113 * HS servers only need an internal circuit. */
1114STATIC int
1115needs_hs_server_circuits(time_t now, int num_uptime_internal)
1116{
1118 /* No services, we don't need anything. */
1119 goto no_need;
1120 }
1121
1122 if (num_uptime_internal >= SUFFICIENT_UPTIME_INTERNAL_HS_SERVERS) {
1123 /* We have sufficient amount of internal circuit. */
1124 goto no_need;
1125 }
1126
1127 if (router_have_consensus_path() == CONSENSUS_PATH_UNKNOWN) {
1128 /* Consensus hasn't been checked or might be invalid so requesting
1129 * internal circuits is not wise. */
1130 goto no_need;
1131 }
1132
1133 /* At this point, we need a certain amount of circuits and we will most
1134 * likely use them for rendezvous so we note down the use of internal
1135 * circuit for our prediction for circuit needing uptime and capacity. */
1136 rep_hist_note_used_internal(now, 1, 1);
1137
1138 return 1;
1139 no_need:
1140 return 0;
1141}
1142
1143/* We need at least this many internal circuits for hidden service clients */
1144#define SUFFICIENT_INTERNAL_HS_CLIENTS 3
1145
1146/* We need at least this much uptime for internal circuits for hidden service
1147 * clients */
1148#define SUFFICIENT_UPTIME_INTERNAL_HS_CLIENTS 2
1149
1150/* Return true if we need any more hidden service client circuits.
1151 * HS clients only need an internal circuit. */
1152STATIC int
1153needs_hs_client_circuits(time_t now, int *needs_uptime, int *needs_capacity,
1154 int num_internal, int num_uptime_internal)
1155{
1156 int used_internal_recently = rep_hist_get_predicted_internal(now,
1157 needs_uptime,
1158 needs_capacity);
1159 int requires_uptime = num_uptime_internal <
1160 SUFFICIENT_UPTIME_INTERNAL_HS_CLIENTS &&
1161 needs_uptime;
1162
1163 return (used_internal_recently &&
1164 (requires_uptime || num_internal < SUFFICIENT_INTERNAL_HS_CLIENTS) &&
1165 router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN);
1166}
1167
1168/* This is how many circuits can be opened concurrently during the cbt learning
1169 * phase. This number cannot exceed the tor-wide MAX_UNUSED_OPEN_CIRCUITS. */
1170#define DFLT_CBT_UNUSED_OPEN_CIRCS (10)
1171#define MIN_CBT_UNUSED_OPEN_CIRCS 0
1172#define MAX_CBT_UNUSED_OPEN_CIRCS MAX_UNUSED_OPEN_CIRCUITS
1173
1174/* Return true if we need more circuits for a good build timeout.
1175 * XXXX make the assumption that build timeout streams should be
1176 * created whenever we can build internal circuits. */
1177STATIC int
1178needs_circuits_for_build(int num)
1179{
1180 if (router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN) {
1181 if (num < networkstatus_get_param(NULL, "cbtmaxopencircs",
1182 DFLT_CBT_UNUSED_OPEN_CIRCS,
1183 MIN_CBT_UNUSED_OPEN_CIRCS,
1184 MAX_CBT_UNUSED_OPEN_CIRCS) &&
1187 return 1;
1188 }
1189 }
1190 return 0;
1191}
1192
1193/** Determine how many circuits we have open that are clean,
1194 * Make sure it's enough for all the upcoming behaviors we predict we'll have.
1195 * But put an upper bound on the total number of circuits.
1196 */
1197static void
1199{
1200 int num=0, num_internal=0, num_uptime_internal=0;
1201 int hidserv_needs_uptime=0, hidserv_needs_capacity=1;
1202 int port_needs_uptime=0, port_needs_capacity=1;
1203 time_t now = time(NULL);
1204 int flags = 0;
1205
1206 /* Attempt to launch predicted conflux circuits. This is outside the HS or
1207 * Exit preemptive circuit set.
1208 * As with the other types of preemptive circuits, we only want to
1209 * launch them if we have predicted ports. (If we haven't needed a
1210 * circuit for a while, maybe we won't need one soon either.) */
1213 }
1214
1215 /* Count how many of each type of circuit we currently have. */
1217 if (!circuit_is_available_for_use(circ))
1218 continue;
1219
1220 num++;
1221
1223 if (build_state->is_internal)
1224 num_internal++;
1225 if (build_state->need_uptime && build_state->is_internal)
1226 num_uptime_internal++;
1227 }
1228 SMARTLIST_FOREACH_END(circ);
1229
1230 /* If that's enough, then stop now. */
1231 if (num >= MAX_UNUSED_OPEN_CIRCUITS)
1232 return;
1233
1234 if (needs_exit_circuits(now, &port_needs_uptime, &port_needs_capacity)) {
1235 if (port_needs_uptime)
1236 flags |= CIRCLAUNCH_NEED_UPTIME;
1237 if (port_needs_capacity)
1238 flags |= CIRCLAUNCH_NEED_CAPACITY;
1239
1240 log_info(LD_CIRC,
1241 "Have %d clean circs (%d internal), need another exit circ.",
1242 num, num_internal);
1243
1245 return;
1246 }
1247
1248 if (needs_hs_server_circuits(now, num_uptime_internal)) {
1251
1252 log_info(LD_CIRC,
1253 "Have %d clean circs (%d internal), need another internal "
1254 "circ for my hidden service.",
1255 num, num_internal);
1257 return;
1258 }
1259
1260 if (needs_hs_client_circuits(now, &hidserv_needs_uptime,
1261 &hidserv_needs_capacity,
1262 num_internal, num_uptime_internal))
1263 {
1264 if (hidserv_needs_uptime)
1265 flags |= CIRCLAUNCH_NEED_UPTIME;
1266 if (hidserv_needs_capacity)
1267 flags |= CIRCLAUNCH_NEED_CAPACITY;
1268 flags |= CIRCLAUNCH_IS_INTERNAL;
1269
1270 log_info(LD_CIRC,
1271 "Have %d clean circs (%d uptime-internal, %d internal), need"
1272 " another hidden service circ.",
1273 num, num_uptime_internal, num_internal);
1274
1275 /* Always launch vanguards purpose circuits for HS clients,
1276 * for vanguards-lite. This prevents us from cannibalizing
1277 * to build these circuits (and thus not use vanguards). */
1279 return;
1280 }
1281
1282 if (needs_circuits_for_build(num)) {
1284 /* if there are no exits in the consensus, make timeout
1285 * circuits internal */
1286 if (router_have_consensus_path() == CONSENSUS_PATH_INTERNAL)
1287 flags |= CIRCLAUNCH_IS_INTERNAL;
1288
1289 log_info(LD_CIRC,
1290 "Have %d clean circs need another buildtime test circ.", num);
1292 return;
1293 }
1294}
1295
1296/** Build a new test circuit every 5 minutes */
1297#define TESTING_CIRCUIT_INTERVAL 300
1298
1299/** This function is called once a second, if router_have_minimum_dir_info()
1300 * is true. Its job is to make sure all services we offer have enough circuits
1301 * available. Some services just want enough circuits for current tasks,
1302 * whereas others want a minimum set of idle circuits hanging around.
1303 */
1304void
1306{
1307 const or_options_t *options = get_options();
1308
1309 /* launch a new circ for any pending streams that need one
1310 * XXXX make the assumption that (some) AP streams (i.e. HS clients)
1311 * don't require an exit circuit, review in #13814.
1312 * This allows HSs to function in a consensus without exits. */
1313 if (router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN)
1315
1317
1318 if (!options->DisablePredictedCircuits)
1320}
1321
1322/**
1323 * Called once a second either directly or from
1324 * circuit_build_needed_circs(). As appropriate (once per NewCircuitPeriod)
1325 * resets failure counts and expires old circuits.
1326 */
1327void
1329{
1330 static time_t time_to_expire_and_reset = 0;
1331
1332 if (time_to_expire_and_reset < now) {
1334 time_to_expire_and_reset = now + get_options()->NewCircuitPeriod;
1335 if (proxy_mode(get_options()))
1336 addressmap_clean(now);
1338
1339#if 0 /* disable for now, until predict-and-launch-new can cull leftovers */
1340
1341 /* If we ever re-enable, this has to move into
1342 * circuit_build_needed_circs */
1343
1344 circ = circuit_get_youngest_clean_open(CIRCUIT_PURPOSE_C_GENERAL);
1345 if (get_options()->RunTesting &&
1346 circ &&
1347 circ->timestamp_began.tv_sec + TESTING_CIRCUIT_INTERVAL < now) {
1348 log_fn(LOG_INFO,"Creating a new testing circuit.");
1350 }
1351#endif /* 0 */
1352 }
1353}
1354
1355/** If the stream <b>conn</b> is a member of any of the linked
1356 * lists of <b>circ</b>, then remove it from the list.
1357 */
1358void
1360{
1361 edge_connection_t *prevconn;
1362 bool update_dirty = false;
1363
1364 tor_assert(circ);
1365 tor_assert(conn);
1366
1367 if (conn->base_.type == CONN_TYPE_AP) {
1368 entry_connection_t *entry_conn = EDGE_TO_ENTRY_CONN(conn);
1369 entry_conn->may_use_optimistic_data = 0;
1370 // When KeepAliveIsolateSOCKSAuth is in effect, we update the dirty
1371 // time on close as well as on open.
1372 update_dirty = connection_ap_socks_iso_keepalive_enabled(entry_conn);
1373 }
1374 conn->cpath_layer = NULL; /* don't keep a stale pointer */
1375 conn->on_circuit = NULL;
1376
1377 if (CIRCUIT_IS_ORIGIN(circ)) {
1378 origin_circuit_t *origin_circ = TO_ORIGIN_CIRCUIT(circ);
1379 int removed = 0;
1380 if (conn == origin_circ->p_streams) {
1381 origin_circ->p_streams = conn->next_stream;
1382 conflux_update_p_streams(origin_circ, conn->next_stream);
1383 removed = 1;
1384 } else {
1385 for (prevconn = origin_circ->p_streams;
1386 prevconn && prevconn->next_stream && prevconn->next_stream != conn;
1387 prevconn = prevconn->next_stream)
1388 ;
1389 if (prevconn && prevconn->next_stream) {
1390 prevconn->next_stream = conn->next_stream;
1391 removed = 1;
1392 }
1393 }
1394 if (removed) {
1395 log_debug(LD_APP, "Removing stream %d from circ %u",
1396 conn->stream_id, (unsigned)circ->n_circ_id);
1397
1398 if (update_dirty) {
1399 circ->timestamp_dirty = approx_time();
1400 }
1401
1402 /* If the stream was removed, and it was a rend stream, decrement the
1403 * number of streams on the circuit associated with the rend service.
1404 */
1406 hs_dec_rdv_stream_counter(origin_circ);
1407 }
1408
1409 /* If there are no more streams on this circ, tell circpad */
1410 if (!origin_circ->p_streams)
1412
1413 return;
1414 }
1415 } else {
1416 or_circuit_t *or_circ = TO_OR_CIRCUIT(circ);
1417 if (conn == or_circ->n_streams) {
1418 or_circ->n_streams = conn->next_stream;
1419 conflux_update_n_streams(or_circ, conn->next_stream);
1420 return;
1421 }
1422 if (conn == or_circ->resolving_streams) {
1423 or_circ->resolving_streams = conn->next_stream;
1425 return;
1426 }
1427
1428 for (prevconn = or_circ->n_streams;
1429 prevconn && prevconn->next_stream && prevconn->next_stream != conn;
1430 prevconn = prevconn->next_stream)
1431 ;
1432 if (prevconn && prevconn->next_stream) {
1433 prevconn->next_stream = conn->next_stream;
1434 return;
1435 }
1436
1437 for (prevconn = or_circ->resolving_streams;
1438 prevconn && prevconn->next_stream && prevconn->next_stream != conn;
1439 prevconn = prevconn->next_stream)
1440 ;
1441 if (prevconn && prevconn->next_stream) {
1442 prevconn->next_stream = conn->next_stream;
1443 return;
1444 }
1445 }
1446
1447 log_warn(LD_BUG,"Edge connection not in circuit's list.");
1448 /* Don't give an error here; it's harmless. */
1450}
1451
1452/** Find each circuit that has been unused for too long, or dirty
1453 * for too long and has no streams on it: mark it for close.
1454 */
1455STATIC void
1457{
1458 struct timeval cutoff, now;
1459
1460 tor_gettimeofday(&now);
1462
1464 if (circ->marked_for_close || !CIRCUIT_IS_ORIGIN(circ))
1465 continue;
1466
1467 cutoff = now;
1468 cutoff.tv_sec -= TO_ORIGIN_CIRCUIT(circ)->circuit_idle_timeout;
1469
1470 /* If the circuit has been dirty for too long, and there are no streams
1471 * on it, mark it for close.
1472 */
1473 if (circ->timestamp_dirty &&
1474 circ->timestamp_dirty + get_options()->MaxCircuitDirtiness <
1475 now.tv_sec &&
1477 !TO_ORIGIN_CIRCUIT(circ)->p_streams /* nothing attached */ ) {
1478 log_debug(LD_CIRC, "Closing n_circ_id %u (dirty %ld sec ago, "
1479 "purpose %d)",
1480 (unsigned)circ->n_circ_id,
1481 (long)(now.tv_sec - circ->timestamp_dirty),
1482 circ->purpose);
1483 /* Don't do this magic for testing circuits. Their death is governed
1484 * by circuit_expire_building */
1485 if (circ->purpose != CIRCUIT_PURPOSE_PATH_BIAS_TESTING) {
1486 tor_trace(TR_SUBSYS(circuit), TR_EV(idle_timeout),
1487 TO_ORIGIN_CIRCUIT(circ));
1488 circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED);
1489 }
1490 } else if (!circ->timestamp_dirty && circ->state == CIRCUIT_STATE_OPEN) {
1491 if (timercmp(&circ->timestamp_began, &cutoff, OP_LT)) {
1492 if (circ->purpose == CIRCUIT_PURPOSE_C_GENERAL ||
1493 circ->purpose == CIRCUIT_PURPOSE_C_HSDIR_GET ||
1494 circ->purpose == CIRCUIT_PURPOSE_CONFLUX_UNLINKED ||
1495 circ->purpose == CIRCUIT_PURPOSE_CONFLUX_LINKED ||
1496 circ->purpose == CIRCUIT_PURPOSE_S_HSDIR_POST ||
1497 circ->purpose == CIRCUIT_PURPOSE_HS_VANGUARDS ||
1498 circ->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT ||
1499 circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO ||
1500 circ->purpose == CIRCUIT_PURPOSE_TESTING ||
1501 circ->purpose == CIRCUIT_PURPOSE_C_CIRCUIT_PADDING ||
1502 (circ->purpose >= CIRCUIT_PURPOSE_C_INTRODUCING &&
1503 circ->purpose <= CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED) ||
1504 circ->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND) {
1505 log_info(LD_CIRC,
1506 "Closing circuit %"PRIu32
1507 " that has been unused for %ld msec.",
1508 TO_ORIGIN_CIRCUIT(circ)->global_identifier,
1509 tv_mdiff(&circ->timestamp_began, &now));
1510 tor_trace(TR_SUBSYS(circuit), TR_EV(idle_timeout),
1511 TO_ORIGIN_CIRCUIT(circ));
1512 circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED);
1513 } else if (!TO_ORIGIN_CIRCUIT(circ)->is_ancient) {
1514 /* Server-side rend joined circuits can end up really old, because
1515 * they are reused by clients for longer than normal. The client
1516 * controls their lifespan. (They never become dirty, because
1517 * connection_exit_begin_conn() never marks anything as dirty.)
1518 * Similarly, server-side intro circuits last a long time. */
1519 if (circ->purpose != CIRCUIT_PURPOSE_S_REND_JOINED &&
1520 circ->purpose != CIRCUIT_PURPOSE_S_INTRO) {
1521 log_notice(LD_CIRC,
1522 "Ancient non-dirty circuit %d is still around after "
1523 "%ld milliseconds. Purpose: %d (%s)",
1524 TO_ORIGIN_CIRCUIT(circ)->global_identifier,
1525 tv_mdiff(&circ->timestamp_began, &now),
1526 circ->purpose,
1527 circuit_purpose_to_string(circ->purpose));
1528 TO_ORIGIN_CIRCUIT(circ)->is_ancient = 1;
1529 }
1530 }
1531 }
1532 }
1533 } SMARTLIST_FOREACH_END(circ);
1534}
1535
1536/** How long do we wait before killing circuits with the properties
1537 * described below?
1538 *
1539 * Probably we could choose a number here as low as 5 to 10 seconds,
1540 * since these circs are used for begindir, and a) generally you either
1541 * ask another begindir question right after or you don't for a long time,
1542 * b) clients at least through 0.2.1.x choose from the whole set of
1543 * directory mirrors at each choice, and c) re-establishing a one-hop
1544 * circuit via create-fast is a light operation assuming the TLS conn is
1545 * still there.
1546 *
1547 * I expect "b" to go away one day when we move to using directory
1548 * guards, but I think "a" and "c" are good enough reasons that a low
1549 * number is safe even then.
1550 */
1551#define IDLE_ONE_HOP_CIRC_TIMEOUT 60
1552
1553/** Find each non-origin circuit that has been unused for too long,
1554 * has no streams on it, came from a client, and ends here: mark it
1555 * for close.
1556 */
1557void
1559{
1560 or_circuit_t *or_circ;
1561 time_t cutoff = now - IDLE_ONE_HOP_CIRC_TIMEOUT;
1562
1564 if (circ->marked_for_close || CIRCUIT_IS_ORIGIN(circ))
1565 continue;
1566 or_circ = TO_OR_CIRCUIT(circ);
1567 /* If the circuit has been idle for too long, and there are no streams
1568 * on it, and it ends here, and it used a create_fast, mark it for close.
1569 *
1570 * Also if there is a rend_splice on it, it's a single onion service
1571 * circuit and we should not close it.
1572 */
1573 if (or_circ->p_chan && channel_is_client(or_circ->p_chan) &&
1574 !circ->n_chan &&
1575 !or_circ->n_streams && !or_circ->resolving_streams &&
1576 !or_circ->rend_splice &&
1577 channel_when_last_xmit(or_circ->p_chan) <= cutoff) {
1578 log_info(LD_CIRC, "Closing circ_id %u (empty %d secs ago)",
1579 (unsigned)or_circ->p_circ_id,
1580 (int)(now - channel_when_last_xmit(or_circ->p_chan)));
1581 circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED);
1582 }
1583 }
1584 SMARTLIST_FOREACH_END(circ);
1585}
1586
1587/** Number of testing circuits we want open before testing our bandwidth. */
1588#define NUM_PARALLEL_TESTING_CIRCS 4
1589
1590/** True iff we've ever had enough testing circuits open to test our
1591 * bandwidth. */
1593
1594/** Reset have_performed_bandwidth_test, so we'll start building
1595 * testing circuits again so we can exercise our bandwidth. */
1596void
1601
1602/** Return 1 if we've already exercised our bandwidth, or if we
1603 * have fewer than NUM_PARALLEL_TESTING_CIRCS testing circuits
1604 * established or on the way. Else return 0.
1605 */
1606int
1608{
1609 int num = 0;
1610
1612 return 1;
1613
1615 if (!circ->marked_for_close && CIRCUIT_IS_ORIGIN(circ) &&
1616 circ->purpose == CIRCUIT_PURPOSE_TESTING &&
1617 circ->state == CIRCUIT_STATE_OPEN)
1618 num++;
1619 }
1620 SMARTLIST_FOREACH_END(circ);
1621 return num >= NUM_PARALLEL_TESTING_CIRCS;
1622}
1623
1624/** A testing circuit has completed. Take whatever stats we want.
1625 * Noticing reachability is taken care of in onionskin_answer(),
1626 * so there's no need to record anything here. But if we still want
1627 * to do the bandwidth test, and we now have enough testing circuits
1628 * open, do it.
1629 */
1630static void
1632{
1634 !router_orport_seems_reachable(get_options(), AF_INET)) {
1635 /* either we've already done everything we want with testing circuits,
1636 * OR this IPv4 testing circuit became open due to a fluke, e.g. we picked
1637 * a last hop where we already had the connection open due to a
1638 * outgoing local circuit, OR this is an IPv6 self-test circuit, not
1639 * a bandwidth test circuit. */
1640 circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_AT_ORIGIN);
1641 } else if (circuit_enough_testing_circs()) {
1644 } else {
1646 }
1647}
1648
1649/** A testing circuit has failed to build. Take whatever stats we want. */
1650static void
1652{
1653 const or_options_t *options = get_options();
1654 if (server_mode(options) &&
1655 router_all_orports_seem_reachable(options))
1656 return;
1657
1658 log_info(LD_GENERAL,
1659 "Our testing circuit (to see if your ORPort is reachable) "
1660 "has failed. I'll try again later.");
1661
1662 /* These aren't used yet. */
1663 (void)circ;
1664 (void)at_last_hop;
1665}
1666
1667/** The circuit <b>circ</b> has just become open. Take the next
1668 * step: for rendezvous circuits, we pass circ to the appropriate
1669 * function in rendclient or rendservice. For general circuits, we
1670 * call connection_ap_attach_pending, which looks for pending streams
1671 * that could use circ.
1672 */
1673void
1675{
1676 tor_trace(TR_SUBSYS(circuit), TR_EV(opened), circ);
1677 circuit_event_status(circ, CIRC_EVENT_BUILT, 0);
1678
1679 /* Remember that this circuit has finished building. Now if we start
1680 * it building again later (e.g. by extending it), we will know not
1681 * to consider its build time. */
1682 circ->has_opened = 1;
1683
1684 switch (TO_CIRCUIT(circ)->purpose) {
1687 /* Start building an intro circ if we don't have one yet. */
1689 /* This isn't a call to circuit_try_attaching_streams because a
1690 * circuit in _C_ESTABLISH_REND state isn't connected to its
1691 * hidden service yet, thus we can't attach streams to it yet,
1692 * thus circuit_try_attaching_streams would always clear the
1693 * circuit's isolation state. circuit_try_attaching_streams is
1694 * called later, when the rend circ enters _C_REND_JOINED
1695 * state. */
1696 break;
1699 break;
1702 break;
1705 break;
1708 /* Tell any AP connections that have been waiting for a new
1709 * circuit that one is ready. */
1711 break;
1713 /* at the service, waiting for introductions */
1715 break;
1717 /* at the service, connecting to rend point */
1719 break;
1722 break;
1723 /* default:
1724 * This won't happen in normal operation, but might happen if the
1725 * controller did it. Just let it slide. */
1726 }
1727}
1728
1729/** If the stream-isolation state of <b>circ</b> can be cleared, clear
1730 * it. Return non-zero iff <b>circ</b>'s isolation state was cleared. */
1731static int
1733{
1734 if (/* The circuit may have become non-open if it was cannibalized.*/
1735 circ->base_.state == CIRCUIT_STATE_OPEN &&
1736 /* If !isolation_values_set, there is nothing to clear. */
1737 circ->isolation_values_set &&
1738 /* It's not legal to clear a circuit's isolation info if it's ever had
1739 * streams attached */
1741 /* If we have any isolation information set on this circuit, and
1742 * we didn't manage to attach any streams to it, then we can
1743 * and should clear it and try again. */
1745 return 1;
1746 } else {
1747 return 0;
1748 }
1749}
1750
1751/** Called when a circuit becomes ready for streams to be attached to
1752 * it. */
1753void
1755{
1756 /* Attach streams to this circuit if we can. */
1758
1759 /* The call to circuit_try_clearing_isolation_state here will do
1760 * nothing and return 0 if we didn't attach any streams to circ
1761 * above. */
1763 /* Maybe *now* we can attach some streams to this circuit. */
1765 }
1766}
1767
1768/** Called whenever a circuit could not be successfully built.
1769 */
1770void
1772{
1773 channel_t *n_chan = NULL;
1774 /* we should examine circ and see if it failed because of
1775 * the last hop or an earlier hop. then use this info below.
1776 */
1777 int failed_at_last_hop = 0;
1778
1779 /* First, check to see if this was a path failure, rather than build
1780 * failure.
1781 *
1782 * Note that we deliberately use circuit_get_cpath_len() (and not
1783 * circuit_get_cpath_opened_len()) because we only want to ensure
1784 * that a full path is *chosen*. This is different than a full path
1785 * being *built*. We only want to count *build* failures below.
1786 *
1787 * Path selection failures can happen spuriously for a number
1788 * of reasons (such as aggressive/invalid user-specified path
1789 * restrictions in the torrc, insufficient microdescriptors, and
1790 * non-user reasons like exitpolicy issues), and so should not be
1791 * counted as failures below.
1792 */
1794 static ratelim_t pathfail_limit = RATELIM_INIT(3600);
1795 log_fn_ratelim(&pathfail_limit, LOG_NOTICE, LD_CIRC,
1796 "Our circuit %u (id: %" PRIu32 ") died due to an invalid "
1797 "selected path, purpose %s. This may be a torrc "
1798 "configuration issue, or a bug.",
1799 TO_CIRCUIT(circ)->n_circ_id, circ->global_identifier,
1800 circuit_purpose_to_string(TO_CIRCUIT(circ)->purpose));
1801
1802 /* If the path failed on an RP, retry it. */
1803 if (TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND) {
1805 HS_METRICS_ERR_RDV_PATH);
1807 }
1808
1809 /* In all other cases, just bail. The rest is just failure accounting
1810 * that we don't want to do */
1811 return;
1812 }
1813
1814 /* If the last hop isn't open, and the second-to-last is, we failed
1815 * at the last hop. */
1816 if (circ->cpath &&
1817 circ->cpath->prev->state != CPATH_STATE_OPEN &&
1818 circ->cpath->prev->prev->state == CPATH_STATE_OPEN) {
1819 failed_at_last_hop = 1;
1820 }
1821
1822 /* Check if we failed at first hop */
1823 if (circ->cpath &&
1824 circ->cpath->state != CPATH_STATE_OPEN &&
1825 ! circ->base_.received_destroy) {
1826 /* We failed at the first hop for some reason other than a DESTROY cell.
1827 * If there's an OR connection to blame, blame it. Also, avoid this relay
1828 * for a while, and fail any one-hop directory fetches destined for it. */
1829 const char *n_chan_ident = circ->cpath->extend_info->identity_digest;
1830 tor_assert(n_chan_ident);
1831 int already_marked = 0;
1832 if (circ->base_.n_chan) {
1833 n_chan = circ->base_.n_chan;
1834
1835 if (n_chan->is_bad_for_new_circs) {
1836 /* We only want to blame this router when a fresh healthy
1837 * connection fails. So don't mark this router as newly failed,
1838 * since maybe this was just an old circuit attempt that's
1839 * finally timing out now. Also, there's no need to blow away
1840 * circuits/streams/etc, since the failure of an unhealthy conn
1841 * doesn't tell us much about whether a healthy conn would
1842 * succeed. */
1843 already_marked = 1;
1844 }
1845 log_info(LD_OR,
1846 "Our circuit %u (id: %" PRIu32 ") failed to get a response "
1847 "from the first hop (%s). I'm going to try to rotate to a "
1848 "better connection.",
1849 TO_CIRCUIT(circ)->n_circ_id, circ->global_identifier,
1850 channel_describe_peer(n_chan));
1851 n_chan->is_bad_for_new_circs = 1;
1852 } else {
1853 log_info(LD_OR,
1854 "Our circuit %u (id: %" PRIu32 ") died before the first hop "
1855 "with no connection",
1856 TO_CIRCUIT(circ)->n_circ_id, circ->global_identifier);
1857 }
1858 if (!already_marked) {
1859 /*
1860 * If we have guard state (new guard API) and our path selection
1861 * code actually chose a full path, then blame the failure of this
1862 * circuit on the guard.
1863 */
1864 if (circ->guard_state)
1866 /* if there are any one-hop streams waiting on this circuit, fail
1867 * them now so they can retry elsewhere. */
1868 connection_ap_fail_onehop(n_chan_ident, circ->build_state);
1869 }
1870 }
1871
1872 switch (circ->base_.purpose) {
1876 /* If we never built the circuit, note it as a failure. */
1878 if (failed_at_last_hop) {
1879 /* Make sure any streams that demand our last hop as their exit
1880 * know that it's unlikely to happen. */
1882 }
1883 break;
1885 circuit_testing_failed(circ, failed_at_last_hop);
1886 break;
1888 /* at the service, waiting for introductions */
1889 if (circ->base_.state != CIRCUIT_STATE_OPEN) {
1891 }
1892 /* no need to care here, because the service will rebuild intro
1893 * points periodically. */
1894 break;
1896 /* at the client, connecting to intro point */
1897 /* Don't increment failure count, since the service may have picked
1898 * the introduction point maliciously */
1899 /* The client will pick a new intro point when this one dies, if
1900 * the stream in question still cares. No need to act here. */
1901 break;
1903 /* at the client, waiting for the service */
1905 /* the client will pick a new rend point when this one dies, if
1906 * the stream in question still cares. No need to act here. */
1907 break;
1909 /* at the service, connecting to rend point */
1910 /* Don't increment failure count, since the client may have picked
1911 * the rendezvous point maliciously */
1912 log_info(LD_REND,
1913 "Couldn't connect to the client's chosen rend point %s "
1914 "(%s hop failed).",
1916 failed_at_last_hop?"last":"non-last");
1917
1919 HS_METRICS_ERR_RDV_RP_CONN_FAILURE);
1921 break;
1922 /* default:
1923 * This won't happen in normal operation, but might happen if the
1924 * controller did it. Just let it slide. */
1925 }
1926}
1927
1928/** Number of consecutive failures so far; should only be touched by
1929 * circuit_launch_new and circuit_*_failure_count.
1930 */
1931static int n_circuit_failures = 0;
1932/** Before the last time we called circuit_reset_failure_count(), were
1933 * there a lot of failures? */
1935
1936/** Don't retry launching a new circuit if we try this many times with no
1937 * success. */
1938#define MAX_CIRCUIT_FAILURES 5
1939
1940/** Launch a new circuit; see circuit_launch_by_extend_info() for
1941 * details on arguments. */
1943circuit_launch(uint8_t purpose, int flags)
1944{
1945 return circuit_launch_by_extend_info(purpose, NULL, flags);
1946}
1947
1948/* Do we have enough descriptors to build paths?
1949 * If need_exit is true, return 1 if we can build exit paths.
1950 * (We need at least one Exit in the consensus to build exit paths.)
1951 * If need_exit is false, return 1 if we can build internal paths.
1952 */
1953static int
1954have_enough_path_info(int need_exit)
1955{
1956 if (need_exit)
1957 return router_have_consensus_path() == CONSENSUS_PATH_EXIT;
1958 else
1959 return router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN;
1960}
1961
1962/**
1963 * Tell us if a circuit is a hidden service circuit.
1964 */
1965int
1967{
1968 /* HS Vanguard purpose. */
1969 if (circuit_purpose_is_hs_vanguards(purpose)) {
1970 return 1;
1971 }
1972
1973 /* Client-side purpose */
1974 if (circuit_purpose_is_hs_client(purpose)) {
1975 return 1;
1976 }
1977
1978 /* Service-side purpose */
1979 if (circuit_purpose_is_hs_service(purpose)) {
1980 return 1;
1981 }
1982
1983 return 0;
1984}
1985
1986/** Return true iff the given circuit is an HS client circuit. */
1987bool
1988circuit_purpose_is_hs_client(const uint8_t purpose)
1989{
1990 return (purpose >= CIRCUIT_PURPOSE_C_HS_MIN_ &&
1991 purpose <= CIRCUIT_PURPOSE_C_HS_MAX_);
1992}
1993
1994/** Return true iff the given circuit is an HS service circuit. */
1995bool
1996circuit_purpose_is_hs_service(const uint8_t purpose)
1997{
1998 return (purpose >= CIRCUIT_PURPOSE_S_HS_MIN_ &&
1999 purpose <= CIRCUIT_PURPOSE_S_HS_MAX_);
2000}
2001
2002/** Return true iff the given circuit is an HS Vanguards circuit. */
2003bool
2005{
2006 return (purpose == CIRCUIT_PURPOSE_HS_VANGUARDS);
2007}
2008
2009/** Return true iff the given circuit is an HS v3 circuit. */
2010bool
2012{
2013 return (CIRCUIT_IS_ORIGIN(circ) &&
2014 (CONST_TO_ORIGIN_CIRCUIT(circ)->hs_ident != NULL));
2015}
2016
2017/**
2018 * Return true if this circuit purpose should use vanguards
2019 * or pinned Layer2 or Layer3 guards.
2020 *
2021 * This function takes both the circuit purpose and the
2022 * torrc options for pinned middles/vanguards into account
2023 * (ie: the circuit must be a hidden service circuit and
2024 * vanguards/pinned middles must be enabled for it to return
2025 * true).
2026 */
2027int
2029{
2030 /* All hidden service circuits use either vanguards or
2031 * vanguards-lite. */
2033 return 1;
2034
2035 /* Everything else is a normal circuit */
2036 return 0;
2037}
2038
2039/**
2040 * Return true for the set of conditions for which it is OK to use
2041 * a cannibalized circuit.
2042 *
2043 * Don't cannibalize for onehops, or certain purposes.
2044 */
2045static int
2047 int has_extend_info,
2048 int onehop_tunnel)
2049{
2050
2051 /* Do not try to cannibalize if this is a one hop circuit. */
2052 if (onehop_tunnel) {
2053 return 0;
2054 }
2055
2056 /* Don't try to cannibalize for general purpose circuits that do not
2057 * specify a custom exit. */
2058 if (purpose_to_build == CIRCUIT_PURPOSE_C_GENERAL && !has_extend_info) {
2059 return 0;
2060 }
2061
2062 /* Don't cannibalize for testing circuits. We want to see if they
2063 * complete normally. Also don't cannibalize for vanguard-purpose
2064 * circuits, since those are specially pre-built for later
2065 * cannibalization by the actual specific circuit types that need
2066 * vanguards.
2067 */
2068 if (purpose_to_build == CIRCUIT_PURPOSE_TESTING ||
2069 purpose_to_build == CIRCUIT_PURPOSE_HS_VANGUARDS) {
2070 return 0;
2071 }
2072
2073 /* The server-side intro circ is not cannibalized because it only
2074 * needs a 3 hop circuit. It is also long-lived, so it is more
2075 * important that it have lower latency than get built fast.
2076 */
2077 if (purpose_to_build == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO) {
2078 return 0;
2079 }
2080
2081 /* Do not cannibalize for conflux circuits */
2082 if (purpose_to_build == CIRCUIT_PURPOSE_CONFLUX_UNLINKED) {
2083 return 0;
2084 }
2085
2086 return 1;
2087}
2088
2089/** Launch a new circuit with purpose <b>purpose</b> and exit node
2090 * <b>extend_info</b> (or NULL to select a random exit node).
2091 *
2092 * If flags contains:
2093 * - CIRCLAUNCH_ONEHOP_TUNNEL: the circuit will have only one hop;
2094 * - CIRCLAUNCH_NEED_UPTIME: choose routers with high uptime;
2095 * - CIRCLAUNCH_NEED_CAPACITY: choose routers with high bandwidth;
2096 * - CIRCLAUNCH_IS_IPV6_SELFTEST: the second-last hop must support IPv6
2097 * extends;
2098 * - CIRCLAUNCH_IS_INTERNAL: the last hop need not be an exit node;
2099 * - CIRCLAUNCH_IS_V3_RP: the last hop must support v3 onion service
2100 * rendezvous.
2101 *
2102 * Return the newly allocated circuit on success, or NULL on failure. */
2105 extend_info_t *extend_info,
2106 int flags)
2107{
2108 origin_circuit_t *circ;
2109 int onehop_tunnel = (flags & CIRCLAUNCH_ONEHOP_TUNNEL) != 0;
2110 int have_path = have_enough_path_info(! (flags & CIRCLAUNCH_IS_INTERNAL) );
2111
2112 /* Keep some stats about our attempts to launch HS rendezvous circuits */
2113 if (purpose == CIRCUIT_PURPOSE_S_CONNECT_REND) {
2115 }
2116
2117 if (!onehop_tunnel && (!router_have_minimum_dir_info() || !have_path)) {
2118 log_debug(LD_CIRC,"Haven't %s yet; canceling "
2119 "circuit launch.",
2121 "fetched enough directory info" :
2122 "received a consensus with exits");
2123 return NULL;
2124 }
2125
2126 /* If we can/should cannibalize another circuit to build this one,
2127 * then do so. */
2129 extend_info != NULL,
2130 onehop_tunnel)) {
2131 /* see if there are appropriate circs available to cannibalize. */
2132 /* XXX if we're planning to add a hop, perhaps we want to look for
2133 * internal circs rather than exit circs? -RD */
2134 circ = circuit_find_to_cannibalize(purpose, extend_info, flags);
2135 if (circ) {
2136 uint8_t old_purpose = circ->base_.purpose;
2137 struct timeval old_timestamp_began = circ->base_.timestamp_began;
2138
2139 log_info(LD_CIRC, "Cannibalizing circ %u (id: %" PRIu32 ") for "
2140 "purpose %d (%s)",
2141 TO_CIRCUIT(circ)->n_circ_id, circ->global_identifier, purpose,
2142 circuit_purpose_to_string(purpose));
2143
2144 if ((purpose == CIRCUIT_PURPOSE_S_CONNECT_REND ||
2145 purpose == CIRCUIT_PURPOSE_C_INTRODUCING) &&
2147 /* Path bias: Cannibalized rends pre-emptively count as a
2148 * successfully built but unused closed circuit. We don't
2149 * wait until the extend (or the close) because the rend
2150 * point could be malicious.
2151 *
2152 * Same deal goes for client side introductions. Clients
2153 * can be manipulated to connect repeatedly to them
2154 * (especially web clients).
2155 *
2156 * If we decide to probe the initial portion of these circs,
2157 * (up to the adversary's final hop), we need to remove this,
2158 * or somehow mark the circuit with a special path state.
2159 */
2160
2161 /* This must be called before the purpose change */
2162 pathbias_check_close(circ, END_CIRC_REASON_FINISHED);
2163 }
2164
2165 circuit_change_purpose(TO_CIRCUIT(circ), purpose);
2166 /* Reset the start date of this circ, else expire_building
2167 * will see it and think it's been trying to build since it
2168 * began.
2169 *
2170 * Technically, the code should reset this when the
2171 * create cell is finally sent, but we're close enough
2172 * here. */
2173 tor_gettimeofday(&circ->base_.timestamp_began);
2174
2175 control_event_circuit_cannibalized(circ, old_purpose,
2176 &old_timestamp_began);
2177
2178 switch (purpose) {
2180 /* it's ready right now */
2181 break;
2188 /* need to add a new hop */
2189 tor_assert(extend_info);
2190 if (circuit_extend_to_new_exit(circ, extend_info) < 0)
2191 return NULL;
2192 break;
2193 default:
2194 log_warn(LD_BUG,
2195 "unexpected purpose %d when cannibalizing a circ.",
2196 purpose);
2198 return NULL;
2199 }
2200
2201 tor_trace(TR_SUBSYS(circuit), TR_EV(cannibalized), circ);
2202 return circ;
2203 }
2204 }
2205
2208 /* too many failed circs in a row. don't try. */
2209// log_fn(LOG_INFO,"%d failures so far, not trying.",n_circuit_failures);
2210 return NULL;
2211 }
2212
2213 /* try a circ. if it fails, circuit_mark_for_close will increment
2214 * n_circuit_failures */
2215 return circuit_establish_circuit(purpose, extend_info, flags);
2216}
2217
2218/** Record another failure at opening a general circuit. When we have
2219 * too many, we'll stop trying for the remainder of this minute.
2220 */
2221static void
2223{
2225 log_debug(LD_CIRC,"n_circuit_failures now %d.",n_circuit_failures);
2226}
2227
2228/** Reset the failure count for opening general circuits. This means
2229 * we will try MAX_CIRCUIT_FAILURES times more (if necessary) before
2230 * stopping again.
2231 */
2232void
2241
2242/** Find an open circ that we're happy to use for <b>conn</b> and return 1. If
2243 * there isn't one, and there isn't one on the way, launch one and return
2244 * 0. If it will never work, return -1.
2245 *
2246 * Write the found or in-progress or launched circ into *circp.
2247 */
2248static int
2250 uint8_t desired_circuit_purpose,
2251 origin_circuit_t **circp)
2252{
2253 origin_circuit_t *circ;
2254 int check_exit_policy;
2255 int need_uptime, need_internal;
2256 int want_onehop;
2257 const or_options_t *options = get_options();
2258
2259 tor_assert(conn);
2260 tor_assert(circp);
2261 if (ENTRY_TO_CONN(conn)->state != AP_CONN_STATE_CIRCUIT_WAIT) {
2262 connection_t *c = ENTRY_TO_CONN(conn);
2263 log_err(LD_BUG, "Connection state mismatch: wanted "
2264 "AP_CONN_STATE_CIRCUIT_WAIT, but got %d (%s)",
2265 c->state, conn_state_to_string(c->type, c->state));
2266 }
2268
2269 /* Will the exit policy of the exit node apply to this stream? */
2270 check_exit_policy =
2272 !conn->use_begindir &&
2274
2275 /* Does this connection want a one-hop circuit? */
2276 want_onehop = conn->want_onehop;
2277
2278 /* Do we need a high-uptime circuit? */
2279 need_uptime = !conn->want_onehop && !conn->use_begindir &&
2281 conn->socks_request->port);
2282
2283 /* Do we need an "internal" circuit? */
2284 if (desired_circuit_purpose != CIRCUIT_PURPOSE_C_GENERAL)
2285 need_internal = 1;
2286 else if (conn->use_begindir || conn->want_onehop)
2287 need_internal = 1;
2288 else
2289 need_internal = 0;
2290
2291 /* We now know what kind of circuit we need. See if there is an
2292 * open circuit that we can use for this stream */
2293 circ = circuit_get_best(conn, 1 /* Insist on open circuits */,
2294 desired_circuit_purpose,
2295 need_uptime, need_internal);
2296
2297 if (circ) {
2298 /* We got a circuit that will work for this stream! We can return it. */
2299 *circp = circ;
2300 return 1; /* we're happy */
2301 }
2302
2303 /* Okay, there's no circuit open that will work for this stream. Let's
2304 * see if there's an in-progress circuit or if we have to launch one */
2305
2306 /* Do we know enough directory info to build circuits at all? */
2307 int have_path = have_enough_path_info(!need_internal);
2308
2309 if (!want_onehop && (!router_have_minimum_dir_info() || !have_path)) {
2310 /* If we don't have enough directory information, we can't build
2311 * multihop circuits.
2312 */
2314 int severity = LOG_NOTICE;
2315 /* Retry some stuff that might help the connection work. */
2316 /* If we are configured with EntryNodes or UseBridges */
2317 if (entry_list_is_constrained(options)) {
2318 /* Retry all our guards / bridges.
2319 * guards_retry_optimistic() always returns true here. */
2320 int rv = guards_retry_optimistic(options);
2321 tor_assert_nonfatal_once(rv);
2322 log_fn(severity, LD_APP|LD_DIR,
2323 "Application request when we haven't %s. "
2324 "Optimistically trying known %s again.",
2326 "used client functionality lately" :
2327 "received a consensus with exits",
2328 options->UseBridges ? "bridges" : "entrynodes");
2329 } else {
2330 /* Getting directory documents doesn't help much if we have a limited
2331 * number of guards */
2332 tor_assert_nonfatal(!options->UseBridges);
2333 tor_assert_nonfatal(!options->EntryNodes);
2334 /* Retry our directory fetches, so we have a fresh set of guard info */
2335 log_fn(severity, LD_APP|LD_DIR,
2336 "Application request when we haven't %s. "
2337 "Optimistically trying directory fetches again.",
2339 "used client functionality lately" :
2340 "received a consensus with exits");
2342 }
2343 }
2344 /* Since we didn't have enough directory info, we can't attach now. The
2345 * stream will be dealt with when router_have_minimum_dir_info becomes 1,
2346 * or when all directory attempts fail and directory_all_unreachable()
2347 * kills it.
2348 */
2349 return 0;
2350 }
2351
2352 /* Check whether the exit policy of the chosen exit, or the exit policies
2353 * of _all_ nodes, would forbid this node. */
2354 if (check_exit_policy) {
2355 if (!conn->chosen_exit_name) {
2356 struct in_addr in;
2357 tor_addr_t addr, *addrp=NULL;
2358 if (tor_inet_aton(conn->socks_request->address, &in)) {
2359 tor_addr_from_in(&addr, &in);
2360 addrp = &addr;
2361 }
2363 conn->socks_request->port,
2364 need_uptime)) {
2365 log_notice(LD_APP,
2366 "No Tor server allows exit to %s:%d. Rejecting.",
2367 safe_str_client(conn->socks_request->address),
2368 conn->socks_request->port);
2369 return -1;
2370 }
2371 } else {
2372 /* XXXX Duplicates checks in connection_ap_handshake_attach_circuit:
2373 * refactor into a single function. */
2374 const node_t *node = node_get_by_nickname(conn->chosen_exit_name, 0);
2375 int opt = conn->chosen_exit_optional;
2376 if (node && !connection_ap_can_use_exit(conn, node)) {
2377 log_fn(opt ? LOG_INFO : LOG_WARN, LD_APP,
2378 "Requested exit point '%s' is excluded or "
2379 "would refuse request. %s.",
2380 conn->chosen_exit_name, opt ? "Trying others" : "Closing");
2381 if (opt) {
2382 conn->chosen_exit_optional = 0;
2384 /* Try again. */
2386 desired_circuit_purpose,
2387 circp);
2388 }
2389 return -1;
2390 }
2391 }
2392 }
2393
2394 /* Now, check whether there already a circuit on the way that could handle
2395 * this stream. This check matches the one above, but this time we
2396 * do not require that the circuit will work. */
2397 circ = circuit_get_best(conn, 0 /* don't insist on open circuits */,
2398 desired_circuit_purpose,
2399 need_uptime, need_internal);
2400 if (circ)
2401 log_debug(LD_CIRC, "one on the way!");
2402
2403 if (!circ) {
2404 /* No open or in-progress circuit could handle this stream! We
2405 * will have to launch one!
2406 */
2407
2408 /* The chosen exit node, if there is one. */
2409 extend_info_t *extend_info=NULL;
2410 const int n_pending = count_pending_general_client_circuits();
2411
2412 /* Do we have too many pending circuits? */
2413 if (n_pending >= options->MaxClientCircuitsPending) {
2414 static ratelim_t delay_limit = RATELIM_INIT(10*60);
2415 char *m;
2416 if ((m = rate_limit_log(&delay_limit, approx_time()))) {
2417 log_notice(LD_APP, "We'd like to launch a circuit to handle a "
2418 "connection, but we already have %d general-purpose client "
2419 "circuits pending. Waiting until some finish.%s",
2420 n_pending, m);
2421 tor_free(m);
2422 }
2423 return 0;
2424 }
2425
2426 /* If this is a hidden service trying to start an introduction point,
2427 * handle that case. */
2428 if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) {
2429 const edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(conn);
2430 /* need to pick an intro point */
2431 extend_info = hs_client_get_random_intro_from_edge(edge_conn);
2432 if (!extend_info) {
2433 log_info(LD_REND, "No intro points: re-fetching service descriptor.");
2434 hs_client_refetch_hsdesc(&edge_conn->hs_ident->identity_pk);
2436 return 0;
2437 }
2438 log_info(LD_REND,"Chose %s as intro point for service",
2439 extend_info_describe(extend_info));
2440 }
2441
2442 /* If we have specified a particular exit node for our
2443 * connection, then be sure to open a circuit to that exit node.
2444 */
2445 if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_GENERAL ||
2446 desired_circuit_purpose == CIRCUIT_PURPOSE_S_HSDIR_POST ||
2447 desired_circuit_purpose == CIRCUIT_PURPOSE_C_HSDIR_GET) {
2448 if (conn->chosen_exit_name) {
2449 const node_t *r;
2450 int opt = conn->chosen_exit_optional;
2452 if (r && node_has_preferred_descriptor(r, conn->want_onehop ? 1 : 0)) {
2453 /* We might want to connect to an IPv6 bridge for loading
2454 descriptors so we use the preferred address rather than
2455 the primary. */
2456 extend_info = extend_info_from_node(r, conn->want_onehop ? 1 : 0,
2457 desired_circuit_purpose == CIRCUIT_PURPOSE_C_GENERAL);
2458 if (!extend_info) {
2459 log_warn(LD_CIRC,"Could not make a one-hop connection to %s. "
2460 "Discarding this circuit.", conn->chosen_exit_name);
2461 return -1;
2462 }
2463 } else { /* ! (r && node_has_preferred_descriptor(...)) */
2464 log_debug(LD_DIR, "considering %d, %s",
2465 want_onehop, conn->chosen_exit_name);
2466 if (want_onehop && conn->chosen_exit_name[0] == '$') {
2467 /* We're asking for a one-hop circuit to a router that
2468 * we don't have a routerinfo about. Make up an extend_info. */
2469 /* XXX prop220: we need to make chosen_exit_name able to
2470 * encode both key formats. This is not absolutely critical
2471 * since this is just for one-hop circuits, but we should
2472 * still get it done */
2473 char digest[DIGEST_LEN];
2474 char *hexdigest = conn->chosen_exit_name+1;
2475 tor_addr_t addr;
2476 if (strlen(hexdigest) < HEX_DIGEST_LEN ||
2478 hexdigest,HEX_DIGEST_LEN) != DIGEST_LEN) {
2479 log_info(LD_DIR, "Broken exit digest on tunnel conn. Closing.");
2480 return -1;
2481 }
2482 if (tor_addr_parse(&addr, conn->socks_request->address) < 0) {
2483 log_info(LD_DIR, "Broken address %s on tunnel conn. Closing.",
2485 return -1;
2486 }
2487 /* XXXX prop220 add a workaround for ed25519 ID below*/
2488 extend_info = extend_info_new(conn->chosen_exit_name+1,
2489 digest,
2490 NULL, /* Ed25519 ID */
2491 NULL, /* onion keys */
2492 &addr, conn->socks_request->port,
2493 NULL,
2494 false);
2495 } else { /* ! (want_onehop && conn->chosen_exit_name[0] == '$') */
2496 /* We will need an onion key for the router, and we
2497 * don't have one. Refuse or relax requirements. */
2498 log_fn(opt ? LOG_INFO : LOG_WARN, LD_APP,
2499 "Requested exit point '%s' is not known. %s.",
2500 conn->chosen_exit_name, opt ? "Trying others" : "Closing");
2501 if (opt) {
2502 conn->chosen_exit_optional = 0;
2504 /* Try again with no requested exit */
2506 desired_circuit_purpose,
2507 circp);
2508 }
2509 return -1;
2510 }
2511 }
2512 }
2513 } /* Done checking for general circutis with chosen exits. */
2514
2515 /* What purpose do we need to launch this circuit with? */
2516 uint8_t new_circ_purpose;
2517 if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_REND_JOINED)
2518 new_circ_purpose = CIRCUIT_PURPOSE_C_ESTABLISH_REND;
2519 else if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT)
2520 new_circ_purpose = CIRCUIT_PURPOSE_C_INTRODUCING;
2521 else
2522 new_circ_purpose = desired_circuit_purpose;
2523
2524 /* Determine what kind of a circuit to launch, and actually launch it. */
2525 {
2526 int flags = CIRCLAUNCH_NEED_CAPACITY;
2527 if (want_onehop) flags |= CIRCLAUNCH_ONEHOP_TUNNEL;
2528 if (need_uptime) flags |= CIRCLAUNCH_NEED_UPTIME;
2529 if (need_internal) flags |= CIRCLAUNCH_IS_INTERNAL;
2530
2531 /* If we are about to pick a v3 RP right now, make sure we pick a
2532 * rendezvous point that supports the v3 protocol! */
2533 if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_REND_JOINED &&
2534 new_circ_purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND &&
2535 ENTRY_TO_EDGE_CONN(conn)->hs_ident) {
2536 log_info(LD_GENERAL, "Getting rendezvous circuit to v3 service!");
2537 }
2538
2539 circ = circuit_launch_by_extend_info(new_circ_purpose, extend_info,
2540 flags);
2541 }
2542
2543 extend_info_free(extend_info);
2544
2545 /* Now trigger things that need to happen when we launch circuits */
2546
2547 if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_GENERAL ||
2548 desired_circuit_purpose == CIRCUIT_PURPOSE_C_HSDIR_GET ||
2549 desired_circuit_purpose == CIRCUIT_PURPOSE_S_HSDIR_POST) {
2550 /* We just caused a circuit to get built because of this stream.
2551 * If this stream has caused a _lot_ of circuits to be built, that's
2552 * a bad sign: we should tell the user. */
2553 if (conn->num_circuits_launched < NUM_CIRCUITS_LAUNCHED_THRESHOLD &&
2554 ++conn->num_circuits_launched == NUM_CIRCUITS_LAUNCHED_THRESHOLD)
2555 log_info(LD_CIRC, "The application request to %s:%d has launched "
2556 "%d circuits without finding one it likes.",
2558 conn->socks_request->port,
2559 conn->num_circuits_launched);
2560 } else {
2561 /* help predict this next time */
2562 rep_hist_note_used_internal(time(NULL), need_uptime, 1);
2563 if (circ) {
2564 const edge_connection_t *edge_conn = ENTRY_TO_EDGE_CONN(conn);
2565 if (edge_conn->hs_ident) {
2566 circ->hs_ident =
2567 hs_ident_circuit_new(&edge_conn->hs_ident->identity_pk);
2568 }
2569 if (desired_circuit_purpose == CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) {
2571 return 0;
2572 }
2573 }
2574 if (circ->base_.purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND &&
2575 circ->base_.state == CIRCUIT_STATE_OPEN)
2576 circuit_has_opened(circ);
2577 }
2578 }
2579 } /* endif (!circ) */
2580
2581 /* We either found a good circuit, or launched a new circuit, or failed to
2582 * do so. Report success, and delay. */
2583
2584 if (circ) {
2585 /* Mark the circuit with the isolation fields for this connection.
2586 * When the circuit arrives, we'll clear these flags: this is
2587 * just some internal bookkeeping to make sure that we have
2588 * launched enough circuits.
2589 */
2591 } else {
2592 log_info(LD_APP,
2593 "No safe circuit (purpose %d) ready for edge "
2594 "connection; delaying.",
2595 desired_circuit_purpose);
2596 }
2597 *circp = circ;
2598 return 0;
2599}
2600
2601/** Return true iff <b>crypt_path</b> is one of the crypt_paths for
2602 * <b>circ</b>.
2603 *
2604 * WARNING: This function only validates that the cpath is on the *current*
2605 * circuit, for internal consistency checking. For codepaths involving streams,
2606 * or cpaths or layer_hints that could be from a different circuit due to
2607 * conflux, use edge_uses_cpath() or conflux_validate_source_hop() instead.
2608 */
2609static int
2611{
2612 crypt_path_t *cpath, *cpath_next = NULL;
2613 for (cpath = circ->cpath; cpath_next != circ->cpath; cpath = cpath_next) {
2614 cpath_next = cpath->next;
2615 if (crypt_path == cpath)
2616 return 1;
2617 }
2618 return 0;
2619}
2620
2621/** Attach the AP stream <b>apconn</b> to circ's linked list of
2622 * p_streams. Also set apconn's cpath_layer to <b>cpath</b>, or to the last
2623 * hop in circ's cpath if <b>cpath</b> is NULL.
2624 */
2625static void
2627 crypt_path_t *cpath)
2628{
2629 const node_t *exitnode = NULL;
2630
2631 /* add it into the linked list of streams on this circuit */
2632 log_debug(LD_APP|LD_CIRC, "attaching new conn to circ. n_circ_id %u.",
2633 (unsigned)circ->base_.n_circ_id);
2634
2635 /* If this is the first stream on this circuit, tell circpad
2636 * that streams are attached */
2637 if (!circ->p_streams)
2639
2640 /* reset it, so we can measure circ timeouts */
2641 ENTRY_TO_CONN(apconn)->timestamp_last_read_allowed = time(NULL);
2642 ENTRY_TO_EDGE_CONN(apconn)->next_stream = circ->p_streams;
2643 ENTRY_TO_EDGE_CONN(apconn)->on_circuit = TO_CIRCUIT(circ);
2644 /* assert_connection_ok(conn, time(NULL)); */
2645 circ->p_streams = ENTRY_TO_EDGE_CONN(apconn);
2647
2649 /* We are attaching a stream to a rendezvous circuit. That means
2650 * that an attempt to connect to a hidden service just
2651 * succeeded. Tell rendclient.c. */
2653 }
2654
2655 if (cpath) { /* we were given one; use it */
2656 tor_assert(cpath_is_on_circuit(circ, cpath));
2657 } else {
2658 /* use the last hop in the circuit */
2659 tor_assert(circ->cpath);
2660 tor_assert(circ->cpath->prev);
2661 tor_assert(circ->cpath->prev->state == CPATH_STATE_OPEN);
2662 cpath = circ->cpath->prev;
2663 }
2664 ENTRY_TO_EDGE_CONN(apconn)->cpath_layer = cpath;
2665
2668
2669 /* Compute the exitnode if possible, for logging below */
2670 if (cpath->extend_info)
2671 exitnode = node_get_by_id(cpath->extend_info->identity_digest);
2672
2673 /* See if we can use optimistic data on this circuit */
2674 // TODO-329-PURPOSE: Can conflux use optimistic data? Does
2675 // anything use optimistic data? Does anything use this?
2676 if (circ->base_.purpose == CIRCUIT_PURPOSE_C_GENERAL ||
2677 circ->base_.purpose == CIRCUIT_PURPOSE_C_HSDIR_GET ||
2678 circ->base_.purpose == CIRCUIT_PURPOSE_S_HSDIR_POST ||
2680 apconn->may_use_optimistic_data = 1;
2681 else
2682 apconn->may_use_optimistic_data = 0;
2683 log_info(LD_APP, "Looks like completed circuit to %s %s allow "
2684 "optimistic data for connection to %s",
2685 (circ->base_.purpose == CIRCUIT_PURPOSE_C_GENERAL ||
2686 circ->base_.purpose == CIRCUIT_PURPOSE_CONTROLLER) ?
2687 /* node_describe() does the right thing if exitnode is NULL */
2688 safe_str_client(node_describe(exitnode)) :
2689 "hidden service",
2690 apconn->may_use_optimistic_data ? "does" : "doesn't",
2691 safe_str_client(apconn->socks_request->address));
2692}
2693
2694/** Return true iff <b>address</b> is matched by one of the entries in
2695 * TrackHostExits. */
2696int
2697hostname_in_track_host_exits(const or_options_t *options, const char *address)
2698{
2699 if (!options->TrackHostExits)
2700 return 0;
2701 SMARTLIST_FOREACH_BEGIN(options->TrackHostExits, const char *, cp) {
2702 if (cp[0] == '.') { /* match end */
2703 if (cp[1] == '\0' ||
2704 !strcasecmpend(address, cp) ||
2705 !strcasecmp(address, &cp[1]))
2706 return 1;
2707 } else if (strcasecmp(cp, address) == 0) {
2708 return 1;
2709 }
2710 } SMARTLIST_FOREACH_END(cp);
2711 return 0;
2712}
2713
2714/** If an exit wasn't explicitly specified for <b>conn</b>, consider saving
2715 * the exit that we *did* choose for use by future connections to
2716 * <b>conn</b>'s destination.
2717 */
2718static void
2720 const origin_circuit_t *circ)
2721{
2722 const or_options_t *options = get_options();
2723 char *new_address = NULL;
2724 char fp[HEX_DIGEST_LEN+1];
2725 uint64_t stream_id = 0;
2726
2727 if (BUG(!conn)) {
2728 return;
2729 }
2730
2731 stream_id = ENTRY_TO_CONN(conn)->global_identifier;
2732
2733 /* Search the addressmap for this conn's destination. */
2734 /* If they're not in the address map.. */
2735 if (!options->TrackHostExits ||
2737 options->TrackHostExitsExpire))
2738 return; /* nothing to track, or already mapped */
2739
2740 if (!hostname_in_track_host_exits(options, conn->socks_request->address) ||
2741 !circ->build_state->chosen_exit)
2742 return;
2743
2744 /* write down the fingerprint of the chosen exit, not the nickname,
2745 * because the chosen exit might not be named. */
2746 base16_encode(fp, sizeof(fp),
2748
2749 /* Add this exit/hostname pair to the addressmap. */
2750 tor_asprintf(&new_address, "%s.%s.exit",
2751 conn->socks_request->address, fp);
2752
2753 addressmap_register(conn->socks_request->address, new_address,
2754 time(NULL) + options->TrackHostExitsExpire,
2755 ADDRMAPSRC_TRACKEXIT, 0, 0, stream_id);
2756}
2757
2758/**
2759 * Return true if <b>conn</b> is configured with KeepaliveIsolateSOCKSAuth,
2760 * and it has its socks isolation set.
2761 */
2762static bool
2764{
2765 return conn &&
2766 conn->socks_request &&
2767 (conn->entry_cfg.isolation_flags & ISO_SOCKSAUTH) &&
2768 (conn->entry_cfg.socks_iso_keep_alive) &&
2770}
2771
2772/** Attempt to attach the connection <b>conn</b> to <b>circ</b>, and send a
2773 * begin or resolve cell as appropriate. Return values are as for
2774 * connection_ap_handshake_attach_circuit. The stream will exit from the hop
2775 * indicated by <b>cpath</b>, or from the last hop in circ's cpath if
2776 * <b>cpath</b> is NULL. */
2777int
2779 origin_circuit_t *circ,
2780 crypt_path_t *cpath)
2781{
2782 connection_t *base_conn = ENTRY_TO_CONN(conn);
2783 tor_assert(conn);
2785 base_conn->state == AP_CONN_STATE_CONTROLLER_WAIT);
2787 tor_assert(circ);
2788 tor_assert(circ->base_.state == CIRCUIT_STATE_OPEN);
2789
2790 base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
2791
2792 if (!circ->base_.timestamp_dirty ||
2794 /* When stream isolation is in use and controlled by an application
2795 * we are willing to keep using the stream. */
2796 circ->base_.timestamp_dirty = approx_time();
2797 if (TO_CIRCUIT(circ)->conflux) {
2798 conflux_sync_circ_fields(TO_CIRCUIT(circ)->conflux, circ);
2799 }
2800 }
2801
2803
2804 /* Now, actually link the connection. */
2805 link_apconn_to_circ(conn, circ, cpath);
2806
2809 if (!conn->use_begindir) {
2810 consider_recording_trackhost(conn, circ);
2811 }
2813 return -1;
2814 } else {
2816 return -1;
2817 }
2818
2819 return 1;
2820}
2821
2822/**
2823 * Return an appropriate circuit purpose for non-rend streams.
2824 * We don't handle rends here because a rend stream triggers two
2825 * circuit builds with different purposes, so it is handled elsewhere.
2826 *
2827 * This function just figures out what type of hsdir activity this is,
2828 * and tells us. Everything else is general.
2829 */
2830static int
2832{
2833 const connection_t *base_conn = ENTRY_TO_CONN(conn);
2834 tor_assert_nonfatal(!connection_edge_is_rendezvous_stream(
2835 ENTRY_TO_EDGE_CONN(conn)));
2836
2837 if (base_conn->linked_conn &&
2838 base_conn->linked_conn->type == CONN_TYPE_DIR) {
2839 /* Set a custom purpose for hsdir activity */
2840 if (base_conn->linked_conn->purpose == DIR_PURPOSE_UPLOAD_HSDESC) {
2842 } else if (base_conn->linked_conn->purpose == DIR_PURPOSE_FETCH_HSDESC) {
2844 }
2845 }
2846
2847 /* All other purposes are general for now */
2849}
2850
2851/** Try to find a safe live circuit for stream <b>conn</b>. If we find one,
2852 * attach the stream, send appropriate cells, and return 1. Otherwise,
2853 * try to launch new circuit(s) for the stream. If we can launch
2854 * circuits, return 0. Otherwise, if we simply can't proceed with
2855 * this stream, return -1. (conn needs to die, and is maybe already marked).
2856 */
2857/* XXXX this function should mark for close whenever it returns -1;
2858 * its callers shouldn't have to worry about that. */
2859int
2861{
2862 connection_t *base_conn = ENTRY_TO_CONN(conn);
2863 int retval;
2864 int conn_age;
2865 int want_onehop;
2866
2867 tor_assert(conn);
2870 want_onehop = conn->want_onehop;
2871
2872 conn_age = (int)(time(NULL) - base_conn->timestamp_created);
2873
2874 /* Is this connection so old that we should give up on it? Don't timeout if
2875 * this is a connection to an HS with PoW enabled because it can take an
2876 * arbitrary amount of time. */
2877 if (conn_age >= get_options()->SocksTimeout && !conn->hs_with_pow_conn) {
2878 int severity = (tor_addr_is_null(&base_conn->addr) && !base_conn->port) ?
2880 log_fn(severity, LD_APP,
2881 "Tried for %d seconds to get a connection to %s:%d. Giving up.",
2882 conn_age, safe_str_client(conn->socks_request->address),
2883 conn->socks_request->port);
2884 return -1;
2885 }
2886
2887 /* We handle "general" (non-onion) connections much more straightforwardly.
2888 */
2890 /* we're a general conn */
2891 origin_circuit_t *circ=NULL;
2892
2893 /* Are we linked to a dir conn that aims to fetch a consensus?
2894 * We check here because the conn might no longer be needed. */
2895 if (base_conn->linked_conn &&
2896 base_conn->linked_conn->type == CONN_TYPE_DIR &&
2898
2899 /* Yes we are. Is there a consensus fetch farther along than us? */
2900 if (networkstatus_consensus_is_already_downloading(
2902 /* We're doing the "multiple consensus fetch attempts" game from
2903 * proposal 210, and we're late to the party. Just close this conn.
2904 * The circuit and TLS conn that we made will time out after a while
2905 * if nothing else wants to use them. */
2906 log_info(LD_DIR, "Closing extra consensus fetch (to %s) since one "
2907 "is already downloading.", base_conn->linked_conn->address);
2908 return -1;
2909 }
2910 }
2911
2912 /* If we have a chosen exit, we need to use a circuit that's
2913 * open to that exit. See what exit we meant, and whether we can use it.
2914 */
2915 if (conn->chosen_exit_name) {
2916 const node_t *node = node_get_by_nickname(conn->chosen_exit_name, 0);
2917 int opt = conn->chosen_exit_optional;
2918 if (!node && !want_onehop) {
2919 /* We ran into this warning when trying to extend a circuit to a
2920 * hidden service directory for which we didn't have a router
2921 * descriptor. See flyspray task 767 for more details. We should
2922 * keep this in mind when deciding to use BEGIN_DIR cells for other
2923 * directory requests as well. -KL*/
2924 log_fn(opt ? LOG_INFO : LOG_WARN, LD_APP,
2925 "Requested exit point '%s' is not known. %s.",
2926 conn->chosen_exit_name, opt ? "Trying others" : "Closing");
2927 if (opt) {
2928 /* If we are allowed to ignore the .exit request, do so */
2929 conn->chosen_exit_optional = 0;
2931 return 0;
2932 }
2933 return -1;
2934 }
2935 if (node && !connection_ap_can_use_exit(conn, node)) {
2936 log_fn(opt ? LOG_INFO : LOG_WARN, LD_APP,
2937 "Requested exit point '%s' is excluded or "
2938 "would refuse request. %s.",
2939 conn->chosen_exit_name, opt ? "Trying others" : "Closing");
2940 if (opt) {
2941 /* If we are allowed to ignore the .exit request, do so */
2942 conn->chosen_exit_optional = 0;
2944 return 0;
2945 }
2946 return -1;
2947 }
2948 }
2949
2950 /* Find the circuit that we should use, if there is one. Otherwise
2951 * launch it
2952 */
2953 retval = circuit_get_open_circ_or_launch(conn,
2955 &circ);
2956
2957 if (retval < 1) {
2958 /* We were either told "-1" (complete failure) or 0 (circuit in
2959 * progress); we can't attach this stream yet. */
2960 return retval;
2961 }
2962
2963 log_debug(LD_APP|LD_CIRC,
2964 "Attaching apconn to circ %u (stream %d sec old).",
2965 (unsigned)circ->base_.n_circ_id, conn_age);
2966 /* print the circ's path, so clients can figure out which circs are
2967 * sucking. */
2969
2970 /* We have found a suitable circuit for our conn. Hurray. Do
2971 * the attachment. */
2972 return connection_ap_handshake_attach_chosen_circuit(conn, circ, NULL);
2973
2974 } else { /* we're a rendezvous conn */
2975 origin_circuit_t *rendcirc=NULL, *introcirc=NULL;
2976
2977 tor_assert(!ENTRY_TO_EDGE_CONN(conn)->cpath_layer);
2978
2979 /* start by finding a rendezvous circuit for us */
2980
2982 conn, CIRCUIT_PURPOSE_C_REND_JOINED, &rendcirc);
2983 if (retval < 0) return -1; /* failed */
2984
2985 if (retval > 0) {
2986 tor_assert(rendcirc);
2987 /* one is already established, attach */
2988 log_info(LD_REND,
2989 "rend joined circ %u (id: %" PRIu32 ") already here. "
2990 "Attaching. (stream %d sec old)",
2991 (unsigned) TO_CIRCUIT(rendcirc)->n_circ_id,
2992 rendcirc->global_identifier, conn_age);
2993 /* Mark rendezvous circuits as 'newly dirty' every time you use
2994 * them, since the process of rebuilding a rendezvous circ is so
2995 * expensive. There is a tradeoff between linkability and
2996 * feasibility, at this point.
2997 */
2998 rendcirc->base_.timestamp_dirty = time(NULL);
2999
3000 /* We've also attempted to use them. If they fail, we need to
3001 * probe them for path bias */
3003
3004 link_apconn_to_circ(conn, rendcirc, NULL);
3006 return 0; /* already marked, let them fade away */
3007 return 1;
3008 }
3009
3010 /* At this point we need to re-check the state, since it's possible that
3011 * our call to circuit_get_open_circ_or_launch() changed the connection's
3012 * state from "CIRCUIT_WAIT" to "RENDDESC_WAIT" because we decided to
3013 * re-fetch the descriptor.
3014 */
3015 if (ENTRY_TO_CONN(conn)->state != AP_CONN_STATE_CIRCUIT_WAIT) {
3016 log_info(LD_REND, "This connection is no longer ready to attach; its "
3017 "state changed."
3018 "(We probably have to re-fetch its descriptor.)");
3019 return 0;
3020 }
3021
3022 if (rendcirc && (rendcirc->base_.purpose ==
3024 log_info(LD_REND,
3025 "pending-join circ %u (id: %" PRIu32 ") already here, with "
3026 "intro ack. Stalling. (stream %d sec old)",
3027 (unsigned) TO_CIRCUIT(rendcirc)->n_circ_id,
3028 rendcirc->global_identifier, conn_age);
3029 return 0;
3030 }
3031
3032 /* it's on its way. find an intro circ. */
3034 conn, CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT, &introcirc);
3035 if (retval < 0) return -1; /* failed */
3036
3037 if (rendcirc && introcirc) {
3038 /* Let's fill out the hs_ident fully as soon as possible, so that
3039 * unreachability counts can be updated properly even if circuits close
3040 * early. */
3041 tor_assert_nonfatal(!ed25519_public_key_is_zero(
3042 &introcirc->hs_ident->intro_auth_pk));
3044 &introcirc->hs_ident->intro_auth_pk);
3045 }
3046
3047 if (retval > 0) {
3048 /* one has already sent the intro. keep waiting. */
3049 tor_assert(introcirc);
3050 log_info(LD_REND, "Intro circ %u (id: %" PRIu32 ") present and "
3051 "awaiting ACK. Rend circuit %u (id: %" PRIu32 "). "
3052 "Stalling. (stream %d sec old)",
3053 (unsigned) TO_CIRCUIT(introcirc)->n_circ_id,
3054 introcirc->global_identifier,
3055 rendcirc ? (unsigned) TO_CIRCUIT(rendcirc)->n_circ_id : 0,
3056 rendcirc ? rendcirc->global_identifier : 0,
3057 conn_age);
3058 return 0;
3059 }
3060
3061 /* now rendcirc and introcirc are each either undefined or not finished */
3062
3063 if (rendcirc && introcirc &&
3064 rendcirc->base_.purpose == CIRCUIT_PURPOSE_C_REND_READY) {
3065 log_info(LD_REND,
3066 "ready rend circ %u (id: %" PRIu32 ") already here. No"
3067 "intro-ack yet on intro %u (id: %" PRIu32 "). "
3068 "(stream %d sec old)",
3069 (unsigned) TO_CIRCUIT(rendcirc)->n_circ_id,
3070 rendcirc->global_identifier,
3071 (unsigned) TO_CIRCUIT(introcirc)->n_circ_id,
3072 introcirc->global_identifier, conn_age);
3073
3074 tor_assert(introcirc->base_.purpose == CIRCUIT_PURPOSE_C_INTRODUCING);
3075 if (introcirc->base_.state == CIRCUIT_STATE_OPEN) {
3076 int ret;
3077 log_info(LD_REND, "Found open intro circ %u (id: %" PRIu32 "). "
3078 "Rend circuit %u (id: %" PRIu32 "); Considering "
3079 "sending introduction. (stream %d sec old)",
3080 (unsigned) TO_CIRCUIT(introcirc)->n_circ_id,
3081 introcirc->global_identifier,
3082 (unsigned) TO_CIRCUIT(rendcirc)->n_circ_id,
3083 rendcirc->global_identifier, conn_age);
3084 ret = hs_client_send_introduce1(introcirc, rendcirc);
3085 switch (ret) {
3086 case 0: /* success */
3087 rendcirc->base_.timestamp_dirty = time(NULL);
3088 introcirc->base_.timestamp_dirty = time(NULL);
3089
3090 pathbias_count_use_attempt(introcirc);
3092
3093 assert_circuit_ok(TO_CIRCUIT(rendcirc));
3094 assert_circuit_ok(TO_CIRCUIT(introcirc));
3095 return 0;
3096 case -1: /* transient error */
3097 return 0;
3098 case -2: /* permanent error */
3099 return -1;
3100 default: /* oops */
3102 return -1;
3103 }
3104 }
3105 }
3106
3107 log_info(LD_REND, "Intro %u (id: %" PRIu32 ") and rend circuit %u "
3108 "(id: %" PRIu32 ") circuits are not both ready. "
3109 "Stalling conn. (%d sec old)",
3110 introcirc ? (unsigned) TO_CIRCUIT(introcirc)->n_circ_id : 0,
3111 introcirc ? introcirc->global_identifier : 0,
3112 rendcirc ? (unsigned) TO_CIRCUIT(rendcirc)->n_circ_id : 0,
3113 rendcirc ? rendcirc->global_identifier : 0, conn_age);
3114 return 0;
3115 }
3116}
3117
3118/** Change <b>circ</b>'s purpose to <b>new_purpose</b>. */
3119void
3120circuit_change_purpose(circuit_t *circ, uint8_t new_purpose)
3121{
3122 uint8_t old_purpose;
3123 /* Don't allow an OR circ to become an origin circ or vice versa. */
3124 tor_assert(!!(CIRCUIT_IS_ORIGIN(circ)) ==
3125 !!(CIRCUIT_PURPOSE_IS_ORIGIN(new_purpose)));
3126
3127 if (circ->purpose == new_purpose) return;
3128
3129 /* If this is a conflux circuit, a purpose change means we have closed */
3130 if (CIRCUIT_IS_CONFLUX(circ)) {
3131 /* If we're not transitioning to the linked purpose, we're closed. */
3132 if (new_purpose != CIRCUIT_PURPOSE_CONFLUX_LINKED)
3134 }
3135
3136 if (CIRCUIT_IS_ORIGIN(circ)) {
3137 char old_purpose_desc[80] = "";
3138
3139 strncpy(old_purpose_desc, circuit_purpose_to_string(circ->purpose), 80-1);
3140 old_purpose_desc[80-1] = '\0';
3141
3142 log_debug(LD_CIRC,
3143 "changing purpose of origin circ %d "
3144 "from \"%s\" (%d) to \"%s\" (%d)",
3145 TO_ORIGIN_CIRCUIT(circ)->global_identifier,
3146 old_purpose_desc,
3147 circ->purpose,
3148 circuit_purpose_to_string(new_purpose),
3149 new_purpose);
3150
3151 /* Take specific actions if we are repurposing a hidden service circuit. */
3153 !circuit_purpose_is_hidden_service(new_purpose)) {
3155 }
3156 }
3157
3158 old_purpose = circ->purpose;
3159 circ->purpose = new_purpose;
3160 tor_trace(TR_SUBSYS(circuit), TR_EV(change_purpose), circ, old_purpose,
3161 new_purpose);
3162
3163 if (CIRCUIT_IS_ORIGIN(circ)) {
3165 old_purpose);
3166
3168 }
3169}
3170
3171/** Mark <b>circ</b> so that no more connections can be attached to it. */
3172void
3174{
3175 const or_options_t *options = get_options();
3176 tor_assert(circ);
3177
3178 /* XXXX This is a kludge; we're only keeping it around in case there's
3179 * something that doesn't check unusable_for_new_conns, and to avoid
3180 * deeper refactoring of our expiration logic. */
3181 if (! circ->base_.timestamp_dirty)
3182 circ->base_.timestamp_dirty = approx_time();
3183 if (options->MaxCircuitDirtiness >= circ->base_.timestamp_dirty)
3184 circ->base_.timestamp_dirty = 1; /* prevent underflow */
3185 else
3186 circ->base_.timestamp_dirty -= options->MaxCircuitDirtiness;
3187
3188 circ->unusable_for_new_conns = 1;
3189
3190 if (TO_CIRCUIT(circ)->conflux) {
3191 conflux_sync_circ_fields(TO_CIRCUIT(circ)->conflux, circ);
3192 }
3193}
3194
3195/**
3196 * Add relay_body_len and RELAY_PAYLOAD_SIZE-relay_body_len to
3197 * the valid delivered written fields and the overhead field,
3198 * respectively.
3199 */
3200void
3201circuit_sent_valid_data(origin_circuit_t *circ, uint16_t relay_body_len)
3202{
3203 if (!circ) return;
3204
3205 tor_assertf_nonfatal(relay_body_len <= RELAY_PAYLOAD_SIZE_MAX,
3206 "Wrong relay_body_len: %d (should be at most %d)",
3207 relay_body_len, RELAY_PAYLOAD_SIZE_MAX);
3208
3210 tor_add_u32_nowrap(circ->n_delivered_written_circ_bw, relay_body_len);
3211 // TODO CGO: I think this may now be somewhat incorrect.
3213 tor_add_u32_nowrap(circ->n_overhead_written_circ_bw,
3214 RELAY_PAYLOAD_SIZE_MAX-relay_body_len);
3215}
3216
3217/**
3218 * Add relay_body_len and RELAY_PAYLOAD_SIZE-relay_body_len to
3219 * the valid delivered read field and the overhead field,
3220 * respectively.
3221 */
3222void
3223circuit_read_valid_data(origin_circuit_t *circ, uint16_t relay_body_len)
3224{
3225 if (!circ) return;
3226
3227 tor_assert_nonfatal(relay_body_len <= RELAY_PAYLOAD_SIZE_MAX);
3228
3230 tor_add_u32_nowrap(circ->n_delivered_read_circ_bw, relay_body_len);
3231 // TODO CGO: I think this may now be somewhat incorrect.
3233 tor_add_u32_nowrap(circ->n_overhead_read_circ_bw,
3234 RELAY_PAYLOAD_SIZE_MAX-relay_body_len);
3235}
int tor_addr_parse(tor_addr_t *addr, const char *src)
Definition address.c:1349
int tor_addr_is_null(const tor_addr_t *addr)
Definition address.c:780
#define tor_addr_from_in(dest, in)
Definition address.h:331
int addressmap_have_mapping(const char *address, int update_expiry)
Definition addressmap.c:544
void addressmap_clean(time_t now)
Definition addressmap.c:320
void addressmap_register(const char *address, char *new_address, time_t expires, addressmap_entry_source_t source, const int wildcard_addr, const int wildcard_new_addr, uint64_t stream_id)
Definition addressmap.c:576
Header for addressmap.c.
time_t approx_time(void)
Definition approx_time.c:32
int base16_decode(char *dest, size_t destlen, const char *src, size_t srclen)
Definition binascii.c:506
void base16_encode(char *dest, size_t destlen, const char *src, size_t srclen)
Definition binascii.c:478
int n_bits_set_u8(uint8_t v)
Definition bits.c:72
Header file for circuitbuild.c.
time_t channel_when_last_xmit(channel_t *chan)
Definition channel.c:3277
const char * channel_state_to_string(channel_state_t state)
Definition channel.c:316
int channel_is_client(const channel_t *chan)
Definition channel.c:2917
const char * channel_describe_peer(channel_t *chan)
Definition channel.c:2839
Header file for channel.c.
void pathbias_count_use_attempt(origin_circuit_t *circ)
int pathbias_check_close(origin_circuit_t *ocirc, int reason)
void pathbias_count_timeout(origin_circuit_t *circ)
int circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *exit_ei)
const char * build_state_get_exit_nickname(cpath_build_state_t *state)
void circuit_log_path(int severity, unsigned int domain, origin_circuit_t *circ)
int circuit_timeout_want_to_count_circ(const origin_circuit_t *circ)
int circuit_all_predicted_ports_handled(time_t now, int *need_uptime, int *need_capacity)
origin_circuit_t * circuit_establish_circuit(uint8_t purpose, extend_info_t *exit_ei, int flags)
const node_t * build_state_get_exit_node(cpath_build_state_t *state)
Header file for circuitbuild.c.
int circuit_any_opened_circuits(void)
origin_circuit_t * TO_ORIGIN_CIRCUIT(circuit_t *x)
int circuit_get_cpath_len(origin_circuit_t *circ)
void assert_circuit_ok(const circuit_t *c)
const char * circuit_state_to_string(int state)
int circuit_event_status(origin_circuit_t *circ, circuit_status_event_t tp, int reason_code)
or_circuit_t * TO_OR_CIRCUIT(circuit_t *x)
origin_circuit_t * circuit_find_to_cannibalize(uint8_t purpose_to_produce, extend_info_t *info, int flags)
const char * circuit_purpose_to_string(uint8_t purpose)
smartlist_t * circuit_get_global_origin_circuit_list(void)
smartlist_t * circuit_get_global_list(void)
Header file for circuitlist.c.
#define CIRCUIT_PURPOSE_S_CONNECT_REND
#define CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT
Definition circuitlist.h:93
#define CIRCUIT_PURPOSE_PATH_BIAS_TESTING
#define CIRCUIT_STATE_OPEN
Definition circuitlist.h:32
#define CIRCUIT_PURPOSE_IS_ORIGIN(p)
#define CIRCUIT_PURPOSE_C_REND_JOINED
Definition circuitlist.h:88
#define CIRCUIT_PURPOSE_S_INTRO
#define CIRCUIT_PURPOSE_CONTROLLER
#define CIRCUIT_IS_ORIGIN(c)
#define CIRCUIT_PURPOSE_C_CIRCUIT_PADDING
Definition circuitlist.h:95
#define CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED
Definition circuitlist.h:86
#define CIRCUIT_PURPOSE_TESTING
#define CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT
Definition circuitlist.h:76
#define CIRCUIT_PURPOSE_S_REND_JOINED
#define CIRCUIT_PURPOSE_C_REND_READY
Definition circuitlist.h:83
#define CIRCUIT_PURPOSE_S_HSDIR_POST
#define CIRCUIT_PURPOSE_C_HSDIR_GET
Definition circuitlist.h:90
#define CIRCUIT_PURPOSE_C_INTRODUCING
Definition circuitlist.h:73
#define CIRCUIT_PURPOSE_S_ESTABLISH_INTRO
#define CIRCUIT_PURPOSE_C_ESTABLISH_REND
Definition circuitlist.h:81
#define CIRCUIT_PURPOSE_C_GENERAL
Definition circuitlist.h:70
#define CIRCUIT_PURPOSE_COUNTS_TOWARDS_MAXPENDING(p)
#define CIRCUIT_PURPOSE_CONFLUX_UNLINKED
#define CIRCUIT_PURPOSE_HS_VANGUARDS
void circpad_machine_event_circ_purpose_changed(origin_circuit_t *circ)
void circpad_machine_event_circ_has_no_streams(origin_circuit_t *circ)
void circpad_machine_event_circ_has_streams(origin_circuit_t *circ)
Header file for circuitpadding.c.
int circuit_build_times_needs_circuits_now(const circuit_build_times_t *cbt)
circuit_build_times_t * get_circuit_build_times_mutable(void)
void circuit_build_times_set_timeout(circuit_build_times_t *cbt)
double get_circuit_build_timeout_ms(void)
void circuit_build_times_count_timeout(circuit_build_times_t *cbt, int did_onehop)
const circuit_build_times_t * get_circuit_build_times(void)
double get_circuit_build_close_time_ms(void)
void circuit_build_times_mark_circ_as_measurement_only(origin_circuit_t *circ)
int circuit_build_times_enough_to_compute(const circuit_build_times_t *cbt)
int circuit_build_times_count_close(circuit_build_times_t *cbt, int did_onehop, time_t start_time)
int circuit_build_times_disabled(const or_options_t *options)
Header file for circuitstats.c.
void circuit_build_failed(origin_circuit_t *circ)
void circuit_sent_valid_data(origin_circuit_t *circ, uint16_t relay_body_len)
void circuit_expire_old_circuits_serverside(time_t now)
bool circuit_is_hs_v3(const circuit_t *circ)
void circuit_detach_stream(circuit_t *circ, edge_connection_t *conn)
static int count_pending_general_client_circuits(void)
Definition circuituse.c:387
static void circuit_testing_failed(origin_circuit_t *circ, int at_last_hop)
static void circuit_testing_opened(origin_circuit_t *circ)
static int circuit_matches_with_rend_stream(const edge_connection_t *edge_conn, const origin_circuit_t *origin_circ)
Definition circuituse.c:89
static int circuit_try_clearing_isolation_state(origin_circuit_t *circ)
bool circuit_purpose_is_hs_service(const uint8_t purpose)
origin_circuit_t * circuit_launch(uint8_t purpose, int flags)
void circuit_read_valid_data(origin_circuit_t *circ, uint16_t relay_body_len)
void circuit_log_ancient_one_hop_circuits(int age)
Definition circuituse.c:854
void circuit_change_purpose(circuit_t *circ, uint8_t new_purpose)
static int have_performed_bandwidth_test
void circuit_expire_waiting_for_better_guard(void)
Definition circuituse.c:830
void circuit_expire_old_circs_as_needed(time_t now)
static void circuit_predict_and_launch_new(void)
int circuit_should_use_vanguards(uint8_t purpose)
void reset_bandwidth_test(void)
int hostname_in_track_host_exits(const or_options_t *options, const char *address)
int circuit_is_acceptable(const origin_circuit_t *origin_circ, const entry_connection_t *conn, int must_be_open, uint8_t purpose, int need_uptime, int need_internal, time_t now)
Definition circuituse.c:109
static void consider_recording_trackhost(const entry_connection_t *conn, const origin_circuit_t *circ)
static int n_circuit_failures
#define MAX_CIRCUIT_FAILURES
void circuit_has_opened(origin_circuit_t *circ)
void circuit_expire_building(void)
Definition circuituse.c:447
static int circuit_should_cannibalize_to_build(uint8_t purpose_to_build, int has_extend_info, int onehop_tunnel)
void circuit_build_needed_circs(time_t now)
static int did_circs_fail_last_period
bool circuit_purpose_is_hs_vanguards(const uint8_t purpose)
int connection_ap_handshake_attach_circuit(entry_connection_t *conn)
void circuit_reset_failure_count(int timeout)
#define IDLE_ONE_HOP_CIRC_TIMEOUT
STATIC void circuit_expire_old_circuits_clientside(void)
static int circuit_is_better(const origin_circuit_t *oa, const origin_circuit_t *ob, const entry_connection_t *conn)
Definition circuituse.c:245
bool circuit_purpose_is_hs_client(const uint8_t purpose)
int connection_ap_handshake_attach_chosen_circuit(entry_connection_t *conn, origin_circuit_t *circ, crypt_path_t *cpath)
int circuit_stream_is_being_handled(entry_connection_t *conn, uint16_t port, int min)
static void circuit_increment_failure_count(void)
static int circuit_get_open_circ_or_launch(entry_connection_t *conn, uint8_t desired_circuit_purpose, origin_circuit_t **circp)
#define MAX_UNUSED_OPEN_CIRCUITS
void circuit_remove_handled_ports(smartlist_t *needed_ports)
Definition circuituse.c:986
int circuit_enough_testing_circs(void)
static bool connection_ap_socks_iso_keepalive_enabled(const entry_connection_t *)
static int connection_ap_get_nonrend_circ_purpose(const entry_connection_t *conn)
void mark_circuit_unusable_for_new_conns(origin_circuit_t *circ)
#define NUM_PARALLEL_TESTING_CIRCS
origin_circuit_t * circuit_launch_by_extend_info(uint8_t purpose, extend_info_t *extend_info, int flags)
#define TESTING_CIRCUIT_INTERVAL
static origin_circuit_t * circuit_get_best(const entry_connection_t *conn, int must_be_open, uint8_t purpose, int need_uptime, int need_internal)
Definition circuituse.c:337
static time_t last_expired_clientside_circuits
Definition circuituse.c:845
void circuit_try_attaching_streams(origin_circuit_t *circ)
static void link_apconn_to_circ(entry_connection_t *apconn, origin_circuit_t *circ, crypt_path_t *cpath)
static int cpath_is_on_circuit(origin_circuit_t *circ, crypt_path_t *crypt_path)
int circuit_purpose_is_hidden_service(uint8_t purpose)
Header file for circuituse.c.
#define CIRCLAUNCH_NEED_CAPACITY
Definition circuituse.h:43
#define CIRCLAUNCH_ONEHOP_TUNNEL
Definition circuituse.h:39
#define CIRCLAUNCH_IS_INTERNAL
Definition circuituse.h:46
#define CIRCLAUNCH_NEED_UPTIME
Definition circuituse.h:41
const char * escaped_safe_str_client(const char *address)
Definition config.c:1146
const or_options_t * get_options(void)
Definition config.c:948
Header file for config.c.
Public APIs for conflux multipath support.
void conflux_circuit_has_opened(origin_circuit_t *orig_circ)
void conflux_circuit_has_closed(circuit_t *circ)
void conflux_predict_new(time_t now)
origin_circuit_t * conflux_get_circ_for_conn(const entry_connection_t *conn, time_t now)
Header file for conflux_pool.c.
void conflux_sync_circ_fields(conflux_t *cfx, origin_circuit_t *ref_circ)
void conflux_update_resolving_streams(or_circuit_t *circ, edge_connection_t *stream)
void conflux_update_p_streams(origin_circuit_t *circ, edge_connection_t *stream)
void conflux_update_n_streams(or_circuit_t *circ, edge_connection_t *stream)
Header file for conflux_util.c.
const char * conn_type_to_string(int type)
Definition connection.c:270
connection_t * connection_get_by_type(int type)
const char * conn_state_to_string(int type, int state)
Definition connection.c:304
Header file for connection.c.
#define CONN_TYPE_AP
Definition connection.h:51
#define CONN_TYPE_DIR
Definition connection.h:55
int connection_edge_compatible_with_circuit(const entry_connection_t *conn, const origin_circuit_t *circ)
void connection_ap_mark_as_waiting_for_renddesc(entry_connection_t *entry_conn)
void connection_ap_fail_onehop(const char *failed_digest, cpath_build_state_t *build_state)
void connection_ap_rescan_and_attach_pending(void)
int connection_ap_handshake_send_begin(entry_connection_t *ap_conn)
bool connection_half_edges_waiting(const origin_circuit_t *circ)
void circuit_clear_isolation(origin_circuit_t *circ)
entry_connection_t * EDGE_TO_ENTRY_CONN(edge_connection_t *c)
int connection_ap_handshake_send_resolve(entry_connection_t *ap_conn)
int connection_edge_update_circuit_isolation(const entry_connection_t *conn, origin_circuit_t *circ, int dry_run)
int connection_ap_can_use_exit(const entry_connection_t *conn, const node_t *exit_node)
void connection_ap_attach_pending(int retry)
int connection_edge_is_rendezvous_stream(const edge_connection_t *conn)
void circuit_discard_optional_exit_enclaves(extend_info_t *info)
Header file for connection_edge.c.
#define AP_CONN_STATE_CONTROLLER_WAIT
#define AP_CONN_STATE_CIRCUIT_WAIT
int control_event_circuit_purpose_changed(origin_circuit_t *circ, int old_purpose)
int control_event_circuit_cannibalized(origin_circuit_t *circ, int old_purpose, const struct timeval *old_tv_created)
Header file for control_events.c.
Circuit-build-stse structure.
#define HEX_DIGEST_LEN
void ed25519_pubkey_copy(ed25519_public_key_t *dest, const ed25519_public_key_t *src)
int ed25519_public_key_is_zero(const ed25519_public_key_t *pubkey)
int ed25519_pubkey_eq(const ed25519_public_key_t *key1, const ed25519_public_key_t *key2)
const char * extend_info_describe(const extend_info_t *ei)
Definition describe.c:224
const char * node_describe(const node_t *node)
Definition describe.c:160
Header file for describe.c.
#define tor_memneq(a, b, sz)
Definition di_ops.h:21
#define DIGEST_LEN
Client/server directory connection structure.
dir_connection_t * TO_DIR_CONN(connection_t *c)
Definition directory.c:89
Header file for directory.c.
#define DIR_PURPOSE_UPLOAD_HSDESC
Definition directory.h:67
#define DIR_PURPOSE_FETCH_CONSENSUS
Definition directory.h:54
#define DIR_PURPOSE_FETCH_HSDESC
Definition directory.h:69
Entry connection structure.
#define ENTRY_TO_EDGE_CONN(c)
void entry_guard_failed(circuit_guard_state_t **guard_state_p)
int entry_list_is_constrained(const or_options_t *options)
int entry_guard_state_should_expire(circuit_guard_state_t *guard_state)
int guards_retry_optimistic(const or_options_t *options)
Header file for circuitbuild.c.
const char * escaped(const char *s)
Definition escape.c:126
Header file for Tor tracing instrumentation definition.
#define TR_SUBSYS(name)
Definition events.h:45
Extend-info structure.
extend_info_t * extend_info_from_node(const node_t *node, int for_direct_connect, bool for_exit)
Definition extendinfo.c:102
extend_info_t * extend_info_new(const char *nickname, const char *rsa_id_digest, const ed25519_public_key_t *ed_id, const curve25519_public_key_t *ntor_key, const tor_addr_t *addr, uint16_t port, const protover_summary_flags_t *pv, bool for_exit_use)
Definition extendinfo.c:33
bool extend_info_has_orport(const extend_info_t *ei, const tor_addr_t *addr, uint16_t port)
Definition extendinfo.c:247
Header for core/or/extendinfo.c.
Header for fp.c.
void hs_circ_cleanup_on_repurpose(circuit_t *circ)
bool hs_circ_is_rend_sent_in_intro1(const origin_circuit_t *circ)
void hs_circ_retry_service_rendezvous_point(const origin_circuit_t *circ)
Header file containing circuit data for the whole HS subsystem.
void hs_client_note_connection_attempt_succeeded(const edge_connection_t *conn)
Definition hs_client.c:2130
int hs_client_refetch_hsdesc(const ed25519_public_key_t *identity_pk)
Definition hs_client.c:2228
int hs_client_send_introduce1(origin_circuit_t *intro_circ, origin_circuit_t *rend_circ)
Definition hs_client.c:2259
void hs_client_circuit_has_opened(origin_circuit_t *circ)
Definition hs_client.c:2269
extend_info_t * hs_client_get_random_intro_from_edge(const edge_connection_t *edge_conn)
Definition hs_client.c:2591
int hs_client_setup_intro_circ_auth_key(origin_circuit_t *circ)
Definition hs_client.c:847
Header file containing client data for the HS subsystem.
void hs_dec_rdv_stream_counter(origin_circuit_t *circ)
Definition hs_common.c:1722
Header file containing common data for the whole HS subsystem.
hs_ident_circuit_t * hs_ident_circuit_new(const ed25519_public_key_t *identity_pk)
Definition hs_ident.c:16
Header file containing circuit and connection identifier data for the whole HS subsystem.
Header for feature/hs/hs_metrics.c.
#define hs_metrics_failed_rdv(i, reason)
Definition hs_metrics.h:63
void hs_service_circuit_has_opened(origin_circuit_t *circ)
unsigned int hs_service_get_num_services(void)
void hs_stats_note_service_rendezvous_launch(void)
Definition hs_stats.c:34
Header file for hs_stats.c.
int tor_inet_aton(const char *str, struct in_addr *addr)
Definition inaddr.c:40
#define log_fn(severity, domain, args,...)
Definition log.h:283
#define LD_REND
Definition log.h:84
#define log_fn_ratelim(ratelim, severity, domain, args,...)
Definition log.h:288
#define LD_APP
Definition log.h:78
#define LOG_DEBUG
Definition log.h:42
#define LD_OR
Definition log.h:92
#define LD_HEARTBEAT
Definition log.h:103
#define LD_BUG
Definition log.h:86
#define LD_GENERAL
Definition log.h:62
#define LD_DIR
Definition log.h:88
#define LOG_NOTICE
Definition log.h:50
#define LD_CIRC
Definition log.h:82
#define LOG_WARN
Definition log.h:53
#define LOG_INFO
Definition log.h:45
int connection_is_reading(const connection_t *conn)
Definition mainloop.c:500
Header file for mainloop.c.
#define tor_free(p)
Definition malloc.h:56
int32_t networkstatus_get_param(const networkstatus_t *ns, const char *param_name, int32_t default_val, int32_t min_val, int32_t max_val)
Header file for networkstatus.c.
const node_t * node_get_by_id(const char *identity_digest)
Definition nodelist.c:226
const node_t * node_get_by_nickname(const char *nickname, unsigned flags)
Definition nodelist.c:1110
int node_has_preferred_descriptor(const node_t *node, int for_direct_connect)
Definition nodelist.c:1534
int router_exit_policy_all_nodes_reject(const tor_addr_t *addr, uint16_t port, int need_uptime)
Definition nodelist.c:2404
consensus_path_type_t router_have_consensus_path(void)
Definition nodelist.c:2514
int router_have_minimum_dir_info(void)
Definition nodelist.c:2481
Header file for nodelist.c.
Master header file for Tor-specific functionality.
#define MIN_CIRCUITS_HANDLING_STREAM
Definition or.h:180
@ ADDRMAPSRC_TRACKEXIT
Definition or.h:1032
#define TO_CIRCUIT(x)
Definition or.h:951
#define ISO_SOCKSAUTH
Definition or.h:964
#define END_CIRC_REASON_MEASUREMENT_EXPIRED
Definition or.h:365
#define TO_CONN(c)
Definition or.h:709
#define RELAY_PAYLOAD_SIZE_MAX
Definition or.h:576
#define END_CIRC_AT_ORIGIN
Definition or.h:370
#define ENTRY_TO_CONN(c)
Definition or.h:712
Origin circuit structure.
@ PATH_STATE_USE_FAILED
@ PATH_STATE_BUILD_SUCCEEDED
addr_policy_result_t compare_tor_addr_to_addr_policy(const tor_addr_t *addr, uint16_t port, const smartlist_t *policy)
Definition policies.c:1536
addr_policy_result_t compare_tor_addr_to_node_policy(const tor_addr_t *addr, uint16_t port, const node_t *node)
Definition policies.c:2909
Header file for policies.c.
addr_policy_result_t
Definition policies.h:38
@ ADDR_POLICY_PROBABLY_REJECTED
Definition policies.h:48
@ ADDR_POLICY_REJECTED
Definition policies.h:42
void rep_hist_note_used_internal(time_t now, int need_uptime, int need_capacity)
int predicted_ports_prediction_time_remaining(time_t now)
int rep_hist_get_predicted_internal(time_t now, int *need_uptime, int *need_capacity)
Header file for predict_ports.c.
int tor_asprintf(char **strp, const char *fmt,...)
Definition printf.c:75
int proxy_mode(const or_options_t *options)
Definition proxymode.c:21
Header file for proxymode.c.
char * rate_limit_log(ratelim_t *lim, time_t now)
Definition ratelim.c:42
void routerlist_retry_directory_downloads(time_t now)
int hexdigest_to_digest(const char *hexdigest, char *digest)
Definition routerlist.c:751
Header file for routerlist.c.
Header file for routermode.c.
int routerset_contains_extendinfo(const routerset_t *set, const extend_info_t *ei)
Definition routerset.c:308
void router_do_reachability_checks(void)
Definition selftest.c:280
void router_perform_bandwidth_test(int num_circs, time_t now)
Definition selftest.c:413
Header file for selftest.c.
int smartlist_contains_int_as_string(const smartlist_t *sl, int num)
Definition smartlist.c:147
smartlist_t * smartlist_new(void)
void smartlist_add(smartlist_t *sl, void *element)
void smartlist_del(smartlist_t *sl, int idx)
#define SMARTLIST_FOREACH_BEGIN(sl, type, var)
Client request structure.
#define SOCKS_COMMAND_CONNECT
unsigned int is_bad_for_new_circs
Definition channel.h:420
uint8_t state
Definition circuit_st.h:111
time_t timestamp_dirty
Definition circuit_st.h:198
unsigned int received_destroy
Definition circuit_st.h:105
uint16_t marked_for_close
Definition circuit_st.h:200
uint8_t purpose
Definition circuit_st.h:112
struct timeval timestamp_began
Definition circuit_st.h:176
int package_window
Definition circuit_st.h:117
struct timeval timestamp_created
Definition circuit_st.h:179
channel_t * n_chan
Definition circuit_st.h:70
circid_t n_circ_id
Definition circuit_st.h:79
struct connection_t * linked_conn
unsigned int hold_open_until_flushed
unsigned int reading_from_linked_conn
unsigned int type
unsigned int linked
uint16_t marked_for_close
const char * marked_for_close_file
unsigned int purpose
time_t timestamp_created
tor_addr_t addr
extend_info_t * chosen_exit
struct crypt_path_t * prev
struct crypt_path_t * next
extend_info_t * extend_info
struct crypt_path_t * cpath_layer
struct edge_connection_t * next_stream
unsigned int edge_has_sent_end
struct circuit_t * on_circuit
socks_request_t * socks_request
unsigned int num_circuits_launched
unsigned int chosen_exit_optional
unsigned int may_use_optimistic_data
unsigned int socks_iso_keep_alive
char identity_digest[DIGEST_LEN]
ed25519_public_key_t intro_auth_pk
Definition hs_ident.h:51
ed25519_public_key_t identity_pk
Definition hs_ident.h:45
ed25519_public_key_t identity_pk
Definition hs_ident.h:106
edge_connection_t * resolving_streams
channel_t * p_chan
circid_t p_circ_id
struct or_circuit_t * rend_splice
edge_connection_t * n_streams
struct routerset_t * ExcludeExitNodes
struct smartlist_t * TrackHostExits
struct routerset_t * EntryNodes
struct routerset_t * ExcludeNodes
int MaxClientCircuitsPending
int DisablePredictedCircuits
struct smartlist_t * LongLivedPorts
unsigned int relaxed_timeout
struct hs_ident_circuit_t * hs_ident
edge_connection_t * p_streams
unsigned int isolation_values_set
uint32_t n_overhead_written_circ_bw
unsigned int has_opened
path_state_bitfield_t path_state
unsigned int is_ancient
uint32_t n_delivered_read_circ_bw
uint32_t n_delivered_written_circ_bw
uint32_t n_overhead_read_circ_bw
smartlist_t * prepend_policy
crypt_path_t * cpath
cpath_build_state_t * build_state
unsigned int isolation_any_streams_attached
struct circuit_guard_state_t * guard_state
char address[MAX_SOCKS_ADDR_LEN]
#define STATIC
Definition testsupport.h:32
void format_local_iso_time(char *buf, time_t t)
Definition time_fmt.c:316
#define timercmp(tv1, tv2, op)
Definition timeval.h:81
void tor_gettimeofday(struct timeval *timeval)
long tv_mdiff(const struct timeval *start, const struct timeval *end)
Definition tvdiff.c:102
Header for tvdiff.c.
#define tor_assert(expr)
Definition util_bug.h:103
#define tor_fragile_assert()
Definition util_bug.h:278
int strcasecmpend(const char *s1, const char *s2)
int tor_digest_is_zero(const char *digest)
Definition util_string.c:98