From 99c8bbafe72cdd2e7cdcf078911309be5bec9a3e Mon Sep 17 00:00:00 2001 From: clowwindy Date: Thu, 25 Dec 2014 16:20:15 +0800 Subject: [PATCH] fix fastopen and add a new test --- .jenkins.sh | 4 ++++ shadowsocks/tcprelay.py | 11 +++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.jenkins.sh b/.jenkins.sh index 7b381a8..4c85f1c 100755 --- a/.jenkins.sh +++ b/.jenkins.sh @@ -49,6 +49,10 @@ run_test python tests/test.py --with-coverage -b "-m aes-256-cfb -k testrc4 -s 1 if [ -f /proc/sys/net/ipv4/tcp_fastopen ] ; then if [ 3 -eq `cat /proc/sys/net/ipv4/tcp_fastopen` ] ; then + # we have to run it twice: + # the first time there's no syn cookie + # the second time there is syn cookie + run_test python tests/test.py --with-coverage -c tests/fastopen.json run_test python tests/test.py --with-coverage -c tests/fastopen.json fi fi diff --git a/shadowsocks/tcprelay.py b/shadowsocks/tcprelay.py index 146714a..95cbef5 100644 --- a/shadowsocks/tcprelay.py +++ b/shadowsocks/tcprelay.py @@ -241,19 +241,18 @@ class TCPRelayHandler(object): self._create_remote_socket(self._chosen_server[0], self._chosen_server[1]) self._loop.add(remote_sock, eventloop.POLL_ERR) - data = b''.join(self._data_to_write_to_local) + data = b''.join(self._data_to_write_to_remote) l = len(data) s = remote_sock.sendto(data, MSG_FASTOPEN, self._chosen_server) if s < l: data = data[s:] - self._data_to_write_to_local = [data] - self._update_stream(STREAM_UP, WAIT_STATUS_READWRITING) + self._data_to_write_to_remote = [data] else: - self._data_to_write_to_local = [] - self._update_stream(STREAM_UP, WAIT_STATUS_READING) - self._stage = STAGE_STREAM + self._data_to_write_to_remote = [] + self._update_stream(STREAM_UP, WAIT_STATUS_READWRITING) except (OSError, IOError) as e: if eventloop.errno_from_exception(e) == errno.EINPROGRESS: + # in this case data is not sent at all self._update_stream(STREAM_UP, WAIT_STATUS_READWRITING) elif eventloop.errno_from_exception(e) == errno.ENOTCONN: logging.error('fast open not supported on this OS')