[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] Add a NODELAY option
[Thread Prev] | [Thread Next]
- Subject: Re: [PATCH] Add a NODELAY option
- From: Andreas Schneider <asn@xxxxxxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Fri, 16 Mar 2018 08:31:58 +0100
- To: libssh@xxxxxxxxxx
- Cc: Alberto Aguirre <albaguirre@xxxxxxxxx>
On Friday, 2 March 2018 22:38:30 CET Alberto Aguirre wrote:
> Add a new option SSH_OPTIONS_NODELAY to enable or disable the
> Nagle Algorithm (TCP_NODELAY) on the session socket.
Hi Alberto,
I don't see any documentation for that option :-)
> 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 <albaguirre@xxxxxxxxx>
> ---
> include/libssh/libssh.h | 3 ++-
> include/libssh/session.h | 1 +
> src/connect.c | 19 +++++++++++++++++++
> src/options.c | 10 +++++++++-
> src/session.c | 1 +
> 5 files changed, 32 insertions(+), 2 deletions(-)
>
> diff --git a/include/libssh/libssh.h b/include/libssh/libssh.h
> index 496b5774..b00a428a 100644
> --- a/include/libssh/libssh.h
> +++ b/include/libssh/libssh.h
> @@ -355,7 +355,8 @@ enum ssh_options_e {
> SSH_OPTIONS_PUBKEY_AUTH,
> SSH_OPTIONS_KBDINT_AUTH,
> SSH_OPTIONS_GSSAPI_AUTH,
> - SSH_OPTIONS_GLOBAL_KNOWNHOSTS
> + SSH_OPTIONS_GLOBAL_KNOWNHOSTS,
> + SSH_OPTIONS_NODELAY,
> };
>
> enum {
> diff --git a/include/libssh/session.h b/include/libssh/session.h
> index 69a78dc4..1a069017 100644
> --- a/include/libssh/session.h
> +++ b/include/libssh/session.h
> @@ -205,6 +205,7 @@ struct ssh_session_struct {
> char *gss_client_identity;
> int gss_delegate_creds;
> int flags;
> + int nodelay;
> } opts;
> /* counters */
> ssh_counter socket_counter;
> 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 <sys/socket.h>
> #include <sys/select.h>
> #include <netinet/in.h>
> +#include <netinet/tcp.h>
>
> #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)) {
> diff --git a/src/options.c b/src/options.c
> index 14b9e01e..560df3d6 100644
> --- a/src/options.c
> +++ b/src/options.c
> @@ -938,7 +938,15 @@ int ssh_options_set(ssh_session session, enum
> ssh_options_e type, }
> }
> break;
> -
> + case SSH_OPTIONS_NODELAY:
> + if (value == NULL) {
> + ssh_set_error_invalid(session);
> + return -1;
> + } else {
> + int *x = (int *) value;
> + session->opts.nodelay = (*x & 0xff) > 0 ? 1 : 0;
> + }
> + break;
> default:
> ssh_set_error(session, SSH_REQUEST_DENIED, "Unknown ssh option
> %d", type); return -1;
> diff --git a/src/session.c b/src/session.c
> index 1c03b62b..deaa1ae1 100644
> --- a/src/session.c
> +++ b/src/session.c
> @@ -107,6 +107,7 @@ ssh_session ssh_new(void) {
> session->opts.fd = -1;
> session->opts.ssh2 = 1;
> session->opts.compressionlevel=7;
> + session->opts.nodelay = 0;
> #ifdef WITH_SSH1
> session->opts.ssh1 = 1;
> #else
--
Andreas Schneider GPG-ID: CC014E3D
www.cryptomilk.org asn@xxxxxxxxxxxxxx
| [PATCH] Add a NODELAY option | Alberto Aguirre <albaguirre@xxxxxxxxx> |