commit 2d5a7b1842b3dad522166659ff3a88e418f36d13 Author: Matthew Finkel matthew.finkel@gmail.com Date: Tue Apr 1 17:30:20 2014 -0400
Check for new IP addr after circuit liveliness returns
When we successfully create a usable circuit after it previously timed out for a certain amount of time, we should make sure that our public IP address hasn't changed and update our descriptor. --- changes/bug2454 | 6 ++++++ src/or/circuitstats.c | 12 +++++++++++- src/or/main.c | 13 ++++++++++++- src/or/main.h | 1 + 4 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/changes/bug2454 b/changes/bug2454 new file mode 100644 index 0000000..18e327b --- /dev/null +++ b/changes/bug2454 @@ -0,0 +1,6 @@ + o Enhancement: + - If a circuit timed out for at least 3 minutes check if we have a new + external IP address the next time we run our routine checks. If our + IP address has changed, then publish a new descriptor with the new + IP address. Resolves ticket 2454. + diff --git a/src/or/circuitstats.c b/src/or/circuitstats.c index c093ecd..e362b1b 100644 --- a/src/or/circuitstats.c +++ b/src/or/circuitstats.c @@ -12,6 +12,7 @@ #include "config.h" #include "confparse.h" #include "control.h" +#include "main.h" #include "networkstatus.h" #include "statefile.h"
@@ -1185,6 +1186,12 @@ circuit_build_times_needs_circuits_now(const circuit_build_times_t *cbt) }
/** + * How long should we be unreachable before we think we need to check if + * our published IP address has changed. + */ +#define CIRCUIT_TIMEOUT_BEFORE_RECHECK_IP (60*3) + +/** * Called to indicate that the network showed some signs of liveness, * i.e. we received a cell. * @@ -1199,12 +1206,15 @@ circuit_build_times_network_is_live(circuit_build_times_t *cbt) { time_t now = approx_time(); if (cbt->liveness.nonlive_timeouts > 0) { + time_t time_since_live = now - cbt->liveness.network_last_live; log_notice(LD_CIRC, "Tor now sees network activity. Restoring circuit build " "timeout recording. Network was down for %d seconds " "during %d circuit attempts.", - (int)(now - cbt->liveness.network_last_live), + (int)time_since_live, cbt->liveness.nonlive_timeouts); + if (time_since_live > CIRCUIT_TIMEOUT_BEFORE_RECHECK_IP) + reschedule_descriptor_update_check(); } cbt->liveness.network_last_live = now; cbt->liveness.nonlive_timeouts = 0; diff --git a/src/or/main.c b/src/or/main.c index feca35c..86f3437 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -1162,6 +1162,18 @@ get_signewnym_epoch(void) return newnym_epoch; }
+static time_t time_to_check_descriptor = 0; +/** + * Update our schedule so that we'll check whether we need to update our + * descriptor immediately, rather than after up to CHECK_DESCRIPTOR_INTERVAL + * seconds. + */ +void +reschedule_descriptor_update_check(void) +{ + time_to_check_descriptor = 0; +} + /** Perform regular maintenance tasks. This function gets run once per * second by second_elapsed_callback(). */ @@ -1171,7 +1183,6 @@ run_scheduled_events(time_t now) static time_t last_rotated_x509_certificate = 0; static time_t time_to_check_v3_certificate = 0; static time_t time_to_check_listeners = 0; - static time_t time_to_check_descriptor = 0; static time_t time_to_download_networkstatus = 0; static time_t time_to_shrink_memory = 0; static time_t time_to_try_getting_descriptors = 0; diff --git a/src/or/main.h b/src/or/main.h index df302ff..a2f03d9 100644 --- a/src/or/main.h +++ b/src/or/main.h @@ -50,6 +50,7 @@ void directory_info_has_arrived(time_t now, int from_cache);
void ip_address_changed(int at_interface); void dns_servers_relaunch_checks(void); +void reschedule_descriptor_update_check(void);
long get_uptime(void); unsigned get_signewnym_epoch(void);