aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2008-02-23 23:39:16 +0000
committerRoger Dingledine <arma@torproject.org>2008-02-23 23:39:16 +0000
commit31f72a3d8007096a59f8eb6be51c37d4c829c334 (patch)
tree3e77856b1c9ed4616613b5f541ec8e07527f0922
parent7feff8b481f2d57c114c44508da37cefe8dc00c0 (diff)
downloadtor-31f72a3d8007096a59f8eb6be51c37d4c829c334.tar.gz
tor-31f72a3d8007096a59f8eb6be51c37d4c829c334.zip
Servers that don't know their own IP address should go to the
authorities for their first directory fetch, even if their DirPort is off or if they don't know they're reachable yet. This will help them bootstrap better. Bugfix on 0.2.0.18-alpha; fixes bug 609. svn:r13688
-rw-r--r--ChangeLog4
-rw-r--r--src/or/dirserv.c7
-rw-r--r--src/or/router.c5
3 files changed, 12 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 9c01aeb3cd..66376ce338 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -30,6 +30,10 @@ Changes in version 0.2.0.20-?? - 2008-02-??
- Fix code used to find strings within buffers, when those strings
are not in the first chunk of the buffer.
- Fix potential segfault when parsing HTTP headers. Bugfix on 0.2.0.x.
+ - Servers that don't know their own IP address should go to the
+ authorities for their first directory fetch, even if their DirPort
+ is off or if they don't know they're reachable yet. This will help
+ them bootstrap better. Bugfix on 0.2.0.18-alpha; fixes bug 609.
o Minor features (performance):
- Tune parameters for cell pool allocation to minimize amount of
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index cb3def9714..5570a3905a 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -1118,12 +1118,15 @@ int
directory_fetches_from_authorities(or_options_t *options)
{
routerinfo_t *me;
+ uint32_t addr;
if (options->FetchDirInfoEarly)
return 1;
- if (options->DirPort == 0)
- return 0;
if (options->BridgeRelay == 1)
return 0;
+ if (server_mode(options) && router_pick_published_address(options, &addr)<0)
+ return 1; /* we don't know our IP address; ask an authority. */
+ if (options->DirPort == 0)
+ return 0;
if (!server_mode(options) || !advertised_server_mode())
return 0;
me = router_get_my_routerinfo();
diff --git a/src/or/router.c b/src/or/router.c
index ec7a45fd1b..2a2493998d 100644
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -1160,9 +1160,10 @@ static smartlist_t *warned_nonexistent_family = NULL;
static int router_guess_address_from_dir_headers(uint32_t *guess);
-/** Return our current best guess at our address, either because
+/** Make a current best guess at our address, either because
* it's configured in torrc, or because we've learned it from
- * dirserver headers. */
+ * dirserver headers. Place the answer in *<b>addr</b> and return
+ * 0 on success, else return -1 if we have no guess. */
int
router_pick_published_address(or_options_t *options, uint32_t *addr)
{