diff options
author | Roger Dingledine <arma@torproject.org> | 2013-10-12 10:48:30 -0400 |
---|---|---|
committer | Roger Dingledine <arma@torproject.org> | 2013-10-12 10:48:30 -0400 |
commit | a26a5794a308ce30c5d2cf8d16e57903cbf9c8fb (patch) | |
tree | cee081f733fcb1a32ed06e0af7691015e6d3e774 /src/or/entrynodes.c | |
parent | d5f050111ecd93c6ddb80be79ff9d636f40d5ed7 (diff) | |
parent | 8f9fb63cdb188e27e39cf063c6a9e94df66cf239 (diff) | |
download | tor-a26a5794a308ce30c5d2cf8d16e57903cbf9c8fb.tar.gz tor-a26a5794a308ce30c5d2cf8d16e57903cbf9c8fb.zip |
Merge branch 'maint-0.2.4'
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 2e045e0f11..b97b2ea39e 100644 --- a/src/or/entrynodes.c +++ b/src/or/entrynodes.c @@ -349,7 +349,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; @@ -408,6 +408,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); @@ -441,7 +453,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; } @@ -874,7 +886,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); @@ -1058,7 +1070,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 @@ -2136,7 +2148,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)); |