[tor-commits] [tor/master] Check for new IP addr after circuit liveliness returns
nickm at torproject.org
nickm at torproject.org
Tue Apr 8 19:39:06 UTC 2014
commit 2d5a7b1842b3dad522166659ff3a88e418f36d13
Author: Matthew Finkel <matthew.finkel at 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);
More information about the tor-commits
mailing list