|
@@ -935,11 +935,21 @@ dirserv_set_router_is_running(routerinfo_t *router, time_t now)
|
|
|
*/
|
|
|
int answer;
|
|
|
|
|
|
- if (router_is_me(router) && !we_are_hibernating())
|
|
|
+ if (router_is_me(router))
|
|
|
+ /* We always know if we are down ourselves. */
|
|
|
+ answer = ! we_are_hibernating();
|
|
|
+ else if (router->is_hibernating &&
|
|
|
+ router->cache_info.published_on > router->last_reachable)
|
|
|
+ /* 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)
|
|
|
+ /* If AssumeReachable, everybody is up! */
|
|
|
answer = 1;
|
|
|
else
|
|
|
- answer = get_options()->AssumeReachable ||
|
|
|
- now < router->last_reachable + REACHABLE_TIMEOUT;
|
|
|
+ /* Otherwise, a router counts as up if we found it reachable in the last
|
|
|
+ REACHABLE_TIMEOUT seconds. */
|
|
|
+ answer = (now < router->last_reachable + REACHABLE_TIMEOUT);
|
|
|
|
|
|
if (!answer && running_long_enough_to_decide_unreachable()) {
|
|
|
/* not considered reachable. tell rephist. */
|