summaryrefslogtreecommitdiff
path: root/patch/libssh-0.10.4.patch
diff options
context:
space:
mode:
authorRyo Nakamura <upa@haeena.net>2023-09-09 14:32:15 +0900
committerRyo Nakamura <upa@haeena.net>2023-11-01 19:54:18 +0900
commitbf74aa095adf8d0a3b4144b29b2d7a48fe4e02b2 (patch)
treed3d58b31457af827cecf439b902e14b62d41c129 /patch/libssh-0.10.4.patch
parenta88471fc43a8500f73cd55eeb87b3a990cb0b4f9 (diff)
add -g option to specify TCP cc algorithm
This commit introduce SSH_OPTIONS_CCALGO option to the libssh patch and add -g CONGESTION option to mscp.
Diffstat (limited to 'patch/libssh-0.10.4.patch')
-rw-r--r--patch/libssh-0.10.4.patch151
1 files changed, 148 insertions, 3 deletions
diff --git a/patch/libssh-0.10.4.patch b/patch/libssh-0.10.4.patch
index a8a9628..432cad0 100644
--- a/patch/libssh-0.10.4.patch
+++ b/patch/libssh-0.10.4.patch
@@ -1,3 +1,28 @@
+diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake
+index 7103f303..c64eb39d 100644
+--- a/ConfigureChecks.cmake
++++ b/ConfigureChecks.cmake
+@@ -258,6 +258,7 @@ if (UNIX)
+ check_library_exists(util forkpty "" HAVE_LIBUTIL)
+ check_function_exists(cfmakeraw HAVE_CFMAKERAW)
+ check_function_exists(__strtoull HAVE___STRTOULL)
++ check_symbol_exists(TCP_CONGESTION "netinet/tcp.h" HAVE_TCP_CONGESTION)
+ endif (UNIX)
+
+ set(LIBSSH_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} CACHE INTERNAL "libssh required system libraries")
+diff --git a/config.h.cmake b/config.h.cmake
+index 1357615b..1e915ead 100644
+--- a/config.h.cmake
++++ b/config.h.cmake
+@@ -237,6 +237,8 @@
+
+ #cmakedefine HAVE_GCC_BOUNDED_ATTRIBUTE 1
+
++#cmakedefine HAVE_TCP_CONGESTION 1
++
+ /* Define to 1 if you want to enable GSSAPI */
+ #cmakedefine WITH_GSSAPI 1
+
diff --git a/include/libssh/buffer.h b/include/libssh/buffer.h
index a55a1b40..e34e075c 100644
--- a/include/libssh/buffer.h
@@ -12,10 +37,18 @@ index a55a1b40..e34e075c 100644
int ssh_buffer_validate_length(struct ssh_buffer_struct *buffer, size_t len);
diff --git a/include/libssh/libssh.h b/include/libssh/libssh.h
-index 7857a77b..3eef7a16 100644
+index 7857a77b..6b4d481c 100644
--- a/include/libssh/libssh.h
+++ b/include/libssh/libssh.h
-@@ -833,6 +833,7 @@ LIBSSH_API const char* ssh_get_hmac_in(ssh_session session);
+@@ -402,6 +402,7 @@ enum ssh_options_e {
+ SSH_OPTIONS_GSSAPI_AUTH,
+ SSH_OPTIONS_GLOBAL_KNOWNHOSTS,
+ SSH_OPTIONS_NODELAY,
++ SSH_OPTIONS_CCALGO,
+ SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,
+ SSH_OPTIONS_PROCESS_CONFIG,
+ SSH_OPTIONS_REKEY_DATA,
+@@ -833,6 +834,7 @@ LIBSSH_API const char* ssh_get_hmac_in(ssh_session session);
LIBSSH_API const char* ssh_get_hmac_out(ssh_session session);
LIBSSH_API ssh_buffer ssh_buffer_new(void);
@@ -23,7 +56,7 @@ index 7857a77b..3eef7a16 100644
LIBSSH_API void ssh_buffer_free(ssh_buffer buffer);
#define SSH_BUFFER_FREE(x) \
do { if ((x) != NULL) { ssh_buffer_free(x); x = NULL; } } while(0)
-@@ -843,6 +844,8 @@ LIBSSH_API void *ssh_buffer_get(ssh_buffer buffer);
+@@ -843,6 +845,8 @@ LIBSSH_API void *ssh_buffer_get(ssh_buffer buffer);
LIBSSH_API uint32_t ssh_buffer_get_len(ssh_buffer buffer);
LIBSSH_API int ssh_session_set_disconnect_message(ssh_session session, const char *message);
@@ -32,6 +65,18 @@ index 7857a77b..3eef7a16 100644
#ifndef LIBSSH_LEGACY_0_4
#include "libssh/legacy.h"
#endif
+diff --git a/include/libssh/session.h b/include/libssh/session.h
+index d3e5787c..15183d1b 100644
+--- a/include/libssh/session.h
++++ b/include/libssh/session.h
+@@ -232,6 +232,7 @@ struct ssh_session_struct {
+ int gss_delegate_creds;
+ int flags;
+ int nodelay;
++ char *ccalgo;
+ bool config_processed;
+ uint8_t options_seen[SOC_MAX];
+ uint64_t rekey_data;
diff --git a/include/libssh/sftp.h b/include/libssh/sftp.h
index c855df8a..0fcdb9b8 100644
--- a/include/libssh/sftp.h
@@ -158,6 +203,106 @@ index e0068015..cc0caf35 100644
/**
* @brief Ensure the buffer has at least a certain preallocated size.
*
+diff --git a/src/connect.c b/src/connect.c
+index 57e37e63..c02397d5 100644
+--- a/src/connect.c
++++ b/src/connect.c
+@@ -156,6 +156,20 @@ static int set_tcp_nodelay(socket_t socket)
+ sizeof(opt));
+ }
+
++static int set_tcp_ccalgo(socket_t socket, const char *ccalgo)
++{
++#ifdef HAVE_TCP_CONGESTION
++ return setsockopt(socket,
++ IPPROTO_TCP,
++ TCP_CONGESTION,
++ (void *)ccalgo,
++ strlen(ccalgo));
++#else
++ errno = ENOTSUP;
++ return -1;
++#endif
++}
++
+ /**
+ * @internal
+ *
+@@ -256,6 +270,18 @@ socket_t ssh_connect_host_nonblocking(ssh_session session, const char *host,
+ }
+ }
+
++ if (session->opts.ccalgo) {
++ rc = set_tcp_ccalgo(s, session->opts.ccalgo);
++ if (rc < 0) {
++ ssh_set_error(session, SSH_FATAL,
++ "Failed to set TCP_CONGESTION on socket: %s",
++ ssh_strerror(errno, err_msg, SSH_ERRNO_MSG_MAX));
++ 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 49aaefa2..9f7360c3 100644
+--- a/src/options.c
++++ b/src/options.c
+@@ -210,6 +210,7 @@ int ssh_options_copy(ssh_session src, ssh_session *dest)
+ new->opts.gss_delegate_creds = src->opts.gss_delegate_creds;
+ new->opts.flags = src->opts.flags;
+ new->opts.nodelay = src->opts.nodelay;
++ new->opts.ccalgo = src->opts.ccalgo;
+ new->opts.config_processed = src->opts.config_processed;
+ new->common.log_verbosity = src->common.log_verbosity;
+ new->common.callbacks = src->common.callbacks;
+@@ -450,6 +451,10 @@ int ssh_options_set_algo(ssh_session session,
+ * Set it to disable Nagle's Algorithm (TCP_NODELAY) on the
+ * session socket. (int, 0=false)
+ *
++ * - SSH_OPTIONS_CCALGO
++ * Set it to specify TCP congestion control algorithm on the
++ * session socket (Linux only). (int, 0=false)
++ *
+ * - SSH_OPTIONS_PROCESS_CONFIG
+ * Set it to false to disable automatic processing of per-user
+ * and system-wide OpenSSH configuration files. LibSSH
+@@ -1013,6 +1018,20 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
+ session->opts.nodelay = (*x & 0xff) > 0 ? 1 : 0;
+ }
+ break;
++ case SSH_OPTIONS_CCALGO:
++ v = value;
++ if (v == NULL || v[0] == '\0') {
++ ssh_set_error_invalid(session);
++ return -1;
++ } else {
++ SAFE_FREE(session->opts.ccalgo);
++ session->opts.ccalgo = strdup(v);
++ if (session->opts.ccalgo == NULL) {
++ ssh_set_error_oom(session);
++ return -1;
++ }
++ }
++ break;
+ case SSH_OPTIONS_PROCESS_CONFIG:
+ if (value == NULL) {
+ ssh_set_error_invalid(session);
+diff --git a/src/session.c b/src/session.c
+index 6025c133..6b197526 100644
+--- a/src/session.c
++++ b/src/session.c
+@@ -108,6 +108,7 @@ ssh_session ssh_new(void)
+ session->opts.fd = -1;
+ session->opts.compressionlevel = 7;
+ session->opts.nodelay = 0;
++ session->opts.ccalgo = NULL;
+
+ session->opts.flags = SSH_OPT_FLAG_PASSWORD_AUTH |
+ SSH_OPT_FLAG_PUBKEY_AUTH |
diff --git a/src/sftp.c b/src/sftp.c
index e01012a8..702623a0 100644
--- a/src/sftp.c