[tor-commits] [tor/master] Add an OptimisticData option to control client-side optimistic data

nickm at torproject.org nickm at torproject.org
Wed Jul 20 18:15:32 UTC 2011


commit 6e923ed8cdbdcf45902cb64dd921d63dea310d1d
Author: Nick Mathewson <nickm at 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. */





More information about the tor-commits mailing list