diff options
author | Matt Johnston <matt@ucc.asn.au> | 2005-09-21 15:58:19 +0000 |
---|---|---|
committer | Matt Johnston <matt@ucc.asn.au> | 2005-09-21 15:58:19 +0000 |
commit | a2d343b1089b0419bb3f297d5df584483c8c896a (patch) | |
tree | 8345be0444478331e89ab7bd6f176ba3359ed281 | |
parent | a43af44e9ce514c257209d89f78b794490d8a681 (diff) |
- new function to set "low delay" for a packet, set the ip TOS bit
(can help significantly over some links)
--HG--
extra : convert_revision : 685c1004b66533aebbd45810533de698a786a4ea
-rw-r--r-- | dbutil.c | 30 | ||||
-rw-r--r-- | includes.h | 1 |
2 files changed, 27 insertions, 4 deletions
@@ -153,6 +153,30 @@ void dropbear_trace(const char* format, ...) { } #endif /* DEBUG_TRACE */ +static void set_sock_priority(int sock) { + + int val; + + /* disable nagle */ + val = 1; + setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void*)&val, sizeof(val)); + + /* set the TOS bit. note that this will fail for ipv6, I can't find any + * equivalent. */ +#ifdef IPTOS_LOWDELAY + val = IPTOS_LOWDELAY; + setsockopt(sock, IPPROTO_IP, IP_TOS, (void*)&val, sizeof(val)); +#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)); +#endif + +} + /* Listen on address:port. Unless address is NULL, in which case listen on * everything. If called with address == "", we'll listen on localhost/loopback. * Returns the number of sockets bound on success, or -1 on failure. On @@ -223,8 +247,7 @@ int dropbear_listen(const char* address, const char* port, linger.l_linger = 5; setsockopt(sock, SOL_SOCKET, SO_LINGER, (void*)&linger, sizeof(linger)); - /* disable nagle */ - setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void*)&val, sizeof(val)); + set_sock_priority(sock); if (bind(sock, res->ai_addr, res->ai_addrlen) < 0) { err = errno; @@ -347,8 +370,7 @@ int connect_remote(const char* remotehost, const char* remoteport, TRACE(("Error connecting: %s", strerror(err))) } else { /* Success */ - /* (err is used as a dummy var here) */ - setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void*)&err, sizeof(err)); + set_sock_priority(sock); } freeaddrinfo(res0); @@ -45,6 +45,7 @@ #include <grp.h> #include <limits.h> #include <netinet/in.h> +#include <netinet/ip.h> #include <pwd.h> #include <signal.h> #include <stdlib.h> |