[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] r10609: now we can specify a bridge without specifying its key, and (tor/trunk/src/or)
Author: arma
Date: 2007-06-15 02:01:04 -0400 (Fri, 15 Jun 2007)
New Revision: 10609
Modified:
tor/trunk/src/or/circuitbuild.c
tor/trunk/src/or/circuitlist.c
tor/trunk/src/or/connection_or.c
tor/trunk/src/or/or.h
tor/trunk/src/or/routerlist.c
Log:
now we can specify a bridge without specifying its key,
and we will still connect to it and use it. getting closer!
Modified: tor/trunk/src/or/circuitbuild.c
===================================================================
--- tor/trunk/src/or/circuitbuild.c 2007-06-15 04:23:36 UTC (rev 10608)
+++ tor/trunk/src/or/circuitbuild.c 2007-06-15 06:01:04 UTC (rev 10609)
@@ -413,13 +413,23 @@
SMARTLIST_FOREACH(pending_circs, circuit_t *, circ,
{
- /* This check is redundant wrt get_all_pending_on_or_conn, but I'm
+ /* These checks are redundant wrt get_all_pending_on_or_conn, but I'm
* leaving them in in case it's possible for the status of a circuit to
* change as we're going down the list. */
if (circ->marked_for_close || circ->n_conn ||
- circ->state != CIRCUIT_STATE_OR_WAIT ||
- memcmp(or_conn->identity_digest, circ->n_conn_id_digest, DIGEST_LEN))
+ circ->state != CIRCUIT_STATE_OR_WAIT)
continue;
+ if (tor_digest_is_zero(circ->n_conn_id_digest)) {
+ /* Look at addr/port. This is an unkeyed connection. */
+ if (circ->n_addr != or_conn->_base.addr ||
+ circ->n_port != or_conn->_base.port)
+ continue;
+ } else {
+ /* We expected a key. See if it's the right one. */
+ if (memcmp(or_conn->identity_digest,
+ circ->n_conn_id_digest, DIGEST_LEN))
+ continue;
+ }
if (!status) { /* or_conn failed; close circ */
log_info(LD_CIRC,"or_conn failed. Closing circ.");
circuit_mark_for_close(circ, END_CIRC_REASON_OR_CONN_CLOSED);
@@ -2670,6 +2680,7 @@
smartlist_clear(bridge_list);
}
+#if 0
/** Return 1 if <b>digest</b> is one of our known bridges. */
int
identity_digest_is_a_bridge(const char *digest)
@@ -2681,7 +2692,25 @@
});
return 0;
}
+#endif
+/** Return 1 if <b>ri</b> is one of our known bridges (either by
+ * comparing keys if possible, else by comparing addr/port). */
+int
+routerinfo_is_a_bridge(routerinfo_t *ri)
+{
+ SMARTLIST_FOREACH(bridge_list, bridge_info_t *, bridge,
+ {
+ if (tor_digest_is_zero(bridge->identity) &&
+ bridge->addr == ri->addr && bridge->port == ri->or_port)
+ return 1;
+ if (!memcmp(bridge->identity, ri->cache_info.identity_digest,
+ DIGEST_LEN))
+ return 1;
+ });
+ return 0;
+}
+
/** Remember a new bridge at <b>addr</b>:<b>port</b>. If <b>digest</b>
* is set, it tells us the identity key too. */
void
Modified: tor/trunk/src/or/circuitlist.c
===================================================================
--- tor/trunk/src/or/circuitlist.c 2007-06-15 04:23:36 UTC (rev 10608)
+++ tor/trunk/src/or/circuitlist.c 2007-06-15 06:01:04 UTC (rev 10609)
@@ -218,7 +218,7 @@
}
}
-/** Append to <b>out</b> the number of circuits in state OR_WAIT, waiting for
+/** Append to <b>out</b> all circuits in state OR_WAIT waiting for
* the given connection. */
void
circuit_get_all_pending_on_or_conn(smartlist_t *out, or_connection_t *or_conn)
@@ -234,11 +234,18 @@
if (circ->marked_for_close)
continue;
tor_assert(circ->state == CIRCUIT_STATE_OR_WAIT);
- if (!circ->n_conn &&
- !memcmp(or_conn->identity_digest, circ->n_conn_id_digest,
- DIGEST_LEN)) {
- smartlist_add(out, circ);
+ if (tor_digest_is_zero(circ->n_conn_id_digest)) {
+ /* Look at addr/port. This is an unkeyed connection. */
+ if (circ->n_addr != or_conn->_base.addr ||
+ circ->n_port != or_conn->_base.port)
+ continue;
+ } else {
+ /* We expected a key. See if it's the right one. */
+ if (memcmp(or_conn->identity_digest,
+ circ->n_conn_id_digest, DIGEST_LEN))
+ continue;
}
+ smartlist_add(out, circ);
});
}
Modified: tor/trunk/src/or/connection_or.c
===================================================================
--- tor/trunk/src/or/connection_or.c 2007-06-15 04:23:36 UTC (rev 10608)
+++ tor/trunk/src/or/connection_or.c 2007-06-15 06:01:04 UTC (rev 10609)
@@ -655,6 +655,17 @@
conn->circ_id_type = CIRC_ID_TYPE_NEITHER;
}
+ if (started_here && tor_digest_is_zero(conn->identity_digest)) {
+ memcpy(conn->identity_digest, digest_rcvd, DIGEST_LEN);
+ conn->nickname = tor_malloc(HEX_DIGEST_LEN+2);
+ conn->nickname[0] = '$';
+ base16_encode(conn->nickname+1, HEX_DIGEST_LEN+1,
+ conn->identity_digest, DIGEST_LEN);
+ log_info(LD_OR, "Connected to router %s at %s:%d without knowing "
+ "its key. Hoping for the best.",
+ conn->nickname, conn->_base.address, conn->_base.port);
+ }
+
if (started_here) {
int as_advertised = 1;
tor_assert(has_cert);
Modified: tor/trunk/src/or/or.h
===================================================================
--- tor/trunk/src/or/or.h 2007-06-15 04:23:36 UTC (rev 10608)
+++ tor/trunk/src/or/or.h 2007-06-15 06:01:04 UTC (rev 10609)
@@ -2223,7 +2223,7 @@
void entry_guards_free_all(void);
void clear_bridge_list(void);
-int identity_digest_is_a_bridge(const char *digest);
+int routerinfo_is_a_bridge(routerinfo_t *ri);
void bridge_add_from_config(uint32_t addr, uint16_t port, char *digest);
void fetch_bridge_descriptors(void);
void learned_bridge_descriptor(routerinfo_t *ri);
Modified: tor/trunk/src/or/routerlist.c
===================================================================
--- tor/trunk/src/or/routerlist.c 2007-06-15 04:23:36 UTC (rev 10608)
+++ tor/trunk/src/or/routerlist.c 2007-06-15 06:01:04 UTC (rev 10609)
@@ -2388,7 +2388,7 @@
* we are receiving in response to a fetch. */
if (!signed_desc_digest_is_recognized(&router->cache_info) &&
- !identity_digest_is_a_bridge(router->cache_info.identity_digest)) {
+ !routerinfo_is_a_bridge(router)) {
/* We asked for it, so some networkstatus must have listed it when we
* did. Save it if we're a cache in case somebody else asks for it. */
log_info(LD_DIR,