commit 6e923ed8cdbdcf45902cb64dd921d63dea310d1d
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Wed Jul 20 10:38:00 2011 -0400
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 88afb9a..9a21a41 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 821098b..6dc3b28 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 1bc518b..9fbe5fe 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 <b>apconn</b> to circ's linked list of
* p_streams. Also set apconn's cpath_layer to <b>cpath</b>, or to the last
* hop in circ's cpath if <b>cpath</b> 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 96d5095..088617b 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 16c7927..c518b4c 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. */