|
@@ -3792,12 +3792,10 @@ onion_extend_cpath(origin_circuit_t *circ)
|
|
|
} else if (cur_len == 0) { /* picking first node */
|
|
|
const node_t *r = choose_good_entry_server(purpose, state);
|
|
|
if (r) {
|
|
|
- /* If we're extending to a bridge, use the preferred address
|
|
|
- rather than the primary, for potentially extending to an IPv6
|
|
|
- bridge. */
|
|
|
- int use_pref_addr = (r->ri != NULL &&
|
|
|
- r->ri->purpose == ROUTER_PURPOSE_BRIDGE);
|
|
|
- info = extend_info_from_node(r, use_pref_addr);
|
|
|
+ /* If we're a client, use the preferred address rather than the
|
|
|
+ primary address, for potentially connecting to an IPv6 OR
|
|
|
+ port. */
|
|
|
+ info = extend_info_from_node(r, server_mode(get_options()) == 0);
|
|
|
tor_assert(info);
|
|
|
}
|
|
|
} else {
|
|
@@ -3865,10 +3863,11 @@ extend_info_alloc(const char *nickname, const char *digest,
|
|
|
|
|
|
/** Allocate and return a new extend_info that can be used to build a
|
|
|
* circuit to or through the node <b>node</b>. Use the primary address
|
|
|
- * of the node unless <b>for_direct_connect</b> is true, in which case
|
|
|
- * the preferred address is used instead. May return NULL if there is
|
|
|
- * not enough info about <b>node</b> to extend to it--for example, if
|
|
|
- * there is no routerinfo_t or microdesc_t.
|
|
|
+ * of the node (i.e. its IPv4 address) unless
|
|
|
+ * <b>for_direct_connect</b> is true, in which case the preferred
|
|
|
+ * address is used instead. May return NULL if there is not enough
|
|
|
+ * info about <b>node</b> to extend to it--for example, if there is no
|
|
|
+ * routerinfo_t or microdesc_t.
|
|
|
**/
|
|
|
extend_info_t *
|
|
|
extend_info_from_node(const node_t *node, int for_direct_connect)
|
|
@@ -5607,10 +5606,15 @@ rewrite_node_address_for_bridge(const bridge_info_t *bridge, node_t *node)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /* Indicate that we prefer connecting to this bridge over the
|
|
|
- protocol that the bridge address indicates. Last bridge
|
|
|
- descriptor handled wins. */
|
|
|
- node->ipv6_preferred = tor_addr_family(&bridge->addr) == AF_INET6;
|
|
|
+ /* Mark bridge as preferably connected to over IPv6 if its IPv6
|
|
|
+ address is in a Bridge line and ClientPreferIPv6ORPort is
|
|
|
+ set. Unless both is true, a potential IPv6 OR port of this
|
|
|
+ bridge won't get selected.
|
|
|
+
|
|
|
+ XXX ipv6_preferred is never reset (#6757) */
|
|
|
+ if (get_options()->ClientPreferIPv6ORPort == 1 &&
|
|
|
+ tor_addr_family(&bridge->addr) == AF_INET6)
|
|
|
+ node->ipv6_preferred = 1;
|
|
|
|
|
|
/* XXXipv6 we lack support for falling back to another address for
|
|
|
the same relay, warn the user */
|