From: Roger Dingledine Date: Sat, 19 Mar 2005 04:38:59 +0000 (+0000) Subject: make hidden services more likely to work from the server-side X-Git-Tag: tor-0.1.0.1-rc~114 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ec7f232b242d4291219ed3cb8dc272d904d02c34;p=thirdparty%2Ftor.git make hidden services more likely to work from the server-side svn:r3781 --- diff --git a/src/or/circuituse.c b/src/or/circuituse.c index c91680dc87..b7e2f914dd 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -656,13 +656,10 @@ void circuit_build_failed(circuit_t *circ) { /* at Bob, connecting to rend point */ /* Don't increment failure count, since Alice may have picked * the rendezvous point maliciously */ - if (failed_at_last_hop) { - log_fn(LOG_INFO,"Couldn't connect to Alice's chosen rend point %s. Sucks to be Alice.", circ->build_state->chosen_exit_name); - } else { - log_fn(LOG_INFO,"Couldn't connect to Alice's chosen rend point %s, because an earlier node failed.", - circ->build_state->chosen_exit_name); - rend_service_relaunch_rendezvous(circ); - } + log_fn(LOG_INFO,"Couldn't connect to Alice's chosen rend point %s (%s hop failed).", + failed_at_last_hop?"last":"non-last", + circ->build_state->chosen_exit_name); + rend_service_relaunch_rendezvous(circ); break; default: /* Other cases are impossible, since this function is only called with diff --git a/src/or/or.h b/src/or/or.h index 76261f1c66..7e02496e2c 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -786,6 +786,8 @@ typedef struct { struct crypt_path_t *pending_final_cpath; /** How many times has building a circuit for this task failed? */ int failure_count; + /** At what time should we give up on this task? */ + time_t expiry_time; } cpath_build_state_t; #define CIRCUIT_MAGIC 0x35315243u diff --git a/src/or/rendservice.c b/src/or/rendservice.c index 5f423b82c3..28fac1ddd3 100644 --- a/src/or/rendservice.c +++ b/src/or/rendservice.c @@ -31,7 +31,10 @@ typedef struct rend_service_port_config_t { #define MAX_INTRO_CIRCS_PER_PERIOD 10 /** How many times will a hidden service operator attempt to connect to * a requested rendezvous point before giving up? */ -#define MAX_REND_FAILURES 3 +#define MAX_REND_FAILURES 30 +/** How many seconds should we spend trying to connect to a requested + * rendezvous point before giving up? */ +#define MAX_REND_TIMEOUT 30 /** Represents a single hidden service running at this OP. */ typedef struct rend_service_t { @@ -505,6 +508,7 @@ rend_service_introduce(circuit_t *circuit, const char *request, size_t request_l sizeof(launched->rend_query)); launched->build_state->pending_final_cpath = cpath = tor_malloc_zero(sizeof(crypt_path_t)); + launched->build_state->expiry_time = time(NULL) + MAX_REND_TIMEOUT; cpath->handshake_state = dh; dh = NULL; @@ -531,8 +535,9 @@ rend_service_relaunch_rendezvous(circuit_t *oldcirc) tor_assert(oldcirc->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND); if (!oldcirc->build_state || - oldcirc->build_state->failure_count > MAX_REND_FAILURES) { - log_fn(LOG_INFO,"Attempt to build circuit to %s for rendezvous has failed too many times; giving up.", + oldcirc->build_state->failure_count > MAX_REND_FAILURES || + oldcirc->build_state->expiry_time < time(NULL)) { + log_fn(LOG_INFO,"Attempt to build circuit to %s for rendezvous has failed too many times or expired; giving up.", oldcirc->build_state->chosen_exit_name); return; } @@ -558,6 +563,7 @@ rend_service_relaunch_rendezvous(circuit_t *oldcirc) newstate = newcirc->build_state; tor_assert(newstate); newstate->failure_count = oldstate->failure_count+1; + newstate->expiry_time = oldstate->expiry_time; newstate->pending_final_cpath = oldstate->pending_final_cpath; oldstate->pending_final_cpath = NULL;