# HG changeset patch # User Matt Johnston # Date 1386000288 -28800 # Node ID aa689d140928f244f15f7fc3fe93e8b16e71f31f # Parent 80af450dae76a265e5baa5fbaf4ed8323d4766dd - Sockets are set to lowdelay priority initially to improve conneciton setup time - Set non-pty connections to bulk for client and server diff -r 80af450dae76 -r aa689d140928 cli-chansession.c --- a/cli-chansession.c Mon Dec 02 22:55:43 2013 +0800 +++ b/cli-chansession.c Tue Dec 03 00:04:48 2013 +0800 @@ -369,7 +369,8 @@ if (cli_opts.wantpty) { send_chansess_pty_req(channel); - set_sock_priority(ses.sock_out); + } else { + set_sock_priority(ses.sock_out, DROPBEAR_PRIO_BULK); } send_chansess_shell_req(channel); diff -r 80af450dae76 -r aa689d140928 cli-main.c --- a/cli-main.c Mon Dec 02 22:55:43 2013 +0800 +++ b/cli-main.c Tue Dec 03 00:04:48 2013 +0800 @@ -75,6 +75,9 @@ int sock = connect_remote(cli_opts.remotehost, cli_opts.remoteport, 0, &error); sock_in = sock_out = sock; + if (cli_opts.wantpty) { + set_sock_priority(sock, DROPBEAR_PRIO_LOWDELAY); + } } if (sock_in < 0) { diff -r 80af450dae76 -r aa689d140928 dbutil.c --- a/dbutil.c Mon Dec 02 22:55:43 2013 +0800 +++ b/dbutil.c Tue Dec 03 00:04:48 2013 +0800 @@ -185,30 +185,37 @@ setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void*)&val, sizeof(val)); } -void set_sock_priority(int sock) { +void set_sock_priority(int sock, enum dropbear_prio prio) { - int val, rc; + int iptos_val = 0, so_prio_val = 0, rc; /* set the TOS bit for either ipv4 or ipv6 */ #ifdef IPTOS_LOWDELAY - val = IPTOS_LOWDELAY; + if (prio == DROPBEAR_PRIO_LOWDELAY) { + iptos_val = IPTOS_LOWDELAY; + } else if (prio == DROPBEAR_PRIO_BULK) { + iptos_val = IPTOS_THROUGHPUT; + } #if defined(IPPROTO_IPV6) && defined(IPV6_TCLASS) - 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)); + rc = setsockopt(sock, IPPROTO_IPV6, IPV6_TCLASS, (void*)&iptos_val, sizeof(iptos_val)); + if (rc < 0) { + TRACE(("Couldn't set IPV6_TCLASS (%s)", strerror(errno))); + } #endif - 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)); + rc = setsockopt(sock, IPPROTO_IP, IP_TOS, (void*)&iptos_val, sizeof(iptos_val)); + if (rc < 0) { + TRACE(("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 = TC_PRIO_INTERACTIVE; - rc = setsockopt(sock, SOL_SOCKET, SO_PRIORITY, (void*) &val, sizeof(val)); + if (prio == DROPBEAR_PRIO_LOWDELAY) { + so_prio_val = TC_PRIO_INTERACTIVE; + } else if (prio == DROPBEAR_PRIO_BULK) { + so_prio_val = TC_PRIO_BULK; + } + /* linux specific, sets QoS class. see tc-prio(8) */ + rc = setsockopt(sock, SOL_SOCKET, SO_PRIORITY, (void*) &so_prio_val, sizeof(so_prio_val)); if (rc < 0) dropbear_log(LOG_WARNING, "Couldn't set SO_PRIORITY (%s)", strerror(errno)); diff -r 80af450dae76 -r aa689d140928 dbutil.h --- a/dbutil.h Mon Dec 02 22:55:43 2013 +0800 +++ b/dbutil.h Tue Dec 03 00:04:48 2013 +0800 @@ -61,13 +61,19 @@ extern int debug_trace; #endif +enum dropbear_prio { + DROPBEAR_PRIO_DEFAULT, + DROPBEAR_PRIO_LOWDELAY, + DROPBEAR_PRIO_BULK, +}; + char * stripcontrol(const char * text); 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); +void set_sock_priority(int sock, enum dropbear_prio prio); 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 -r 80af450dae76 -r aa689d140928 svr-chansession.c --- a/svr-chansession.c Mon Dec 02 22:55:43 2013 +0800 +++ b/svr-chansession.c Tue Dec 03 00:04:48 2013 +0800 @@ -580,8 +580,6 @@ /* Read the terminal modes */ get_termmodes(chansess); - set_sock_priority(ses.sock_out); - TRACE(("leave sessionpty")) return DROPBEAR_SUCCESS; } @@ -666,6 +664,7 @@ if (chansess->term == NULL) { /* no pty */ + set_sock_priority(ses.sock_out, DROPBEAR_PRIO_BULK); ret = noptycommand(channel, chansess); } else { /* want pty */ diff -r 80af450dae76 -r aa689d140928 svr-main.c --- a/svr-main.c Mon Dec 02 22:55:43 2013 +0800 +++ b/svr-main.c Tue Dec 03 00:04:48 2013 +0800 @@ -137,6 +137,11 @@ dropbear_exit("No listening ports available."); } + for (i = 0; i < listensockcount; i++) { + set_sock_priority(listensocks[i], DROPBEAR_PRIO_LOWDELAY); + FD_SET(listensocks[i], &fds); + } + /* fork */ if (svr_opts.forkbg) { int closefds = 0;