Add an OptimisticData option to control client-side optimistic data

This commit is contained in:
Nick Mathewson 2011-07-20 10:38:00 -04:00
parent 9b0d3719ae
commit 6e923ed8cd
5 changed files with 35 additions and 3 deletions

View File

@ -3,5 +3,7 @@
clients can now "optimistically" send data on a stream before clients can now "optimistically" send data on a stream before
the exit node reports that the stream has opened. This can save the exit node reports that the stream has opened. This can save
a round trip when starting connections with protocols where the 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
Goldberg. disabled) networkstatus consensus parameter. To turn it on or
off manually, use the "OptimisticData" torrc option. Implements
proposal 181; code by Ian Goldberg.

View File

@ -930,6 +930,16 @@ The following options are useful only for clients (that is, if
that have the **AllowSingleHopExits** option turned on to build that have the **AllowSingleHopExits** option turned on to build
one-hop Tor connections. (Default: 0) 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 SERVER OPTIONS
-------------- --------------

View File

@ -18,6 +18,7 @@
#include "connection_edge.h" #include "connection_edge.h"
#include "control.h" #include "control.h"
#include "nodelist.h" #include "nodelist.h"
#include "networkstatus.h"
#include "policies.h" #include "policies.h"
#include "rendclient.h" #include "rendclient.h"
#include "rendcommon.h" #include "rendcommon.h"
@ -1541,6 +1542,19 @@ cpath_is_on_circuit(origin_circuit_t *circ, crypt_path_t *crypt_path)
return 0; 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 /** 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 * 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. * 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)) && apconn->cpath_layer->extend_info->identity_digest)) &&
exitnode->rs) { exitnode->rs) {
/* Okay; we know what exit node this is. */ /* 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) exitnode->rs->version_supports_optimistic_data)
apconn->exit_allows_optimistic_data = 1; apconn->exit_allows_optimistic_data = 1;
else else

View File

@ -337,6 +337,7 @@ static config_var_t _option_vars[] = {
V(PerConnBWRate, MEMUNIT, "0"), V(PerConnBWRate, MEMUNIT, "0"),
V(PidFile, STRING, NULL), V(PidFile, STRING, NULL),
V(TestingTorNetwork, BOOL, "0"), V(TestingTorNetwork, BOOL, "0"),
V(OptimisticData, AUTOBOOL, "auto"),
V(PortForwarding, BOOL, "0"), V(PortForwarding, BOOL, "0"),
V(PortForwardingHelper, FILENAME, "tor-fw-helper"), V(PortForwardingHelper, FILENAME, "tor-fw-helper"),
V(PreferTunneledDirConns, BOOL, "1"), V(PreferTunneledDirConns, BOOL, "1"),

View File

@ -3271,6 +3271,10 @@ typedef struct {
* once. */ * once. */
int MaxClientCircuitsPending; 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; } or_options_t;
/** Persistent state for an onion router, as saved to disk. */ /** Persistent state for an onion router, as saved to disk. */