Explorar el Código

Merge remote-tracking branch 'linus/bug6621'

Nick Mathewson hace 14 años
padre
commit
d517233e71
Se han modificado 1 ficheros con 17 adiciones y 4 borrados
  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 &&