summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nordberg <linus@torproject.org>2012-08-31 23:02:19 +0200
committerNick Mathewson <nickm@torproject.org>2012-09-04 12:57:22 -0400
commit8b081231b54f1bb33243078fab510a9a543242a0 (patch)
tree309622fa30f63fea6b75df602cdcdd936f8c8aa5
parent3746215350f4a25c5ec619a8fbe25f3637bb626f (diff)
downloadtor-8b081231b54f1bb33243078fab510a9a543242a0.tar.gz
tor-8b081231b54f1bb33243078fab510a9a543242a0.zip
Make node_ipv6_preferred() take microdescs into account.
Also, make node_get_prim_orport() indicate in its return value whether a valid OR port was copied or not. Maybe we should make it legal to pass ap_out==NULL?
-rw-r--r--src/or/nodelist.c31
-rw-r--r--src/or/nodelist.h2
2 files changed, 23 insertions, 10 deletions
diff --git a/src/or/nodelist.c b/src/or/nodelist.c
index 9ee114bd75..25ed6a61ca 100644
--- a/src/or/nodelist.c
+++ b/src/or/nodelist.c
@@ -821,31 +821,44 @@ node_get_declared_family(const node_t *node)
int
node_ipv6_preferred(const node_t *node)
{
+ tor_addr_port_t ipv4_addr;
node_assert_ok(node);
- if (node->ri)
- return (!tor_addr_is_null(&node->ri->ipv6_addr)
- && (node->ipv6_preferred || node->ri->addr == 0));
- if (node->rs)
- return (!tor_addr_is_null(&node->rs->ipv6_addr)
- && (node->ipv6_preferred || node->rs->addr == 0));
+
+ if (node->ipv6_preferred || node_get_prim_orport(node, &ipv4_addr)) {
+ if (node->ri)
+ return !tor_addr_is_null(&node->ri->ipv6_addr);
+ if (node->md)
+ return !tor_addr_is_null(&node->md->ipv6_addr);
+ if (node->rs)
+ return !tor_addr_is_null(&node->rs->ipv6_addr);
+ }
return 0;
}
/** Copy the primary (IPv4) OR port (IP address and TCP port) for
- * <b>node</b> into *<b>ap_out</b>. */
-void
+ * <b>node</b> into *<b>ap_out</b>. Return 0 if a valid address and
+ * port was copied, else return non-zero.*/
+int
node_get_prim_orport(const node_t *node, tor_addr_port_t *ap_out)
{
node_assert_ok(node);
tor_assert(ap_out);
if (node->ri) {
+ if (node->ri->addr == 0 || node->ri->or_port == 0)
+ return -1;
tor_addr_from_ipv4h(&ap_out->addr, node->ri->addr);
ap_out->port = node->ri->or_port;
- } else if (node->rs) {
+ return 0;
+ }
+ if (node->rs) {
+ if (node->rs->addr == 0 || node->rs->or_port == 0)
+ return -1;
tor_addr_from_ipv4h(&ap_out->addr, node->rs->addr);
ap_out->port = node->rs->or_port;
+ return 0;
}
+ return -1;
}
/** Copy the preferred OR port (IP address and TCP port) for
diff --git a/src/or/nodelist.h b/src/or/nodelist.h
index 18bf4ae60c..fb65fa5483 100644
--- a/src/or/nodelist.h
+++ b/src/or/nodelist.h
@@ -51,7 +51,7 @@ long node_get_declared_uptime(const node_t *node);
time_t node_get_published_on(const node_t *node);
const smartlist_t *node_get_declared_family(const node_t *node);
int node_ipv6_preferred(const node_t *node);
-void node_get_prim_orport(const node_t *node, tor_addr_port_t *ap_out);
+int node_get_prim_orport(const node_t *node, tor_addr_port_t *ap_out);
void node_get_pref_orport(const node_t *node, tor_addr_port_t *ap_out);
void node_get_pref_ipv6_orport(const node_t *node, tor_addr_port_t *ap_out);