On Sun, Mar 06, 2011 at 09:12:41AM +0100, Reyk Floeter wrote: > this diff will break chunked encoding and keep-alive connections where > we need to enable splicing for a specified amount of data only and > return for the next HTTP header.
I don't think so. I only set F_SPLICE for RELAY_PROTO_TCP and not for RELAY_PROTO_HTTP. > the env variable should be replaced > with a permanent config option in parse.y. New diff with nosplice protocol option. The config looks like this: tcp protocol "copy" { nosplice } tcp protocol "splice" relay "tcpbench" { listen on 10.188.50.50 port 12345 forward to 10.188.50.10 port 12345 } relay "slow" { protocol "copy" listen on 10.188.50.50 port 12346 forward to 10.188.50.10 port 12345 } relay "fast" { protocol "splice" listen on 10.188.50.50 port 12347 forward to 10.188.50.10 port 12345 } Note that the default tcp protocol comes with splicing enabled. The option nosplice is useful for performance comparison and debugging. I have also tested with http connection keep-alive, client ssl and server ssl. In these cases, socket splicing is not used. ok? bluhm Index: usr.sbin/relayd/parse.y =================================================================== RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/relayd/parse.y,v retrieving revision 1.149 diff -u -p -r1.149 parse.y --- usr.sbin/relayd/parse.y 26 Oct 2010 15:04:37 -0000 1.149 +++ usr.sbin/relayd/parse.y 7 Mar 2011 21:03:34 -0000 @@ -145,7 +145,7 @@ typedef struct { %token EXTERNAL FILENAME FILTER FORWARD FROM HASH HEADER HOST ICMP %token INCLUDE INET INET6 INTERFACE INTERVAL IP LABEL LISTEN %token LOADBALANCE LOG LOOKUP MARK MARKED MODE NAT NO -%token NODELAY NOTHING ON PARENT PATH PORT PREFORK PROTO +%token NODELAY NOSPLICE NOTHING ON PARENT PATH PORT PREFORK PROTO %token QUERYSTR REAL REDIRECT RELAY REMOVE REQUEST RESPONSE RETRY %token RETURN ROUNDROBIN ROUTE SACK SCRIPT SEND SESSION SOCKET %token SSL STICKYADDR STYLE TABLE TAG TCP TIMEOUT TO ROUTER RTLABEL @@ -796,6 +796,8 @@ proto : relay_proto PROTO STRING { free($3); p->id = ++last_proto_id; p->type = $1; + if (p->type == RELAY_PROTO_TCP) + p->flags |= F_SPLICE; p->cache = RELAY_CACHESIZE; p->tcpflags = TCPFLAG_DEFAULT; p->sslflags = SSLFLAG_DEFAULT; @@ -835,6 +837,7 @@ protoptsl : SSL sslflags | SSL '{' sslflags_l '}' | TCP tcpflags | TCP '{' tcpflags_l '}' + | NOSPLICE { proto->flags &= ~F_SPLICE; } | RETURN ERROR opteflags { proto->flags |= F_RETURN; } | RETURN ERROR '{' eflags_l '}' { proto->flags |= F_RETURN; } | LABEL STRING { @@ -1747,6 +1750,7 @@ lookup(char *s) { "nat", NAT }, { "no", NO }, { "nodelay", NODELAY }, + { "nosplice", NOSPLICE }, { "nothing", NOTHING }, { "on", ON }, { "parent", PARENT }, @@ -2162,7 +2166,7 @@ parse_config(const char *filename, int o sizeof(conf->sc_empty_table.conf.name)); bzero(&conf->sc_proto_default, sizeof(conf->sc_proto_default)); - conf->sc_proto_default.flags = F_USED; + conf->sc_proto_default.flags = F_USED|F_SPLICE; conf->sc_proto_default.cache = RELAY_CACHESIZE; conf->sc_proto_default.tcpflags = TCPFLAG_DEFAULT; conf->sc_proto_default.tcpbacklog = RELAY_BACKLOG; Index: usr.sbin/relayd/relay.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/relayd/relay.c,v retrieving revision 1.128 diff -u -p -r1.128 relay.c --- usr.sbin/relayd/relay.c 20 Dec 2010 12:38:06 -0000 1.128 +++ usr.sbin/relayd/relay.c 22 Feb 2011 22:54:05 -0000 @@ -2328,6 +2328,22 @@ relay_connect(struct rsession *con) return (-1); } + if (rlay->rl_proto->flags & F_SPLICE && + (rlay->rl_conf.flags & (F_SSL|F_SSLCLIENT)) == 0) { + if (setsockopt(con->se_in.s, SOL_SOCKET, SO_SPLICE, + &con->se_out.s, sizeof(int)) == -1) { + log_debug("relay_connect: session %d: splice forward " + "failed: %s", con->se_id, strerror(errno)); + return (-1); + } + if (setsockopt(con->se_out.s, SOL_SOCKET, SO_SPLICE, + &con->se_in.s, sizeof(int)) == -1) { + log_debug("relay_connect: session %d: splice backward " + "failed: %s", con->se_id, strerror(errno)); + return (-1); + } + } + if (errno == EINPROGRESS) event_again(&con->se_ev, con->se_out.s, EV_WRITE|EV_TIMEOUT, relay_connected, &con->se_tv_start, &env->sc_timeout, con); Index: usr.sbin/relayd/relayd.conf.5 =================================================================== RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/relayd/relayd.conf.5,v retrieving revision 1.116 diff -u -p -r1.116 relayd.conf.5 --- usr.sbin/relayd/relayd.conf.5 26 Oct 2010 15:26:58 -0000 1.116 +++ usr.sbin/relayd/relayd.conf.5 7 Mar 2011 22:55:49 -0000 @@ -945,6 +945,10 @@ no label .Ed .It Ic no label Do not set a label for subsequently added actions; this is the default. +.It Ic nosplice +Turn off socket splicing and copy the data in user-land instead. +Socket splicing is used by default to speed up plain TCP connections +without SSL. .It Ic remove Ar key Remove the entity with the selected name. .It Ic remove file Ar path Index: usr.sbin/relayd/relayd.h =================================================================== RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/relayd/relayd.h,v retrieving revision 1.140 diff -u -p -r1.140 relayd.h --- usr.sbin/relayd/relayd.h 31 Dec 2010 21:22:42 -0000 1.140 +++ usr.sbin/relayd/relayd.h 22 Feb 2011 22:54:05 -0000 @@ -249,6 +249,7 @@ TAILQ_HEAD(addresslist, address); #define F_SSLCLIENT 0x00200000 #define F_NEEDRT 0x00400000 #define F_MATCH 0x00800000 +#define F_SPLICE 0x01000000 enum forwardmode { FWD_NORMAL = 0,