tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

commit 1efb84215e827e4fe887ea633eb39f06db285786
parent 9464da210d3214fc094f5fc3b2c229470dbea59c
Author: Nick Mathewson <nickm@torproject.org>
Date:   Tue, 16 Jan 2018 14:23:56 -0500

Improve Windows performance with SIO_IDEAL_SEND_BACKLOG_QUERY.

Patch written by "Vort" on trac. Addresses ticket 22798.

Diffstat:
Achanges/bug22798 | 4++++
Msrc/common/compat.h | 3+++
Msrc/or/connection.c | 34++++++++++++++++++++++++++++++++++
3 files changed, 41 insertions(+), 0 deletions(-)

diff --git a/changes/bug22798 b/changes/bug22798 @@ -0,0 +1,4 @@ + o Minor features (windows, performance): + - Improve performance on Windows Vista and Windows 7 by adjusting TCP send + window size according to the recommendation from + SIO_IDEAL_SEND_BACKLOG_QUERY. Closes ticket 22798. Patch from Vort. diff --git a/src/common/compat.h b/src/common/compat.h @@ -10,6 +10,9 @@ #ifdef _WIN32 #include <winsock2.h> #include <ws2tcpip.h> +#ifndef SIO_IDEAL_SEND_BACKLOG_QUERY +#define SIO_IDEAL_SEND_BACKLOG_QUERY 0x4004747b +#endif #endif #include "torint.h" #include "testsupport.h" diff --git a/src/or/connection.c b/src/or/connection.c @@ -3694,6 +3694,36 @@ connection_outbuf_too_full(connection_t *conn) return (conn->outbuf_flushlen > 10*CELL_PAYLOAD_SIZE); } +/** Fix slow upload for Windows Vista and Windows 7 systems (bug #22798). + * This achieved by tuning socket send buffer size according to hint, + * returned by SIO_IDEAL_SEND_BACKLOG_QUERY ioctl command. + */ +static void +update_send_buffer_size(tor_socket_t sock) +{ +#ifdef _WIN32 + static int isVistaOr7 = -1; + if (isVistaOr7 == -1) { + isVistaOr7 = 0; + OSVERSIONINFO osvi = { 0 }; + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&osvi); + if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion < 2) + isVistaOr7 = 1; + } + if (!isVistaOr7) + return; + if (get_options()->ConstrainedSockets) + return; + ULONG isb = 0; + DWORD bytesReturned = 0; + if (!WSAIoctl(sock, SIO_IDEAL_SEND_BACKLOG_QUERY, NULL, 0, + &isb, sizeof(isb), &bytesReturned, NULL, NULL)) { + setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (const char*)&isb, sizeof(isb)); + } +#endif +} + /** Try to flush more bytes onto <b>conn</b>-\>s. * * This function gets called either from conn_write_callback() in main.c @@ -3812,6 +3842,9 @@ connection_handle_write_impl(connection_t *conn, int force) result = flush_buf_tls(or_conn->tls, conn->outbuf, max_to_write, &conn->outbuf_flushlen); + if (result >= 0) + update_send_buffer_size(conn->s); + /* If we just flushed the last bytes, tell the channel on the * or_conn to check if it needs to geoip_change_dirreq_state() */ /* XXXX move this to flushed_some or finished_flushing -NM */ @@ -3886,6 +3919,7 @@ connection_handle_write_impl(connection_t *conn, int force) connection_mark_for_close(conn); return -1; } + update_send_buffer_size(conn->s); n_written = (size_t) result; }