From 6e923ed8cdbdcf45902cb64dd921d63dea310d1d Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Wed, 20 Jul 2011 10:38:00 -0400 Subject: [PATCH] Add an OptimisticData option to control client-side optimistic data --- changes/optimistic-client | 6 ++++-- doc/tor.1.txt | 10 ++++++++++ src/or/circuituse.c | 17 ++++++++++++++++- src/or/config.c | 1 + src/or/or.h | 4 ++++ 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/changes/optimistic-client b/changes/optimistic-client index 88afb9ad56..9a21a41604 100644 --- a/changes/optimistic-client +++ b/changes/optimistic-client @@ -3,5 +3,7 @@ clients can now "optimistically" send data on a stream before the exit node reports that the stream has opened. This can save a round trip when starting connections with protocols where the - client speaks first. Implements proposal 181; code by Ian - Goldberg. + client speaks first. This behavior is controlled by a (currently + disabled) networkstatus consensus parameter. To turn it on or + off manually, use the "OptimisticData" torrc option. Implements + proposal 181; code by Ian Goldberg. diff --git a/doc/tor.1.txt b/doc/tor.1.txt index 821098b56e..6dc3b28bda 100644 --- a/doc/tor.1.txt +++ b/doc/tor.1.txt @@ -930,6 +930,16 @@ The following options are useful only for clients (that is, if that have the **AllowSingleHopExits** option turned on to build one-hop Tor connections. (Default: 0) +**OptimisticData** **0**|**1**|**auto**:: + When this option is set, and Tor is using an exit node that supports + the feature, it will try optimistically to send data to the exit node + without waiting for the exit node to report whether the connection + succeeded. This can save a round-trip time for protocols like HTTP + where the client talks first. If OptimisticData is set to **auto**, + Tor will look at the UseOptimisticData parameter in the networkstatus. + (Default: auto) + + SERVER OPTIONS -------------- diff --git a/src/or/circuituse.c b/src/or/circuituse.c index 1bc518b7d4..9fbe5fed65 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -18,6 +18,7 @@ #include "connection_edge.h" #include "control.h" #include "nodelist.h" +#include "networkstatus.h" #include "policies.h" #include "rendclient.h" #include "rendcommon.h" @@ -1541,6 +1542,19 @@ cpath_is_on_circuit(origin_circuit_t *circ, crypt_path_t *crypt_path) return 0; } +/** Return true iff client-side optimistic data is supported. */ +static int +optimistic_data_enabled(void) +{ + const or_options_t *options = get_options(); + if (options->OptimisticData < 0) { + const int32_t enabled = + networkstatus_get_param(NULL, "UseOptimisticData", 0, 0, 1); + return (int)enabled; + } + return options->OptimisticData; +} + /** Attach the AP stream apconn to circ's linked list of * p_streams. Also set apconn's cpath_layer to cpath, or to the last * hop in circ's cpath if cpath is NULL. @@ -1580,7 +1594,8 @@ link_apconn_to_circ(edge_connection_t *apconn, origin_circuit_t *circ, 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 && + if (optimistic_data_enabled() && + circ->_base.purpose == CIRCUIT_PURPOSE_C_GENERAL && exitnode->rs->version_supports_optimistic_data) apconn->exit_allows_optimistic_data = 1; else diff --git a/src/or/config.c b/src/or/config.c index 96d50954ba..088617bb49 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -337,6 +337,7 @@ static config_var_t _option_vars[] = { V(PerConnBWRate, MEMUNIT, "0"), V(PidFile, STRING, NULL), V(TestingTorNetwork, BOOL, "0"), + V(OptimisticData, AUTOBOOL, "auto"), V(PortForwarding, BOOL, "0"), V(PortForwardingHelper, FILENAME, "tor-fw-helper"), V(PreferTunneledDirConns, BOOL, "1"), diff --git a/src/or/or.h b/src/or/or.h index 16c792771e..c518b4cd8f 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -3271,6 +3271,10 @@ typedef struct { * once. */ int MaxClientCircuitsPending; + /** If 1, we always send optimistic data when it's supported. If 0, we + * never use it. If -1, we do what the consensus says. */ + int OptimisticData; + } or_options_t; /** Persistent state for an onion router, as saved to disk. */