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