]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
19 months agoDOC: config: add context hint for proxy keywords
Aurelien DARRAGON [Mon, 20 Nov 2023 16:53:17 +0000 (17:53 +0100)] 
DOC: config: add context hint for proxy keywords

Add a small list of contexts where each proxy keyword is expected to be
employed. (Similar to the defaults/frontend/backend/listen compatibility
grid).

19 months agoDOC: config: fix monitor-fail typo
Aurelien DARRAGON [Thu, 30 Nov 2023 10:11:43 +0000 (11:11 +0100)] 
DOC: config: fix monitor-fail typo

monitor-fail doesn't exist, but it was mentionned in the documentation.
Fixing it with "monitor fail" instead.

19 months agoDOC: config: add matrix entry for "max-session-srv-conns"
Aurelien DARRAGON [Wed, 29 Nov 2023 09:13:18 +0000 (10:13 +0100)] 
DOC: config: add matrix entry for "max-session-srv-conns"

Following 4039329 ("DOC: config: specify supported sections for
"max-session-srv-conns"), "max-session-srv-conns" was also missing
from the proxy keyword matrix.

19 months agoBUG/MINOR: cfgparse-listen: fix warning being reported as an alert
Aurelien DARRAGON [Wed, 29 Nov 2023 14:03:25 +0000 (15:03 +0100)] 
BUG/MINOR: cfgparse-listen: fix warning being reported as an alert

Since b40542000d ("MEDIUM: proxy: Warn about ambiguous use of named
defaults sections") we introduced a new error to prevent user from
having an ambiguous named default section in the config which is both
inherited explicitly using "from" and implicitly by another proxy due to
the default section being the last one defined.

However, despite the error message being presented as a warning the
err_code, the commit message and the documentation, it is actually
reported as a fatal error because ha_alert() was used in place of
ha_warning().

In this patch we make the code comply with the documentation and the
intended behavior by using ha_warning() to report the error message.

This should be backported up to 2.6.

19 months agoDOC: config: add missing colon to "bytes_out" sample fetch keyword (2)
Tim Duesterhus [Thu, 30 Nov 2023 19:15:32 +0000 (20:15 +0100)] 
DOC: config: add missing colon to "bytes_out" sample fetch keyword (2)

This reapplies 1eb049dc677f2de950158615ed3d8306ee5102d6, as the change was
accidentally reverted in 5ef48e063ecf992646c7af374153f106050fb8ec.

19 months ago[RELEASE] Released version 2.9-dev12 v2.9-dev12
Willy Tarreau [Thu, 30 Nov 2023 17:07:06 +0000 (18:07 +0100)] 
[RELEASE] Released version 2.9-dev12

Released version 2.9-dev12 with the following main changes :
    - BUG/MINOR: global: Fix tune.disable-(fast-forward/zero-copy-forwarding) options
    - DOC: config: removing "log-balance" references
    - MINOR: server/event_hdl: add SERVER_INETADDR event
    - MINOR: tools: use const for read only pointers in ip{cmp,cpy}
    - MINOR: server/ip: centralize server ip updates
    - MINOR: backend: remove invalid mode test for "hash-balance-factor"
    - Revert "MINOR: cfgparse-listen: warn when use-server rules is used in wrong mode"
    - MINOR: proxy: add free_logformat_list() helper function
    - MINOR: proxy: add free_server_rules() helper function
    - MINOR: log/backend: prevent "use-server" rules use with LOG mode
    - MINOR: log/balance: set lbprm tot_weight on server on queue/dequeue
    - DOC: config: specify supported sections for "max-session-srv-conns"
    - DOC: config: fix timeout check inheritance restrictions
    - REGTESTS: connection: disable http_reuse_be_transparent.vtc if !TPROXY
    - DOC: lua: add sticktable class reference from Proxy.stktable
    - DOC: lua: fix Proxy.get_mode() output
    - DOC: lua: add "syslog" to Proxy.get_mode() output
    - MEDIUM: ssl: implement rsa/ecdsa selection with WolfSSL
    - MINOR: ssl: replace 'trash.area' by 'servername' in ssl_sock_switchctx_cbk()
    - MINOR: ssl: move certificate selection in a dedicate function
    - MEDIUM: ssl: use ssl_sock_chose_sni_ctx() in the clienthello callback
    - MINOR: mworker/cli: implement hard-reload over the master CLI
    - BUG/MEDIUM: mux-h1: Properly ignore trailers when a content-length is announced
    - MINOR: task/profiling: do not record task_drop_running() as a caller
    - OPTIM: pattern: save memory and time using ebst instead of ebis
    - BUILD: map: fix build warning
    - MINOR: trace: define simple -dt argument
    - MINOR: trace: parse level in a function
    - MINOR: trace: parse verbosity in a function
    - MINOR: trace: support -dt optional format
    - OPTIM: mux-h2/zero-copy: don't allocate more buffers per connections than streams
    - BUG/MINOR: quic: fix CONNECTION_CLOSE_APP encoding
    - BUG/MEDIUM: stconn: Don't perform zero-copy FF if opposite SC is blocked
    - BUG/MEDIUM: mux-h2: Remove H2_SF_NOTIFIED flag for H2S blocked on fast-forward
    - CLEANUP: quic: Remove dead definitions/declarations
    - REORG: quic: Move some QUIC CLI code to its C file
    - REORG: quic: Add a new module to handle QUIC connection IDs
    - REORG: quic: QUIC connection types header cleaning
    - BUILD: quic: Missing RX header inclusions
    - REORG: quic: Move CRYPTO data buffer defintions to QUIC TLS module
    - REORG: quic: Move QUIC CRYPTO stream definitions/declarations to QUIC TLS
    - REORG: quic: Move several inlined functions from quic_conn.h
    - REORG: quic: Move QUIC SSL BIO method related functions to quic_ssl.c
    - REORG: quic: Move the QUIC DCID parser to quic_sock.c
    - REORG: quic: Rename some functions used upon ACK receipt
    - REORG: quic: Move QUIC path definitions/declarations to quic_cc module
    - REORG: quic: Move qc_handle_conn_migration() to quic_conn.c
    - REORG: quic: Move quic_build_post_handshake_frames() to quic_conn module
    - REORG: quic: Move qc_may_probe_ipktns() to quic_tls.h
    - REORG: quic: Move qc_pkt_long() to quic_rx.h
    - REORG: quic: Rename some (quic|qc)_conn* objects to quic_conn_closed
    - REORG: quic: Move NEW_CONNECTION_ID frame builder to quic_cid
    - REORG: quic: Move ncbuf related function from quic_rx to quic_conn
    - REORG: quic: Add a new module for QUIC retry
    - BUILD: quic: Several compiler warns fixes after retry module creation
    - REORG: quic: Move qc_notify_send() to quic_conn
    - REORG: quic: Add a new module for retransmissions
    - REORG: quic: Remove qc_pkt_insert() implementation
    - REORG: quic: Move quic_increment_curr_handshake() to quic_sock
    - BUG/MINOR: cache: Remove incomplete entries from the cache when stream is closed
    - MEDIUM: cli: allow custom pattern for payload
    - CLEANUP: mworker/cli: use a label to return errors
    - MINOR: mworker/cli: implements the customized payload pattern for master CLI
    - DOC: management: add documentation about customized payload pattern
    - BUG/MEDIUM: server/event_hdl: memory overrun in _srv_event_hdl_prepare_inetaddr()
    - MINOR: event_hdl: add global tunables
    - BUG/MAJOR: server/addr: fix a race during server addr:svc_port updates
    - MEDIUM: log/balance: support FQDN for UDP log servers
    - BUG/MINOR: compression: possible NULL dereferences in comp_prepare_compress_request()
    - BUG/MEDIUM: master/cli: Properly pin the master CLI on thread 1 / group 1
    - BUG/MEDIUM: mux-quic: Stop zero-copy FF during nego if input is not empty
    - CLEANUP: log: Fix %rc comment in sess_build_logline()
    - BUG/MINOR: h3: fix TRAILERS encoding
    - BUG/MINOR: h3: always reject PUSH_PROMISE
    - MINOR: h3: use correct error code for missing SETTINGS
    - MINOR: http-fetch: Add a sample to retrieve the server status code
    - DOC: config: Improve 'status' sample documentation
    - MINOR: http-fetch: Add a sample to get the transaction status code
    - MEDIUM: http-ana: Set termination state before returning haproxy response
    - MINOR: stream: Expose session terminate state via a new sample fetch
    - MINOR: stream: add a sample fetch to get the number of connection retries
    - MINOR: stream: Expose the stream's uniq_id via a new sample fetch
    - MINOR: muxes: Rename mux_ctl_type values to use MUX_CTL_ prefix
    - MINOR: muxes: Add a callback function to send commands to mux streams
    - MINOR: muxes: Implement ->sctl() callback for muxes and return the stream id
    - MINOR: Add sample fetches to get the frontend and backend stream ID
    - BUG/MEDIUM: cli: Don't look for payload pattern on empty commands
    - DOC: config: Add argument for tune.lua.maxmem
    - DOC: config: fix mention of request slot in http-response capture
    - DOC: config: fix remaining mention of @reverse for attach-srv action
    - DOC: config: fix missing characters in set-spoe-group action
    - DOC: config: reorganize actions into their own section
    - BUG/MINOR: acme.sh: update the deploy script
    - MINOR: rhttp: mark reverse HTTP as experimental
    - CLEANUP: quic_cid: remove unused listener arg
    - BUG/MINOR: quic_tp: fix preferred_address decoding
    - MINOR: quic_tp: use in_addr/in6_addr for preferred_address
    - MINOR: acme.sh: use the master CLI for hot update
    - DOC: config: move the cache-use and cache-store actions to the proper section
    - DOC: config: fix alphabetical ordering of converter keywords
    - DOC: config: add missing colon to "bytes_out" sample fetch keyword
    - DOC: config: add an index of converter keywords
    - DOC: config: add an index of sample fetch keywords
    - BUG/MINOR: config: Stopped parsing upon unmatched environment variables
    - DEBUG: unstatify a few functions that are often present in backtraces
    - BUILD: server: shut a bogus gcc warning on certain ubuntu

19 months agoBUILD: server: shut a bogus gcc warning on certain ubuntu
Willy Tarreau [Thu, 30 Nov 2023 16:48:03 +0000 (17:48 +0100)] 
BUILD: server: shut a bogus gcc warning on certain ubuntu

On ubuntu 20.04 and 22.04 with gcc 9.4 and 11.4 respectively, we get
the following warning:

  src/server.c: In function 'srv_update_addr_port':
  src/server.c:4027:3: warning: 'new_port' may be used uninitialized in this function [-Wmaybe-uninitialized]
   4027 |   _srv_event_hdl_prepare_inetaddr(&cb_data.addr, &s->addr, s->svc_port,
        |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   4028 |                                   ((ip_change) ? &sa : &s->addr),
        |                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   4029 |                                   ((port_change) ? new_port : s->svc_port),
        |                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   4030 |                                   1);
        |                                   ~~

It's clearly wrong, port_change only changes from 0 to anything else
*after* assigning new_port. Let's just preset new_port to zero instead
of trying to play smart with the compiler.

19 months agoDEBUG: unstatify a few functions that are often present in backtraces
Willy Tarreau [Thu, 30 Nov 2023 16:04:16 +0000 (17:04 +0100)] 
DEBUG: unstatify a few functions that are often present in backtraces

It's useful to be able to recognize certain functions that are often
present in backtraces as they call lower level functions, and for this
they must not be static. Let's remove "static" in front of these
functions:

  sc_notify, sc_conn_recv, sc_conn_send, sc_conn_process,
  sc_applet_process, back_establish, stream_update_both_sc,
  httpclient_applet_io_handler, httpclient_applet_init,
  httpclient_applet_release

19 months agoBUG/MINOR: config: Stopped parsing upon unmatched environment variables
Frédéric Lécaille [Thu, 30 Nov 2023 08:26:05 +0000 (09:26 +0100)] 
BUG/MINOR: config: Stopped parsing upon unmatched environment variables

When an environment variable could not be matched by getenv(), the
current character to be parsed by parse_line() from <in> variable
is the trailing double quotes. If nothing is done in such a case,
this character is skipped by parse_line(), then the following spaces
are parsed as an empty argument.

To fix this, skip the double quotes character and the following spaces
to make <in> variable point to the next argument to be parsed.

Thank you to @sigint2 for having reported this issue in GH #2367.

Must be backported as far as 2.4.

19 months agoDOC: config: add an index of sample fetch keywords
Willy Tarreau [Thu, 30 Nov 2023 15:00:14 +0000 (16:00 +0100)] 
DOC: config: add an index of sample fetch keywords

Now we're adding a table for each section, it allows to more easily
spot the list of available sample fetch functions and their types.
For now the arguments are not mentioned in the table because they'd
break indexing but they can be added back later.

19 months agoDOC: config: add an index of converter keywords
Willy Tarreau [Thu, 30 Nov 2023 15:03:55 +0000 (16:03 +0100)] 
DOC: config: add an index of converter keywords

The goal here is to have a centralized list of converters and
their in/out types.

19 months agoDOC: config: add missing colon to "bytes_out" sample fetch keyword
Willy Tarreau [Thu, 30 Nov 2023 15:03:19 +0000 (16:03 +0100)] 
DOC: config: add missing colon to "bytes_out" sample fetch keyword

The colon was missing between the keyword and the type, breaking
rendering and indexing.

19 months agoDOC: config: fix alphabetical ordering of converter keywords
Willy Tarreau [Thu, 30 Nov 2023 10:55:22 +0000 (11:55 +0100)] 
DOC: config: fix alphabetical ordering of converter keywords

- rfc7239_* were misplaced and incorrectly ordered
- table_gpt was placed before some table_gpc*
- capture-req/res were misplaced
- htonl was misplaced
- upper/url_* were misplaced
- x509_v_err_str was misplaced

Let's fix these since poor ordering complicates their finding.

19 months agoDOC: config: move the cache-use and cache-store actions to the proper section
Willy Tarreau [Thu, 30 Nov 2023 15:25:58 +0000 (16:25 +0100)] 
DOC: config: move the cache-use and cache-store actions to the proper section

Actions were grouped by previous commit d54e8f810 ("DOC: config: reorganize
actions into their own section") but cache-use and cache-store were still
making reference to the cache section. This moves the text back to their
respective keywords in the actions section and leaves the example and an
explanation of how to use the keywords in the cache section.

19 months agoMINOR: acme.sh: use the master CLI for hot update
William Lallemand [Thu, 30 Nov 2023 15:15:45 +0000 (16:15 +0100)] 
MINOR: acme.sh: use the master CLI for hot update

DEPLOY_HAPROXY_MASTER_CLI allows to use the HAProxy master CLI
instead of a stats socket for DEPLOY_HAPROXY_HOT_UPDATE="yes"

The syntax of the master CLI is slightly different, a prefix with
the process number need to be added before any command.

This patch uses ${_cmdpfx} in front of every socat commands which is
filled when the master CLI is used.

19 months agoMINOR: quic_tp: use in_addr/in6_addr for preferred_address
Amaury Denoyelle [Thu, 30 Nov 2023 14:36:10 +0000 (15:36 +0100)] 
MINOR: quic_tp: use in_addr/in6_addr for preferred_address

preferred_address is a transport parameter specify by the server. It
specified both an IPv4 and IPv6 address. These addresses were defined as
plain array in <struct tp_preferred_address>.

Convert these adressees to use the common types in_addr/in6_addr. With
this change, dumping of preferred_address is extended. It now displays
the addresses using inet_ntop() and CID value.

19 months agoBUG/MINOR: quic_tp: fix preferred_address decoding
Amaury Denoyelle [Thu, 30 Nov 2023 13:01:51 +0000 (14:01 +0100)] 
BUG/MINOR: quic_tp: fix preferred_address decoding

quic_transport_param_dec_pref_addr() is responsible to decode
preferred_address from received transport parameter. There was two
issues with this function :
* address and port location as defined in RFC were inverted for both
  IPv4 and IPv6 during decoding
* an invalid check was done to ensure decoded CID length corresponds to
  remaining buffer size. It did not take into account the final field
  for stateless reset token.

These issues were never encountered as only server can emit
preferred_address transport parameter, so the impact of this bug is
invisible.

This should be backported up to 2.6.

19 months agoCLEANUP: quic_cid: remove unused listener arg
Amaury Denoyelle [Thu, 30 Nov 2023 13:00:56 +0000 (14:00 +0100)] 
CLEANUP: quic_cid: remove unused listener arg

retrieve_qc_conn_from_cid() requires listener as argument whereas it is
unused. This is an artifact from the old architecture where CID trees
where stored on listener instances instead of globally. Remove it to
better reflect this change.

19 months agoMINOR: rhttp: mark reverse HTTP as experimental
Amaury Denoyelle [Thu, 30 Nov 2023 13:28:47 +0000 (14:28 +0100)] 
MINOR: rhttp: mark reverse HTTP as experimental

Mark the reverse HTTP feature as experimental. This will allow to adjust
if needed the configuration mechanism with future developments without
maintaining retro-compatibility.

Concretely, each config directives linked to it now requires to specify
first global expose-experimental-directives before. This is the case for
the following directives :
- rhttp@ prefix uses in bind and server lines
- nbconn bind keyword
- attach-srv tcp rule

Each documentation section refering to these keywords are updated to
highlight this new requirement.

Note that this commit has duplicated on several places the code from the
global function check_kw_experimental(). This is because the latter only
work with cfg_keyword type. This is not adapted with bind_kw or
action_kw types. This should be improve in a future patch.

19 months agoBUG/MINOR: acme.sh: update the deploy script
William Lallemand [Thu, 30 Nov 2023 13:15:06 +0000 (14:15 +0100)] 
BUG/MINOR: acme.sh: update the deploy script

https://github.com/acmesh-official/acme.sh/pull/4581 was updated, this
patch update the haproxy repository with the update.
the following changes were done:

- sanitize the PEM to remove the '\n' (truncated certicate chain)
- shellcheck fixes
- socat format is directly used in the DEPLOY_HAPROXY_STATS_SOCKET variable

19 months agoDOC: config: reorganize actions into their own section
Willy Tarreau [Thu, 30 Nov 2023 08:28:39 +0000 (09:28 +0100)] 
DOC: config: reorganize actions into their own section

The split of the rulesets from their respective actions has long been
overdue so it's time to do it because it has become extremely difficult
to add simple actions in the documentation, as well as it's hard to find
them.

This commit creates two new sections "4.3 Actions keywords matrix" and
"4.4 Alphabetically sorted actions reference" that enumerates all known
actions, with a check indicating for which rule sets they're valid. This
removes all the repetition, occurrences of "see http-request blah for
details" and significantly reduces the number of keywords listed in the
proxies section. This removes 2245 lines from the proxies section in
exchange of 1608 in these new sections.

19 months agoDOC: config: fix missing characters in set-spoe-group action
Willy Tarreau [Thu, 30 Nov 2023 08:27:51 +0000 (09:27 +0100)] 
DOC: config: fix missing characters in set-spoe-group action

It was written "Thaction" instead of "This action".

19 months agoDOC: config: fix remaining mention of @reverse for attach-srv action
Willy Tarreau [Thu, 30 Nov 2023 08:26:38 +0000 (09:26 +0100)] 
DOC: config: fix remaining mention of @reverse for attach-srv action

The new address is "rhttp@".

19 months agoDOC: config: fix mention of request slot in http-response capture
Willy Tarreau [Thu, 30 Nov 2023 08:24:21 +0000 (09:24 +0100)] 
DOC: config: fix mention of request slot in http-response capture

It's response slot, not request slot.

19 months agoDOC: config: Add argument for tune.lua.maxmem
Olivier Duclos [Wed, 29 Nov 2023 11:08:12 +0000 (12:08 +0100)] 
DOC: config: Add argument for tune.lua.maxmem

Make it clear that tune.lua.maxmem expects a number.

19 months agoBUG/MEDIUM: cli: Don't look for payload pattern on empty commands
Christopher Faulet [Wed, 29 Nov 2023 12:20:59 +0000 (13:20 +0100)] 
BUG/MEDIUM: cli: Don't look for payload pattern on empty commands

A regression was introduced by commit 9431aa0bdf ("BUG/MEDIUM: cli: Don't
look for payload pattern on empty commands").

On empty commands (really empty or containing spaces and tabs), the number of
arguments set to 0. However we look for the payload pattern without checking
it. The result is an access at the index -1 in the argument array. It is of
course invalid.

To fix the issue, we just skip this part when there is no argument. Note that
the empty command is still sent to the worker.

This patch should solve the issue #2365. No backport needed.

19 months agoMINOR: Add sample fetches to get the frontend and backend stream ID
Christopher Faulet [Tue, 28 Nov 2023 15:34:23 +0000 (16:34 +0100)] 
MINOR: Add sample fetches to get the frontend and backend stream ID

"fc.id" and "bc.id" sample fetches can now be used to get, respectively, the
frontend or the backend stream ID. They rely on ->sctl() callback function
on the mux attached to the corresponding SC.

It means these sample fetches work only for connection, not applets, and
from the time a multiplexer is installed.

19 months agoMINOR: muxes: Implement ->sctl() callback for muxes and return the stream id
Christopher Faulet [Tue, 28 Nov 2023 14:12:51 +0000 (15:12 +0100)] 
MINOR: muxes: Implement ->sctl() callback for muxes and return the stream id

All muxes now implements the ->sctl() callback function and are able to
return the stream ID. For the PT multiplexer, it is always 0. For the H1
multiplexer it is the request count for the current H1 connection (added for
this purpose). The FCGI, H2 and QUIC muxes, the stream ID is returned.

The stream ID is returned as a signed 64 bits integer.

19 months agoMINOR: muxes: Add a callback function to send commands to mux streams
Christopher Faulet [Tue, 28 Nov 2023 13:53:58 +0000 (14:53 +0100)] 
MINOR: muxes: Add a callback function to send commands to mux streams

Just like the ->ctl() callback function, used to send commands to mux
connections, the ->sctl() callback function can now be used to send commands
to mux streams. The first command, MUX_SCTL_SID, is a way to request the mux
stream ID.

It will be implemented later for each mux.

19 months agoMINOR: muxes: Rename mux_ctl_type values to use MUX_CTL_ prefix
Christopher Faulet [Tue, 28 Nov 2023 13:27:51 +0000 (14:27 +0100)] 
MINOR: muxes: Rename mux_ctl_type values to use MUX_CTL_ prefix

Instead of the generic MUX_, we now use MUX_CTL_ prefix for all mux_ctl_type
value. This will avoid any ambiguities with other enums, especially with a
new one that will be added to get information on mux streams.

19 months agoMINOR: stream: Expose the stream's uniq_id via a new sample fetch
Christopher Faulet [Tue, 28 Nov 2023 20:01:18 +0000 (21:01 +0100)] 
MINOR: stream: Expose the stream's uniq_id via a new sample fetch

"txn.id32" may now be used to get the stream's uniq_id. It is equivalent to
%rt in logs.

19 months agoMINOR: stream: add a sample fetch to get the number of connection retries
Christopher Faulet [Tue, 28 Nov 2023 12:59:59 +0000 (13:59 +0100)] 
MINOR: stream: add a sample fetch to get the number of connection retries

"txn.conn_retries" can now be used to get the number of connection
retries. This value is only stable once the connection is fully
established. For HTTP sessions, L7-retries must also be passed.

19 months agoMINOR: stream: Expose session terminate state via a new sample fetch
Christopher Faulet [Tue, 28 Nov 2023 07:45:33 +0000 (08:45 +0100)] 
MINOR: stream: Expose session terminate state via a new sample fetch

It is now possible to retrieve the session terminate state, using
"txn.sess_term_state". The sample fetch returns the 2-character session
termation state.

Of course, the result of this sample fetch is volatile. It is subject to
change. It is also most of time useless because no termation state is set
except at the end. It should only be useful in http-after-response rule
sets. It may also be used to customize the logs using a log-format
directive.

This patch should fix the issue #2221.

19 months agoMEDIUM: http-ana: Set termination state before returning haproxy response
Christopher Faulet [Tue, 28 Nov 2023 07:38:45 +0000 (08:38 +0100)] 
MEDIUM: http-ana: Set termination state before returning haproxy response

When, for any reason and at any step, HAProxy decides to interrupt an HTTP
transaction, it returns a dedicated responses to the client (possibly empty)
and it sets the stream flags used to produce the session termination state.
These both operation were performed in any order, depending on the code
path. Most of time, the HAPRoxy response is produced first.

With this patch, the stream flags for the termination state are now set
first. This way, these flags become visible from http-after-reponse rule
sets. Only errors when the HAProxy response is generated are reported later.

19 months agoMINOR: http-fetch: Add a sample to get the transaction status code
Christopher Faulet [Mon, 27 Nov 2023 17:49:47 +0000 (18:49 +0100)] 
MINOR: http-fetch: Add a sample to get the transaction status code

It was possible get the status code in the HTTP response and the one
received from the server. Thanks to 'txn.status', it is now possible to get
the transaction status code. It is equivalent to '%ST' in log-format.

Most of time, it is the same than 'status', except if the status code of the
HTTP reply does not match the one used to interrupt the transaction. For
instance, an error file use mapped on 400 containing a 404.

19 months agoDOC: config: Improve 'status' sample documentation
Christopher Faulet [Mon, 27 Nov 2023 17:27:47 +0000 (18:27 +0100)] 
DOC: config: Improve 'status' sample documentation

We clearly state the 'status' sample returns the status code the client will
receive, if no change happens on the HTTP response. This should avoid
ambiguities with the 'server-status' sample fetch.

19 months agoMINOR: http-fetch: Add a sample to retrieve the server status code
Christopher Faulet [Mon, 27 Nov 2023 17:12:13 +0000 (18:12 +0100)] 
MINOR: http-fetch: Add a sample to retrieve the server status code

The code returned by the "status" sample fetch is the one in the HTTP
response at the moment the sample is evaluated. It may be the status code in
the server response or the one of the HAProxy reply in case of error, deny,
redirect...

However, it could be handy to retrieve the status code returned by the
server, when a HTTP response was really received from it. It is the purpose
of the "server_status" sample fetch. The server status code itself is stored
in the HTTP txn.

19 months agoMINOR: h3: use correct error code for missing SETTINGS
Amaury Denoyelle [Tue, 28 Nov 2023 15:01:38 +0000 (16:01 +0100)] 
MINOR: h3: use correct error code for missing SETTINGS

Each received HTTP/3 frame is checked to ensure it is valid given the
type of stream and its current status. This was implemented via
h3_is_frame_valid().

Previously, no distinction was made for error code, so every failure
triggered a CONNECTION_CLOSE_APP with code H3_FRAME_UNEXPECTED. However,
this function also ensures that the first frame received on control
frame is of type SETTINGS. If not, the error code to use is
H3_MISSING_SETTINGS.

To support this, adjust the function prototype. Instead of returning a
boolean, 0 is returned for success, or a HTTP/3 error code. The function
is renamed h3_check_frame_valid() to reflects the return type change.

This is not considered as a bug as previously the connection was
correctly closed on a missing SETTINGS, albeit with a non conform error
code. It's not deemed as sufficient to be backported.

19 months agoBUG/MINOR: h3: always reject PUSH_PROMISE
Amaury Denoyelle [Tue, 28 Nov 2023 11:00:40 +0000 (12:00 +0100)] 
BUG/MINOR: h3: always reject PUSH_PROMISE

The condition for checking PUSH_PROMISE was not correctly interpreted
from the RFC. Initially, it rejects such a frame for every stream
initiated from client side.

In fact, the RFC indicates that PUSH_PROMISE are never sent by a client.
Thus, it can be rejected in any case until HTTP/3 will be implemented on
the backend side.

This should be backported up to 2.6.

19 months agoBUG/MINOR: h3: fix TRAILERS encoding
Amaury Denoyelle [Tue, 28 Nov 2023 14:59:38 +0000 (15:59 +0100)] 
BUG/MINOR: h3: fix TRAILERS encoding

HTTP/3 trailers encoding was never working as intended. It's because
h3_trailers_to_htx() manipulate a newly allocated buffer instead of the
already existing channel one. Thus, HTX message handled by the stream
was incomplete as it lacked trailers and EOM.

Fix this by reusing the already allocated channel buffer in
h3_trailers_to_htx().

This bug was detected by simulating TRAILERS emission which generate
CL--- state due to missing request side termination signal. Its impact
is deemed as minimal as trailers are pretty infrequent for now in
HTTP/3.

This must be backported up to 2.7.

19 months agoCLEANUP: log: Fix %rc comment in sess_build_logline()
Christopher Faulet [Tue, 28 Nov 2023 10:21:40 +0000 (11:21 +0100)] 
CLEANUP: log: Fix %rc comment in sess_build_logline()

%rq was used instead of %rc.

19 months agoBUG/MEDIUM: mux-quic: Stop zero-copy FF during nego if input is not empty
Christopher Faulet [Tue, 28 Nov 2023 21:24:45 +0000 (22:24 +0100)] 
BUG/MEDIUM: mux-quic: Stop zero-copy FF during nego if input is not empty

When the producer negociate with the QUIC mux to perform a zero-copy
fast-forward, data in the input buffer are first transferred in the H3
buffer. However, after the transfer, if the input buffer is not empty, the
data fast-forwarding must be stopped. In this case, qmux_nego_ff() must
return 0.

No backport needed.

19 months agoBUG/MEDIUM: master/cli: Properly pin the master CLI on thread 1 / group 1
Christopher Faulet [Tue, 28 Nov 2023 20:50:21 +0000 (21:50 +0100)] 
BUG/MEDIUM: master/cli: Properly pin the master CLI on thread 1 / group 1

A previous fix was pushed for that (13fb7170be "BUG/MEDIUM: master/cli: Pin
the master CLI on the first thread of the group 1" ). Unfortunately, instead
of the master CLI, it is the sockpairs between the master and the workers
that were pinned to the first thread of the group 1. So the crash is still
there.

So, again, to fix the bug the master CLI is now pinned on the first thread
of the first group.

 patch should fix the issue #2259 and must be backported to 2.8.

19 months agoBUG/MINOR: compression: possible NULL dereferences in comp_prepare_compress_request()
Aurelien DARRAGON [Tue, 28 Nov 2023 14:47:25 +0000 (15:47 +0100)] 
BUG/MINOR: compression: possible NULL dereferences in comp_prepare_compress_request()

This bug was introduced in ead43fe4f2 ("MEDIUM: compression: Make it so
we can compress requests as well.")

2 cases where not properly handled, resulting in 2 possible NULL
dereferences leading to crashes in the function at runtime:
 - when the backend didn't define any compression options so its comp
   pointer is NULL (ie: if only the frontend defines some comp options)
 - when both the frontend and the backend didn't set a compression algo
   but at least one of the two defined some other comp options (comp
   pointer set)

For the first case, we added the missing checks to make sure we don't
read ->comp pointer if it is NULL.
For the second case, we properly return from the function if no
compression algo is defined, because there is no default value that could
be used as a fallback.

This should be backported to 2.8.

19 months agoMEDIUM: log/balance: support FQDN for UDP log servers
Aurelien DARRAGON [Thu, 9 Nov 2023 15:57:01 +0000 (16:57 +0100)] 
MEDIUM: log/balance: support FQDN for UDP log servers

In previous log backend implementation, we created a pseudo log target
for each declared log server, and we made the log target's address point
to the actual server address to save some time and prevent unecessary
copies.

But this was done without knowing that when FQDN is involved (more broadly
when dns/resolution is involved), the "port" part of server addr should
not be relied upon, and we should explicitly use ->svc_port for that
purpose.

With that in mind and thanks to the previous commit, some changes were
required: we allocate a dedicated addr within the log target when target
is in DGRAM mode. The addr is first initialized with known values and it
is then updated automatically by _srv_set_inetaddr() during runtime.
(the change is atomic so readers don't need to worry about it)

addr from server "log target" (INET/DGRAM mode) is made of the combination
of server's address (lacking the port part) and server's svc_port.

19 months agoBUG/MAJOR: server/addr: fix a race during server addr:svc_port updates
Aurelien DARRAGON [Mon, 13 Nov 2023 17:14:24 +0000 (18:14 +0100)] 
BUG/MAJOR: server/addr: fix a race during server addr:svc_port updates

For inet families (IP4/IP6), it is expected that server's addr/port might
be updated at runtime from DNS, cli or lua for instance.

Such updates were performed under the server's lock.

Unfortunately, most readers such as backend.c or sink.c perform the read
without taking server's lock because they can't afford slowing down their
processing for a type of event which is normally rare. But this could
result in bad values being read for the server addr:svc_port tuple (ie:
during connection etablishment) as a result of concurrent updates from
external components, which can obviously cause some undesirable effects.

Instead of slowing the readers down, as we consider server's addr changes
are relatively rare, we take another approach and try to update the
addr:port atomically by performing changes under full thread isolation
when a new change is requested. The changes are performed by a dedicated
task which takes care of isolating the current thread and doesn't depend
on other threads (independent code path) to protect against dead locks.

As such, server's addr:port changes will now be performed atomically, but
they will not be processed instantly, they will be translated to events
that the dedicated task will pick up from time to time to apply the
pending changes.

This bug existed for a very long time and has never been reported so
far. It was discovered by reading the code during the implementation
of log backend ("mode log" in backends). As it involves changes in
sensitive areas as well as thread isolation, it is probably not
worth considering backporting it for now, unless it is proven that it
will help to solve bugs that are actually encountered in the field.

This patch depends on:
 - 24da4d3 ("MINOR: tools: use const for read only pointers in ip{cmp,cpy}")
 - c886fb5 ("MINOR: server/ip: centralize server ip updates")
 - event_hdl API (which was first seen on 2.8) +
   683b2ae ("MINOR: server/event_hdl: add SERVER_INETADDR event") +
   BUG/MEDIUM: server/event_hdl: memory overrun in _srv_event_hdl_prepare_inetaddr() +
   "MINOR: event_hdl: add global tunables"

   Note that the patch may be reworked so that it doesn't depend on
   event_hdl API for older versions, the approach would remain the same:
   this would result in a larger patch due to the need to manually
   implement a global queue of pending updates with its dedicated task
   responsible for picking updates and comitting them. An alternative
   approach could consist in per-server, lock-protected, temporary
   addr:svc_port storage dedicated to "updaters" were only the most
   recent values would be kept. The sync task would then use them as
   source values to atomically update the addr:svc_port members that the
   runtime readers are actually using.

19 months agoMINOR: event_hdl: add global tunables
Aurelien DARRAGON [Fri, 24 Nov 2023 14:37:40 +0000 (15:37 +0100)] 
MINOR: event_hdl: add global tunables

The local variable "event_hdl_async_max_notif_at_once" which was
introduced with the event_hdl API was left as is but with a TODO note
telling that we should make it a global tunable.

Well, we're doing this now. To prepare for upcoming tunables related to
event_hdl API, we add a dedicated struct named event_hdl_tune which is
globally exposed through the event_hdl header file so that it may be used
from everywhere. The struct is automatically initialized in
event_hdl_init() according to defaults.h.

"event_hdl_async_max_notif_at_once" now becomes
"event_hdl_tune.max_events_at_once" with it's dedicated
configuation keyword: "tune.events.max-events-at-once".

We're also taking this opportunity to raise the default value from 10
to 100 since it's seems quite reasonnable given existing async event_hdl
users.

The documentation was updated accordingly.

19 months agoBUG/MEDIUM: server/event_hdl: memory overrun in _srv_event_hdl_prepare_inetaddr()
Aurelien DARRAGON [Sat, 25 Nov 2023 15:39:19 +0000 (16:39 +0100)] 
BUG/MEDIUM: server/event_hdl: memory overrun in _srv_event_hdl_prepare_inetaddr()

As reported in GH #2358, #2359, #2360, #2361 and #2362: ipv6 address
handling may cause memory overrun due to struct in6_addr being handled
as sockaddr_in6 which is larger. Moreover, source variable wasn't properly
read from since the raw value was used as a pointer instead of pointing to
the actual variable's address.

This bug was introduced by 6fde37e046
("MINOR: server/event_hdl: add SERVER_INETADDR event")

Unfortunately for us, gcc didn't catch this and, this actually used to
"work" by accident since in6_addr struct is made of array so not passing
pointer explicitly still resolved to the proper starting address..
Hopefully this was caught by coverity so thanks to Ilya for that.

The fix is simple: we simply copy the whole in6_addr struct by accessing
it using a pointer and using the proper struct size for the copy.

19 months agoDOC: management: add documentation about customized payload pattern
William Lallemand [Mon, 27 Nov 2023 22:26:52 +0000 (23:26 +0100)] 
DOC: management: add documentation about customized payload pattern

One can customize a payload pattern in order to change the way the
payload ends.

19 months agoMINOR: mworker/cli: implements the customized payload pattern for master CLI
William Lallemand [Tue, 28 Nov 2023 16:57:21 +0000 (17:57 +0100)] 
MINOR: mworker/cli: implements the customized payload pattern for master CLI

Implements the customized payload pattern for the master CLI.

The pattern is stored in the stream in char pcli_payload_pat[8].

The principle is basically the same as the CLI one, it looks for '<<'
then stores what's between '<<' and '\n', and look for it to exit the
payload mode.

19 months agoCLEANUP: mworker/cli: use a label to return errors
William Lallemand [Tue, 28 Nov 2023 16:28:07 +0000 (17:28 +0100)] 
CLEANUP: mworker/cli: use a label to return errors

Remove the returns in the function to end directly at the end label.

19 months agoMEDIUM: cli: allow custom pattern for payload
William Lallemand [Mon, 27 Nov 2023 15:04:20 +0000 (16:04 +0100)] 
MEDIUM: cli: allow custom pattern for payload

The CLI payload syntax has some limitation, it can't handle payloads
with empty lines, which is a common problem when uploading a PEM file
over the CLI.

This patch implements a way to customize the ending pattern of the CLI,
so we can't look for other things than empty lines.

A char cli_payload_pat[8] is used in the appctx to store the customized
pattern. The pattern can't be more than 7 characters and can still empty
to match an empty line.

The cli_io_handler() identifies the pattern and stores it, and
cli_parse_request() identifies the end of the payload.

If the customized pattern between "<<" and "\n" is more than 7
characters, it is not considered as a pattern.

This patch only implements the parser for the 'stats socket', another
patch is needed for the 'master CLI'.

19 months agoBUG/MINOR: cache: Remove incomplete entries from the cache when stream is closed
Remi Tricot-Le Breton [Tue, 28 Nov 2023 16:08:56 +0000 (17:08 +0100)] 
BUG/MINOR: cache: Remove incomplete entries from the cache when stream is closed

When a stream is interrupted by the client before the full answer is
stored in the cache, we end up with an incomplete entry in the cache
that cannot be overwritten until it "naturally" expires. In such a case,
we call the cache filter's cache_store_strm_deinit callback without ever
calling cache_store_http_end which means that the 'complete' flag is
never set on the concerned cache_entry.
This patch adds a check on the 'complete' flag in the strm_deinit
callback and removes the entry from the cache if it is incomplete.

A way to exhibit this bug is to try to get the same "big" response on
multiple clients at the same time thanks to h2load for instance, and to
interrupt the client side before the answer can be fully stored in the
cache.

This patch can be backported up to 2.4 but it will need some rework
starting with branch 2.8 because of the latest cache changes.

19 months agoREORG: quic: Move quic_increment_curr_handshake() to quic_sock
Frédéric Lécaille [Tue, 28 Nov 2023 14:01:01 +0000 (15:01 +0100)] 
REORG: quic: Move quic_increment_curr_handshake() to quic_sock

Move quic_increment_curr_handshake() from quic_conn.c to quic_sock.h to be inlined.
Also move all the inlined functions at the end of this header.

19 months agoREORG: quic: Remove qc_pkt_insert() implementation
Frédéric Lécaille [Tue, 28 Nov 2023 13:52:22 +0000 (14:52 +0100)] 
REORG: quic: Remove qc_pkt_insert() implementation

As this function does only a few things with a not very well chosen name,
remove it and replace it by the its statements at the unique location it
is called.

19 months agoREORG: quic: Add a new module for retransmissions
Frédéric Lécaille [Tue, 28 Nov 2023 13:27:33 +0000 (14:27 +0100)] 
REORG: quic: Add a new module for retransmissions

Move several functions in relation with the retransmissions from TX part
(quic_tx.c) to quic_retransmit.c new C file.

19 months agoREORG: quic: Move qc_notify_send() to quic_conn
Frédéric Lécaille [Tue, 28 Nov 2023 13:02:17 +0000 (14:02 +0100)] 
REORG: quic: Move qc_notify_send() to quic_conn

Move qc_notify_send() from quic_tx.c to quic_conn.c. Note that it was already
exported from both quic_conn.h and quic_tx.h. Modify this latter header
to fix the duplication.

19 months agoBUILD: quic: Several compiler warns fixes after retry module creation
Frédéric Lécaille [Tue, 28 Nov 2023 10:37:44 +0000 (11:37 +0100)] 
BUILD: quic: Several compiler warns fixes after retry module creation

Such a warning appeared after having added quic_retry.h which includes only
headers for types (quic_cid-t.h, clock-t.h...)

In file included from include/haproxy/quic_retry.h:12,
                 from src/quic_retry.c:5:
include/haproxy/quic_cid-t.h:26:26: error: field ‘seq_num’ has incomplete type
   26 |         struct eb64_node seq_num;

19 months agoREORG: quic: Add a new module for QUIC retry
Frédéric Lécaille [Tue, 28 Nov 2023 10:25:04 +0000 (11:25 +0100)] 
REORG: quic: Add a new module for QUIC retry

Add quic_retry.c new C file for the QUIC retry feature:
   quic_saddr_cpy() moved from quic_tx.c,
   quic_generate_retry_token_aad() moved from
   quic_generate_retry_token() moved from
   parse_retry_token() moved from
   quic_retry_token_check() moved from
   quic_retry_token_check() moved from

19 months agoREORG: quic: Move ncbuf related function from quic_rx to quic_conn
Frédéric Lécaille [Tue, 28 Nov 2023 08:09:36 +0000 (09:09 +0100)] 
REORG: quic: Move ncbuf related function from quic_rx to quic_conn

Move quic_get_ncbuf() and quic_free_ncbuf() from quic_rx.c to quic_conn.h
as static inlined functions.

19 months agoREORG: quic: Move NEW_CONNECTION_ID frame builder to quic_cid
Frédéric Lécaille [Tue, 28 Nov 2023 07:59:15 +0000 (08:59 +0100)] 
REORG: quic: Move NEW_CONNECTION_ID frame builder to quic_cid

Move qc_build_new_connection_id_frm() from quic_conn.c to quic_cid.c.
Also move quic_connection_id_to_frm_cpy() from quic_conn.h to quic_cid.h.

19 months agoREORG: quic: Rename some (quic|qc)_conn* objects to quic_conn_closed
Frédéric Lécaille [Tue, 28 Nov 2023 07:29:12 +0000 (08:29 +0100)] 
REORG: quic: Rename some (quic|qc)_conn* objects to quic_conn_closed

These objects could be confused with the ones defined by the congestion control
part (quic_cc.c).

19 months agoREORG: quic: Move qc_pkt_long() to quic_rx.h
Frédéric Lécaille [Mon, 27 Nov 2023 17:00:25 +0000 (18:00 +0100)] 
REORG: quic: Move qc_pkt_long() to quic_rx.h

This inlined function takes a quic_rx_packet struct as argument unique argument.
Let's move it to QUIC RX part.

19 months agoREORG: quic: Move qc_may_probe_ipktns() to quic_tls.h
Frédéric Lécaille [Mon, 27 Nov 2023 16:28:40 +0000 (17:28 +0100)] 
REORG: quic: Move qc_may_probe_ipktns() to quic_tls.h

This function is in relation with the Initial packet number space which is
more linked to the QUIC TLS specifications. Let's move it to quic_tls.h
to be inlined.

19 months agoREORG: quic: Move quic_build_post_handshake_frames() to quic_conn module
Frédéric Lécaille [Mon, 27 Nov 2023 16:04:32 +0000 (17:04 +0100)] 
REORG: quic: Move quic_build_post_handshake_frames() to quic_conn module

Move quic_build_post_handshake_frames() from quic_rx.c to quic_conn.c. This
is a function which is also called from the TX part (quic_tx.c).

19 months agoREORG: quic: Move qc_handle_conn_migration() to quic_conn.c
Frédéric Lécaille [Mon, 27 Nov 2023 15:56:50 +0000 (16:56 +0100)] 
REORG: quic: Move qc_handle_conn_migration() to quic_conn.c

This function manipulates only quic_conn objects. Its location is definitively
in quic_conn.c.

19 months agoREORG: quic: Move QUIC path definitions/declarations to quic_cc module
Frédéric Lécaille [Mon, 27 Nov 2023 15:50:17 +0000 (16:50 +0100)] 
REORG: quic: Move QUIC path definitions/declarations to quic_cc module

Move quic_path struct from quic_conn-t.h to quic_cc-t.h and rename it to quic_cc_path.
Update the code consequently.
Also some inlined functions in relation with QUIC path to quic_cc.h

19 months agoREORG: quic: Rename some functions used upon ACK receipt
Frédéric Lécaille [Mon, 27 Nov 2023 15:25:53 +0000 (16:25 +0100)] 
REORG: quic: Rename some functions used upon ACK receipt

Rename some functions to reflect more their jobs.
Move qc_release_lost_pkts() to quic_loss.c

19 months agoREORG: quic: Move the QUIC DCID parser to quic_sock.c
Frédéric Lécaille [Mon, 27 Nov 2023 11:01:36 +0000 (12:01 +0100)] 
REORG: quic: Move the QUIC DCID parser to quic_sock.c

Move quic_get_dgram_dcid() from quic_conn.c to quic_sock.c because
only used in this file and define it as static.

19 months agoREORG: quic: Move QUIC SSL BIO method related functions to quic_ssl.c
Frédéric Lécaille [Mon, 27 Nov 2023 10:54:05 +0000 (11:54 +0100)] 
REORG: quic: Move QUIC SSL BIO method related functions to quic_ssl.c

Move __quic_conn_init() and __quic_conn_deinit() from quic_conn.c to quic_ssl.c.

19 months agoREORG: quic: Move several inlined functions from quic_conn.h
Frédéric Lécaille [Mon, 27 Nov 2023 10:34:03 +0000 (11:34 +0100)] 
REORG: quic: Move several inlined functions from quic_conn.h

Move quic_pkt_type(), quic_saddr_cpy(), quic_write_uint32(), max_available_room(),
max_stream_data_size(), quic_packet_number_length(), quic_packet_number_encode()
and quic_compute_ack_delay_us() to quic_tx.c because only used in this file.
Also move quic_ack_delay_ms() and quic_read_uint32() to quic_tx.c because they
are used only in this file.

Move quic_rx_packet_refinc() and quic_rx_packet_refdec() to quic_rx.h header.
Move qc_el_rx_pkts(), qc_el_rx_pkts_del() and qc_list_qel_rx_pkts() to quic_tls.h
header.

19 months agoREORG: quic: Move QUIC CRYPTO stream definitions/declarations to QUIC TLS
Frédéric Lécaille [Mon, 27 Nov 2023 09:30:41 +0000 (10:30 +0100)] 
REORG: quic: Move QUIC CRYPTO stream definitions/declarations to QUIC TLS

Move quic_cstream struct definition from quic_conn-t.h to quic_tls-t.h.
Its pool is also moved from quic_conn module to quic_tls. Same thing for
quic_cstream_new() and quic_cstream_free().

19 months agoREORG: quic: Move CRYPTO data buffer defintions to QUIC TLS module
Frédéric Lécaille [Mon, 27 Nov 2023 09:09:12 +0000 (10:09 +0100)] 
REORG: quic: Move CRYPTO data buffer defintions to QUIC TLS module

Move quic_crypto_buf struct definition from quic_conn-t.h to quic_tls-t.h.
Also move its pool definition/declaration to quic_tls-t.h/quic_tls.c.

19 months agoBUILD: quic: Missing RX header inclusions
Frédéric Lécaille [Mon, 27 Nov 2023 08:10:29 +0000 (09:10 +0100)] 
BUILD: quic: Missing RX header inclusions

Fix such building issues:
   In file included from src/quic_tx.c:15:
        include/haproxy/quic_tx.h:51:23: warning: ‘struct quic_rx_packet’

Do not know why the compiler warns about such missing header inclusions
just now. It should have complained a long time ago during the big QUIC
source code split.

19 months agoREORG: quic: QUIC connection types header cleaning
Frédéric Lécaille [Mon, 27 Nov 2023 08:07:12 +0000 (09:07 +0100)] 
REORG: quic: QUIC connection types header cleaning

Move UDP datagram definitions from quic_conn-t.h to quic_sock-t.h
Move debug quic_rx_crypto_frm struct from quic_conn-t.h to quic_trace-t.h

19 months agoREORG: quic: Add a new module to handle QUIC connection IDs
Frédéric Lécaille [Thu, 23 Nov 2023 18:21:03 +0000 (19:21 +0100)] 
REORG: quic: Add a new module to handle QUIC connection IDs

Move quic_cid and quic_connnection_id from quic_conn-t.h to new quic_cid-t.h header.
Move defintions of quic_stateless_reset_token_init(), quic_derive_cid(),
new_quic_cid(), quic_get_cid_tid() and retrieve_qc_conn_from_cid() to quic_cid.c
new C file.

19 months agoREORG: quic: Move some QUIC CLI code to its C file
Frédéric Lécaille [Thu, 23 Nov 2023 14:57:53 +0000 (15:57 +0100)] 
REORG: quic: Move some QUIC CLI code to its C file

Move init_quic() from quic_conn.c to quic_cli.c and rename it to cli_quic_init().

19 months agoCLEANUP: quic: Remove dead definitions/declarations
Frédéric Lécaille [Thu, 23 Nov 2023 14:50:18 +0000 (15:50 +0100)] 
CLEANUP: quic: Remove dead definitions/declarations

Remove useless definitions and declarations.

19 months agoBUG/MEDIUM: mux-h2: Remove H2_SF_NOTIFIED flag for H2S blocked on fast-forward
Christopher Faulet [Mon, 27 Nov 2023 17:02:16 +0000 (18:02 +0100)] 
BUG/MEDIUM: mux-h2: Remove H2_SF_NOTIFIED flag for H2S blocked on fast-forward

When a H2 stream is blocked during data fast-forwarding, we must take care
to remove H2_SF_NOTIFIED flag. This was only performed when data
fast-forward was attempted. However, if the H2 stream was blocked for any
reason, this flag was not removed. During our tests, we found it was
possible to infinitely block a connection because one of its streams was in
the send_list with the flag set. In this case, the stream was no longer
woken up to resume the sends, blocking all other streams.

No backport needed.

19 months agoBUG/MEDIUM: stconn: Don't perform zero-copy FF if opposite SC is blocked
Christopher Faulet [Mon, 27 Nov 2023 16:56:30 +0000 (17:56 +0100)] 
BUG/MEDIUM: stconn: Don't perform zero-copy FF if opposite SC is blocked

When zero-copy data fast-forwarding is inuse, if the opposite SC is blocked,
there is no reason to try to fast-forward more data. Worst, in some cases,
this can lead to a receive loop of the producer side while the consumer side
is blocked.

No backport needed.

19 months agoBUG/MINOR: quic: fix CONNECTION_CLOSE_APP encoding
Amaury Denoyelle [Tue, 28 Nov 2023 10:23:41 +0000 (11:23 +0100)] 
BUG/MINOR: quic: fix CONNECTION_CLOSE_APP encoding

CONNECTION_CLOSE_APP encoding is broken, which prevents the sending of
every packet with such a frame. This bug was always present in quic
haproxy. However, it was slightly dissimulated by the previous code
which always initialized all frame members to zero, which was sufficient
to ensure CONNECTION_CLOSE_APP encoding was ok. The below patch changes
this behavior by removing this costly initialization step.

  4cf784f38ed20b42f6e71bd8a2e8157b95329ee5
  MINOR: quic: Avoid zeroing frame structures

Now, frames members must always be initialized individually given the
type of frame to used. However, for CONNECTION_CLOSE_APP this was not
done as qc_cc_build_frm() accessed the wrong union member refering to a
CONNECTION_CLOSE instead.

This bug was detected when trying to generate a HTTP/3 error. The
CONNECTION_CLOSE_APP frame encoding failed due to a non-initialized
<reason_phrase_len> which was too big. This was reported by the
following trace :
  "frame building error : qc@0x5555561b86c0 idle_timer_task@0x5555561e5050 flags=0x86038058 CONNECTION_CLOSE_APP"

This must be backported up to 2.6. This is necessary even if above
commit is not as previous code is also buggy, albeit with a different
behavior.

19 months agoOPTIM: mux-h2/zero-copy: don't allocate more buffers per connections than streams
Willy Tarreau [Tue, 28 Nov 2023 08:15:26 +0000 (09:15 +0100)] 
OPTIM: mux-h2/zero-copy: don't allocate more buffers per connections than streams

It's the exact same as commit 0a7ab7067 ("OPTIM: mux-h2: don't allocate
more buffers per connections than streams"), but for the zero-copy case
this time. Previously it was only done on the regular snd_buf() path, but
this one is needed as well. A transfer on 16 parallel streams now consumes
half of the memory, and a single stream consumes much less.

An alternate approach would be worth investigating in the future, based
on the same principle as the CF_STREAMER_FAST at the higher level: in
short, by monitoring how many mux buffers we write at once before refilling
them, we would get an idea of how much is worth keeping in buffers max,
given that anything beyond would just waste memory. Some tests show that
a single buffer already seems almost as good, except for single-stream
transfers, which is why it's worth spending more time on this.

19 months agoMINOR: trace: support -dt optional format
Amaury Denoyelle [Wed, 22 Nov 2023 16:27:57 +0000 (17:27 +0100)] 
MINOR: trace: support -dt optional format

Add an optional argument for "-dt". This argument is interpreted as a
list of several trace statement separated by comma. For each statement,
a specific trace name can be specifed, or none to act on all sources.
Using double-colon separator, it is possible to add specifications on
the wanted level and verbosity.

19 months agoMINOR: trace: parse verbosity in a function
Amaury Denoyelle [Wed, 22 Nov 2023 16:26:24 +0000 (17:26 +0100)] 
MINOR: trace: parse verbosity in a function

This patch is similar to the previous one except that it handles trace
verbosity. Trace source must be specified unless "quiet" is used.

19 months agoMINOR: trace: parse level in a function
Amaury Denoyelle [Wed, 22 Nov 2023 16:25:52 +0000 (17:25 +0100)] 
MINOR: trace: parse level in a function

Extract conversion of level string argument to integer value in a
dedicated internal function trace_parse_level(). This function is used
to for CLI trace parsing and will also be useful for "-dt" process
argument.

19 months agoMINOR: trace: define simple -dt argument
Amaury Denoyelle [Wed, 22 Nov 2023 13:58:59 +0000 (14:58 +0100)] 
MINOR: trace: define simple -dt argument

Add '-dt' haproxy process argument. This will automatically activate all
trace sources on stderr with the error level. This could be useful to
troubleshoot issues such as protocol violations.

19 months agoBUILD: map: fix build warning
Amaury Denoyelle [Mon, 27 Nov 2023 13:49:33 +0000 (14:49 +0100)] 
BUILD: map: fix build warning

<pattern> field pointer of pat_ref_elt structure has been by a
zero-length array. As such, it's now unneeded to check for NULL address
before printing it.

This type conversion was done in the following commit :
  3ac9912837118a81f3291e106ce9a7c4be6c934f
  OPTIM: pattern: save memory and time using ebst instead of ebis

The current patch is mandatory to fix the following GCC warning :
  CC      src/map.o
  src/map.c: In function ‘cli_io_handler_map_lookup’:
  src/map.c:549:54: error: the comparison will always evaluate as ‘true’ for the address of ‘pattern’ will never be NULL [-Werror=address]
  549 |                                         if (pat->ref && pat->ref->pattern)
      |

No need to backport it unless the above commit is.

19 months agoOPTIM: pattern: save memory and time using ebst instead of ebis
Willy Tarreau [Sun, 26 Nov 2023 10:56:08 +0000 (11:56 +0100)] 
OPTIM: pattern: save memory and time using ebst instead of ebis

In the pat_ref_elt struct, the pattern string is stored outside of the
node element, using a pointer to an strdup(). Not only this needlessly
wastes at least 16-24 bytes per entry (8 for the pointer, 8-16 for the
allocator), it also makes the tree descent less efficient since both
the node and the string have to be visited for each layer (hence at least
two cache lines). Let's use an ebmb storage and place the pattern right
at the end of the pat_ref_elt, making it a variable-sized element instead.

The set-map test below jumps from 173 to 182 kreq/s/core, and the memory
usage drops from 356 MB to 324 MB:

  http-request set-map(/dev/null) %[rand(1000000)] 1

This is even more visible with large maps: after loading 16M IP addresses
into a map, the process uses this amount of memory:

  - 3.15 GB with haproxy-2.8
  - 4.21 GB with haproxy-2.9-dev11
  - 3.68 GB with this patch

So that's a net saving of 32 bytes per entry here, which cuts in half the
extra cost of the tree, and loading a large map takes about 20% less time.

19 months agoMINOR: task/profiling: do not record task_drop_running() as a caller
Willy Tarreau [Fri, 24 Nov 2023 15:45:34 +0000 (16:45 +0100)] 
MINOR: task/profiling: do not record task_drop_running() as a caller

Task_drop_running() is used to remove the RUNNING bit and check if
while the task was running it got a new wakeup from itself. Thus
each time task_drop_running() marks itself as a caller, it in fact
removes the previous caller that woke up the task, such as below:

Tasks activity over 10.439 sec till 0.000 sec ago:
  function                      calls   cpu_tot   cpu_avg   lat_tot   lat_avg
  task_run_applet            57895273   6.396m    6.628us   2.733h    170.0us <- run_tasks_from_lists@src/task.c:658 task_drop_running

Better not mark this function as a caller and keep the original one:

Tasks activity over 13.834 sec till 0.000 sec ago:
  function                      calls   cpu_tot   cpu_avg   lat_tot   lat_avg
  task_run_applet            62424582   5.825m    5.599us   5.717h    329.7us <- sc_app_chk_rcv_applet@src/stconn.c:952 appctx_wakeup

19 months agoBUG/MEDIUM: mux-h1: Properly ignore trailers when a content-length is announced
Christopher Faulet [Mon, 27 Nov 2023 07:23:45 +0000 (08:23 +0100)] 
BUG/MEDIUM: mux-h1: Properly ignore trailers when a content-length is announced

It is not possible in H1, but in H2 (and probably H3) it is possible to have
trailers at the end of a message while a Content-Length was announced.

However, depending if the trailers are received with the last HTX DATA block
or the zero-copy forwarding is used or not, an processing error may be
triggered, leading to a 500-internal-error.

To fix the issue, when a content-length is announced and all the payload was
processed, we switch the message to H1_MSG_DONE state only if the
end-of-message was also reported (HTX_FL_EOM flag set). Otherwise, it is
switched to H1_MSG_TRAILERS state to be able to properly ignored the
trailers, if so.

The patch must be backported as far as 2.4. Be careful, this part was highly
refactored. The patch will have to be adapted to be backported.

19 months agoMINOR: mworker/cli: implement hard-reload over the master CLI
William Lallemand [Fri, 24 Nov 2023 20:20:32 +0000 (21:20 +0100)] 
MINOR: mworker/cli: implement hard-reload over the master CLI

The mworker mode never had a proper 'hard-stop' (-st) for the reload,
this is a mode which was commonly used with the daemon mode, but it was
never implemented in mworker mode.

This patch fixes the problem by implementing a "hard-reload" command
over the master CLI. It does the same as the "reload" command, but
instead of waiting for the connections to stop in the previous process,
it immediately quits the previous process after binding.

19 months agoMEDIUM: ssl: use ssl_sock_chose_sni_ctx() in the clienthello callback
William Lallemand [Thu, 23 Nov 2023 16:54:47 +0000 (17:54 +0100)] 
MEDIUM: ssl: use ssl_sock_chose_sni_ctx() in the clienthello callback

This patch removes the code which selects the SSL certificate in the
OpenSSL Client Hello callback, to use the ssl_sock_chose_sni_ctx()
function which does the same.

The bigger part of the function which remains is the extraction of the
servername, ciphers and sigalgs, because it's done manually by parsing
the TLS extensions.

This is not supposed to change anything functionally.

19 months agoMINOR: ssl: move certificate selection in a dedicate function
William Lallemand [Thu, 23 Nov 2023 15:35:52 +0000 (16:35 +0100)] 
MINOR: ssl: move certificate selection in a dedicate function

The certificate selection used in the WolfSSL cert_cb and in the OpenSSL
clienthello callback is the same, the function was duplicate to achieve
the same.

This patch move the selection code to a common function called
ssl_sock_chose_sni_ctx().

The servername string is still lowered in the callback, however the
search for the first dot in the string (wildp) is done in
ssl_sock_chose_sni_ctx()

The function uses the same certificate selection algorithm as before, it
needs to know if you need rsa or ecdsa, the bind_conf to achieve the
lookup, and the servername string.

This patch moves the code for WolSSL only.

19 months agoMINOR: ssl: replace 'trash.area' by 'servername' in ssl_sock_switchctx_cbk()
William Lallemand [Fri, 24 Nov 2023 18:20:28 +0000 (19:20 +0100)] 
MINOR: ssl: replace 'trash.area' by 'servername' in ssl_sock_switchctx_cbk()

Replace 'trash.area' by 'servername' for more readibility.

19 months agoMEDIUM: ssl: implement rsa/ecdsa selection with WolfSSL
William Lallemand [Thu, 16 Nov 2023 17:16:53 +0000 (18:16 +0100)] 
MEDIUM: ssl: implement rsa/ecdsa selection with WolfSSL

PR https://github.com/wolfSSL/wolfssl/pull/6963 implements primitives to
extract ciphers and algorithm signatures.

It allows to chose a certificate depending on the sigals and
ciphers presented by the client (RSA or ECDSA).

Since WolfSSL does not implement the clienthello callback, the patch
uses the certificate callback (SSL_CTX_set_cert_cb())

The callback is inspired by our clienthello callback, however the
extraction of client ciphers and sigalgs is simpler,
wolfSSL_get_sigalg_info() and wolfSSL_get_ciphersuite_info() are used.

This is not enabled by default yet as the PR was not merged.

19 months agoDOC: lua: add "syslog" to Proxy.get_mode() output
Aurelien DARRAGON [Thu, 23 Nov 2023 15:12:23 +0000 (16:12 +0100)] 
DOC: lua: add "syslog" to Proxy.get_mode() output

Following previous commit: in this patch we add the "syslog" output as
possible return value for Proxy.get_mode() function since log backend
may now be enumerated from lua with 9a74a6c ("MAJOR: log: introduce log
backends")

19 months agoDOC: lua: fix Proxy.get_mode() output
Aurelien DARRAGON [Thu, 23 Nov 2023 15:02:14 +0000 (16:02 +0100)] 
DOC: lua: fix Proxy.get_mode() output

Proxy.get_mode() function internally relies on proxy_mode_str() to return
the proxy mode. The current function description is exhaustive about the
possible outputs for the function. I can't tell if it's relevant or not
but it's subject to changes. Here it is the case, the documentation
indicates that "health" mode may be returned, which cannot happen
since 77e0daef9 ("MEDIUM: proxy: remove obsolete "mode health"").

This should be backported up to 2.4

19 months agoDOC: lua: add sticktable class reference from Proxy.stktable
Aurelien DARRAGON [Thu, 23 Nov 2023 12:47:54 +0000 (13:47 +0100)] 
DOC: lua: add sticktable class reference from Proxy.stktable

Add a reference hint for the sticktable class and mention it from
Proxy.stktable documentation to allow easy navigation from a web
browser.

19 months agoREGTESTS: connection: disable http_reuse_be_transparent.vtc if !TPROXY
Aurelien DARRAGON [Thu, 23 Nov 2023 08:23:30 +0000 (09:23 +0100)] 
REGTESTS: connection: disable http_reuse_be_transparent.vtc if !TPROXY

http_reuse_be_transparent.vtc relies on "transparent" proxy option which
is guarded by the USE_TPROXY ifdef at multiple places in the code.

Hence, executing the above test when haproxy was compiled without the
USE_TPROXY feature (ie: generic target) results in this kind of error:

  ***  h1    debug|[NOTICE]   (1189756) : haproxy version is 2.9-dev1-8fc21e-807
  ***  h1    debug|[NOTICE]   (1189756) : path to executable is ./haproxy
  ***  h1    debug|[ALERT]    (1189756) : config : parsing [/tmp/vtc.1189751.18665e7b/h1/cfg:11]: option 'transparent' is not supported due to build options.
  ***  h1    debug|[ALERT]    (1189756) : config : Error(s) found in configuration file : /tmp/vtc.1189751.18665e7b/h1/cfg

Now we skip the regtest if TPROXY feature is missing.

19 months agoDOC: config: fix timeout check inheritance restrictions
Aurelien DARRAGON [Tue, 21 Nov 2023 09:35:52 +0000 (10:35 +0100)] 
DOC: config: fix timeout check inheritance restrictions

In 6e0425b718 ("DOC: config: Add documentation about TCP/HTTP rules in
defaults section") an error was made: the restriction note about the
setting not being inherited from anonymous default section was added
by mistake in the "timeout check" documentation. But it is wrong,
"timeout check" behaves like other "timeout" directives for proxy
sections.

This should be backported up to 2.6.