diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index a5863cce17..fdd7d0d5c7 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -386,7 +386,7 @@ int circuit_send_next_onion_skin(circuit_t *circ) { /* done building the circuit. whew. */ circ->state = CIRCUIT_STATE_OPEN; log_fn(LOG_INFO,"circuit built!"); - circuit_reset_failure_count(); + circuit_reset_failure_count(0); if(!has_completed_circuit) { has_completed_circuit=1; log_fn(LOG_NOTICE,"Tor has successfully opened a circuit. Looks like it's working."); diff --git a/src/or/circuituse.c b/src/or/circuituse.c index 993ef2b18a..717f327b83 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -298,7 +298,7 @@ void circuit_build_needed_circs(time_t now) { circ = circuit_get_youngest_clean_open(CIRCUIT_PURPOSE_C_GENERAL); if(time_to_new_circuit < now) { - circuit_reset_failure_count(); + circuit_reset_failure_count(1); time_to_new_circuit = now + options.NewCircuitPeriod; if(proxy_mode()) client_dns_clean(); @@ -585,6 +585,7 @@ void circuit_build_failed(circuit_t *circ) { * circuit_launch_new and circuit_*_failure_count. */ static int n_circuit_failures = 0; +static int did_circs_fail_last_period = 0; /** Don't retry launching a new circuit if we try this many times with no * success. */ @@ -597,7 +598,8 @@ circuit_t *circuit_launch_by_identity(uint8_t purpose, const char *exit_digest) return NULL; } - if (n_circuit_failures > MAX_CIRCUIT_FAILURES) { + if (did_circs_fail_last_period && + n_circuit_failures > MAX_CIRCUIT_FAILURES) { /* too many failed circs in a row. don't try. */ // log_fn(LOG_INFO,"%d failures so far, not trying.",n_circuit_failures); return NULL; @@ -635,7 +637,11 @@ static void circuit_increment_failure_count(void) { * we will try MAX_CIRCUIT_FAILURES times more (if necessary) before * stopping again. */ -void circuit_reset_failure_count(void) { +void circuit_reset_failure_count(int timeout) { + if(timeout && n_circuit_failures > MAX_CIRCUIT_FAILURES) + did_circs_fail_last_period = 1; + else + did_circs_fail_last_period = 0; n_circuit_failures = 0; } diff --git a/src/or/or.h b/src/or/or.h index 5c2b153293..38f4899185 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -1003,7 +1003,7 @@ void circuit_has_opened(circuit_t *circ); void circuit_build_failed(circuit_t *circ); circuit_t *circuit_launch_by_nickname(uint8_t purpose, const char *exit_nickname); circuit_t *circuit_launch_by_identity(uint8_t purpose, const char *exit_digest); -void circuit_reset_failure_count(void); +void circuit_reset_failure_count(int timeout); int connection_ap_handshake_attach_circuit(connection_t *conn); int circuit_init_cpath_crypto(crypt_path_t *cpath, char *key_data,int reverse);