Tor 0.4.9.10
Loading...
Searching...
No Matches
entrynodes.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 entrynodes.c
9 * \brief Code to manage our fixed first nodes for various functions.
10 *
11 * Entry nodes can be guards (for general use) or bridges (for censorship
12 * circumvention).
13 *
14 * In general, we use entry guards to prevent traffic-sampling attacks:
15 * if we chose every circuit independently, an adversary controlling
16 * some fraction of paths on the network would observe a sample of every
17 * user's traffic. Using guards gives users a chance of not being
18 * profiled.
19 *
20 * The current entry guard selection code is designed to try to avoid
21 * _ever_ trying every guard on the network, to try to stick to guards
22 * that we've used before, to handle hostile/broken networks, and
23 * to behave sanely when the network goes up and down.
24 *
25 * Our algorithm works as follows: First, we maintain a SAMPLE of guards
26 * we've seen in the networkstatus consensus. We maintain this sample
27 * over time, and store it persistently; it is chosen without reference
28 * to our configuration or firewall rules. Guards remain in the sample
29 * as they enter and leave the consensus. We expand this sample as
30 * needed, up to a maximum size.
31 *
32 * As a subset of the sample, we maintain a FILTERED SET of the guards
33 * that we would be willing to use if we could connect to them. The
34 * filter removes all the guards that we're excluding because they're
35 * bridges (or not bridges), because we have restrictive firewall rules,
36 * because of ExcludeNodes, because we of path bias restrictions,
37 * because they're absent from the network at present, and so on.
38 *
39 * As a subset of the filtered set, we keep a REACHABLE FILTERED SET
40 * (also called a "usable filtered set") of those guards that we call
41 * "reachable" or "maybe reachable". A guard is reachable if we've
42 * connected to it more recently than we've failed. A guard is "maybe
43 * reachable" if we have never tried to connect to it, or if we
44 * failed to connect to it so long ago that we no longer think our
45 * failure means it's down.
46 *
47 * As a persistent ordered list whose elements are taken from the
48 * sampled set, we track a CONFIRMED GUARDS LIST. A guard becomes
49 * confirmed when we successfully build a circuit through it, and decide
50 * to use that circuit.
51 *
52 * And as a final group, we have an ordered list of PRIMARY GUARDS,
53 * whose elements are taken from the filtered set. We prefer
54 * confirmed guards to non-confirmed guards for this list, and place
55 * other restrictions on it. The primary guards are the ones that we
56 * connect to "when nothing is wrong" -- circuits through them can be used
57 * immediately.
58 *
59 * To build circuits, we take a primary guard if possible -- or a
60 * reachable filtered confirmed guard if no primary guard is possible --
61 * or the first (by sampled order) filtered guard otherwise. If the guard is
62 * primary, we can use the circuit immediately on success. Otherwise,
63 * the guard is now "pending" -- we won't use its circuit unless all
64 * of the circuits we're trying to build through better guards have
65 * definitely failed.
66 *
67 * While we're building circuits, we track a little "guard state" for
68 * each circuit. We use this to keep track of whether the circuit is
69 * one that we can use as soon as it's done, or whether it's one that
70 * we should keep around to see if we can do better. In the latter case,
71 * a periodic call to entry_guards_upgrade_waiting_circuits() will
72 * eventually upgrade it.
73 **/
74/* DOCDOC -- expand this.
75 *
76 * Information invariants:
77 *
78 * [x] whenever a guard becomes unreachable, clear its usable_filtered flag.
79 *
80 * [x] Whenever a guard becomes reachable or maybe-reachable, if its filtered
81 * flag is set, set its usable_filtered flag.
82 *
83 * [x] Whenever we get a new consensus, call update_from_consensus(). (LATER.)
84 *
85 * [x] Whenever the configuration changes in a relevant way, update the
86 * filtered/usable flags. (LATER.)
87 *
88 * [x] Whenever we add a guard to the sample, make sure its filtered/usable
89 * flags are set as possible.
90 *
91 * [x] Whenever we remove a guard from the sample, remove it from the primary
92 * and confirmed lists.
93 *
94 * [x] When we make a guard confirmed, update the primary list, and sort them
95 * by sampled order.
96 *
97 * [x] When we make a guard filtered or unfiltered, update the primary list.
98 *
99 * [x] When we are about to pick a guard, make sure that the primary list is
100 * full.
101 *
102 * [x] When we update the confirmed list, or when we re-build the primary list
103 * and detect a change, we sort those lists by sampled_idx
104 *
105 * [x] Before calling first_reachable_filtered_entry_guard(), make sure
106 * that the filtered, primary, and confirmed flags are up-to-date.
107 *
108 * [x] Call entry_guard_consider_retry every time we are about to check
109 * is_usable_filtered or is_reachable, and every time we set
110 * is_filtered to 1.
111 *
112 * [x] Call entry_guards_changed_for_guard_selection() whenever we update
113 * a persistent field.
114 */
115
116#define ENTRYNODES_PRIVATE
117
118#include "core/or/or.h"
119#include "app/config/config.h"
120#include "lib/confmgt/confmgt.h"
121#include "app/config/statefile.h"
124#include "core/or/channel.h"
125#include "core/or/circuitbuild.h"
126#include "core/or/circuitlist.h"
127#include "core/or/circuitstats.h"
128#include "core/or/circuituse.h"
129#include "core/or/conflux_pool.h"
130#include "core/or/policies.h"
132#include "feature/client/circpathbias.h"
145#include "feature/relay/router.h"
149#include "lib/math/fp.h"
150
155
156#include "core/or/conflux_util.h"
157
158/** A list of existing guard selection contexts. */
160/** The currently enabled guard selection context. */
161static guard_selection_t *curr_guard_context = NULL;
162
163/** A value of 1 means that at least one context has changed,
164 * and those changes need to be flushed to disk. */
165static int entry_guards_dirty = 0;
166
167static void entry_guard_set_filtered_flags(const or_options_t *options,
168 guard_selection_t *gs,
169 entry_guard_t *guard);
170static void pathbias_check_use_success_count(entry_guard_t *guard);
171static void pathbias_check_close_success_count(entry_guard_t *guard);
172static int node_is_possible_guard(const node_t *node);
173static int node_passes_guard_filter(const or_options_t *options,
174 const node_t *node);
175static entry_guard_t *entry_guard_add_to_sample_impl(guard_selection_t *gs,
176 const uint8_t *rsa_id_digest,
177 const char *nickname,
178 const tor_addr_port_t *bridge_addrport);
179static entry_guard_t *get_sampled_guard_by_bridge_addr(guard_selection_t *gs,
180 const tor_addr_port_t *addrport);
181static int entry_guard_obeys_restriction(const entry_guard_t *guard,
182 const entry_guard_restriction_t *rst);
183static int compare_guards_by_sampled_idx(const void **a_, const void **b_);
184
185/** Return 0 if we should apply guardfraction information found in the
186 * consensus. A specific consensus can be specified with the
187 * <b>ns</b> argument, if NULL the most recent one will be picked.*/
188int
190{
191 /* We need to check the corresponding torrc option and the consensus
192 * parameter if we need to. */
193 const or_options_t *options = get_options();
194
195 /* If UseGuardFraction is 'auto' then check the same-named consensus
196 * parameter. If the consensus parameter is not present, default to
197 * "off". */
198 if (options->UseGuardFraction == -1) {
199 return networkstatus_get_param(ns, "UseGuardFraction",
200 0, /* default to "off" */
201 0, 1);
202 }
203
204 return options->UseGuardFraction;
205}
206
207/** Return true iff we know a preferred descriptor for <b>guard</b> */
208static int
209guard_has_descriptor(const entry_guard_t *guard)
210{
211 const node_t *node = node_get_by_id(guard->identity);
212 if (!node)
213 return 0;
214 return node_has_preferred_descriptor(node, 1);
215}
216
217/**
218 * Try to determine the correct type for a selection named "name",
219 * if <b>type</b> is GS_TYPE_INFER.
220 */
221STATIC guard_selection_type_t
222guard_selection_infer_type(guard_selection_type_t type,
223 const char *name)
224{
225 if (type == GS_TYPE_INFER) {
226 if (!strcmp(name, "bridges"))
227 type = GS_TYPE_BRIDGE;
228 else if (!strcmp(name, "restricted"))
229 type = GS_TYPE_RESTRICTED;
230 else
231 type = GS_TYPE_NORMAL;
232 }
233 return type;
234}
235
236/**
237 * Allocate and return a new guard_selection_t, with the name <b>name</b>.
238 */
239STATIC guard_selection_t *
241 guard_selection_type_t type)
242{
243 guard_selection_t *gs;
244
245 type = guard_selection_infer_type(type, name);
246
247 gs = tor_malloc_zero(sizeof(*gs));
248 gs->name = tor_strdup(name);
249 gs->type = type;
250 gs->sampled_entry_guards = smartlist_new();
251 gs->confirmed_entry_guards = smartlist_new();
252 gs->primary_entry_guards = smartlist_new();
253
254 return gs;
255}
256
257/**
258 * Return the guard selection called <b>name</b>. If there is none, and
259 * <b>create_if_absent</b> is true, then create and return it. If there
260 * is none, and <b>create_if_absent</b> is false, then return NULL.
261 */
262STATIC guard_selection_t *
264 guard_selection_type_t type,
265 int create_if_absent)
266{
267 if (!guard_contexts) {
269 }
270 SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) {
271 if (!strcmp(gs->name, name))
272 return gs;
273 } SMARTLIST_FOREACH_END(gs);
274
275 if (! create_if_absent)
276 return NULL;
277
278 log_debug(LD_GUARD, "Creating a guard selection called %s", name);
279 guard_selection_t *new_selection = guard_selection_new(name, type);
280 smartlist_add(guard_contexts, new_selection);
281
282 return new_selection;
283}
284
285/**
286 * Allocate the first guard context that we're planning to use,
287 * and make it the current context.
288 */
289static void
291{
293 if (!guard_contexts) {
295 }
296 guard_selection_type_t type = GS_TYPE_INFER;
297 const char *name = choose_guard_selection(
298 get_options(),
300 approx_time(),
302 NULL,
303 &type);
304 tor_assert(name); // "name" can only be NULL if we had an old name.
305 tor_assert(type != GS_TYPE_INFER);
306 log_notice(LD_GUARD, "Starting with guard context \"%s\"", name);
308}
309
310/** Get current default guard_selection_t, creating it if necessary */
311guard_selection_t *
320
321/** Return a statically allocated human-readable description of <b>guard</b>
322 */
323const char *
324entry_guard_describe(const entry_guard_t *guard)
325{
326 static char buf[256];
327 tor_snprintf(buf, sizeof(buf),
328 "%s ($%s)",
329 strlen(guard->nickname) ? guard->nickname : "[bridge]",
330 hex_str(guard->identity, DIGEST_LEN));
331 return buf;
332}
333
334/** Return <b>guard</b>'s 20-byte RSA identity digest */
335const char *
336entry_guard_get_rsa_id_digest(const entry_guard_t *guard)
337{
338 return guard->identity;
339}
340
341/** Return the pathbias state associated with <b>guard</b>. */
344{
345 return &guard->pb;
346}
347
348HANDLE_IMPL(entry_guard, entry_guard_t, ATTR_UNUSED STATIC)
349
350/** Return an interval between 'now' and 'max_backdate' seconds in the past,
351 * chosen uniformly at random. We use this before recording persistent
352 * dates, so that we aren't leaking exactly when we recorded it.
353 */
354MOCK_IMPL(STATIC time_t,
355randomize_time,(time_t now, time_t max_backdate))
356{
357 tor_assert(max_backdate > 0);
358
359 time_t earliest = now - max_backdate;
360 time_t latest = now;
361 if (earliest <= 0)
362 earliest = 1;
363 if (latest <= earliest)
364 latest = earliest + 1;
365
366 return crypto_rand_time_range(earliest, latest);
367}
368
369/**
370 * @name parameters for networkstatus algorithm
371 *
372 * These parameters are taken from the consensus; some are overrideable in
373 * the torrc.
374 */
375/**@{*/
376/**
377 * We never let our sampled guard set grow larger than this fraction
378 * of the guards on the network.
379 */
380STATIC double
382{
383 int32_t pct =
384 networkstatus_get_param(NULL, "guard-max-sample-threshold-percent",
385 DFLT_MAX_SAMPLE_THRESHOLD_PERCENT,
386 1, 100);
387 return pct / 100.0;
388}
389/**
390 * We never let our sampled guard set grow larger than this number.
391 */
392STATIC int
394{
395 return (int) networkstatus_get_param(NULL, "guard-max-sample-size",
396 DFLT_MAX_SAMPLE_SIZE,
397 1, INT32_MAX);
398}
399/**
400 * We always try to make our sample contain at least this many guards.
401 */
402STATIC int
404{
405 return networkstatus_get_param(NULL, "guard-min-filtered-sample-size",
406 DFLT_MIN_FILTERED_SAMPLE_SIZE,
407 1, INT32_MAX);
408}
409/**
410 * If a guard is unlisted for this many days in a row, we remove it.
411 */
412STATIC int
414{
415 return networkstatus_get_param(NULL,
416 "guard-remove-unlisted-guards-after-days",
417 DFLT_REMOVE_UNLISTED_GUARDS_AFTER_DAYS,
418 1, 365*10);
419}
420
421/**
422 * Return number of seconds that will make a guard no longer eligible
423 * for selection if unlisted for this long.
424 */
425static time_t
430
431/**
432 * We remove unconfirmed guards from the sample after this many days,
433 * regardless of whether they are listed or unlisted.
434 */
435STATIC int
437{
438 if (get_options()->GuardLifetime >= 86400)
439 return get_options()->GuardLifetime;
440 int32_t days;
441 days = networkstatus_get_param(NULL,
442 "guard-lifetime-days",
443 DFLT_GUARD_LIFETIME_DAYS, 1, 365*10);
444 return days * 86400;
445}
446/**
447 * We remove confirmed guards from the sample if they were sampled
448 * GUARD_LIFETIME_DAYS ago and confirmed this many days ago.
449 */
450STATIC int
452{
453 if (get_options()->GuardLifetime >= 86400)
454 return get_options()->GuardLifetime;
455 int32_t days;
456 days = networkstatus_get_param(NULL, "guard-confirmed-min-lifetime-days",
457 DFLT_GUARD_CONFIRMED_MIN_LIFETIME_DAYS,
458 1, 365*10);
459 return days * 86400;
460}
461/**
462 * How many guards do we try to keep on our primary guard list?
463 */
464STATIC int
466{
467 /* If the user has explicitly configured the number of primary guards, do
468 * what the user wishes to do */
469 const int configured_primaries = get_options()->NumPrimaryGuards;
470 if (configured_primaries) {
471 return configured_primaries;
472 }
473
474 /* otherwise check for consensus parameter and if that's not set either, just
475 * use the default value. */
476 return networkstatus_get_param(NULL,
477 "guard-n-primary-guards",
478 DFLT_N_PRIMARY_GUARDS, 1, INT32_MAX);
479}
480/**
481 * Return the number of the live primary guards we should look at when
482 * making a circuit.
483 */
484STATIC int
486{
487 int configured;
488 const char *param_name;
489 int param_default;
490
491 /* If the user has explicitly configured the amount of guards, use
492 that. Otherwise, fall back to the default value. */
493 if (usage == GUARD_USAGE_DIRGUARD) {
494 configured = get_options()->NumDirectoryGuards;
495 param_name = "guard-n-primary-dir-guards-to-use";
496 param_default = DFLT_N_PRIMARY_DIR_GUARDS_TO_USE;
497 } else {
498 configured = get_options()->NumEntryGuards;
499 param_name = "guard-n-primary-guards-to-use";
500 param_default = DFLT_N_PRIMARY_GUARDS_TO_USE;
501 }
502 if (configured >= 1) {
503 return configured;
504 }
505 return networkstatus_get_param(NULL,
506 param_name, param_default, 1, INT32_MAX);
507}
508/**
509 * If we haven't successfully built or used a circuit in this long, then
510 * consider that the internet is probably down.
511 */
512STATIC int
514{
515 return networkstatus_get_param(NULL, "guard-internet-likely-down-interval",
516 DFLT_INTERNET_LIKELY_DOWN_INTERVAL,
517 1, INT32_MAX);
518}
519/**
520 * If we're trying to connect to a nonprimary guard for at least this
521 * many seconds, and we haven't gotten the connection to work, we will treat
522 * lower-priority guards as usable.
523 */
524STATIC int
526{
527 return networkstatus_get_param(NULL,
528 "guard-nonprimary-guard-connect-timeout",
529 DFLT_NONPRIMARY_GUARD_CONNECT_TIMEOUT,
530 1, INT32_MAX);
531}
532/**
533 * If a circuit has been sitting around in 'waiting for better guard' state
534 * for at least this long, we'll expire it.
535 */
536STATIC int
538{
539 return networkstatus_get_param(NULL,
540 "guard-nonprimary-guard-idle-timeout",
541 DFLT_NONPRIMARY_GUARD_IDLE_TIMEOUT,
542 1, INT32_MAX);
543}
544/**
545 * If our configuration retains fewer than this fraction of guards from the
546 * torrc, we are in a restricted setting.
547 */
548STATIC double
550{
551 int32_t pct = networkstatus_get_param(NULL,
552 "guard-meaningful-restriction-percent",
553 DFLT_MEANINGFUL_RESTRICTION_PERCENT,
554 1, INT32_MAX);
555 return pct / 100.0;
556}
557/**
558 * If our configuration retains fewer than this fraction of guards from the
559 * torrc, we are in an extremely restricted setting, and should warn.
560 */
561STATIC double
563{
564 int32_t pct = networkstatus_get_param(NULL,
565 "guard-extreme-restriction-percent",
566 DFLT_EXTREME_RESTRICTION_PERCENT,
567 1, 100);
568 return pct / 100.0;
569}
570
571/* Mark <b>guard</b> as maybe reachable again. */
572static void
573mark_guard_maybe_reachable(entry_guard_t *guard)
574{
575 if (guard->is_reachable != GUARD_REACHABLE_NO) {
576 return;
577 }
578
579 /* Note that we do not clear failing_since: this guard is now only
580 * _maybe-reachable_. */
581 guard->is_reachable = GUARD_REACHABLE_MAYBE;
582 if (guard->is_filtered_guard)
583 guard->is_usable_filtered_guard = 1;
584
585 /* Check if it is a bridge and we don't have its descriptor yet */
586 if (guard->bridge_addr && !guard_has_descriptor(guard)) {
587 /* Reset the descriptor fetch retry schedule, so it gives it another
588 * go soon. It's important to keep any "REACHABLE_MAYBE" bridges in
589 * sync with the descriptor fetch schedule, since we will refuse to
590 * use the network until our first primary bridges are either
591 * known-usable or known-unusable. See bug 40396. */
592 download_status_t *dl = get_bridge_dl_status_by_id(guard->identity);
593 if (dl)
595 }
596}
597
598/**
599 * Called when the network comes up after having seemed to be down for
600 * a while: Mark the primary guards as maybe-reachable so that we'll
601 * try them again.
602 */
603STATIC void
605{
606 tor_assert(gs);
607
608 if (!gs->primary_guards_up_to_date)
610
611 SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, guard) {
612 mark_guard_maybe_reachable(guard);
613 } SMARTLIST_FOREACH_END(guard);
614}
615
616/* Called when we exhaust all guards in our sampled set: Marks all guards as
617 maybe-reachable so that we'll try them again. */
618static void
619mark_all_guards_maybe_reachable(guard_selection_t *gs)
620{
621 tor_assert(gs);
622
623 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
624 mark_guard_maybe_reachable(guard);
625 } SMARTLIST_FOREACH_END(guard);
626}
627
628/**@}*/
629
630/**
631 * Given our options and our list of nodes, return the name of the
632 * guard selection that we should use. Return NULL for "use the
633 * same selection you were using before.
634 */
635STATIC const char *
637 const networkstatus_t *live_ns,
638 const guard_selection_t *old_selection,
639 guard_selection_type_t *type_out)
640{
641 tor_assert(options);
642 tor_assert(type_out);
643
644 if (options->UseBridges) {
645 *type_out = GS_TYPE_BRIDGE;
646 return "bridges";
647 }
648
649 if (! live_ns) {
650 /* without a networkstatus, we can't tell any more than that. */
651 *type_out = GS_TYPE_NORMAL;
652 return "default";
653 }
654
655 const smartlist_t *nodes = nodelist_get_list();
656 int n_guards = 0, n_passing_filter = 0;
657 SMARTLIST_FOREACH_BEGIN(nodes, const node_t *, node) {
658 if (node_is_possible_guard(node)) {
659 ++n_guards;
660 if (node_passes_guard_filter(options, node)) {
661 ++n_passing_filter;
662 }
663 }
664 } SMARTLIST_FOREACH_END(node);
665
666 /* We use separate 'high' and 'low' thresholds here to prevent flapping
667 * back and forth */
668 const int meaningful_threshold_high =
669 (int)(n_guards * get_meaningful_restriction_threshold() * 1.05);
670 const int meaningful_threshold_mid =
671 (int)(n_guards * get_meaningful_restriction_threshold());
672 const int meaningful_threshold_low =
673 (int)(n_guards * get_meaningful_restriction_threshold() * .95);
674 const int extreme_threshold =
675 (int)(n_guards * get_extreme_restriction_threshold());
676
677 /*
678 If we have no previous selection, then we're "restricted" iff we are
679 below the meaningful restriction threshold. That's easy enough.
680
681 But if we _do_ have a previous selection, we make it a little
682 "sticky": we only move from "restricted" to "default" when we find
683 that we're above the threshold plus 5%, and we only move from
684 "default" to "restricted" when we're below the threshold minus 5%.
685 That should prevent us from flapping back and forth if we happen to
686 be hovering very close to the default.
687
688 The extreme threshold is for warning only.
689 */
690
691 static int have_warned_extreme_threshold = 0;
692 if (n_guards &&
693 n_passing_filter < extreme_threshold &&
694 ! have_warned_extreme_threshold) {
695 have_warned_extreme_threshold = 1;
696 const double exclude_frac =
697 (n_guards - n_passing_filter) / (double)n_guards;
698 log_warn(LD_GUARD, "Your configuration excludes %d%% of all possible "
699 "guards. That's likely to make you stand out from the "
700 "rest of the world.", (int)(exclude_frac * 100));
701 }
702
703 /* Easy case: no previous selection. Just check if we are in restricted or
704 normal guard selection. */
705 if (old_selection == NULL) {
706 if (n_passing_filter >= meaningful_threshold_mid) {
707 *type_out = GS_TYPE_NORMAL;
708 return "default";
709 } else {
710 *type_out = GS_TYPE_RESTRICTED;
711 return "restricted";
712 }
713 }
714
715 /* Trickier case: we do have a previous guard selection context. */
716 tor_assert(old_selection);
717
718 /* Use high and low thresholds to decide guard selection, and if we fall in
719 the middle then keep the current guard selection context. */
720 if (n_passing_filter >= meaningful_threshold_high) {
721 *type_out = GS_TYPE_NORMAL;
722 return "default";
723 } else if (n_passing_filter < meaningful_threshold_low) {
724 *type_out = GS_TYPE_RESTRICTED;
725 return "restricted";
726 } else {
727 /* we are in the middle: maintain previous guard selection */
728 *type_out = old_selection->type;
729 return old_selection->name;
730 }
731}
732
733/**
734 * Check whether we should switch from our current guard selection to a
735 * different one. If so, switch and return 1. Return 0 otherwise.
736 *
737 * On a 1 return, the caller should mark all currently live circuits unusable
738 * for new streams, by calling circuit_mark_all_unused_circs() and
739 * circuit_mark_all_dirty_circs_as_unusable().
740 */
741int
743{
744 if (!curr_guard_context) {
746 return 1;
747 }
748
749 guard_selection_type_t type = GS_TYPE_INFER;
750 const char *new_name = choose_guard_selection(
751 options,
753 approx_time(),
756 &type);
757 tor_assert(new_name);
758 tor_assert(type != GS_TYPE_INFER);
759
760 const char *cur_name = curr_guard_context->name;
761 if (! strcmp(cur_name, new_name)) {
762 log_debug(LD_GUARD,
763 "Staying with guard context \"%s\" (no change)", new_name);
764 return 0; // No change
765 }
766
767 log_notice(LD_GUARD, "Switching to guard context \"%s\" (was using \"%s\")",
768 new_name, cur_name);
769 guard_selection_t *new_guard_context;
770 new_guard_context = get_guard_selection_by_name(new_name, type, 1);
771 tor_assert(new_guard_context);
772 tor_assert(new_guard_context != curr_guard_context);
773 curr_guard_context = new_guard_context;
774
775 return 1;
776}
777
778/**
779 * Return true iff <b>node</b> has all the flags needed for us to consider it
780 * a possible guard when sampling guards.
781 */
782static int
784{
785 /* The "GUARDS" set is all nodes in the nodelist for which this predicate
786 * holds. */
787
788 tor_assert(node);
789 return (node->is_possible_guard &&
790 node->is_stable &&
791 node->is_fast &&
792 node->is_valid &&
793 node_is_dir(node) &&
795}
796
797/**
798 * Return the sampled guard with the RSA identity digest <b>rsa_id</b>, or
799 * NULL if we don't have one. */
800STATIC entry_guard_t *
801get_sampled_guard_with_id(guard_selection_t *gs,
802 const uint8_t *rsa_id)
803{
804 tor_assert(gs);
805 tor_assert(rsa_id);
806 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
807 if (tor_memeq(guard->identity, rsa_id, DIGEST_LEN))
808 return guard;
809 } SMARTLIST_FOREACH_END(guard);
810 return NULL;
811}
812
813/** If <b>gs</b> contains a sampled entry guard matching <b>bridge</b>,
814 * return that guard. Otherwise return NULL. */
815static entry_guard_t *
816get_sampled_guard_for_bridge(guard_selection_t *gs,
817 const bridge_info_t *bridge)
818{
819 const uint8_t *id = bridge_get_rsa_id_digest(bridge);
820 const tor_addr_port_t *addrport = bridge_get_addr_port(bridge);
821 entry_guard_t *guard;
822 if (BUG(!addrport))
823 return NULL; // LCOV_EXCL_LINE
824 guard = get_sampled_guard_by_bridge_addr(gs, addrport);
825 if (! guard || (id && tor_memneq(id, guard->identity, DIGEST_LEN)))
826 return NULL;
827 else
828 return guard;
829}
830
831/** If we know a bridge_info_t matching <b>guard</b>, return that
832 * bridge. Otherwise return NULL. */
833static bridge_info_t *
834get_bridge_info_for_guard(const entry_guard_t *guard)
835{
836 const uint8_t *identity = NULL;
837 if (! tor_digest_is_zero(guard->identity)) {
838 identity = (const uint8_t *)guard->identity;
839 }
840 if (BUG(guard->bridge_addr == NULL))
841 return NULL;
842
844 &guard->bridge_addr->addr,
845 guard->bridge_addr->port,
846 (const char*)identity);
847}
848
849/**
850 * Return true iff we have a sampled guard with the RSA identity digest
851 * <b>rsa_id</b>. */
852static inline int
853have_sampled_guard_with_id(guard_selection_t *gs, const uint8_t *rsa_id)
854{
855 return get_sampled_guard_with_id(gs, rsa_id) != NULL;
856}
857
858/**
859 * Allocate a new entry_guard_t object for <b>node</b>, add it to the
860 * sampled entry guards in <b>gs</b>, and return it. <b>node</b> must
861 * not currently be a sampled guard in <b>gs</b>.
862 */
863STATIC entry_guard_t *
864entry_guard_add_to_sample(guard_selection_t *gs,
865 const node_t *node)
866{
867 log_info(LD_GUARD, "Adding %s to the entry guard sample set.",
868 node_describe(node));
869
870 /* make sure that the guard is not already sampled. */
871 if (BUG(have_sampled_guard_with_id(gs, (const uint8_t*)node->identity)))
872 return NULL; // LCOV_EXCL_LINE
873
875 (const uint8_t*)node->identity,
876 node_get_nickname(node),
877 NULL);
878}
879
880/**
881 * Backend: adds a new sampled guard to <b>gs</b>, with given identity,
882 * nickname, and ORPort. rsa_id_digest and bridge_addrport are optional, but
883 * we need one of them. nickname is optional. The caller is responsible for
884 * maintaining the size limit of the SAMPLED_GUARDS set.
885 */
886static entry_guard_t *
887entry_guard_add_to_sample_impl(guard_selection_t *gs,
888 const uint8_t *rsa_id_digest,
889 const char *nickname,
890 const tor_addr_port_t *bridge_addrport)
891{
892 const int GUARD_LIFETIME = get_guard_lifetime();
893 tor_assert(gs);
894
895 // XXXX #20827 take ed25519 identity here too.
896
897 /* Make sure we can actually identify the guard. */
898 if (BUG(!rsa_id_digest && !bridge_addrport))
899 return NULL; // LCOV_EXCL_LINE
900
901 entry_guard_t *guard = tor_malloc_zero(sizeof(entry_guard_t));
902
903 /* persistent fields */
904 guard->is_persistent = (rsa_id_digest != NULL);
905 guard->selection_name = tor_strdup(gs->name);
906 if (rsa_id_digest)
907 memcpy(guard->identity, rsa_id_digest, DIGEST_LEN);
908 if (nickname)
909 strlcpy(guard->nickname, nickname, sizeof(guard->nickname));
910 guard->sampled_on_date = randomize_time(approx_time(), GUARD_LIFETIME/10);
911 tor_free(guard->sampled_by_version);
912 guard->sampled_by_version = tor_strdup(VERSION);
913 guard->currently_listed = 1;
914 guard->sampled_idx = gs->next_sampled_idx++;
915 guard->confirmed_idx = -1;
916
917 /* non-persistent fields */
918 guard->is_reachable = GUARD_REACHABLE_MAYBE;
919 if (bridge_addrport)
920 guard->bridge_addr = tor_memdup(bridge_addrport, sizeof(*bridge_addrport));
921
922 smartlist_add(gs->sampled_entry_guards, guard);
923 guard->in_selection = gs;
926
927 /* Just added this guard to the sampled set and hence it might be used as a
928 * guard in the future: send GUARD NEW control event. */
929 control_event_guard(guard->nickname, guard->identity, "NEW");
930
931 return guard;
932}
933
934/**
935 * Add an entry guard to the "bridges" guard selection sample, with
936 * information taken from <b>bridge</b>. Return that entry guard.
937 */
938static entry_guard_t *
940 const bridge_info_t *bridge)
941{
942 const uint8_t *id_digest = bridge_get_rsa_id_digest(bridge);
943 const tor_addr_port_t *addrport = bridge_get_addr_port(bridge);
944
945 tor_assert(addrport);
946
947 /* make sure that the guard is not already sampled. */
948 if (BUG(get_sampled_guard_for_bridge(gs, bridge)))
949 return NULL; // LCOV_EXCL_LINE
950
951 return entry_guard_add_to_sample_impl(gs, id_digest, NULL, addrport);
952}
953
954/**
955 * Return the entry_guard_t in <b>gs</b> whose address is <b>addrport</b>,
956 * or NULL if none exists.
957*/
958static entry_guard_t *
960 const tor_addr_port_t *addrport)
961{
962 if (! gs)
963 return NULL;
964 if (BUG(!addrport))
965 return NULL;
966 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, g) {
967 if (g->bridge_addr && tor_addr_port_eq(addrport, g->bridge_addr))
968 return g;
969 } SMARTLIST_FOREACH_END(g);
970 return NULL;
971}
972
973/** Update the guard subsystem's knowledge of the identity of the bridge
974 * at <b>addrport</b>. Idempotent.
975 */
976void
978 const uint8_t *rsa_id_digest)
979{
980 guard_selection_t *gs = get_guard_selection_by_name("bridges",
981 GS_TYPE_BRIDGE,
982 0);
983 if (!gs)
984 return;
985
986 entry_guard_t *g = get_sampled_guard_by_bridge_addr(gs, addrport);
987 if (!g)
988 return;
989
990 int make_persistent = 0;
991
992 if (tor_digest_is_zero(g->identity)) {
993 memcpy(g->identity, rsa_id_digest, DIGEST_LEN);
994 make_persistent = 1;
995 } else if (tor_memeq(g->identity, rsa_id_digest, DIGEST_LEN)) {
996 /* Nothing to see here; we learned something we already knew. */
997 if (BUG(! g->is_persistent))
998 make_persistent = 1;
999 } else {
1000 char old_id[HEX_DIGEST_LEN+1];
1001 base16_encode(old_id, sizeof(old_id), g->identity, sizeof(g->identity));
1002 log_warn(LD_BUG, "We 'learned' an identity %s for a bridge at %s:%d, but "
1003 "we already knew a different one (%s). Ignoring the new info as "
1004 "possibly bogus.",
1005 hex_str((const char *)rsa_id_digest, DIGEST_LEN),
1006 fmt_and_decorate_addr(&addrport->addr), addrport->port,
1007 old_id);
1008 return; // redundant, but let's be clear: we're not making this persistent.
1009 }
1010
1011 if (make_persistent) {
1012 g->is_persistent = 1;
1014 }
1015}
1016
1017/**
1018 * Return the number of sampled guards in <b>gs</b> that are "filtered"
1019 * (that is, we're willing to connect to them) and that are "usable"
1020 * (that is, either "reachable" or "maybe reachable").
1021 *
1022 * If a restriction is provided in <b>rst</b>, do not count any guards that
1023 * violate it.
1024 */
1025STATIC int
1026num_reachable_filtered_guards(const guard_selection_t *gs,
1027 const entry_guard_restriction_t *rst)
1028{
1029 int n_reachable_filtered_guards = 0;
1030 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
1032 if (! entry_guard_obeys_restriction(guard, rst))
1033 continue;
1034 if (guard->is_usable_filtered_guard)
1035 ++n_reachable_filtered_guards;
1036 } SMARTLIST_FOREACH_END(guard);
1037 return n_reachable_filtered_guards;
1038}
1039
1040/** Return the actual maximum size for the sample in <b>gs</b>,
1041 * given that we know about <b>n_guards</b> total. */
1042static int
1043get_max_sample_size(guard_selection_t *gs,
1044 int n_guards)
1045{
1046 const int using_bridges = (gs->type == GS_TYPE_BRIDGE);
1047 const int min_sample = get_min_filtered_sample_size();
1048
1049 /* If we are in bridge mode, expand our sample set as needed without worrying
1050 * about max size. We should respect the user's wishes to use many bridges if
1051 * that's what they have specified in their configuration file. */
1052 if (using_bridges)
1053 return INT_MAX;
1054
1055 const int max_sample_by_pct = (int)(n_guards * get_max_sample_threshold());
1056 const int max_sample_absolute = get_max_sample_size_absolute();
1057 const int max_sample = MIN(max_sample_by_pct, max_sample_absolute);
1058 if (max_sample < min_sample)
1059 return min_sample;
1060 else
1061 return max_sample;
1062}
1063
1064/**
1065 * Return a smartlist of all the guards that are not currently
1066 * members of the sample (GUARDS - SAMPLED_GUARDS). The elements of
1067 * this list are node_t pointers in the non-bridge case, and
1068 * bridge_info_t pointers in the bridge case. Set *<b>n_guards_out</b>
1069 * to the number of guards that we found in GUARDS, including those
1070 * that were already sampled.
1071 */
1072static smartlist_t *
1074 guard_selection_t *gs,
1075 int *n_guards_out)
1076{
1077 /* Construct eligible_guards as GUARDS - SAMPLED_GUARDS */
1078 smartlist_t *eligible_guards = smartlist_new();
1079 int n_guards = 0; // total size of "GUARDS"
1080
1081 if (gs->type == GS_TYPE_BRIDGE) {
1082 const smartlist_t *bridges = bridge_list_get();
1083 SMARTLIST_FOREACH_BEGIN(bridges, bridge_info_t *, bridge) {
1084 ++n_guards;
1085 if (NULL != get_sampled_guard_for_bridge(gs, bridge)) {
1086 continue;
1087 }
1088 smartlist_add(eligible_guards, bridge);
1089 } SMARTLIST_FOREACH_END(bridge);
1090 } else {
1091 const smartlist_t *nodes = nodelist_get_list();
1092 const int n_sampled = smartlist_len(gs->sampled_entry_guards);
1093
1094 /* Build a bloom filter of our current guards: let's keep this O(N). */
1095 digestset_t *sampled_guard_ids = digestset_new(n_sampled);
1096 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, const entry_guard_t *,
1097 guard) {
1098 digestset_add(sampled_guard_ids, guard->identity);
1099 } SMARTLIST_FOREACH_END(guard);
1100
1101 SMARTLIST_FOREACH_BEGIN(nodes, const node_t *, node) {
1102 if (! node_is_possible_guard(node))
1103 continue;
1104 if (gs->type == GS_TYPE_RESTRICTED) {
1105 /* In restricted mode, we apply the filter BEFORE sampling, so
1106 * that we are sampling from the nodes that we might actually
1107 * select. If we sampled first, we might wind up with a sample
1108 * that didn't include any EntryNodes at all. */
1109 if (! node_passes_guard_filter(options, node))
1110 continue;
1111 }
1112 ++n_guards;
1113 if (digestset_probably_contains(sampled_guard_ids, node->identity))
1114 continue;
1115 smartlist_add(eligible_guards, (node_t*)node);
1116 } SMARTLIST_FOREACH_END(node);
1117
1118 /* Now we can free that bloom filter. */
1119 digestset_free(sampled_guard_ids);
1120 }
1121
1122 *n_guards_out = n_guards;
1123 return eligible_guards;
1124}
1125
1126/** Helper: given a smartlist of either bridge_info_t (if gs->type is
1127 * GS_TYPE_BRIDGE) or node_t (otherwise), pick one that can be a guard,
1128 * add it as a guard, remove it from the list, and return a new
1129 * entry_guard_t. Return NULL on failure. */
1130static entry_guard_t *
1132 smartlist_t *eligible_guards)
1133{
1134 entry_guard_t *added_guard;
1135 if (gs->type == GS_TYPE_BRIDGE) {
1136 const bridge_info_t *bridge = smartlist_choose(eligible_guards);
1137 if (BUG(!bridge))
1138 return NULL; // LCOV_EXCL_LINE
1139 smartlist_remove(eligible_guards, bridge);
1140 added_guard = entry_guard_add_bridge_to_sample(gs, bridge);
1141 } else {
1142 const node_t *node =
1143 node_sl_choose_by_bandwidth(eligible_guards, WEIGHT_FOR_GUARD);
1144 if (BUG(!node))
1145 return NULL; // LCOV_EXCL_LINE
1146 smartlist_remove(eligible_guards, node);
1147 added_guard = entry_guard_add_to_sample(gs, node);
1148 }
1149
1150 return added_guard;
1151}
1152
1153/**
1154 * Return true iff we need a consensus to update our guards, but we don't
1155 * have one. (We can return 0 here either if the consensus is _not_ missing,
1156 * or if we don't need a consensus because we're using bridges.)
1157 */
1158static int
1159reasonably_live_consensus_is_missing(const guard_selection_t *gs)
1160{
1161 tor_assert(gs);
1162 if (gs->type == GS_TYPE_BRIDGE) {
1163 /* We don't update bridges from the consensus; they aren't there. */
1164 return 0;
1165 }
1167 approx_time(),
1168 usable_consensus_flavor()) == NULL;
1169}
1170
1171/**
1172 * Add new guards to the sampled guards in <b>gs</b> until there are
1173 * enough usable filtered guards, but never grow the sample beyond its
1174 * maximum size. Return the last guard added, or NULL if none were
1175 * added.
1176 */
1177STATIC entry_guard_t *
1178entry_guards_expand_sample(guard_selection_t *gs)
1179{
1180 tor_assert(gs);
1181 const or_options_t *options = get_options();
1182
1184 log_info(LD_GUARD, "Not expanding the sample guard set; we have "
1185 "no reasonably live consensus.");
1186 return NULL;
1187 }
1188
1189 int n_sampled = smartlist_len(gs->sampled_entry_guards);
1190 entry_guard_t *added_guard = NULL;
1191 int n_usable_filtered_guards = num_reachable_filtered_guards(gs, NULL);
1192 int n_guards = 0;
1193 smartlist_t *eligible_guards = get_eligible_guards(options, gs, &n_guards);
1194
1195 const int max_sample = get_max_sample_size(gs, n_guards);
1196 const int min_filtered_sample = get_min_filtered_sample_size();
1197
1198 log_info(LD_GUARD, "Expanding the sample guard set. We have %d guards "
1199 "in the sample, and %d eligible guards to extend it with.",
1200 n_sampled, smartlist_len(eligible_guards));
1201
1202 while (n_usable_filtered_guards < min_filtered_sample) {
1203 /* Has our sample grown too large to expand? */
1204 if (n_sampled >= max_sample) {
1205 log_info(LD_GUARD, "Not expanding the guard sample any further; "
1206 "just hit the maximum sample threshold of %d",
1207 max_sample);
1208 goto done;
1209 }
1210
1211 /* Did we run out of guards? */
1212 if (smartlist_len(eligible_guards) == 0) {
1213 /* LCOV_EXCL_START
1214 As long as MAX_SAMPLE_THRESHOLD makes can't be adjusted to
1215 allow all guards to be sampled, this can't be reached.
1216 */
1217 log_info(LD_GUARD, "Not expanding the guard sample any further; "
1218 "just ran out of eligible guards");
1219 goto done;
1220 /* LCOV_EXCL_STOP */
1221 }
1222
1223 /* Otherwise we can add at least one new guard. */
1224 added_guard = select_and_add_guard_item_for_sample(gs, eligible_guards);
1225 if (!added_guard)
1226 goto done; // LCOV_EXCL_LINE -- only fails on BUG.
1227
1228 ++n_sampled;
1229
1230 if (added_guard->is_usable_filtered_guard)
1231 ++n_usable_filtered_guards;
1232 }
1233
1234 done:
1235 smartlist_free(eligible_guards);
1236 return added_guard;
1237}
1238
1239/**
1240 * Helper: <b>guard</b> has just been removed from the sampled guards:
1241 * also remove it from primary and confirmed. */
1242static void
1244 entry_guard_t *guard)
1245{
1246 if (guard->is_primary) {
1247 guard->is_primary = 0;
1248 smartlist_remove_keeporder(gs->primary_entry_guards, guard);
1249 } else {
1250 if (BUG(smartlist_contains(gs->primary_entry_guards, guard))) {
1251 smartlist_remove_keeporder(gs->primary_entry_guards, guard);
1252 }
1253 }
1254
1255 if (guard->confirmed_idx >= 0) {
1256 smartlist_remove_keeporder(gs->confirmed_entry_guards, guard);
1257 guard->confirmed_idx = -1;
1258 guard->confirmed_on_date = 0;
1259 } else {
1260 if (BUG(smartlist_contains(gs->confirmed_entry_guards, guard))) {
1261 // LCOV_EXCL_START
1262 smartlist_remove_keeporder(gs->confirmed_entry_guards, guard);
1263 // LCOV_EXCL_STOP
1264 }
1265 }
1266}
1267
1268/** Return true iff <b>guard</b> is currently "listed" -- that is, it
1269 * appears in the consensus, or as a configured bridge (as
1270 * appropriate) */
1271MOCK_IMPL(STATIC int,
1272entry_guard_is_listed,(guard_selection_t *gs, const entry_guard_t *guard))
1273{
1274 if (gs->type == GS_TYPE_BRIDGE) {
1275 return NULL != get_bridge_info_for_guard(guard);
1276 } else {
1277 const node_t *node = node_get_by_id(guard->identity);
1278
1279 return node && node_is_possible_guard(node);
1280 }
1281}
1282
1283/**
1284 * Enumerate <b>sampled_entry_guards</b> smartlist in <b>gs</b>.
1285 * For each <b>entry_guard_t</b> object in smartlist, do the following:
1286 * * Update <b>currently_listed</b> field to reflect if guard is listed
1287 * in guard selection <b>gs</b>.
1288 * * Set <b>unlisted_since_date</b> to approximate UNIX time of
1289 * unlisting if guard is unlisted (randomize within 20% of
1290 * get_remove_unlisted_guards_after_seconds()). Otherwise,
1291 * set it to 0.
1292 *
1293 * Require <b>gs</b> to be non-null pointer.
1294 * Return a number of entries updated.
1295 */
1296static size_t
1298{
1299 size_t n_changes = 0;
1300
1301 tor_assert(gs);
1302
1303 const time_t unlisted_since_slop =
1305
1306 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
1307 /* XXXX #20827 check ed ID too */
1308 const int is_listed = entry_guard_is_listed(gs, guard);
1309
1310 if (is_listed && ! guard->currently_listed) {
1311 ++n_changes;
1312 guard->currently_listed = 1;
1313 guard->unlisted_since_date = 0;
1314 log_info(LD_GUARD, "Sampled guard %s is now listed again.",
1315 entry_guard_describe(guard));
1316 } else if (!is_listed && guard->currently_listed) {
1317 ++n_changes;
1318 guard->currently_listed = 0;
1319 guard->unlisted_since_date = randomize_time(approx_time(),
1320 unlisted_since_slop);
1321 log_info(LD_GUARD, "Sampled guard %s is now unlisted.",
1322 entry_guard_describe(guard));
1323 } else if (is_listed && guard->currently_listed) {
1324 log_debug(LD_GUARD, "Sampled guard %s is still listed.",
1325 entry_guard_describe(guard));
1326 } else {
1327 tor_assert(! is_listed && ! guard->currently_listed);
1328 log_debug(LD_GUARD, "Sampled guard %s is still unlisted.",
1329 entry_guard_describe(guard));
1330 }
1331
1332 /* Clean up unlisted_since_date, just in case. */
1333 if (guard->currently_listed && guard->unlisted_since_date) {
1334 ++n_changes;
1335 guard->unlisted_since_date = 0;
1336 log_warn(LD_BUG, "Sampled guard %s was listed, but with "
1337 "unlisted_since_date set. Fixing.",
1338 entry_guard_describe(guard));
1339 } else if (!guard->currently_listed && ! guard->unlisted_since_date) {
1340 ++n_changes;
1341 guard->unlisted_since_date = randomize_time(approx_time(),
1342 unlisted_since_slop);
1343 log_warn(LD_BUG, "Sampled guard %s was unlisted, but with "
1344 "unlisted_since_date unset. Fixing.",
1345 entry_guard_describe(guard));
1346 }
1347 } SMARTLIST_FOREACH_END(guard);
1348
1349 return n_changes;
1350}
1351
1352/**
1353 * Walk through the <b>sampled_entry_guards</b> smartlist in <b>gs</b>.
1354 *
1355 * For each <b>entry_guard_t</b> object in the smartlist:
1356 *
1357 * * If <b>currently_listed</b> is false and <b>unlisted_since_date</b>
1358 * is earlier than <b>remove_if_unlisted_since</b> - remove it.
1359 * * Otherwise, if it is confirmed and it was confirmed before
1360 * <b>remove_if_confirmed_before</b> - remove it.
1361 * * Otherwise, if it is not confirmed and it was sampled before
1362 * <b>maybe_remove_if_sampled_before</b> - remove it.
1363 *
1364 * Require <b>gs</b> to be non-null pointer.
1365 * Return number of entries deleted.
1366 */
1367static size_t
1369 const time_t remove_if_unlisted_since,
1370 const time_t maybe_remove_if_sampled_before,
1371 const time_t remove_if_confirmed_before)
1372{
1373 size_t n_changes = 0;
1374
1375 tor_assert(gs);
1376
1377 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
1378 int rmv = 0;
1379
1380 if (guard->currently_listed == 0 &&
1381 guard->unlisted_since_date < remove_if_unlisted_since) {
1382 /*
1383 "We have a live consensus, and {IS_LISTED} is false, and
1384 {FIRST_UNLISTED_AT} is over get_remove_unlisted_guards_after_days()
1385 days in the past."
1386 */
1387 rmv = 1;
1388 log_info(LD_GUARD, "Removing sampled guard %s: it has been unlisted "
1389 "for over %d days", entry_guard_describe(guard),
1391 } else if (guard->confirmed_on_date == 0) {
1392 if (guard->sampled_on_date < maybe_remove_if_sampled_before) {
1393 /* We have a live consensus, and this guard isn't confirmed, and
1394 * {ADDED_ON_DATE} is over {GUARD_LIFETIME} ago. */
1395 rmv = 1;
1396 log_info(LD_GUARD, "Removing sampled guard %s: it was sampled "
1397 "over %d days ago, but never confirmed.",
1398 entry_guard_describe(guard),
1399 get_guard_lifetime() / 86400);
1400 }
1401 } else { /* guard is confirmed */
1402 if (guard->confirmed_on_date < remove_if_confirmed_before) {
1403 /* We have a live consensus, and {CONFIRMED_ON_DATE} is not
1404 * "never", and {CONFIRMED_ON_DATE} is over
1405 * {GUARD_CONFIRMED_MIN_LIFETIME} ago. */
1406 rmv = 1;
1407 log_info(LD_GUARD, "Removing sampled guard %s: it was sampled "
1408 "over %d days ago, and confirmed over %d days ago.",
1409 entry_guard_describe(guard),
1410 get_guard_lifetime() / 86400,
1412 }
1413 }
1414
1415 if (rmv) {
1416 ++n_changes;
1417 SMARTLIST_DEL_CURRENT_KEEPORDER(gs->sampled_entry_guards, guard);
1419 entry_guard_free(guard);
1420 }
1421 } SMARTLIST_FOREACH_END(guard);
1422
1423 return n_changes;
1424}
1425
1426/**
1427 * Update the status of all sampled guards based on the arrival of a
1428 * new consensus networkstatus document. This will include marking
1429 * some guards as listed or unlisted, and removing expired guards. */
1430STATIC void
1432{
1433 tor_assert(gs);
1434
1435 // It's important to use a reasonably live consensus here; we want clients
1436 // to bootstrap even if their clock is skewed by more than 2-3 hours.
1437 // But we don't want to make changes based on anything that's really old.
1439 log_info(LD_GUARD, "Not updating the sample guard set; we have "
1440 "no reasonably live consensus.");
1441 return;
1442 }
1443 log_info(LD_GUARD, "Updating sampled guard status based on received "
1444 "consensus.");
1445
1446 /* First: Update listed/unlisted. */
1447 size_t n_changes = sampled_guards_update_consensus_presence(gs);
1448
1449 const time_t remove_if_unlisted_since =
1451 const time_t maybe_remove_if_sampled_before =
1453 const time_t remove_if_confirmed_before =
1455
1456 /* Then: remove the ones that have been junk for too long */
1457 n_changes +=
1459 remove_if_unlisted_since,
1460 maybe_remove_if_sampled_before,
1461 remove_if_confirmed_before);
1462
1463 if (n_changes) {
1464 gs->primary_guards_up_to_date = 0;
1466 /* We don't need to rebuild the confirmed list right here -- we may have
1467 * removed confirmed guards above, but we can't have added any new
1468 * confirmed guards.
1469 */
1471 }
1472}
1473
1474/**
1475 * Return true iff <b>node</b> is a Tor relay that we are configured to
1476 * be able to connect to. */
1477static int
1479 const node_t *node)
1480{
1481 /* NOTE: Make sure that this function stays in sync with
1482 * options_transition_affects_entry_guards */
1483 if (routerset_contains_node(options->ExcludeNodes, node))
1484 return 0;
1485
1486 if (options->EntryNodes &&
1487 !routerset_contains_node(options->EntryNodes, node))
1488 return 0;
1489
1490 if (!reachable_addr_allows_node(node, FIREWALL_OR_CONNECTION, 0))
1491 return 0;
1492
1494 return 0;
1495
1496 return 1;
1497}
1498
1499/** Helper: Return true iff <b>bridge</b> passes our configuration
1500 * filter-- if it is a relay that we are configured to be able to
1501 * connect to. */
1502static int
1504 const bridge_info_t *bridge)
1505{
1506 tor_assert(bridge);
1507 if (!bridge)
1508 return 0;
1509
1510 if (routerset_contains_bridge(options->ExcludeNodes, bridge))
1511 return 0;
1512
1513 /* Ignore entrynodes */
1514 const tor_addr_port_t *addrport = bridge_get_addr_port(bridge);
1515
1516 if (!reachable_addr_allows_addr(&addrport->addr,
1517 addrport->port,
1518 FIREWALL_OR_CONNECTION,
1519 0, 0))
1520 return 0;
1521
1522 return 1;
1523}
1524
1525/**
1526 * Return true iff <b>guard</b> is a Tor relay that we are configured to
1527 * be able to connect to, and we haven't disabled it for omission from
1528 * the consensus or path bias issues. */
1529static int
1530entry_guard_passes_filter(const or_options_t *options, guard_selection_t *gs,
1531 entry_guard_t *guard)
1532{
1533 if (guard->currently_listed == 0)
1534 return 0;
1535 if (guard->pb.path_bias_disabled)
1536 return 0;
1537
1538 if (gs->type == GS_TYPE_BRIDGE) {
1539 const bridge_info_t *bridge = get_bridge_info_for_guard(guard);
1540 if (bridge == NULL)
1541 return 0;
1542 return bridge_passes_guard_filter(options, bridge);
1543 } else {
1544 const node_t *node = node_get_by_id(guard->identity);
1545 if (node == NULL) {
1546 // This can happen when currently_listed is true, and we're not updating
1547 // it because we don't have a live consensus.
1548 return 0;
1549 }
1550
1551 return node_passes_guard_filter(options, node);
1552 }
1553}
1554
1555/** Return true iff <b>guard</b> is in the same family as <b>node</b>.
1556 */
1557static int
1558guard_in_node_family(const entry_guard_t *guard, const node_t *node)
1559{
1560 const node_t *guard_node = node_get_by_id(guard->identity);
1561 if (guard_node) {
1562 return nodes_in_same_family(guard_node, node);
1563 } else {
1564 /* If we don't have a node_t for the guard node, we might have
1565 * a bridge_info_t for it. So let's check to see whether the bridge
1566 * address matches has any family issues.
1567 *
1568 * (Strictly speaking, I believe this check is unnecessary, since we only
1569 * use it to avoid the exit's family when building circuits, and we don't
1570 * build multihop circuits until we have a routerinfo_t for the
1571 * bridge... at which point, we'll also have a node_t for the
1572 * bridge. Nonetheless, it seems wise to include it, in case our
1573 * assumptions change down the road. -nickm.)
1574 */
1575 if (get_options()->EnforceDistinctSubnets && guard->bridge_addr) {
1576 tor_addr_t node_addr;
1577 node_get_addr(node, &node_addr);
1578 if (router_addrs_in_same_network(&node_addr,
1579 &guard->bridge_addr->addr)) {
1580 return 1;
1581 }
1582 }
1583 return 0;
1584 }
1585}
1586
1587/* Allocate and return a new exit guard restriction (where <b>exit_id</b> is of
1588 * size DIGEST_LEN) */
1589STATIC entry_guard_restriction_t *
1590guard_create_exit_restriction(const uint8_t *exit_id)
1591{
1592 entry_guard_restriction_t *rst = NULL;
1593 rst = tor_malloc_zero(sizeof(entry_guard_restriction_t));
1594 rst->type = RST_EXIT_NODE;
1595 memcpy(rst->exclude_id, exit_id, DIGEST_LEN);
1596 return rst;
1597}
1598
1599/* Allocate and return a new exit guard restriction that excludes all current
1600 * and pending conflux guards */
1601STATIC entry_guard_restriction_t *
1602guard_create_conflux_restriction(const origin_circuit_t *circ,
1603 const uint8_t *exit_id)
1604{
1605 entry_guard_restriction_t *rst = NULL;
1606 rst = tor_malloc_zero(sizeof(entry_guard_restriction_t));
1607 rst->type = RST_EXCL_LIST;
1608 rst->excluded = smartlist_new();
1609 conflux_add_guards_to_exclude_list(circ, rst->excluded);
1610 memcpy(rst->exclude_id, exit_id, DIGEST_LEN);
1611 return rst;
1612}
1613
1614/** If we have fewer than this many possible usable guards, don't set
1615 * MD-availability-based restrictions: we might denylist all of them. */
1616#define MIN_GUARDS_FOR_MD_RESTRICTION 10
1617
1618/** Return true if we should set md dirserver restrictions. We might not want
1619 * to set those if our guard options are too restricted, since we don't want
1620 * to denylist all of them. */
1621static int
1623{
1624 const guard_selection_t *gs = get_guard_selection_info();
1625 int num_usable_guards = num_reachable_filtered_guards(gs, NULL);
1626
1627 /* Don't set restriction if too few reachable filtered guards. */
1628 if (num_usable_guards < MIN_GUARDS_FOR_MD_RESTRICTION) {
1629 log_info(LD_GUARD, "Not setting md restriction: only %d"
1630 " usable guards.", num_usable_guards);
1631 return 0;
1632 }
1633
1634 /* We have enough usable guards: set MD restriction */
1635 return 1;
1636}
1637
1638/** Allocate and return an outdated md guard restriction. Return NULL if no
1639 * such restriction is needed. */
1640STATIC entry_guard_restriction_t *
1642{
1643 entry_guard_restriction_t *rst = NULL;
1644
1646 log_debug(LD_GUARD, "Not setting md restriction: too few "
1647 "filtered guards.");
1648 return NULL;
1649 }
1650
1651 rst = tor_malloc_zero(sizeof(entry_guard_restriction_t));
1652 rst->type = RST_OUTDATED_MD_DIRSERVER;
1653
1654 return rst;
1655}
1656
1657/* Return True if <b>guard</b> obeys the exit restriction <b>rst</b>. */
1658static int
1659guard_obeys_exit_restriction(const entry_guard_t *guard,
1660 const entry_guard_restriction_t *rst)
1661{
1662 tor_assert(rst->type == RST_EXIT_NODE ||
1663 rst->type == RST_EXCL_LIST);
1664
1665 // Exclude the exit ID and all of its family.
1666 const node_t *node = node_get_by_id((const char*)rst->exclude_id);
1667 if (node && guard_in_node_family(guard, node))
1668 return 0;
1669
1670 return tor_memneq(guard->identity, rst->exclude_id, DIGEST_LEN);
1671}
1672
1673/** Return True if <b>guard</b> should be used as a dirserver for fetching
1674 * microdescriptors. */
1675static int
1676guard_obeys_md_dirserver_restriction(const entry_guard_t *guard)
1677{
1678 /* If this guard is an outdated dirserver, don't use it. */
1679 if (microdesc_relay_is_outdated_dirserver(guard->identity)) {
1680 log_info(LD_GENERAL, "Skipping %s dirserver: outdated",
1681 hex_str(guard->identity, DIGEST_LEN));
1682 return 0;
1683 }
1684
1685 log_debug(LD_GENERAL, "%s dirserver obeys md restrictions",
1686 hex_str(guard->identity, DIGEST_LEN));
1687
1688 return 1;
1689}
1690
1691/**
1692 * Return true if a restriction is reachability related, such that it should
1693 * cause us to consider additional primary guards when selecting one.
1694 */
1695static bool
1696entry_guard_restriction_is_reachability(const entry_guard_restriction_t *rst)
1697{
1698 tor_assert(rst);
1699 return (rst->type == RST_OUTDATED_MD_DIRSERVER);
1700}
1701
1702/**
1703 * Return true iff <b>guard</b> obeys the restrictions defined in <b>rst</b>.
1704 * (If <b>rst</b> is NULL, there are no restrictions.)
1705 */
1706static int
1707entry_guard_obeys_restriction(const entry_guard_t *guard,
1708 const entry_guard_restriction_t *rst)
1709{
1710 tor_assert(guard);
1711 if (! rst)
1712 return 1; // No restriction? No problem.
1713
1714 if (rst->type == RST_EXIT_NODE) {
1715 return guard_obeys_exit_restriction(guard, rst);
1716 } else if (rst->type == RST_OUTDATED_MD_DIRSERVER) {
1718 } else if (rst->type == RST_EXCL_LIST) {
1719 return guard_obeys_exit_restriction(guard, rst) &&
1720 !smartlist_contains_digest(rst->excluded, guard->identity);
1721 }
1722
1724 return 0;
1725}
1726
1727/**
1728 * Update the <b>is_filtered_guard</b> and <b>is_usable_filtered_guard</b>
1729 * flags on <b>guard</b>. */
1730void
1732 guard_selection_t *gs,
1733 entry_guard_t *guard)
1734{
1735 unsigned was_filtered = guard->is_filtered_guard;
1736 guard->is_filtered_guard = 0;
1737 guard->is_usable_filtered_guard = 0;
1738
1739 if (entry_guard_passes_filter(options, gs, guard)) {
1740 guard->is_filtered_guard = 1;
1741
1742 if (guard->is_reachable != GUARD_REACHABLE_NO)
1743 guard->is_usable_filtered_guard = 1;
1744
1746 }
1747 log_debug(LD_GUARD, "Updated sampled guard %s: filtered=%d; "
1748 "reachable_filtered=%d.", entry_guard_describe(guard),
1749 guard->is_filtered_guard, guard->is_usable_filtered_guard);
1750
1751 if (!bool_eq(was_filtered, guard->is_filtered_guard)) {
1752 /* This guard might now be primary or nonprimary. */
1753 gs->primary_guards_up_to_date = 0;
1754 }
1755}
1756
1757/**
1758 * Update the <b>is_filtered_guard</b> and <b>is_usable_filtered_guard</b>
1759 * flag on every guard in <b>gs</b>. */
1760STATIC void
1762{
1763 const or_options_t *options = get_options();
1764
1765 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
1766 entry_guard_set_filtered_flags(options, gs, guard);
1767 } SMARTLIST_FOREACH_END(guard);
1768}
1769
1770/**
1771 * Return the first sampled guard from the reachable filtered sample guards
1772 * in <b>gs</b>, subject to the exclusion rules listed in <b>flags</b>.
1773 * Return NULL if no such guard can be found.
1774 *
1775 * Make sure that the sample is big enough, and that all the filter flags
1776 * are set correctly, before calling this function.
1777 *
1778 * If a restriction is provided in <b>rst</b>, do not return any guards that
1779 * violate it.
1780 **/
1781STATIC entry_guard_t *
1783 const entry_guard_restriction_t *rst,
1784 unsigned flags)
1785{
1786 tor_assert(gs);
1787 entry_guard_t *result = NULL;
1788 const unsigned exclude_confirmed = flags & SAMPLE_EXCLUDE_CONFIRMED;
1789 const unsigned exclude_primary = flags & SAMPLE_EXCLUDE_PRIMARY;
1790 const unsigned exclude_pending = flags & SAMPLE_EXCLUDE_PENDING;
1791 const unsigned no_update_primary = flags & SAMPLE_NO_UPDATE_PRIMARY;
1792 const unsigned need_descriptor = flags & SAMPLE_EXCLUDE_NO_DESCRIPTOR;
1793
1794 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
1796 } SMARTLIST_FOREACH_END(guard);
1797
1798 const int n_reachable_filtered = num_reachable_filtered_guards(gs, rst);
1799
1800 log_info(LD_GUARD, "Trying to sample a reachable guard: We know of %d "
1801 "in the USABLE_FILTERED set.", n_reachable_filtered);
1802
1803 const int min_filtered_sample = get_min_filtered_sample_size();
1804 if (n_reachable_filtered < min_filtered_sample) {
1805 log_info(LD_GUARD, " (That isn't enough. Trying to expand the sample.)");
1807 }
1808
1809 if (exclude_primary && !gs->primary_guards_up_to_date && !no_update_primary)
1811
1812 /* Build the set of reachable filtered guards. */
1813 smartlist_t *reachable_filtered_sample = smartlist_new();
1814 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
1815 entry_guard_consider_retry(guard);// redundant, but cheap.
1816 if (! entry_guard_obeys_restriction(guard, rst))
1817 continue;
1818 if (! guard->is_usable_filtered_guard)
1819 continue;
1820 if (exclude_confirmed && guard->confirmed_idx >= 0)
1821 continue;
1822 if (exclude_primary && guard->is_primary)
1823 continue;
1824 if (exclude_pending && guard->is_pending)
1825 continue;
1826 if (need_descriptor && !guard_has_descriptor(guard))
1827 continue;
1828 smartlist_add(reachable_filtered_sample, guard);
1829 } SMARTLIST_FOREACH_END(guard);
1830
1831 log_info(LD_GUARD, " (After filters [%x], we have %d guards to consider.)",
1832 flags, smartlist_len(reachable_filtered_sample));
1833
1834 if (smartlist_len(reachable_filtered_sample)) {
1835 /**
1836 * Get the first guard of the filtered set builds from
1837 * sampled_entry_guards. Proposal 310 suggests this design to overcome
1838 * performance and security issues linked to the previous selection
1839 * method. The guard selected here should be filtered out if this function
1840 * is called again in the same context. I.e., if we filter guards to add
1841 * them into some list X, then the guards from list X will be filtered out
1842 * when this function is called again. Hence it requires setting exclude
1843 * flags in a appropriate way (depending of the context of the caller).
1844 */
1845 result = smartlist_get(reachable_filtered_sample, 0);
1846 log_info(LD_GUARD, " (Selected %s.)",
1847 result ? entry_guard_describe(result) : "<null>");
1848 }
1849 smartlist_free(reachable_filtered_sample);
1850
1851 return result;
1852}
1853
1854static int
1855compare_guards_by_confirmed_idx(const void **a_, const void **b_)
1856{
1857 const entry_guard_t *a = *a_, *b = *b_;
1858 if (a->confirmed_idx < b->confirmed_idx)
1859 return -1;
1860 else if (a->confirmed_idx > b->confirmed_idx)
1861 return 1;
1862 else
1863 return 0;
1864}
1865/**
1866 * Helper: compare two entry_guard_t by their sampled_idx values.
1867 * Used to sort the sampled list
1868 */
1869static int
1870compare_guards_by_sampled_idx(const void **a_, const void **b_)
1871{
1872 const entry_guard_t *a = *a_, *b = *b_;
1873 if (a->sampled_idx < b->sampled_idx)
1874 return -1;
1875 else if (a->sampled_idx > b->sampled_idx)
1876 return 1;
1877 else
1878 return 0;
1879}
1880
1881/**
1882 * Find the confirmed guards from among the sampled guards in <b>gs</b>,
1883 * and put them in confirmed_entry_guards in the correct
1884 * order. Recalculate their indices.
1885 */
1886STATIC void
1887entry_guards_update_confirmed(guard_selection_t *gs)
1888{
1889 smartlist_clear(gs->confirmed_entry_guards);
1890 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
1891 if (guard->confirmed_idx >= 0)
1892 smartlist_add(gs->confirmed_entry_guards, guard);
1893 } SMARTLIST_FOREACH_END(guard);
1894
1895 smartlist_sort(gs->confirmed_entry_guards, compare_guards_by_confirmed_idx);
1896 /** Needed to keep a dense array of confirmed_idx */
1897 int any_changed = 0;
1898 SMARTLIST_FOREACH_BEGIN(gs->confirmed_entry_guards, entry_guard_t *, guard) {
1899 if (guard->confirmed_idx != guard_sl_idx) {
1900 any_changed = 1;
1901 guard->confirmed_idx = guard_sl_idx;
1902 }
1903 } SMARTLIST_FOREACH_END(guard);
1904
1905 gs->next_confirmed_idx = smartlist_len(gs->confirmed_entry_guards);
1906 // We need the confirmed list to always be give guards in sampled order
1907 smartlist_sort(gs->confirmed_entry_guards, compare_guards_by_sampled_idx);
1908
1909 if (any_changed) {
1911 }
1912}
1913
1914/**
1915 * Mark <b>guard</b> as a confirmed guard -- that is, one that we have
1916 * connected to, and intend to use again.
1917 */
1918STATIC void
1919make_guard_confirmed(guard_selection_t *gs, entry_guard_t *guard)
1920{
1921 if (BUG(guard->confirmed_on_date && guard->confirmed_idx >= 0))
1922 return; // LCOV_EXCL_LINE
1923
1924 if (BUG(smartlist_contains(gs->confirmed_entry_guards, guard)))
1925 return; // LCOV_EXCL_LINE
1926
1927 const int GUARD_LIFETIME = get_guard_lifetime();
1928 guard->confirmed_on_date = randomize_time(approx_time(), GUARD_LIFETIME/10);
1929
1930 log_info(LD_GUARD, "Marking %s as a confirmed guard (index %d)",
1931 entry_guard_describe(guard),
1932 gs->next_confirmed_idx);
1933
1934 guard->confirmed_idx = gs->next_confirmed_idx++;
1935 smartlist_add(gs->confirmed_entry_guards, guard);
1936 /** The confirmation ordering might not be the sample ordering. We need to
1937 * reorder */
1938 smartlist_sort(gs->confirmed_entry_guards, compare_guards_by_sampled_idx);
1939
1940 // This confirmed guard might kick something else out of the primary
1941 // guards.
1942 gs->primary_guards_up_to_date = 0;
1943
1945}
1946
1947/**
1948 * Recalculate the list of primary guards (the ones we'd prefer to use) from
1949 * the filtered sample and the confirmed list.
1950 */
1951STATIC void
1952entry_guards_update_primary(guard_selection_t *gs)
1953{
1954 tor_assert(gs);
1955
1956 // prevent recursion. Recursion is potentially very bad here.
1957 static int running = 0;
1958 tor_assert(!running);
1959 running = 1;
1960
1961 const int N_PRIMARY_GUARDS = get_n_primary_guards();
1962
1963 smartlist_t *new_primary_guards = smartlist_new();
1964 smartlist_t *old_primary_guards = smartlist_new();
1965 smartlist_add_all(old_primary_guards, gs->primary_entry_guards);
1966
1967 /* Set this flag now, to prevent the calls below from recursing. */
1968 gs->primary_guards_up_to_date = 1;
1969
1970 /* First, can we fill it up with confirmed guards? */
1971 SMARTLIST_FOREACH_BEGIN(gs->confirmed_entry_guards, entry_guard_t *, guard) {
1972 if (smartlist_len(new_primary_guards) >= N_PRIMARY_GUARDS)
1973 break;
1974 if (! guard->is_filtered_guard)
1975 continue;
1976 guard->is_primary = 1;
1977 smartlist_add(new_primary_guards, guard);
1978 } SMARTLIST_FOREACH_END(guard);
1979
1980 SMARTLIST_FOREACH_BEGIN(old_primary_guards, entry_guard_t *, guard) {
1981 /* Can we keep any older primary guards? First remove all the ones
1982 * that we already kept. */
1983 if (smartlist_contains(new_primary_guards, guard)) {
1984 SMARTLIST_DEL_CURRENT_KEEPORDER(old_primary_guards, guard);
1985 continue;
1986 }
1987
1988 /* Now add any that are still good. */
1989 if (smartlist_len(new_primary_guards) < N_PRIMARY_GUARDS &&
1990 guard->is_filtered_guard) {
1991 guard->is_primary = 1;
1992 smartlist_add(new_primary_guards, guard);
1993 SMARTLIST_DEL_CURRENT_KEEPORDER(old_primary_guards, guard);
1994 } else {
1995 /* Mark the remaining previous primary guards as non-primary */
1996 guard->is_primary = 0;
1997 }
1998 } SMARTLIST_FOREACH_END(guard);
1999
2000 /* Finally, fill out the list with sampled guards. */
2001 while (smartlist_len(new_primary_guards) < N_PRIMARY_GUARDS) {
2002 entry_guard_t *guard = first_reachable_filtered_entry_guard(gs, NULL,
2003 SAMPLE_EXCLUDE_CONFIRMED|
2004 SAMPLE_EXCLUDE_PRIMARY|
2005 SAMPLE_NO_UPDATE_PRIMARY);
2006 if (!guard)
2007 break;
2008 guard->is_primary = 1;
2009 smartlist_add(new_primary_guards, guard);
2010 }
2011
2012#if 1
2013 /* Debugging. */
2014 SMARTLIST_FOREACH(gs->sampled_entry_guards, entry_guard_t *, guard, {
2015 tor_assert_nonfatal(
2016 bool_eq(guard->is_primary,
2017 smartlist_contains(new_primary_guards, guard)));
2018 });
2019#endif /* 1 */
2020
2021 const int any_change = !smartlist_ptrs_eq(gs->primary_entry_guards,
2022 new_primary_guards);
2023 if (any_change) {
2024 log_info(LD_GUARD, "Primary entry guards have changed. "
2025 "New primary guard list is: ");
2026 int n = smartlist_len(new_primary_guards);
2027 SMARTLIST_FOREACH_BEGIN(new_primary_guards, entry_guard_t *, g) {
2028 log_info(LD_GUARD, " %d/%d: %s%s%s",
2029 g_sl_idx+1, n, entry_guard_describe(g),
2030 g->confirmed_idx >= 0 ? " (confirmed)" : "",
2031 g->is_filtered_guard ? "" : " (excluded by filter)");
2032 } SMARTLIST_FOREACH_END(g);
2033 smartlist_sort(new_primary_guards, compare_guards_by_sampled_idx);
2034 }
2035
2036 smartlist_free(old_primary_guards);
2037 smartlist_free(gs->primary_entry_guards);
2038 gs->primary_entry_guards = new_primary_guards;
2039 gs->primary_guards_up_to_date = 1;
2040 running = 0;
2041}
2042
2043/**
2044 * Return the number of seconds after the last attempt at which we should
2045 * retry a guard that has been failing since <b>failing_since</b>.
2046 */
2047static int
2048get_retry_schedule(time_t failing_since, time_t now,
2049 int is_primary)
2050{
2051 const unsigned SIX_HOURS = 6 * 3600;
2052 const unsigned FOUR_DAYS = 4 * 86400;
2053 const unsigned SEVEN_DAYS = 7 * 86400;
2054
2055 time_t tdiff;
2056 if (now > failing_since) {
2057 tdiff = now - failing_since;
2058 } else {
2059 tdiff = 0;
2060 }
2061
2062 const struct {
2063 time_t maximum; int primary_delay; int nonprimary_delay;
2064 } delays[] = {
2065 // clang-format off
2066 { SIX_HOURS, 10*60, 1*60*60 },
2067 { FOUR_DAYS, 90*60, 4*60*60 },
2068 { SEVEN_DAYS, 4*60*60, 18*60*60 },
2069 { TIME_MAX, 9*60*60, 36*60*60 }
2070 // clang-format on
2071 };
2072
2073 unsigned i;
2074 for (i = 0; i < ARRAY_LENGTH(delays); ++i) {
2075 if (tdiff <= delays[i].maximum) {
2076 return is_primary ? delays[i].primary_delay : delays[i].nonprimary_delay;
2077 }
2078 }
2079 /* LCOV_EXCL_START -- can't reach, since delays ends with TIME_MAX. */
2081 return 36*60*60;
2082 /* LCOV_EXCL_STOP */
2083}
2084
2085/**
2086 * If <b>guard</b> is unreachable, consider whether enough time has passed
2087 * to consider it maybe-reachable again.
2088 */
2089STATIC void
2090entry_guard_consider_retry(entry_guard_t *guard)
2091{
2092 if (guard->is_reachable != GUARD_REACHABLE_NO)
2093 return; /* No retry needed. */
2094
2095 const time_t now = approx_time();
2096 const int delay =
2097 get_retry_schedule(guard->failing_since, now, guard->is_primary);
2098 const time_t last_attempt = guard->last_tried_to_connect;
2099
2100 /* Check if it is a bridge and we don't have its descriptor yet */
2101 if (guard->bridge_addr && !guard_has_descriptor(guard)) {
2102 /* We want to leave the retry schedule to fetch_bridge_descriptors(),
2103 * so we don't have two retry schedules clobbering each other. See
2104 * bugs 40396 and 40497 for details of why we need this exception. */
2105 return;
2106 }
2107
2108 if (BUG(last_attempt == 0) ||
2109 now >= last_attempt + delay) {
2110 /* We should mark this retriable. */
2111 char tbuf[ISO_TIME_LEN+1];
2112 format_local_iso_time(tbuf, last_attempt);
2113 log_info(LD_GUARD, "Marked %s%sguard %s for possible retry, since we "
2114 "haven't tried to use it since %s.",
2115 guard->is_primary?"primary ":"",
2116 guard->confirmed_idx>=0?"confirmed ":"",
2117 entry_guard_describe(guard),
2118 tbuf);
2119
2120 guard->is_reachable = GUARD_REACHABLE_MAYBE;
2121 if (guard->is_filtered_guard)
2122 guard->is_usable_filtered_guard = 1;
2123 }
2124}
2125
2126/** Tell the entry guards subsystem that we have confirmed that as of
2127 * just now, we're on the internet. */
2128void
2130{
2131 gs->last_time_on_internet = approx_time();
2132}
2133
2134/**
2135 * Pick a primary guard for use with a circuit, if available. Update the
2136 * <b>last_tried_to_connect</b> time and the <b>is_pending</b> fields of the
2137 * guard as appropriate. Set <b>state_out</b> to the new guard-state
2138 * of the circuit.
2139 */
2140static entry_guard_t *
2142 guard_usage_t usage,
2143 const entry_guard_restriction_t *rst,
2144 unsigned *state_out)
2145{
2146 const int need_descriptor = (usage == GUARD_USAGE_TRAFFIC);
2147 entry_guard_t *chosen_guard = NULL;
2148
2149 int num_entry_guards_to_consider = get_n_primary_guards_to_use(usage);
2150 smartlist_t *usable_primary_guards = smartlist_new();
2151 int num_entry_guards_considered = 0;
2152
2153 SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, guard) {
2155 if (!entry_guard_obeys_restriction(guard, rst)) {
2156 log_info(LD_GUARD, "Entry guard %s doesn't obey restriction, we test the"
2157 " next one", entry_guard_describe(guard));
2159 log_info(LD_GUARD,
2160 "Skipping guard %s due to circuit path restriction. "
2161 "Have %d, considered: %d, to consider: %d",
2162 entry_guard_describe(guard),
2163 smartlist_len(usable_primary_guards),
2164 num_entry_guards_considered,
2165 num_entry_guards_to_consider);
2166 /* If the restriction is a circuit path restriction (as opposed to a
2167 * reachability restriction), count this as considered. */
2168 num_entry_guards_considered++;
2169
2170 /* If we have considered enough guards, *and* we actually have a guard,
2171 * then proceed to select one from the list. */
2172 if (num_entry_guards_considered >= num_entry_guards_to_consider) {
2173 /* This should not happen with 2-leg conflux unless there is a
2174 * race between removing a failed leg and a retry, but check
2175 * anyway and log. */
2176 if (smartlist_len(usable_primary_guards) == 0) {
2177 static ratelim_t guardlog = RATELIM_INIT(60);
2179 "All current guards excluded by path restriction "
2180 "type %d; using an additional guard.",
2181 rst->type);
2182 } else {
2183 break;
2184 }
2185 }
2186 }
2187 continue;
2188 }
2189 if (guard->is_reachable != GUARD_REACHABLE_NO) {
2190 if (need_descriptor && !guard_has_descriptor(guard)) {
2191 log_info(LD_GUARD, "Guard %s does not have a descriptor",
2192 entry_guard_describe(guard));
2193 continue;
2194 }
2195 *state_out = GUARD_CIRC_STATE_USABLE_ON_COMPLETION;
2196 guard->last_tried_to_connect = approx_time();
2197 smartlist_add(usable_primary_guards, guard);
2198 num_entry_guards_considered++;
2199
2200 /* If we have considered enough guards, then proceed to select
2201 * one from the list. */
2202 if (num_entry_guards_considered >= num_entry_guards_to_consider) {
2203 break;
2204 }
2205 } else {
2206 log_info(LD_GUARD, "Guard %s is not reachable",
2207 entry_guard_describe(guard));
2208 }
2209 } SMARTLIST_FOREACH_END(guard);
2210
2211 if (smartlist_len(usable_primary_guards)) {
2212 chosen_guard = smartlist_choose(usable_primary_guards);
2213 log_info(LD_GUARD,
2214 "Selected primary guard %s for circuit from a list size of %d.",
2215 entry_guard_describe(chosen_guard),
2216 smartlist_len(usable_primary_guards));
2217 /* Describe each guard in the list: */
2218 SMARTLIST_FOREACH_BEGIN(usable_primary_guards, entry_guard_t *, guard) {
2219 log_info(LD_GUARD, " %s", entry_guard_describe(guard));
2220 } SMARTLIST_FOREACH_END(guard);
2221 smartlist_free(usable_primary_guards);
2222 }
2223
2224 smartlist_free(usable_primary_guards);
2225 return chosen_guard;
2226}
2227
2228/**
2229 * For use with a circuit, pick a non-pending running filtered confirmed guard,
2230 * if one is available. Update the <b>last_tried_to_connect</b> time and the
2231 * <b>is_pending</b> fields of the guard as appropriate. Set <b>state_out</b>
2232 * to the new guard-state of the circuit.
2233 */
2234static entry_guard_t *
2236 guard_usage_t usage,
2237 const entry_guard_restriction_t *rst,
2238 unsigned *state_out)
2239{
2240 const int need_descriptor = (usage == GUARD_USAGE_TRAFFIC);
2241
2242 SMARTLIST_FOREACH_BEGIN(gs->confirmed_entry_guards, entry_guard_t *, guard) {
2243 if (guard->is_primary)
2244 continue; /* we already considered this one. */
2245 if (! entry_guard_obeys_restriction(guard, rst))
2246 continue;
2248 if (guard->is_usable_filtered_guard && ! guard->is_pending) {
2249 if (need_descriptor && !guard_has_descriptor(guard))
2250 continue; /* not a bug */
2251 guard->is_pending = 1;
2252 guard->last_tried_to_connect = approx_time();
2253 *state_out = GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD;
2254 log_info(LD_GUARD, "No primary guards available. Selected confirmed "
2255 "guard %s for circuit. Will try other guards before using "
2256 "this circuit.",
2257 entry_guard_describe(guard));
2258 return guard;
2259 }
2260 } SMARTLIST_FOREACH_END(guard);
2261
2262 return NULL;
2263}
2264
2265/**
2266 * For use with a circuit, pick a usable filtered guard. Update the
2267 * <b>last_tried_to_connect</b> time and the <b>is_pending</b> fields of the
2268 * guard as appropriate. Set <b>state_out</b> to the new guard-state of the
2269 * circuit.
2270 */
2271static entry_guard_t *
2273 guard_usage_t usage,
2274 const entry_guard_restriction_t *rst,
2275 unsigned *state_out)
2276{
2277 const int need_descriptor = (usage == GUARD_USAGE_TRAFFIC);
2278 entry_guard_t *chosen_guard = NULL;
2279 unsigned flags = 0;
2280 if (need_descriptor)
2281 flags |= SAMPLE_EXCLUDE_NO_DESCRIPTOR;
2282 chosen_guard = first_reachable_filtered_entry_guard(gs,
2283 rst,
2284 SAMPLE_EXCLUDE_CONFIRMED |
2285 SAMPLE_EXCLUDE_PRIMARY |
2286 SAMPLE_EXCLUDE_PENDING |
2287 flags);
2288 if (!chosen_guard) {
2289 return NULL;
2290 }
2291
2292 chosen_guard->is_pending = 1;
2293 chosen_guard->last_tried_to_connect = approx_time();
2294 *state_out = GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD;
2295 log_info(LD_GUARD, "No primary or confirmed guards available. Selected "
2296 "guard %s for circuit. Will try other guards before "
2297 "using this circuit.",
2298 entry_guard_describe(chosen_guard));
2299 return chosen_guard;
2300}
2301
2302/**
2303 * Get a guard for use with a circuit. Prefer to pick a running primary
2304 * guard; then a non-pending running filtered confirmed guard; then a
2305 * non-pending runnable filtered guard. Update the
2306 * <b>last_tried_to_connect</b> time and the <b>is_pending</b> fields of the
2307 * guard as appropriate. Set <b>state_out</b> to the new guard-state
2308 * of the circuit.
2309 */
2310STATIC entry_guard_t *
2312 guard_usage_t usage,
2313 const entry_guard_restriction_t *rst,
2314 unsigned *state_out)
2315{
2316 entry_guard_t *chosen_guard = NULL;
2317 tor_assert(gs);
2318 tor_assert(state_out);
2319
2320 if (!gs->primary_guards_up_to_date)
2322
2323 /* "If any entry in PRIMARY_GUARDS has {is_reachable} status of
2324 <maybe> or <yes>, return the first such guard." */
2325 chosen_guard = select_primary_guard_for_circuit(gs, usage, rst, state_out);
2326 if (chosen_guard) {
2327 log_info(LD_GUARD, "Selected primary guard %s for circuit.",
2328 entry_guard_describe(chosen_guard));
2329 return chosen_guard;
2330 }
2331
2332 /* "Otherwise, if the ordered intersection of {CONFIRMED_GUARDS}
2333 and {USABLE_FILTERED_GUARDS} is nonempty, return the first
2334 entry in that intersection that has {is_pending} set to
2335 false." */
2336 chosen_guard = select_confirmed_guard_for_circuit(gs, usage, rst, state_out);
2337 if (chosen_guard) {
2338 log_info(LD_GUARD, "Selected confirmed guard %s for circuit.",
2339 entry_guard_describe(chosen_guard));
2340 return chosen_guard;
2341 }
2342
2343 /* "Otherwise, if there is no such entry, select a member
2344 * {USABLE_FILTERED_GUARDS} following the sample ordering" */
2345 chosen_guard = select_filtered_guard_for_circuit(gs, usage, rst, state_out);
2346
2347 if (chosen_guard == NULL) {
2348 log_info(LD_GUARD, "Absolutely no sampled guards were available. "
2349 "Marking all guards for retry and starting from top again.");
2350 mark_all_guards_maybe_reachable(gs);
2351 return NULL;
2352 }
2353
2354 log_info(LD_GUARD, "Selected filtered guard %s for circuit.",
2355 entry_guard_describe(chosen_guard));
2356 return chosen_guard;
2357}
2358
2359/**
2360 * Note that we failed to connect to or build circuits through <b>guard</b>.
2361 * Use with a guard returned by select_entry_guard_for_circuit().
2362 */
2363STATIC void
2365 entry_guard_t *guard)
2366{
2367 tor_assert(gs);
2368
2369 guard->is_reachable = GUARD_REACHABLE_NO;
2370 guard->is_usable_filtered_guard = 0;
2371
2372 guard->is_pending = 0;
2373 if (guard->failing_since == 0)
2374 guard->failing_since = approx_time();
2375
2376 /* This guard not reachable: send GUARD DOWN event */
2377 control_event_guard(guard->nickname, guard->identity, "DOWN");
2378
2379 log_info(LD_GUARD, "Recorded failure for %s%sguard %s",
2380 guard->is_primary?"primary ":"",
2381 guard->confirmed_idx>=0?"confirmed ":"",
2382 entry_guard_describe(guard));
2383
2384 /* Schedule a re-assessment of whether we have enough dir info to
2385 * use the network. Counterintuitively, *losing* a bridge might actually
2386 * be just what we need to *resume* using the network, if we had it in
2387 * state GUARD_REACHABLE_MAYBE and we were stalling to learn this
2388 * outcome. See bug 40396 for more details. */
2390}
2391
2392/**
2393 * Note that we successfully connected to, and built a circuit through
2394 * <b>guard</b>. Given the old guard-state of the circuit in <b>old_state</b>,
2395 * return the new guard-state of the circuit.
2396 *
2397 * Be aware: the circuit is only usable when its guard-state becomes
2398 * GUARD_CIRC_STATE_COMPLETE.
2399 **/
2400STATIC unsigned
2402 entry_guard_t *guard,
2403 unsigned old_state)
2404{
2405 tor_assert(gs);
2406
2407 /* Save this, since we're about to overwrite it. */
2408 const time_t last_time_on_internet = gs->last_time_on_internet;
2409 gs->last_time_on_internet = approx_time();
2410
2411 /* If guard was not already marked as reachable, send a GUARD UP signal */
2412 if (guard->is_reachable != GUARD_REACHABLE_YES) {
2413 control_event_guard(guard->nickname, guard->identity, "UP");
2414
2415 /* Schedule a re-assessment of whether we have enough dir info to
2416 * use the network. One of our guards has just moved to
2417 * GUARD_REACHABLE_YES, so maybe we can resume using the network
2418 * now. */
2420 }
2421
2422 guard->is_reachable = GUARD_REACHABLE_YES;
2423 guard->failing_since = 0;
2424 guard->is_pending = 0;
2425 if (guard->is_filtered_guard)
2426 guard->is_usable_filtered_guard = 1;
2427
2428 if (guard->confirmed_idx < 0) {
2429 make_guard_confirmed(gs, guard);
2430 if (!gs->primary_guards_up_to_date)
2432 }
2433
2434 unsigned new_state;
2435 switch (old_state) {
2436 case GUARD_CIRC_STATE_COMPLETE:
2437 case GUARD_CIRC_STATE_USABLE_ON_COMPLETION:
2438 new_state = GUARD_CIRC_STATE_COMPLETE;
2439 break;
2440 default:
2443 case GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD:
2444 if (guard->is_primary) {
2445 /* XXXX #20832 -- I don't actually like this logic. It seems to make
2446 * us a little more susceptible to evil-ISP attacks. The mitigations
2447 * I'm thinking of, however, aren't local to this point, so I'll leave
2448 * it alone. */
2449 /* This guard may have become primary by virtue of being confirmed.
2450 * If so, the circuit for it is now complete.
2451 */
2452 new_state = GUARD_CIRC_STATE_COMPLETE;
2453 } else {
2454 new_state = GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD;
2455 }
2456 break;
2457 }
2458
2459 if (! guard->is_primary) {
2460 if (last_time_on_internet + get_internet_likely_down_interval()
2461 < approx_time()) {
2463 }
2464 }
2465
2466 log_info(LD_GUARD, "Recorded success for %s%sguard %s",
2467 guard->is_primary?"primary ":"",
2468 guard->confirmed_idx>=0?"confirmed ":"",
2469 entry_guard_describe(guard));
2470
2471 return new_state;
2472}
2473
2474/**
2475 * Helper: Return true iff <b>a</b> has higher priority than <b>b</b>.
2476 */
2477STATIC int
2478entry_guard_has_higher_priority(entry_guard_t *a, entry_guard_t *b)
2479{
2480 tor_assert(a && b);
2481 if (a == b)
2482 return 0;
2483
2484 /* Confirmed is always better than unconfirmed; lower index better
2485 than higher */
2486 if (a->confirmed_idx < 0) {
2487 if (b->confirmed_idx >= 0)
2488 return 0;
2489 } else {
2490 if (b->confirmed_idx < 0)
2491 return 1;
2492
2493 /* Lower confirmed_idx is better than higher. */
2494 return (a->confirmed_idx < b->confirmed_idx);
2495 }
2496
2497 /* If we reach this point, both are unconfirmed. If one is pending, it
2498 * has higher priority. */
2499 if (a->is_pending) {
2500 if (! b->is_pending)
2501 return 1;
2502
2503 /* Both are pending: earlier last_tried_connect wins. */
2504 return a->last_tried_to_connect < b->last_tried_to_connect;
2505 } else {
2506 if (b->is_pending)
2507 return 0;
2508
2509 /* Neither is pending: priorities are equal. */
2510 return 0;
2511 }
2512}
2513
2514/** Release all storage held in <b>restriction</b> */
2515STATIC void
2516entry_guard_restriction_free_(entry_guard_restriction_t *rst)
2517{
2518 if (rst && rst->excluded) {
2519 SMARTLIST_FOREACH(rst->excluded, void *, g,
2520 tor_free(g));
2521 smartlist_free(rst->excluded);
2522 }
2523 tor_free(rst);
2524}
2525
2526/**
2527 * Release all storage held in <b>state</b>.
2528 */
2529void
2530circuit_guard_state_free_(circuit_guard_state_t *state)
2531{
2532 if (!state)
2533 return;
2534 entry_guard_restriction_free(state->restrictions);
2535 entry_guard_handle_free(state->guard);
2536 tor_free(state);
2537}
2538
2539/** Allocate and return a new circuit_guard_state_t to track the result
2540 * of using <b>guard</b> for a given operation. */
2541MOCK_IMPL(STATIC circuit_guard_state_t *,
2542circuit_guard_state_new,(entry_guard_t *guard, unsigned state,
2543 entry_guard_restriction_t *rst))
2544{
2545 circuit_guard_state_t *result;
2546
2547 result = tor_malloc_zero(sizeof(circuit_guard_state_t));
2548 result->guard = entry_guard_handle_new(guard);
2549 result->state = state;
2550 result->state_set_at = approx_time();
2551 result->restrictions = rst;
2552
2553 return result;
2554}
2555
2556/**
2557 * Pick a suitable entry guard for a circuit in, and place that guard
2558 * in *<b>chosen_node_out</b>. Set *<b>guard_state_out</b> to an opaque
2559 * state object that will record whether the circuit is ready to be used
2560 * or not. Return 0 on success; on failure, return -1.
2561 *
2562 * If a restriction is provided in <b>rst</b>, do not return any guards that
2563 * violate it, and remember that restriction in <b>guard_state_out</b> for
2564 * later use. (Takes ownership of the <b>rst</b> object.)
2565 */
2566int
2567entry_guard_pick_for_circuit(guard_selection_t *gs,
2568 guard_usage_t usage,
2569 entry_guard_restriction_t *rst,
2570 const node_t **chosen_node_out,
2571 circuit_guard_state_t **guard_state_out)
2572{
2573 tor_assert(gs);
2574 tor_assert(chosen_node_out);
2575 tor_assert(guard_state_out);
2576 *chosen_node_out = NULL;
2577 *guard_state_out = NULL;
2578
2579 unsigned state = 0;
2580 entry_guard_t *guard =
2581 select_entry_guard_for_circuit(gs, usage, rst, &state);
2582 if (! guard)
2583 goto fail;
2584 if (BUG(state == 0))
2585 goto fail;
2586 const node_t *node = node_get_by_id(guard->identity);
2587 // XXXX #20827 check Ed ID.
2588 if (! node)
2589 goto fail;
2590 if (BUG(usage != GUARD_USAGE_DIRGUARD &&
2592 goto fail;
2593
2594 *chosen_node_out = node;
2595 *guard_state_out = circuit_guard_state_new(guard, state, rst);
2596
2597 return 0;
2598 fail:
2599 entry_guard_restriction_free(rst);
2600 return -1;
2601}
2602
2603/**
2604 * Called by the circuit building module when a circuit has succeeded: informs
2605 * the guards code that the guard in *<b>guard_state_p</b> is working, and
2606 * advances the state of the guard module. On a GUARD_USABLE_NEVER return
2607 * value, the circuit is broken and should not be used. On a GUARD_USABLE_NOW
2608 * return value, the circuit is ready to use. On a GUARD_MAYBE_USABLE_LATER
2609 * return value, the circuit should not be used until we find out whether
2610 * preferred guards will work for us.
2611 */
2612guard_usable_t
2613entry_guard_succeeded(circuit_guard_state_t **guard_state_p)
2614{
2615 if (BUG(*guard_state_p == NULL))
2616 return GUARD_USABLE_NEVER;
2617
2618 entry_guard_t *guard = entry_guard_handle_get((*guard_state_p)->guard);
2619 if (! guard || BUG(guard->in_selection == NULL))
2620 return GUARD_USABLE_NEVER;
2621
2622 unsigned newstate =
2623 entry_guards_note_guard_success(guard->in_selection, guard,
2624 (*guard_state_p)->state);
2625
2626 (*guard_state_p)->state = newstate;
2627 (*guard_state_p)->state_set_at = approx_time();
2628
2629 if (newstate == GUARD_CIRC_STATE_COMPLETE) {
2630 return GUARD_USABLE_NOW;
2631 } else {
2632 return GUARD_MAYBE_USABLE_LATER;
2633 }
2634}
2635
2636/** Cancel the selection of *<b>guard_state_p</b> without declaring
2637 * success or failure. It is safe to call this function if success or
2638 * failure _has_ already been declared. */
2639void
2640entry_guard_cancel(circuit_guard_state_t **guard_state_p)
2641{
2642 if (BUG(*guard_state_p == NULL))
2643 return;
2644 entry_guard_t *guard = entry_guard_handle_get((*guard_state_p)->guard);
2645 if (! guard)
2646 return;
2647
2648 /* XXXX prop271 -- last_tried_to_connect_at will be erroneous here, but this
2649 * function will only get called in "bug" cases anyway. */
2650 guard->is_pending = 0;
2651 circuit_guard_state_free(*guard_state_p);
2652 *guard_state_p = NULL;
2653}
2654
2655/**
2656 * Called by the circuit building module when a circuit has failed:
2657 * informs the guards code that the guard in *<b>guard_state_p</b> is
2658 * not working, and advances the state of the guard module.
2659 */
2660void
2661entry_guard_failed(circuit_guard_state_t **guard_state_p)
2662{
2663 if (BUG(*guard_state_p == NULL))
2664 return;
2665
2666 entry_guard_t *guard = entry_guard_handle_get((*guard_state_p)->guard);
2667 if (! guard || BUG(guard->in_selection == NULL))
2668 return;
2669
2670 entry_guards_note_guard_failure(guard->in_selection, guard);
2671
2672 (*guard_state_p)->state = GUARD_CIRC_STATE_DEAD;
2673 (*guard_state_p)->state_set_at = approx_time();
2674}
2675
2676/**
2677 * Run the entry_guard_failed() function on every circuit that is
2678 * pending on <b>chan</b>.
2679 */
2680void
2682{
2683 if (!chan)
2684 return;
2685
2686 smartlist_t *pending = smartlist_new();
2688 SMARTLIST_FOREACH_BEGIN(pending, circuit_t *, circ) {
2689 if (!CIRCUIT_IS_ORIGIN(circ))
2690 continue;
2691
2692 origin_circuit_t *origin_circ = TO_ORIGIN_CIRCUIT(circ);
2693 if (origin_circ->guard_state) {
2694 /* We might have no guard state if we didn't use a guard on this
2695 * circuit (eg it's for a fallback directory). */
2696 entry_guard_failed(&origin_circ->guard_state);
2697 }
2698 } SMARTLIST_FOREACH_END(circ);
2699 smartlist_free(pending);
2700}
2701
2702/**
2703 * Return true iff every primary guard in <b>gs</b> is believed to
2704 * be unreachable.
2705 */
2706STATIC int
2708{
2709 tor_assert(gs);
2710 if (!gs->primary_guards_up_to_date)
2712 SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, guard) {
2714 if (guard->is_reachable != GUARD_REACHABLE_NO)
2715 return 0;
2716 } SMARTLIST_FOREACH_END(guard);
2717 return 1;
2718}
2719
2720/** Wrapper for entry_guard_has_higher_priority that compares the
2721 * guard-priorities of a pair of circuits. Return 1 if <b>a</b> has higher
2722 * priority than <b>b</b>.
2723 *
2724 * If a restriction is provided in <b>rst</b>, then do not consider
2725 * <b>a</b> to have higher priority if it violates the restriction.
2726 */
2727static int
2729 const entry_guard_restriction_t *rst,
2731{
2732 circuit_guard_state_t *state_a = origin_circuit_get_guard_state(a);
2733 circuit_guard_state_t *state_b = origin_circuit_get_guard_state(b);
2734
2735 tor_assert(state_a);
2736 tor_assert(state_b);
2737
2738 entry_guard_t *guard_a = entry_guard_handle_get(state_a->guard);
2739 entry_guard_t *guard_b = entry_guard_handle_get(state_b->guard);
2740
2741 if (! guard_a) {
2742 /* Unknown guard -- never higher priority. */
2743 return 0;
2744 } else if (! guard_b) {
2745 /* Known guard -- higher priority than any unknown guard. */
2746 return 1;
2747 } else if (! entry_guard_obeys_restriction(guard_a, rst)) {
2748 /* Restriction violated; guard_a cannot have higher priority. */
2749 return 0;
2750 } else {
2751 /* Both known -- compare.*/
2752 return entry_guard_has_higher_priority(guard_a, guard_b);
2753 }
2754}
2755
2756/**
2757 * Look at all of the origin_circuit_t * objects in <b>all_circuits_in</b>,
2758 * and see if any of them that were previously not ready to use for
2759 * guard-related reasons are now ready to use. Place those circuits
2760 * in <b>newly_complete_out</b>, and mark them COMPLETE.
2761 *
2762 * Return 1 if we upgraded any circuits, and 0 otherwise.
2763 */
2764int
2766 const smartlist_t *all_circuits_in,
2767 smartlist_t *newly_complete_out)
2768{
2769 tor_assert(gs);
2770 tor_assert(all_circuits_in);
2771 tor_assert(newly_complete_out);
2772
2774 /* We only upgrade a waiting circuit if the primary guards are all
2775 * down. */
2776 log_debug(LD_GUARD, "Considered upgrading guard-stalled circuits, "
2777 "but not all primary guards were definitely down.");
2778 return 0;
2779 }
2780
2781 int n_waiting = 0;
2782 int n_complete = 0;
2783 int n_complete_blocking = 0;
2784 origin_circuit_t *best_waiting_circuit = NULL;
2785 smartlist_t *all_circuits = smartlist_new();
2786 SMARTLIST_FOREACH_BEGIN(all_circuits_in, origin_circuit_t *, circ) {
2787 // We filter out circuits that aren't ours, or which we can't
2788 // reason about.
2789 circuit_guard_state_t *state = origin_circuit_get_guard_state(circ);
2790 if (state == NULL)
2791 continue;
2792 entry_guard_t *guard = entry_guard_handle_get(state->guard);
2793 if (!guard || guard->in_selection != gs)
2794 continue;
2795 if (TO_CIRCUIT(circ)->marked_for_close) {
2796 /* Don't consider any marked for close circuits. */
2797 continue;
2798 }
2799
2800 smartlist_add(all_circuits, circ);
2801 } SMARTLIST_FOREACH_END(circ);
2802
2803 SMARTLIST_FOREACH_BEGIN(all_circuits, origin_circuit_t *, circ) {
2804 circuit_guard_state_t *state = origin_circuit_get_guard_state(circ);
2805 if (BUG(state == NULL))
2806 continue;
2807
2808 if (state->state == GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD) {
2809 ++n_waiting;
2810 if (! best_waiting_circuit ||
2811 circ_state_has_higher_priority(circ, NULL, best_waiting_circuit)) {
2812 best_waiting_circuit = circ;
2813 }
2814 }
2815 } SMARTLIST_FOREACH_END(circ);
2816
2817 if (! best_waiting_circuit) {
2818 log_debug(LD_GUARD, "Considered upgrading guard-stalled circuits, "
2819 "but didn't find any.");
2820 goto no_change;
2821 }
2822
2823 /* We'll need to keep track of what restrictions were used when picking this
2824 * circuit, so that we don't allow any circuit without those restrictions to
2825 * block it. */
2826 const entry_guard_restriction_t *rst_on_best_waiting =
2827 origin_circuit_get_guard_state(best_waiting_circuit)->restrictions;
2828
2829 /* First look at the complete circuits: Do any block this circuit? */
2830 SMARTLIST_FOREACH_BEGIN(all_circuits, origin_circuit_t *, circ) {
2831 /* "C2 "blocks" C1 if:
2832 * C2 obeys all the restrictions that C1 had to obey, AND
2833 * C2 has higher priority than C1, AND
2834 * Either C2 is <complete>, or C2 is <waiting_for_better_guard>,
2835 or C2 has been <usable_if_no_better_guard> for no more than
2836 {NONPRIMARY_GUARD_CONNECT_TIMEOUT} seconds."
2837 */
2838 circuit_guard_state_t *state = origin_circuit_get_guard_state(circ);
2839 if (BUG(state == NULL))
2840 continue;
2841 if (state->state != GUARD_CIRC_STATE_COMPLETE)
2842 continue;
2843 ++n_complete;
2844 if (circ_state_has_higher_priority(circ, rst_on_best_waiting,
2845 best_waiting_circuit))
2846 ++n_complete_blocking;
2847 } SMARTLIST_FOREACH_END(circ);
2848
2849 if (n_complete_blocking) {
2850 log_debug(LD_GUARD, "Considered upgrading guard-stalled circuits: found "
2851 "%d complete and %d guard-stalled. At least one complete "
2852 "circuit had higher priority, so not upgrading.",
2853 n_complete, n_waiting);
2854 goto no_change;
2855 }
2856
2857 /* " * If any circuit C1 is <waiting_for_better_guard>, AND:
2858 * All primary guards have reachable status of <no>.
2859 * There is no circuit C2 that "blocks" C1.
2860 Then, upgrade C1 to <complete>.""
2861 */
2862 int n_blockers_found = 0;
2863 const time_t state_set_at_cutoff =
2865 SMARTLIST_FOREACH_BEGIN(all_circuits, origin_circuit_t *, circ) {
2866 circuit_guard_state_t *state = origin_circuit_get_guard_state(circ);
2867 if (BUG(state == NULL))
2868 continue;
2869 if (state->state != GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD)
2870 continue;
2871 if (state->state_set_at <= state_set_at_cutoff)
2872 continue;
2873 if (circ_state_has_higher_priority(circ, rst_on_best_waiting,
2874 best_waiting_circuit))
2875 ++n_blockers_found;
2876 } SMARTLIST_FOREACH_END(circ);
2877
2878 if (n_blockers_found) {
2879 log_debug(LD_GUARD, "Considered upgrading guard-stalled circuits: found "
2880 "%d guard-stalled, but %d pending circuit(s) had higher "
2881 "guard priority, so not upgrading.",
2882 n_waiting, n_blockers_found);
2883 goto no_change;
2884 }
2885
2886 /* Okay. We have a best waiting circuit, and we aren't waiting for
2887 anything better. Add all circuits with that priority to the
2888 list, and call them COMPLETE. */
2889 int n_succeeded = 0;
2890 SMARTLIST_FOREACH_BEGIN(all_circuits, origin_circuit_t *, circ) {
2891 circuit_guard_state_t *state = origin_circuit_get_guard_state(circ);
2892 if (BUG(state == NULL))
2893 continue;
2894 if (circ != best_waiting_circuit && rst_on_best_waiting) {
2895 /* Can't upgrade other circ with same priority as best; might
2896 be blocked. */
2897 continue;
2898 }
2899 if (state->state != GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD)
2900 continue;
2901 if (circ_state_has_higher_priority(best_waiting_circuit, NULL, circ))
2902 continue;
2903
2904 state->state = GUARD_CIRC_STATE_COMPLETE;
2905 state->state_set_at = approx_time();
2906 smartlist_add(newly_complete_out, circ);
2907 ++n_succeeded;
2908 } SMARTLIST_FOREACH_END(circ);
2909
2910 log_info(LD_GUARD, "Considered upgrading guard-stalled circuits: found "
2911 "%d guard-stalled, %d complete. %d of the guard-stalled "
2912 "circuit(s) had high enough priority to upgrade.",
2913 n_waiting, n_complete, n_succeeded);
2914
2915 tor_assert_nonfatal(n_succeeded >= 1);
2916 smartlist_free(all_circuits);
2917 return 1;
2918
2919 no_change:
2920 smartlist_free(all_circuits);
2921 return 0;
2922}
2923
2924/**
2925 * Return true iff the circuit whose state is <b>guard_state</b> should
2926 * expire.
2927 */
2928int
2929entry_guard_state_should_expire(circuit_guard_state_t *guard_state)
2930{
2931 if (guard_state == NULL)
2932 return 0;
2933 const time_t expire_if_waiting_since =
2935 return (guard_state->state == GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD
2936 && guard_state->state_set_at < expire_if_waiting_since);
2937}
2938
2939/**
2940 * Update all derived pieces of the guard selection state in <b>gs</b>.
2941 * Return true iff we should stop using all previously generated circuits.
2942 */
2943int
2952
2953/**
2954 * Return a newly allocated string for encoding the persistent parts of
2955 * <b>guard</b> to the state file. <b>dense_sampled_idx</b> refers to the
2956 * sampled_idx made dense for this <b>guard</b>. Encoding all guards should
2957 * lead to a dense array of sampled_idx in the state file.
2958 */
2959STATIC char *
2960entry_guard_encode_for_state(entry_guard_t *guard, int dense_sampled_idx)
2961{
2962 /*
2963 * The meta-format we use is K=V K=V K=V... where K can be any
2964 * characters excepts space and =, and V can be any characters except
2965 * space. The order of entries is not allowed to matter.
2966 * Unrecognized K=V entries are persisted; recognized but erroneous
2967 * entries are corrected.
2968 */
2969
2970 smartlist_t *result = smartlist_new();
2971 char tbuf[ISO_TIME_LEN+1];
2972
2973 tor_assert(guard);
2974
2975 smartlist_add_asprintf(result, "in=%s", guard->selection_name);
2976 smartlist_add_asprintf(result, "rsa_id=%s",
2977 hex_str(guard->identity, DIGEST_LEN));
2978 if (guard->bridge_addr) {
2979 smartlist_add_asprintf(result, "bridge_addr=%s:%d",
2980 fmt_and_decorate_addr(&guard->bridge_addr->addr),
2981 guard->bridge_addr->port);
2982 }
2983 if (strlen(guard->nickname) && is_legal_nickname(guard->nickname)) {
2984 smartlist_add_asprintf(result, "nickname=%s", guard->nickname);
2985 }
2986
2987 format_iso_time_nospace(tbuf, guard->sampled_on_date);
2988 smartlist_add_asprintf(result, "sampled_on=%s", tbuf);
2989 // Replacing the sampled_idx by dense array
2990 smartlist_add_asprintf(result, "sampled_idx=%d", dense_sampled_idx);
2991 if (guard->sampled_by_version) {
2992 smartlist_add_asprintf(result, "sampled_by=%s",
2993 guard->sampled_by_version);
2994 }
2995
2996 if (guard->unlisted_since_date > 0) {
2997 format_iso_time_nospace(tbuf, guard->unlisted_since_date);
2998 smartlist_add_asprintf(result, "unlisted_since=%s", tbuf);
2999 }
3000
3001 smartlist_add_asprintf(result, "listed=%d",
3002 (int)guard->currently_listed);
3003
3004 if (guard->confirmed_idx >= 0) {
3005 format_iso_time_nospace(tbuf, guard->confirmed_on_date);
3006 smartlist_add_asprintf(result, "confirmed_on=%s", tbuf);
3007
3008 smartlist_add_asprintf(result, "confirmed_idx=%d", guard->confirmed_idx);
3009 }
3010
3011 const double EPSILON = 1.0e-6;
3012
3013 /* Make a copy of the pathbias object, since we will want to update
3014 some of them */
3015 guard_pathbias_t *pb = tor_memdup(&guard->pb, sizeof(*pb));
3018
3019 #define PB_FIELD(field) do { \
3020 if (pb->field >= EPSILON) { \
3021 smartlist_add_asprintf(result, "pb_" #field "=%f", pb->field); \
3022 } \
3023 } while (0)
3024 PB_FIELD(use_attempts);
3025 PB_FIELD(use_successes);
3026 PB_FIELD(circ_attempts);
3027 PB_FIELD(circ_successes);
3028 PB_FIELD(successful_circuits_closed);
3029 PB_FIELD(collapsed_circuits);
3030 PB_FIELD(unusable_circuits);
3031 PB_FIELD(timeouts);
3032 tor_free(pb);
3033#undef PB_FIELD
3034
3035 if (guard->extra_state_fields)
3036 smartlist_add_strdup(result, guard->extra_state_fields);
3037
3038 char *joined = smartlist_join_strings(result, " ", 0, NULL);
3039 SMARTLIST_FOREACH(result, char *, cp, tor_free(cp));
3040 smartlist_free(result);
3041
3042 return joined;
3043}
3044
3045/**
3046 * Extract key=val from the state string <b>s</b> and duplicate the value to
3047 * some string target declared in entry_guard_parse_from_state
3048 */
3049static void
3051 *extra, strmap_t *vals)
3052{
3053 smartlist_split_string(entries, s, " ",
3054 SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
3055
3056 SMARTLIST_FOREACH_BEGIN(entries, char *, entry) {
3057 const char *eq = strchr(entry, '=');
3058 if (!eq) {
3059 smartlist_add(extra, entry);
3060 continue;
3061 }
3062 char *key = tor_strndup(entry, eq-entry);
3063 char **target = strmap_get(vals, key);
3064 if (target == NULL || *target != NULL) {
3065 /* unrecognized or already set */
3066 smartlist_add(extra, entry);
3067 tor_free(key);
3068 continue;
3069 }
3070
3071 *target = tor_strdup(eq+1);
3072 tor_free(key);
3073 tor_free(entry);
3074 } SMARTLIST_FOREACH_END(entry);
3075}
3076
3077/**
3078 * Handle part of the parsing state file logic, focused on time related things
3079 */
3080static void
3081parse_from_state_handle_time(entry_guard_t *guard, char *sampled_on, char
3082 *unlisted_since, char *confirmed_on)
3083{
3084#define HANDLE_TIME(field) do { \
3085 if (field) { \
3086 int r = parse_iso_time_nospace(field, &field ## _time); \
3087 if (r < 0) { \
3088 log_warn(LD_CIRC, "Unable to parse %s %s from guard", \
3089 #field, escaped(field)); \
3090 field##_time = -1; \
3091 } \
3092 } \
3093 } while (0)
3094
3095 time_t sampled_on_time = 0;
3096 time_t unlisted_since_time = 0;
3097 time_t confirmed_on_time = 0;
3098
3099 HANDLE_TIME(sampled_on);
3100 HANDLE_TIME(unlisted_since);
3101 HANDLE_TIME(confirmed_on);
3102
3103 if (sampled_on_time <= 0)
3104 sampled_on_time = approx_time();
3105 if (unlisted_since_time < 0)
3106 unlisted_since_time = 0;
3107 if (confirmed_on_time < 0)
3108 confirmed_on_time = 0;
3109
3110 #undef HANDLE_TIME
3111
3112 guard->sampled_on_date = sampled_on_time;
3113 guard->unlisted_since_date = unlisted_since_time;
3114 guard->confirmed_on_date = confirmed_on_time;
3115}
3116
3117/**
3118 * Given a string generated by entry_guard_encode_for_state(), parse it
3119 * (if possible) and return an entry_guard_t object for it. Return NULL
3120 * on complete failure.
3121 */
3122STATIC entry_guard_t *
3124{
3125 /* Unrecognized entries get put in here. */
3126 smartlist_t *extra = smartlist_new();
3127
3128 /* These fields get parsed from the string. */
3129 char *in = NULL;
3130 char *rsa_id = NULL;
3131 char *nickname = NULL;
3132 char *sampled_on = NULL;
3133 char *sampled_idx = NULL;
3134 char *sampled_by = NULL;
3135 char *unlisted_since = NULL;
3136 char *listed = NULL;
3137 char *confirmed_on = NULL;
3138 char *confirmed_idx = NULL;
3139 char *bridge_addr = NULL;
3140
3141 // pathbias
3142 char *pb_use_attempts = NULL;
3143 char *pb_use_successes = NULL;
3144 char *pb_circ_attempts = NULL;
3145 char *pb_circ_successes = NULL;
3146 char *pb_successful_circuits_closed = NULL;
3147 char *pb_collapsed_circuits = NULL;
3148 char *pb_unusable_circuits = NULL;
3149 char *pb_timeouts = NULL;
3150 int invalid_sampled_idx = get_max_sample_size_absolute();
3151
3152 /* Split up the entries. Put the ones we know about in strings and the
3153 * rest in "extra". */
3154 {
3155 smartlist_t *entries = smartlist_new();
3156
3157 strmap_t *vals = strmap_new(); // Maps keyword to location
3158#define FIELD(f) \
3159 strmap_set(vals, #f, &f);
3160 FIELD(in);
3161 FIELD(rsa_id);
3162 FIELD(nickname);
3163 FIELD(sampled_on);
3164 FIELD(sampled_idx);
3165 FIELD(sampled_by);
3166 FIELD(unlisted_since);
3167 FIELD(listed);
3168 FIELD(confirmed_on);
3169 FIELD(confirmed_idx);
3170 FIELD(bridge_addr);
3171 FIELD(pb_use_attempts);
3172 FIELD(pb_use_successes);
3173 FIELD(pb_circ_attempts);
3174 FIELD(pb_circ_successes);
3175 FIELD(pb_successful_circuits_closed);
3176 FIELD(pb_collapsed_circuits);
3177 FIELD(pb_unusable_circuits);
3178 FIELD(pb_timeouts);
3179#undef FIELD
3180 /* Extract from s the key=val that we recognize, put the others in extra*/
3181 parse_from_state_set_vals(s, entries, extra, vals);
3182
3183 smartlist_free(entries);
3184 strmap_free(vals, NULL);
3185 }
3186
3187 entry_guard_t *guard = tor_malloc_zero(sizeof(entry_guard_t));
3188 guard->is_persistent = 1;
3189
3190 if (in == NULL) {
3191 log_warn(LD_CIRC, "Guard missing 'in' field");
3192 goto err;
3193 }
3194
3195 guard->selection_name = in;
3196 in = NULL;
3197
3198 if (rsa_id == NULL) {
3199 log_warn(LD_CIRC, "Guard missing RSA ID field");
3200 goto err;
3201 }
3202
3203 /* Process the identity and nickname. */
3204 if (base16_decode(guard->identity, sizeof(guard->identity),
3205 rsa_id, strlen(rsa_id)) != DIGEST_LEN) {
3206 log_warn(LD_CIRC, "Unable to decode guard identity %s", escaped(rsa_id));
3207 goto err;
3208 }
3209
3210 if (nickname) {
3211 strlcpy(guard->nickname, nickname, sizeof(guard->nickname));
3212 } else {
3213 guard->nickname[0]='$';
3214 base16_encode(guard->nickname+1, sizeof(guard->nickname)-1,
3215 guard->identity, DIGEST_LEN);
3216 }
3217
3218 if (bridge_addr) {
3219 tor_addr_port_t res;
3220 memset(&res, 0, sizeof(res));
3221 int r = tor_addr_port_parse(LOG_WARN, bridge_addr,
3222 &res.addr, &res.port, -1);
3223 if (r == 0)
3224 guard->bridge_addr = tor_memdup(&res, sizeof(res));
3225 /* On error, we already warned. */
3226 }
3227
3228 /* Process the various time fields. */
3229 parse_from_state_handle_time(guard, sampled_on, unlisted_since,
3230 confirmed_on);
3231
3232 /* Take sampled_by_version verbatim. */
3233 guard->sampled_by_version = sampled_by;
3234 sampled_by = NULL; /* prevent free */
3235 /* Listed is a boolean */
3236 if (listed && strcmp(listed, "0"))
3237 guard->currently_listed = 1;
3238
3239 /* The index is a nonnegative integer. */
3240 guard->confirmed_idx = -1;
3241 if (confirmed_idx) {
3242 int ok=1;
3243 long idx = tor_parse_long(confirmed_idx, 10, 0, INT_MAX, &ok, NULL);
3244 if (! ok) {
3245 log_warn(LD_GUARD, "Guard has invalid confirmed_idx %s",
3246 escaped(confirmed_idx));
3247 } else {
3248 guard->confirmed_idx = (int)idx;
3249 }
3250 }
3251
3252 if (sampled_idx) {
3253 int ok = 1;
3254 long idx = tor_parse_long(sampled_idx, 10, 0, INT_MAX, &ok, NULL);
3255 if (!ok) {
3256 log_warn(LD_GUARD, "Guard has invalid sampled_idx %s",
3257 escaped(sampled_idx));
3258 /* set it to a idx higher than the max sample size */
3259 guard->sampled_idx = invalid_sampled_idx++;
3260 } else {
3261 guard->sampled_idx = (int)idx;
3262 }
3263 } else if (confirmed_idx) {
3264 /* This state has been written by an older Tor version which did not have
3265 * sample ordering */
3266
3267 guard->sampled_idx = guard->confirmed_idx;
3268 } else {
3269 log_info(LD_GUARD, "The state file seems to be into a status that could"
3270 " yield to weird entry node selection: we're missing both a"
3271 " sampled_idx and a confirmed_idx.");
3272 guard->sampled_idx = invalid_sampled_idx++;
3273 }
3274
3275 /* Anything we didn't recognize gets crammed together */
3276 if (smartlist_len(extra) > 0) {
3277 guard->extra_state_fields = smartlist_join_strings(extra, " ", 0, NULL);
3278 }
3279
3280 /* initialize non-persistent fields */
3281 guard->is_reachable = GUARD_REACHABLE_MAYBE;
3282
3283#define PB_FIELD(field) \
3284 do { \
3285 if (pb_ ## field) { \
3286 int ok = 1; \
3287 double r = tor_parse_double(pb_ ## field, 0.0, 1e9, &ok, NULL); \
3288 if (! ok) { \
3289 log_warn(LD_CIRC, "Guard has invalid pb_%s %s", \
3290 #field, pb_ ## field); \
3291 } else { \
3292 guard->pb.field = r; \
3293 } \
3294 } \
3295 } while (0)
3296 PB_FIELD(use_attempts);
3297 PB_FIELD(use_successes);
3298 PB_FIELD(circ_attempts);
3299 PB_FIELD(circ_successes);
3300 PB_FIELD(successful_circuits_closed);
3301 PB_FIELD(collapsed_circuits);
3302 PB_FIELD(unusable_circuits);
3303 PB_FIELD(timeouts);
3304#undef PB_FIELD
3305
3308
3309 /* We update everything on this guard later, after we've parsed
3310 * everything. */
3311
3312 goto done;
3313
3314 err:
3315 // only consider it an error if the guard state was totally unparseable.
3316 entry_guard_free(guard);
3317 guard = NULL;
3318
3319 done:
3320 tor_free(in);
3321 tor_free(rsa_id);
3322 tor_free(nickname);
3323 tor_free(sampled_on);
3324 tor_free(sampled_by);
3325 tor_free(unlisted_since);
3326 tor_free(listed);
3327 tor_free(confirmed_on);
3328 tor_free(confirmed_idx);
3329 tor_free(sampled_idx);
3330 tor_free(bridge_addr);
3331 tor_free(pb_use_attempts);
3332 tor_free(pb_use_successes);
3333 tor_free(pb_circ_attempts);
3334 tor_free(pb_circ_successes);
3335 tor_free(pb_successful_circuits_closed);
3336 tor_free(pb_collapsed_circuits);
3337 tor_free(pb_unusable_circuits);
3338 tor_free(pb_timeouts);
3339
3340 SMARTLIST_FOREACH(extra, char *, cp, tor_free(cp));
3341 smartlist_free(extra);
3342
3343 return guard;
3344}
3345
3346/**
3347 * Replace the Guards entries in <b>state</b> with a list of all our sampled
3348 * guards.
3349 */
3350static void
3352{
3353 if (!guard_contexts)
3354 return;
3355 config_line_t *lines = NULL;
3356 config_line_t **nextline = &lines;
3357
3358 SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) {
3359 int i = 0;
3360 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
3361 if (guard->is_persistent == 0)
3362 continue;
3363 *nextline = tor_malloc_zero(sizeof(config_line_t));
3364 (*nextline)->key = tor_strdup("Guard");
3365 (*nextline)->value = entry_guard_encode_for_state(guard, i);
3366 nextline = &(*nextline)->next;
3367 i++;
3368 } SMARTLIST_FOREACH_END(guard);
3369 } SMARTLIST_FOREACH_END(gs);
3370
3371 config_free_lines(state->Guard);
3372 state->Guard = lines;
3373}
3374
3375/**
3376 * Replace our sampled guards from the Guards entries in <b>state</b>. Return 0
3377 * on success, -1 on failure. (If <b>set</b> is true, replace nothing -- only
3378 * check whether replacing would work.)
3379 */
3380static int
3382{
3383 const config_line_t *line = state->Guard;
3384 int n_errors = 0;
3385
3386 if (!guard_contexts)
3388
3389 /* Wipe all our existing guard info. (we shouldn't have any, but
3390 * let's be safe.) */
3391 if (set) {
3392 SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) {
3393 guard_selection_free(gs);
3394 if (curr_guard_context == gs)
3395 curr_guard_context = NULL;
3397 } SMARTLIST_FOREACH_END(gs);
3398 }
3399
3400 for ( ; line != NULL; line = line->next) {
3401 entry_guard_t *guard = entry_guard_parse_from_state(line->value);
3402 if (guard == NULL) {
3403 ++n_errors;
3404 continue;
3405 }
3406 tor_assert(guard->selection_name);
3407 if (!strcmp(guard->selection_name, "legacy")) {
3408 ++n_errors;
3409 entry_guard_free(guard);
3410 continue;
3411 }
3412
3413 if (set) {
3414 guard_selection_t *gs;
3415 gs = get_guard_selection_by_name(guard->selection_name,
3416 GS_TYPE_INFER, 1);
3417 tor_assert(gs);
3418 smartlist_add(gs->sampled_entry_guards, guard);
3419 guard->in_selection = gs;
3420 /* Recompute the next_sampled_id from the state. We do not assume that
3421 * sampled guards appear in the correct order within the file, and we
3422 * need to know what would be the next sampled idx to give to any
3423 * new sampled guard (i.e., max of guard->sampled_idx + 1)*/
3424 if (gs->next_sampled_idx <= guard->sampled_idx) {
3425 gs->next_sampled_idx = guard->sampled_idx + 1;
3426 }
3427
3428 } else {
3429 entry_guard_free(guard);
3430 }
3431 }
3432
3433 if (set) {
3434 SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) {
3435 /** Guards should be in sample order within the file, but it is maybe
3436 * better NOT to assume that. Let's order them before updating lists
3437 */
3438 smartlist_sort(gs->sampled_entry_guards, compare_guards_by_sampled_idx);
3440 } SMARTLIST_FOREACH_END(gs);
3441 }
3442 return n_errors ? -1 : 0;
3443}
3444
3445/** If <b>digest</b> matches the identity of any node in the
3446 * entry_guards list for the provided guard selection state,
3447 return that node. Else return NULL. */
3448entry_guard_t *
3450 const char *digest)
3451{
3452 return get_sampled_guard_with_id(gs, (const uint8_t*)digest);
3453}
3454
3455/** Return the node_t associated with a single entry_guard_t. May
3456 * return NULL if the guard is not currently in the consensus. */
3457const node_t *
3458entry_guard_find_node(const entry_guard_t *guard)
3459{
3460 tor_assert(guard);
3461 return node_get_by_id(guard->identity);
3462}
3463
3464/** If <b>digest</b> matches the identity of any node in the
3465 * entry_guards list for the default guard selection state,
3466 return that node. Else return NULL. */
3467entry_guard_t *
3473
3474/** We are about to connect to bridge with identity <b>digest</b> to fetch its
3475 * descriptor. Create a new guard state for this connection and return it. */
3476circuit_guard_state_t *
3478{
3479 circuit_guard_state_t *guard_state = NULL;
3480 entry_guard_t *guard = NULL;
3481
3483 get_guard_selection_info(), digest);
3484 if (!guard) {
3485 return NULL;
3486 }
3487
3488 /* Update the guard last_tried_to_connect time since it's checked by the
3489 * guard subsystem. */
3490 guard->last_tried_to_connect = approx_time();
3491
3492 /* Create the guard state */
3493 guard_state = circuit_guard_state_new(guard,
3494 GUARD_CIRC_STATE_USABLE_ON_COMPLETION,
3495 NULL);
3496
3497 return guard_state;
3498}
3499
3500/** Release all storage held by <b>e</b>. */
3501STATIC void
3502entry_guard_free_(entry_guard_t *e)
3503{
3504 if (!e)
3505 return;
3506 entry_guard_handles_clear(e);
3507 tor_free(e->sampled_by_version);
3508 tor_free(e->extra_state_fields);
3509 tor_free(e->selection_name);
3510 tor_free(e->bridge_addr);
3511 tor_free(e);
3512}
3513
3514/** Return 0 if we're fine adding arbitrary routers out of the
3515 * directory to our entry guard list, or return 1 if we have a
3516 * list already and we must stick to it.
3517 */
3518int
3520{
3521 // XXXX #21425 look at the current selection.
3522 if (options->EntryNodes)
3523 return 1;
3524 if (options->UseBridges)
3525 return 1;
3526 return 0;
3527}
3528
3529/** Return the number of bridges that have descriptors that are marked with
3530 * purpose 'bridge' and are running. If use_maybe_reachable is
3531 * true, include bridges that might be reachable in the count.
3532 * Otherwise, if it is false, only include bridges that have recently been
3533 * found running in the count.
3534 *
3535 * We use this function to decide if we're ready to start building
3536 * circuits through our bridges, or if we need to wait until the
3537 * directory "server/authority" requests finish. */
3538MOCK_IMPL(int,
3539num_bridges_usable,(int use_maybe_reachable))
3540{
3541 int n_options = 0;
3542
3543 if (BUG(!get_options()->UseBridges)) {
3544 return 0;
3545 }
3546 guard_selection_t *gs = get_guard_selection_info();
3547 if (BUG(gs->type != GS_TYPE_BRIDGE)) {
3548 return 0;
3549 }
3550
3551 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
3552 /* Not a bridge, or not one we are configured to be able to use. */
3553 if (! guard->is_filtered_guard)
3554 continue;
3555 /* Definitely not usable */
3556 if (guard->is_reachable == GUARD_REACHABLE_NO)
3557 continue;
3558 /* If we want to be really sure the bridges will work, skip maybes */
3559 if (!use_maybe_reachable && guard->is_reachable == GUARD_REACHABLE_MAYBE)
3560 continue;
3561 if (tor_digest_is_zero(guard->identity))
3562 continue;
3563 const node_t *node = node_get_by_id(guard->identity);
3564 if (node && node->ri)
3565 ++n_options;
3566 } SMARTLIST_FOREACH_END(guard);
3567
3568 return n_options;
3569}
3570
3571/** Check the pathbias use success count of <b>node</b> and disable it if it
3572 * goes over our thresholds. */
3573static void
3575{
3576 const or_options_t *options = get_options();
3577 const double EPSILON = 1.0e-9;
3578
3579 /* Note: We rely on the < comparison here to allow us to set a 0
3580 * rate and disable the feature entirely. If refactoring, don't
3581 * change to <= */
3582 if (node->pb.use_attempts > EPSILON &&
3583 pathbias_get_use_success_count(node)/node->pb.use_attempts
3584 < pathbias_get_extreme_use_rate(options) &&
3585 pathbias_get_dropguards(options)) {
3586 node->pb.path_bias_disabled = 1;
3587 log_info(LD_GENERAL,
3588 "Path use bias is too high (%f/%f); disabling node %s",
3589 node->pb.circ_successes, node->pb.circ_attempts,
3590 node->nickname);
3591 }
3592}
3593
3594/** Check the pathbias close count of <b>node</b> and disable it if it goes
3595 * over our thresholds. */
3596static void
3598{
3599 const or_options_t *options = get_options();
3600 const double EPSILON = 1.0e-9;
3601
3602 /* Note: We rely on the < comparison here to allow us to set a 0
3603 * rate and disable the feature entirely. If refactoring, don't
3604 * change to <= */
3605 if (node->pb.circ_attempts > EPSILON &&
3606 pathbias_get_close_success_count(node)/node->pb.circ_attempts
3607 < pathbias_get_extreme_rate(options) &&
3608 pathbias_get_dropguards(options)) {
3609 node->pb.path_bias_disabled = 1;
3610 log_info(LD_GENERAL,
3611 "Path bias is too high (%f/%f); disabling node %s",
3612 node->pb.circ_successes, node->pb.circ_attempts,
3613 node->nickname);
3614 }
3615}
3616
3617/** Parse <b>state</b> and learn about the entry guards it describes.
3618 * If <b>set</b> is true, and there are no errors, replace the guard
3619 * list in the default guard selection context with what we find.
3620 * On success, return 0. On failure, alloc into *<b>msg</b> a string
3621 * describing the error, and return -1.
3622 */
3623int
3624entry_guards_parse_state(or_state_t *state, int set, char **msg)
3625{
3627 int r1 = entry_guards_load_guards_from_state(state, set);
3629
3630 if (r1 < 0) {
3631 if (msg && *msg == NULL) {
3632 *msg = tor_strdup("parsing error");
3633 }
3634 return -1;
3635 }
3636 return 0;
3637}
3638
3639/** How long will we let a change in our guard nodes stay un-saved
3640 * when we are trying to avoid disk writes? */
3641#define SLOW_GUARD_STATE_FLUSH_TIME 600
3642/** How long will we let a change in our guard nodes stay un-saved
3643 * when we are not trying to avoid disk writes? */
3644#define FAST_GUARD_STATE_FLUSH_TIME 30
3645
3646/** Our list of entry guards has changed for a particular guard selection
3647 * context, or some element of one of our entry guards has changed for one.
3648 * Write the changes to disk within the next few minutes.
3649 */
3650void
3652{
3653 time_t when;
3654
3655 tor_assert(gs != NULL);
3656
3658
3659 if (get_options()->AvoidDiskWrites)
3660 when = time(NULL) + SLOW_GUARD_STATE_FLUSH_TIME;
3661 else
3662 when = time(NULL) + FAST_GUARD_STATE_FLUSH_TIME;
3663
3664 /* or_state_save() will call entry_guards_update_state() and
3665 entry_guards_update_guards_in_state()
3666 */
3668
3669 /* Schedule a re-assessment of whether we have enough dir info to
3670 * use the network. When we add or remove or disable or enable a
3671 * guard, the decision could shift. */
3673}
3674
3675/** Our list of entry guards has changed for the default guard selection
3676 * context, or some element of one of our entry guards has changed. Write
3677 * the changes to disk within the next few minutes.
3678 */
3679void
3684
3685/** If the entry guard info has not changed, do nothing and return.
3686 * Otherwise, free the EntryGuards piece of <b>state</b> and create
3687 * a new one out of the global entry_guards list, and then mark
3688 * <b>state</b> dirty so it will get saved to disk.
3689 */
3690void
3692{
3694
3695 // Handles all guard info.
3697
3699
3700 if (!get_options()->AvoidDiskWrites)
3703}
3704
3705/** Return true iff the circuit's guard can succeed, that is, can be used. */
3706int
3707entry_guard_could_succeed(const circuit_guard_state_t *guard_state)
3708{
3709 if (get_options()->UseEntryGuards == 0) {
3710 /* we're fine with this circuit's first hop, because we're not
3711 * configured to use entry guards. */
3712 return 1;
3713 }
3714
3715 if (!guard_state) {
3716 return 0;
3717 }
3718
3719 entry_guard_t *guard = entry_guard_handle_get(guard_state->guard);
3720 if (!guard || BUG(guard->in_selection == NULL)) {
3721 return 0;
3722 }
3723
3724 return 1;
3725}
3726
3727/**
3728 * Format a single entry guard in the format expected by the controller.
3729 * Return a newly allocated string.
3730 */
3731STATIC char *
3733{
3734 const char *status = NULL;
3735 time_t when = 0;
3736 const node_t *node;
3737 char tbuf[ISO_TIME_LEN+1];
3738 char nbuf[MAX_VERBOSE_NICKNAME_LEN+1];
3739
3740 /* This is going to be a bit tricky, since the status
3741 * codes weren't really intended for prop271 guards.
3742 *
3743 * XXXX use a more appropriate format for exporting this information
3744 */
3745 if (e->confirmed_idx < 0) {
3746 status = "never-connected";
3747 } else if (! e->currently_listed) {
3748 when = e->unlisted_since_date;
3749 status = "unusable";
3750 } else if (! e->is_filtered_guard) {
3751 status = "unusable";
3752 } else if (e->is_reachable == GUARD_REACHABLE_NO) {
3753 when = e->failing_since;
3754 status = "down";
3755 } else {
3756 status = "up";
3757 }
3758
3759 node = entry_guard_find_node(e);
3760 if (node) {
3761 node_get_verbose_nickname(node, nbuf);
3762 } else {
3763 nbuf[0] = '$';
3764 base16_encode(nbuf+1, sizeof(nbuf)-1, e->identity, DIGEST_LEN);
3765 /* e->nickname field is not very reliable if we don't know about
3766 * this router any longer; don't include it. */
3767 }
3768
3769 char *result = NULL;
3770 if (when) {
3771 format_iso_time(tbuf, when);
3772 tor_asprintf(&result, "%s %s %s\n", nbuf, status, tbuf);
3773 } else {
3774 tor_asprintf(&result, "%s %s\n", nbuf, status);
3775 }
3776 return result;
3777}
3778
3779/** If <b>question</b> is the string "entry-guards", then dump
3780 * to *<b>answer</b> a newly allocated string describing all of
3781 * the nodes in the global entry_guards list. See control-spec.txt
3782 * for details.
3783 * For backward compatibility, we also handle the string "helper-nodes".
3784 *
3785 * XXX this should be totally redesigned after prop 271 too, and that's
3786 * going to take some control spec work.
3787 * */
3788int
3790 const char *question, char **answer,
3791 const char **errmsg)
3792{
3793 guard_selection_t *gs = get_guard_selection_info();
3794
3795 tor_assert(gs != NULL);
3796
3797 (void) conn;
3798 (void) errmsg;
3799
3800 if (!strcmp(question,"entry-guards") ||
3801 !strcmp(question,"helper-nodes")) {
3802 const smartlist_t *guards;
3803 guards = gs->sampled_entry_guards;
3804
3805 smartlist_t *sl = smartlist_new();
3806
3807 SMARTLIST_FOREACH_BEGIN(guards, const entry_guard_t *, e) {
3809 smartlist_add(sl, cp);
3810 } SMARTLIST_FOREACH_END(e);
3811 *answer = smartlist_join_strings(sl, "", 0, NULL);
3812 SMARTLIST_FOREACH(sl, char *, c, tor_free(c));
3813 smartlist_free(sl);
3814 }
3815 return 0;
3816}
3817
3818/* Given the original bandwidth of a guard and its guardfraction,
3819 * calculate how much bandwidth the guard should have as a guard and
3820 * as a non-guard.
3821 *
3822 * Quoting from proposal236:
3823 *
3824 * Let Wpf denote the weight from the 'bandwidth-weights' line a
3825 * client would apply to N for position p if it had the guard
3826 * flag, Wpn the weight if it did not have the guard flag, and B the
3827 * measured bandwidth of N in the consensus. Then instead of choosing
3828 * N for position p proportionally to Wpf*B or Wpn*B, clients should
3829 * choose N proportionally to F*Wpf*B + (1-F)*Wpn*B.
3830 *
3831 * This function fills the <b>guardfraction_bw</b> structure. It sets
3832 * <b>guard_bw</b> to F*B and <b>non_guard_bw</b> to (1-F)*B.
3833 */
3834void
3835guard_get_guardfraction_bandwidth(guardfraction_bandwidth_t *guardfraction_bw,
3836 int orig_bandwidth,
3837 uint32_t guardfraction_percentage)
3838{
3839 double guardfraction_fraction;
3840
3841 /* Turn the percentage into a fraction. */
3842 tor_assert(guardfraction_percentage <= 100);
3843 guardfraction_fraction = guardfraction_percentage / 100.0;
3844
3845 long guard_bw = tor_lround(guardfraction_fraction * orig_bandwidth);
3846 tor_assert(guard_bw <= INT_MAX);
3847
3848 guardfraction_bw->guard_bw = (int) guard_bw;
3849
3850 guardfraction_bw->non_guard_bw = orig_bandwidth - (int) guard_bw;
3851}
3852
3853/** Helper: Update the status of all entry guards, in whatever algorithm
3854 * is used. Return true if we should stop using all previously generated
3855 * circuits, by calling circuit_mark_all_unused_circs() and
3856 * circuit_mark_all_dirty_circs_as_unusable().
3857 */
3858int
3860{
3861 int mark_circuits = 0;
3863 mark_circuits = 1;
3864
3866
3868 mark_circuits = 1;
3869
3870 return mark_circuits;
3871}
3872
3873/** Helper: pick a guard for a circuit, with whatever algorithm is
3874 used. */
3875const node_t *
3877 cpath_build_state_t *state,
3878 uint8_t purpose,
3879 circuit_guard_state_t **guard_state_out)
3880{
3881 const node_t *r = NULL;
3882 const uint8_t *exit_id = NULL;
3883 entry_guard_restriction_t *rst = NULL;
3884
3885 /* If we this is a conflux circuit, build an exclusion list for it. */
3886 if (CIRCUIT_IS_CONFLUX(TO_CIRCUIT(circ)) && state
3887 && (exit_id = build_state_get_exit_rsa_id(state))) {
3888 rst = guard_create_conflux_restriction(circ, exit_id);
3889 /* Don't allow connecting back to the exit if there is one */
3890 if (state && (exit_id = build_state_get_exit_rsa_id(state))) {
3891 /* add the exit_id to the excluded list */
3892 smartlist_add(rst->excluded, tor_memdup(exit_id, DIGEST_LEN));
3893 }
3894 } else if (state && !circuit_should_use_vanguards(purpose) &&
3895 (exit_id = build_state_get_exit_rsa_id(state))) {
3896 /* We're building to a targeted exit node, so that node can't be
3897 * chosen as our guard for this circuit, unless we're vanguards. */
3898 rst = guard_create_exit_restriction(exit_id);
3899 tor_assert(rst);
3900 }
3902 GUARD_USAGE_TRAFFIC,
3903 rst,
3904 &r,
3905 guard_state_out) < 0) {
3906 tor_assert(r == NULL);
3907 }
3908 return r;
3909}
3910
3911/** Remove all currently listed entry guards for a given guard selection
3912 * context. This frees and replaces <b>gs</b>, so don't use <b>gs</b>
3913 * after calling this function. */
3914void
3916{
3917 // This function shouldn't exist. XXXX
3918 tor_assert(gs != NULL);
3919 char *old_name = tor_strdup(gs->name);
3920 guard_selection_type_t old_type = gs->type;
3921
3922 SMARTLIST_FOREACH(gs->sampled_entry_guards, entry_guard_t *, entry, {
3923 control_event_guard(entry->nickname, entry->identity, "DROPPED");
3924 });
3925
3926 if (gs == curr_guard_context) {
3927 curr_guard_context = NULL;
3928 }
3929
3931 guard_selection_free(gs);
3932
3933 gs = get_guard_selection_by_name(old_name, old_type, 1);
3935 tor_free(old_name);
3936}
3937
3938/** Remove all currently listed entry guards, so new ones will be chosen.
3939 *
3940 * XXXX This function shouldn't exist -- it's meant to support the DROPGUARDS
3941 * command, which is deprecated.
3942 */
3943void
3948
3949/** Helper: pick a directory guard, with whatever algorithm is used. */
3950const node_t *
3951guards_choose_dirguard(uint8_t dir_purpose,
3952 circuit_guard_state_t **guard_state_out)
3953{
3954 const node_t *r = NULL;
3955 entry_guard_restriction_t *rst = NULL;
3956
3957 /* If we are fetching microdescs, don't query outdated dirservers. */
3958 if (dir_purpose == DIR_PURPOSE_FETCH_MICRODESC) {
3960 }
3961
3963 GUARD_USAGE_DIRGUARD,
3964 rst,
3965 &r,
3966 guard_state_out) < 0) {
3967 tor_assert(r == NULL);
3968 }
3969 return r;
3970}
3971
3972/**
3973 * If we're running with a constrained guard set, then maybe mark our guards
3974 * usable. Return 1 if we do; 0 if we don't.
3975 */
3976int
3978{
3979 if (! entry_list_is_constrained(options))
3980 return 0;
3981
3983
3984 return 1;
3985}
3986
3987/**
3988 * Check if we are missing any crucial dirinfo for the guard subsystem to
3989 * work. Return NULL if everything went well, otherwise return a newly
3990 * allocated string with an informative error message. In the latter case, use
3991 * the general descriptor information <b>using_mds</b>, <b>num_present</b> and
3992 * <b>num_usable</b> to improve the error message. */
3993char *
3995 int using_mds,
3996 int num_present, int num_usable)
3997{
3998 if (!gs->primary_guards_up_to_date)
4000
4001 char *ret_str = NULL;
4002 int n_missing_descriptors = 0;
4003 int n_considered = 0;
4004 int num_primary_to_check;
4005
4006 /* We want to check for the descriptor of at least the first two primary
4007 * guards in our list, since these are the guards that we typically use for
4008 * circuits. */
4009 num_primary_to_check = get_n_primary_guards_to_use(GUARD_USAGE_TRAFFIC);
4010 num_primary_to_check++;
4011
4012 SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, guard) {
4014 if (guard->is_reachable == GUARD_REACHABLE_NO)
4015 continue;
4016 n_considered++;
4017 if (!guard_has_descriptor(guard))
4018 n_missing_descriptors++;
4019 if (n_considered >= num_primary_to_check)
4020 break;
4021 } SMARTLIST_FOREACH_END(guard);
4022
4023 /* If we are not missing any descriptors, return NULL. */
4024 if (!n_missing_descriptors) {
4025 return NULL;
4026 }
4027
4028 /* otherwise return a helpful error string */
4029 tor_asprintf(&ret_str, "We're missing descriptors for %d/%d of our "
4030 "primary entry guards (total %sdescriptors: %d/%d). "
4031 "That's ok. We will try to fetch missing descriptors soon.",
4032 n_missing_descriptors, num_primary_to_check,
4033 using_mds?"micro":"", num_present, num_usable);
4034
4035 return ret_str;
4036}
4037
4038/** As guard_selection_have_enough_dir_info_to_build_circuits, but uses
4039 * the default guard selection. */
4040char *
4042 int num_present, int num_usable)
4043{
4046 using_mds,
4047 num_present, num_usable);
4048}
4049
4050/** Free one guard selection context */
4051STATIC void
4052guard_selection_free_(guard_selection_t *gs)
4053{
4054 if (!gs) return;
4055
4056 tor_free(gs->name);
4057
4058 if (gs->sampled_entry_guards) {
4059 SMARTLIST_FOREACH(gs->sampled_entry_guards, entry_guard_t *, e,
4060 entry_guard_free(e));
4061 smartlist_free(gs->sampled_entry_guards);
4062 gs->sampled_entry_guards = NULL;
4063 }
4064
4065 smartlist_free(gs->confirmed_entry_guards);
4066 smartlist_free(gs->primary_entry_guards);
4067
4068 tor_free(gs);
4069}
4070
4071/**********************************************************************/
4072
4073/** Layer2 guard subsystem (vanguards-lite) used for onion service circuits */
4074
4075/** A simple representation of a layer2 guard. We just need its identity so
4076 * that we feed it into a routerset, and a sampled timestamp to do expiration
4077 * checks. */
4078typedef struct layer2_guard_t {
4079 /** Identity of the guard */
4081 /** When does this guard expire? (randomized timestamp) */
4084
4085#define layer2_guard_free(val) \
4086 FREE_AND_NULL(layer2_guard_t, layer2_guard_free_, (val))
4087
4088/** Return true if the vanguards-lite subsystem is enabled */
4089bool
4091{
4092 /* First check torrc option and then maybe also the consensus parameter. */
4093 const or_options_t *options = get_options();
4094
4095 /* If the option is explicitly disabled, that's the final word here */
4096 if (options->VanguardsLiteEnabled == 0) {
4097 return false;
4098 }
4099
4100 /* If the option is set to auto, then check the consensus parameter */
4101 if (options->VanguardsLiteEnabled == -1) {
4102 return networkstatus_get_param(NULL, "vanguards-lite-enabled",
4103 1, /* default to "on" */
4104 0, 1);
4105 }
4106
4107 /* else it's enabled */
4108 tor_assert_nonfatal(options->VanguardsLiteEnabled == 1);
4109 return options->VanguardsLiteEnabled;
4110}
4111
4112static void
4113layer2_guard_free_(layer2_guard_t *l2)
4114{
4115 if (!l2) {
4116 return;
4117 }
4118
4119 tor_free(l2);
4120}
4121
4122/** Global list and routerset of L2 guards. They are both synced and they get
4123 * updated periodically. We need both the list and the routerset: we use the
4124 * smartlist to keep track of expiration times and the routerset is what we
4125 * return to the users of this subsystem. */
4127static routerset_t *layer2_routerset = NULL;
4128
4129/** Number of L2 guards */
4130#define NUMBER_SECOND_GUARDS 4
4131/** Make sure that the number of L2 guards is less than the number of
4132 * MAX_SANE_RESTRICTED_NODES */
4134
4135/** Lifetime of L2 guards:
4136 * 1 to 12 days, for an average of a week using the max(x,x) distribution */
4137#define MIN_SECOND_GUARD_LIFETIME (3600*24)
4138#define MAX_SECOND_GUARD_LIFETIME (3600*24*12)
4139
4140/** Return the number of guards our L2 guardset should have */
4141static int
4143{
4144 return (int) networkstatus_get_param(NULL,
4145 "guard-hs-l2-number",
4147 1, 19);
4148}
4149
4150/** Return the minimum lifetime of L2 guards */
4151static int
4153{
4154 return (int) networkstatus_get_param(NULL,
4155 "guard-hs-l2-lifetime-min",
4157 1, INT32_MAX);
4158}
4159
4160/** Return the maximum lifetime of L2 guards */
4161static int
4163{
4164 return (int) networkstatus_get_param(NULL,
4165 "guard-hs-l2-lifetime-max",
4166 MAX_SECOND_GUARD_LIFETIME,
4167 1, INT32_MAX);
4168}
4169
4170/**
4171 * Sample and return a lifetime for an L2 guard.
4172 *
4173 * Lifetime randomized uniformly between min and max consensus params.
4174 */
4175static int
4177{
4180
4181 if (BUG(min >= max)) {
4182 return min;
4183 }
4184
4185 return crypto_rand_int_range(min, max);
4186}
4187
4188/** Maintain the L2 guard list. Make sure the list contains enough guards, do
4189 * expirations as necessary, and keep all the data structures of this
4190 * subsystem synchronized */
4191void
4193{
4195 return;
4196 }
4197
4198 /* Create the list if it doesn't exist */
4199 if (!layer2_guards) {
4201 }
4202
4203 /* Go through the list and perform any needed expirations */
4205 /* Expire based on expiration date */
4206 if (g->expire_on_date <= approx_time()) {
4207 log_info(LD_GENERAL, "Removing expired Layer2 guard %s",
4208 safe_str_client(hex_str(g->identity, DIGEST_LEN)));
4209 // Nickname may be gone from consensus and doesn't matter anyway
4210 control_event_guard("None", g->identity, "BAD_L2");
4211 layer2_guard_free(g);
4213 continue;
4214 }
4215
4216 /* Expire if relay has left consensus */
4217 const routerstatus_t *rs = router_get_consensus_status_by_id(g->identity);
4218 if (rs == NULL || !rs->is_stable || !rs->is_fast) {
4219 log_info(LD_GENERAL, "Removing %s Layer2 guard %s",
4220 rs ? "unsuitable" : "missing",
4221 safe_str_client(hex_str(g->identity, DIGEST_LEN)));
4222 // Nickname may be gone from consensus and doesn't matter anyway
4223 control_event_guard("None", g->identity, "BAD_L2");
4224 layer2_guard_free(g);
4226 continue;
4227 }
4228 } SMARTLIST_FOREACH_END(g);
4229
4230 /* Find out how many guards we need to add */
4231 int new_guards_needed_n =
4233 if (new_guards_needed_n <= 0) {
4234 return;
4235 }
4236
4237 log_info(LD_GENERAL, "Adding %d guards to Layer2 routerset",
4238 new_guards_needed_n);
4239
4240 /* First gather the exclusions based on our current L2 guards */
4241 smartlist_t *excluded = smartlist_new();
4243 /* Exclude existing L2 guard so that we don't double-pick it.
4244 * But, it's ok if they come from the same family. */
4245 const node_t *existing = node_get_by_id(g->identity);
4246 if (existing)
4247 smartlist_add(excluded, (node_t *)existing);
4248 } SMARTLIST_FOREACH_END(g);
4249
4250 /* Add required guards to the list */
4251 for (int i = 0; i < new_guards_needed_n; i++) {
4252 const node_t *choice = NULL;
4253 const or_options_t *options = get_options();
4254 /* Pick Stable nodes */
4255 router_crn_flags_t flags = CRN_NEED_DESC|CRN_NEED_UPTIME;
4256 choice = router_choose_random_node(excluded, options->ExcludeNodes, flags);
4257 if (!choice) {
4258 break;
4259 }
4260
4261 /* We found our node: create an L2 guard out of it */
4262 layer2_guard_t *layer2_guard = tor_malloc_zero(sizeof(layer2_guard_t));
4263 memcpy(layer2_guard->identity, choice->identity, DIGEST_LEN);
4264 layer2_guard->expire_on_date = approx_time() +
4266 smartlist_add(layer2_guards, layer2_guard);
4267 log_info(LD_GENERAL, "Adding Layer2 guard %s",
4268 safe_str_client(hex_str(layer2_guard->identity, DIGEST_LEN)));
4269 // Nickname can also be None here because it is looked up later
4270 control_event_guard("None", layer2_guard->identity,
4271 "GOOD_L2");
4272 /* Exclude this node so that we don't double-pick it. (Again, coming
4273 * from the same family is ok here.) */
4274 smartlist_add(excluded, (node_t *)choice);
4275 }
4276
4277 /* Some cleanup */
4278 smartlist_free(excluded);
4279
4280 /* Now that the list is up to date, synchronize the routerset */
4281 routerset_free(layer2_routerset);
4282 layer2_routerset = routerset_new();
4283
4285 routerset_parse(layer2_routerset,
4286 hex_str(g->identity, DIGEST_LEN),
4287 "l2 guards");
4288 } SMARTLIST_FOREACH_END(g);
4289}
4290
4291/**
4292 * Reset vanguards-lite list(s).
4293 *
4294 * Used for SIGNAL NEWNYM.
4295 */
4296void
4298{
4299 if (!layer2_guards)
4300 return;
4301
4302 /* Go through the list and perform any needed expirations */
4304 layer2_guard_free(g);
4305 } SMARTLIST_FOREACH_END(g);
4306
4308
4309 /* Pick new l2 guards */
4311}
4312
4313/** Return a routerset containing the L2 guards or NULL if it's not yet
4314 * initialized. Callers must not free the routerset. Designed for use in
4315 * pick_vanguard_middle_node() and should not be used anywhere else. Do not
4316 * store this pointer -- any future calls to maintain_layer2_guards() and
4317 * purge_vanguards_lite() can invalidate it. */
4318const routerset_t *
4320{
4321 if (!layer2_guards) {
4323 }
4324
4325 return layer2_routerset;
4326}
4327
4328/*****************************************************************************/
4329
4330/** Release all storage held by the list of entry guards and related
4331 * memory structs. */
4332void
4334{
4335 /* Null out the default */
4336 curr_guard_context = NULL;
4337 /* Free all the guard contexts */
4338 if (guard_contexts != NULL) {
4339 SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) {
4340 guard_selection_free(gs);
4341 } SMARTLIST_FOREACH_END(gs);
4342 smartlist_free(guard_contexts);
4343 guard_contexts = NULL;
4344 }
4346
4347 if (!layer2_guards) {
4348 return;
4349 }
4350
4352 layer2_guard_free(g);
4353 } SMARTLIST_FOREACH_END(g);
4354
4355 smartlist_free(layer2_guards);
4356 routerset_free(layer2_routerset);
4357}
int tor_addr_port_parse(int severity, const char *addrport, tor_addr_t *address_out, uint16_t *port_out, int default_port)
Definition address.c:1857
int tor_addr_port_eq(const tor_addr_port_t *a, const tor_addr_port_t *b)
Definition address.c:2111
#define fmt_and_decorate_addr(a)
Definition address.h:243
time_t approx_time(void)
Definition approx_time.c:32
const char * hex_str(const char *from, size_t fromlen)
Definition binascii.c:34
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
download_status_t * get_bridge_dl_status_by_id(const char *digest)
Definition bridges.c:1067
const uint8_t * bridge_get_rsa_id_digest(const bridge_info_t *bridge)
Definition bridges.c:182
int node_is_a_configured_bridge(const node_t *node)
Definition bridges.c:391
const tor_addr_port_t * bridge_get_addr_port(const bridge_info_t *bridge)
Definition bridges.c:196
const smartlist_t * bridge_list_get(void)
Definition bridges.c:135
bridge_info_t * get_configured_bridge_by_exact_addr_port_digest(const tor_addr_t *addr, uint16_t port, const char *digest)
Definition bridges.c:283
Header file for circuitbuild.c.
Header file for channel.c.
double pathbias_get_extreme_use_rate(const or_options_t *options)
double pathbias_get_extreme_rate(const or_options_t *options)
double pathbias_get_use_success_count(entry_guard_t *guard)
int pathbias_get_dropguards(const or_options_t *options)
double pathbias_get_close_success_count(entry_guard_t *guard)
circuit_guard_state_t * origin_circuit_get_guard_state(origin_circuit_t *circ)
const uint8_t * build_state_get_exit_rsa_id(cpath_build_state_t *state)
Header file for circuitbuild.c.
origin_circuit_t * TO_ORIGIN_CIRCUIT(circuit_t *x)
void circuit_get_all_pending_on_channel(smartlist_t *out, channel_t *chan)
Header file for circuitlist.c.
#define CIRCUIT_IS_ORIGIN(c)
#define EPSILON
void circuit_build_times_free_timeouts(circuit_build_times_t *cbt)
circuit_build_times_t * get_circuit_build_times_mutable(void)
Header file for circuitstats.c.
int circuit_should_use_vanguards(uint8_t purpose)
Header file for circuituse.c.
#define ARRAY_LENGTH(x)
const char * name
Definition config.c:2472
const or_options_t * get_options(void)
Definition config.c:948
Header file for config.c.
Header for confline.c.
void conflux_add_guards_to_exclude_list(const origin_circuit_t *orig_circ, smartlist_t *excluded)
Header file for conflux_pool.c.
Header file for conflux_util.c.
Header for confmgt.c.
Header file for connection.c.
int control_event_guard(const char *nickname, const char *digest, const char *status)
Header file for control_events.c.
#define HEX_DIGEST_LEN
void * smartlist_choose(const smartlist_t *sl)
Common functions for using (pseudo-)random number generators.
time_t crypto_rand_time_range(time_t min, time_t max)
int crypto_rand_int_range(unsigned int min, unsigned int max)
const char * node_describe(const node_t *node)
Definition describe.c:160
Header file for describe.c.
int tor_memeq(const void *a, const void *b, size_t sz)
Definition di_ops.c:107
#define tor_memneq(a, b, sz)
Definition di_ops.h:21
#define DIGEST_LEN
void digestset_add(digestset_t *set, const char *digest)
Definition digestset.c:44
digestset_t * digestset_new(int max_guess)
Definition digestset.c:30
int digestset_probably_contains(const digestset_t *set, const char *digest)
Definition digestset.c:54
Types to handle sets of digests, based on bloom filters.
Header file for directory.c.
#define DIR_PURPOSE_FETCH_MICRODESC
Definition directory.h:65
void download_status_reset(download_status_t *dls)
Definition dlstatus.c:363
Header file for dlstatus.c.
void entry_guard_failed(circuit_guard_state_t **guard_state_p)
char * guard_selection_get_err_str_if_dir_info_missing(guard_selection_t *gs, int using_mds, int num_present, int num_usable)
STATIC int get_n_primary_guards(void)
Definition entrynodes.c:465
const node_t * entry_guard_find_node(const entry_guard_t *guard)
void entry_guard_learned_bridge_identity(const tor_addr_port_t *addrport, const uint8_t *rsa_id_digest)
Definition entrynodes.c:977
STATIC void entry_guards_update_primary(guard_selection_t *gs)
static entry_guard_t * entry_guard_add_to_sample_impl(guard_selection_t *gs, const uint8_t *rsa_id_digest, const char *nickname, const tor_addr_port_t *bridge_addrport)
Definition entrynodes.c:887
void entry_guard_chan_failed(channel_t *chan)
static void entry_guards_update_guards_in_state(or_state_t *state)
const routerset_t * get_layer2_guards(void)
void entry_guards_changed(void)
static int guard_obeys_md_dirserver_restriction(const entry_guard_t *guard)
STATIC void entry_guards_note_guard_failure(guard_selection_t *gs, entry_guard_t *guard)
STATIC void guard_selection_free_(guard_selection_t *gs)
STATIC guard_selection_t * guard_selection_new(const char *name, guard_selection_type_t type)
Definition entrynodes.c:240
void remove_all_entry_guards(void)
STATIC guard_selection_t * get_guard_selection_by_name(const char *name, guard_selection_type_t type, int create_if_absent)
Definition entrynodes.c:263
void purge_vanguards_lite(void)
static int reasonably_live_consensus_is_missing(const guard_selection_t *gs)
static void entry_guard_set_filtered_flags(const or_options_t *options, guard_selection_t *gs, entry_guard_t *guard)
STATIC double get_meaningful_restriction_threshold(void)
Definition entrynodes.c:549
STATIC guard_selection_type_t guard_selection_infer_type(guard_selection_type_t type, const char *name)
Definition entrynodes.c:222
void entry_guard_cancel(circuit_guard_state_t **guard_state_p)
static entry_guard_t * select_and_add_guard_item_for_sample(guard_selection_t *gs, smartlist_t *eligible_guards)
STATIC int get_nonprimary_guard_idle_timeout(void)
Definition entrynodes.c:537
static entry_guard_t * select_primary_guard_for_circuit(guard_selection_t *gs, guard_usage_t usage, const entry_guard_restriction_t *rst, unsigned *state_out)
entry_guard_t * entry_guard_get_by_id_digest(const char *digest)
STATIC void mark_primary_guards_maybe_reachable(guard_selection_t *gs)
Definition entrynodes.c:604
int entry_guards_upgrade_waiting_circuits(guard_selection_t *gs, const smartlist_t *all_circuits_in, smartlist_t *newly_complete_out)
#define NUMBER_SECOND_GUARDS
static guard_selection_t * curr_guard_context
Definition entrynodes.c:161
static void remove_guard_from_confirmed_and_primary_lists(guard_selection_t *gs, entry_guard_t *guard)
void remove_all_entry_guards_for_guard_selection(guard_selection_t *gs)
int num_bridges_usable(int use_maybe_reachable)
#define MIN_GUARDS_FOR_MD_RESTRICTION
static int guard_has_descriptor(const entry_guard_t *guard)
Definition entrynodes.c:209
STATIC double get_extreme_restriction_threshold(void)
Definition entrynodes.c:562
int entry_guards_update_all(guard_selection_t *gs)
static smartlist_t * layer2_guards
STATIC circuit_guard_state_t * circuit_guard_state_new(entry_guard_t *guard, unsigned state, entry_guard_restriction_t *rst)
STATIC entry_guard_t * first_reachable_filtered_entry_guard(guard_selection_t *gs, const entry_guard_restriction_t *rst, unsigned flags)
static entry_guard_t * get_sampled_guard_for_bridge(guard_selection_t *gs, const bridge_info_t *bridge)
Definition entrynodes.c:816
STATIC int get_min_filtered_sample_size(void)
Definition entrynodes.c:403
static int get_number_of_layer2_hs_guards(void)
static int guard_in_node_family(const entry_guard_t *guard, const node_t *node)
static size_t sampled_guards_update_consensus_presence(guard_selection_t *gs)
static int should_set_md_dirserver_restriction(void)
STATIC void entry_guard_free_(entry_guard_t *e)
STATIC void entry_guard_restriction_free_(entry_guard_restriction_t *rst)
int entry_list_is_constrained(const or_options_t *options)
STATIC int get_guard_confirmed_min_lifetime(void)
Definition entrynodes.c:451
guard_usable_t entry_guard_succeeded(circuit_guard_state_t **guard_state_p)
circuit_guard_state_t * get_guard_state_for_bridge_desc_fetch(const char *digest)
static entry_guard_t * select_confirmed_guard_for_circuit(guard_selection_t *gs, guard_usage_t usage, const entry_guard_restriction_t *rst, unsigned *state_out)
static size_t sampled_guards_prune_obsolete_entries(guard_selection_t *gs, const time_t remove_if_unlisted_since, const time_t maybe_remove_if_sampled_before, const time_t remove_if_confirmed_before)
STATIC int entry_guard_has_higher_priority(entry_guard_t *a, entry_guard_t *b)
void entry_guards_note_internet_connectivity(guard_selection_t *gs)
const char * entry_guard_get_rsa_id_digest(const entry_guard_t *guard)
Definition entrynodes.c:336
char * entry_guards_get_err_str_if_dir_info_missing(int using_mds, int num_present, int num_usable)
STATIC void entry_guards_update_confirmed(guard_selection_t *gs)
STATIC char * entry_guard_encode_for_state(entry_guard_t *guard, int dense_sampled_idx)
STATIC void entry_guards_update_filtered_sets(guard_selection_t *gs)
void entry_guards_update_state(or_state_t *state)
bool vanguards_lite_is_enabled(void)
static void pathbias_check_close_success_count(entry_guard_t *guard)
static int get_layer2_hs_guard_lifetime(void)
int update_guard_selection_choice(const or_options_t *options)
Definition entrynodes.c:742
STATIC entry_guard_restriction_t * guard_create_dirserver_md_restriction(void)
static bool entry_guard_restriction_is_reachability(const entry_guard_restriction_t *rst)
static int compare_guards_by_sampled_idx(const void **a_, const void **b_)
void circuit_guard_state_free_(circuit_guard_state_t *state)
int entry_guard_pick_for_circuit(guard_selection_t *gs, guard_usage_t usage, entry_guard_restriction_t *rst, const node_t **chosen_node_out, circuit_guard_state_t **guard_state_out)
STATIC int get_remove_unlisted_guards_after_days(void)
Definition entrynodes.c:413
static void create_initial_guard_context(void)
Definition entrynodes.c:290
STATIC int get_max_sample_size_absolute(void)
Definition entrynodes.c:393
STATIC int get_nonprimary_guard_connect_timeout(void)
Definition entrynodes.c:525
void maintain_layer2_guards(void)
static void parse_from_state_handle_time(entry_guard_t *guard, char *sampled_on, char *unlisted_since, char *confirmed_on)
STATIC entry_guard_t * get_sampled_guard_with_id(guard_selection_t *gs, const uint8_t *rsa_id)
Definition entrynodes.c:801
int entry_guards_parse_state(or_state_t *state, int set, char **msg)
STATIC unsigned entry_guards_note_guard_success(guard_selection_t *gs, entry_guard_t *guard, unsigned old_state)
static int entry_guard_obeys_restriction(const entry_guard_t *guard, const entry_guard_restriction_t *rst)
int entry_guard_state_should_expire(circuit_guard_state_t *guard_state)
guard_pathbias_t * entry_guard_get_pathbias_state(entry_guard_t *guard)
Definition entrynodes.c:343
const node_t * guards_choose_guard(const origin_circuit_t *circ, cpath_build_state_t *state, uint8_t purpose, circuit_guard_state_t **guard_state_out)
int entry_guard_could_succeed(const circuit_guard_state_t *guard_state)
static entry_guard_t * entry_guard_add_bridge_to_sample(guard_selection_t *gs, const bridge_info_t *bridge)
Definition entrynodes.c:939
static void pathbias_check_use_success_count(entry_guard_t *guard)
int guards_retry_optimistic(const or_options_t *options)
STATIC int entry_guard_is_listed(guard_selection_t *gs, const entry_guard_t *guard)
const node_t * guards_choose_dirguard(uint8_t dir_purpose, circuit_guard_state_t **guard_state_out)
static entry_guard_t * select_filtered_guard_for_circuit(guard_selection_t *gs, guard_usage_t usage, const entry_guard_restriction_t *rst, unsigned *state_out)
static smartlist_t * get_eligible_guards(const or_options_t *options, guard_selection_t *gs, int *n_guards_out)
STATIC void entry_guard_consider_retry(entry_guard_t *guard)
static int entry_guard_passes_filter(const or_options_t *options, guard_selection_t *gs, entry_guard_t *guard)
#define SLOW_GUARD_STATE_FLUSH_TIME
STATIC double get_max_sample_threshold(void)
Definition entrynodes.c:381
int should_apply_guardfraction(const networkstatus_t *ns)
Definition entrynodes.c:189
void entry_guards_changed_for_guard_selection(guard_selection_t *gs)
STATIC entry_guard_t * entry_guard_add_to_sample(guard_selection_t *gs, const node_t *node)
Definition entrynodes.c:864
static int get_min_lifetime_of_layer2_hs_guards(void)
static int bridge_passes_guard_filter(const or_options_t *options, const bridge_info_t *bridge)
static entry_guard_t * get_sampled_guard_by_bridge_addr(guard_selection_t *gs, const tor_addr_port_t *addrport)
Definition entrynodes.c:959
static smartlist_t * guard_contexts
Definition entrynodes.c:159
STATIC int num_reachable_filtered_guards(const guard_selection_t *gs, const entry_guard_restriction_t *rst)
static int have_sampled_guard_with_id(guard_selection_t *gs, const uint8_t *rsa_id)
Definition entrynodes.c:853
STATIC int entry_guards_all_primary_guards_are_down(guard_selection_t *gs)
STATIC time_t randomize_time(time_t now, time_t max_backdate)
Definition entrynodes.c:355
static time_t get_remove_unlisted_guards_after_seconds(void)
Definition entrynodes.c:426
STATIC int get_n_primary_guards_to_use(guard_usage_t usage)
Definition entrynodes.c:485
STATIC const char * choose_guard_selection(const or_options_t *options, const networkstatus_t *live_ns, const guard_selection_t *old_selection, guard_selection_type_t *type_out)
Definition entrynodes.c:636
static int get_retry_schedule(time_t failing_since, time_t now, int is_primary)
static int entry_guards_load_guards_from_state(or_state_t *state, int set)
STATIC char * getinfo_helper_format_single_entry_guard(const entry_guard_t *e)
#define FAST_GUARD_STATE_FLUSH_TIME
static int node_is_possible_guard(const node_t *node)
Definition entrynodes.c:783
#define MIN_SECOND_GUARD_LIFETIME
STATIC void make_guard_confirmed(guard_selection_t *gs, entry_guard_t *guard)
static int circ_state_has_higher_priority(origin_circuit_t *a, const entry_guard_restriction_t *rst, origin_circuit_t *b)
int getinfo_helper_entry_guards(control_connection_t *conn, const char *question, char **answer, const char **errmsg)
guard_selection_t * get_guard_selection_info(void)
Definition entrynodes.c:312
STATIC entry_guard_t * entry_guard_parse_from_state(const char *s)
STATIC entry_guard_t * select_entry_guard_for_circuit(guard_selection_t *gs, guard_usage_t usage, const entry_guard_restriction_t *rst, unsigned *state_out)
STATIC int get_guard_lifetime(void)
Definition entrynodes.c:436
static int get_max_lifetime_of_layer2_hs_guards(void)
static void parse_from_state_set_vals(const char *s, smartlist_t *entries, smartlist_t *extra, strmap_t *vals)
static int get_max_sample_size(guard_selection_t *gs, int n_guards)
int guards_update_all(void)
CTASSERT(NUMBER_SECOND_GUARDS< 20)
STATIC void sampled_guards_update_from_consensus(guard_selection_t *gs)
entry_guard_t * entry_guard_get_by_id_digest_for_guard_selection(guard_selection_t *gs, const char *digest)
static bridge_info_t * get_bridge_info_for_guard(const entry_guard_t *guard)
Definition entrynodes.c:834
static int entry_guards_dirty
Definition entrynodes.c:165
const char * entry_guard_describe(const entry_guard_t *guard)
Definition entrynodes.c:324
STATIC entry_guard_t * entry_guards_expand_sample(guard_selection_t *gs)
static int node_passes_guard_filter(const or_options_t *options, const node_t *node)
void entry_guards_free_all(void)
STATIC int get_internet_likely_down_interval(void)
Definition entrynodes.c:513
Header file for circuitbuild.c.
guard_usage_t
Definition entrynodes.h:379
const char * escaped(const char *s)
Definition escape.c:126
long tor_lround(double d)
Definition fp.c:31
Header for fp.c.
#define log_fn_ratelim(ratelim, severity, domain, args,...)
Definition log.h:288
#define LD_BUG
Definition log.h:86
#define LD_GUARD
Definition log.h:109
#define LD_GENERAL
Definition log.h:62
#define LOG_NOTICE
Definition log.h:50
#define LD_CIRC
Definition log.h:82
#define LOG_WARN
Definition log.h:53
#define bool_eq(a, b)
Definition logic.h:16
Header file for mainloop.c.
#define tor_free(p)
Definition malloc.h:56
int usable_consensus_flavor(void)
Definition microdesc.c:1088
int microdesc_relay_is_outdated_dirserver(const char *relay_digest)
Definition microdesc.c:163
Header file for microdesc.c.
networkstatus_t * networkstatus_get_reasonably_live_consensus(time_t now, int flavor)
const routerstatus_t * router_get_consensus_status_by_id(const char *digest)
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.
int is_legal_nickname(const char *s)
Definition nickname.c:19
Header file for nickname.c.
const node_t * router_choose_random_node(smartlist_t *excludedsmartlist, routerset_t *excludedset, router_crn_flags_t flags)
const node_t * node_sl_choose_by_bandwidth(const smartlist_t *sl, bandwidth_weight_rule_t rule)
Header file for node_select.c.
router_crn_flags_t
Definition node_select.h:16
Node information structure.
const node_t * node_get_by_id(const char *identity_digest)
Definition nodelist.c:226
void router_dir_info_changed(void)
Definition nodelist.c:2526
const smartlist_t * nodelist_get_list(void)
Definition nodelist.c:1072
int router_addrs_in_same_network(const tor_addr_t *a1, const tor_addr_t *a2)
Definition nodelist.c:2096
int node_has_preferred_descriptor(const node_t *node, int for_direct_connect)
Definition nodelist.c:1534
const char * node_get_nickname(const node_t *node)
Definition nodelist.c:1484
int node_is_dir(const node_t *node)
Definition nodelist.c:1498
void node_get_addr(const node_t *node, tor_addr_t *addr_out)
Definition nodelist.c:1706
void node_get_verbose_nickname(const node_t *node, char *verbose_name_out)
Definition nodelist.c:1567
int nodes_in_same_family(const node_t *node1, const node_t *node2)
Definition nodelist.c:2230
int router_have_minimum_dir_info(void)
Definition nodelist.c:2483
Header file for nodelist.c.
Master header file for Tor-specific functionality.
#define TO_CIRCUIT(x)
Definition or.h:951
#define MAX_VERBOSE_NICKNAME_LEN
Definition or.h:118
The or_state_t structure, which represents Tor's state file.
Origin circuit structure.
long tor_parse_long(const char *s, int base, long min, long max, int *ok, char **next)
Definition parse_int.c:59
int reachable_addr_allows_addr(const tor_addr_t *addr, uint16_t port, firewall_connection_t fw_connection, int pref_only, int pref_ipv6)
Definition policies.c:536
int reachable_addr_allows_node(const node_t *node, firewall_connection_t fw_connection, int pref_only)
Definition policies.c:693
Header file for policies.c.
int tor_asprintf(char **strp, const char *fmt,...)
Definition printf.c:75
int tor_snprintf(char *str, size_t size, const char *format,...)
Definition printf.c:27
int router_digest_is_me(const char *digest)
Definition router.c:1755
Header file for router.c.
routerset_t * routerset_new(void)
Definition routerset.c:51
int routerset_contains_node(const routerset_t *set, const node_t *node)
Definition routerset.c:353
int routerset_parse(routerset_t *target, const char *s, const char *description)
Definition routerset.c:115
int routerset_contains_bridge(const routerset_t *set, const bridge_info_t *bridge)
Definition routerset.c:365
Header file for routerset.c.
Routerstatus (consensus entry) structure.
int smartlist_ptrs_eq(const smartlist_t *s1, const smartlist_t *s2)
Definition smartlist.c:198
int smartlist_contains_digest(const smartlist_t *sl, const char *element)
Definition smartlist.c:223
void smartlist_add_asprintf(struct smartlist_t *sl, const char *pattern,...)
Definition smartlist.c:36
char * smartlist_join_strings(smartlist_t *sl, const char *join, int terminate, size_t *len_out)
Definition smartlist.c:279
void smartlist_sort(smartlist_t *sl, int(*compare)(const void **a, const void **b))
Definition smartlist.c:334
void smartlist_remove_keeporder(smartlist_t *sl, const void *element)
void smartlist_add_all(smartlist_t *s1, const smartlist_t *s2)
void smartlist_add_strdup(struct smartlist_t *sl, const char *string)
int smartlist_contains(const smartlist_t *sl, const void *element)
smartlist_t * smartlist_new(void)
void smartlist_add(smartlist_t *sl, void *element)
void smartlist_clear(smartlist_t *sl)
void smartlist_remove(smartlist_t *sl, const void *element)
#define SMARTLIST_FOREACH_BEGIN(sl, type, var)
#define SMARTLIST_FOREACH(sl, type, var, cmd)
#define SMARTLIST_DEL_CURRENT(sl, var)
#define SMARTLIST_DEL_CURRENT_KEEPORDER(sl, var)
int smartlist_split_string(smartlist_t *sl, const char *str, const char *sep, int flags, int max)
void or_state_mark_dirty(or_state_t *state, time_t when)
Definition statefile.c:784
or_state_t * get_or_state(void)
Definition statefile.c:220
Header for statefile.c.
double use_successes
Definition entrynodes.h:62
double successful_circuits_closed
Definition entrynodes.h:52
time_t expire_on_date
char identity[DIGEST_LEN]
unsigned int is_valid
Definition node_st.h:65
char identity[DIGEST_LEN]
Definition node_st.h:46
unsigned int is_possible_guard
Definition node_st.h:69
unsigned int is_stable
Definition node_st.h:68
struct routerset_t * EntryNodes
struct routerset_t * ExcludeNodes
struct config_line_t * Guard
Definition or_state_st.h:42
struct circuit_guard_state_t * guard_state
unsigned int is_stable
unsigned int is_fast
#define STATIC
Definition testsupport.h:32
#define MOCK_IMPL(rv, funcname, arglist)
void format_iso_time_nospace(char *buf, time_t t)
Definition time_fmt.c:344
void format_iso_time(char *buf, time_t t)
Definition time_fmt.c:326
void format_local_iso_time(char *buf, time_t t)
Definition time_fmt.c:316
Headers for transports.c.
#define tor_assert_nonfatal_unreached()
Definition util_bug.h:177
#define FALLTHROUGH_UNLESS_ALL_BUGS_ARE_FATAL
Definition util_bug.h:268
#define tor_assert(expr)
Definition util_bug.h:103
int tor_digest_is_zero(const char *digest)
Definition util_string.c:98