diff options
Diffstat (limited to 'src/or/entrynodes.c')
-rw-r--r-- | src/or/entrynodes.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c index f1af75aefb..2aa063cda4 100644 --- a/src/or/entrynodes.c +++ b/src/or/entrynodes.c @@ -345,7 +345,7 @@ control_event_guard_deferred(void) * Else, put the one we pick at the end of the list. */ static const node_t * add_an_entry_guard(const node_t *chosen, int reset_status, int prepend, - int for_directory) + int for_discovery, int for_directory) { const node_t *node; entry_guard_t *entry; @@ -404,6 +404,18 @@ add_an_entry_guard(const node_t *chosen, int reset_status, int prepend, * this guard. For details, see the Jan 2010 or-dev thread. */ entry->chosen_on_date = time(NULL) - crypto_rand_int(3600*24*30); entry->chosen_by_version = tor_strdup(VERSION); + + /* Are we picking this guard because all of our current guards are + * down so we need another one (for_discovery is 1), or because we + * decided we need more variety in our guard list (for_discovery is 0)? + * + * Currently we hack this behavior into place by setting "made_contact" + * for guards of the latter variety, so we'll be willing to use any of + * them right off the bat. + */ + if (!for_discovery) + entry->made_contact = 1; + ((node_t*)node)->using_as_guard = 1; if (prepend) smartlist_insert(entry_guards, 0, entry); @@ -437,7 +449,7 @@ pick_entry_guards(const or_options_t *options, int for_directory) tor_assert(entry_guards); while (num_live_entry_guards(for_directory) < num_needed) { - if (!add_an_entry_guard(NULL, 0, 0, for_directory)) + if (!add_an_entry_guard(NULL, 0, 0, 0, for_directory)) break; changed = 1; } @@ -870,7 +882,7 @@ entry_guards_set_from_config(const or_options_t *options) /* Next, the rest of EntryNodes */ SMARTLIST_FOREACH_BEGIN(entry_nodes, const node_t *, node) { - add_an_entry_guard(node, 0, 0, 0); + add_an_entry_guard(node, 0, 0, 1, 0); if (smartlist_len(entry_guards) > options->NumEntryGuards * 10) break; } SMARTLIST_FOREACH_END(node); @@ -1054,7 +1066,7 @@ choose_random_entry_impl(cpath_build_state_t *state, int for_directory, /* XXX if guard doesn't imply fast and stable, then we need * to tell add_an_entry_guard below what we want, or it might * be a long time til we get it. -RD */ - node = add_an_entry_guard(NULL, 0, 0, for_directory); + node = add_an_entry_guard(NULL, 0, 0, 1, for_directory); if (node) { entry_guards_changed(); /* XXX we start over here in case the new node we added shares @@ -2095,7 +2107,7 @@ learned_bridge_descriptor(routerinfo_t *ri, int from_cache) node = node_get_mutable_by_id(ri->cache_info.identity_digest); tor_assert(node); rewrite_node_address_for_bridge(bridge, node); - add_an_entry_guard(node, 1, 1, 0); + add_an_entry_guard(node, 1, 1, 0, 0); log_notice(LD_DIR, "new bridge descriptor '%s' (%s): %s", ri->nickname, from_cache ? "cached" : "fresh", router_describe(ri)); |