aboutsummaryrefslogtreecommitdiff
path: root/src/or/circuituse.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2011-07-18 13:56:22 -0400
committerNick Mathewson <nickm@torproject.org>2011-07-18 13:56:22 -0400
commit1e441df2d0d06aa66eaf2c0e00a42d7fe9c39c87 (patch)
tree2ce8d5401d7e3cb25f1e58dcbaf3ff578bb2c9cf /src/or/circuituse.c
parentba5d75810493f237edbb7f4f149d61f1ca08e605 (diff)
downloadtor-1e441df2d0d06aa66eaf2c0e00a42d7fe9c39c87.tar.gz
tor-1e441df2d0d06aa66eaf2c0e00a42d7fe9c39c87.zip
Only use optimistic data with exits that support it
This adds a little code complexity: we need to remember for each node whether it supports the right feature, and then check for each connection whether it's exiting at such a node. We store this in a flag in the edge_connection_t, and set that flag at link time.
Diffstat (limited to 'src/or/circuituse.c')
-rw-r--r--src/or/circuituse.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/or/circuituse.c b/src/or/circuituse.c
index 460c41f75d..3c8cacb2cd 100644
--- a/src/or/circuituse.c
+++ b/src/or/circuituse.c
@@ -677,6 +677,7 @@ circuit_detach_stream(circuit_t *circ, edge_connection_t *conn)
tor_assert(conn);
conn->cpath_layer = NULL; /* make sure we don't keep a stale pointer */
+ conn->exit_allows_optimistic_data = 0;
conn->on_circuit = NULL;
if (CIRCUIT_IS_ORIGIN(circ)) {
@@ -1449,6 +1450,8 @@ static void
link_apconn_to_circ(edge_connection_t *apconn, origin_circuit_t *circ,
crypt_path_t *cpath)
{
+ const node_t *exitnode;
+
/* add it into the linked list of streams on this circuit */
log_debug(LD_APP|LD_CIRC, "attaching new conn to circ. n_circ_id %d.",
circ->_base.n_circ_id);
@@ -1468,6 +1471,24 @@ link_apconn_to_circ(edge_connection_t *apconn, origin_circuit_t *circ,
tor_assert(circ->cpath->prev->state == CPATH_STATE_OPEN);
apconn->cpath_layer = circ->cpath->prev;
}
+
+ /* See if we can use optimistic data on this circuit */
+ if (apconn->cpath_layer->extend_info &&
+ (exitnode = node_get_by_id(
+ apconn->cpath_layer->extend_info->identity_digest)) &&
+ exitnode->rs) {
+ /* Okay; we know what exit node this is. */
+ if (circ->_base.purpose == CIRCUIT_PURPOSE_C_GENERAL &&
+ exitnode->rs->version_supports_optimistic_data)
+ apconn->exit_allows_optimistic_data = 1;
+ else
+ apconn->exit_allows_optimistic_data = 0;
+ log_info(LD_APP, "Looks like completed circuit to %s %s allow "
+ "optimistic data for connection to %s",
+ safe_str_client(node_describe(exitnode)),
+ apconn->exit_allows_optimistic_data ? "does" : "doesn't",
+ safe_str_client(apconn->socks_request->address));
+ }
}
/** Return true iff <b>address</b> is matched by one of the entries in