Commit 6e923ed8 authored by Nick Mathewson's avatar Nick Mathewson 👁
Browse files

Add an OptimisticData option to control client-side optimistic data

parent 9b0d3719
......@@ -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
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.
......@@ -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)
......@@ -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
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 &&
apconn->exit_allows_optimistic_data = 1;
......@@ -337,6 +337,7 @@ static config_var_t _option_vars[] = {
V(PerConnBWRate, MEMUNIT, "0"),
V(TestingTorNetwork, BOOL, "0"),
V(OptimisticData, AUTOBOOL, "auto"),
V(PortForwarding, BOOL, "0"),
V(PortForwardingHelper, FILENAME, "tor-fw-helper"),
V(PreferTunneledDirConns, BOOL, "1"),
......@@ -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. */
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment