diff options
author | Roger Dingledine <arma@torproject.org> | 2004-04-12 22:47:12 +0000 |
---|---|---|
committer | Roger Dingledine <arma@torproject.org> | 2004-04-12 22:47:12 +0000 |
commit | f4ff5a75c141b671432cd1b9a9a0e102ca872562 (patch) | |
tree | ff694d1568f67221081280d7c363f38e3982f50a /src/or/circuit.c | |
parent | c5052bec9543e0fea56856020566130a03a7c831 (diff) | |
download | tor-f4ff5a75c141b671432cd1b9a9a0e102ca872562.tar.gz tor-f4ff5a75c141b671432cd1b9a9a0e102ca872562.zip |
break circuit_build_needed_circs into its own func
svn:r1596
Diffstat (limited to 'src/or/circuit.c')
-rw-r--r-- | src/or/circuit.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/or/circuit.c b/src/or/circuit.c index b4eab75c9b..b466e3e4a0 100644 --- a/src/or/circuit.c +++ b/src/or/circuit.c @@ -514,6 +514,43 @@ int circuit_stream_is_being_handled(connection_t *conn) { return 0; } +void circuit_build_needed_circs(time_t now) { + static long time_to_new_circuit = 0; + circuit_t *circ; + + if (options.SocksPort) + /* launch a new circ for any pending streams that need one */ + connection_ap_attach_pending(); + +/* Build a new test circuit every 5 minutes */ +#define TESTING_CIRCUIT_INTERVAL 300 + + circ = circuit_get_best(NULL, 1, CIRCUIT_PURPOSE_C_GENERAL); + if(time_to_new_circuit < now) { + client_dns_clean(); + circuit_expire_unused_circuits(); + circuit_reset_failure_count(); + if(circ && circ->timestamp_dirty) { + log_fn(LOG_INFO,"Youngest circuit dirty; launching replacement."); + /* make a new circuit */ + circuit_launch_new(CIRCUIT_PURPOSE_C_GENERAL, NULL); + } else if (options.RunTesting && circ && + circ->timestamp_created + TESTING_CIRCUIT_INTERVAL < now) { + log_fn(LOG_INFO,"Creating a new testing circuit."); + circuit_launch_new(CIRCUIT_PURPOSE_C_GENERAL, NULL); + } + time_to_new_circuit = now + options.NewCircuitPeriod; + time_to_new_circuit = now + options.NewCircuitPeriod; + } +#define CIRCUIT_MIN_BUILDING 3 + if(!circ && circuit_count_building() < CIRCUIT_MIN_BUILDING) { + /* if there's no open circ, and less than 3 are on the way, + * go ahead and try another. + */ + circuit_launch_new(CIRCUIT_PURPOSE_C_GENERAL, NULL); + } +} + /* update digest from the payload of cell. assign integrity part to cell. */ static void relay_set_digest(crypto_digest_env_t *digest, cell_t *cell) { char integrity[4]; |