Make authorities not set Running unless all advertised OR ports are reachable.

Resolves #6621.
This commit is contained in:
Linus Nordberg
2012-08-17 12:53:25 +02:00
parent cdd882ee71
commit b1c4b3ad0e
+17 -4
View File
@@ -980,6 +980,7 @@ dirserv_set_router_is_running(routerinfo_t *router, time_t now)
unreachable.
*/
int answer;
const or_options_t *options = get_options();
node_t *node = node_get_mutable_by_id(router->cache_info.identity_digest);
tor_assert(node);
@@ -992,13 +993,23 @@ dirserv_set_router_is_running(routerinfo_t *router, time_t now)
/* A hibernating router is down unless we (somehow) had contact with it
* since it declared itself to be hibernating. */
answer = 0;
} else if (get_options()->AssumeReachable) {
} else if (options->AssumeReachable) {
/* If AssumeReachable, everybody is up unless they say they are down! */
answer = 1;
} else {
/* Otherwise, a router counts as up if we found it reachable in the last
REACHABLE_TIMEOUT seconds. */
answer = (now < node->last_reachable + REACHABLE_TIMEOUT);
/* Otherwise, a router counts as up if we found all announced OR
ports reachable in the last REACHABLE_TIMEOUT seconds.
XXX prop186 For now there's always one IPv4 and at most one
IPv6 OR port.
If we're not on IPv6, don't consider reachability of potential
IPv6 OR port since that'd kill all dual stack relays until a
majority of the dir auths have IPv6 connectivity. */
answer = (now < node->last_reachable + REACHABLE_TIMEOUT &&
(options->AuthDirHasIPv6Connectivity == 0 ||
tor_addr_is_null(&router->ipv6_addr) ||
now < node->last_reachable6 + REACHABLE_TIMEOUT));
}
if (!answer && running_long_enough_to_decide_unreachable()) {
@@ -1008,6 +1019,8 @@ dirserv_set_router_is_running(routerinfo_t *router, time_t now)
REACHABILITY_TEST_CYCLE_PERIOD seconds, then the router has probably
been down since at least that time after we last successfully reached
it.
XXX ipv6
*/
time_t when = now;
if (node->last_reachable &&