Set IPTOS_LOWDELAY on PTY sessions only

This commit is contained in:
Catalin Patulea 2013-12-02 22:55:43 +08:00
parent 4f6f651b7d
commit ddc10b2d0c
5 changed files with 30 additions and 8 deletions

View File

@ -369,6 +369,7 @@ static int cli_initchansess(struct Channel *channel) {
if (cli_opts.wantpty) { if (cli_opts.wantpty) {
send_chansess_pty_req(channel); send_chansess_pty_req(channel);
set_sock_priority(ses.sock_out);
} }
send_chansess_shell_req(channel); send_chansess_shell_req(channel);

View File

@ -177,28 +177,41 @@ void dropbear_trace2(const char* format, ...) {
} }
#endif /* DEBUG_TRACE */ #endif /* DEBUG_TRACE */
static void set_sock_priority(int sock) { void set_sock_nodelay(int sock) {
int val; int val;
/* disable nagle */ /* disable nagle */
val = 1; val = 1;
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void*)&val, sizeof(val)); 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 */ /* set the TOS bit for either ipv4 or ipv6 */
#ifdef IPTOS_LOWDELAY #ifdef IPTOS_LOWDELAY
val = IPTOS_LOWDELAY; val = IPTOS_LOWDELAY;
#if defined(IPPROTO_IPV6) && defined(IPV6_TCLASS) #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 #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 #endif
#ifdef SO_PRIORITY #ifdef SO_PRIORITY
/* linux specific, sets QoS class. /* linux specific, sets QoS class.
* 6 looks to be optimal for interactive traffic (see tc-prio(8) ). */ * 6 looks to be optimal for interactive traffic (see tc-prio(8) ). */
val = 6; val = TC_PRIO_INTERACTIVE;
setsockopt(sock, SOL_SOCKET, SO_PRIORITY, (void*) &val, sizeof(val)); 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 #endif
} }
@ -290,7 +303,7 @@ int dropbear_listen(const char* address, const char* port,
} }
#endif #endif
set_sock_priority(sock); set_sock_nodelay(sock);
if (bind(sock, res->ai_addr, res->ai_addrlen) < 0) { if (bind(sock, res->ai_addr, res->ai_addrlen) < 0) {
err = errno; err = errno;
@ -429,7 +442,7 @@ int connect_remote(const char* remotehost, const char* remoteport,
TRACE(("Error connecting: %s", strerror(err))) TRACE(("Error connecting: %s", strerror(err)))
} else { } else {
/* Success */ /* Success */
set_sock_priority(sock); set_sock_nodelay(sock);
} }
freeaddrinfo(res0); freeaddrinfo(res0);

View File

@ -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); char **remote_host, char **remote_port, int host_lookup);
void getaddrstring(struct sockaddr_storage* addr, void getaddrstring(struct sockaddr_storage* addr,
char **ret_host, char **ret_port, int host_lookup); 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 dropbear_listen(const char* address, const char* port,
int *socks, unsigned int sockcount, char **errstring, int *maxfd); int *socks, unsigned int sockcount, char **errstring, int *maxfd);
int spawn_command(void(*exec_fn)(void *user_data), void *exec_data, int spawn_command(void(*exec_fn)(void *user_data), void *exec_data,

View File

@ -156,6 +156,10 @@ typedef unsigned int u_int32_t;
typedef u_int32_t uint32_t; typedef u_int32_t uint32_t;
#endif /* HAVE_UINT32_T */ #endif /* HAVE_UINT32_T */
#ifdef SO_PRIORITY
#include <linux/pkt_sched.h>
#endif
#include "fake-rfc2553.h" #include "fake-rfc2553.h"
#ifndef LOG_AUTHPRIV #ifndef LOG_AUTHPRIV

View File

@ -580,6 +580,8 @@ static int sessionpty(struct ChanSess * chansess) {
/* Read the terminal modes */ /* Read the terminal modes */
get_termmodes(chansess); get_termmodes(chansess);
set_sock_priority(ses.sock_out);
TRACE(("leave sessionpty")) TRACE(("leave sessionpty"))
return DROPBEAR_SUCCESS; return DROPBEAR_SUCCESS;
} }