소스 검색

Merge remote-tracking branch 'linus/bug6621'

Nick Mathewson 13 년 전
부모
커밋
d517233e71
1개의 변경된 파일17개의 추가작업 그리고 4개의 파일을 삭제
  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 &&