]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
12 years agoMEDIUM: monitor: simplify handling of monitor-net and mode health
Willy Tarreau [Thu, 27 Sep 2012 21:48:56 +0000 (23:48 +0200)] 
MEDIUM: monitor: simplify handling of monitor-net and mode health

We were having several different behaviours with monitor-net and
"mode health" :
  - monitor-net on TCP connections was evaluated just after accept(),
    did not count a connection on the frontend and were not subject
    to tcp-request connection rules, and caused an immediate close().

  - monitor-net in HTTP mode was evaluated once the session was
    accepted (eg: on top of SSL), returned "HTTP/1.0 200 OK\r\n\r\n"
    over the connection's data layer and instanciated a session which
    was responsible for closing this connection. A connection AND a
    session were counted for the frontend ;

  - "mode health" with "option httpchk" would do exactly the same as
    monitor-net in HTTP mode ;

  - "mode health" without "option httpchk" would do the same as above
    except that "OK" was returned instead of "HTTP/1.0 200 OK\r\n\r\n".

None of them took care of cleaning the input buffer, sometimes resulting
in a TCP reset to be emitted after the last packet if a request was received
over the connection.

Given the inconsistencies and the complexity in keeping all these features
handled at the right position, we now slightly changed the way they are
handled :

  - all of them are handled just after the "tcp-request connection" rules,
    so that all of them may be blocked using such rules, offering more
    flexibility and consistency ;

  - no connection handshake is performed anymore for non-TCP modes

  - all of them send the response as raw data over the socket, there is no
    more difference between TCP and HTTP mode for example (these rules were
    never meant to be served over SSL connections and were never documented
    as able to do that).

  - any possible pending data on the incoming socket is drained before the
    response is sent, in order to avoid the risk of a reset.

  - none of them exactly did what was documented !

This results in more consistent, more flexible and more accurate handling of
monitor rules, with smaller and more robust code.

12 years agoBUG/MAJOR: http: chunk parser was broken with buffer changes
Willy Tarreau [Thu, 27 Sep 2012 13:08:56 +0000 (15:08 +0200)] 
BUG/MAJOR: http: chunk parser was broken with buffer changes

Since at least commit a458b679, msg->sov could become negative in
http_parse_chunk_size() if a chunk size wrapped around the buffer.
The effect is that at some point channel_forward() was called with
a negative size, causing all data to be transferred without being
analyzed anymore.

Since haproxy does not support keep-alive with the server yet, this
issue is not really noticeable, as the server closes the connection
in response. Still, when tunnel mode is used or when pretent-keepalive
is used, it is possible to see the problem.

This issue was reported and diagnosed by William Lallemand at
Exceliance.

12 years agoMINOR: cli: allow to set frontend maxconn to zero
Willy Tarreau [Wed, 26 Sep 2012 19:07:15 +0000 (21:07 +0200)] 
MINOR: cli: allow to set frontend maxconn to zero

It is sometimes useful to completely disable accepting new connections
on a frontend during maintenance operations. By setting a frontend's
maxconn to zero, connections are not accepted anymore until the limit
is increased again.

12 years agoBUG: stats: fix regression introduced by commit 4348fad1
Willy Tarreau [Wed, 26 Sep 2012 19:03:11 +0000 (21:03 +0200)] 
BUG: stats: fix regression introduced by commit 4348fad1

Recent commit 4348fad1 (listeners: use dual-linked lists to chain listeners
with frontends) broke frontend lookup in stats sockets by using the wrong
iterator in the listeners.

12 years agoCLEANUP: config: fix typo inteface => interface
Willy Tarreau [Tue, 25 Sep 2012 14:31:00 +0000 (16:31 +0200)] 
CLEANUP: config: fix typo inteface => interface

This was in an error message.

12 years agoCLEANUP: connection: offer conn_prepare() to set up a connection
Willy Tarreau [Mon, 24 Sep 2012 15:15:42 +0000 (17:15 +0200)] 
CLEANUP: connection: offer conn_prepare() to set up a connection

This will be used by checks as well as stream interfaces.

12 years agoBUG/MINOR: config: check the proper pointer to report unknown protocol
Willy Tarreau [Mon, 24 Sep 2012 20:47:39 +0000 (22:47 +0200)] 
BUG/MINOR: config: check the proper pointer to report unknown protocol

Check the protocol pointer and not the socket to report an unknown family
in servers or peers. This can never happen anyway, it's just to be completely
clean.

12 years agoBUG: http: do not print garbage on invalid requests in debug mode
Willy Tarreau [Mon, 24 Sep 2012 19:13:39 +0000 (21:13 +0200)] 
BUG: http: do not print garbage on invalid requests in debug mode

Cyril Bonté reported a mangled debug output when an invalid request
was sent with a faulty request line. The reason was the use of the
msg->sl.rq.l offset which was not yet initialized in this case. So
we change the way to report such an error so that first we initialize
it to zero before parsing a message, then we use that to know whether
we can trust it or not. If it's still zero, then we display the whole
buffer, truncated by debug_hdr() to the first CR or LF character, which
results in the first line only.

The same operation was performed for the response, which was wrong too.

12 years agoBUILD: fix compilation error with DEBUG_FULL
Cyril Bonté [Sun, 23 Sep 2012 12:19:12 +0000 (14:19 +0200)] 
BUILD: fix compilation error with DEBUG_FULL

Recent changes in structures broke the compilation when using DEBUG_FULL.
Let's update apply the changes also to the variables used in DPRINTF calls.

12 years agoDOC: fix index to reference bind and server options
Willy Tarreau [Mon, 24 Sep 2012 18:34:51 +0000 (20:34 +0200)] 
DOC: fix index to reference bind and server options

Last commit forgot to update the index.

12 years agoDOC: stats: refer to "bind" section for "stats socket" settings
Willy Tarreau [Mon, 24 Sep 2012 10:43:26 +0000 (12:43 +0200)] 
DOC: stats: refer to "bind" section for "stats socket" settings

They're all shared now, so let's have them described at one single
place.

12 years agoDOC: move bind options to their own section
Willy Tarreau [Mon, 24 Sep 2012 10:27:33 +0000 (12:27 +0200)] 
DOC: move bind options to their own section

There are now too many bind options to still have them in the middle
of the keyword matrix, so let's move them with the server options in
section 5. No new option was documented yet at this point.

12 years agoMEDIUM: stats: make use of the standard "bind" parsers to parse global socket
Willy Tarreau [Sat, 22 Sep 2012 17:32:35 +0000 (19:32 +0200)] 
MEDIUM: stats: make use of the standard "bind" parsers to parse global socket

The global stats socket statement now makes use of the standard bind parsers.
This results in all UNIX socket options being set by proto_uxst and in all
TCP and SSL options being inherited and usable. For example it is now possible
to enable a stats socket over SSL/TCP by appending the "ssl" keyword and a
certificate after "crt".

The code is simplified since we don't have a special case to parse this config
keyword anymore.

12 years agoMINOR: ssl: set the listeners' data layer to ssl during parsing
Willy Tarreau [Sat, 22 Sep 2012 17:11:47 +0000 (19:11 +0200)] 
MINOR: ssl: set the listeners' data layer to ssl during parsing

It's better to set all listeners to ssl_sock when seeing the "ssl"
keyword that to loop on all of them afterwards just for this. This
also removes some #ifdefs.

12 years agoMEDIUM: stats: remove the stats_sock struct from the global struct
Willy Tarreau [Thu, 20 Sep 2012 18:19:28 +0000 (20:19 +0200)] 
MEDIUM: stats: remove the stats_sock struct from the global struct

Now the stats socket is allocated when the 'stats socket' line is parsed,
and assigned using the standard str2listener(). This has two effects :
  - more than one stats socket can now be declared
  - stats socket now support protocols other than UNIX

The next step is to remove the duplicate bind config parsing.

12 years agoMINOR: config: make str2listener() use memprintf() to report errors.
Willy Tarreau [Thu, 20 Sep 2012 18:01:39 +0000 (20:01 +0200)] 
MINOR: config: make str2listener() use memprintf() to report errors.

This will make it possible to use the function for other listening
sockets.

12 years agoMINOR: standard: make memprintf() support a NULL destination
Willy Tarreau [Thu, 20 Sep 2012 17:43:14 +0000 (19:43 +0200)] 
MINOR: standard: make memprintf() support a NULL destination

Doing so removes many checks that were systematically made because
the callees don't know if the caller passed a valid pointer.

12 years agoBUG: backend: balance hdr was broken since 1.5-dev11
Willy Tarreau [Sat, 22 Sep 2012 16:36:29 +0000 (18:36 +0200)] 
BUG: backend: balance hdr was broken since 1.5-dev11

Alex Markham reported and diagnosed a bug appearing on 1.5-dev11,
causing a crash on x86_64 when header hashing is used. The cause is
a missing (int) cast causing a negative offset to appear positive
and the resulting pointer to go out of bounds.

The crash is not possible anymore since 1.5-dev12 because a second
bug caused the negative sign to disappear so the pointer is always
within range but always wrong, so balance hdr() never works anymore.

This fix restores the correct behaviour and ensures the sign is
correct.

12 years agoREORG: listener: move unix perms from the listener to the bind_conf
Willy Tarreau [Thu, 20 Sep 2012 16:07:14 +0000 (18:07 +0200)] 
REORG: listener: move unix perms from the listener to the bind_conf

Unix permissions are per-bind configuration line and not per listener,
so let's concretize this in the way the config is stored. This avoids
some unneeded loops to set permissions on all listeners.

The access level is not part of the unix perms so it has been moved
away. Once we can use str2listener() to set all listener addresses,
we'll have a bind keyword parser for this one.

12 years agoMAJOR: listeners: use dual-linked lists to chain listeners with frontends
Willy Tarreau [Thu, 20 Sep 2012 14:48:07 +0000 (16:48 +0200)] 
MAJOR: listeners: use dual-linked lists to chain listeners with frontends

Navigating through listeners was very inconvenient and error-prone. Not to
mention that listeners were linked in reverse order and reverted afterwards.
In order to definitely get rid of these issues, we now do the following :
  - frontends have a dual-linked list of bind_conf
  - frontends have a dual-linked list of listeners
  - bind_conf have a dual-linked list of listeners
  - listeners have a pointer to their bind_conf

This way we can now navigate from anywhere to anywhere and always find the
proper bind_conf for a given listener, as well as find the list of listeners
for a current bind_conf.

12 years agoMINOR: config: set the bind_conf entry on listeners created from a "listen" line.
Willy Tarreau [Tue, 18 Sep 2012 18:52:35 +0000 (20:52 +0200)] 
MINOR: config: set the bind_conf entry on listeners created from a "listen" line.

Otherwise we would risk a segfault when checking the config's validity
(eg: when looking for conflicts on ID assignments).

Note that the same issue exists with peers_fe and the global stats_fe. All
listeners should be reviewed and simplified to use a compatible declaration
mode.

12 years agoMINOR: stats: fill the file and line numbers in the stats frontend
Willy Tarreau [Tue, 18 Sep 2012 18:05:00 +0000 (20:05 +0200)] 
MINOR: stats: fill the file and line numbers in the stats frontend

The stats frontend struct has config file and line which were not set.
They're not used right now but better fill them correctly anyway.

12 years agoMINOR: config: pass the file and line to config keyword parsers
Willy Tarreau [Tue, 18 Sep 2012 18:02:48 +0000 (20:02 +0200)] 
MINOR: config: pass the file and line to config keyword parsers

This will be needed when we need to create bind config settings.

12 years agoMINOR: listener: add a scope field in the bind keyword lists
Willy Tarreau [Tue, 18 Sep 2012 16:24:39 +0000 (18:24 +0200)] 
MINOR: listener: add a scope field in the bind keyword lists

This scope is used to report what the keywords are used for (eg: TCP,
UNIX, ...). It is now reported by bind_dump_kws().

12 years agoMEDIUM: config: enumerate full list of registered "bind" keywords upon error
Willy Tarreau [Tue, 18 Sep 2012 16:01:17 +0000 (18:01 +0200)] 
MEDIUM: config: enumerate full list of registered "bind" keywords upon error

When an unknown "bind" keyword is detected, dump the list of all
registered keywords. Unsupported default alternatives are also reported
as "not supported".

12 years agoMEDIUM: config: move all unix-specific bind keywords to proto_uxst.c
Willy Tarreau [Tue, 18 Sep 2012 15:40:35 +0000 (17:40 +0200)] 
MEDIUM: config: move all unix-specific bind keywords to proto_uxst.c

The "mode", "uid", "gid", "user" and "group" bind options were moved to
proto_uxst as they are unix-specific.

Note that previous versions had a bug here, only the last listener was
updated with the specified settings. However, it almost never happens
that bind lines contain multiple UNIX socket paths so this is not that
much of a problem anyway.

12 years agoMEDIUM: config: move the common "bind" settings to listener.c
Willy Tarreau [Tue, 18 Sep 2012 15:17:28 +0000 (17:17 +0200)] 
MEDIUM: config: move the common "bind" settings to listener.c

These ones are better placed in listener.c than in cfgparse.c, by relying
on the bind keyword registration subsystem.

12 years agoMINOR: config: improve error reporting for "bind" lines
Willy Tarreau [Tue, 18 Sep 2012 14:34:09 +0000 (16:34 +0200)] 
MINOR: config: improve error reporting for "bind" lines

We now report the bind argument, which was missing in all error reports. It
is now much more convenient to spot configuration mistakes.

12 years agoMEDIUM: move bind SSL parsing to ssl_sock
Willy Tarreau [Fri, 14 Sep 2012 05:53:05 +0000 (07:53 +0200)] 
MEDIUM: move bind SSL parsing to ssl_sock

Registering new SSL bind keywords was not particularly handy as it required
many #ifdef in cfgparse.c. Now the code has moved to ssl_sock.c which calls
a register function for all the keywords.

Error reporting was also improved by this move, because the called functions
build an error message using memprintf(), which can span multiple lines if
needed, and each of these errors will be displayed indented in the context of
the bind line being processed. This is important when dealing with certificate
directories which can report multiple errors.

12 years agoMEDIUM: config: move the "bind" TCP parameters to proto_tcp
Willy Tarreau [Wed, 12 Sep 2012 21:27:21 +0000 (23:27 +0200)] 
MEDIUM: config: move the "bind" TCP parameters to proto_tcp

Now proto_tcp.c is responsible for the 4 settings it handles :
  - defer-accept
  - interface
  - mss
  - transparent

These ones do not need to be handled in cfgparse anymore. If support for a
setting is disabled by a missing build option, then cfgparse correctly
reports :

  [ALERT] 255/232700 (2701) : parsing [echo.cfg:114] : 'bind' : 'transparent' option is not implemented in this version (check build options).

12 years agoMEDIUM: listener: add a minimal framework to register "bind" keyword options
Willy Tarreau [Wed, 12 Sep 2012 21:17:10 +0000 (23:17 +0200)] 
MEDIUM: listener: add a minimal framework to register "bind" keyword options

With the arrival of SSL, the "bind" keyword has received even more options,
all of which are processed in cfgparse in a cumbersome way. So it's time to
let modules register their own bind options. This is done very similarly to
the ACLs with a small difference in that we make the difference between an
unknown option and a known, unimplemented option.

12 years agoCLEANUP: listener: remove unused conf->file and conf->line
Willy Tarreau [Thu, 13 Sep 2012 17:34:38 +0000 (19:34 +0200)] 
CLEANUP: listener: remove unused conf->file and conf->line

These ones are already in bind_conf.

12 years agoMEDIUM: config: replace ssl_conf by bind_conf
Willy Tarreau [Thu, 13 Sep 2012 15:54:29 +0000 (17:54 +0200)] 
MEDIUM: config: replace ssl_conf by bind_conf

Some settings need to be merged per-bind config line and are not necessarily
SSL-specific. It becomes quite inconvenient to have this ssl_conf SSL-specific,
so let's replace it with something more generic.

12 years agoREORG: split "protocols" files into protocol and listener
Willy Tarreau [Wed, 12 Sep 2012 20:58:11 +0000 (22:58 +0200)] 
REORG: split "protocols" files into protocol and listener

It was becoming confusing to have protocols and listeners in the same
files, split them.

12 years agoMINOR: config: add a function to indent error messages
Willy Tarreau [Fri, 14 Sep 2012 09:40:36 +0000 (11:40 +0200)] 
MINOR: config: add a function to indent error messages

Bind parsers may return multiple errors, so let's make use of a new function
to re-indent multi-line error messages so that they're all reported in their
context.

12 years agoBUG/MAJOR: ssl: missing tests in ACL fetch functions
Willy Tarreau [Fri, 14 Sep 2012 21:56:58 +0000 (23:56 +0200)] 
BUG/MAJOR: ssl: missing tests in ACL fetch functions

Baptiste Assmann observed a crash of 1.5-dev12 occuring when the ssl_sni
fetch was used with no SNI on the input connection and without a prior
has_sni check. A code review revealed several issues :
   1) it was possible to call the has_sni and ssl_sni fetch functions with
      a NULL data_ctx if the handshake fails or if the connection is aborted
      during the handshake.
   2) when no SNI is present, strlen() was called with a NULL parameter in
      smp_fetch_ssl_sni().

12 years agoDOC: duplicate ssl_sni section
Guillaume Castagnino [Thu, 13 Sep 2012 13:02:53 +0000 (15:02 +0200)] 
DOC: duplicate ssl_sni section

I noticed that the ssl_sni section is duplicated in configuration. Here
is the (very) small fix.

12 years agoMEDIUM: http: add "redirect scheme" to ease HTTP to HTTPS redirection
Willy Tarreau [Wed, 12 Sep 2012 06:43:15 +0000 (08:43 +0200)] 
MEDIUM: http: add "redirect scheme" to ease HTTP to HTTPS redirection

For instance :

   redirect scheme https if !{ is_ssl }

12 years ago[RELEASE] Released version 1.5-dev12 v1.5-dev12
Willy Tarreau [Mon, 10 Sep 2012 07:46:55 +0000 (09:46 +0200)] 
[RELEASE] Released version 1.5-dev12

Released version 1.5-dev12 with the following main changes :
    - CONTRIB: halog: sort URLs by avg bytes_read or total bytes_read
    - MEDIUM: ssl: add support for prefer-server-ciphers option
    - MINOR: IPv6 support for transparent proxy
    - MINOR: protocol: add SSL context to listeners if USE_OPENSSL is defined
    - MINOR: server: add SSL context to servers if USE_OPENSSL is defined
    - MEDIUM: connection: add a new handshake flag for SSL (CO_FL_SSL_WAIT_HS).
    - MEDIUM: ssl: add new files ssl_sock.[ch] to provide the SSL data layer
    - MEDIUM: config: add the 'ssl' keyword on 'bind' lines
    - MEDIUM: config: add support for the 'ssl' option on 'server' lines
    - MEDIUM: ssl: protect against client-initiated renegociation
    - BUILD: add optional support for SSL via the USE_OPENSSL flag
    - MEDIUM: ssl: add shared memory session cache implementation.
    - MEDIUM: ssl: replace OpenSSL's session cache with the shared cache
    - MINOR: ssl add global setting tune.sslcachesize to set SSL session cache size.
    - MEDIUM: ssl: add support for SNI and wildcard certificates
    - DOC: Typos cleanup
    - DOC: fix name for "option independant-streams"
    - DOC: specify the default value for maxconn in the context of a proxy
    - BUG/MINOR: to_log erased with unique-id-format
    - LICENSE: add licence exception for OpenSSL
    - BUG/MAJOR: cookie prefix doesn't support cookie-less servers
    - BUILD: add an AIX 5.2 (and later) target.
    - MEDIUM: fd/si: move peeraddr from struct fdinfo to struct connection
    - MINOR: halog: use the more recent dual-mode fgets2 implementation
    - BUG/MEDIUM: ebtree: ebmb_insert() must not call cmp_bits on full-length matches
    - CLEANUP: halog: make clean should also remove .o files
    - OPTIM: halog: make use of memchr() on platforms which provide a fast one
    - OPTIM: halog: improve cold-cache behaviour when loading a file
    - BUG/MINOR: ACL implicit arguments must be created with unresolved flag
    - MINOR: replace acl_fetch_{path,url}* with smp_fetch_*
    - MEDIUM: pattern: add the "base" sample fetch method
    - OPTIM: i386: make use of kernel-mode-linux when available
    - BUG/MINOR: tarpit: fix condition to return the HTTP 500 message
    - BUG/MINOR: polling: some events were not set in various pollers
    - MINOR: http: add the urlp_val ACL match
    - BUG: stktable: tcp_src_to_stktable_key() must return NULL on invalid families
    - MINOR: stats/cli: add plans to support more stick-table actions
    - MEDIUM: stats/cli: add support for "set table key" to enter values
    - REORG/MEDIUM: fd: remove FD_STCLOSE from struct fdtab
    - REORG/MEDIUM: fd: remove checks for FD_STERROR in ev_sepoll
    - REORG/MEDIUM: fd: get rid of FD_STLISTEN
    - REORG/MINOR: connection: move declaration to its own include file
    - REORG/MINOR: checks: put a struct connection into the server
    - MINOR: connection: add flags to the connection struct
    - MAJOR: get rid of fdtab[].state and use connection->flags instead
    - MINOR: fd: add a new I/O handler to fdtab
    - MEDIUM: polling: prepare to call the iocb() function when defined.
    - MEDIUM: checks: make use of fdtab->iocb instead of cb[]
    - MEDIUM: protocols: use the generic I/O callback for accept callbacks
    - MINOR: connection: add a handler for fd-based connections
    - MAJOR: connection: replace direct I/O callbacks with the connection callback
    - MINOR: fd: make fdtab->owner a connection and not a stream_interface anymore
    - MEDIUM: connection: remove the FD_POLL_* flags only once
    - MEDIUM: connection: extract the send_proxy callback from proto_tcp
    - MAJOR: tcp: remove the specific I/O callbacks for TCP connection probes
    - CLEANUP: remove the now unused fdtab direct I/O callbacks
    - MAJOR: remove the stream interface and task management code from sock_*
    - MEDIUM: stream_interface: pass connection instead of fd in sock_ops
    - MEDIUM: stream_interface: centralize the SI_FL_ERR management
    - MAJOR: connection: add a new CO_FL_CONNECTED flag
    - MINOR: rearrange tcp_connect_probe() and fix wrong return codes
    - MAJOR: connection: call data layer handshakes from the handler
    - MEDIUM: fd: remove the EV_FD_COND_* primitives
    - MINOR: sock_raw: move calls to si_data_close upper
    - REORG: connection: replace si_data_close() with conn_data_close()
    - MEDIUM: sock_raw: introduce a read0 callback that is different from shutr
    - MAJOR: stream_int: use a common stream_int_shut*() functions regardless of the data layer
    - MAJOR: fd: replace all EV_FD_* macros with new fd_*_* inline calls
    - MEDIUM: fd: add fd_poll_{recv,send} for use when explicit polling is required
    - MEDIUM: connection: add definitions for dual polling mechanisms
    - MEDIUM: connection: make use of the new polling functions
    - MAJOR: make use of conn_{data|sock}_{poll|stop|want}* in connection handlers
    - MEDIUM: checks: don't use FD_WAIT_* anymore
    - MINOR: fd: get rid of FD_WAIT_*
    - MEDIUM: stream_interface: offer a generic function for connection updates
    - MEDIUM: stream-interface: offer a generic chk_rcv function for connections
    - MEDIUM: stream-interface: add a snd_buf() callback to sock_ops
    - MEDIUM: stream-interface: provide a generic stream_int_chk_snd_conn() function
    - MEDIUM: stream-interface: provide a generic si_conn_send_cb callback
    - MEDIUM: stream-interface: provide a generic stream_sock_read0() function
    - REORG/MAJOR: use "struct channel" instead of "struct buffer"
    - REORG/MAJOR: extract "struct buffer" from "struct channel"
    - MINOR: connection: provide conn_{data|sock}_{read0|shutw} functions
    - REORG: sock_raw: rename the files raw_sock*
    - MAJOR: raw_sock: extract raw_sock_to_buf() from raw_sock_read()
    - MAJOR: raw_sock: temporarily disable splicing
    - MINOR: stream-interface: add an rcv_buf callback to sock_ops
    - REORG: stream-interface: move sock_raw_read() to si_conn_recv_cb()
    - MAJOR: connection: split the send call into connection and stream interface
    - MAJOR: stream-interface: restore splicing mechanism
    - MAJOR: stream-interface: make conn_notify_si() more robust
    - MEDIUM: proxy-proto: don't use buffer flags in conn_si_send_proxy()
    - MAJOR: stream-interface: don't commit polling changes in every callback
    - MAJOR: stream-interface: fix splice not to call chk_snd by itself
    - MEDIUM: stream-interface: don't remove WAIT_DATA when a handshake is in progress
    - CLEANUP: connection: split sock_ops into data_ops, app_cp and si_ops
    - REORG: buffers: split buffers into chunk,buffer,channel
    - MAJOR: channel: remove the BF_OUT_EMPTY flag
    - REORG: buffer: move buffer_flush, b_adv and b_rew to buffer.h
    - MINOR: channel: rename bi_full to channel_full as it checks the whole channel
    - MINOR: buffer: provide a new buffer_full() function
    - MAJOR: channel: stop relying on BF_FULL to take action
    - MAJOR: channel: remove the BF_FULL flag
    - REORG: channel: move buffer_{replace,insert_line}* to buffer.{c,h}
    - CLEANUP: channel: usr CF_/CHN_ prefixes instead of BF_/BUF_
    - CLEANUP: channel: use "channel" instead of "buffer" in function names
    - REORG: connection: move the target pointer from si to connection
    - MAJOR: connection: move the addr field from the stream_interface
    - MEDIUM: stream_interface: remove CAP_SPLTCP/CAP_SPLICE flags
    - MEDIUM: proto_tcp: remove any dependence on stream_interface
    - MINOR: tcp: replace tcp_src_to_stktable_key with addr_to_stktable_key
    - MEDIUM: connection: add an ->init function to data layer
    - MAJOR: session: introduce embryonic sessions
    - MAJOR: connection: make the PROXY decoder a handshake handler
    - CLEANUP: frontend: remove the old proxy protocol decoder
    - MAJOR: connection: rearrange the polling flags.
    - MEDIUM: connection: only call tcp_connect_probe when nothing was attempted yet
    - MEDIUM: connection: complete the polling cleanups
    - MEDIUM: connection: avoid calling handshakes when polling is required
    - MAJOR: stream_interface: continue to update data polling flags during handshakes
    - CLEANUP: fd: remove fdtab->flags
    - CLEANUP: fdtab: flatten the struct and merge the spec struct with the rest
    - CLEANUP: includes: fix includes for a number of users of fd.h
    - MINOR: ssl: disable TCP quick-ack by default on SSL listeners
    - MEDIUM: config: add a "ciphers" keyword to set SSL cipher suites
    - MEDIUM: config: add "nosslv3" and "notlsv1" on bind and server lines
    - BUG: ssl: mark the connection as waiting for an SSL connection during the handshake
    - BUILD: http: rename error_message http_error_message to fix conflicts on RHEL
    - BUILD: ssl: fix shctx build on RHEL with futex
    - BUILD: include sys/socket.h to fix build failure on FreeBSD
    - BUILD: fix build error without SSL (ssl_cert)
    - BUILD: ssl: use MAP_ANON instead of MAP_ANONYMOUS
    - BUG/MEDIUM: workaround an eglibc bug which truncates the pidfiles when nbproc > 1
    - MEDIUM: config: support per-listener backlog and maxconn
    - MINOR: session: do not send an HTTP/500 error on SSL sockets
    - MEDIUM: config: implement maxsslconn in the global section
    - BUG: tcp: close socket fd upon connect error
    - MEDIUM: connection: improve error handling around the data layer
    - MINOR: config: make the tasks "nice" value configurable on "bind" lines.
    - BUILD: shut a gcc warning introduced by commit 269ab31
    - MEDIUM: config: centralize handling of SSL config per bind line
    - BUILD: makefile: report USE_OPENSSL status in build options
    - BUILD: report openssl build settings in haproxy -vv
    - MEDIUM: ssl: add sample fetches for is_ssl, ssl_has_sni, ssl_sni_*
    - DOC: add a special acknowledgement for the stud project
    - DOC: add missing SSL options for servers and listeners
    - BUILD: automatically add -lcrypto for SSL
    - DOC: add some info about openssl build in the README

12 years agoDOC: add some info about openssl build in the README
Willy Tarreau [Mon, 10 Sep 2012 07:07:41 +0000 (09:07 +0200)] 
DOC: add some info about openssl build in the README

12 years agoBUILD: automatically add -lcrypto for SSL
Willy Tarreau [Mon, 10 Sep 2012 07:11:22 +0000 (09:11 +0200)] 
BUILD: automatically add -lcrypto for SSL

Some platforms need it. Libz is still not enabled by default because there is
no reason to add this dependency everywhere by default.

12 years agoDOC: add missing SSL options for servers and listeners
Willy Tarreau [Mon, 10 Sep 2012 07:01:23 +0000 (09:01 +0200)] 
DOC: add missing SSL options for servers and listeners

12 years agoDOC: add a special acknowledgement for the stud project
Willy Tarreau [Mon, 10 Sep 2012 07:43:09 +0000 (09:43 +0200)] 
DOC: add a special acknowledgement for the stud project

Really, the quality of their code deserves it, it would have been much
harder to figure how to get all the things right at once without looking
there from time to time !

12 years agoMEDIUM: ssl: add sample fetches for is_ssl, ssl_has_sni, ssl_sni_*
Willy Tarreau [Mon, 10 Sep 2012 06:20:03 +0000 (08:20 +0200)] 
MEDIUM: ssl: add sample fetches for is_ssl, ssl_has_sni, ssl_sni_*

This allows SNI presence and value to be checked on incoming SSL connections.
It is usable both for ACLs and stick tables.

12 years agoBUILD: report openssl build settings in haproxy -vv
Willy Tarreau [Mon, 10 Sep 2012 05:16:05 +0000 (07:16 +0200)] 
BUILD: report openssl build settings in haproxy -vv

Since it's common enough to discover that some config options are not
supported due to some openssl version or build options, we report the
relevant ones in "haproxy -vv".

12 years agoMEDIUM: ssl: add support for SNI and wildcard certificates
Emeric Brun [Fri, 7 Sep 2012 15:30:07 +0000 (17:30 +0200)] 
MEDIUM: ssl: add support for SNI and wildcard certificates

A side effect of this change is that the "ssl" keyword on "bind" lines is now
just a boolean and that "crt" is needed to designate certificate files or
directories.

Note that much refcounting was needed to have the free() work correctly due to
the number of cert aliases which can make a context be shared by multiple names.

12 years agoCONTRIB: halog: sort URLs by avg bytes_read or total bytes_read
Baptiste [Sat, 8 Sep 2012 21:10:03 +0000 (23:10 +0200)] 
CONTRIB: halog: sort URLs by avg bytes_read or total bytes_read

The patch attached to this mail brings ability to sort URLs by
averaged bytes read and total bytes read in HALog tool.
In most cases, bytes read is also the object size.
The purpose of this patch is to know which URL consume the most
bandwith, in average or in total.
It may be interesting as well to know the standard deviation (ecart
type in french) for some counters (like bytes_read).

The results:
- Sorting by average bytes read per URL:
./halog -uba <~/tmp/haproxy.log | column -t | head
2246 lines in, 302 lines out, 194 parsing errors
18    0    5101     283    5101   283    126573  2278327  /lib/exe/js.php
1     0    1        1      1      1      106734  106734   /wp-admin/images/screenshots/theme-customizer.png
2     0    2        1      2      1      106511  213022   /wp-admin/css/wp-admin.css
1     0    1        1      1      1      96698   96698    /wp-admin/images/screenshots/captions-1.png
1     0    1        1      1      1      73165   73165    /wp-admin/images/screenshots/flex-header-1.png
4     0    0        0      0      0      64832   259328   /cuisine/wp-content/plugins/stats/open-flash-chart.swf
1     0    0        0      0      0      48647   48647    /wp-admin/images/screenshots/flex-header-3.png
1     0    0        0      0      0      44046   44046    /wp-admin/images/screenshots/captions-2.png
1     0    1        1      1      1      38830   38830    /wp-admin/images/screenshots/flex-header-2.png

- Sorting by total bytes read per URL:
./halog -ubt <~/tmp/haproxy.log | column -t | head
2246 lines in, 302 lines out, 194 parsing errors
18    0    5101     283    5101   283    126573  2278327  /lib/exe/js.php
60    0    14387    239    14387  239    10081   604865   /lib/exe/css.php
64    2    8820     137    8819   142    7742    495524   /doku.php
14    0    250      17     250    17     24045   336632   /wp-admin/load-scripts.php
71    0    6422     90     6422   90     4048    287419   /wp-admin/
4     0    0        0      0      0      64832   259328   /cuisine/wp-content/plugins/stats/open-flash-chart.swf
2     0    2        1      2      1      106511  213022   /wp-admin/css/wp-admin.css
31    3    5423     174    5040   180    6804    210931   /index
10    0    429      42     429    42     18009   180093   /cuisine/files/2011/10/tarte_figue_amande-e1318281546905-225x300.jpg

12 years agoBUILD: makefile: report USE_OPENSSL status in build options
Willy Tarreau [Sat, 8 Sep 2012 09:28:56 +0000 (11:28 +0200)] 
BUILD: makefile: report USE_OPENSSL status in build options

12 years agoMEDIUM: config: centralize handling of SSL config per bind line
Willy Tarreau [Fri, 7 Sep 2012 14:58:00 +0000 (16:58 +0200)] 
MEDIUM: config: centralize handling of SSL config per bind line

SSL config holds many parameters which are per bind line and not per
listener. Let's use a per-bind line config instead of having it
replicated for each listener.

At the moment we only do this for the SSL part but this should probably
evolved to handle more of the configuration and maybe even the state per
bind line.

12 years agoBUILD: shut a gcc warning introduced by commit 269ab31
Willy Tarreau [Fri, 7 Sep 2012 20:18:59 +0000 (22:18 +0200)] 
BUILD: shut a gcc warning introduced by commit 269ab31

Usual warning on unchecked write() on which no operation is possible.

12 years agoLICENSE: add licence exception for OpenSSL
William Lallemand [Fri, 7 Sep 2012 08:48:59 +0000 (10:48 +0200)] 
LICENSE: add licence exception for OpenSSL

According to OpenSSL FAQ, GPL programs need an exception to use OpenSSL.

    http://openssl.org/support/faq.html#LEGAL2

12 years agoMINOR: config: make the tasks "nice" value configurable on "bind" lines.
Willy Tarreau [Thu, 6 Sep 2012 12:26:36 +0000 (14:26 +0200)] 
MINOR: config: make the tasks "nice" value configurable on "bind" lines.

This is very convenient to reduce SSL processing priority compared to
other traffic. This applies to CPU usage only, but has a direct impact
on latency under congestion.

12 years agoMEDIUM: connection: improve error handling around the data layer
Willy Tarreau [Thu, 6 Sep 2012 12:12:03 +0000 (14:12 +0200)] 
MEDIUM: connection: improve error handling around the data layer

Better avoid calling the data functions upon error or handshake than
having to put conditions everywhere, which are too easy to forget (one
check for CO_FL_ERROR was missing, but this was harmless).

12 years agoBUG: tcp: close socket fd upon connect error
Willy Tarreau [Thu, 6 Sep 2012 12:04:41 +0000 (14:04 +0200)] 
BUG: tcp: close socket fd upon connect error

When the data layer fails to initialize (eg: out of memory for SSL), we
must close the socket fd we just allocated.

12 years agoMEDIUM: config: implement maxsslconn in the global section
Willy Tarreau [Thu, 6 Sep 2012 09:58:37 +0000 (11:58 +0200)] 
MEDIUM: config: implement maxsslconn in the global section

SSL connections take a huge amount of memory, and unfortunately openssl
does not check malloc() returns and easily segfaults when too many
connections are used.

The only solution against this is to provide a global maxsslconn setting
to reject SSL connections above the limit in order to avoid reaching
unsafe limits.

12 years agoMINOR: session: do not send an HTTP/500 error on SSL sockets
Willy Tarreau [Thu, 6 Sep 2012 09:32:07 +0000 (11:32 +0200)] 
MINOR: session: do not send an HTTP/500 error on SSL sockets

If a session fails its initialization, we don't want to send HTTP/500
over the socket if it's not a raw data layer.

12 years agoMEDIUM: config: support per-listener backlog and maxconn
Willy Tarreau [Thu, 6 Sep 2012 09:10:55 +0000 (11:10 +0200)] 
MEDIUM: config: support per-listener backlog and maxconn

With SSL, connections are much more expensive, so it is important to be
able to limit concurrent connections per listener in order to limit the
memory usage.

12 years agoBUG/MEDIUM: workaround an eglibc bug which truncates the pidfiles when nbproc > 1
Willy Tarreau [Wed, 5 Sep 2012 06:02:48 +0000 (08:02 +0200)] 
BUG/MEDIUM: workaround an eglibc bug which truncates the pidfiles when nbproc > 1

Thomas Heil reported that when using nbproc > 1, his pidfiles were
regularly truncated. The issue could be tracked down to the presence
of a call to lseek(pidfile, 0, SEEK_SET) just before the close() call
in the children, resulting in the file being truncated by the children
while the parent was feeding it. This unexpected lseek() is transparently
performed by fclose().

Since there is no way to have the file automatically closed during the
fork, the only solution is to bypass the libc and use open/write/close
instead of fprintf() and fclose().

The issue was observed on eglibc 2.15.

12 years agoBUILD: ssl: use MAP_ANON instead of MAP_ANONYMOUS
Willy Tarreau [Tue, 4 Sep 2012 13:43:25 +0000 (15:43 +0200)] 
BUILD: ssl: use MAP_ANON instead of MAP_ANONYMOUS

FreeBSD uses the former, Linux uses the latter but generally also
defines the former as an alias of the latter. Just checked on other
OSes and AIX defines both. So better use MAP_ANON which seems to be
more commonly defined.

12 years agoMEDIUM: ssl: add support for prefer-server-ciphers option
David BERARD [Tue, 4 Sep 2012 13:15:13 +0000 (15:15 +0200)] 
MEDIUM: ssl: add support for prefer-server-ciphers option

I wrote a small path to add the SSL_OP_CIPHER_SERVER_PREFERENCE OpenSSL option
to frontend, if the 'prefer-server-ciphers' keyword is set.

Example :
bind 10.11.12.13 ssl /etc/haproxy/ssl/cert.pem ciphers RC4:HIGH:!aNULL:!MD5 prefer-server-ciphers

This option mitigate the effect of the BEAST Attack (as I understand), and it
equivalent to :
- Apache HTTPd SSLHonorCipherOrder option.
- Nginx ssl_prefer_server_ciphers option.

[WT: added a test for the support of the option]

12 years agoBUILD: fix build error without SSL (ssl_cert)
Willy Tarreau [Tue, 4 Sep 2012 13:13:20 +0000 (15:13 +0200)] 
BUILD: fix build error without SSL (ssl_cert)

One last-minute optimization broke the build without SSL support.
Move ssl_cert out of the #ifdef/#endif and it's OK.

12 years agoBUILD: include sys/socket.h to fix build failure on FreeBSD
Willy Tarreau [Tue, 4 Sep 2012 12:18:33 +0000 (14:18 +0200)] 
BUILD: include sys/socket.h to fix build failure on FreeBSD

Joris Dedieu reported that include/common/standard.h needs this.

12 years agoBUILD: ssl: fix shctx build on RHEL with futex
Willy Tarreau [Tue, 4 Sep 2012 10:26:26 +0000 (12:26 +0200)] 
BUILD: ssl: fix shctx build on RHEL with futex

On RHEL/CentOS, linux/futex.h uses an u32 type which is never declared
anywhere. Let's set it with a #define in order to fix the issue without
causing conflicts with possible typedefs on other platforms.

12 years agoBUILD: http: rename error_message http_error_message to fix conflicts on RHEL
Willy Tarreau [Tue, 4 Sep 2012 10:19:04 +0000 (12:19 +0200)] 
BUILD: http: rename error_message http_error_message to fix conflicts on RHEL

Duncan Hall reported a build issue on CentOS where error_message conflicts
with another system declaration when SSL is enabled. Rename the function.

12 years agoBUG: ssl: mark the connection as waiting for an SSL connection during the handshake
Willy Tarreau [Tue, 4 Sep 2012 06:03:39 +0000 (08:03 +0200)] 
BUG: ssl: mark the connection as waiting for an SSL connection during the handshake

The WAIT_L6_CONN was designed especially to ensure that the connection
was not marked ready before the SSL layer was OK, but we forgot to set
the flag, resulting in a rejected handshake when ssl was combined with
accept-proxy because accept-proxy would validate the connection alone
and the SSL handshake would then believe in a client-initiated reneg
and kill it.

12 years agoMEDIUM: config: add "nosslv3" and "notlsv1" on bind and server lines
Willy Tarreau [Mon, 3 Sep 2012 21:55:16 +0000 (23:55 +0200)] 
MEDIUM: config: add "nosslv3" and "notlsv1" on bind and server lines

This is aimed at disabling SSLv3 and TLSv1 respectively. SSLv2 is always
disabled. This can be used in some situations where one version looks more
suitable than the other.

12 years agoMEDIUM: config: add a "ciphers" keyword to set SSL cipher suites
Willy Tarreau [Mon, 3 Sep 2012 21:34:19 +0000 (23:34 +0200)] 
MEDIUM: config: add a "ciphers" keyword to set SSL cipher suites

This is supported for both servers and listeners. The cipher suite
simply follows the "ciphers" keyword.

12 years agoMINOR: ssl add global setting tune.sslcachesize to set SSL session cache size.
Emeric Brun [Mon, 3 Sep 2012 10:10:29 +0000 (12:10 +0200)] 
MINOR: ssl add global setting tune.sslcachesize to set SSL session cache size.

This new global setting allows the user to change the SSL cache size in
number of sessions. It defaults to 20000.

12 years agoMEDIUM: ssl: replace OpenSSL's session cache with the shared cache
Emeric Brun [Mon, 3 Sep 2012 09:53:36 +0000 (11:53 +0200)] 
MEDIUM: ssl: replace OpenSSL's session cache with the shared cache

OpenSSL's session cache is now totally disabled and we use our own
implementation instead.

12 years agoMEDIUM: ssl: add shared memory session cache implementation.
Emeric Brun [Mon, 3 Sep 2012 09:14:36 +0000 (11:14 +0200)] 
MEDIUM: ssl: add shared memory session cache implementation.

This SSL session cache was developped at Exceliance and is the same that
was proposed for stunnel and stud. It makes use of a shared memory area
between the processes so that sessions can be handled by any process. It
is only useful when haproxy runs with nbproc > 1, but it does not hurt
performance at all with nbproc = 1. The aim is to totally replace OpenSSL's
internal cache.

The cache is optimized for Linux >= 2.6 and specifically for x86 platforms.
On Linux/x86, it makes use of futexes for inter-process locking, with some
x86 assembly for the locked instructions. On other architectures, GCC
builtins are used instead, which are available starting from gcc 4.1.

On other operating systems, the locks fall back to pthread mutexes so
libpthread is automatically linked. It is not recommended since pthreads
are much slower than futexes. The lib is only linked if SSL is enabled.

12 years agoMINOR: ssl: disable TCP quick-ack by default on SSL listeners
Willy Tarreau [Mon, 3 Sep 2012 20:33:40 +0000 (22:33 +0200)] 
MINOR: ssl: disable TCP quick-ack by default on SSL listeners

Since the SSL handshake involves an immediate reply from the server
to the client, there's no point responding with a quick-ack before
sending the data, so disable quick-ack by default, just as it is done
for HTTP.

This shows a 2-2.5% transaction rate increase on a dual-core atom.

12 years agoBUILD: add optional support for SSL via the USE_OPENSSL flag
Emeric Brun [Fri, 18 May 2012 13:48:30 +0000 (15:48 +0200)] 
BUILD: add optional support for SSL via the USE_OPENSSL flag

When this flag is set, the SSL data layer is enabled.
At the moment, only the GNU makefile was touched, the other ones
make the option handling a bit tricky.

12 years agoMEDIUM: ssl: protect against client-initiated renegociation
Emeric Brun [Mon, 3 Sep 2012 18:36:47 +0000 (20:36 +0200)] 
MEDIUM: ssl: protect against client-initiated renegociation

CVE-2009-3555 suggests that client-initiated renegociation should be
prevented in the middle of data. The workaround here consists in having
the SSL layer notify our callback about a handshake occurring, which in
turn causes the connection to be marked in the error state if it was
already considered established (which means if a previous handshake was
completed). The result is that the connection with the client is immediately
aborted and any pending data are dropped.

12 years agoMEDIUM: config: add support for the 'ssl' option on 'server' lines
Emeric Brun [Fri, 18 May 2012 14:02:00 +0000 (16:02 +0200)] 
MEDIUM: config: add support for the 'ssl' option on 'server' lines

This option currently takes no option and simply turns SSL on for all
connections going to the server. It is likely that more options will
be needed in the future.

12 years agoMEDIUM: config: add the 'ssl' keyword on 'bind' lines
Emeric Brun [Fri, 18 May 2012 14:32:13 +0000 (16:32 +0200)] 
MEDIUM: config: add the 'ssl' keyword on 'bind' lines

"bind" now supports "ssl" followed by a PEM cert+key file name.

12 years agoMEDIUM: ssl: add new files ssl_sock.[ch] to provide the SSL data layer
Emeric Brun [Fri, 18 May 2012 13:47:34 +0000 (15:47 +0200)] 
MEDIUM: ssl: add new files ssl_sock.[ch] to provide the SSL data layer

This data layer supports socket-to-buffer and buffer-to-socket operations.
No sock-to-pipe nor pipe-to-sock functions are provided, since splicing does
not provide any benefit with data transformation. At best it could save a
memcpy() and avoid keeping a buffer allocated but that does not seem very
useful.

An init function and a close function are provided because the SSL context
needs to be allocated/freed.

A data-layer shutw() function is also provided because upon successful
shutdown, we want to store the SSL context in the cache in order to reuse
it for future connections and avoid a new key generation.

The handshake function is directly called from the connection handler.
At this point it is not certain whether this will remain this way or
if a new ->handshake callback will be added to the data layer so that
the connection handler doesn't care about SSL.

The sock-to-buf and buf-to-sock functions are all capable of enabling
the SSL handshake at any time. This also implies polling in the opposite
direction to what was expected. The upper layers must take that into
account (it is OK right now with the stream interface).

12 years agoMEDIUM: connection: add a new handshake flag for SSL (CO_FL_SSL_WAIT_HS).
Emeric Brun [Fri, 18 May 2012 13:47:34 +0000 (15:47 +0200)] 
MEDIUM: connection: add a new handshake flag for SSL (CO_FL_SSL_WAIT_HS).

This flag is part of the CO_FL_HANDSHAKE family since the SSL handshake
may appear at any time.

12 years agoMINOR: server: add SSL context to servers if USE_OPENSSL is defined
Emeric Brun [Fri, 18 May 2012 13:46:21 +0000 (15:46 +0200)] 
MINOR: server: add SSL context to servers if USE_OPENSSL is defined

This will be needed to accept outgoing SSL connections.

12 years agoMINOR: protocol: add SSL context to listeners if USE_OPENSSL is defined
Emeric Brun [Fri, 18 May 2012 13:46:21 +0000 (15:46 +0200)] 
MINOR: protocol: add SSL context to listeners if USE_OPENSSL is defined

This will be needed to accept incoming SSL connections.

12 years agoCLEANUP: includes: fix includes for a number of users of fd.h
Willy Tarreau [Sun, 2 Sep 2012 20:34:23 +0000 (22:34 +0200)] 
CLEANUP: includes: fix includes for a number of users of fd.h

It appears that fd.h includes a number of unneeded files and was
included from standard.h, and as such served as an intermediary
to provide almost everything to everyone.

By removing its useless includes, a long dependency chain broke
but could easily be fixed.

12 years agoCLEANUP: fdtab: flatten the struct and merge the spec struct with the rest
Willy Tarreau [Sun, 2 Sep 2012 20:19:18 +0000 (22:19 +0200)] 
CLEANUP: fdtab: flatten the struct and merge the spec struct with the rest

The "spec" sub-struct was using 8 bytes for only 5 needed. There is no
reason to keep it as a struct, it doesn't bring any value. By flattening
it, we can merge the single byte with the next single byte, resulting in
an immediate saving of 4 bytes (20%). Interestingly, tests have shown a
steady performance gain of 0.6% after this change, which can possibly be
attributed to a more cache-line friendly struct.

12 years agoCLEANUP: fd: remove fdtab->flags
Willy Tarreau [Sun, 2 Sep 2012 20:14:47 +0000 (22:14 +0200)] 
CLEANUP: fd: remove fdtab->flags

These flags were added for TCP_CORK. They were only set at various places
but never checked by any user since TCP_CORK was replaced with MSG_MORE.
Simply get rid of this now.

12 years agoMAJOR: stream_interface: continue to update data polling flags during handshakes
Willy Tarreau [Mon, 3 Sep 2012 14:51:27 +0000 (16:51 +0200)] 
MAJOR: stream_interface: continue to update data polling flags during handshakes

Since data and socket polling flags were split, it became possible to update
data flags even during handshakes. In fact this is very important otherwise
it is not possible to poll for writes if some data are to be forwarded during
a handshake (eg: data received during an SSL connect).

12 years agoMEDIUM: connection: avoid calling handshakes when polling is required
Willy Tarreau [Sun, 2 Sep 2012 16:48:46 +0000 (18:48 +0200)] 
MEDIUM: connection: avoid calling handshakes when polling is required

If a data handler suddenly switches to a handshake mode and detects the
need for polling in either direction, we don't want to loop again through
the handshake handlers because we know we won't be able to do anything.

Similarly, we don't want to call again the data handlers after a loop
through the handshake handlers if polling is required.

No performance change was observed, it might only be observed during
high rate SSL renegociation.

12 years agoMEDIUM: connection: complete the polling cleanups
Willy Tarreau [Sun, 2 Sep 2012 16:34:44 +0000 (18:34 +0200)] 
MEDIUM: connection: complete the polling cleanups

I/O handlers now all use __conn_{sock,data}_{stop,poll,want}_* instead
of returning dummy flags. The code has become slightly simpler because
some tricks such as the MIN_RET_FOR_READ_LOOP are not needed anymore,
and the data handlers which switch to a handshake handler do not need
to disable themselves anymore.

12 years agoMEDIUM: connection: only call tcp_connect_probe when nothing was attempted yet
Willy Tarreau [Sat, 1 Sep 2012 15:59:22 +0000 (17:59 +0200)] 
MEDIUM: connection: only call tcp_connect_probe when nothing was attempted yet

It was observed that after a failed send() on EAGAIN, a second connect()
would still be attempted in tcp_connect_probe() because there was no way
to know that a send() had failed.

By checking the WANT_WR status flag, we know if a previous write attempt
failed on EAGAIN, so we don't try to connect again if we know this has
already failed.

With this simple change, the second connect() has disappeared.

12 years agoMAJOR: connection: rearrange the polling flags.
Willy Tarreau [Sat, 1 Sep 2012 15:26:16 +0000 (17:26 +0200)] 
MAJOR: connection: rearrange the polling flags.

Polling flags were set for data and sock layer, but while this does make
sense for the ENA flag, it does not for the POL flag which translates the
detection of an EAGAIN condition. So now we remove the {DATA,SOCK}_POL*
flags and instead introduce two new layer-independant flags (WANT_RD and
WANT_WR). These flags are only set when an EAGAIN is encountered so that
polling can be enabled.

In order for these flags to have any meaning they are not persistent and
have to be cleared by the connection handler before calling the I/O and
data callbacks. For this reason, changes detection has been slightly
improved. Instead of comparing the WANT_* flags with CURR_*_POL, we only
check if the ENA status changes, or if the polling appears, since we don't
want to detect the useless poll to ena transition. Tests show that this
has eliminated one useless call to __fd_clr().

Finally the conn_set_polling() function which was becoming complex and
required complex operations from the caller was split in two and replaced
its two only callers (conn_update_data_polling and conn_update_sock_polling).
The two functions are now much smaller due to the less complex conditions.
Note that it would be possible to re-merge them and only pass a mask but
this does not appear much interesting.

12 years agoCLEANUP: frontend: remove the old proxy protocol decoder
Willy Tarreau [Fri, 31 Aug 2012 15:52:35 +0000 (17:52 +0200)] 
CLEANUP: frontend: remove the old proxy protocol decoder

This one used to rely on a stream analyser which was inappropriate.
It's not used anymore.

12 years agoMAJOR: connection: make the PROXY decoder a handshake handler
Willy Tarreau [Fri, 31 Aug 2012 15:43:29 +0000 (17:43 +0200)] 
MAJOR: connection: make the PROXY decoder a handshake handler

The PROXY protocol is now decoded in the connection before other
handshakes. This means that it may be extracted from a TCP stream
before SSL is decoded from this stream.

12 years agoMAJOR: session: introduce embryonic sessions
Willy Tarreau [Fri, 31 Aug 2012 14:01:23 +0000 (16:01 +0200)] 
MAJOR: session: introduce embryonic sessions

When an incoming connection request is accepted, a connection
structure is needed to store its state. However we don't want to
fully initialize a session until the data layer is about to be
ready.

As long as the connection is physically stored into the session,
it's not easy to split both allocations.

As such, we only initialize the minimum requirements of a session,
which results in what we call an embryonic session. Then once the
data layer is ready, we can complete the function's initialization.

Doing so avoids buffers allocation and ensures that a session only
sees ready connections.

The frontend's client timeout is used as the handshake timeout. It
is likely that another timeout will be used in the future.

12 years agoMEDIUM: connection: add an ->init function to data layer
Willy Tarreau [Fri, 31 Aug 2012 11:54:11 +0000 (13:54 +0200)] 
MEDIUM: connection: add an ->init function to data layer

SSL need to initialize the data layer before proceeding with data. At
the moment, this data layer is automatically initialized from itself,
which will not be possible once we extract connection from sessions
since we'll only create the data layer once the handshake is finished.

So let's have the application layer initialize the data layer before
using it.

12 years agoMINOR: tcp: replace tcp_src_to_stktable_key with addr_to_stktable_key
Willy Tarreau [Thu, 30 Aug 2012 20:59:48 +0000 (22:59 +0200)] 
MINOR: tcp: replace tcp_src_to_stktable_key with addr_to_stktable_key

Make it more obvious that this function does not depend on any knowledge
of the session. This is important to plan for TCP rules that can run on
connection without any initialized session yet.

12 years agoMEDIUM: proto_tcp: remove any dependence on stream_interface
Willy Tarreau [Thu, 30 Aug 2012 20:23:13 +0000 (22:23 +0200)] 
MEDIUM: proto_tcp: remove any dependence on stream_interface

The last uses of the stream interfaces were in tcp_connect_server() and
could easily and more appropriately be moved to its callers, si_connect()
and connect_server(), making a lot more sense.

Now the function should theorically be usable for health checks.

It also appears more obvious that the file is split into two distinct
parts :
  - the protocol layer used at the connection level
  - the tcp analysers executing tcp-* rules and their samples/acls.

12 years agoMEDIUM: stream_interface: remove CAP_SPLTCP/CAP_SPLICE flags
Willy Tarreau [Thu, 30 Aug 2012 19:23:53 +0000 (21:23 +0200)] 
MEDIUM: stream_interface: remove CAP_SPLTCP/CAP_SPLICE flags

These ones are implicitly handled by the connection's data layer, no need
to rely on them anymore and reaching them maintains undesired dependences
on stream-interface.

12 years agoMAJOR: connection: move the addr field from the stream_interface
Willy Tarreau [Thu, 30 Aug 2012 19:11:38 +0000 (21:11 +0200)] 
MAJOR: connection: move the addr field from the stream_interface

We need to have the source and destination addresses in the connection.
They were lying in the stream interface so let's move them. The flags
SI_FL_FROM_SET and SI_FL_TO_SET have been moved as well.

It's worth noting that tcp_connect_server() almost does not use the
stream interface anymore except for a few flags.

It has been identified that once we detach the connection from the SI,
it will probably be needed to keep a copy of the server-side addresses
in the SI just for logging purposes. This has not been implemented right
now though.

12 years agoREORG: connection: move the target pointer from si to connection
Willy Tarreau [Thu, 30 Aug 2012 13:49:18 +0000 (15:49 +0200)] 
REORG: connection: move the target pointer from si to connection

The target is per connection and is directly used by the connection, so
we need it there. It's not needed anymore in the SI however.

12 years agoCLEANUP: channel: use "channel" instead of "buffer" in function names
Willy Tarreau [Mon, 27 Aug 2012 22:06:31 +0000 (00:06 +0200)] 
CLEANUP: channel: use "channel" instead of "buffer" in function names

This is a massive rename of most functions which should make use of the
word "channel" instead of the word "buffer" in their names.

In concerns the following ones (new names) :

unsigned long long channel_forward(struct channel *buf, unsigned long long bytes);
static inline void channel_init(struct channel *buf)
static inline int channel_input_closed(struct channel *buf)
static inline int channel_output_closed(struct channel *buf)
static inline void channel_check_timeouts(struct channel *b)
static inline void channel_erase(struct channel *buf)
static inline void channel_shutr_now(struct channel *buf)
static inline void channel_shutw_now(struct channel *buf)
static inline void channel_abort(struct channel *buf)
static inline void channel_stop_hijacker(struct channel *buf)
static inline void channel_auto_connect(struct channel *buf)
static inline void channel_dont_connect(struct channel *buf)
static inline void channel_auto_close(struct channel *buf)
static inline void channel_dont_close(struct channel *buf)
static inline void channel_auto_read(struct channel *buf)
static inline void channel_dont_read(struct channel *buf)
unsigned long long channel_forward(struct channel *buf, unsigned long long bytes)

Some functions provided by channel.[ch] have kept their "buffer" name because
they are really designed to act on the buffer according to some information
gathered from the channel. They have been moved together to the same place in
the file for better readability but they were not changed at all.

The "buffer" memory pool was also renamed "channel".

12 years agoCLEANUP: channel: usr CF_/CHN_ prefixes instead of BF_/BUF_
Willy Tarreau [Mon, 27 Aug 2012 21:14:58 +0000 (23:14 +0200)] 
CLEANUP: channel: usr CF_/CHN_ prefixes instead of BF_/BUF_

Get rid of these confusing BF_* flags. Now channel naming should clearly
be used everywhere appropriate.

No code was changed, only a renaming was performed. The comments about
channel operations was updated.

12 years agoREORG: channel: move buffer_{replace,insert_line}* to buffer.{c,h}
Willy Tarreau [Mon, 27 Aug 2012 20:08:00 +0000 (22:08 +0200)] 
REORG: channel: move buffer_{replace,insert_line}* to buffer.{c,h}

These functions do not depend on the channel flags anymore thus they're
much better suited to be used on plain buffers. Move them from channel
to buffer.

12 years agoMAJOR: channel: remove the BF_FULL flag
Willy Tarreau [Mon, 27 Aug 2012 18:53:34 +0000 (20:53 +0200)] 
MAJOR: channel: remove the BF_FULL flag

This is similar to the recent removal of BF_OUT_EMPTY. This flag was very
problematic because it relies on permanently changing information such as the
to_forward value, so it had to be updated upon every change to the buffers.
Previous patch already got rid of its users.

One part of the change is sensible : the flag was also part of BF_MASK_STATIC,
which is used by process_session() to rescan all analysers in case the flag's
status changes. At first glance, none of the analysers seems to change its
mind base on this flag when it is subject to change, so it seems fine not to
add variation checks here. Otherwise it's possible that checking the buffer's
input and output is more reliable than checking the flag's replacement.