summaryrefslogtreecommitdiffstats
path: root/crypto/openssh/sshconnect.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/openssh/sshconnect.c')
-rw-r--r--crypto/openssh/sshconnect.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/crypto/openssh/sshconnect.c b/crypto/openssh/sshconnect.c
index 3e55b5d..0615b44 100644
--- a/crypto/openssh/sshconnect.c
+++ b/crypto/openssh/sshconnect.c
@@ -183,6 +183,29 @@ ssh_kill_proxy_command(void)
}
/*
+ * Set TCP receive buffer if requested.
+ * Note: tuning needs to happen after the socket is created but before the
+ * connection happens so winscale is negotiated properly.
+ */
+static void
+ssh_set_socket_recvbuf(int sock)
+{
+ void *buf = (void *)&options.tcp_rcv_buf;
+ int socksize, sz = sizeof(options.tcp_rcv_buf);
+ socklen_t len = sizeof(int);
+
+ debug("setsockopt attempting to set SO_RCVBUF to %d",
+ options.tcp_rcv_buf);
+ if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, buf, sz) >= 0) {
+ getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &socksize, &len);
+ debug("setsockopt SO_RCVBUF: %.100s %d", strerror(errno),
+ socksize);
+ } else
+ error("Couldn't set socket receive buffer to %d: %.100s",
+ options.tcp_rcv_buf, strerror(errno));
+}
+
+/*
* Creates a (possibly privileged) socket for use as the ssh connection.
*/
static int
@@ -205,6 +228,8 @@ ssh_create_socket(int privileged, struct addrinfo *ai)
strerror(errno));
else
debug("Allocated local port %d.", p);
+ if (options.tcp_rcv_buf > 0)
+ ssh_set_socket_recvbuf(sock);
return sock;
}
sock = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
@@ -214,6 +239,9 @@ ssh_create_socket(int privileged, struct addrinfo *ai)
}
fcntl(sock, F_SETFD, FD_CLOEXEC);
+ if (options.tcp_rcv_buf > 0)
+ ssh_set_socket_recvbuf(sock);
+
/* Bind the socket to an alternative local IP address */
if (options.bind_address == NULL)
return sock;
@@ -557,7 +585,7 @@ ssh_exchange_identification(int timeout_ms)
snprintf(buf, sizeof buf, "SSH-%d.%d-%.100s%s",
compat20 ? PROTOCOL_MAJOR_2 : PROTOCOL_MAJOR_1,
compat20 ? PROTOCOL_MINOR_2 : minor1,
- SSH_VERSION, compat20 ? "\r\n" : "\n");
+ SSH_RELEASE, compat20 ? "\r\n" : "\n");
if (roaming_atomicio(vwrite, connection_out, buf, strlen(buf))
!= strlen(buf))
fatal("write: %.100s", strerror(errno));
OpenPOWER on IntegriCloud