summaryrefslogtreecommitdiff
path: root/src/or/router.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2011-05-02 15:51:30 -0400
committerNick Mathewson <nickm@torproject.org>2011-05-13 10:41:18 -0400
commit3da661b2422dbf5a098eb3b8ad9dd2033599016f (patch)
treedfd47dce411ce6b0bab81cbae09a85def98decf9 /src/or/router.c
parent6f5998fd73849b98c9c1a017845c0669c32fda5d (diff)
downloadtor-3da661b2422dbf5a098eb3b8ad9dd2033599016f.tar.gz
tor-3da661b2422dbf5a098eb3b8ad9dd2033599016f.zip
Advertise correct DirPort/ORPort when configured with "auto"
We'll eventually want to do more work here to make sure that the ports are stable over multiple invocations. Otherwise, turning your node on and off will get you a new DirPort/ORPort needlessly.
Diffstat (limited to 'src/or/router.c')
-rw-r--r--src/or/router.c38
1 files changed, 34 insertions, 4 deletions
diff --git a/src/or/router.c b/src/or/router.c
index a7148ea1f7..616a290d8a 100644
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -704,8 +704,8 @@ init_keys(void)
ds = router_get_trusteddirserver_by_digest(digest);
if (!ds) {
ds = add_trusted_dir_server(options->Nickname, NULL,
- (uint16_t)options->DirPort,
- (uint16_t)options->ORPort,
+ router_get_advertised_dir_port(options),
+ router_get_advertised_or_port(options),
digest,
v3_digest,
type);
@@ -1165,6 +1165,36 @@ consider_publishable_server(int force)
}
}
+/** Return the port that we should advertise as our ORPort; this is either
+ * the one configured in the ORPort option, or the one we actually bound to
+ * if ORPort is "auto". */
+uint16_t
+router_get_advertised_or_port(or_options_t *options)
+{
+ if (options->ORPort == CFG_AUTO_PORT) {
+ connection_t *c = connection_get_by_type(CONN_TYPE_OR_LISTENER);
+ if (c)
+ return c->port;
+ return 0;
+ }
+ return options->ORPort;
+}
+
+/** Return the port that we should advertise as our DirPort; this is either
+ * the one configured in the DirPort option, or the one we actually bound to
+ * if DirPort is "auto". */
+uint16_t
+router_get_advertised_dir_port(or_options_t *options)
+{
+ if (options->DirPort == CFG_AUTO_PORT) {
+ connection_t *c = connection_get_by_type(CONN_TYPE_DIR_LISTENER);
+ if (c)
+ return c->port;
+ return 0;
+ }
+ return options->DirPort;
+}
+
/*
* OR descriptor generation.
*/
@@ -1398,8 +1428,8 @@ router_rebuild_descriptor(int force)
ri->address = tor_dup_ip(addr);
ri->nickname = tor_strdup(options->Nickname);
ri->addr = addr;
- ri->or_port = options->ORPort;
- ri->dir_port = options->DirPort;
+ ri->or_port = router_get_advertised_or_port(options);
+ ri->dir_port = router_get_advertised_dir_port(options);
ri->cache_info.published_on = time(NULL);
ri->onion_pkey = crypto_pk_dup_key(get_onion_key()); /* must invoke from
* main thread */