[tor-commits] [tor/maint-0.2.2] support multihomed bridges (bug 2510)

nickm at torproject.org nickm at torproject.org
Mon Mar 14 20:15:40 UTC 2011


commit 7d2a91f5e5aee77544115089ef79d14cb3e8093e
Author: Roger Dingledine <arma at torproject.org>
Date:   Tue Feb 8 03:11:18 2011 -0500

    support multihomed bridges (bug 2510)
---
 changes/bug2510       |    8 ++++++++
 src/or/circuitbuild.c |   25 +++++++++++++++++++++++++
 2 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/changes/bug2510 b/changes/bug2510
new file mode 100644
index 0000000..2c3f613
--- /dev/null
+++ b/changes/bug2510
@@ -0,0 +1,8 @@
+  o Major bugfixes:
+    - Fix a bug where bridge users who configure the non-canonical
+      address of a bridge automatically switch to its canonical
+      address. If a bridge listens at more than one address, it should be
+      able to advertise those addresses independently and any non-blocked
+      addresses should continue to work. Bugfix on Tor 0.2.0.x. Fixes
+      bug 2510.
+
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index 4f8f5fb..d1cb547 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -4670,6 +4670,29 @@ fetch_bridge_descriptors(or_options_t *options, time_t now)
   SMARTLIST_FOREACH_END(bridge);
 }
 
+/** If our <b>bridge</b> is configured to be a different address than
+ * the bridge gives in its routerinfo <b>ri</b>, rewrite the routerinfo
+ * we received to use the address we meant to use. Now we handle
+ * multihomed bridges better.
+ */
+static void
+rewrite_routerinfo_address_for_bridge(bridge_info_t *bridge, routerinfo_t *ri)
+{
+  tor_addr_t addr;
+  tor_addr_from_ipv4h(&addr, ri->addr);
+
+  if (!tor_addr_compare(&bridge->addr, &addr, CMP_EXACT) &&
+      bridge->port == ri->or_port)
+    return; /* they match, so no need to do anything */
+
+  ri->addr = tor_addr_to_ipv4h(&bridge->addr);
+  tor_free(ri->address);
+  ri->address = tor_dup_ip(ri->addr);
+  ri->or_port = bridge->port;
+  log_info(LD_DIR, "Adjusted bridge '%s' to match configured address %s:%d.",
+           ri->nickname, ri->address, ri->or_port);
+}
+
 /** We just learned a descriptor for a bridge. See if that
  * digest is in our entry guard list, and add it if not. */
 void
@@ -4688,6 +4711,8 @@ learned_bridge_descriptor(routerinfo_t *ri, int from_cache)
       if (!from_cache)
         download_status_reset(&bridge->fetch_status);
 
+      rewrite_routerinfo_address_for_bridge(bridge, ri);
+
       add_an_entry_guard(ri, 1);
       log_notice(LD_DIR, "new bridge descriptor '%s' (%s)", ri->nickname,
                  from_cache ? "cached" : "fresh");





More information about the tor-commits mailing list