summaryrefslogtreecommitdiff
path: root/src/or/entrynodes.c
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2013-10-12 10:48:30 -0400
committerRoger Dingledine <arma@torproject.org>2013-10-12 10:48:30 -0400
commita26a5794a308ce30c5d2cf8d16e57903cbf9c8fb (patch)
treecee081f733fcb1a32ed06e0af7691015e6d3e774 /src/or/entrynodes.c
parentd5f050111ecd93c6ddb80be79ff9d636f40d5ed7 (diff)
parent8f9fb63cdb188e27e39cf063c6a9e94df66cf239 (diff)
downloadtor-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.c22
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));