summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2006-06-18 21:08:22 +0000
committerRoger Dingledine <arma@torproject.org>2006-06-18 21:08:22 +0000
commit337fe8fc23487ae350482a6bc410791b5774d36d (patch)
treea12a8fbdac079c207f2b0f3187aa299f2ca7355b
parentb3c32dfcc87b730966dd336629530c8367ed6430 (diff)
downloadtor-337fe8fc23487ae350482a6bc410791b5774d36d.tar.gz
tor-337fe8fc23487ae350482a6bc410791b5774d36d.zip
backport the code to automatically pick a TestVia node that is
running a non-buggy tor. svn:r6661
-rw-r--r--src/or/circuitbuild.c56
1 files changed, 52 insertions, 4 deletions
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index ae0139a76d..203b22d2d2 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -1465,6 +1465,49 @@ onion_append_to_cpath(crypt_path_t **head_ptr, crypt_path_t *new_hop)
}
}
+/** Pick a random server digest that's running a Tor version that
+ * doesn't have the reachability bug. These are versions 0.1.1.21-cvs+
+ * and 0.1.2.1-alpha+. Avoid picking authorities, since we're
+ * probably already connected to them.
+ *
+ * We only return one, so this doesn't become stupid when the
+ * whole network has upgraded. */
+static char *
+compute_preferred_testing_list(const char *answer)
+{
+ smartlist_t *choices;
+ routerlist_t *rl = router_get_routerlist();
+ routerinfo_t *router;
+ char *s;
+
+ if (answer) /* they have one in mind -- easy */
+ return tor_strdup(answer);
+
+ choices = smartlist_create();
+ /* now count up our choices */
+ SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r,
+ if (r->is_running && r->is_valid &&
+ ((tor_version_as_new_as(r->platform,"0.1.1.21-cvs") &&
+ !tor_version_as_new_as(r->platform,"0.1.2.0-alpha-cvs")) ||
+ tor_version_as_new_as(r->platform,"0.1.2.1-alpha")) &&
+ !router_get_trusteddirserver_by_digest(r->cache_info.identity_digest))
+ smartlist_add(choices, r));
+ router = smartlist_choose(choices);
+ smartlist_free(choices);
+ if (!router) {
+ log_info(LD_CIRC, "Looking for middle server that doesn't have the "
+ "reachability bug, but didn't find one. Oh well.");
+ return NULL;
+ }
+ log_info(LD_CIRC, "Looking for middle server that doesn't have the "
+ "reachability bug, and chose '%s'. Great.", router->nickname);
+ s = tor_malloc(HEX_DIGEST_LEN+2);
+ s[0] = '$';
+ base16_encode(s+1, HEX_DIGEST_LEN+1,
+ router->cache_info.identity_digest, DIGEST_LEN);
+ return s;
+}
+
/** A helper function used by onion_extend_cpath(). Use <b>purpose</b>
* and <b>state</b> and the cpath <b>head</b> (currently populated only
* to length <b>cur_len</b> to decide a suitable middle hop for a
@@ -1481,6 +1524,8 @@ choose_good_middle_server(uint8_t purpose,
routerinfo_t *r, *choice;
crypt_path_t *cpath;
smartlist_t *excluded;
+ or_options_t *options = get_options();
+ char *preferred = NULL;
tor_assert(_CIRCUIT_PURPOSE_MIN <= purpose &&
purpose <= _CIRCUIT_PURPOSE_MAX);
@@ -1500,11 +1545,14 @@ choose_good_middle_server(uint8_t purpose,
routerlist_add_family(excluded, r);
}
}
- choice = router_choose_random_node(
- purpose == CIRCUIT_PURPOSE_TESTING ? get_options()->TestVia : NULL,
- get_options()->ExcludeNodes, excluded,
+ if (purpose == CIRCUIT_PURPOSE_TESTING)
+ preferred = compute_preferred_testing_list(options->TestVia);
+ choice = router_choose_random_node(preferred,
+ options->ExcludeNodes, excluded,
state->need_uptime, state->need_capacity, 0,
- get_options()->_AllowInvalid & ALLOW_INVALID_MIDDLE, 0);
+ options->_AllowInvalid & ALLOW_INVALID_MIDDLE, 0);
+ if (preferred)
+ tor_free(preferred);
smartlist_free(excluded);
return choice;
}