Browse Source

make it clearer to the human that his server is testing
its reachability. tell him when it succeeds, or when 20
minutes pass and it hasn't succeeded yet.


svn:r3882

Roger Dingledine 19 years ago
parent
commit
1328383482
5 changed files with 39 additions and 10 deletions
  1. 5 0
      src/or/circuitbuild.c
  2. 0 1
      src/or/connection.c
  3. 15 3
      src/or/main.c
  4. 1 0
      src/or/or.h
  5. 18 6
      src/or/router.c

+ 5 - 0
src/or/circuitbuild.c

@@ -463,9 +463,14 @@ int circuit_send_next_onion_skin(circuit_t *circ) {
       log_fn(LOG_INFO,"circuit built!");
       circuit_reset_failure_count(0);
       if (!has_completed_circuit) {
+        or_options_t *options = get_options();
         has_completed_circuit=1;
         log_fn(LOG_NOTICE,"Tor has successfully opened a circuit. Looks like it's working.");
         /* XXX009 Log a count of known routers here */
+        if (server_mode(options) && !check_whether_ports_reachable())
+          log_fn(LOG_NOTICE,"Now checking whether ORPort %s %s reachable...",
+                 options->DirPort ? "and DirPort" : "",
+                 options->DirPort ? "are" : "is");
       }
       circuit_rep_hist_note_result(circ);
       circuit_has_opened(circ); /* do other actions as necessary */

+ 0 - 1
src/or/connection.c

@@ -1163,7 +1163,6 @@ int connection_handle_write(connection_t *conn) {
         connection_edge_end_errno(conn, conn->cpath_layer);
 
       connection_close_immediate(conn); /* Don't flush; connection is dead. */
-      conn->has_sent_end = 1;
       connection_mark_for_close(conn);
       return -1;
     }

+ 15 - 3
src/or/main.c

@@ -775,6 +775,7 @@ static void second_elapsed_callback(int fd, short event, void *args)
   size_t bytes_written;
   size_t bytes_read;
   int seconds_elapsed;
+  or_options_t *options = get_options();
   if (!timeout_event) {
     timeout_event = tor_malloc_zero(sizeof(struct event));
     evtimer_set(timeout_event, second_elapsed_callback, NULL);
@@ -797,7 +798,7 @@ static void second_elapsed_callback(int fd, short event, void *args)
   seconds_elapsed = current_second ? (now.tv_sec - current_second) : 0;
   stats_n_bytes_read += bytes_read;
   stats_n_bytes_written += bytes_written;
-  if (accounting_is_enabled(get_options()))
+  if (accounting_is_enabled(options))
     accounting_add_bytes(bytes_read, bytes_written, seconds_elapsed);
   control_event_bandwidth_used((uint32_t)bytes_read,(uint32_t)bytes_written);
 
@@ -805,6 +806,17 @@ static void second_elapsed_callback(int fd, short event, void *args)
   stats_prev_global_read_bucket = global_read_bucket;
   stats_prev_global_write_bucket = global_write_bucket;
 
+#define TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT (20*60) /* 20 minutes */
+  if (server_mode(options) &&
+      stats_n_seconds_working < TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT &&
+      stats_n_seconds_working+seconds_elapsed >=
+        TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT &&
+      !check_whether_ports_reachable()) {
+    routerinfo_t *me = router_get_my_routerinfo();
+    tor_assert(me);
+    log_fn(LOG_WARN,"Your server (%s:%d) has not managed to confirm that it is reachable. Please check your firewalls, ports, address, etc.", me->address, me->or_port);
+  }
+
   /* if more than 10s have elapsed, probably the clock jumped: doesn't count. */
   if (seconds_elapsed < 100)
     stats_n_seconds_working += seconds_elapsed;
@@ -932,11 +944,11 @@ static int do_main_loop(void) {
       int e = errno;
       /* let the program survive things like ^z */
       if (e != EINTR) {
-        log_fn(LOG_ERR,"poll failed: %s [%d]",
+        log_fn(LOG_ERR,"event poll failed: %s [%d]",
                tor_socket_strerror(e), e);
         return -1;
       } else {
-        log_fn(LOG_DEBUG,"poll interrupted.");
+        log_fn(LOG_DEBUG,"event poll interrupted.");
         /* You can't trust the results of this poll(). Go back to the
          * top of the big for loop. */
         continue;

+ 1 - 0
src/or/or.h

@@ -1694,6 +1694,7 @@ void rotate_onion_key(void);
 crypto_pk_env_t *init_key_from_file(const char *fname);
 int init_keys(void);
 
+int check_whether_ports_reachable(void);
 void consider_testing_reachability(void);
 void router_orport_found_reachable(void);
 void router_dirport_found_reachable(void);

+ 18 - 6
src/or/router.c

@@ -381,6 +381,15 @@ static int can_reach_or_port = 0;
 /** Whether we can reach our DirPort from the outside. */
 static int can_reach_dir_port = 0;
 
+/** Return 1 if all open ports are known reachable; else return 0. */
+int check_whether_ports_reachable(void) {
+  if (!can_reach_or_port)
+    return 0;
+  if (get_options()->DirPort && !can_reach_dir_port)
+    return 0;
+  return 1;
+}
+
 void consider_testing_reachability(void) {
   routerinfo_t *me = router_get_my_routerinfo();
 
@@ -397,11 +406,17 @@ void consider_testing_reachability(void) {
   }
 }
 
+static void ports_now_reachable(void) {
+  log_fn(LOG_NOTICE,"Your server is reachable. Publishing server descriptor.");
+}
+
 /** Annotate that we found our ORPort reachable. */
 void router_orport_found_reachable(void) {
   if (!can_reach_or_port) {
     log_fn(LOG_NOTICE,"Your ORPort is reachable from the outside. Excellent.");
     can_reach_or_port = 1;
+    if (check_whether_ports_reachable())
+      ports_now_reachable();
   }
 }
 
@@ -410,6 +425,8 @@ void router_dirport_found_reachable(void) {
   if (!can_reach_dir_port) {
     log_fn(LOG_NOTICE,"Your DirPort is reachable from the outside. Excellent.");
     can_reach_dir_port = 1;
+    if (check_whether_ports_reachable())
+      ports_now_reachable();
   }
 }
 
@@ -474,12 +491,7 @@ static int decide_if_publishable_server(time_t now) {
   if (options->AuthoritativeDir)
     return 1;
 
-  if (!can_reach_or_port)
-    return 0;
-  if (options->DirPort && !can_reach_dir_port)
-    return 0;
-
-  return 1;
+  return check_whether_ports_reachable();
 }
 
 void consider_publishable_server(time_t now, int force) {