aboutsummaryrefslogtreecommitdiff
path: root/src/or/router.c
diff options
context:
space:
mode:
authorLinus Nordberg <linus@nordberg.se>2011-11-24 18:29:56 +0100
committerNick Mathewson <nickm@torproject.org>2011-11-30 11:55:45 -0500
commitf786307ab7f601a3cb41c46df0a09758671a0bcf (patch)
treef4176da46b8baf23f3055fc1240c0c1c4aca3ca6 /src/or/router.c
parent5bee213d236943dac2e08e04c1525e96a62f13f7 (diff)
downloadtor-f786307ab7f601a3cb41c46df0a09758671a0bcf.tar.gz
tor-f786307ab7f601a3cb41c46df0a09758671a0bcf.zip
First chunk of support for bridges on IPv6
Comments below focus on changes, see diff for added code. New type tor_addr_port_t holding an IP address and a TCP/UDP port. New flag in routerinfo_t, ipv6_preferred. This should go in the node_t instead but not now. Replace node_get_addr() with - node_get_prim_addr() for primary address, i.e. IPv4 for now - node_get_pref_addr() for preferred address, IPv4 or IPv6. Rename node_get_addr_ipv4h() node_get_prim_addr_ipv4h() for consistency. The primary address will not allways be an IPv4 address. Same for node_get_orport() -> node_get_prim_orport(). Rewrite node_is_a_configured_bridge() to take all OR ports into account. Extend argument list to extend_info_from_node and extend_info_from_router with a flag indicating if we want to use the routers primary address or the preferred address. Use the preferred address in as few situtations as possible for allowing clients to connect to bridges over IPv6.
Diffstat (limited to 'src/or/router.c')
-rw-r--r--src/or/router.c56
1 files changed, 54 insertions, 2 deletions
diff --git a/src/or/router.c b/src/or/router.c
index c92c5bd3ef..d0217371ed 100644
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -893,7 +893,8 @@ consider_testing_reachability(int test_or, int test_dir)
log_info(LD_CIRC, "Testing %s of my ORPort: %s:%d.",
!orport_reachable ? "reachability" : "bandwidth",
me->address, me->or_port);
- ei = extend_info_from_router(me);
+ /* XXX IPv6 self testing IPv6 orports will need pref_addr */
+ ei = extend_info_from_router(me, 0);
circuit_launch_by_extend_info(CIRCUIT_PURPOSE_TESTING, ei,
CIRCLAUNCH_NEED_CAPACITY|CIRCLAUNCH_IS_INTERNAL);
extend_info_free(ei);
@@ -1201,7 +1202,6 @@ 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".
- * DOCDOC
*/
uint16_t
router_get_advertised_or_port(const or_options_t *options)
@@ -2121,6 +2121,58 @@ router_dump_router_to_string(char *s, size_t maxlen, routerinfo_t *router,
return (int)written+1;
}
+
+/** Copy the primary, IPv4, address and port for <b>router</b> into
+ *<b>addr_out</b> and *<b>port_out</b>. */
+void
+router_get_prim_addr_port(const routerinfo_t *router, tor_addr_t *addr_out,
+ uint16_t *port_out)
+{
+ if (addr_out != NULL)
+ tor_addr_from_ipv4h(addr_out, router->addr);
+ if (port_out != NULL)
+ *port_out = router->or_port;
+}
+
+/** Copy the alternative, presumably IPv6, address and port for
+ <b>router</b> into *<b>addr_out</b> and *<b>port_out</b>. */
+void
+router_get_alt_addr_port(const routerinfo_t *router,
+ tor_addr_t *addr_out,
+ uint16_t *port_out)
+{
+ if (addr_out != NULL)
+ tor_addr_copy(addr_out, &router->ipv6_addr);
+ if (port_out != NULL)
+ *port_out = router->ipv6_orport;
+}
+
+/** Return 1 if we prefer the IPv6 address of <b>router</b>, else 0.
+
+ We prefer the IPv6 address if the router has one and
+ i) the routerinfo_t says so
+ or
+ ii) the router has no IPv4 address. */
+int
+router_ipv6_preferred(const routerinfo_t *router)
+{
+ return (!tor_addr_is_null(&router->ipv6_addr)
+ && (router->ipv6_preferred || router->addr == 0));
+}
+
+/** Copy the preferred IP address and port for <b>router</b> into
+ *<b>addr_out</b> and *<b>port_out</b> . */
+void
+router_get_pref_addr_port(const routerinfo_t *router,
+ tor_addr_t *addr_out,
+ uint16_t *port_out)
+{
+ if (router_ipv6_preferred(router))
+ router_get_alt_addr_port(router, addr_out, port_out);
+ else
+ router_get_prim_addr_port(router, addr_out, port_out);
+}
+
/** Load the contents of <b>filename</b>, find the last line starting with
* <b>end_line</b>, ensure that its timestamp is not more than 25 hours in
* the past or more than 1 hour in the future with respect to <b>now</b>,