From be22c0d442a1c5c016e2ebb99075b61614b5b447 Mon Sep 17 00:00:00 2001 From: Alberto Aguirre Date: Tue, 20 Mar 2018 11:42:45 -0500 Subject: Add a NODELAY option Add a new option SSH_OPTIONS_NODELAY to enable or disable the Nagle Algorithm (TCP_NODELAY) on the session socket. Improved performance can be achieved for some applications like sftp servers by enabling SSH_OPTIONS_NODELAY as typically, the next request won't arrive until the server replies, which are typically small writes. Signed-off-by: Alberto Aguirre Reviewed-by: Andreas Schneider --- src/connect.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/connect.c') diff --git a/src/connect.c b/src/connect.c index 50c9e997..d7c2a32c 100644 --- a/src/connect.c +++ b/src/connect.c @@ -74,6 +74,7 @@ #include #include #include +#include #endif /* _WIN32 */ @@ -216,6 +217,12 @@ static int ssh_connect_ai_timeout(ssh_session session, const char *host, return s; } +static int set_tcp_nodelay(socket_t socket) +{ + int opt = 1; + return setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt)); +} + /** * @internal * @@ -387,6 +394,18 @@ socket_t ssh_connect_host_nonblocking(ssh_session session, const char *host, continue; } + if (session->opts.nodelay) { + /* For winsock, socket options are only effective before connect */ + rc = set_tcp_nodelay(s); + if (rc < 0) { + ssh_set_error(session, SSH_FATAL, + "Failed to set TCP_NODELAY on socket: %s", strerror(errno)); + ssh_connect_socket_close(s); + s = -1; + continue; + } + } + errno = 0; rc = connect(s, itr->ai_addr, itr->ai_addrlen); if (rc == -1 && (errno != 0) && (errno != EINPROGRESS)) { -- cgit v1.2.3