support multihomed bridges (bug 2510)

This commit is contained in:
Roger Dingledine 2011-02-08 03:11:18 -05:00
parent 9a1a96ba09
commit 7d2a91f5e5
2 changed files with 33 additions and 0 deletions

8
changes/bug2510 Normal file
View File

@ -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.

View File

@ -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");