diff options
author | Roger Dingledine <arma@torproject.org> | 2005-03-26 01:43:39 +0000 |
---|---|---|
committer | Roger Dingledine <arma@torproject.org> | 2005-03-26 01:43:39 +0000 |
commit | 13283834829877d6cf81dd7d63224a650c89ad8d (patch) | |
tree | 96b2dca90b293c702dcf67ecc46a099cb765fcda /src | |
parent | e203d47192135079c34a6cf29307de5220126ee6 (diff) | |
download | tor-13283834829877d6cf81dd7d63224a650c89ad8d.tar.gz tor-13283834829877d6cf81dd7d63224a650c89ad8d.zip |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/or/circuitbuild.c | 5 | ||||
-rw-r--r-- | src/or/connection.c | 1 | ||||
-rw-r--r-- | src/or/main.c | 18 | ||||
-rw-r--r-- | src/or/or.h | 1 | ||||
-rw-r--r-- | src/or/router.c | 24 |
5 files changed, 39 insertions, 10 deletions
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index 37073f8b8b..f050a54f85 100644 --- a/src/or/circuitbuild.c +++ b/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 */ diff --git a/src/or/connection.c b/src/or/connection.c index bd49ac057a..fa5a53534e 100644 --- a/src/or/connection.c +++ b/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; } diff --git a/src/or/main.c b/src/or/main.c index 82b711a512..fcc9960da7 100644 --- a/src/or/main.c +++ b/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; diff --git a/src/or/or.h b/src/or/or.h index 7ccfdb3391..a38f724672 100644 --- a/src/or/or.h +++ b/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); diff --git a/src/or/router.c b/src/or/router.c index 6fcba84ad1..6927f0e9bd 100644 --- a/src/or/router.c +++ b/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) { |