diff options
author | Nick Mathewson <nickm@torproject.org> | 2011-03-15 17:20:41 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2011-03-15 17:20:41 -0400 |
commit | 415caba967b9b470623ab29230b820b3470a91e6 (patch) | |
tree | 089056c4c93a2ee8e8a0ff0b5bf1ec342f5afb00 /src/or/relay.c | |
parent | 737228ed8e81de6619a29bd039d08d959d4164da (diff) | |
parent | c2775196f79b9dba70d517663004e1783873f35c (diff) | |
download | tor-415caba967b9b470623ab29230b820b3470a91e6.tar.gz tor-415caba967b9b470623ab29230b820b3470a91e6.zip |
Merge remote branch 'arma/optimistic_server'
Diffstat (limited to 'src/or/relay.c')
-rw-r--r-- | src/or/relay.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/src/or/relay.c b/src/or/relay.c index 96430dcec5..7180cfb28a 100644 --- a/src/or/relay.c +++ b/src/or/relay.c @@ -1031,6 +1031,9 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, relay_header_t rh; unsigned domain = layer_hint?LD_APP:LD_EXIT; int reason; + int optimistic_data = 0; /* Set to 1 if we receive data on a stream + * that's in the EXIT_CONN_STATE_RESOLVING + * or EXIT_CONN_STATE_CONNECTING states. */ tor_assert(cell); tor_assert(circ); @@ -1050,9 +1053,20 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, /* either conn is NULL, in which case we've got a control cell, or else * conn points to the recognized stream. */ - if (conn && !connection_state_is_open(TO_CONN(conn))) - return connection_edge_process_relay_cell_not_open( - &rh, cell, circ, conn, layer_hint); + if (conn && !connection_state_is_open(TO_CONN(conn))) { + if (conn->_base.type == CONN_TYPE_EXIT && + (conn->_base.state == EXIT_CONN_STATE_CONNECTING || + conn->_base.state == EXIT_CONN_STATE_RESOLVING) && + rh.command == RELAY_COMMAND_DATA) { + /* Allow DATA cells to be delivered to an exit node in state + * EXIT_CONN_STATE_CONNECTING or EXIT_CONN_STATE_RESOLVING. + * This speeds up HTTP, for example. */ + optimistic_data = 1; + } else { + return connection_edge_process_relay_cell_not_open( + &rh, cell, circ, conn, layer_hint); + } + } switch (rh.command) { case RELAY_COMMAND_DROP: @@ -1119,7 +1133,14 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, stats_n_data_bytes_received += rh.length; connection_write_to_buf((char*)(cell->payload + RELAY_HEADER_SIZE), rh.length, TO_CONN(conn)); - connection_edge_consider_sending_sendme(conn); + + if (!optimistic_data) { + /* Only send a SENDME if we're not getting optimistic data; otherwise + * a SENDME could arrive before the CONNECTED. + */ + connection_edge_consider_sending_sendme(conn); + } + return 0; case RELAY_COMMAND_END: reason = rh.length > 0 ? |