From e8d338dde00a04e57189c5f02ee227875e9cf257 Mon Sep 17 00:00:00 2001 From: Catalin Patulea Date: Mon, 2 Dec 2013 22:55:43 +0800 Subject: Set IPTOS_LOWDELAY on PTY sessions only --- cli-chansession.c | 1 + dbutil.c | 29 +++++++++++++++++++++-------- dbutil.h | 2 ++ includes.h | 4 ++++ svr-chansession.c | 2 ++ 5 files changed, 30 insertions(+), 8 deletions(-) diff --git a/cli-chansession.c b/cli-chansession.c index ed80453..6d610d4 100644 --- a/cli-chansession.c +++ b/cli-chansession.c @@ -369,6 +369,7 @@ static int cli_initchansess(struct Channel *channel) { if (cli_opts.wantpty) { send_chansess_pty_req(channel); + set_sock_priority(ses.sock_out); } send_chansess_shell_req(channel); diff --git a/dbutil.c b/dbutil.c index ce88731..4f15027 100644 --- a/dbutil.c +++ b/dbutil.c @@ -177,28 +177,41 @@ void dropbear_trace2(const char* format, ...) { } #endif /* DEBUG_TRACE */ -static void set_sock_priority(int sock) { - +void set_sock_nodelay(int sock) { int val; /* disable nagle */ val = 1; setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void*)&val, sizeof(val)); +} + +void set_sock_priority(int sock) { + + int val, rc; /* set the TOS bit for either ipv4 or ipv6 */ #ifdef IPTOS_LOWDELAY val = IPTOS_LOWDELAY; #if defined(IPPROTO_IPV6) && defined(IPV6_TCLASS) - setsockopt(sock, IPPROTO_IPV6, IPV6_TCLASS, (void*)&val, sizeof(val)); + rc = setsockopt(sock, IPPROTO_IPV6, IPV6_TCLASS, (void*)&val, sizeof(val)); + if (rc < 0) + dropbear_log(LOG_WARNING, "Couldn't set IPV6_TCLASS (%s)", + strerror(errno)); #endif - setsockopt(sock, IPPROTO_IP, IP_TOS, (void*)&val, sizeof(val)); + rc = setsockopt(sock, IPPROTO_IP, IP_TOS, (void*)&val, sizeof(val)); + if (rc < 0) + dropbear_log(LOG_WARNING, "Couldn't set IP_TOS (%s)", + strerror(errno)); #endif #ifdef SO_PRIORITY /* linux specific, sets QoS class. * 6 looks to be optimal for interactive traffic (see tc-prio(8) ). */ - val = 6; - setsockopt(sock, SOL_SOCKET, SO_PRIORITY, (void*) &val, sizeof(val)); + val = TC_PRIO_INTERACTIVE; + rc = setsockopt(sock, SOL_SOCKET, SO_PRIORITY, (void*) &val, sizeof(val)); + if (rc < 0) + dropbear_log(LOG_WARNING, "Couldn't set SO_PRIORITY (%s)", + strerror(errno)); #endif } @@ -290,7 +303,7 @@ int dropbear_listen(const char* address, const char* port, } #endif - set_sock_priority(sock); + set_sock_nodelay(sock); if (bind(sock, res->ai_addr, res->ai_addrlen) < 0) { err = errno; @@ -429,7 +442,7 @@ int connect_remote(const char* remotehost, const char* remoteport, TRACE(("Error connecting: %s", strerror(err))) } else { /* Success */ - set_sock_priority(sock); + set_sock_nodelay(sock); } freeaddrinfo(res0); diff --git a/dbutil.h b/dbutil.h index 7c7435c..7665845 100644 --- a/dbutil.h +++ b/dbutil.h @@ -66,6 +66,8 @@ void get_socket_address(int fd, char **local_host, char **local_port, char **remote_host, char **remote_port, int host_lookup); void getaddrstring(struct sockaddr_storage* addr, char **ret_host, char **ret_port, int host_lookup); +void set_sock_nodelay(int sock); +void set_sock_priority(int sock); int dropbear_listen(const char* address, const char* port, int *socks, unsigned int sockcount, char **errstring, int *maxfd); int spawn_command(void(*exec_fn)(void *user_data), void *exec_data, diff --git a/includes.h b/includes.h index 62a8d73..bae82f5 100644 --- a/includes.h +++ b/includes.h @@ -156,6 +156,10 @@ typedef unsigned int u_int32_t; typedef u_int32_t uint32_t; #endif /* HAVE_UINT32_T */ +#ifdef SO_PRIORITY +#include +#endif + #include "fake-rfc2553.h" #ifndef LOG_AUTHPRIV diff --git a/svr-chansession.c b/svr-chansession.c index b585a9a..b912eaf 100644 --- a/svr-chansession.c +++ b/svr-chansession.c @@ -580,6 +580,8 @@ static int sessionpty(struct ChanSess * chansess) { /* Read the terminal modes */ get_termmodes(chansess); + set_sock_priority(ses.sock_out); + TRACE(("leave sessionpty")) return DROPBEAR_SUCCESS; } -- cgit v1.2.1