aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/or/circuituse.c22
-rw-r--r--src/or/config.c2
-rw-r--r--src/or/or.h4
3 files changed, 13 insertions, 15 deletions
diff --git a/src/or/circuituse.c b/src/or/circuituse.c
index e8acffa40..53642cf2b 100644
--- a/src/or/circuituse.c
+++ b/src/or/circuituse.c
@@ -19,7 +19,7 @@ extern circuit_t *global_circuitlist; /* from circuitlist.c */
/********* END VARIABLES ************/
-static void circuit_expire_old_circuits(void);
+static void circuit_expire_old_circuits(time_t now);
static void circuit_increment_failure_count(void);
/* Return 1 if <b>circ</b> could be returned by circuit_get_best().
@@ -177,19 +177,14 @@ circuit_get_best(connection_t *conn, int must_be_open, uint8_t purpose,
return best;
}
-/** If we find a circuit that isn't open yet and was born this many
- * seconds ago, then assume something went wrong, and cull it.
- */
-#define MIN_SECONDS_BEFORE_EXPIRING_CIRC 60
-
/** Close all circuits that start at us, aren't open, and were born
- * at least MIN_SECONDS_BEFORE_EXPIRING_CIRC seconds ago.
+ * at least CircuitBuildTimeout seconds ago.
*/
void
circuit_expire_building(time_t now)
{
circuit_t *victim, *circ = global_circuitlist;
- time_t cutoff = now - MIN_SECONDS_BEFORE_EXPIRING_CIRC;
+ time_t cutoff = now - get_options()->CircuitBuildTimeout;
while (circ) {
victim = circ;
@@ -431,7 +426,7 @@ circuit_build_needed_circs(time_t now)
time_to_new_circuit = now + get_options()->NewCircuitPeriod;
if (proxy_mode(get_options()))
addressmap_clean(now);
- circuit_expire_old_circuits();
+ circuit_expire_old_circuits(now);
#if 0 /* disable for now, until predict-and-launch-new can cull leftovers */
circ = circuit_get_youngest_clean_open(CIRCUIT_PURPOSE_C_GENERAL);
@@ -547,17 +542,14 @@ circuit_about_to_close_connection(connection_t *conn)
} /* end switch */
}
-/** How old do we let an unused circuit get before expiring it? */
-#define CIRCUIT_UNUSED_CIRC_TIMEOUT (60*60)
-
/** Find each circuit that has been dirty for too long, and has
* no streams on it: mark it for close.
*/
static void
-circuit_expire_old_circuits(void)
+circuit_expire_old_circuits(time_t now)
{
circuit_t *circ;
- time_t now = time(NULL);
+ time_t cutoff = now - get_options()->CircuitIdleTimeout;
for (circ = global_circuitlist; circ; circ = circ->next) {
if (circ->marked_for_close)
@@ -579,7 +571,7 @@ circuit_expire_old_circuits(void)
} else if (!circ->timestamp_dirty && CIRCUIT_IS_ORIGIN(circ) &&
circ->state == CIRCUIT_STATE_OPEN &&
circ->purpose == CIRCUIT_PURPOSE_C_GENERAL) {
- if (circ->timestamp_created + CIRCUIT_UNUSED_CIRC_TIMEOUT < now) {
+ if (circ->timestamp_created < cutoff) {
log_debug(LD_CIRC,
"Closing circuit that has been unused for %d seconds.",
(int)(now - circ->timestamp_created));
diff --git a/src/or/config.c b/src/or/config.c
index c90927712..355c72475 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -136,6 +136,8 @@ static config_var_t _option_vars[] = {
VAR("AuthoritativeDirectory",BOOL, AuthoritativeDir, "0"),
VAR("BandwidthBurst", MEMUNIT, BandwidthBurst, "6 MB"),
VAR("BandwidthRate", MEMUNIT, BandwidthRate, "3 MB"),
+ VAR("CircuitBuildTimeout", INTERVAL, CircuitBuildTimeout, "1 minute"),
+ VAR("CircuitIdleTimeout", INTERVAL, CircuitIdleTimeout, "1 hour"),
VAR("ClientOnly", BOOL, ClientOnly, "0"),
VAR("ConnLimit", UINT, ConnLimit, "1024"),
VAR("ContactInfo", STRING, ContactInfo, NULL),
diff --git a/src/or/or.h b/src/or/or.h
index c1c4fccdd..1bbe24e26 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -1317,6 +1317,10 @@ typedef struct {
* connections alive? */
int SocksTimeout; /**< How long do we let a socks connection wait
* unattached before we fail it? */
+ int CircuitBuildTimeout; /**< Cull non-open circuits that were born
+ * at least this many seconds ago. */
+ int CircuitIdleTimeout; /**< Cull open clean circuits that were born
+ * at least this many seconds ago. */
int MaxOnionsPending; /**< How many circuit CREATE requests do we allow
* to wait simultaneously before we start dropping
* them? */