diff options
author | Roger Dingledine <arma@torproject.org> | 2008-10-15 00:36:09 +0000 |
---|---|---|
committer | Roger Dingledine <arma@torproject.org> | 2008-10-15 00:36:09 +0000 |
commit | 4520500cde57f940b68138e3a771f989afe8d60c (patch) | |
tree | 4d0e8f06bd03db4eedf455f5565691eb56b75c5c /src/or | |
parent | ebf6591e6f23920ebc86fa370459b1aceddd2569 (diff) | |
download | tor-4520500cde57f940b68138e3a771f989afe8d60c.tar.gz tor-4520500cde57f940b68138e3a771f989afe8d60c.zip |
put in karsten's patch #1 for proposal 155, modified
svn:r17106
Diffstat (limited to 'src/or')
-rw-r--r-- | src/or/circuituse.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/src/or/circuituse.c b/src/or/circuituse.c index 467a195795..7da5508880 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -251,11 +251,13 @@ void circuit_expire_building(time_t now) { circuit_t *victim, *circ = global_circuitlist; - time_t cutoff = now - get_options()->CircuitBuildTimeout; - time_t begindir_cutoff = now - get_options()->CircuitBuildTimeout/2; + time_t general_cutoff = now - get_options()->CircuitBuildTimeout; + time_t begindir_cutoff = general_cutoff/2; + time_t introcirc_cutoff = general_cutoff/2; cpath_build_state_t *build_state; while (circ) { + time_t cutoff; victim = circ; circ = circ->next; if (!CIRCUIT_IS_ORIGIN(victim) || /* didn't originate here */ @@ -263,13 +265,23 @@ circuit_expire_building(time_t now) continue; build_state = TO_ORIGIN_CIRCUIT(victim)->build_state; - if (victim->timestamp_created > - ((build_state && build_state->onehop_tunnel) ? - begindir_cutoff : cutoff)) + if (build_state && build_state->onehop_tunnel) + cutoff = begindir_cutoff; + else if (victim->purpose == CIRCUIT_PURPOSE_C_INTRODUCING) + cutoff = introcirc_cutoff; + else + cutoff = general_cutoff; + if (victim->timestamp_created > cutoff) continue; /* it's still young, leave it alone */ #if 0 /* some debug logs, to help track bugs */ + if (victim->purpose == CIRCUIT_PURPOSE_C_INTRODUCING && + victim->timestamp_created <= introcirc_cutoff && + victim->timestamp_created > general_cutoff) + log_info(LD_REND|LD_CIRC, "Timing out introduction circuit which we " + "would not have done if it had been a general circuit."); + if (victim->purpose >= CIRCUIT_PURPOSE_C_INTRODUCING && victim->purpose <= CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED) { if (!victim->timestamp_dirty) |