Tor 0.4.9.0-alpha-dev
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 *
313{
314 if (!curr_guard_context) {
316 }
317
318 return curr_guard_context;
319}
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
427{
428 return get_remove_unlisted_guards_after_days() * 24 * 60 * 60;
429}
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 * Enumerate <b>sampled_entry_guards</b> smartlist in <b>gs</b>.
1354 * For each <b>entry_guard_t</b> object in smartlist, do the following:
1355 * * If <b>currently_listed</b> is false and <b>unlisted_since_date</b>
1356 * is earlier than <b>remove_if_unlisted_since</b> - remove it.
1357 * * Otherwise, check if <b>sampled_on_date</b> is earlier than
1358 * <b>maybe_remove_if_sampled_before</b>.
1359 * * When above condition is correct, remove the guard if:
1360 * * It was never confirmed.
1361 * * It was confirmed before <b>remove_if_confirmed_before</b>.
1362 *
1363 * Require <b>gs</b> to be non-null pointer.
1364 * Return number of entries deleted.
1365 */
1366static size_t
1368 const time_t remove_if_unlisted_since,
1369 const time_t maybe_remove_if_sampled_before,
1370 const time_t remove_if_confirmed_before)
1371{
1372 size_t n_changes = 0;
1373
1374 tor_assert(gs);
1375
1376 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
1377 int rmv = 0;
1378
1379 if (guard->currently_listed == 0 &&
1380 guard->unlisted_since_date < remove_if_unlisted_since) {
1381 /*
1382 "We have a live consensus, and {IS_LISTED} is false, and
1383 {FIRST_UNLISTED_AT} is over get_remove_unlisted_guards_after_days()
1384 days in the past."
1385 */
1386 log_info(LD_GUARD, "Removing sampled guard %s: it has been unlisted "
1387 "for over %d days", entry_guard_describe(guard),
1389 rmv = 1;
1390 } else if (guard->sampled_on_date < maybe_remove_if_sampled_before) {
1391 /* We have a live consensus, and {ADDED_ON_DATE} is over
1392 {GUARD_LIFETIME} ago, *and* {CONFIRMED_ON_DATE} is either
1393 "never", or over {GUARD_CONFIRMED_MIN_LIFETIME} ago.
1394 */
1395 if (guard->confirmed_on_date == 0) {
1396 rmv = 1;
1397 log_info(LD_GUARD, "Removing sampled guard %s: it was sampled "
1398 "over %d days ago, but never confirmed.",
1399 entry_guard_describe(guard),
1400 get_guard_lifetime() / 86400);
1401 } else if (guard->confirmed_on_date < remove_if_confirmed_before) {
1402 rmv = 1;
1403 log_info(LD_GUARD, "Removing sampled guard %s: it was sampled "
1404 "over %d days ago, and confirmed over %d days ago.",
1405 entry_guard_describe(guard),
1406 get_guard_lifetime() / 86400,
1408 }
1409 }
1410
1411 if (rmv) {
1412 ++n_changes;
1413 SMARTLIST_DEL_CURRENT_KEEPORDER(gs->sampled_entry_guards, guard);
1415 entry_guard_free(guard);
1416 }
1417 } SMARTLIST_FOREACH_END(guard);
1418
1419 return n_changes;
1420}
1421
1422/**
1423 * Update the status of all sampled guards based on the arrival of a
1424 * new consensus networkstatus document. This will include marking
1425 * some guards as listed or unlisted, and removing expired guards. */
1426STATIC void
1428{
1429 tor_assert(gs);
1430
1431 // It's important to use a reasonably live consensus here; we want clients
1432 // to bootstrap even if their clock is skewed by more than 2-3 hours.
1433 // But we don't want to make changes based on anything that's really old.
1435 log_info(LD_GUARD, "Not updating the sample guard set; we have "
1436 "no reasonably live consensus.");
1437 return;
1438 }
1439 log_info(LD_GUARD, "Updating sampled guard status based on received "
1440 "consensus.");
1441
1442 /* First: Update listed/unlisted. */
1443 size_t n_changes = sampled_guards_update_consensus_presence(gs);
1444
1445 const time_t remove_if_unlisted_since =
1447 const time_t maybe_remove_if_sampled_before =
1449 const time_t remove_if_confirmed_before =
1451
1452 /* Then: remove the ones that have been junk for too long */
1453 n_changes +=
1455 remove_if_unlisted_since,
1456 maybe_remove_if_sampled_before,
1457 remove_if_confirmed_before);
1458
1459 if (n_changes) {
1460 gs->primary_guards_up_to_date = 0;
1462 /* We don't need to rebuild the confirmed list right here -- we may have
1463 * removed confirmed guards above, but we can't have added any new
1464 * confirmed guards.
1465 */
1467 }
1468}
1469
1470/**
1471 * Return true iff <b>node</b> is a Tor relay that we are configured to
1472 * be able to connect to. */
1473static int
1475 const node_t *node)
1476{
1477 /* NOTE: Make sure that this function stays in sync with
1478 * options_transition_affects_entry_guards */
1479 if (routerset_contains_node(options->ExcludeNodes, node))
1480 return 0;
1481
1482 if (options->EntryNodes &&
1483 !routerset_contains_node(options->EntryNodes, node))
1484 return 0;
1485
1486 if (!reachable_addr_allows_node(node, FIREWALL_OR_CONNECTION, 0))
1487 return 0;
1488
1490 return 0;
1491
1492 return 1;
1493}
1494
1495/** Helper: Return true iff <b>bridge</b> passes our configuration
1496 * filter-- if it is a relay that we are configured to be able to
1497 * connect to. */
1498static int
1500 const bridge_info_t *bridge)
1501{
1502 tor_assert(bridge);
1503 if (!bridge)
1504 return 0;
1505
1506 if (routerset_contains_bridge(options->ExcludeNodes, bridge))
1507 return 0;
1508
1509 /* Ignore entrynodes */
1510 const tor_addr_port_t *addrport = bridge_get_addr_port(bridge);
1511
1512 if (!reachable_addr_allows_addr(&addrport->addr,
1513 addrport->port,
1514 FIREWALL_OR_CONNECTION,
1515 0, 0))
1516 return 0;
1517
1518 return 1;
1519}
1520
1521/**
1522 * Return true iff <b>guard</b> is a Tor relay that we are configured to
1523 * be able to connect to, and we haven't disabled it for omission from
1524 * the consensus or path bias issues. */
1525static int
1526entry_guard_passes_filter(const or_options_t *options, guard_selection_t *gs,
1527 entry_guard_t *guard)
1528{
1529 if (guard->currently_listed == 0)
1530 return 0;
1531 if (guard->pb.path_bias_disabled)
1532 return 0;
1533
1534 if (gs->type == GS_TYPE_BRIDGE) {
1535 const bridge_info_t *bridge = get_bridge_info_for_guard(guard);
1536 if (bridge == NULL)
1537 return 0;
1538 return bridge_passes_guard_filter(options, bridge);
1539 } else {
1540 const node_t *node = node_get_by_id(guard->identity);
1541 if (node == NULL) {
1542 // This can happen when currently_listed is true, and we're not updating
1543 // it because we don't have a live consensus.
1544 return 0;
1545 }
1546
1547 return node_passes_guard_filter(options, node);
1548 }
1549}
1550
1551/** Return true iff <b>guard</b> is in the same family as <b>node</b>.
1552 */
1553static int
1554guard_in_node_family(const entry_guard_t *guard, const node_t *node)
1555{
1556 const node_t *guard_node = node_get_by_id(guard->identity);
1557 if (guard_node) {
1558 return nodes_in_same_family(guard_node, node);
1559 } else {
1560 /* If we don't have a node_t for the guard node, we might have
1561 * a bridge_info_t for it. So let's check to see whether the bridge
1562 * address matches has any family issues.
1563 *
1564 * (Strictly speaking, I believe this check is unnecessary, since we only
1565 * use it to avoid the exit's family when building circuits, and we don't
1566 * build multihop circuits until we have a routerinfo_t for the
1567 * bridge... at which point, we'll also have a node_t for the
1568 * bridge. Nonetheless, it seems wise to include it, in case our
1569 * assumptions change down the road. -nickm.)
1570 */
1571 if (get_options()->EnforceDistinctSubnets && guard->bridge_addr) {
1572 tor_addr_t node_addr;
1573 node_get_addr(node, &node_addr);
1574 if (router_addrs_in_same_network(&node_addr,
1575 &guard->bridge_addr->addr)) {
1576 return 1;
1577 }
1578 }
1579 return 0;
1580 }
1581}
1582
1583/* Allocate and return a new exit guard restriction (where <b>exit_id</b> is of
1584 * size DIGEST_LEN) */
1585STATIC entry_guard_restriction_t *
1586guard_create_exit_restriction(const uint8_t *exit_id)
1587{
1588 entry_guard_restriction_t *rst = NULL;
1589 rst = tor_malloc_zero(sizeof(entry_guard_restriction_t));
1590 rst->type = RST_EXIT_NODE;
1591 memcpy(rst->exclude_id, exit_id, DIGEST_LEN);
1592 return rst;
1593}
1594
1595/* Allocate and return a new exit guard restriction that excludes all current
1596 * and pending conflux guards */
1597STATIC entry_guard_restriction_t *
1598guard_create_conflux_restriction(const origin_circuit_t *circ)
1599{
1600 entry_guard_restriction_t *rst = NULL;
1601 rst = tor_malloc_zero(sizeof(entry_guard_restriction_t));
1602 rst->type = RST_EXCL_LIST;
1603 rst->excluded = smartlist_new();
1604 conflux_add_guards_to_exclude_list(circ, rst->excluded);
1605 return rst;
1606}
1607
1608/** If we have fewer than this many possible usable guards, don't set
1609 * MD-availability-based restrictions: we might denylist all of them. */
1610#define MIN_GUARDS_FOR_MD_RESTRICTION 10
1611
1612/** Return true if we should set md dirserver restrictions. We might not want
1613 * to set those if our guard options are too restricted, since we don't want
1614 * to denylist all of them. */
1615static int
1617{
1618 const guard_selection_t *gs = get_guard_selection_info();
1619 int num_usable_guards = num_reachable_filtered_guards(gs, NULL);
1620
1621 /* Don't set restriction if too few reachable filtered guards. */
1622 if (num_usable_guards < MIN_GUARDS_FOR_MD_RESTRICTION) {
1623 log_info(LD_GUARD, "Not setting md restriction: only %d"
1624 " usable guards.", num_usable_guards);
1625 return 0;
1626 }
1627
1628 /* We have enough usable guards: set MD restriction */
1629 return 1;
1630}
1631
1632/** Allocate and return an outdated md guard restriction. Return NULL if no
1633 * such restriction is needed. */
1634STATIC entry_guard_restriction_t *
1636{
1637 entry_guard_restriction_t *rst = NULL;
1638
1640 log_debug(LD_GUARD, "Not setting md restriction: too few "
1641 "filtered guards.");
1642 return NULL;
1643 }
1644
1645 rst = tor_malloc_zero(sizeof(entry_guard_restriction_t));
1646 rst->type = RST_OUTDATED_MD_DIRSERVER;
1647
1648 return rst;
1649}
1650
1651/* Return True if <b>guard</b> obeys the exit restriction <b>rst</b>. */
1652static int
1653guard_obeys_exit_restriction(const entry_guard_t *guard,
1654 const entry_guard_restriction_t *rst)
1655{
1656 tor_assert(rst->type == RST_EXIT_NODE);
1657
1658 // Exclude the exit ID and all of its family.
1659 const node_t *node = node_get_by_id((const char*)rst->exclude_id);
1660 if (node && guard_in_node_family(guard, node))
1661 return 0;
1662
1663 return tor_memneq(guard->identity, rst->exclude_id, DIGEST_LEN);
1664}
1665
1666/** Return True if <b>guard</b> should be used as a dirserver for fetching
1667 * microdescriptors. */
1668static int
1669guard_obeys_md_dirserver_restriction(const entry_guard_t *guard)
1670{
1671 /* If this guard is an outdated dirserver, don't use it. */
1672 if (microdesc_relay_is_outdated_dirserver(guard->identity)) {
1673 log_info(LD_GENERAL, "Skipping %s dirserver: outdated",
1674 hex_str(guard->identity, DIGEST_LEN));
1675 return 0;
1676 }
1677
1678 log_debug(LD_GENERAL, "%s dirserver obeys md restrictions",
1679 hex_str(guard->identity, DIGEST_LEN));
1680
1681 return 1;
1682}
1683
1684/**
1685 * Return true if a restriction is reachability related, such that it should
1686 * cause us to consider additional primary guards when selecting one.
1687 */
1688static bool
1689entry_guard_restriction_is_reachability(const entry_guard_restriction_t *rst)
1690{
1691 tor_assert(rst);
1692 return (rst->type == RST_OUTDATED_MD_DIRSERVER);
1693}
1694
1695/**
1696 * Return true iff <b>guard</b> obeys the restrictions defined in <b>rst</b>.
1697 * (If <b>rst</b> is NULL, there are no restrictions.)
1698 */
1699static int
1700entry_guard_obeys_restriction(const entry_guard_t *guard,
1701 const entry_guard_restriction_t *rst)
1702{
1703 tor_assert(guard);
1704 if (! rst)
1705 return 1; // No restriction? No problem.
1706
1707 if (rst->type == RST_EXIT_NODE) {
1708 return guard_obeys_exit_restriction(guard, rst);
1709 } else if (rst->type == RST_OUTDATED_MD_DIRSERVER) {
1711 } else if (rst->type == RST_EXCL_LIST) {
1712 return !smartlist_contains_digest(rst->excluded, guard->identity);
1713 }
1714
1716 return 0;
1717}
1718
1719/**
1720 * Update the <b>is_filtered_guard</b> and <b>is_usable_filtered_guard</b>
1721 * flags on <b>guard</b>. */
1722void
1724 guard_selection_t *gs,
1725 entry_guard_t *guard)
1726{
1727 unsigned was_filtered = guard->is_filtered_guard;
1728 guard->is_filtered_guard = 0;
1729 guard->is_usable_filtered_guard = 0;
1730
1731 if (entry_guard_passes_filter(options, gs, guard)) {
1732 guard->is_filtered_guard = 1;
1733
1734 if (guard->is_reachable != GUARD_REACHABLE_NO)
1735 guard->is_usable_filtered_guard = 1;
1736
1738 }
1739 log_debug(LD_GUARD, "Updated sampled guard %s: filtered=%d; "
1740 "reachable_filtered=%d.", entry_guard_describe(guard),
1741 guard->is_filtered_guard, guard->is_usable_filtered_guard);
1742
1743 if (!bool_eq(was_filtered, guard->is_filtered_guard)) {
1744 /* This guard might now be primary or nonprimary. */
1745 gs->primary_guards_up_to_date = 0;
1746 }
1747}
1748
1749/**
1750 * Update the <b>is_filtered_guard</b> and <b>is_usable_filtered_guard</b>
1751 * flag on every guard in <b>gs</b>. */
1752STATIC void
1754{
1755 const or_options_t *options = get_options();
1756
1757 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
1758 entry_guard_set_filtered_flags(options, gs, guard);
1759 } SMARTLIST_FOREACH_END(guard);
1760}
1761
1762/**
1763 * Return the first sampled guard from the reachable filtered sample guards
1764 * in <b>gs</b>, subject to the exclusion rules listed in <b>flags</b>.
1765 * Return NULL if no such guard can be found.
1766 *
1767 * Make sure that the sample is big enough, and that all the filter flags
1768 * are set correctly, before calling this function.
1769 *
1770 * If a restriction is provided in <b>rst</b>, do not return any guards that
1771 * violate it.
1772 **/
1773STATIC entry_guard_t *
1775 const entry_guard_restriction_t *rst,
1776 unsigned flags)
1777{
1778 tor_assert(gs);
1779 entry_guard_t *result = NULL;
1780 const unsigned exclude_confirmed = flags & SAMPLE_EXCLUDE_CONFIRMED;
1781 const unsigned exclude_primary = flags & SAMPLE_EXCLUDE_PRIMARY;
1782 const unsigned exclude_pending = flags & SAMPLE_EXCLUDE_PENDING;
1783 const unsigned no_update_primary = flags & SAMPLE_NO_UPDATE_PRIMARY;
1784 const unsigned need_descriptor = flags & SAMPLE_EXCLUDE_NO_DESCRIPTOR;
1785
1786 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
1788 } SMARTLIST_FOREACH_END(guard);
1789
1790 const int n_reachable_filtered = num_reachable_filtered_guards(gs, rst);
1791
1792 log_info(LD_GUARD, "Trying to sample a reachable guard: We know of %d "
1793 "in the USABLE_FILTERED set.", n_reachable_filtered);
1794
1795 const int min_filtered_sample = get_min_filtered_sample_size();
1796 if (n_reachable_filtered < min_filtered_sample) {
1797 log_info(LD_GUARD, " (That isn't enough. Trying to expand the sample.)");
1799 }
1800
1801 if (exclude_primary && !gs->primary_guards_up_to_date && !no_update_primary)
1803
1804 /* Build the set of reachable filtered guards. */
1805 smartlist_t *reachable_filtered_sample = smartlist_new();
1806 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
1807 entry_guard_consider_retry(guard);// redundant, but cheap.
1808 if (! entry_guard_obeys_restriction(guard, rst))
1809 continue;
1810 if (! guard->is_usable_filtered_guard)
1811 continue;
1812 if (exclude_confirmed && guard->confirmed_idx >= 0)
1813 continue;
1814 if (exclude_primary && guard->is_primary)
1815 continue;
1816 if (exclude_pending && guard->is_pending)
1817 continue;
1818 if (need_descriptor && !guard_has_descriptor(guard))
1819 continue;
1820 smartlist_add(reachable_filtered_sample, guard);
1821 } SMARTLIST_FOREACH_END(guard);
1822
1823 log_info(LD_GUARD, " (After filters [%x], we have %d guards to consider.)",
1824 flags, smartlist_len(reachable_filtered_sample));
1825
1826 if (smartlist_len(reachable_filtered_sample)) {
1827 /**
1828 * Get the first guard of the filtered set builds from
1829 * sampled_entry_guards. Proposal 310 suggests this design to overcome
1830 * performance and security issues linked to the previous selection
1831 * method. The guard selected here should be filtered out if this function
1832 * is called again in the same context. I.e., if we filter guards to add
1833 * them into some list X, then the guards from list X will be filtered out
1834 * when this function is called again. Hence it requires setting exclude
1835 * flags in a appropriate way (depending of the context of the caller).
1836 */
1837 result = smartlist_get(reachable_filtered_sample, 0);
1838 log_info(LD_GUARD, " (Selected %s.)",
1839 result ? entry_guard_describe(result) : "<null>");
1840 }
1841 smartlist_free(reachable_filtered_sample);
1842
1843 return result;
1844}
1845
1846static int
1847compare_guards_by_confirmed_idx(const void **a_, const void **b_)
1848{
1849 const entry_guard_t *a = *a_, *b = *b_;
1850 if (a->confirmed_idx < b->confirmed_idx)
1851 return -1;
1852 else if (a->confirmed_idx > b->confirmed_idx)
1853 return 1;
1854 else
1855 return 0;
1856}
1857/**
1858 * Helper: compare two entry_guard_t by their sampled_idx values.
1859 * Used to sort the sampled list
1860 */
1861static int
1862compare_guards_by_sampled_idx(const void **a_, const void **b_)
1863{
1864 const entry_guard_t *a = *a_, *b = *b_;
1865 if (a->sampled_idx < b->sampled_idx)
1866 return -1;
1867 else if (a->sampled_idx > b->sampled_idx)
1868 return 1;
1869 else
1870 return 0;
1871}
1872
1873/**
1874 * Find the confirmed guards from among the sampled guards in <b>gs</b>,
1875 * and put them in confirmed_entry_guards in the correct
1876 * order. Recalculate their indices.
1877 */
1878STATIC void
1879entry_guards_update_confirmed(guard_selection_t *gs)
1880{
1881 smartlist_clear(gs->confirmed_entry_guards);
1882 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
1883 if (guard->confirmed_idx >= 0)
1884 smartlist_add(gs->confirmed_entry_guards, guard);
1885 } SMARTLIST_FOREACH_END(guard);
1886
1887 smartlist_sort(gs->confirmed_entry_guards, compare_guards_by_confirmed_idx);
1888 /** Needed to keep a dense array of confirmed_idx */
1889 int any_changed = 0;
1890 SMARTLIST_FOREACH_BEGIN(gs->confirmed_entry_guards, entry_guard_t *, guard) {
1891 if (guard->confirmed_idx != guard_sl_idx) {
1892 any_changed = 1;
1893 guard->confirmed_idx = guard_sl_idx;
1894 }
1895 } SMARTLIST_FOREACH_END(guard);
1896
1897 gs->next_confirmed_idx = smartlist_len(gs->confirmed_entry_guards);
1898 // We need the confirmed list to always be give guards in sampled order
1899 smartlist_sort(gs->confirmed_entry_guards, compare_guards_by_sampled_idx);
1900
1901 if (any_changed) {
1903 }
1904}
1905
1906/**
1907 * Mark <b>guard</b> as a confirmed guard -- that is, one that we have
1908 * connected to, and intend to use again.
1909 */
1910STATIC void
1911make_guard_confirmed(guard_selection_t *gs, entry_guard_t *guard)
1912{
1913 if (BUG(guard->confirmed_on_date && guard->confirmed_idx >= 0))
1914 return; // LCOV_EXCL_LINE
1915
1916 if (BUG(smartlist_contains(gs->confirmed_entry_guards, guard)))
1917 return; // LCOV_EXCL_LINE
1918
1919 const int GUARD_LIFETIME = get_guard_lifetime();
1920 guard->confirmed_on_date = randomize_time(approx_time(), GUARD_LIFETIME/10);
1921
1922 log_info(LD_GUARD, "Marking %s as a confirmed guard (index %d)",
1923 entry_guard_describe(guard),
1924 gs->next_confirmed_idx);
1925
1926 guard->confirmed_idx = gs->next_confirmed_idx++;
1927 smartlist_add(gs->confirmed_entry_guards, guard);
1928 /** The confirmation ordering might not be the sample ordering. We need to
1929 * reorder */
1930 smartlist_sort(gs->confirmed_entry_guards, compare_guards_by_sampled_idx);
1931
1932 // This confirmed guard might kick something else out of the primary
1933 // guards.
1934 gs->primary_guards_up_to_date = 0;
1935
1937}
1938
1939/**
1940 * Recalculate the list of primary guards (the ones we'd prefer to use) from
1941 * the filtered sample and the confirmed list.
1942 */
1943STATIC void
1944entry_guards_update_primary(guard_selection_t *gs)
1945{
1946 tor_assert(gs);
1947
1948 // prevent recursion. Recursion is potentially very bad here.
1949 static int running = 0;
1950 tor_assert(!running);
1951 running = 1;
1952
1953 const int N_PRIMARY_GUARDS = get_n_primary_guards();
1954
1955 smartlist_t *new_primary_guards = smartlist_new();
1956 smartlist_t *old_primary_guards = smartlist_new();
1957 smartlist_add_all(old_primary_guards, gs->primary_entry_guards);
1958
1959 /* Set this flag now, to prevent the calls below from recursing. */
1960 gs->primary_guards_up_to_date = 1;
1961
1962 /* First, can we fill it up with confirmed guards? */
1963 SMARTLIST_FOREACH_BEGIN(gs->confirmed_entry_guards, entry_guard_t *, guard) {
1964 if (smartlist_len(new_primary_guards) >= N_PRIMARY_GUARDS)
1965 break;
1966 if (! guard->is_filtered_guard)
1967 continue;
1968 guard->is_primary = 1;
1969 smartlist_add(new_primary_guards, guard);
1970 } SMARTLIST_FOREACH_END(guard);
1971
1972 SMARTLIST_FOREACH_BEGIN(old_primary_guards, entry_guard_t *, guard) {
1973 /* Can we keep any older primary guards? First remove all the ones
1974 * that we already kept. */
1975 if (smartlist_contains(new_primary_guards, guard)) {
1976 SMARTLIST_DEL_CURRENT_KEEPORDER(old_primary_guards, guard);
1977 continue;
1978 }
1979
1980 /* Now add any that are still good. */
1981 if (smartlist_len(new_primary_guards) < N_PRIMARY_GUARDS &&
1982 guard->is_filtered_guard) {
1983 guard->is_primary = 1;
1984 smartlist_add(new_primary_guards, guard);
1985 SMARTLIST_DEL_CURRENT_KEEPORDER(old_primary_guards, guard);
1986 } else {
1987 /* Mark the remaining previous primary guards as non-primary */
1988 guard->is_primary = 0;
1989 }
1990 } SMARTLIST_FOREACH_END(guard);
1991
1992 /* Finally, fill out the list with sampled guards. */
1993 while (smartlist_len(new_primary_guards) < N_PRIMARY_GUARDS) {
1994 entry_guard_t *guard = first_reachable_filtered_entry_guard(gs, NULL,
1995 SAMPLE_EXCLUDE_CONFIRMED|
1996 SAMPLE_EXCLUDE_PRIMARY|
1997 SAMPLE_NO_UPDATE_PRIMARY);
1998 if (!guard)
1999 break;
2000 guard->is_primary = 1;
2001 smartlist_add(new_primary_guards, guard);
2002 }
2003
2004#if 1
2005 /* Debugging. */
2006 SMARTLIST_FOREACH(gs->sampled_entry_guards, entry_guard_t *, guard, {
2007 tor_assert_nonfatal(
2008 bool_eq(guard->is_primary,
2009 smartlist_contains(new_primary_guards, guard)));
2010 });
2011#endif /* 1 */
2012
2013 const int any_change = !smartlist_ptrs_eq(gs->primary_entry_guards,
2014 new_primary_guards);
2015 if (any_change) {
2016 log_info(LD_GUARD, "Primary entry guards have changed. "
2017 "New primary guard list is: ");
2018 int n = smartlist_len(new_primary_guards);
2019 SMARTLIST_FOREACH_BEGIN(new_primary_guards, entry_guard_t *, g) {
2020 log_info(LD_GUARD, " %d/%d: %s%s%s",
2021 g_sl_idx+1, n, entry_guard_describe(g),
2022 g->confirmed_idx >= 0 ? " (confirmed)" : "",
2023 g->is_filtered_guard ? "" : " (excluded by filter)");
2024 } SMARTLIST_FOREACH_END(g);
2025 smartlist_sort(new_primary_guards, compare_guards_by_sampled_idx);
2026 }
2027
2028 smartlist_free(old_primary_guards);
2029 smartlist_free(gs->primary_entry_guards);
2030 gs->primary_entry_guards = new_primary_guards;
2031 gs->primary_guards_up_to_date = 1;
2032 running = 0;
2033}
2034
2035/**
2036 * Return the number of seconds after the last attempt at which we should
2037 * retry a guard that has been failing since <b>failing_since</b>.
2038 */
2039static int
2040get_retry_schedule(time_t failing_since, time_t now,
2041 int is_primary)
2042{
2043 const unsigned SIX_HOURS = 6 * 3600;
2044 const unsigned FOUR_DAYS = 4 * 86400;
2045 const unsigned SEVEN_DAYS = 7 * 86400;
2046
2047 time_t tdiff;
2048 if (now > failing_since) {
2049 tdiff = now - failing_since;
2050 } else {
2051 tdiff = 0;
2052 }
2053
2054 const struct {
2055 time_t maximum; int primary_delay; int nonprimary_delay;
2056 } delays[] = {
2057 // clang-format off
2058 { SIX_HOURS, 10*60, 1*60*60 },
2059 { FOUR_DAYS, 90*60, 4*60*60 },
2060 { SEVEN_DAYS, 4*60*60, 18*60*60 },
2061 { TIME_MAX, 9*60*60, 36*60*60 }
2062 // clang-format on
2063 };
2064
2065 unsigned i;
2066 for (i = 0; i < ARRAY_LENGTH(delays); ++i) {
2067 if (tdiff <= delays[i].maximum) {
2068 return is_primary ? delays[i].primary_delay : delays[i].nonprimary_delay;
2069 }
2070 }
2071 /* LCOV_EXCL_START -- can't reach, since delays ends with TIME_MAX. */
2073 return 36*60*60;
2074 /* LCOV_EXCL_STOP */
2075}
2076
2077/**
2078 * If <b>guard</b> is unreachable, consider whether enough time has passed
2079 * to consider it maybe-reachable again.
2080 */
2081STATIC void
2082entry_guard_consider_retry(entry_guard_t *guard)
2083{
2084 if (guard->is_reachable != GUARD_REACHABLE_NO)
2085 return; /* No retry needed. */
2086
2087 const time_t now = approx_time();
2088 const int delay =
2089 get_retry_schedule(guard->failing_since, now, guard->is_primary);
2090 const time_t last_attempt = guard->last_tried_to_connect;
2091
2092 /* Check if it is a bridge and we don't have its descriptor yet */
2093 if (guard->bridge_addr && !guard_has_descriptor(guard)) {
2094 /* We want to leave the retry schedule to fetch_bridge_descriptors(),
2095 * so we don't have two retry schedules clobbering each other. See
2096 * bugs 40396 and 40497 for details of why we need this exception. */
2097 return;
2098 }
2099
2100 if (BUG(last_attempt == 0) ||
2101 now >= last_attempt + delay) {
2102 /* We should mark this retriable. */
2103 char tbuf[ISO_TIME_LEN+1];
2104 format_local_iso_time(tbuf, last_attempt);
2105 log_info(LD_GUARD, "Marked %s%sguard %s for possible retry, since we "
2106 "haven't tried to use it since %s.",
2107 guard->is_primary?"primary ":"",
2108 guard->confirmed_idx>=0?"confirmed ":"",
2109 entry_guard_describe(guard),
2110 tbuf);
2111
2112 guard->is_reachable = GUARD_REACHABLE_MAYBE;
2113 if (guard->is_filtered_guard)
2114 guard->is_usable_filtered_guard = 1;
2115 }
2116}
2117
2118/** Tell the entry guards subsystem that we have confirmed that as of
2119 * just now, we're on the internet. */
2120void
2122{
2123 gs->last_time_on_internet = approx_time();
2124}
2125
2126/**
2127 * Pick a primary guard for use with a circuit, if available. Update the
2128 * <b>last_tried_to_connect</b> time and the <b>is_pending</b> fields of the
2129 * guard as appropriate. Set <b>state_out</b> to the new guard-state
2130 * of the circuit.
2131 */
2132static entry_guard_t *
2134 guard_usage_t usage,
2135 const entry_guard_restriction_t *rst,
2136 unsigned *state_out)
2137{
2138 const int need_descriptor = (usage == GUARD_USAGE_TRAFFIC);
2139 entry_guard_t *chosen_guard = NULL;
2140
2141 int num_entry_guards_to_consider = get_n_primary_guards_to_use(usage);
2142 smartlist_t *usable_primary_guards = smartlist_new();
2143 int num_entry_guards_considered = 0;
2144
2145 SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, guard) {
2147 if (!entry_guard_obeys_restriction(guard, rst)) {
2148 log_info(LD_GUARD, "Entry guard %s doesn't obey restriction, we test the"
2149 " next one", entry_guard_describe(guard));
2151 log_info(LD_GUARD,
2152 "Skipping guard %s due to circuit path restriction. "
2153 "Have %d, considered: %d, to consider: %d",
2154 entry_guard_describe(guard),
2155 smartlist_len(usable_primary_guards),
2156 num_entry_guards_considered,
2157 num_entry_guards_to_consider);
2158 /* If the restriction is a circuit path restriction (as opposed to a
2159 * reachability restriction), count this as considered. */
2160 num_entry_guards_considered++;
2161
2162 /* If we have considered enough guards, *and* we actually have a guard,
2163 * then proceed to select one from the list. */
2164 if (num_entry_guards_considered >= num_entry_guards_to_consider) {
2165 /* This should not happen with 2-leg conflux unless there is a
2166 * race between removing a failed leg and a retry, but check
2167 * anyway and log. */
2168 if (smartlist_len(usable_primary_guards) == 0) {
2169 static ratelim_t guardlog = RATELIM_INIT(60);
2171 "All current guards excluded by path restriction "
2172 "type %d; using an additional guard.",
2173 rst->type);
2174 } else {
2175 break;
2176 }
2177 }
2178 }
2179 continue;
2180 }
2181 if (guard->is_reachable != GUARD_REACHABLE_NO) {
2182 if (need_descriptor && !guard_has_descriptor(guard)) {
2183 log_info(LD_GUARD, "Guard %s does not have a descriptor",
2184 entry_guard_describe(guard));
2185 continue;
2186 }
2187 *state_out = GUARD_CIRC_STATE_USABLE_ON_COMPLETION;
2188 guard->last_tried_to_connect = approx_time();
2189 smartlist_add(usable_primary_guards, guard);
2190 num_entry_guards_considered++;
2191
2192 /* If we have considered enough guards, then proceed to select
2193 * one from the list. */
2194 if (num_entry_guards_considered >= num_entry_guards_to_consider) {
2195 break;
2196 }
2197 } else {
2198 log_info(LD_GUARD, "Guard %s is not reachable",
2199 entry_guard_describe(guard));
2200 }
2201 } SMARTLIST_FOREACH_END(guard);
2202
2203 if (smartlist_len(usable_primary_guards)) {
2204 chosen_guard = smartlist_choose(usable_primary_guards);
2205 log_info(LD_GUARD,
2206 "Selected primary guard %s for circuit from a list size of %d.",
2207 entry_guard_describe(chosen_guard),
2208 smartlist_len(usable_primary_guards));
2209 /* Describe each guard in the list: */
2210 SMARTLIST_FOREACH_BEGIN(usable_primary_guards, entry_guard_t *, guard) {
2211 log_info(LD_GUARD, " %s", entry_guard_describe(guard));
2212 } SMARTLIST_FOREACH_END(guard);
2213 smartlist_free(usable_primary_guards);
2214 }
2215
2216 smartlist_free(usable_primary_guards);
2217 return chosen_guard;
2218}
2219
2220/**
2221 * For use with a circuit, pick a non-pending running filtered confirmed guard,
2222 * if one is available. Update the <b>last_tried_to_connect</b> time and the
2223 * <b>is_pending</b> fields of the guard as appropriate. Set <b>state_out</b>
2224 * to the new guard-state of the circuit.
2225 */
2226static entry_guard_t *
2228 guard_usage_t usage,
2229 const entry_guard_restriction_t *rst,
2230 unsigned *state_out)
2231{
2232 const int need_descriptor = (usage == GUARD_USAGE_TRAFFIC);
2233
2234 SMARTLIST_FOREACH_BEGIN(gs->confirmed_entry_guards, entry_guard_t *, guard) {
2235 if (guard->is_primary)
2236 continue; /* we already considered this one. */
2237 if (! entry_guard_obeys_restriction(guard, rst))
2238 continue;
2240 if (guard->is_usable_filtered_guard && ! guard->is_pending) {
2241 if (need_descriptor && !guard_has_descriptor(guard))
2242 continue; /* not a bug */
2243 guard->is_pending = 1;
2244 guard->last_tried_to_connect = approx_time();
2245 *state_out = GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD;
2246 log_info(LD_GUARD, "No primary guards available. Selected confirmed "
2247 "guard %s for circuit. Will try other guards before using "
2248 "this circuit.",
2249 entry_guard_describe(guard));
2250 return guard;
2251 }
2252 } SMARTLIST_FOREACH_END(guard);
2253
2254 return NULL;
2255}
2256
2257/**
2258 * For use with a circuit, pick a usable filtered guard. Update the
2259 * <b>last_tried_to_connect</b> time and the <b>is_pending</b> fields of the
2260 * guard as appropriate. Set <b>state_out</b> to the new guard-state of the
2261 * circuit.
2262 */
2263static entry_guard_t *
2265 guard_usage_t usage,
2266 const entry_guard_restriction_t *rst,
2267 unsigned *state_out)
2268{
2269 const int need_descriptor = (usage == GUARD_USAGE_TRAFFIC);
2270 entry_guard_t *chosen_guard = NULL;
2271 unsigned flags = 0;
2272 if (need_descriptor)
2273 flags |= SAMPLE_EXCLUDE_NO_DESCRIPTOR;
2274 chosen_guard = first_reachable_filtered_entry_guard(gs,
2275 rst,
2276 SAMPLE_EXCLUDE_CONFIRMED |
2277 SAMPLE_EXCLUDE_PRIMARY |
2278 SAMPLE_EXCLUDE_PENDING |
2279 flags);
2280 if (!chosen_guard) {
2281 return NULL;
2282 }
2283
2284 chosen_guard->is_pending = 1;
2285 chosen_guard->last_tried_to_connect = approx_time();
2286 *state_out = GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD;
2287 log_info(LD_GUARD, "No primary or confirmed guards available. Selected "
2288 "guard %s for circuit. Will try other guards before "
2289 "using this circuit.",
2290 entry_guard_describe(chosen_guard));
2291 return chosen_guard;
2292}
2293
2294/**
2295 * Get a guard for use with a circuit. Prefer to pick a running primary
2296 * guard; then a non-pending running filtered confirmed guard; then a
2297 * non-pending runnable filtered guard. Update the
2298 * <b>last_tried_to_connect</b> time and the <b>is_pending</b> fields of the
2299 * guard as appropriate. Set <b>state_out</b> to the new guard-state
2300 * of the circuit.
2301 */
2302STATIC entry_guard_t *
2304 guard_usage_t usage,
2305 const entry_guard_restriction_t *rst,
2306 unsigned *state_out)
2307{
2308 entry_guard_t *chosen_guard = NULL;
2309 tor_assert(gs);
2310 tor_assert(state_out);
2311
2312 if (!gs->primary_guards_up_to_date)
2314
2315 /* "If any entry in PRIMARY_GUARDS has {is_reachable} status of
2316 <maybe> or <yes>, return the first such guard." */
2317 chosen_guard = select_primary_guard_for_circuit(gs, usage, rst, state_out);
2318 if (chosen_guard) {
2319 log_info(LD_GUARD, "Selected primary guard %s for circuit.",
2320 entry_guard_describe(chosen_guard));
2321 return chosen_guard;
2322 }
2323
2324 /* "Otherwise, if the ordered intersection of {CONFIRMED_GUARDS}
2325 and {USABLE_FILTERED_GUARDS} is nonempty, return the first
2326 entry in that intersection that has {is_pending} set to
2327 false." */
2328 chosen_guard = select_confirmed_guard_for_circuit(gs, usage, rst, state_out);
2329 if (chosen_guard) {
2330 log_info(LD_GUARD, "Selected confirmed guard %s for circuit.",
2331 entry_guard_describe(chosen_guard));
2332 return chosen_guard;
2333 }
2334
2335 /* "Otherwise, if there is no such entry, select a member
2336 * {USABLE_FILTERED_GUARDS} following the sample ordering" */
2337 chosen_guard = select_filtered_guard_for_circuit(gs, usage, rst, state_out);
2338
2339 if (chosen_guard == NULL) {
2340 log_info(LD_GUARD, "Absolutely no sampled guards were available. "
2341 "Marking all guards for retry and starting from top again.");
2342 mark_all_guards_maybe_reachable(gs);
2343 return NULL;
2344 }
2345
2346 log_info(LD_GUARD, "Selected filtered guard %s for circuit.",
2347 entry_guard_describe(chosen_guard));
2348 return chosen_guard;
2349}
2350
2351/**
2352 * Note that we failed to connect to or build circuits through <b>guard</b>.
2353 * Use with a guard returned by select_entry_guard_for_circuit().
2354 */
2355STATIC void
2357 entry_guard_t *guard)
2358{
2359 tor_assert(gs);
2360
2361 guard->is_reachable = GUARD_REACHABLE_NO;
2362 guard->is_usable_filtered_guard = 0;
2363
2364 guard->is_pending = 0;
2365 if (guard->failing_since == 0)
2366 guard->failing_since = approx_time();
2367
2368 /* This guard not reachable: send GUARD DOWN event */
2369 control_event_guard(guard->nickname, guard->identity, "DOWN");
2370
2371 log_info(LD_GUARD, "Recorded failure for %s%sguard %s",
2372 guard->is_primary?"primary ":"",
2373 guard->confirmed_idx>=0?"confirmed ":"",
2374 entry_guard_describe(guard));
2375
2376 /* Schedule a re-assessment of whether we have enough dir info to
2377 * use the network. Counterintuitively, *losing* a bridge might actually
2378 * be just what we need to *resume* using the network, if we had it in
2379 * state GUARD_REACHABLE_MAYBE and we were stalling to learn this
2380 * outcome. See bug 40396 for more details. */
2382}
2383
2384/**
2385 * Note that we successfully connected to, and built a circuit through
2386 * <b>guard</b>. Given the old guard-state of the circuit in <b>old_state</b>,
2387 * return the new guard-state of the circuit.
2388 *
2389 * Be aware: the circuit is only usable when its guard-state becomes
2390 * GUARD_CIRC_STATE_COMPLETE.
2391 **/
2392STATIC unsigned
2394 entry_guard_t *guard,
2395 unsigned old_state)
2396{
2397 tor_assert(gs);
2398
2399 /* Save this, since we're about to overwrite it. */
2400 const time_t last_time_on_internet = gs->last_time_on_internet;
2401 gs->last_time_on_internet = approx_time();
2402
2403 /* If guard was not already marked as reachable, send a GUARD UP signal */
2404 if (guard->is_reachable != GUARD_REACHABLE_YES) {
2405 control_event_guard(guard->nickname, guard->identity, "UP");
2406
2407 /* Schedule a re-assessment of whether we have enough dir info to
2408 * use the network. One of our guards has just moved to
2409 * GUARD_REACHABLE_YES, so maybe we can resume using the network
2410 * now. */
2412 }
2413
2414 guard->is_reachable = GUARD_REACHABLE_YES;
2415 guard->failing_since = 0;
2416 guard->is_pending = 0;
2417 if (guard->is_filtered_guard)
2418 guard->is_usable_filtered_guard = 1;
2419
2420 if (guard->confirmed_idx < 0) {
2421 make_guard_confirmed(gs, guard);
2422 if (!gs->primary_guards_up_to_date)
2424 }
2425
2426 unsigned new_state;
2427 switch (old_state) {
2428 case GUARD_CIRC_STATE_COMPLETE:
2429 case GUARD_CIRC_STATE_USABLE_ON_COMPLETION:
2430 new_state = GUARD_CIRC_STATE_COMPLETE;
2431 break;
2432 default:
2435 case GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD:
2436 if (guard->is_primary) {
2437 /* XXXX #20832 -- I don't actually like this logic. It seems to make
2438 * us a little more susceptible to evil-ISP attacks. The mitigations
2439 * I'm thinking of, however, aren't local to this point, so I'll leave
2440 * it alone. */
2441 /* This guard may have become primary by virtue of being confirmed.
2442 * If so, the circuit for it is now complete.
2443 */
2444 new_state = GUARD_CIRC_STATE_COMPLETE;
2445 } else {
2446 new_state = GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD;
2447 }
2448 break;
2449 }
2450
2451 if (! guard->is_primary) {
2452 if (last_time_on_internet + get_internet_likely_down_interval()
2453 < approx_time()) {
2455 }
2456 }
2457
2458 log_info(LD_GUARD, "Recorded success for %s%sguard %s",
2459 guard->is_primary?"primary ":"",
2460 guard->confirmed_idx>=0?"confirmed ":"",
2461 entry_guard_describe(guard));
2462
2463 return new_state;
2464}
2465
2466/**
2467 * Helper: Return true iff <b>a</b> has higher priority than <b>b</b>.
2468 */
2469STATIC int
2470entry_guard_has_higher_priority(entry_guard_t *a, entry_guard_t *b)
2471{
2472 tor_assert(a && b);
2473 if (a == b)
2474 return 0;
2475
2476 /* Confirmed is always better than unconfirmed; lower index better
2477 than higher */
2478 if (a->confirmed_idx < 0) {
2479 if (b->confirmed_idx >= 0)
2480 return 0;
2481 } else {
2482 if (b->confirmed_idx < 0)
2483 return 1;
2484
2485 /* Lower confirmed_idx is better than higher. */
2486 return (a->confirmed_idx < b->confirmed_idx);
2487 }
2488
2489 /* If we reach this point, both are unconfirmed. If one is pending, it
2490 * has higher priority. */
2491 if (a->is_pending) {
2492 if (! b->is_pending)
2493 return 1;
2494
2495 /* Both are pending: earlier last_tried_connect wins. */
2496 return a->last_tried_to_connect < b->last_tried_to_connect;
2497 } else {
2498 if (b->is_pending)
2499 return 0;
2500
2501 /* Neither is pending: priorities are equal. */
2502 return 0;
2503 }
2504}
2505
2506/** Release all storage held in <b>restriction</b> */
2507STATIC void
2508entry_guard_restriction_free_(entry_guard_restriction_t *rst)
2509{
2510 if (rst && rst->excluded) {
2511 SMARTLIST_FOREACH(rst->excluded, void *, g,
2512 tor_free(g));
2513 smartlist_free(rst->excluded);
2514 }
2515 tor_free(rst);
2516}
2517
2518/**
2519 * Release all storage held in <b>state</b>.
2520 */
2521void
2522circuit_guard_state_free_(circuit_guard_state_t *state)
2523{
2524 if (!state)
2525 return;
2526 entry_guard_restriction_free(state->restrictions);
2527 entry_guard_handle_free(state->guard);
2528 tor_free(state);
2529}
2530
2531/** Allocate and return a new circuit_guard_state_t to track the result
2532 * of using <b>guard</b> for a given operation. */
2533MOCK_IMPL(STATIC circuit_guard_state_t *,
2534circuit_guard_state_new,(entry_guard_t *guard, unsigned state,
2535 entry_guard_restriction_t *rst))
2536{
2537 circuit_guard_state_t *result;
2538
2539 result = tor_malloc_zero(sizeof(circuit_guard_state_t));
2540 result->guard = entry_guard_handle_new(guard);
2541 result->state = state;
2542 result->state_set_at = approx_time();
2543 result->restrictions = rst;
2544
2545 return result;
2546}
2547
2548/**
2549 * Pick a suitable entry guard for a circuit in, and place that guard
2550 * in *<b>chosen_node_out</b>. Set *<b>guard_state_out</b> to an opaque
2551 * state object that will record whether the circuit is ready to be used
2552 * or not. Return 0 on success; on failure, return -1.
2553 *
2554 * If a restriction is provided in <b>rst</b>, do not return any guards that
2555 * violate it, and remember that restriction in <b>guard_state_out</b> for
2556 * later use. (Takes ownership of the <b>rst</b> object.)
2557 */
2558int
2559entry_guard_pick_for_circuit(guard_selection_t *gs,
2560 guard_usage_t usage,
2561 entry_guard_restriction_t *rst,
2562 const node_t **chosen_node_out,
2563 circuit_guard_state_t **guard_state_out)
2564{
2565 tor_assert(gs);
2566 tor_assert(chosen_node_out);
2567 tor_assert(guard_state_out);
2568 *chosen_node_out = NULL;
2569 *guard_state_out = NULL;
2570
2571 unsigned state = 0;
2572 entry_guard_t *guard =
2573 select_entry_guard_for_circuit(gs, usage, rst, &state);
2574 if (! guard)
2575 goto fail;
2576 if (BUG(state == 0))
2577 goto fail;
2578 const node_t *node = node_get_by_id(guard->identity);
2579 // XXXX #20827 check Ed ID.
2580 if (! node)
2581 goto fail;
2582 if (BUG(usage != GUARD_USAGE_DIRGUARD &&
2584 goto fail;
2585
2586 *chosen_node_out = node;
2587 *guard_state_out = circuit_guard_state_new(guard, state, rst);
2588
2589 return 0;
2590 fail:
2591 entry_guard_restriction_free(rst);
2592 return -1;
2593}
2594
2595/**
2596 * Called by the circuit building module when a circuit has succeeded: informs
2597 * the guards code that the guard in *<b>guard_state_p</b> is working, and
2598 * advances the state of the guard module. On a GUARD_USABLE_NEVER return
2599 * value, the circuit is broken and should not be used. On a GUARD_USABLE_NOW
2600 * return value, the circuit is ready to use. On a GUARD_MAYBE_USABLE_LATER
2601 * return value, the circuit should not be used until we find out whether
2602 * preferred guards will work for us.
2603 */
2604guard_usable_t
2605entry_guard_succeeded(circuit_guard_state_t **guard_state_p)
2606{
2607 if (BUG(*guard_state_p == NULL))
2608 return GUARD_USABLE_NEVER;
2609
2610 entry_guard_t *guard = entry_guard_handle_get((*guard_state_p)->guard);
2611 if (! guard || BUG(guard->in_selection == NULL))
2612 return GUARD_USABLE_NEVER;
2613
2614 unsigned newstate =
2615 entry_guards_note_guard_success(guard->in_selection, guard,
2616 (*guard_state_p)->state);
2617
2618 (*guard_state_p)->state = newstate;
2619 (*guard_state_p)->state_set_at = approx_time();
2620
2621 if (newstate == GUARD_CIRC_STATE_COMPLETE) {
2622 return GUARD_USABLE_NOW;
2623 } else {
2624 return GUARD_MAYBE_USABLE_LATER;
2625 }
2626}
2627
2628/** Cancel the selection of *<b>guard_state_p</b> without declaring
2629 * success or failure. It is safe to call this function if success or
2630 * failure _has_ already been declared. */
2631void
2632entry_guard_cancel(circuit_guard_state_t **guard_state_p)
2633{
2634 if (BUG(*guard_state_p == NULL))
2635 return;
2636 entry_guard_t *guard = entry_guard_handle_get((*guard_state_p)->guard);
2637 if (! guard)
2638 return;
2639
2640 /* XXXX prop271 -- last_tried_to_connect_at will be erroneous here, but this
2641 * function will only get called in "bug" cases anyway. */
2642 guard->is_pending = 0;
2643 circuit_guard_state_free(*guard_state_p);
2644 *guard_state_p = NULL;
2645}
2646
2647/**
2648 * Called by the circuit building module when a circuit has failed:
2649 * informs the guards code that the guard in *<b>guard_state_p</b> is
2650 * not working, and advances the state of the guard module.
2651 */
2652void
2653entry_guard_failed(circuit_guard_state_t **guard_state_p)
2654{
2655 if (BUG(*guard_state_p == NULL))
2656 return;
2657
2658 entry_guard_t *guard = entry_guard_handle_get((*guard_state_p)->guard);
2659 if (! guard || BUG(guard->in_selection == NULL))
2660 return;
2661
2662 entry_guards_note_guard_failure(guard->in_selection, guard);
2663
2664 (*guard_state_p)->state = GUARD_CIRC_STATE_DEAD;
2665 (*guard_state_p)->state_set_at = approx_time();
2666}
2667
2668/**
2669 * Run the entry_guard_failed() function on every circuit that is
2670 * pending on <b>chan</b>.
2671 */
2672void
2674{
2675 if (!chan)
2676 return;
2677
2678 smartlist_t *pending = smartlist_new();
2680 SMARTLIST_FOREACH_BEGIN(pending, circuit_t *, circ) {
2681 if (!CIRCUIT_IS_ORIGIN(circ))
2682 continue;
2683
2684 origin_circuit_t *origin_circ = TO_ORIGIN_CIRCUIT(circ);
2685 if (origin_circ->guard_state) {
2686 /* We might have no guard state if we didn't use a guard on this
2687 * circuit (eg it's for a fallback directory). */
2688 entry_guard_failed(&origin_circ->guard_state);
2689 }
2690 } SMARTLIST_FOREACH_END(circ);
2691 smartlist_free(pending);
2692}
2693
2694/**
2695 * Return true iff every primary guard in <b>gs</b> is believed to
2696 * be unreachable.
2697 */
2698STATIC int
2700{
2701 tor_assert(gs);
2702 if (!gs->primary_guards_up_to_date)
2704 SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, guard) {
2706 if (guard->is_reachable != GUARD_REACHABLE_NO)
2707 return 0;
2708 } SMARTLIST_FOREACH_END(guard);
2709 return 1;
2710}
2711
2712/** Wrapper for entry_guard_has_higher_priority that compares the
2713 * guard-priorities of a pair of circuits. Return 1 if <b>a</b> has higher
2714 * priority than <b>b</b>.
2715 *
2716 * If a restriction is provided in <b>rst</b>, then do not consider
2717 * <b>a</b> to have higher priority if it violates the restriction.
2718 */
2719static int
2721 const entry_guard_restriction_t *rst,
2723{
2724 circuit_guard_state_t *state_a = origin_circuit_get_guard_state(a);
2725 circuit_guard_state_t *state_b = origin_circuit_get_guard_state(b);
2726
2727 tor_assert(state_a);
2728 tor_assert(state_b);
2729
2730 entry_guard_t *guard_a = entry_guard_handle_get(state_a->guard);
2731 entry_guard_t *guard_b = entry_guard_handle_get(state_b->guard);
2732
2733 if (! guard_a) {
2734 /* Unknown guard -- never higher priority. */
2735 return 0;
2736 } else if (! guard_b) {
2737 /* Known guard -- higher priority than any unknown guard. */
2738 return 1;
2739 } else if (! entry_guard_obeys_restriction(guard_a, rst)) {
2740 /* Restriction violated; guard_a cannot have higher priority. */
2741 return 0;
2742 } else {
2743 /* Both known -- compare.*/
2744 return entry_guard_has_higher_priority(guard_a, guard_b);
2745 }
2746}
2747
2748/**
2749 * Look at all of the origin_circuit_t * objects in <b>all_circuits_in</b>,
2750 * and see if any of them that were previously not ready to use for
2751 * guard-related reasons are now ready to use. Place those circuits
2752 * in <b>newly_complete_out</b>, and mark them COMPLETE.
2753 *
2754 * Return 1 if we upgraded any circuits, and 0 otherwise.
2755 */
2756int
2758 const smartlist_t *all_circuits_in,
2759 smartlist_t *newly_complete_out)
2760{
2761 tor_assert(gs);
2762 tor_assert(all_circuits_in);
2763 tor_assert(newly_complete_out);
2764
2766 /* We only upgrade a waiting circuit if the primary guards are all
2767 * down. */
2768 log_debug(LD_GUARD, "Considered upgrading guard-stalled circuits, "
2769 "but not all primary guards were definitely down.");
2770 return 0;
2771 }
2772
2773 int n_waiting = 0;
2774 int n_complete = 0;
2775 int n_complete_blocking = 0;
2776 origin_circuit_t *best_waiting_circuit = NULL;
2777 smartlist_t *all_circuits = smartlist_new();
2778 SMARTLIST_FOREACH_BEGIN(all_circuits_in, origin_circuit_t *, circ) {
2779 // We filter out circuits that aren't ours, or which we can't
2780 // reason about.
2781 circuit_guard_state_t *state = origin_circuit_get_guard_state(circ);
2782 if (state == NULL)
2783 continue;
2784 entry_guard_t *guard = entry_guard_handle_get(state->guard);
2785 if (!guard || guard->in_selection != gs)
2786 continue;
2787 if (TO_CIRCUIT(circ)->marked_for_close) {
2788 /* Don't consider any marked for close circuits. */
2789 continue;
2790 }
2791
2792 smartlist_add(all_circuits, circ);
2793 } SMARTLIST_FOREACH_END(circ);
2794
2795 SMARTLIST_FOREACH_BEGIN(all_circuits, origin_circuit_t *, circ) {
2796 circuit_guard_state_t *state = origin_circuit_get_guard_state(circ);
2797 if (BUG(state == NULL))
2798 continue;
2799
2800 if (state->state == GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD) {
2801 ++n_waiting;
2802 if (! best_waiting_circuit ||
2803 circ_state_has_higher_priority(circ, NULL, best_waiting_circuit)) {
2804 best_waiting_circuit = circ;
2805 }
2806 }
2807 } SMARTLIST_FOREACH_END(circ);
2808
2809 if (! best_waiting_circuit) {
2810 log_debug(LD_GUARD, "Considered upgrading guard-stalled circuits, "
2811 "but didn't find any.");
2812 goto no_change;
2813 }
2814
2815 /* We'll need to keep track of what restrictions were used when picking this
2816 * circuit, so that we don't allow any circuit without those restrictions to
2817 * block it. */
2818 const entry_guard_restriction_t *rst_on_best_waiting =
2819 origin_circuit_get_guard_state(best_waiting_circuit)->restrictions;
2820
2821 /* First look at the complete circuits: Do any block this circuit? */
2822 SMARTLIST_FOREACH_BEGIN(all_circuits, origin_circuit_t *, circ) {
2823 /* "C2 "blocks" C1 if:
2824 * C2 obeys all the restrictions that C1 had to obey, AND
2825 * C2 has higher priority than C1, AND
2826 * Either C2 is <complete>, or C2 is <waiting_for_better_guard>,
2827 or C2 has been <usable_if_no_better_guard> for no more than
2828 {NONPRIMARY_GUARD_CONNECT_TIMEOUT} seconds."
2829 */
2830 circuit_guard_state_t *state = origin_circuit_get_guard_state(circ);
2831 if (BUG(state == NULL))
2832 continue;
2833 if (state->state != GUARD_CIRC_STATE_COMPLETE)
2834 continue;
2835 ++n_complete;
2836 if (circ_state_has_higher_priority(circ, rst_on_best_waiting,
2837 best_waiting_circuit))
2838 ++n_complete_blocking;
2839 } SMARTLIST_FOREACH_END(circ);
2840
2841 if (n_complete_blocking) {
2842 log_debug(LD_GUARD, "Considered upgrading guard-stalled circuits: found "
2843 "%d complete and %d guard-stalled. At least one complete "
2844 "circuit had higher priority, so not upgrading.",
2845 n_complete, n_waiting);
2846 goto no_change;
2847 }
2848
2849 /* " * If any circuit C1 is <waiting_for_better_guard>, AND:
2850 * All primary guards have reachable status of <no>.
2851 * There is no circuit C2 that "blocks" C1.
2852 Then, upgrade C1 to <complete>.""
2853 */
2854 int n_blockers_found = 0;
2855 const time_t state_set_at_cutoff =
2857 SMARTLIST_FOREACH_BEGIN(all_circuits, origin_circuit_t *, circ) {
2858 circuit_guard_state_t *state = origin_circuit_get_guard_state(circ);
2859 if (BUG(state == NULL))
2860 continue;
2861 if (state->state != GUARD_CIRC_STATE_USABLE_IF_NO_BETTER_GUARD)
2862 continue;
2863 if (state->state_set_at <= state_set_at_cutoff)
2864 continue;
2865 if (circ_state_has_higher_priority(circ, rst_on_best_waiting,
2866 best_waiting_circuit))
2867 ++n_blockers_found;
2868 } SMARTLIST_FOREACH_END(circ);
2869
2870 if (n_blockers_found) {
2871 log_debug(LD_GUARD, "Considered upgrading guard-stalled circuits: found "
2872 "%d guard-stalled, but %d pending circuit(s) had higher "
2873 "guard priority, so not upgrading.",
2874 n_waiting, n_blockers_found);
2875 goto no_change;
2876 }
2877
2878 /* Okay. We have a best waiting circuit, and we aren't waiting for
2879 anything better. Add all circuits with that priority to the
2880 list, and call them COMPLETE. */
2881 int n_succeeded = 0;
2882 SMARTLIST_FOREACH_BEGIN(all_circuits, origin_circuit_t *, circ) {
2883 circuit_guard_state_t *state = origin_circuit_get_guard_state(circ);
2884 if (BUG(state == NULL))
2885 continue;
2886 if (circ != best_waiting_circuit && rst_on_best_waiting) {
2887 /* Can't upgrade other circ with same priority as best; might
2888 be blocked. */
2889 continue;
2890 }
2891 if (state->state != GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD)
2892 continue;
2893 if (circ_state_has_higher_priority(best_waiting_circuit, NULL, circ))
2894 continue;
2895
2896 state->state = GUARD_CIRC_STATE_COMPLETE;
2897 state->state_set_at = approx_time();
2898 smartlist_add(newly_complete_out, circ);
2899 ++n_succeeded;
2900 } SMARTLIST_FOREACH_END(circ);
2901
2902 log_info(LD_GUARD, "Considered upgrading guard-stalled circuits: found "
2903 "%d guard-stalled, %d complete. %d of the guard-stalled "
2904 "circuit(s) had high enough priority to upgrade.",
2905 n_waiting, n_complete, n_succeeded);
2906
2907 tor_assert_nonfatal(n_succeeded >= 1);
2908 smartlist_free(all_circuits);
2909 return 1;
2910
2911 no_change:
2912 smartlist_free(all_circuits);
2913 return 0;
2914}
2915
2916/**
2917 * Return true iff the circuit whose state is <b>guard_state</b> should
2918 * expire.
2919 */
2920int
2921entry_guard_state_should_expire(circuit_guard_state_t *guard_state)
2922{
2923 if (guard_state == NULL)
2924 return 0;
2925 const time_t expire_if_waiting_since =
2927 return (guard_state->state == GUARD_CIRC_STATE_WAITING_FOR_BETTER_GUARD
2928 && guard_state->state_set_at < expire_if_waiting_since);
2929}
2930
2931/**
2932 * Update all derived pieces of the guard selection state in <b>gs</b>.
2933 * Return true iff we should stop using all previously generated circuits.
2934 */
2935int
2936entry_guards_update_all(guard_selection_t *gs)
2937{
2942 return 0;
2943}
2944
2945/**
2946 * Return a newly allocated string for encoding the persistent parts of
2947 * <b>guard</b> to the state file. <b>dense_sampled_idx</b> refers to the
2948 * sampled_idx made dense for this <b>guard</b>. Encoding all guards should
2949 * lead to a dense array of sampled_idx in the state file.
2950 */
2951STATIC char *
2952entry_guard_encode_for_state(entry_guard_t *guard, int dense_sampled_idx)
2953{
2954 /*
2955 * The meta-format we use is K=V K=V K=V... where K can be any
2956 * characters excepts space and =, and V can be any characters except
2957 * space. The order of entries is not allowed to matter.
2958 * Unrecognized K=V entries are persisted; recognized but erroneous
2959 * entries are corrected.
2960 */
2961
2962 smartlist_t *result = smartlist_new();
2963 char tbuf[ISO_TIME_LEN+1];
2964
2965 tor_assert(guard);
2966
2967 smartlist_add_asprintf(result, "in=%s", guard->selection_name);
2968 smartlist_add_asprintf(result, "rsa_id=%s",
2969 hex_str(guard->identity, DIGEST_LEN));
2970 if (guard->bridge_addr) {
2971 smartlist_add_asprintf(result, "bridge_addr=%s:%d",
2972 fmt_and_decorate_addr(&guard->bridge_addr->addr),
2973 guard->bridge_addr->port);
2974 }
2975 if (strlen(guard->nickname) && is_legal_nickname(guard->nickname)) {
2976 smartlist_add_asprintf(result, "nickname=%s", guard->nickname);
2977 }
2978
2979 format_iso_time_nospace(tbuf, guard->sampled_on_date);
2980 smartlist_add_asprintf(result, "sampled_on=%s", tbuf);
2981 // Replacing the sampled_idx by dense array
2982 smartlist_add_asprintf(result, "sampled_idx=%d", dense_sampled_idx);
2983 if (guard->sampled_by_version) {
2984 smartlist_add_asprintf(result, "sampled_by=%s",
2985 guard->sampled_by_version);
2986 }
2987
2988 if (guard->unlisted_since_date > 0) {
2989 format_iso_time_nospace(tbuf, guard->unlisted_since_date);
2990 smartlist_add_asprintf(result, "unlisted_since=%s", tbuf);
2991 }
2992
2993 smartlist_add_asprintf(result, "listed=%d",
2994 (int)guard->currently_listed);
2995
2996 if (guard->confirmed_idx >= 0) {
2997 format_iso_time_nospace(tbuf, guard->confirmed_on_date);
2998 smartlist_add_asprintf(result, "confirmed_on=%s", tbuf);
2999
3000 smartlist_add_asprintf(result, "confirmed_idx=%d", guard->confirmed_idx);
3001 }
3002
3003 const double EPSILON = 1.0e-6;
3004
3005 /* Make a copy of the pathbias object, since we will want to update
3006 some of them */
3007 guard_pathbias_t *pb = tor_memdup(&guard->pb, sizeof(*pb));
3010
3011 #define PB_FIELD(field) do { \
3012 if (pb->field >= EPSILON) { \
3013 smartlist_add_asprintf(result, "pb_" #field "=%f", pb->field); \
3014 } \
3015 } while (0)
3016 PB_FIELD(use_attempts);
3017 PB_FIELD(use_successes);
3018 PB_FIELD(circ_attempts);
3019 PB_FIELD(circ_successes);
3020 PB_FIELD(successful_circuits_closed);
3021 PB_FIELD(collapsed_circuits);
3022 PB_FIELD(unusable_circuits);
3023 PB_FIELD(timeouts);
3024 tor_free(pb);
3025#undef PB_FIELD
3026
3027 if (guard->extra_state_fields)
3028 smartlist_add_strdup(result, guard->extra_state_fields);
3029
3030 char *joined = smartlist_join_strings(result, " ", 0, NULL);
3031 SMARTLIST_FOREACH(result, char *, cp, tor_free(cp));
3032 smartlist_free(result);
3033
3034 return joined;
3035}
3036
3037/**
3038 * Extract key=val from the state string <b>s</b> and duplicate the value to
3039 * some string target declared in entry_guard_parse_from_state
3040 */
3041static void
3043 *extra, strmap_t *vals)
3044{
3045 smartlist_split_string(entries, s, " ",
3046 SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
3047
3048 SMARTLIST_FOREACH_BEGIN(entries, char *, entry) {
3049 const char *eq = strchr(entry, '=');
3050 if (!eq) {
3051 smartlist_add(extra, entry);
3052 continue;
3053 }
3054 char *key = tor_strndup(entry, eq-entry);
3055 char **target = strmap_get(vals, key);
3056 if (target == NULL || *target != NULL) {
3057 /* unrecognized or already set */
3058 smartlist_add(extra, entry);
3059 tor_free(key);
3060 continue;
3061 }
3062
3063 *target = tor_strdup(eq+1);
3064 tor_free(key);
3065 tor_free(entry);
3066 } SMARTLIST_FOREACH_END(entry);
3067}
3068
3069/**
3070 * Handle part of the parsing state file logic, focused on time related things
3071 */
3072static void
3073parse_from_state_handle_time(entry_guard_t *guard, char *sampled_on, char
3074 *unlisted_since, char *confirmed_on)
3075{
3076#define HANDLE_TIME(field) do { \
3077 if (field) { \
3078 int r = parse_iso_time_nospace(field, &field ## _time); \
3079 if (r < 0) { \
3080 log_warn(LD_CIRC, "Unable to parse %s %s from guard", \
3081 #field, escaped(field)); \
3082 field##_time = -1; \
3083 } \
3084 } \
3085 } while (0)
3086
3087 time_t sampled_on_time = 0;
3088 time_t unlisted_since_time = 0;
3089 time_t confirmed_on_time = 0;
3090
3091 HANDLE_TIME(sampled_on);
3092 HANDLE_TIME(unlisted_since);
3093 HANDLE_TIME(confirmed_on);
3094
3095 if (sampled_on_time <= 0)
3096 sampled_on_time = approx_time();
3097 if (unlisted_since_time < 0)
3098 unlisted_since_time = 0;
3099 if (confirmed_on_time < 0)
3100 confirmed_on_time = 0;
3101
3102 #undef HANDLE_TIME
3103
3104 guard->sampled_on_date = sampled_on_time;
3105 guard->unlisted_since_date = unlisted_since_time;
3106 guard->confirmed_on_date = confirmed_on_time;
3107}
3108
3109/**
3110 * Given a string generated by entry_guard_encode_for_state(), parse it
3111 * (if possible) and return an entry_guard_t object for it. Return NULL
3112 * on complete failure.
3113 */
3114STATIC entry_guard_t *
3116{
3117 /* Unrecognized entries get put in here. */
3118 smartlist_t *extra = smartlist_new();
3119
3120 /* These fields get parsed from the string. */
3121 char *in = NULL;
3122 char *rsa_id = NULL;
3123 char *nickname = NULL;
3124 char *sampled_on = NULL;
3125 char *sampled_idx = NULL;
3126 char *sampled_by = NULL;
3127 char *unlisted_since = NULL;
3128 char *listed = NULL;
3129 char *confirmed_on = NULL;
3130 char *confirmed_idx = NULL;
3131 char *bridge_addr = NULL;
3132
3133 // pathbias
3134 char *pb_use_attempts = NULL;
3135 char *pb_use_successes = NULL;
3136 char *pb_circ_attempts = NULL;
3137 char *pb_circ_successes = NULL;
3138 char *pb_successful_circuits_closed = NULL;
3139 char *pb_collapsed_circuits = NULL;
3140 char *pb_unusable_circuits = NULL;
3141 char *pb_timeouts = NULL;
3142 int invalid_sampled_idx = get_max_sample_size_absolute();
3143
3144 /* Split up the entries. Put the ones we know about in strings and the
3145 * rest in "extra". */
3146 {
3147 smartlist_t *entries = smartlist_new();
3148
3149 strmap_t *vals = strmap_new(); // Maps keyword to location
3150#define FIELD(f) \
3151 strmap_set(vals, #f, &f);
3152 FIELD(in);
3153 FIELD(rsa_id);
3154 FIELD(nickname);
3155 FIELD(sampled_on);
3156 FIELD(sampled_idx);
3157 FIELD(sampled_by);
3158 FIELD(unlisted_since);
3159 FIELD(listed);
3160 FIELD(confirmed_on);
3161 FIELD(confirmed_idx);
3162 FIELD(bridge_addr);
3163 FIELD(pb_use_attempts);
3164 FIELD(pb_use_successes);
3165 FIELD(pb_circ_attempts);
3166 FIELD(pb_circ_successes);
3167 FIELD(pb_successful_circuits_closed);
3168 FIELD(pb_collapsed_circuits);
3169 FIELD(pb_unusable_circuits);
3170 FIELD(pb_timeouts);
3171#undef FIELD
3172 /* Extract from s the key=val that we recognize, put the others in extra*/
3173 parse_from_state_set_vals(s, entries, extra, vals);
3174
3175 smartlist_free(entries);
3176 strmap_free(vals, NULL);
3177 }
3178
3179 entry_guard_t *guard = tor_malloc_zero(sizeof(entry_guard_t));
3180 guard->is_persistent = 1;
3181
3182 if (in == NULL) {
3183 log_warn(LD_CIRC, "Guard missing 'in' field");
3184 goto err;
3185 }
3186
3187 guard->selection_name = in;
3188 in = NULL;
3189
3190 if (rsa_id == NULL) {
3191 log_warn(LD_CIRC, "Guard missing RSA ID field");
3192 goto err;
3193 }
3194
3195 /* Process the identity and nickname. */
3196 if (base16_decode(guard->identity, sizeof(guard->identity),
3197 rsa_id, strlen(rsa_id)) != DIGEST_LEN) {
3198 log_warn(LD_CIRC, "Unable to decode guard identity %s", escaped(rsa_id));
3199 goto err;
3200 }
3201
3202 if (nickname) {
3203 strlcpy(guard->nickname, nickname, sizeof(guard->nickname));
3204 } else {
3205 guard->nickname[0]='$';
3206 base16_encode(guard->nickname+1, sizeof(guard->nickname)-1,
3207 guard->identity, DIGEST_LEN);
3208 }
3209
3210 if (bridge_addr) {
3211 tor_addr_port_t res;
3212 memset(&res, 0, sizeof(res));
3213 int r = tor_addr_port_parse(LOG_WARN, bridge_addr,
3214 &res.addr, &res.port, -1);
3215 if (r == 0)
3216 guard->bridge_addr = tor_memdup(&res, sizeof(res));
3217 /* On error, we already warned. */
3218 }
3219
3220 /* Process the various time fields. */
3221 parse_from_state_handle_time(guard, sampled_on, unlisted_since,
3222 confirmed_on);
3223
3224 /* Take sampled_by_version verbatim. */
3225 guard->sampled_by_version = sampled_by;
3226 sampled_by = NULL; /* prevent free */
3227 /* Listed is a boolean */
3228 if (listed && strcmp(listed, "0"))
3229 guard->currently_listed = 1;
3230
3231 /* The index is a nonnegative integer. */
3232 guard->confirmed_idx = -1;
3233 if (confirmed_idx) {
3234 int ok=1;
3235 long idx = tor_parse_long(confirmed_idx, 10, 0, INT_MAX, &ok, NULL);
3236 if (! ok) {
3237 log_warn(LD_GUARD, "Guard has invalid confirmed_idx %s",
3238 escaped(confirmed_idx));
3239 } else {
3240 guard->confirmed_idx = (int)idx;
3241 }
3242 }
3243
3244 if (sampled_idx) {
3245 int ok = 1;
3246 long idx = tor_parse_long(sampled_idx, 10, 0, INT_MAX, &ok, NULL);
3247 if (!ok) {
3248 log_warn(LD_GUARD, "Guard has invalid sampled_idx %s",
3249 escaped(sampled_idx));
3250 /* set it to a idx higher than the max sample size */
3251 guard->sampled_idx = invalid_sampled_idx++;
3252 } else {
3253 guard->sampled_idx = (int)idx;
3254 }
3255 } else if (confirmed_idx) {
3256 /* This state has been written by an older Tor version which did not have
3257 * sample ordering */
3258
3259 guard->sampled_idx = guard->confirmed_idx;
3260 } else {
3261 log_info(LD_GUARD, "The state file seems to be into a status that could"
3262 " yield to weird entry node selection: we're missing both a"
3263 " sampled_idx and a confirmed_idx.");
3264 guard->sampled_idx = invalid_sampled_idx++;
3265 }
3266
3267 /* Anything we didn't recognize gets crammed together */
3268 if (smartlist_len(extra) > 0) {
3269 guard->extra_state_fields = smartlist_join_strings(extra, " ", 0, NULL);
3270 }
3271
3272 /* initialize non-persistent fields */
3273 guard->is_reachable = GUARD_REACHABLE_MAYBE;
3274
3275#define PB_FIELD(field) \
3276 do { \
3277 if (pb_ ## field) { \
3278 int ok = 1; \
3279 double r = tor_parse_double(pb_ ## field, 0.0, 1e9, &ok, NULL); \
3280 if (! ok) { \
3281 log_warn(LD_CIRC, "Guard has invalid pb_%s %s", \
3282 #field, pb_ ## field); \
3283 } else { \
3284 guard->pb.field = r; \
3285 } \
3286 } \
3287 } while (0)
3288 PB_FIELD(use_attempts);
3289 PB_FIELD(use_successes);
3290 PB_FIELD(circ_attempts);
3291 PB_FIELD(circ_successes);
3292 PB_FIELD(successful_circuits_closed);
3293 PB_FIELD(collapsed_circuits);
3294 PB_FIELD(unusable_circuits);
3295 PB_FIELD(timeouts);
3296#undef PB_FIELD
3297
3300
3301 /* We update everything on this guard later, after we've parsed
3302 * everything. */
3303
3304 goto done;
3305
3306 err:
3307 // only consider it an error if the guard state was totally unparseable.
3308 entry_guard_free(guard);
3309 guard = NULL;
3310
3311 done:
3312 tor_free(in);
3313 tor_free(rsa_id);
3314 tor_free(nickname);
3315 tor_free(sampled_on);
3316 tor_free(sampled_by);
3317 tor_free(unlisted_since);
3318 tor_free(listed);
3319 tor_free(confirmed_on);
3320 tor_free(confirmed_idx);
3321 tor_free(sampled_idx);
3322 tor_free(bridge_addr);
3323 tor_free(pb_use_attempts);
3324 tor_free(pb_use_successes);
3325 tor_free(pb_circ_attempts);
3326 tor_free(pb_circ_successes);
3327 tor_free(pb_successful_circuits_closed);
3328 tor_free(pb_collapsed_circuits);
3329 tor_free(pb_unusable_circuits);
3330 tor_free(pb_timeouts);
3331
3332 SMARTLIST_FOREACH(extra, char *, cp, tor_free(cp));
3333 smartlist_free(extra);
3334
3335 return guard;
3336}
3337
3338/**
3339 * Replace the Guards entries in <b>state</b> with a list of all our sampled
3340 * guards.
3341 */
3342static void
3344{
3345 if (!guard_contexts)
3346 return;
3347 config_line_t *lines = NULL;
3348 config_line_t **nextline = &lines;
3349
3350 SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) {
3351 int i = 0;
3352 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
3353 if (guard->is_persistent == 0)
3354 continue;
3355 *nextline = tor_malloc_zero(sizeof(config_line_t));
3356 (*nextline)->key = tor_strdup("Guard");
3357 (*nextline)->value = entry_guard_encode_for_state(guard, i);
3358 nextline = &(*nextline)->next;
3359 i++;
3360 } SMARTLIST_FOREACH_END(guard);
3361 } SMARTLIST_FOREACH_END(gs);
3362
3363 config_free_lines(state->Guard);
3364 state->Guard = lines;
3365}
3366
3367/**
3368 * Replace our sampled guards from the Guards entries in <b>state</b>. Return 0
3369 * on success, -1 on failure. (If <b>set</b> is true, replace nothing -- only
3370 * check whether replacing would work.)
3371 */
3372static int
3374{
3375 const config_line_t *line = state->Guard;
3376 int n_errors = 0;
3377
3378 if (!guard_contexts)
3380
3381 /* Wipe all our existing guard info. (we shouldn't have any, but
3382 * let's be safe.) */
3383 if (set) {
3384 SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) {
3385 guard_selection_free(gs);
3386 if (curr_guard_context == gs)
3387 curr_guard_context = NULL;
3389 } SMARTLIST_FOREACH_END(gs);
3390 }
3391
3392 for ( ; line != NULL; line = line->next) {
3393 entry_guard_t *guard = entry_guard_parse_from_state(line->value);
3394 if (guard == NULL) {
3395 ++n_errors;
3396 continue;
3397 }
3398 tor_assert(guard->selection_name);
3399 if (!strcmp(guard->selection_name, "legacy")) {
3400 ++n_errors;
3401 entry_guard_free(guard);
3402 continue;
3403 }
3404
3405 if (set) {
3406 guard_selection_t *gs;
3407 gs = get_guard_selection_by_name(guard->selection_name,
3408 GS_TYPE_INFER, 1);
3409 tor_assert(gs);
3410 smartlist_add(gs->sampled_entry_guards, guard);
3411 guard->in_selection = gs;
3412 /* Recompute the next_sampled_id from the state. We do not assume that
3413 * sampled guards appear in the correct order within the file, and we
3414 * need to know what would be the next sampled idx to give to any
3415 * new sampled guard (i.e., max of guard->sampled_idx + 1)*/
3416 if (gs->next_sampled_idx <= guard->sampled_idx) {
3417 gs->next_sampled_idx = guard->sampled_idx + 1;
3418 }
3419
3420 } else {
3421 entry_guard_free(guard);
3422 }
3423 }
3424
3425 if (set) {
3426 SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) {
3427 /** Guards should be in sample order within the file, but it is maybe
3428 * better NOT to assume that. Let's order them before updating lists
3429 */
3430 smartlist_sort(gs->sampled_entry_guards, compare_guards_by_sampled_idx);
3432 } SMARTLIST_FOREACH_END(gs);
3433 }
3434 return n_errors ? -1 : 0;
3435}
3436
3437/** If <b>digest</b> matches the identity of any node in the
3438 * entry_guards list for the provided guard selection state,
3439 return that node. Else return NULL. */
3440entry_guard_t *
3442 const char *digest)
3443{
3444 return get_sampled_guard_with_id(gs, (const uint8_t*)digest);
3445}
3446
3447/** Return the node_t associated with a single entry_guard_t. May
3448 * return NULL if the guard is not currently in the consensus. */
3449const node_t *
3450entry_guard_find_node(const entry_guard_t *guard)
3451{
3452 tor_assert(guard);
3453 return node_get_by_id(guard->identity);
3454}
3455
3456/** If <b>digest</b> matches the identity of any node in the
3457 * entry_guards list for the default guard selection state,
3458 return that node. Else return NULL. */
3459entry_guard_t *
3461{
3463 get_guard_selection_info(), digest);
3464}
3465
3466/** We are about to connect to bridge with identity <b>digest</b> to fetch its
3467 * descriptor. Create a new guard state for this connection and return it. */
3468circuit_guard_state_t *
3470{
3471 circuit_guard_state_t *guard_state = NULL;
3472 entry_guard_t *guard = NULL;
3473
3475 get_guard_selection_info(), digest);
3476 if (!guard) {
3477 return NULL;
3478 }
3479
3480 /* Update the guard last_tried_to_connect time since it's checked by the
3481 * guard subsystem. */
3482 guard->last_tried_to_connect = approx_time();
3483
3484 /* Create the guard state */
3485 guard_state = circuit_guard_state_new(guard,
3486 GUARD_CIRC_STATE_USABLE_ON_COMPLETION,
3487 NULL);
3488
3489 return guard_state;
3490}
3491
3492/** Release all storage held by <b>e</b>. */
3493STATIC void
3494entry_guard_free_(entry_guard_t *e)
3495{
3496 if (!e)
3497 return;
3498 entry_guard_handles_clear(e);
3499 tor_free(e->sampled_by_version);
3500 tor_free(e->extra_state_fields);
3501 tor_free(e->selection_name);
3502 tor_free(e->bridge_addr);
3503 tor_free(e);
3504}
3505
3506/** Return 0 if we're fine adding arbitrary routers out of the
3507 * directory to our entry guard list, or return 1 if we have a
3508 * list already and we must stick to it.
3509 */
3510int
3512{
3513 // XXXX #21425 look at the current selection.
3514 if (options->EntryNodes)
3515 return 1;
3516 if (options->UseBridges)
3517 return 1;
3518 return 0;
3519}
3520
3521/** Return the number of bridges that have descriptors that are marked with
3522 * purpose 'bridge' and are running. If use_maybe_reachable is
3523 * true, include bridges that might be reachable in the count.
3524 * Otherwise, if it is false, only include bridges that have recently been
3525 * found running in the count.
3526 *
3527 * We use this function to decide if we're ready to start building
3528 * circuits through our bridges, or if we need to wait until the
3529 * directory "server/authority" requests finish. */
3530MOCK_IMPL(int,
3531num_bridges_usable,(int use_maybe_reachable))
3532{
3533 int n_options = 0;
3534
3535 if (BUG(!get_options()->UseBridges)) {
3536 return 0;
3537 }
3538 guard_selection_t *gs = get_guard_selection_info();
3539 if (BUG(gs->type != GS_TYPE_BRIDGE)) {
3540 return 0;
3541 }
3542
3543 SMARTLIST_FOREACH_BEGIN(gs->sampled_entry_guards, entry_guard_t *, guard) {
3544 /* Not a bridge, or not one we are configured to be able to use. */
3545 if (! guard->is_filtered_guard)
3546 continue;
3547 /* Definitely not usable */
3548 if (guard->is_reachable == GUARD_REACHABLE_NO)
3549 continue;
3550 /* If we want to be really sure the bridges will work, skip maybes */
3551 if (!use_maybe_reachable && guard->is_reachable == GUARD_REACHABLE_MAYBE)
3552 continue;
3553 if (tor_digest_is_zero(guard->identity))
3554 continue;
3555 const node_t *node = node_get_by_id(guard->identity);
3556 if (node && node->ri)
3557 ++n_options;
3558 } SMARTLIST_FOREACH_END(guard);
3559
3560 return n_options;
3561}
3562
3563/** Check the pathbias use success count of <b>node</b> and disable it if it
3564 * goes over our thresholds. */
3565static void
3567{
3568 const or_options_t *options = get_options();
3569 const double EPSILON = 1.0e-9;
3570
3571 /* Note: We rely on the < comparison here to allow us to set a 0
3572 * rate and disable the feature entirely. If refactoring, don't
3573 * change to <= */
3574 if (node->pb.use_attempts > EPSILON &&
3575 pathbias_get_use_success_count(node)/node->pb.use_attempts
3576 < pathbias_get_extreme_use_rate(options) &&
3577 pathbias_get_dropguards(options)) {
3578 node->pb.path_bias_disabled = 1;
3579 log_info(LD_GENERAL,
3580 "Path use bias is too high (%f/%f); disabling node %s",
3581 node->pb.circ_successes, node->pb.circ_attempts,
3582 node->nickname);
3583 }
3584}
3585
3586/** Check the pathbias close count of <b>node</b> and disable it if it goes
3587 * over our thresholds. */
3588static void
3590{
3591 const or_options_t *options = get_options();
3592 const double EPSILON = 1.0e-9;
3593
3594 /* Note: We rely on the < comparison here to allow us to set a 0
3595 * rate and disable the feature entirely. If refactoring, don't
3596 * change to <= */
3597 if (node->pb.circ_attempts > EPSILON &&
3598 pathbias_get_close_success_count(node)/node->pb.circ_attempts
3599 < pathbias_get_extreme_rate(options) &&
3600 pathbias_get_dropguards(options)) {
3601 node->pb.path_bias_disabled = 1;
3602 log_info(LD_GENERAL,
3603 "Path bias is too high (%f/%f); disabling node %s",
3604 node->pb.circ_successes, node->pb.circ_attempts,
3605 node->nickname);
3606 }
3607}
3608
3609/** Parse <b>state</b> and learn about the entry guards it describes.
3610 * If <b>set</b> is true, and there are no errors, replace the guard
3611 * list in the default guard selection context with what we find.
3612 * On success, return 0. On failure, alloc into *<b>msg</b> a string
3613 * describing the error, and return -1.
3614 */
3615int
3616entry_guards_parse_state(or_state_t *state, int set, char **msg)
3617{
3619 int r1 = entry_guards_load_guards_from_state(state, set);
3621
3622 if (r1 < 0) {
3623 if (msg && *msg == NULL) {
3624 *msg = tor_strdup("parsing error");
3625 }
3626 return -1;
3627 }
3628 return 0;
3629}
3630
3631/** How long will we let a change in our guard nodes stay un-saved
3632 * when we are trying to avoid disk writes? */
3633#define SLOW_GUARD_STATE_FLUSH_TIME 600
3634/** How long will we let a change in our guard nodes stay un-saved
3635 * when we are not trying to avoid disk writes? */
3636#define FAST_GUARD_STATE_FLUSH_TIME 30
3637
3638/** Our list of entry guards has changed for a particular guard selection
3639 * context, or some element of one of our entry guards has changed for one.
3640 * Write the changes to disk within the next few minutes.
3641 */
3642void
3644{
3645 time_t when;
3646
3647 tor_assert(gs != NULL);
3648
3650
3651 if (get_options()->AvoidDiskWrites)
3652 when = time(NULL) + SLOW_GUARD_STATE_FLUSH_TIME;
3653 else
3654 when = time(NULL) + FAST_GUARD_STATE_FLUSH_TIME;
3655
3656 /* or_state_save() will call entry_guards_update_state() and
3657 entry_guards_update_guards_in_state()
3658 */
3660
3661 /* Schedule a re-assessment of whether we have enough dir info to
3662 * use the network. When we add or remove or disable or enable a
3663 * guard, the decision could shift. */
3665}
3666
3667/** Our list of entry guards has changed for the default guard selection
3668 * context, or some element of one of our entry guards has changed. Write
3669 * the changes to disk within the next few minutes.
3670 */
3671void
3673{
3675}
3676
3677/** If the entry guard info has not changed, do nothing and return.
3678 * Otherwise, free the EntryGuards piece of <b>state</b> and create
3679 * a new one out of the global entry_guards list, and then mark
3680 * <b>state</b> dirty so it will get saved to disk.
3681 */
3682void
3684{
3686
3687 // Handles all guard info.
3689
3691
3692 if (!get_options()->AvoidDiskWrites)
3695}
3696
3697/** Return true iff the circuit's guard can succeed, that is, can be used. */
3698int
3699entry_guard_could_succeed(const circuit_guard_state_t *guard_state)
3700{
3701 if (get_options()->UseEntryGuards == 0) {
3702 /* we're fine with this circuit's first hop, because we're not
3703 * configured to use entry guards. */
3704 return 1;
3705 }
3706
3707 if (!guard_state) {
3708 return 0;
3709 }
3710
3711 entry_guard_t *guard = entry_guard_handle_get(guard_state->guard);
3712 if (!guard || BUG(guard->in_selection == NULL)) {
3713 return 0;
3714 }
3715
3716 return 1;
3717}
3718
3719/**
3720 * Format a single entry guard in the format expected by the controller.
3721 * Return a newly allocated string.
3722 */
3723STATIC char *
3725{
3726 const char *status = NULL;
3727 time_t when = 0;
3728 const node_t *node;
3729 char tbuf[ISO_TIME_LEN+1];
3730 char nbuf[MAX_VERBOSE_NICKNAME_LEN+1];
3731
3732 /* This is going to be a bit tricky, since the status
3733 * codes weren't really intended for prop271 guards.
3734 *
3735 * XXXX use a more appropriate format for exporting this information
3736 */
3737 if (e->confirmed_idx < 0) {
3738 status = "never-connected";
3739 } else if (! e->currently_listed) {
3740 when = e->unlisted_since_date;
3741 status = "unusable";
3742 } else if (! e->is_filtered_guard) {
3743 status = "unusable";
3744 } else if (e->is_reachable == GUARD_REACHABLE_NO) {
3745 when = e->failing_since;
3746 status = "down";
3747 } else {
3748 status = "up";
3749 }
3750
3751 node = entry_guard_find_node(e);
3752 if (node) {
3753 node_get_verbose_nickname(node, nbuf);
3754 } else {
3755 nbuf[0] = '$';
3756 base16_encode(nbuf+1, sizeof(nbuf)-1, e->identity, DIGEST_LEN);
3757 /* e->nickname field is not very reliable if we don't know about
3758 * this router any longer; don't include it. */
3759 }
3760
3761 char *result = NULL;
3762 if (when) {
3763 format_iso_time(tbuf, when);
3764 tor_asprintf(&result, "%s %s %s\n", nbuf, status, tbuf);
3765 } else {
3766 tor_asprintf(&result, "%s %s\n", nbuf, status);
3767 }
3768 return result;
3769}
3770
3771/** If <b>question</b> is the string "entry-guards", then dump
3772 * to *<b>answer</b> a newly allocated string describing all of
3773 * the nodes in the global entry_guards list. See control-spec.txt
3774 * for details.
3775 * For backward compatibility, we also handle the string "helper-nodes".
3776 *
3777 * XXX this should be totally redesigned after prop 271 too, and that's
3778 * going to take some control spec work.
3779 * */
3780int
3782 const char *question, char **answer,
3783 const char **errmsg)
3784{
3785 guard_selection_t *gs = get_guard_selection_info();
3786
3787 tor_assert(gs != NULL);
3788
3789 (void) conn;
3790 (void) errmsg;
3791
3792 if (!strcmp(question,"entry-guards") ||
3793 !strcmp(question,"helper-nodes")) {
3794 const smartlist_t *guards;
3795 guards = gs->sampled_entry_guards;
3796
3797 smartlist_t *sl = smartlist_new();
3798
3799 SMARTLIST_FOREACH_BEGIN(guards, const entry_guard_t *, e) {
3801 smartlist_add(sl, cp);
3802 } SMARTLIST_FOREACH_END(e);
3803 *answer = smartlist_join_strings(sl, "", 0, NULL);
3804 SMARTLIST_FOREACH(sl, char *, c, tor_free(c));
3805 smartlist_free(sl);
3806 }
3807 return 0;
3808}
3809
3810/* Given the original bandwidth of a guard and its guardfraction,
3811 * calculate how much bandwidth the guard should have as a guard and
3812 * as a non-guard.
3813 *
3814 * Quoting from proposal236:
3815 *
3816 * Let Wpf denote the weight from the 'bandwidth-weights' line a
3817 * client would apply to N for position p if it had the guard
3818 * flag, Wpn the weight if it did not have the guard flag, and B the
3819 * measured bandwidth of N in the consensus. Then instead of choosing
3820 * N for position p proportionally to Wpf*B or Wpn*B, clients should
3821 * choose N proportionally to F*Wpf*B + (1-F)*Wpn*B.
3822 *
3823 * This function fills the <b>guardfraction_bw</b> structure. It sets
3824 * <b>guard_bw</b> to F*B and <b>non_guard_bw</b> to (1-F)*B.
3825 */
3826void
3827guard_get_guardfraction_bandwidth(guardfraction_bandwidth_t *guardfraction_bw,
3828 int orig_bandwidth,
3829 uint32_t guardfraction_percentage)
3830{
3831 double guardfraction_fraction;
3832
3833 /* Turn the percentage into a fraction. */
3834 tor_assert(guardfraction_percentage <= 100);
3835 guardfraction_fraction = guardfraction_percentage / 100.0;
3836
3837 long guard_bw = tor_lround(guardfraction_fraction * orig_bandwidth);
3838 tor_assert(guard_bw <= INT_MAX);
3839
3840 guardfraction_bw->guard_bw = (int) guard_bw;
3841
3842 guardfraction_bw->non_guard_bw = orig_bandwidth - (int) guard_bw;
3843}
3844
3845/** Helper: Update the status of all entry guards, in whatever algorithm
3846 * is used. Return true if we should stop using all previously generated
3847 * circuits, by calling circuit_mark_all_unused_circs() and
3848 * circuit_mark_all_dirty_circs_as_unusable().
3849 */
3850int
3852{
3853 int mark_circuits = 0;
3855 mark_circuits = 1;
3856
3858
3860 mark_circuits = 1;
3861
3862 return mark_circuits;
3863}
3864
3865/** Helper: pick a guard for a circuit, with whatever algorithm is
3866 used. */
3867const node_t *
3869 cpath_build_state_t *state,
3870 uint8_t purpose,
3871 circuit_guard_state_t **guard_state_out)
3872{
3873 const node_t *r = NULL;
3874 const uint8_t *exit_id = NULL;
3875 entry_guard_restriction_t *rst = NULL;
3876
3877 /* If we this is a conflux circuit, build an exclusion list for it. */
3878 if (CIRCUIT_IS_CONFLUX(TO_CIRCUIT(circ))) {
3879 rst = guard_create_conflux_restriction(circ);
3880 /* Don't allow connecting back to the exit if there is one */
3881 if (state && (exit_id = build_state_get_exit_rsa_id(state))) {
3882 /* add the exit_id to the excluded list */
3883 smartlist_add(rst->excluded, tor_memdup(exit_id, DIGEST_LEN));
3884 }
3885 } else if (state && !circuit_should_use_vanguards(purpose) &&
3886 (exit_id = build_state_get_exit_rsa_id(state))) {
3887 /* We're building to a targeted exit node, so that node can't be
3888 * chosen as our guard for this circuit, unless we're vanguards. */
3889 rst = guard_create_exit_restriction(exit_id);
3890 tor_assert(rst);
3891 }
3893 GUARD_USAGE_TRAFFIC,
3894 rst,
3895 &r,
3896 guard_state_out) < 0) {
3897 tor_assert(r == NULL);
3898 }
3899 return r;
3900}
3901
3902/** Remove all currently listed entry guards for a given guard selection
3903 * context. This frees and replaces <b>gs</b>, so don't use <b>gs</b>
3904 * after calling this function. */
3905void
3907{
3908 // This function shouldn't exist. XXXX
3909 tor_assert(gs != NULL);
3910 char *old_name = tor_strdup(gs->name);
3911 guard_selection_type_t old_type = gs->type;
3912
3913 SMARTLIST_FOREACH(gs->sampled_entry_guards, entry_guard_t *, entry, {
3914 control_event_guard(entry->nickname, entry->identity, "DROPPED");
3915 });
3916
3917 if (gs == curr_guard_context) {
3918 curr_guard_context = NULL;
3919 }
3920
3922 guard_selection_free(gs);
3923
3924 gs = get_guard_selection_by_name(old_name, old_type, 1);
3926 tor_free(old_name);
3927}
3928
3929/** Remove all currently listed entry guards, so new ones will be chosen.
3930 *
3931 * XXXX This function shouldn't exist -- it's meant to support the DROPGUARDS
3932 * command, which is deprecated.
3933 */
3934void
3936{
3938}
3939
3940/** Helper: pick a directory guard, with whatever algorithm is used. */
3941const node_t *
3942guards_choose_dirguard(uint8_t dir_purpose,
3943 circuit_guard_state_t **guard_state_out)
3944{
3945 const node_t *r = NULL;
3946 entry_guard_restriction_t *rst = NULL;
3947
3948 /* If we are fetching microdescs, don't query outdated dirservers. */
3949 if (dir_purpose == DIR_PURPOSE_FETCH_MICRODESC) {
3951 }
3952
3954 GUARD_USAGE_DIRGUARD,
3955 rst,
3956 &r,
3957 guard_state_out) < 0) {
3958 tor_assert(r == NULL);
3959 }
3960 return r;
3961}
3962
3963/**
3964 * If we're running with a constrained guard set, then maybe mark our guards
3965 * usable. Return 1 if we do; 0 if we don't.
3966 */
3967int
3969{
3970 if (! entry_list_is_constrained(options))
3971 return 0;
3972
3974
3975 return 1;
3976}
3977
3978/**
3979 * Check if we are missing any crucial dirinfo for the guard subsystem to
3980 * work. Return NULL if everything went well, otherwise return a newly
3981 * allocated string with an informative error message. In the latter case, use
3982 * the general descriptor information <b>using_mds</b>, <b>num_present</b> and
3983 * <b>num_usable</b> to improve the error message. */
3984char *
3986 int using_mds,
3987 int num_present, int num_usable)
3988{
3989 if (!gs->primary_guards_up_to_date)
3991
3992 char *ret_str = NULL;
3993 int n_missing_descriptors = 0;
3994 int n_considered = 0;
3995 int num_primary_to_check;
3996
3997 /* We want to check for the descriptor of at least the first two primary
3998 * guards in our list, since these are the guards that we typically use for
3999 * circuits. */
4000 num_primary_to_check = get_n_primary_guards_to_use(GUARD_USAGE_TRAFFIC);
4001 num_primary_to_check++;
4002
4003 SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, guard) {
4005 if (guard->is_reachable == GUARD_REACHABLE_NO)
4006 continue;
4007 n_considered++;
4008 if (!guard_has_descriptor(guard))
4009 n_missing_descriptors++;
4010 if (n_considered >= num_primary_to_check)
4011 break;
4012 } SMARTLIST_FOREACH_END(guard);
4013
4014 /* If we are not missing any descriptors, return NULL. */
4015 if (!n_missing_descriptors) {
4016 return NULL;
4017 }
4018
4019 /* otherwise return a helpful error string */
4020 tor_asprintf(&ret_str, "We're missing descriptors for %d/%d of our "
4021 "primary entry guards (total %sdescriptors: %d/%d). "
4022 "That's ok. We will try to fetch missing descriptors soon.",
4023 n_missing_descriptors, num_primary_to_check,
4024 using_mds?"micro":"", num_present, num_usable);
4025
4026 return ret_str;
4027}
4028
4029/** As guard_selection_have_enough_dir_info_to_build_circuits, but uses
4030 * the default guard selection. */
4031char *
4033 int num_present, int num_usable)
4034{
4037 using_mds,
4038 num_present, num_usable);
4039}
4040
4041/** Free one guard selection context */
4042STATIC void
4043guard_selection_free_(guard_selection_t *gs)
4044{
4045 if (!gs) return;
4046
4047 tor_free(gs->name);
4048
4049 if (gs->sampled_entry_guards) {
4050 SMARTLIST_FOREACH(gs->sampled_entry_guards, entry_guard_t *, e,
4051 entry_guard_free(e));
4052 smartlist_free(gs->sampled_entry_guards);
4053 gs->sampled_entry_guards = NULL;
4054 }
4055
4056 smartlist_free(gs->confirmed_entry_guards);
4057 smartlist_free(gs->primary_entry_guards);
4058
4059 tor_free(gs);
4060}
4061
4062/**********************************************************************/
4063
4064/** Layer2 guard subsystem (vanguards-lite) used for onion service circuits */
4065
4066/** A simple representation of a layer2 guard. We just need its identity so
4067 * that we feed it into a routerset, and a sampled timestamp to do expiration
4068 * checks. */
4069typedef struct layer2_guard_t {
4070 /** Identity of the guard */
4072 /** When does this guard expire? (randomized timestamp) */
4075
4076#define layer2_guard_free(val) \
4077 FREE_AND_NULL(layer2_guard_t, layer2_guard_free_, (val))
4078
4079/** Return true if the vanguards-lite subsystem is enabled */
4080bool
4082{
4083 /* First check torrc option and then maybe also the consensus parameter. */
4084 const or_options_t *options = get_options();
4085
4086 /* If the option is explicitly disabled, that's the final word here */
4087 if (options->VanguardsLiteEnabled == 0) {
4088 return false;
4089 }
4090
4091 /* If the option is set to auto, then check the consensus parameter */
4092 if (options->VanguardsLiteEnabled == -1) {
4093 return networkstatus_get_param(NULL, "vanguards-lite-enabled",
4094 1, /* default to "on" */
4095 0, 1);
4096 }
4097
4098 /* else it's enabled */
4099 tor_assert_nonfatal(options->VanguardsLiteEnabled == 1);
4100 return options->VanguardsLiteEnabled;
4101}
4102
4103static void
4104layer2_guard_free_(layer2_guard_t *l2)
4105{
4106 if (!l2) {
4107 return;
4108 }
4109
4110 tor_free(l2);
4111}
4112
4113/** Global list and routerset of L2 guards. They are both synced and they get
4114 * updated periodically. We need both the list and the routerset: we use the
4115 * smartlist to keep track of expiration times and the routerset is what we
4116 * return to the users of this subsystem. */
4118static routerset_t *layer2_routerset = NULL;
4119
4120/** Number of L2 guards */
4121#define NUMBER_SECOND_GUARDS 4
4122/** Make sure that the number of L2 guards is less than the number of
4123 * MAX_SANE_RESTRICTED_NODES */
4125
4126/** Lifetime of L2 guards:
4127 * 1 to 12 days, for an average of a week using the max(x,x) distribution */
4128#define MIN_SECOND_GUARD_LIFETIME (3600*24)
4129#define MAX_SECOND_GUARD_LIFETIME (3600*24*12)
4130
4131/** Return the number of guards our L2 guardset should have */
4132static int
4134{
4135 return (int) networkstatus_get_param(NULL,
4136 "guard-hs-l2-number",
4138 1, 19);
4139}
4140
4141/** Return the minimum lifetime of L2 guards */
4142static int
4144{
4145 return (int) networkstatus_get_param(NULL,
4146 "guard-hs-l2-lifetime-min",
4148 1, INT32_MAX);
4149}
4150
4151/** Return the maximum lifetime of L2 guards */
4152static int
4154{
4155 return (int) networkstatus_get_param(NULL,
4156 "guard-hs-l2-lifetime-max",
4157 MAX_SECOND_GUARD_LIFETIME,
4158 1, INT32_MAX);
4159}
4160
4161/**
4162 * Sample and return a lifetime for an L2 guard.
4163 *
4164 * Lifetime randomized uniformly between min and max consensus params.
4165 */
4166static int
4168{
4171
4172 if (BUG(min >= max)) {
4173 return min;
4174 }
4175
4176 return crypto_rand_int_range(min, max);
4177}
4178
4179/** Maintain the L2 guard list. Make sure the list contains enough guards, do
4180 * expirations as necessary, and keep all the data structures of this
4181 * subsystem synchronized */
4182void
4184{
4186 return;
4187 }
4188
4189 /* Create the list if it doesn't exist */
4190 if (!layer2_guards) {
4192 }
4193
4194 /* Go through the list and perform any needed expirations */
4196 /* Expire based on expiration date */
4197 if (g->expire_on_date <= approx_time()) {
4198 log_info(LD_GENERAL, "Removing expired Layer2 guard %s",
4199 safe_str_client(hex_str(g->identity, DIGEST_LEN)));
4200 // Nickname may be gone from consensus and doesn't matter anyway
4201 control_event_guard("None", g->identity, "BAD_L2");
4202 layer2_guard_free(g);
4204 continue;
4205 }
4206
4207 /* Expire if relay has left consensus */
4208 const routerstatus_t *rs = router_get_consensus_status_by_id(g->identity);
4209 if (rs == NULL || !rs->is_stable || !rs->is_fast) {
4210 log_info(LD_GENERAL, "Removing %s Layer2 guard %s",
4211 rs ? "unsuitable" : "missing",
4212 safe_str_client(hex_str(g->identity, DIGEST_LEN)));
4213 // Nickname may be gone from consensus and doesn't matter anyway
4214 control_event_guard("None", g->identity, "BAD_L2");
4215 layer2_guard_free(g);
4217 continue;
4218 }
4219 } SMARTLIST_FOREACH_END(g);
4220
4221 /* Find out how many guards we need to add */
4222 int new_guards_needed_n =
4224 if (new_guards_needed_n <= 0) {
4225 return;
4226 }
4227
4228 log_info(LD_GENERAL, "Adding %d guards to Layer2 routerset",
4229 new_guards_needed_n);
4230
4231 /* First gather the exclusions based on our current L2 guards */
4232 smartlist_t *excluded = smartlist_new();
4234 /* Exclude existing L2 guard so that we don't double-pick it.
4235 * But, it's ok if they come from the same family. */
4236 const node_t *existing = node_get_by_id(g->identity);
4237 if (existing)
4238 smartlist_add(excluded, (node_t *)existing);
4239 } SMARTLIST_FOREACH_END(g);
4240
4241 /* Add required guards to the list */
4242 for (int i = 0; i < new_guards_needed_n; i++) {
4243 const node_t *choice = NULL;
4244 const or_options_t *options = get_options();
4245 /* Pick Stable nodes */
4246 router_crn_flags_t flags = CRN_NEED_DESC|CRN_NEED_UPTIME;
4247 choice = router_choose_random_node(excluded, options->ExcludeNodes, flags);
4248 if (!choice) {
4249 break;
4250 }
4251
4252 /* We found our node: create an L2 guard out of it */
4253 layer2_guard_t *layer2_guard = tor_malloc_zero(sizeof(layer2_guard_t));
4254 memcpy(layer2_guard->identity, choice->identity, DIGEST_LEN);
4255 layer2_guard->expire_on_date = approx_time() +
4257 smartlist_add(layer2_guards, layer2_guard);
4258 log_info(LD_GENERAL, "Adding Layer2 guard %s",
4259 safe_str_client(hex_str(layer2_guard->identity, DIGEST_LEN)));
4260 // Nickname can also be None here because it is looked up later
4261 control_event_guard("None", layer2_guard->identity,
4262 "GOOD_L2");
4263 /* Exclude this node so that we don't double-pick it. (Again, coming
4264 * from the same family is ok here.) */
4265 smartlist_add(excluded, (node_t *)choice);
4266 }
4267
4268 /* Some cleanup */
4269 smartlist_free(excluded);
4270
4271 /* Now that the list is up to date, synchronize the routerset */
4272 routerset_free(layer2_routerset);
4273 layer2_routerset = routerset_new();
4274
4276 routerset_parse(layer2_routerset,
4277 hex_str(g->identity, DIGEST_LEN),
4278 "l2 guards");
4279 } SMARTLIST_FOREACH_END(g);
4280}
4281
4282/**
4283 * Reset vanguards-lite list(s).
4284 *
4285 * Used for SIGNAL NEWNYM.
4286 */
4287void
4289{
4290 if (!layer2_guards)
4291 return;
4292
4293 /* Go through the list and perform any needed expirations */
4295 layer2_guard_free(g);
4296 } SMARTLIST_FOREACH_END(g);
4297
4299
4300 /* Pick new l2 guards */
4302}
4303
4304/** Return a routerset containing the L2 guards or NULL if it's not yet
4305 * initialized. Callers must not free the routerset. Designed for use in
4306 * pick_vanguard_middle_node() and should not be used anywhere else. Do not
4307 * store this pointer -- any future calls to maintain_layer2_guards() and
4308 * purge_vanguards_lite() can invalidate it. */
4309const routerset_t *
4311{
4312 if (!layer2_guards) {
4314 }
4315
4316 return layer2_routerset;
4317}
4318
4319/*****************************************************************************/
4320
4321/** Release all storage held by the list of entry guards and related
4322 * memory structs. */
4323void
4325{
4326 /* Null out the default */
4327 curr_guard_context = NULL;
4328 /* Free all the guard contexts */
4329 if (guard_contexts != NULL) {
4330 SMARTLIST_FOREACH_BEGIN(guard_contexts, guard_selection_t *, gs) {
4331 guard_selection_free(gs);
4332 } SMARTLIST_FOREACH_END(gs);
4333 smartlist_free(guard_contexts);
4334 guard_contexts = NULL;
4335 }
4337
4338 if (!layer2_guards) {
4339 return;
4340 }
4341
4343 layer2_guard_free(g);
4344 } SMARTLIST_FOREACH_END(g);
4345
4346 smartlist_free(layer2_guards);
4347 routerset_free(layer2_routerset);
4348}
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:1065
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:389
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)
Definition: circpathbias.c:232
double pathbias_get_extreme_rate(const or_options_t *options)
Definition: circpathbias.c:125
double pathbias_get_use_success_count(entry_guard_t *guard)
int pathbias_get_dropguards(const or_options_t *options)
Definition: circpathbias.c:141
double pathbias_get_close_success_count(entry_guard_t *guard)
circuit_guard_state_t * origin_circuit_get_guard_state(origin_circuit_t *circ)
Definition: circuitbuild.c:557
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)
Definition: circuitlist.c:185
void circuit_get_all_pending_on_channel(smartlist_t *out, channel_t *chan)
Definition: circuitlist.c:597
Header file for circuitlist.c.
#define CIRCUIT_IS_ORIGIN(c)
Definition: circuitlist.h:154
#define EPSILON
void circuit_build_times_free_timeouts(circuit_build_times_t *cbt)
Definition: circuitstats.c:591
circuit_build_times_t * get_circuit_build_times_mutable(void)
Definition: circuitstats.c:85
Header file for circuitstats.c.
int circuit_should_use_vanguards(uint8_t purpose)
Definition: circuituse.c:2013
Header file for circuituse.c.
#define ARRAY_LENGTH(x)
const char * name
Definition: config.c:2462
const or_options_t * get_options(void)
Definition: config.c:944
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
Definition: crypto_digest.h:35
void * smartlist_choose(const smartlist_t *sl)
Definition: crypto_rand.c:594
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
Definition: digest_sizes.h:20
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)
Definition: entrynodes.c:2653
char * guard_selection_get_err_str_if_dir_info_missing(guard_selection_t *gs, int using_mds, int num_present, int num_usable)
Definition: entrynodes.c:3985
STATIC int get_n_primary_guards(void)
Definition: entrynodes.c:465
const node_t * entry_guard_find_node(const entry_guard_t *guard)
Definition: entrynodes.c:3450
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)
Definition: entrynodes.c:1944
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)
Definition: entrynodes.c:2673
static void entry_guards_update_guards_in_state(or_state_t *state)
Definition: entrynodes.c:3343
const routerset_t * get_layer2_guards(void)
Definition: entrynodes.c:4310
void entry_guards_changed(void)
Definition: entrynodes.c:3672
static int guard_obeys_md_dirserver_restriction(const entry_guard_t *guard)
Definition: entrynodes.c:1669
STATIC void entry_guards_note_guard_failure(guard_selection_t *gs, entry_guard_t *guard)
Definition: entrynodes.c:2356
STATIC void guard_selection_free_(guard_selection_t *gs)
Definition: entrynodes.c:4043
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)
Definition: entrynodes.c:3935
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)
Definition: entrynodes.c:4288
static int reasonably_live_consensus_is_missing(const guard_selection_t *gs)
Definition: entrynodes.c:1159
static void entry_guard_set_filtered_flags(const or_options_t *options, guard_selection_t *gs, entry_guard_t *guard)
Definition: entrynodes.c:1723
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)
Definition: entrynodes.c:2632
static entry_guard_t * select_and_add_guard_item_for_sample(guard_selection_t *gs, smartlist_t *eligible_guards)
Definition: entrynodes.c:1131
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)
Definition: entrynodes.c:2133
entry_guard_t * entry_guard_get_by_id_digest(const char *digest)
Definition: entrynodes.c:3460
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)
Definition: entrynodes.c:2757
#define NUMBER_SECOND_GUARDS
Definition: entrynodes.c:4121
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)
Definition: entrynodes.c:1243
void remove_all_entry_guards_for_guard_selection(guard_selection_t *gs)
Definition: entrynodes.c:3906
int num_bridges_usable(int use_maybe_reachable)
Definition: entrynodes.c:3531
#define MIN_GUARDS_FOR_MD_RESTRICTION
Definition: entrynodes.c:1610
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)
Definition: entrynodes.c:2936
static smartlist_t * layer2_guards
Definition: entrynodes.c:4117
STATIC circuit_guard_state_t * circuit_guard_state_new(entry_guard_t *guard, unsigned state, entry_guard_restriction_t *rst)
Definition: entrynodes.c:2535
STATIC entry_guard_t * first_reachable_filtered_entry_guard(guard_selection_t *gs, const entry_guard_restriction_t *rst, unsigned flags)
Definition: entrynodes.c:1774
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)
Definition: entrynodes.c:4133
static int guard_in_node_family(const entry_guard_t *guard, const node_t *node)
Definition: entrynodes.c:1554
static size_t sampled_guards_update_consensus_presence(guard_selection_t *gs)
Definition: entrynodes.c:1297
static int should_set_md_dirserver_restriction(void)
Definition: entrynodes.c:1616
STATIC void entry_guard_free_(entry_guard_t *e)
Definition: entrynodes.c:3494
STATIC void entry_guard_restriction_free_(entry_guard_restriction_t *rst)
Definition: entrynodes.c:2508
int entry_list_is_constrained(const or_options_t *options)
Definition: entrynodes.c:3511
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)
Definition: entrynodes.c:2605
circuit_guard_state_t * get_guard_state_for_bridge_desc_fetch(const char *digest)
Definition: entrynodes.c:3469
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)
Definition: entrynodes.c:2227
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)
Definition: entrynodes.c:1367
STATIC int entry_guard_has_higher_priority(entry_guard_t *a, entry_guard_t *b)
Definition: entrynodes.c:2470
void entry_guards_note_internet_connectivity(guard_selection_t *gs)
Definition: entrynodes.c:2121
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)
Definition: entrynodes.c:4032
STATIC void entry_guards_update_confirmed(guard_selection_t *gs)
Definition: entrynodes.c:1879
STATIC char * entry_guard_encode_for_state(entry_guard_t *guard, int dense_sampled_idx)
Definition: entrynodes.c:2952
STATIC void entry_guards_update_filtered_sets(guard_selection_t *gs)
Definition: entrynodes.c:1753
void entry_guards_update_state(or_state_t *state)
Definition: entrynodes.c:3683
bool vanguards_lite_is_enabled(void)
Definition: entrynodes.c:4081
static void pathbias_check_close_success_count(entry_guard_t *guard)
Definition: entrynodes.c:3589
static int get_layer2_hs_guard_lifetime(void)
Definition: entrynodes.c:4167
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)
Definition: entrynodes.c:1635
static bool entry_guard_restriction_is_reachability(const entry_guard_restriction_t *rst)
Definition: entrynodes.c:1689
static int compare_guards_by_sampled_idx(const void **a_, const void **b_)
Definition: entrynodes.c:1862
void circuit_guard_state_free_(circuit_guard_state_t *state)
Definition: entrynodes.c:2522
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)
Definition: entrynodes.c:2559
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)
Definition: entrynodes.c:4183
static void parse_from_state_handle_time(entry_guard_t *guard, char *sampled_on, char *unlisted_since, char *confirmed_on)
Definition: entrynodes.c:3073
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)
Definition: entrynodes.c:3616
STATIC unsigned entry_guards_note_guard_success(guard_selection_t *gs, entry_guard_t *guard, unsigned old_state)
Definition: entrynodes.c:2393
static int entry_guard_obeys_restriction(const entry_guard_t *guard, const entry_guard_restriction_t *rst)
Definition: entrynodes.c:1700
int entry_guard_state_should_expire(circuit_guard_state_t *guard_state)
Definition: entrynodes.c:2921
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)
Definition: entrynodes.c:3868
int entry_guard_could_succeed(const circuit_guard_state_t *guard_state)
Definition: entrynodes.c:3699
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)
Definition: entrynodes.c:3566
int guards_retry_optimistic(const or_options_t *options)
Definition: entrynodes.c:3968
STATIC int entry_guard_is_listed(guard_selection_t *gs, const entry_guard_t *guard)
Definition: entrynodes.c:1272
const node_t * guards_choose_dirguard(uint8_t dir_purpose, circuit_guard_state_t **guard_state_out)
Definition: entrynodes.c:3942
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)
Definition: entrynodes.c:2264
static smartlist_t * get_eligible_guards(const or_options_t *options, guard_selection_t *gs, int *n_guards_out)
Definition: entrynodes.c:1073
STATIC void entry_guard_consider_retry(entry_guard_t *guard)
Definition: entrynodes.c:2082
static int entry_guard_passes_filter(const or_options_t *options, guard_selection_t *gs, entry_guard_t *guard)
Definition: entrynodes.c:1526
#define SLOW_GUARD_STATE_FLUSH_TIME
Definition: entrynodes.c:3633
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)
Definition: entrynodes.c:3643
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)
Definition: entrynodes.c:4143
static int bridge_passes_guard_filter(const or_options_t *options, const bridge_info_t *bridge)
Definition: entrynodes.c:1499
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)
Definition: entrynodes.c:1026
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)
Definition: entrynodes.c:2699
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)
Definition: entrynodes.c:2040
static int entry_guards_load_guards_from_state(or_state_t *state, int set)
Definition: entrynodes.c:3373
STATIC char * getinfo_helper_format_single_entry_guard(const entry_guard_t *e)
Definition: entrynodes.c:3724
#define FAST_GUARD_STATE_FLUSH_TIME
Definition: entrynodes.c:3636
static int node_is_possible_guard(const node_t *node)
Definition: entrynodes.c:783
#define MIN_SECOND_GUARD_LIFETIME
Definition: entrynodes.c:4128
STATIC void make_guard_confirmed(guard_selection_t *gs, entry_guard_t *guard)
Definition: entrynodes.c:1911
static int circ_state_has_higher_priority(origin_circuit_t *a, const entry_guard_restriction_t *rst, origin_circuit_t *b)
Definition: entrynodes.c:2720
int getinfo_helper_entry_guards(control_connection_t *conn, const char *question, char **answer, const char **errmsg)
Definition: entrynodes.c:3781
guard_selection_t * get_guard_selection_info(void)
Definition: entrynodes.c:312
STATIC entry_guard_t * entry_guard_parse_from_state(const char *s)
Definition: entrynodes.c:3115
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)
Definition: entrynodes.c:2303
STATIC int get_guard_lifetime(void)
Definition: entrynodes.c:436
static int get_max_lifetime_of_layer2_hs_guards(void)
Definition: entrynodes.c:4153
static void parse_from_state_set_vals(const char *s, smartlist_t *entries, smartlist_t *extra, strmap_t *vals)
Definition: entrynodes.c:3042
static int get_max_sample_size(guard_selection_t *gs, int n_guards)
Definition: entrynodes.c:1043
int guards_update_all(void)
Definition: entrynodes.c:3851
CTASSERT(NUMBER_SECOND_GUARDS< 20)
STATIC void sampled_guards_update_from_consensus(guard_selection_t *gs)
Definition: entrynodes.c:1427
entry_guard_t * entry_guard_get_by_id_digest_for_guard_selection(guard_selection_t *gs, const char *digest)
Definition: entrynodes.c:3441
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)
Definition: entrynodes.c:1178
static int node_passes_guard_filter(const or_options_t *options, const node_t *node)
Definition: entrynodes.c:1474
void entry_guards_free_all(void)
Definition: entrynodes.c:4324
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:1086
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)
Definition: node_select.c:979
const node_t * node_sl_choose_by_bandwidth(const smartlist_t *sl, bandwidth_weight_rule_t rule)
Definition: node_select.c:856
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:2479
const smartlist_t * nodelist_get_list(void)
Definition: nodelist.c:1047
int router_addrs_in_same_network(const tor_addr_t *a1, const tor_addr_t *a2)
Definition: nodelist.c:2102
int node_has_preferred_descriptor(const node_t *node, int for_direct_connect)
Definition: nodelist.c:1509
const char * node_get_nickname(const node_t *node)
Definition: nodelist.c:1459
int node_is_dir(const node_t *node)
Definition: nodelist.c:1473
void node_get_addr(const node_t *node, tor_addr_t *addr_out)
Definition: nodelist.c:1681
void node_get_verbose_nickname(const node_t *node, char *verbose_name_out)
Definition: nodelist.c:1542
int nodes_in_same_family(const node_t *node1, const node_t *node2)
Definition: nodelist.c:2204
int router_have_minimum_dir_info(void)
Definition: nodelist.c:2436
Header file for nodelist.c.
Master header file for Tor-specific functionality.
#define TO_CIRCUIT(x)
Definition: or.h:848
#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:1744
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.
char identity[DIGEST_LEN]
Definition: bridges.c:55
double use_successes
Definition: entrynodes.h:62
double successful_circuits_closed
Definition: entrynodes.h:52
time_t expire_on_date
Definition: entrynodes.c:4073
char identity[DIGEST_LEN]
Definition: entrynodes.c:4071
Definition: node_st.h:34
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
int VanguardsLiteEnabled
int NumDirectoryGuards
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)
Definition: testsupport.h:133
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