Browse Source

r15287@tombo: nickm | 2008-04-22 17:09:25 -0400
Periodically launch requests for server/authority.z when it might help us learn our IP. Fix for bug 652.


svn:r14418

Nick Mathewson 17 years ago
parent
commit
41929c2684
2 changed files with 22 additions and 0 deletions
  1. 2 0
      ChangeLog
  2. 20 0
      src/or/routerlist.c

+ 2 - 0
ChangeLog

@@ -40,6 +40,8 @@ Changes in version 0.2.1.1-alpha - 2008-??-??
     - When we choose to abandon a new entry guard because we think our
     - When we choose to abandon a new entry guard because we think our
       older ones might be better, close any circuits pending on that
       older ones might be better, close any circuits pending on that
       new entry guard connection. Bugfix on 0.1.2.8-beta; found by lodger.
       new entry guard connection. Bugfix on 0.1.2.8-beta; found by lodger.
+    - Detect address changes correctly on non-directory mirror
+      servers.  Fix for bug 652.
 
 
   o Minor features:
   o Minor features:
     - Allow separate log levels to be configured for different logging
     - Allow separate log levels to be configured for different logging

+ 20 - 0
src/or/routerlist.c

@@ -4013,17 +4013,37 @@ update_consensus_router_descriptor_downloads(time_t now)
   smartlist_free(no_longer_old);
   smartlist_free(no_longer_old);
 }
 }
 
 
+/** How often should we launch a server/authority request to be sure of getting
+ * a guess for our IP? */
+/*XXXX021 this info should come from netinfo cells or something, or we should
+ * do this only when we aren't seeing incoming data. see bug 652. */
+#define DUMMY_DOWNLOAD_INTERVAL (20*60)
+
 /** Launch downloads for router status as needed. */
 /** Launch downloads for router status as needed. */
 void
 void
 update_router_descriptor_downloads(time_t now)
 update_router_descriptor_downloads(time_t now)
 {
 {
   or_options_t *options = get_options();
   or_options_t *options = get_options();
+  static time_t last_dummy_download = 0;
   if (should_delay_dir_fetches(options))
   if (should_delay_dir_fetches(options))
     return;
     return;
   if (directory_fetches_dir_info_early(options)) {
   if (directory_fetches_dir_info_early(options)) {
     update_router_descriptor_cache_downloads_v2(now);
     update_router_descriptor_cache_downloads_v2(now);
   }
   }
   update_consensus_router_descriptor_downloads(now);
   update_consensus_router_descriptor_downloads(now);
+
+  /* XXXX021 we could be smarter here; see notes on bug 652. */
+  /* If we're a server that doesn't have a configured address, we rely on
+   * directory fetches to learn when our address changes.  So if we haven't
+   * tried to get any routerdescs in a long time, try a dummy fetch now. */
+  if (!options->Address &&
+      server_mode(options) &&
+      last_routerdesc_download_attempted + DUMMY_DOWNLOAD_INTERVAL < now &&
+      last_dummy_download + DUMMY_DOWNLOAD_INTERVAL < now) {
+    last_dummy_download = now;
+    directory_get_from_dirserver(DIR_PURPOSE_FETCH_SERVERDESC,
+                                 ROUTER_PURPOSE_GENERAL, "authority.z", 1);
+  }
 }
 }
 
 
 /** Launch extrainfo downloads as needed. */
 /** Launch extrainfo downloads as needed. */