Browse Source

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

Resolves #6621.
Linus Nordberg 13 years ago
parent
commit
b1c4b3ad0e
1 changed files with 17 additions and 4 deletions
  1. 17 4
      src/or/dirserv.c

+ 17 - 4
src/or/dirserv.c

@@ -980,6 +980,7 @@ dirserv_set_router_is_running(routerinfo_t *router, time_t now)
     unreachable.
     unreachable.
    */
    */
   int answer;
   int answer;
+  const or_options_t *options = get_options();
   node_t *node = node_get_mutable_by_id(router->cache_info.identity_digest);
   node_t *node = node_get_mutable_by_id(router->cache_info.identity_digest);
   tor_assert(node);
   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
     /* A hibernating router is down unless we (somehow) had contact with it
      * since it declared itself to be hibernating. */
      * since it declared itself to be hibernating. */
     answer = 0;
     answer = 0;
-  } else if (get_options()->AssumeReachable) {
+  } else if (options->AssumeReachable) {
     /* If AssumeReachable, everybody is up unless they say they are down! */
     /* If AssumeReachable, everybody is up unless they say they are down! */
     answer = 1;
     answer = 1;
   } else {
   } 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()) {
   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
        REACHABILITY_TEST_CYCLE_PERIOD seconds, then the router has probably
        been down since at least that time after we last successfully reached
        been down since at least that time after we last successfully reached
        it.
        it.
+
+       XXX ipv6
      */
      */
     time_t when = now;
     time_t when = now;
     if (node->last_reachable &&
     if (node->last_reachable &&