]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
12 years agoMEDIUM: log: report SSL ciphers and version in logs using logformat %sslc/%sslv
Willy Tarreau [Fri, 12 Oct 2012 18:17:54 +0000 (20:17 +0200)] 
MEDIUM: log: report SSL ciphers and version in logs using logformat %sslc/%sslv

These two new log-format tags report the SSL protocol version (%sslv) and the
SSL ciphers (%sslc) used for the connection with the client. For instance, to
append these information just after the client's IP/port address information
on an HTTP log line, use the following configuration :

    log-format %Ci:%Cp\ %sslv:%sslc\ [%t]\ %ft\ %b/%s\ %Tq/%Tw/%Tc/%Tr/%Tt\ %st\ %B\ %cc\ \ %cs\ %tsc\ %ac/%fc/%bc/%sc/%rc\ %sq/%bq\ %hr\ %hs\ %{+Q}r

It will report a line such as the following one :

    Oct 12 20:47:30 haproxy[9643]: 127.0.0.1:43602 TLSv1:AES-SHA [12/Oct/2012:20:47:30.303] stick2~ stick2/s1 7/0/12/0/19 200 145 - - ---- 0/0/0/0/0 0/0 "GET /?t=0 HTTP/1.0"

12 years agoMINOR: log: make lf_text use a const char *
Willy Tarreau [Fri, 12 Oct 2012 17:48:16 +0000 (19:48 +0200)] 
MINOR: log: make lf_text use a const char *

lf_text() should use a const char * otherwise it makes it more complex
to use data coming from const strings.

12 years agoMEDIUM: log: add a new LW_XPRT flag to pin the transport layer
Willy Tarreau [Fri, 12 Oct 2012 16:01:49 +0000 (18:01 +0200)] 
MEDIUM: log: add a new LW_XPRT flag to pin the transport layer

This flag will have to be set on log tags which require transport layer
information. They will prevent the conn_xprt_close() call from releasing
the transport layer too early.

12 years agoMEDIUM: connection: add a flag to hold the transport layer
Willy Tarreau [Fri, 12 Oct 2012 15:50:05 +0000 (17:50 +0200)] 
MEDIUM: connection: add a flag to hold the transport layer

When we start logging SSL information, we need the SSL struct to be
present even past the conn_xprt_close() call. In order to achieve this,
we should use refcounting on the connection and the transport layer. At
the moment it's not worth using plain refcounting as only the logs require
this, so instead of real refcounting we just use a flag which will be set
by the log subsystem when SSL data need to be logged.

What happens then is that the xprt->close() call is ignored and the
transport layer is closed again during session_free(), after the log
line is emitted.

12 years agoBUG/MEDIUM: session: enable the conn_session_update() callback
Willy Tarreau [Fri, 12 Oct 2012 15:42:13 +0000 (17:42 +0200)] 
BUG/MEDIUM: session: enable the conn_session_update() callback

This callback was introduced by commit 9683e9a0 but never enabled because
the CO_FL_WAKE_DATA flag was not set. The result is that this function is
never called when an SSL handshake fails, so the connection is only closed
on timeout.

12 years agoBUG/MINOR: session: fix some leftover from debug code
Willy Tarreau [Fri, 12 Oct 2012 15:36:40 +0000 (17:36 +0200)] 
BUG/MINOR: session: fix some leftover from debug code

Commit 82569f91 moved the health and monitor-net checks to session.c
but a debug test introduced 0& to disable MSG_DONTWAIT in the recv()
call and this debug code remained there. Since the socket is marked
non-blocking, there should be no effect but it's dangerous to keep
such a thing here.

12 years agoMEDIUM: connection: always unset the transport layer upon close
Willy Tarreau [Fri, 12 Oct 2012 15:00:05 +0000 (17:00 +0200)] 
MEDIUM: connection: always unset the transport layer upon close

When calling conn_xprt_close(), we always clear the transport pointer
so that all transport layers leave the connection in the same state after
a close. This will also make it safer and cheaper to call conn_xprt_close()
multiple times if needed.

12 years agoMEDIUM: log: suffix the frontend's name with '~' when using SSL
Willy Tarreau [Fri, 12 Oct 2012 12:56:11 +0000 (14:56 +0200)] 
MEDIUM: log: suffix the frontend's name with '~' when using SSL

Until now it was not possible to know from the logs whether the incoming
connection was made over SSL or not. In order to address this in the existing
log formats, a new log format %ft was introduced, to log the frontend's name
suffixed with its transport layer. The only transport layer in use right now
is '~' for SSL, so that existing log formats for non-SSL traffic are not
affected at all, and SSL log formats have the frontend's name suffixed with
'~'.

The TCP, HTTP and CLF log format now use %ft instead of %f. This does not
affect existing log formats which still make use of %f however.

12 years agoDOC: Fix rename of options cafile and crlfile to ca-file and crl-file.
Emeric Brun [Thu, 11 Oct 2012 14:28:27 +0000 (16:28 +0200)] 
DOC: Fix rename of options cafile and crlfile to ca-file and crl-file.

12 years agoMINOR: ssl: add statements 'verify', 'ca-file' and 'crl-file' on servers.
Emeric Brun [Thu, 11 Oct 2012 14:11:36 +0000 (16:11 +0200)] 
MINOR: ssl: add statements 'verify', 'ca-file' and 'crl-file' on servers.

It now becomes possible to verify the server's certificate using the "verify"
directive. This one only supports "none" and "required", as it does not make
much sense to also support "optional" here.

12 years agoMINOR: ssl: add statement 'no-tls-tickets' on server side.
Emeric Brun [Thu, 11 Oct 2012 13:28:34 +0000 (15:28 +0200)] 
MINOR: ssl: add statement 'no-tls-tickets' on server side.

12 years agoMEDIUM: ssl: reject ssl server keywords in default-server statement
Emeric Brun [Thu, 11 Oct 2012 13:05:10 +0000 (15:05 +0200)] 
MEDIUM: ssl: reject ssl server keywords in default-server statement

At the moment they are ignored, but they were not rejected so they could
cause confusion in some configurations.

12 years agoMINOR: ssl: move ssl context init for servers from cfgparse.c to ssl_sock.c
Emeric Brun [Thu, 11 Oct 2012 12:00:19 +0000 (14:00 +0200)] 
MINOR: ssl: move ssl context init for servers from cfgparse.c to ssl_sock.c

12 years agoBUG/MINOR: ssl: Fix issue on server statements 'no-tls*' and 'no-sslv3'
Emeric Brun [Thu, 11 Oct 2012 16:36:21 +0000 (18:36 +0200)] 
BUG/MINOR: ssl: Fix issue on server statements 'no-tls*' and 'no-sslv3'

bit field collision with 'force-tlsv*'.

12 years agoMEDIUM: ssl: move "server" keyword SSL options parsing to ssl_sock.c
Willy Tarreau [Wed, 10 Oct 2012 21:04:25 +0000 (23:04 +0200)] 
MEDIUM: ssl: move "server" keyword SSL options parsing to ssl_sock.c

All SSL-specific "server" keywords are now processed in ssl_sock.c. At
the moment, there is no more "not implemented" hint when SSL is disabled,
but keywords could be added in server.c if needed.

12 years agoBUG/MEDIUM: config: check-send-proxy was ignored if SSL was not builtin
Willy Tarreau [Wed, 10 Oct 2012 21:01:14 +0000 (23:01 +0200)] 
BUG/MEDIUM: config: check-send-proxy was ignored if SSL was not builtin

Improper insertion within #if/#endif SSL causes the check-send-proxy state
not to be automatically enabled if SSL is disabled at build time.

12 years agoMEDIUM: server: move parsing of keyword "id" to server.c
Willy Tarreau [Wed, 10 Oct 2012 15:51:05 +0000 (17:51 +0200)] 
MEDIUM: server: move parsing of keyword "id" to server.c

This is the first keyword to be moved to server.c.

12 years agoMEDIUM: server: check for registered keywords when parsing unknown keywords
Willy Tarreau [Wed, 10 Oct 2012 06:57:40 +0000 (08:57 +0200)] 
MEDIUM: server: check for registered keywords when parsing unknown keywords

At this point, no server keyword is registered yet. The help line does
not report supported keywords anymore since it lists the registered ones
only.

12 years agoMINOR: standard: make indent_msg() support empty messages
Willy Tarreau [Wed, 10 Oct 2012 06:56:47 +0000 (08:56 +0200)] 
MINOR: standard: make indent_msg() support empty messages

indent_msg() is called with dynamically generated messages, so these
may be empty (NULL) when an empty list is being dumped. Support this
and return a NULL too.

12 years agoMINOR: server: add minimal infrastructure to parse keywords
Willy Tarreau [Wed, 10 Oct 2012 06:27:36 +0000 (08:27 +0200)] 
MINOR: server: add minimal infrastructure to parse keywords

Just like with the "bind" lines, we'll switch the "server" line
parsing to keyword registration. The code is essentially the same
as for bind keywords, with minor changes such as support for the
default-server keywords and support for variable argument count.

12 years agoBUILD: accept4: move the socketcall declaration outside of accept4()
Willy Tarreau [Wed, 10 Oct 2012 06:26:12 +0000 (08:26 +0200)] 
BUILD: accept4: move the socketcall declaration outside of accept4()

Gcc 4.2.4 breaks on the syscall declared inside the function, move it
outside and declare it static inline.

12 years agoMINOR: halog: add a parameter to limit output line count
Willy Tarreau [Wed, 10 Oct 2012 14:49:28 +0000 (16:49 +0200)] 
MINOR: halog: add a parameter to limit output line count

Sometimes it's useful to limit the output to a number of lines, for
example when output is already sorted (eg: 10 slowest URLs, ...). Now
we can use -m for this.

12 years agoBUG/MINOR: halog: fix help message for -ut/-uto
Willy Tarreau [Wed, 10 Oct 2012 12:57:35 +0000 (14:57 +0200)] 
BUG/MINOR: halog: fix help message for -ut/-uto

Erroneous copy-paste suggesting wrong option.

12 years agoBUG/MINOR: halog: -ad/-ac report the correct number of output lines
Willy Tarreau [Wed, 10 Oct 2012 11:41:52 +0000 (13:41 +0200)] 
BUG/MINOR: halog: -ad/-ac report the correct number of output lines

There was a lines_out++ left from earlier code, causing each input
line to be counted as an output line.

This fix also affects 1.4 and should be backported.

12 years agoMINOR: halog: sort output by cookie code
Willy Tarreau [Wed, 10 Oct 2012 08:26:22 +0000 (10:26 +0200)] 
MINOR: halog: sort output by cookie code

It's sometimes useful to have the output sorted by cookie code to see
the ratios of NI vs VN for example. This is now possible with -cc.

12 years agoDOC: ssl: surround keywords with quotes
Cyril Bonté [Tue, 9 Oct 2012 20:45:34 +0000 (22:45 +0200)] 
DOC: ssl: surround keywords with quotes

In order to make external tools easily detect keywords in the documentation,
let's surround them by quotes as it is done for other keywords.

12 years agoDOC: ssl: remove prefer-server-ciphers documentation
Cyril Bonté [Tue, 9 Oct 2012 20:45:33 +0000 (22:45 +0200)] 
DOC: ssl: remove prefer-server-ciphers documentation

Commit 3c4bc6e1 removed the prefer-server-ciphers statement.
Therefore, the statement should also be removed from the documentation.

12 years agoMEDIUM: listener: add support for linux's accept4() syscall
Willy Tarreau [Mon, 8 Oct 2012 18:11:03 +0000 (20:11 +0200)] 
MEDIUM: listener: add support for linux's accept4() syscall

On Linux, accept4() does the same as accept() except that it allows
the caller to specify some flags to set on the resulting socket. We
use this to set the O_NONBLOCK flag and thus to save one fcntl()
call in each connection. The effect is a small performance gain of
around 1%.

The option is automatically enabled when target linux2628 is set, or
when the USE_ACCEPT4 Makefile variable is set. If the libc is too old
to provide the equivalent function, this is automatically detected and
our own function is used instead. In any case it is possible to force
the use of our implementation with USE_MY_ACCEPT4.

12 years agoBUG/MAJOR: ensure that hdr_idx is always reserved when L7 fetches are used
Willy Tarreau [Fri, 5 Oct 2012 20:41:26 +0000 (22:41 +0200)] 
BUG/MAJOR: ensure that hdr_idx is always reserved when L7 fetches are used

Baptiste Assmann reported a bug causing a crash on recent versions when
sticking rules were set on layer 7 in a TCP proxy. The bug is easier to
reproduce with the "defer-accept" option on the "bind" line in order to
have some contents to parse when the connection is accepted. The issue
is that the acl_prefetch_http() function called from HTTP fetches relies
on hdr_idx to be preinitialized, which is not the case if there is no L7
ACL.

The solution consists in adding a new SMP_CAP_L7 flag to fetches to indicate
that they are expected to work on L7 data, so that the proxy knows that the
hdr_idx has to be initialized. This is already how ACL and HTTP mode are
handled.

The bug was present since 1.5-dev9.

12 years agoCLEANUP: cttproxy: remove a warning on undeclared close()
Willy Tarreau [Fri, 5 Oct 2012 20:18:07 +0000 (22:18 +0200)] 
CLEANUP: cttproxy: remove a warning on undeclared close()

This one is harmless and only happens on old systems anyway.

12 years agoMINOR: ssl: add defines LISTEN_DEFAULT_CIPHERS and CONNECT_DEFAULT_CIPHERS.
Emeric Brun [Fri, 5 Oct 2012 13:47:31 +0000 (15:47 +0200)] 
MINOR: ssl: add defines LISTEN_DEFAULT_CIPHERS and CONNECT_DEFAULT_CIPHERS.

These ones are used to set the default ciphers suite on "bind" lines and
"server" lines respectively, instead of using OpenSSL's defaults. These
are probably mainly useful for distro packagers.

12 years agoMINOR: ssl: add 'force-sslv3' and 'force-tlsvXX' statements on server
Emeric Brun [Fri, 5 Oct 2012 12:39:07 +0000 (14:39 +0200)] 
MINOR: ssl: add 'force-sslv3' and 'force-tlsvXX' statements on server

These options force the SSL lib to use the specified protocol when
connecting to a server. They are complentary to no-tlsv*/no-sslv3.

12 years agoMINOR: ssl: add 'force-sslv3' and 'force-tlsvXX' statements on bind.
Emeric Brun [Fri, 5 Oct 2012 12:14:21 +0000 (14:14 +0200)] 
MINOR: ssl: add 'force-sslv3' and 'force-tlsvXX' statements on bind.

These options force the SSL lib to use the specified protocol. They
are complentary to no-tlsv*/no-sslv3.

12 years agoMINOR: ssl: use bit fields to store ssl options instead of one int each
Emeric Brun [Fri, 5 Oct 2012 11:48:26 +0000 (13:48 +0200)] 
MINOR: ssl: use bit fields to  store ssl options instead of one int each

Too many SSL options already and some still to come, use a bit field
and get rid of all the integers. No functional change here.

12 years agoMEDIUM: conf: rename 'cafile' and 'crlfile' statements 'ca-file' and 'crl-file'
Emeric Brun [Fri, 5 Oct 2012 10:00:26 +0000 (12:00 +0200)] 
MEDIUM: conf: rename 'cafile' and 'crlfile' statements 'ca-file' and 'crl-file'

These names were not really handy.

12 years agoMEDIUM: conf: rename 'nosslv3' and 'notlsvXX' statements 'no-sslv3' and 'no-tlsvXX'.
Emeric Brun [Fri, 5 Oct 2012 09:55:06 +0000 (11:55 +0200)] 
MEDIUM: conf: rename 'nosslv3' and 'notlsvXX' statements 'no-sslv3' and 'no-tlsvXX'.

These ones were really not easy to read nor write, and become confusing
with the next ones to be added.

12 years agoMINOR: ssl: add 'crt-base' and 'ca-base' global statements.
Emeric Brun [Tue, 2 Oct 2012 16:42:10 +0000 (18:42 +0200)] 
MINOR: ssl: add 'crt-base' and 'ca-base' global statements.

'crt-base' sets root directory used for relative certificates paths.
'ca-base' sets root directory used for relative CAs and CRLs paths.

12 years agoBUG/MEDIUM: ssl: subsequent handshakes fail after server configuration changes
Emeric Brun [Thu, 4 Oct 2012 15:09:56 +0000 (17:09 +0200)] 
BUG/MEDIUM: ssl: subsequent handshakes fail after server configuration changes

On server's configuration change, if the previously used
cipher is disabled, all subsequent connect attempts fail.

Fix consists in freeing cached session on handshake failure.

12 years agoBUG: connection: fix regression from commit 9e272bf9
Willy Tarreau [Fri, 5 Oct 2012 19:29:37 +0000 (21:29 +0200)] 
BUG: connection: fix regression from commit 9e272bf9

Commit 9e272bf9 broke connection setup in TCP mode, the comment was
misleading and obviously wrong, as after a connection is established,
we *do* have none of the CONNECT* flags. However we can never have
them all at the same time, so let's use this to trigger a detection.

12 years agoMINOR: ssl: remove prefer-server-ciphers statement and set it as the default on ssl...
Emeric Brun [Thu, 4 Oct 2012 16:44:19 +0000 (18:44 +0200)] 
MINOR: ssl: remove prefer-server-ciphers statement and set it as the default on ssl listeners.

12 years agoBUG/MINOR: build: Fix failure with USE_OPENSSL=1 and USE_FUTEX=1 on archs i486 and...
Emeric Brun [Thu, 4 Oct 2012 15:28:25 +0000 (17:28 +0200)] 
BUG/MINOR: build: Fix failure with USE_OPENSSL=1 and USE_FUTEX=1 on archs i486 and i686.

12 years agoBUG/MINOR: conf: Fix 'maxsslconn' statement error if built without OPENSSL.
Emeric Brun [Tue, 2 Oct 2012 16:45:42 +0000 (18:45 +0200)] 
BUG/MINOR: conf: Fix 'maxsslconn' statement error if built without OPENSSL.

12 years agoMEDIUM: tcp: enable TCP Fast Open on systems which support it
Willy Tarreau [Fri, 5 Oct 2012 14:21:00 +0000 (16:21 +0200)] 
MEDIUM: tcp: enable TCP Fast Open on systems which support it

If TCP_FASTOPEN is defined, then the "tfo" option is supported on
"bind" lines to enable TCP Fast Open (linux >= 3.6).

12 years agoMINOR: samples: update the url_param fetch to match parameters in the path
bedis [Fri, 5 Oct 2012 06:38:24 +0000 (08:38 +0200)] 
MINOR: samples: update the url_param fetch to match parameters in the path

It now supports an optional delimiter to allow to look for the parameter before
the query string.

12 years agoCLEANUP: checks: remove minor warnings for assigned but not used variables
Willy Tarreau [Fri, 5 Oct 2012 12:54:30 +0000 (14:54 +0200)] 
CLEANUP: checks: remove minor warnings for assigned but not used variables

We don't use the return value from snd_buf/rcv_buf anymore since we only
rely on the connection flags.

12 years agoBUILD: fix build issue without USE_OPENSSL
Baptiste Assmann [Fri, 5 Oct 2012 09:48:04 +0000 (11:48 +0200)] 
BUILD: fix build issue without USE_OPENSSL

The SSL check referenced use_ssl which only exists when USE_OPENSSL is set.

12 years agoMEDIUM: checks: enable the PROXY protocol with health checks
Willy Tarreau [Thu, 4 Oct 2012 22:04:16 +0000 (00:04 +0200)] 
MEDIUM: checks: enable the PROXY protocol with health checks

When health checks are configured on a server which has the send-proxy
directive and no "port" nor "addr" settings, the health check connections
will automatically use the PROXY protocol. If "port" or "addr" are set,
the "check-send-proxy" directive may be used to force the protocol.

12 years agoMEDIUM: checks: add the "check-ssl" server option
Willy Tarreau [Thu, 4 Oct 2012 21:15:39 +0000 (23:15 +0200)] 
MEDIUM: checks: add the "check-ssl" server option

This option forces health checks to be sent over SSL even if the
address or port are not the standard ones.

12 years agoMAJOR: checks: completely use the connection transport layer
Willy Tarreau [Fri, 28 Sep 2012 17:39:36 +0000 (19:39 +0200)] 
MAJOR: checks: completely use the connection transport layer

With this change, we now use the connection's transport layer to receive
and send data during health checks. It even becomes possible to send data
in multiple times, which was not possible before.

The transport layer used is the same as the one used for the traffic, unless
a specific address and/or port is specified for the checks using "port" or
"addr", in which case the transport layer defaults to raw_sock. An option
will be provided to force SSL checks on different IP/ports later.

Connection errors and timeouts are still reported.

Some situations where strerror() was able to report a precise error after
a failed connect() in the past might not be reported with as much precision
anymore, but the error message was already meaningless. During the tests,
no situation was found where a message became less precise.

12 years agoMEDIUM: check: add the ctrl and transport layers in the server check structure
Willy Tarreau [Fri, 28 Sep 2012 16:13:10 +0000 (18:13 +0200)] 
MEDIUM: check: add the ctrl and transport layers in the server check structure

Since it's possible for the checks to use a different protocol or transport layer
than the prod traffic, we need to have them referenced in the server. The
SSL checks are not enabled yet, but the transport layers are completely used.

12 years agoMEDIUM: checks: use real buffers to store requests and responses
Willy Tarreau [Fri, 28 Sep 2012 13:28:30 +0000 (15:28 +0200)] 
MEDIUM: checks: use real buffers to store requests and responses

Till now the request was made in the trash and sent to the network at
once, and the response was read into a preallocated char[]. Now we
allocate a full buffer for both the request and the response, and make
use of it.

Some of the operations will probably be replaced later with buffer macros
but the point was to ensure we could migrate to use the data layers soon.

One nice improvement caused by this change is that requests are now formed
at the beginning of the check and may safely be sent in multiple chunks if
needed.

12 years agoREORG: server: move the check-specific parts into a check subsection
Willy Tarreau [Fri, 28 Sep 2012 13:01:02 +0000 (15:01 +0200)] 
REORG: server: move the check-specific parts into a check subsection

The health checks in the servers are becoming a real mess, move them
into their own subsection. We'll soon need to have a struct buffer to
replace the char * as well as check-specific protocol and transport
layers.

12 years agoMAJOR: checks: make use of the connection layer to send checks
Willy Tarreau [Fri, 28 Sep 2012 12:40:02 +0000 (14:40 +0200)] 
MAJOR: checks: make use of the connection layer to send checks

This is a first step, we now use the connection layer without the data
layers (send/recv are still used by hand). The connection is established
using tcp_connect_server() and raw_sock is assumed and forced for now.

fdtab is not manipulated anymore and polling is managed via the connection
layer.

It becomes quite clear that the server needs a second ->ctrl and ->xprt
dedicated to the checks.

12 years agoMEDIUM: connection: add a new local send-proxy transport callback
Willy Tarreau [Thu, 4 Oct 2012 21:55:57 +0000 (23:55 +0200)] 
MEDIUM: connection: add a new local send-proxy transport callback

This callback sends a PROXY protocol line on the outgoing connection,
with the local and remote endpoint information. This is used for local
connections (eg: health checks) where the other end needs to have a
valid address and no connection is relayed.

12 years agoREORG: connection: move the PROXY protocol management to connection.c
Willy Tarreau [Thu, 4 Oct 2012 22:10:55 +0000 (00:10 +0200)] 
REORG: connection: move the PROXY protocol management to connection.c

It was previously in frontend.c but there is no reason for this anymore
considering that all the information involved is in the connection itself
only. Theorically this should be in the socket layer but we don't have
this yet.

12 years agoMEDIUM: connection: automatically disable polling on error
Willy Tarreau [Thu, 4 Oct 2012 20:21:15 +0000 (22:21 +0200)] 
MEDIUM: connection: automatically disable polling on error

We absolutely want to disable FD polling after an error is detected,
otherwise the data layer has to do it and it's far from being obvious
at these layers.

The way we did it was a bit tricky in conn_update_*_polling and
conn_*_polling_changes. However it has almost no impact on performance
and code size both for the fast and slow path.

We'll now be able to remove some flag updates in the stream interface.

12 years agoMEDIUM: connection: it's not the data layer's role to validate the connection
Willy Tarreau [Thu, 4 Oct 2012 18:20:46 +0000 (20:20 +0200)] 
MEDIUM: connection: it's not the data layer's role to validate the connection

Till now we used to perform the L4_CONN check in the data layer
(eg: stream interface) but that does not make sense, because some transport
layers will imply that the connection is opened (eg: SSL), and also because
the complexity to check for this is higher in the data layer than in the
transport layer. This is so much true that some read0 cases did not validate
the connection.

So as of now, the transport layer is responsible for clearing L4_CONN when
it detects an activity, and the data layer may safely rely on this flag. This
only impacts a minor change in raw_sock and stream_interface for now.

12 years agoMEDIUM: connection: don't call the data->init callback upon error
Willy Tarreau [Wed, 3 Oct 2012 19:20:21 +0000 (21:20 +0200)] 
MEDIUM: connection: don't call the data->init callback upon error

We don't call ->init() anymore upon error since we already call ->wake().

12 years agoMEDIUM: session: register a data->wake callback to process errors
Willy Tarreau [Wed, 3 Oct 2012 19:17:23 +0000 (21:17 +0200)] 
MEDIUM: session: register a data->wake callback to process errors

The connection layer will soon call ->wake() only when errors happen, and
not ->init(). So make the session layer use this callback to detect errors
and abort connections.

12 years agoMEDIUM: connection: make it possible for data->wake to return an error
Willy Tarreau [Wed, 3 Oct 2012 19:12:16 +0000 (21:12 +0200)] 
MEDIUM: connection: make it possible for data->wake to return an error

Just like ->init(), ->wake() may now be used to return an error and
abort the connection. Currently this is not used but will be with
embryonic sessions.

12 years agoMEDIUM: connection: only call the data->wake callback on activity
Willy Tarreau [Wed, 3 Oct 2012 19:04:48 +0000 (21:04 +0200)] 
MEDIUM: connection: only call the data->wake callback on activity

We now check the connection flags for changes in order not to call the
data->wake callback when there is no activity. Activity means a change
on any of the CO_FL_*_SH, CO_FL_ERROR, CO_FL_CONNECTED, CO_FL_WAIT_CONN*
flags, as well as a call to data->recv or data->send.

12 years agoMEDIUM: connection: reorganize connection flags
Willy Tarreau [Wed, 3 Oct 2012 18:00:18 +0000 (20:00 +0200)] 
MEDIUM: connection: reorganize connection flags

The connection flags have progressively been added one after the other
and were not very well organized. Some of them are often used together
and a number of operations are performed on the DATA/SOCK ENA/POL flags.
Thus, they have been reorganized so that flags that work together are
close to each other (allows immediate operands on ARM) and that polling
changes can be detected with fewer operations using a simple shift and
xor. The handshakes are now the last ones so that it will be easier to
add new ones after without risking a collision. All activity-related
flags are also grouped together.

12 years agoMEDIUM: connection: use a generic data-layer init() callback
Willy Tarreau [Tue, 2 Oct 2012 23:39:48 +0000 (01:39 +0200)] 
MEDIUM: connection: use a generic data-layer init() callback

The generic data-layer init callback is now used after the transport
layer is complete and before calling the data layer recv/send callbacks.

This allows the session to switch from the embryonic session data layer
to the complete stream interface data layer, by making conn_session_complete()
the data layer's init callback.

It sill looks awkwards that the init() callback must be used opon error,
but except by adding yet another one, it does not seem to be mergeable
into another function (eg: it should probably not be merged with ->wake
to avoid unneeded calls during the handshake, though semantically that
would make sense).

12 years agoMEDIUM: session: use a specific data_cb for embryonic sessions
Willy Tarreau [Tue, 2 Oct 2012 19:21:20 +0000 (21:21 +0200)] 
MEDIUM: session: use a specific data_cb for embryonic sessions

We don't want to have the recv or send callbacks in embryonic
sessions, and we want the stream interface to be referenced as
the connection owner only once the session is instanciated. So
let's first have the embryonic session be the owner, then replaced
later by the stream interface once the transport layer is ready.

12 years agoMINOR: connection: add an init callback to the data_cb struct
Willy Tarreau [Tue, 2 Oct 2012 23:12:30 +0000 (01:12 +0200)] 
MINOR: connection: add an init callback to the data_cb struct

This callback is used to initialize the data layer.

12 years agoMINOR: connection: split conn_prepare() in two functions
Willy Tarreau [Tue, 2 Oct 2012 18:57:19 +0000 (20:57 +0200)] 
MINOR: connection: split conn_prepare() in two functions

We'll also need a function to takeover an existing connection without
reinitializing it. The same will be needed at the stream interface level.

12 years agoMINOR: connection: provide a generic data layer wakeup callback
Willy Tarreau [Tue, 2 Oct 2012 18:07:22 +0000 (20:07 +0200)] 
MINOR: connection: provide a generic data layer wakeup callback

Instead of calling conn_notify_si() from the connection handler, we
now call data->wake(), which will allow us to use a different callback
with health checks.

Note that we still rely on a flag in order to decide whether or not
to call this function. The reason is that with embryonic sessions,
the callback is already initialized to si_conn_cb without the flag,
and we can't call the SI notify function in the leave path before
the stream interface is initialized.

This issue should be addressed by involving a different data_cb for
embryonic sessions and for stream interfaces, that would be changed
during session_complete() for the final data_cb.

12 years agoREORG: connection: rename app_cb "data"
Willy Tarreau [Tue, 2 Oct 2012 22:41:04 +0000 (00:41 +0200)] 
REORG: connection: rename app_cb "data"

Now conn->data will designate the data layer which is the client for
the transport layer. In practice it's the stream interface and will
soon also be the health checks.

12 years agoREORG: connection: rename the data layer the "transport layer"
Willy Tarreau [Tue, 2 Oct 2012 22:19:48 +0000 (00:19 +0200)] 
REORG: connection: rename the data layer the "transport layer"

While working on the changes required to make the health checks use the
new connections, it started to become obvious that some naming was not
logical at all in the connections. Specifically, it is not logical to
call the "data layer" the layer which is in charge for all the handshake
and which does not yet provide a data layer once established until a
session has allocated all the required buffers.

In fact, it's more a transport layer, which makes much more sense. The
transport layer offers a medium on which data can transit, and it offers
the functions to move these data when the upper layer requests this. And
it is the upper layer which iterates over the transport layer's functions
to move data which should be called the data layer.

The use case where it's obvious is with embryonic sessions : an incoming
SSL connection is accepted. Only the connection is allocated, not the
buffers nor stream interface, etc... The connection handles the SSL
handshake by itself. Once this handshake is complete, we can't use the
data functions because the buffers and stream interface are not there
yet. Hence we have to first call a specific function to complete the
session initialization, after which we'll be able to use the data
functions. This clearly proves that SSL here is only a transport layer
and that the stream interface constitutes the data layer.

A similar change will be performed to rename app_cb => data, but the
two could not be in the same commit for obvious reasons.

12 years agoMEDIUM: raw_sock: improve connection error reporting
Willy Tarreau [Thu, 4 Oct 2012 18:38:49 +0000 (20:38 +0200)] 
MEDIUM: raw_sock: improve connection error reporting

When a connection setup is pending and we receive an error without a
POLL_IN flag, we're certain there will be nothing to read from it and
we can safely report an error without attempting a recv() call. This
will be significantly better for health checks which will avoid a useless
recv() on all failed checks.

12 years agoMINOR: raw_sock: always report asynchronous connection errors
Willy Tarreau [Thu, 4 Oct 2012 18:17:13 +0000 (20:17 +0200)] 
MINOR: raw_sock: always report asynchronous connection errors

Depending on the pollers used, a connection error may be notified
with POLLOUT|POLLERR|POLLHUP. POLLHUP by itself is enough for the
connection handler to call the read actor, which would only consider
this flag as a good indication of a hangup, without considering the
POLLERR flag.

In order to address this, we directly jump to the read0 label if
POLLERR was not set.

This will be important with health checks as we don't want to believe
a connection was properly established when it's not the case !

12 years agoMINOR: buffers: add a few functions to write chars, strings and blocks
Willy Tarreau [Fri, 28 Sep 2012 14:02:48 +0000 (16:02 +0200)] 
MINOR: buffers: add a few functions to write chars, strings and blocks

bo_put{chr,blk,str,chk} are used to write data on the output of a buffer.
Output is truncated if the buffer is not large enough.

12 years agoMINOR: signal: really ignore signals configured with no handler
Willy Tarreau [Thu, 4 Oct 2012 17:19:36 +0000 (19:19 +0200)] 
MINOR: signal: really ignore signals configured with no handler

Until now, signals configured with no handler were still enabled and
ignored upon signal reception. Until now it was not an issue but with
SSL causing many EPIPE all the time, it becomes obvious that signal
processing comes with a cost. So set the handler to SIG_IGN when the
function is NULL.

12 years agoBUG/MINOR: epoll: correctly disable FD polling in fd_rem()
Willy Tarreau [Thu, 4 Oct 2012 19:54:41 +0000 (21:54 +0200)] 
BUG/MINOR: epoll: correctly disable FD polling in fd_rem()

When calling fd_rem(), the polling was not correctly disabled because the
->prev state was set to zero instead of the previous value. fd_rem() is
very rarely used, only just before closing a socket.

The effect is that upon an error reported at the connection level, if the
task assigned to the connection was too slow to be woken up because of too
many other tasks in the run queue, the FD was still not disabled and caused
the connection handler to be called again with the same event until the task
was finally executed to close the fd.

This issue only affects the epoll poller, not the sepoll variant nor any of
the other ones.

It was already present in 1.4 and even 1.3 with the same almost unnoticeable
effects. The bug can in fact only be discovered during development where it
emphasizes other bugs.

It should be backported anyway.

12 years agoMEDIUM: proxy: add the global frontend to the list of normal proxies
Willy Tarreau [Thu, 4 Oct 2012 06:47:34 +0000 (08:47 +0200)] 
MEDIUM: proxy: add the global frontend to the list of normal proxies

Since recent changes on the global frontend, it was not possible anymore
to soft-reload a process which had a stats socket because the socket would
not be disabled upon reload. The only solution to this endless madness is
to have the global frontend part of normal proxies.

Since we don't want to get an ID that shifts all other proxies and causes
trouble in deployed environments, we assign it ID #0 which other proxies
can't grab, and we don't report it in the stats pages.

12 years agoBUG/MEDIUM: listener: don't pause protocols that do not support it
Willy Tarreau [Thu, 4 Oct 2012 06:56:31 +0000 (08:56 +0200)] 
BUG/MEDIUM: listener: don't pause protocols that do not support it

Pausing a UNIX_STREAM socket results in a major pain because the socket
does not correctly resume, it wakes poll() but return EAGAIN on accept(),
resulting in a busy loop. So let's only pause protocols that support it.

This issues has existed since UNIX sockets were introduced on bind lines.

12 years agoBUG/MINOR: config: use a copy of the file name in proxy configurations
Willy Tarreau [Thu, 4 Oct 2012 06:01:43 +0000 (08:01 +0200)] 
BUG/MINOR: config: use a copy of the file name in proxy configurations

Each proxy contains a reference to the original config file and line
number where it was declared. The pointer used is just a reference to
the one passed to the function instead of being duplicated. The effect
is that it is not valid anymore at the end of the parsing and that all
proxies will be enumerated as coming from the same file on some late
configuration errors. This may happen for exmaple when reporting SSL
certificate issues.

By copying using strdup(), we avoid this issue.

1.4 has the same issue, though no report of the proxy file name is done
out of the config section. Anyway a backport is recommended to ease
post-mortem analysis.

12 years agoBUG/MEDIUM: proxy: must not try to stop disabled proxies upon reload
Willy Tarreau [Wed, 3 Oct 2012 22:14:33 +0000 (00:14 +0200)] 
BUG/MEDIUM: proxy: must not try to stop disabled proxies upon reload

Hervé Commowick reported an issue : haproxy dies in a segfault during a
soft restart if it tries to pause a disabled proxy. This is because disabled
proxies have no management task so we must not wake the task up. This could
easily remain unnoticed since the old process was expected to go away, so
having it go away faster was not really troubling. However, with sync peers,
it is obvious that there is no peer sync during this reload.

This issue has been introduced in 1.5-dev7 with the removal of the
maintain_proxies() function. No backport is needed.

12 years agoBUG/MINOR: ssl: report the L4 connection as established when possible
Willy Tarreau [Fri, 28 Sep 2012 18:22:13 +0000 (20:22 +0200)] 
BUG/MINOR: ssl: report the L4 connection as established when possible

If we get an SSL error during the handshake, we at least try to see
if a syscall reported an error or not. In case of an error, it generally
means that the connection failed. If there is no error, then the connection
established successfully.

The difference is important for health checks which report the precise cause
to the logs and to the stats.

12 years agoBUG/MINOR: build: Fix compilation issue on openssl 0.9.6 due to missing CRL feature.
Emeric Brun [Tue, 2 Oct 2012 17:25:50 +0000 (19:25 +0200)] 
BUG/MINOR: build: Fix compilation issue on openssl 0.9.6 due to missing CRL feature.

12 years agoBUG/MINOR: ssl: Fix CRL check was not enabled when crlfile was specified.
Emeric Brun [Tue, 2 Oct 2012 13:20:55 +0000 (15:20 +0200)] 
BUG/MINOR: ssl: Fix CRL check was not enabled when crlfile was specified.

12 years agoDOC: ssl: add 'no-tls-tickets' statement documentation.
Emeric Brun [Tue, 2 Oct 2012 12:00:59 +0000 (14:00 +0200)] 
DOC: ssl: add 'no-tls-tickets' statement documentation.

Disables the stateless session resumption (RFC 5077 TLS Ticket
extension) and force to use stateful session resumption. Stateless
session resumption is more expensive in CPU usage.

12 years agoMINOR: ssl: add statement 'no-tls-tickets' on bind to disable stateless session resum...
Emeric Brun [Tue, 2 Oct 2012 11:45:20 +0000 (13:45 +0200)] 
MINOR: ssl: add statement 'no-tls-tickets' on bind to disable stateless session resumption

Disables the stateless session resumption (RFC 5077 TLS Ticket extension)
and force to use stateful session resumption.
Stateless session resumption is more expensive in CPU usage.

12 years agoMEDIUM: config: authorize frontend and listen without bind.
Emeric Brun [Mon, 1 Oct 2012 15:10:30 +0000 (17:10 +0200)] 
MEDIUM: config: authorize frontend and listen without bind.

This allows to easily add/remove "bind" entries to a frontend without
being forced to remove it when the last entry is temporarily removed.
While "disabled" may sometimes work in a frontend, it becomes trickier
on "listen" sections which can also hold servers and be referenced by
other frontends.

Note that a "listen" section with no "bind" is equivalent to a "backend"
section.

Configs without any listeners are still reported as invalid and refuse
to load.

12 years agoDOC: ssl : add statements 'notlsv11' and 'notlsv12' and rename 'notlsv1' to 'notlsv10'.
Emeric Brun [Fri, 28 Sep 2012 17:42:54 +0000 (19:42 +0200)] 
DOC: ssl : add statements 'notlsv11' and 'notlsv12' and rename 'notlsv1' to 'notlsv10'.

This applies both to "bind" and "server" statements.

12 years agoMINOR: ssl : add statements 'notlsv11' and 'notlsv12' and rename 'notlsv1' to 'notlsv10'.
Emeric Brun [Fri, 28 Sep 2012 17:37:02 +0000 (19:37 +0200)] 
MINOR: ssl : add statements 'notlsv11' and 'notlsv12' and rename 'notlsv1' to 'notlsv10'.

This is because "notlsv1" used to disable TLSv1.0 only and had no effect
on v1.1/v1.2. so better have an option for each version. This applies both
to "bind" and "server" statements.

12 years agoMINOR: ssl: add build param USE_PRIVATE_CACHE to build cache without shared memory
Emeric Brun [Tue, 25 Sep 2012 09:11:16 +0000 (11:11 +0200)] 
MINOR: ssl: add build param USE_PRIVATE_CACHE to build cache without shared memory

It removes dependencies with futex or mutex but ssl performances decrease
using nbproc > 1 because switching process force session renegotiation.

This can be useful on small systems which never intend to run in multi-process
mode.

12 years agoMINOR: ssl: disable shared memory and locks on session cache if nbproc == 1
Emeric Brun [Mon, 24 Sep 2012 13:48:52 +0000 (15:48 +0200)] 
MINOR: ssl: disable shared memory and locks on session cache if nbproc == 1

We don't needa to lock the memory when there is a single process. This can
make a difference on small systems where locking is much more expensive than
just a test.

12 years agoDOC: ssl: add fetches and ACLs 'ssl_verify_crterr', 'ssl_verify_caerr', and 'ssl_veri...
Emeric Brun [Fri, 28 Sep 2012 16:35:15 +0000 (18:35 +0200)] 
DOC: ssl: add fetches and ACLs 'ssl_verify_crterr', 'ssl_verify_caerr', and 'ssl_verify_crterr_depth'

12 years agoMINOR: ssl: add fetches and ACLs to return verify errors
Emeric Brun [Fri, 21 Sep 2012 13:27:54 +0000 (15:27 +0200)] 
MINOR: ssl: add fetches and ACLs to return verify errors

Add fetch 'ssl_verify_caerr':
returns the first ssl verify error at depth > 0 (CA chain).

Add fetch 'ssl_verify_caerr_depth':
returns the first ssl verify error depth (max returns is 15 if depth > 15).

Add fetch 'ssl_verify_crterr':
returns the fist ssl verify error at depth == 0.

12 years agoDOC: ssl: add fetch and ACL 'ssl_verify_result'
Emeric Brun [Fri, 28 Sep 2012 16:14:24 +0000 (18:14 +0200)] 
DOC: ssl: add fetch and ACL 'ssl_verify_result'

12 years agoMINOR: ssl: add fetch and ACL 'ssl_verify_result'
Emeric Brun [Fri, 21 Sep 2012 13:27:20 +0000 (15:27 +0200)] 
MINOR: ssl: add fetch and ACL 'ssl_verify_result'

This fetch returns the final ssl verify error.

12 years agoDOC: ssl: add 'ca-ignore-err' and 'crt-ignore-err' statements on 'bind'
Emeric Brun [Fri, 28 Sep 2012 15:55:37 +0000 (17:55 +0200)] 
DOC: ssl: add 'ca-ignore-err' and 'crt-ignore-err' statements on 'bind'

12 years agoMINOR: ssl: add ignore verify errors options
Emeric Brun [Fri, 21 Sep 2012 12:31:21 +0000 (14:31 +0200)] 
MINOR: ssl: add ignore verify errors options

Allow to ignore some verify errors and to let them pass the handshake.

Add option 'crt-ignore-err <list>'
Ignore verify errors at depth == 0 (client certificate)
<list> is string 'all' or a comma separated list of verify error IDs
(see http://www.openssl.org/docs/apps/verify.html)

Add option 'ca-ignore-err <list>'
Same as 'crt-ignore-err' for all depths > 0 (CA chain certs)

Ex ignore all errors on CA and expired or not-yet-valid errors
on client certificate:

bind 0.0.0.0:443 ssl crt crt.pem verify required
 cafile ca.pem ca-ignore-err all crt-ignore-err 10,9

12 years agoDOC: ssl: add fetch and ACL 'client_cert'
Emeric Brun [Fri, 28 Sep 2012 15:28:03 +0000 (17:28 +0200)] 
DOC: ssl: add fetch and ACL 'client_cert'

12 years agoMINOR: ssl: add fetch and ACL 'client_crt' to test a client cert is present
Emeric Brun [Fri, 21 Sep 2012 11:15:06 +0000 (13:15 +0200)] 
MINOR: ssl: add fetch and ACL 'client_crt' to test a client cert is present

Useful in case of 'verify optional' to know if the client sent a certificate.

12 years agoDOC: ssl: add 'verify', 'cafile' and 'crlfile' statements on 'bind'
Emeric Brun [Fri, 28 Sep 2012 15:07:34 +0000 (17:07 +0200)] 
DOC: ssl: add 'verify', 'cafile' and 'crlfile' statements on 'bind'

12 years agoMEDIUM: ssl: add client certificate authentication support
Emeric Brun [Thu, 20 Sep 2012 16:23:56 +0000 (18:23 +0200)] 
MEDIUM: ssl: add client certificate authentication support

Add keyword 'verify' on bind:
'verify none': authentication disabled (default)
'verify optional': accept connection without certificate
                   and process a verify if the client sent a certificate
'verify required': reject connection without certificate
                   and process a verify if the client send a certificate

Add keyword 'cafile' on bind:
'cafile <path>' path to a client CA file used to verify.
'crlfile <path>' path to a client CRL file used to verify.

12 years agoDOC: ssl: add 'ecdhe' statement on 'bind'
Emeric Brun [Fri, 28 Sep 2012 13:26:15 +0000 (15:26 +0200)] 
DOC: ssl: add 'ecdhe' statement on 'bind'

12 years agoMINOR: ssl: add elliptic curve Diffie-Hellman support for ssl key generation
Emeric Brun [Thu, 20 Sep 2012 15:10:03 +0000 (17:10 +0200)] 
MINOR: ssl: add elliptic curve Diffie-Hellman support for ssl key generation

Add 'ecdhe' on 'bind' statement: to set named curve used to generate ECDHE keys
(ex: ecdhe secp521r1)