]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
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.

19 months agoDOC: config: specify supported sections for "max-session-srv-conns"
Aurelien DARRAGON [Mon, 20 Nov 2023 16:53:36 +0000 (17:53 +0100)] 
DOC: config: specify supported sections for "max-session-srv-conns"

There was no info about supported sections for "max-session-srv-conns"
proxy directive. A quick look at the code tells us that it may be used
in proxies with the FE capability set.

19 months agoMINOR: log/balance: set lbprm tot_weight on server on queue/dequeue
Aurelien DARRAGON [Tue, 21 Nov 2023 12:19:12 +0000 (13:19 +0100)] 
MINOR: log/balance: set lbprm tot_weight on server on queue/dequeue

Maintain proper px->lbprm.tot_weight for log backends. server's weight is
considered as 1 as long as the server is usable.

This will allow the stats page to correctly display the proxy status since
the check currently relies on proxy's lbprm.tot_weight variable.

19 months agoMINOR: log/backend: prevent "use-server" rules use with LOG mode
Aurelien DARRAGON [Thu, 23 Nov 2023 15:40:19 +0000 (16:40 +0100)] 
MINOR: log/backend: prevent "use-server" rules use with LOG mode

server_rules declared using "use-server" keyword within a proxy are not
supported inside a log backend (with "mode log" set), so we report a
warning to the user and reset the setting.

19 months agoMINOR: proxy: add free_server_rules() helper function
Aurelien DARRAGON [Thu, 23 Nov 2023 15:27:45 +0000 (16:27 +0100)] 
MINOR: proxy: add free_server_rules() helper function

Take the px->server_rules freeing part out of free_proxy() and make it
a dedicated helper function so that it becomes possible to use it from
anywhere.

19 months agoMINOR: proxy: add free_logformat_list() helper function
Aurelien DARRAGON [Thu, 23 Nov 2023 16:30:10 +0000 (17:30 +0100)] 
MINOR: proxy: add free_logformat_list() helper function

There are multiple places inside free_proxy() where we need to perform
the exact same operation: freeing a logformat list which includes freeing
every member.

To prevent code duplication, we add the free_logformat_list() function
that takes such list as parameter and does all the freeing job on its
own.

19 months agoRevert "MINOR: cfgparse-listen: warn when use-server rules is used in wrong mode"
Aurelien DARRAGON [Thu, 23 Nov 2023 15:15:10 +0000 (16:15 +0100)] 
Revert "MINOR: cfgparse-listen: warn when use-server rules is used in wrong mode"

This reverts commit 5884e46ec8c8231e73c68e1bdd345c75c9af97a0 since we
cannot perform the test during parsing as the effective proxy mode is
not yet known.

19 months agoMINOR: backend: remove invalid mode test for "hash-balance-factor"
Aurelien DARRAGON [Mon, 20 Nov 2023 10:33:20 +0000 (11:33 +0100)] 
MINOR: backend: remove invalid mode test for "hash-balance-factor"

This is a leftover from 1e0093a317 ("MINOR: backend/balance: "balance"
requires TCP or HTTP mode").

Indeed, we cannot perform the test during parsing as the effective proxy
type is not yet known. Moreover, thanks to b61147fd ("MEDIUM: log/balance:
merge tcp/http algo with log ones") we could potentially benefit from
this setting even in log mode, but for now it is ignored by all log
compatible load-balancing algorithms.

19 months agoMINOR: server/ip: centralize server ip updates
Aurelien DARRAGON [Mon, 13 Nov 2023 15:42:56 +0000 (16:42 +0100)] 
MINOR: server/ip: centralize server ip updates

Add a new helper function named _srv_update_inetaddr() to centralize ip
addr and port updates during runtime.

19 months agoMINOR: tools: use const for read only pointers in ip{cmp,cpy}
Aurelien DARRAGON [Mon, 13 Nov 2023 13:12:04 +0000 (14:12 +0100)] 
MINOR: tools: use const for read only pointers in ip{cmp,cpy}

In this patch we fix the prototype for ipcmp() and ipcpy() functions so
that input pointers that are used exclusively for reads are used as const
pointers. This way, the compiler can safely assume that those variables
won't be altered by the function.

19 months agoMINOR: server/event_hdl: add SERVER_INETADDR event
Aurelien DARRAGON [Fri, 10 Nov 2023 19:12:00 +0000 (20:12 +0100)] 
MINOR: server/event_hdl: add SERVER_INETADDR event

In this patch we add the support for a new SERVER event in the
event_hdl API.

SERVER_INETADDR is implemented as an advanced server event.
It is published each time the server's ip address or port is
about to change. (ie: from the cli, dns, lua...)

SERVER_INETADDR data is an event_hdl_cb_data_server_inetaddr struct
that provides additional info related to the server inet addr change,
but can be casted as a regular event_hdl_cb_data_server struct if
additional info is not needed.

19 months agoDOC: config: removing "log-balance" references
Aurelien DARRAGON [Tue, 21 Nov 2023 10:28:26 +0000 (11:28 +0100)] 
DOC: config: removing "log-balance" references

"log-balance" keyword was removed by b61147f ("MEDIUM: log/balance: merge
tcp/http algo with log ones") but it was still documented.

Removing "log-balance" references in the documentation where needed.

19 months agoBUG/MINOR: global: Fix tune.disable-(fast-forward/zero-copy-forwarding) options
Christopher Faulet [Fri, 24 Nov 2023 08:23:04 +0000 (09:23 +0100)] 
BUG/MINOR: global: Fix tune.disable-(fast-forward/zero-copy-forwarding) options

These options were not properly handled during configration parsing. A wrong
bitwise operation was used.

No backport needed.

19 months ago[RELEASE] Released version 2.9-dev11 v2.9-dev11
Willy Tarreau [Fri, 24 Nov 2023 07:14:31 +0000 (08:14 +0100)] 
[RELEASE] Released version 2.9-dev11

Released version 2.9-dev11 with the following main changes :
    - BUG/MINOR: startup: set GTUNE_SOCKET_TRANSFER correctly
    - BUG/MINOR: sock: mark abns sockets as non-suspendable and always unbind them
    - BUILD: cache: fix build error on older compilers
    - BUG/MAJOR: quic: complete thread migration before tcp-rules
    - BUG/MEDIUM: quic: Possible crash for connections to be killed
    - MINOR: quic: remove unneeded QUIC specific stopping function
    - MINOR: acl: define explicit HTTP_3.0
    - DEBUG: connection/flags: update flags for reverse HTTP
    - BUILD: log: silence a build warning when threads are disabled
    - MINOR: quic: Add traces to debug frames handling during retransmissions
    - BUG/MEDIUM: quic: Possible crash during retransmissions and heavy load
    - BUG/MINOR: quic: Possible leak of TX packets under heavy load
    - BUG/MINOR: quic: Possible RX packet memory leak under heavy load
    - BUG/MINOR: server: do not leak default-server in defaults sections
    - DEBUG: tinfo: store the pthread ID and the stack pointer in tinfo
    - MINOR: debug: start to create a new struct post_mortem
    - MINOR: debug: add OS/hardware info to the post_mortem struct
    - MINOR: debug: report in port_mortem whether a container was detected
    - MINOR: debug: report in post_mortem if the container techno used is docker
    - MINOR: debug: detect CPU model and store it in post_mortem
    - MINOR: debug: report any detected hypervisor in post_mortem
    - MINOR: debug: collect some boot-time info related to the process
    - MINOR: debug: copy the thread info into the post_mortem struct
    - MINOR: debug: dump the mapping of the libs into post_mortem
    - MINOR: debug: add the ability to enter components in the post_mortem struct
    - MINOR: init: add info about the main program to the post_mortem struct
    - DOC: management: document "show dev"
    - CLEANUP: assorted typo fixes in the code and comments
    - CI: limit codespell checks to main repo, not forks
    - DOC: 51d: updated 51Degrees repo URL for v3.2.10
    - DOC: install: update the list of openssl versions
    - MINOR: ext-check: add an option to preserve environment variables
    - BUG/MEDIUM: mux-h1: Don't set CO_SFL_MSG_MORE flag on last fast-forward send
    - MINOR: rhttp: rename proto_reverse_connect
    - MINOR: rhttp: large renaming to use rhttp prefix
    - MINOR: rhttp: add count of active conns per thread
    - MEDIUM: rhttp: support multi-thread active connect
    - MINOR: listener: allow thread kw for rhttp bind
    - DOC: rhttp: replace maxconn by nbconn
    - MINOR: log/balance: rename "log-sticky" to "sticky"
    - MEDIUM: mux-quic: Add consumer-side fast-forwarding support
    - MAJOR: h3: Implement zero-copy support to send DATA frame

19 months agoMAJOR: h3: Implement zero-copy support to send DATA frame
Christopher Faulet [Fri, 27 Oct 2023 14:41:58 +0000 (16:41 +0200)] 
MAJOR: h3: Implement zero-copy support to send DATA frame

When possible, we try send DATA frame without copying data. To do so, we
swap the input buffer with QCS tx buffer. It is only possible iff:

 * There is only one HTX block of data at the beginning of the message
 * Amount of data to send is equal to the size of the HTX data block
 * The QCS tx buffer is empty

In this case, both buffers are swapped. The frame metadata are written at
the begining of the buffer, before data and where the HTX structure is
stored.

19 months agoMEDIUM: mux-quic: Add consumer-side fast-forwarding support
Christopher Faulet [Fri, 27 Oct 2023 13:48:13 +0000 (15:48 +0200)] 
MEDIUM: mux-quic: Add consumer-side fast-forwarding support

The QUIC multiplexer now implements callbacks to consume fast-forwarded
data. It relies on the H3 stack to acquire the buffer and format the frame.

19 months agoMINOR: log/balance: rename "log-sticky" to "sticky"
Willy Tarreau [Thu, 23 Nov 2023 17:19:41 +0000 (18:19 +0100)] 
MINOR: log/balance: rename "log-sticky" to "sticky"

After giving it some thought, it could pretty well happen that other
protocols benefit from the sticky algorithm that some used to emulate
using a "stick-on int(0)" or things like this previously. So better
rename it to "sticky" right now instead of having to keep that "log-"
prefix forever. It's still limited to logs, of course, only the algo
is renamed in the config.

19 months agoDOC: rhttp: replace maxconn by nbconn
Amaury Denoyelle [Thu, 23 Nov 2023 16:37:26 +0000 (17:37 +0100)] 
DOC: rhttp: replace maxconn by nbconn

Usage of existing "maxconn" for rhttp listeners configuration was
replaced recently by a new dedicating "nbconn" keyword. Update the
documentation part to reflect this.

No need to backport.

19 months agoMINOR: listener: allow thread kw for rhttp bind
Amaury Denoyelle [Thu, 23 Nov 2023 16:31:05 +0000 (17:31 +0100)] 
MINOR: listener: allow thread kw for rhttp bind

Thanks to previous commit, a reverse HTTP listener is able to distribute
actively opened connections accross its threads. To be able to exploit
this, allow "thread" keyword for such a listener.

An extra check is added to explicitely forbids a reverse bind to span
multiple thread groups. Without this, multiple listeners instances will
be created, each with its owned "nbconn" value. This may surprise users
so for now, better to deactivate this possibility.

19 months agoMEDIUM: rhttp: support multi-thread active connect
Amaury Denoyelle [Wed, 22 Nov 2023 17:02:37 +0000 (18:02 +0100)] 
MEDIUM: rhttp: support multi-thread active connect

Implement support for active HTTP reverse task migration on listener
threads. This operation is done each time a new reversable connection
will be instantiated. Instead of directly allocate the connection, a
lookup is done among all the listener threads.

A comparison is done to select the thread with the smallest number of
current reverse connection. If the thread found is different from the
current one, the connection allocation is delayed and the task
rescheduled on the chosen thread. The connection will then be created
and pinned on the new thread. This mechanisms allows to balance reverse
HTTP connections accross different threads.

Note that rhttp_set_affinity is still defined to disable thread
migration on accept. This is necessary as it's unsafe to move an
existing connection to another thread. However, active reverse task
migration should be sufficient to distribute connections accross several
threads. Better than that, this design allows to differentiate standard
frontend and reversable connections. The latest are designed to be
long-lived so it's useful to have their repartition solely based on
others reversed connections.

19 months agoMINOR: rhttp: add count of active conns per thread
Amaury Denoyelle [Wed, 22 Nov 2023 16:55:58 +0000 (17:55 +0100)] 
MINOR: rhttp: add count of active conns per thread

Add a new member <nb_rhttp_conns> in thread_ctx structure. Its purpose
is to count the current number of opened reverse HTTP connections
regarding from their listeners membership.

This patch will be useful to support multi-thread for active reverse
HTTP, in order to select the less loaded thread.

Note that despite access to <nb_rhttp_conns> are only done by the
current thread, atomic operations are used. This is because once
multi-thread support will be added, external threads will also retrieve
values from others.

19 months agoMINOR: rhttp: large renaming to use rhttp prefix
Amaury Denoyelle [Tue, 21 Nov 2023 10:10:34 +0000 (11:10 +0100)] 
MINOR: rhttp: large renaming to use rhttp prefix

Previous commit renames 'proto_reverse_connect' module to 'proto_rhttp'.
This commits follows this by replacing various custom prefix by 'rhttp_'
to make the code uniform.

Note that 'reverse_' prefix was kept in connection module. This is
because if a new reversable protocol not based on HTTP is implemented,
it may be necessary to reused the same connection function which are
protocol agnostic.

19 months agoMINOR: rhttp: rename proto_reverse_connect
Amaury Denoyelle [Tue, 21 Nov 2023 09:41:06 +0000 (10:41 +0100)] 
MINOR: rhttp: rename proto_reverse_connect

This commit is renaming of module proto_reverse_connect to proto_rhttp.
This name is selected as it is shorter and more precise.

19 months agoBUG/MEDIUM: mux-h1: Don't set CO_SFL_MSG_MORE flag on last fast-forward send
Christopher Faulet [Thu, 23 Nov 2023 16:26:26 +0000 (17:26 +0100)] 
BUG/MEDIUM: mux-h1: Don't set CO_SFL_MSG_MORE flag on last fast-forward send

In the mux-to-mux fast-forwarding, when end-of-input is reached on the producer
side, the consumer side must not set the CO_SFL_MSG_MORE flag on send. It means
the H1C_F_CO_MSG_MORE flag must be removed from the H1 connection.

No backport needed.

19 months agoMINOR: ext-check: add an option to preserve environment variables
Willy Tarreau [Thu, 23 Nov 2023 15:48:48 +0000 (16:48 +0100)] 
MINOR: ext-check: add an option to preserve environment variables

In Github issue #2128, @jvincze84 explained the complexity of using
external checks in some advanced setups due to the systematic purge of
environment variables, and expressed the desire to preserve the
existing environment. During the discussion an agreement was found
around having an option to "external-check" to do that and that
solution was tested and confirmed to work by user @nyxi.

This patch just cleans this up, implements the option as
"preserve-env" and documents it. The default behavior does not change,
the environment is still purged, unless "preserve-env" is passed. The
choice of not using "import-env" instead was made so that we could
later use it to name specific variables that have to be imported
instead of keeping the whole environment.

The patch is simple enough that it could be backported if needed (and
was in fact tested on 2.6 first).

19 months agoDOC: install: update the list of openssl versions
Willy Tarreau [Thu, 23 Nov 2023 15:29:42 +0000 (16:29 +0100)] 
DOC: install: update the list of openssl versions

3.2-final still builds without warnings and works at first glance, so
let's update the list of versions in the INSTALL file.

19 months agoDOC: 51d: updated 51Degrees repo URL for v3.2.10
Eugene Dorfman [Mon, 20 Nov 2023 19:41:48 +0000 (20:41 +0100)] 
DOC: 51d: updated 51Degrees repo URL for v3.2.10

The v3.2.10 branch has been migrated from the legacy git.51Degrees.com
repo to github.com.  The files on the frozen branch are exactly the same.

19 months agoCI: limit codespell checks to main repo, not forks
Ilya Shipitsin [Tue, 21 Nov 2023 18:54:17 +0000 (19:54 +0100)] 
CI: limit codespell checks to main repo, not forks

19 months agoCLEANUP: assorted typo fixes in the code and comments
Ilya Shipitsin [Tue, 21 Nov 2023 18:54:16 +0000 (19:54 +0100)] 
CLEANUP: assorted typo fixes in the code and comments

This is 37th iteration of typo fixes

19 months agoDOC: management: document "show dev"
Willy Tarreau [Thu, 23 Nov 2023 14:34:25 +0000 (15:34 +0100)] 
DOC: management: document "show dev"

Explain what "show dev" is used for and provide an example of output.

19 months agoMINOR: init: add info about the main program to the post_mortem struct
Willy Tarreau [Thu, 23 Nov 2023 10:32:24 +0000 (11:32 +0100)] 
MINOR: init: add info about the main program to the post_mortem struct

This way we'll still have haproxy's version, build options etc in core
dumps and centralized all at once.

19 months agoMINOR: debug: add the ability to enter components in the post_mortem struct
Willy Tarreau [Thu, 23 Nov 2023 10:25:34 +0000 (11:25 +0100)] 
MINOR: debug: add the ability to enter components in the post_mortem struct

Here the idea is to collect components' versions and build options. The
main component is haproxy, but the API is made so that any sub-system
can easily add a component there (for example the detailed version of a
device detection lib, or some info about a lib loaded from Lua).

The elements are stored as a pointer to an array of structs and its count
so that it's sufficient to issue this in gdb to list them all at once:

  print *post_mortem.components@post_mortem.nb_components

For now we collect name, version, toolchain, toolchain options, build
options and path. Maybe more could be useful in the future.

19 months agoMINOR: debug: dump the mapping of the libs into post_mortem
Willy Tarreau [Thu, 23 Nov 2023 07:26:52 +0000 (08:26 +0100)] 
MINOR: debug: dump the mapping of the libs into post_mortem

Having the libs and their addresses listed in the post_mortem struct
is also helpful. Sometimes it helps notice that one version is not the
expected one, e.g. due to some LD_LIBRARY_PATH. We don't emit it on
"show dev" however since that's already available via "show libs".

19 months agoMINOR: debug: copy the thread info into the post_mortem struct
Willy Tarreau [Wed, 22 Nov 2023 17:30:19 +0000 (18:30 +0100)] 
MINOR: debug: copy the thread info into the post_mortem struct

The last starting thread now copies the pthread ID and stack top of
each thread into post_mortem. That way it's as easy as issuing
"p post_mortem" in gdb to see all thread IDs and stack frames and more
easily map them to the threads met in a core.

19 months agoMINOR: debug: collect some boot-time info related to the process
Willy Tarreau [Wed, 22 Nov 2023 14:37:57 +0000 (15:37 +0100)] 
MINOR: debug: collect some boot-time info related to the process

Here we collect the original uid/gid/rlimits for FD and RAM since these
ones do affect behavior and are sometimes different from expected in
containers or when starting as a service.

19 months agoMINOR: debug: report any detected hypervisor in post_mortem
Willy Tarreau [Wed, 22 Nov 2023 11:04:02 +0000 (12:04 +0100)] 
MINOR: debug: report any detected hypervisor in post_mortem

When the x86 CPU flags show the "hypervisor" flag, we know we're running
inside QEMU, VMware or possibly other flavors of hypervisors. In this
case we'll report either "qemu", "vmware" or "yes" for other ones in
the "virt_techno" field, based on the DMI hardware vendor name,
otherwise "no" when the flag is not found.

19 months agoMINOR: debug: detect CPU model and store it in post_mortem
Willy Tarreau [Wed, 22 Nov 2023 10:55:22 +0000 (11:55 +0100)] 
MINOR: debug: detect CPU model and store it in post_mortem

The CPU model and type has significant impact on certain bugs, such
as contention issues caused by CPUs having split L3 caches, or stricter
memory models that exhibit some barrier issues. It's complicated though
because the info about the model depends on the arch. For example, x86
reports an SKU name while ARM rather reports the CPU core types, families
and versions for each CPU core. There, the SoC will sometimes be reported
in the device tree or DMI info instead. But we don't really care, it's
essentially useful to know if the code is running on an armv8.0 such as
A53, a 8.2 such as A55/A76/Neoverse etc. For MIPS the model appears to
generally be there, and in addition the SoC is often present in the
"system type" field before the first CPU, and the type of machine in the
"machine" field, to replace the missing DMI and DT, so they are also
collected. Note that only the first CPU is checked and reported, that's
expected to be vastly sufficient, since we're just trying to spot known
incompatibilities or issues.

19 months agoMINOR: debug: report in post_mortem if the container techno used is docker
Willy Tarreau [Wed, 22 Nov 2023 10:48:23 +0000 (11:48 +0100)] 
MINOR: debug: report in post_mortem if the container techno used is docker

If we detect we're running inside a container on Linux, let's check if
it seems to be docker. Docker usually creates a /.dockerenv file, which
is easy to check. It's uncertain whether it's always the case, but on the
few tested instances that was true, and we don't really care, what matters
is to place helpful debugging info for developers. When this file is
detected, we report "docker" instead of "yes" in the container techno.

19 months agoMINOR: debug: report in port_mortem whether a container was detected
Willy Tarreau [Wed, 22 Nov 2023 10:37:37 +0000 (11:37 +0100)] 
MINOR: debug: report in port_mortem whether a container was detected

Containers often cause significant trouble depending on how they're
set up, and they're not always trivial for their users to extract info
from. Here we're trying to detect if we're running inside a container
on Linux. There are plenty of approaches and none is perfectly clean
nor reliable, which makes sense since the goal is to remain transparent
enough.

One interesting approach is to rely on the observation that containers
generally do not expose most kernel threads, and that the very firsts
of them are extremely stable across all kernel versions: pid 2 was
called "keventd" in kernel 2.4, became "kthreadd" in kernel 2.6, and
has since not changed. This is true on all architectures tested, even
with highly stripped down kernels such as those found on 15 year-old
OpenWRT images. And this one doesn't appear inside containers. Thus
here we check if we find such a thread via /proc and whether it's
called keventd or kthreadd, to detect a container, and we set the
"cont_techno" variable to "yes" or "no" depending on what is found.

19 months agoMINOR: debug: add OS/hardware info to the post_mortem struct
Willy Tarreau [Wed, 22 Nov 2023 10:32:51 +0000 (11:32 +0100)] 
MINOR: debug: add OS/hardware info to the post_mortem struct

Let's extract some info about the system (board model, vendor etc),
this will indicate some hypervisors, some cloud instances or some
uncommon embedded boards etc. Typically, vmware, qemu and raspberry-pi
are visible here and can help during the troubleshooting session.

19 months agoMINOR: debug: start to create a new struct post_mortem
Willy Tarreau [Wed, 22 Nov 2023 10:28:06 +0000 (11:28 +0100)] 
MINOR: debug: start to create a new struct post_mortem

The goal here is to accumulate precious debugging information in a
struct that is easy to find in memory. It's aligned to 256-byte as
it also helps. We'll progressively add a lot of info about the
startup conditions, the operating system, the hardware and hypervisor
so as to limit the number of round trips between developers and users
during debugging sessions. Also, opening a core file with an hex editor
should often be sufficient to extract most of the info.

In addition, a new "show dev" command will show these information so
that they can be checked at runtime without having to wait for a crash
(e.g. if a limit is bad in a container, better know it early).

For now the struct only contains utsname that's fed at boot time.

19 months agoDEBUG: tinfo: store the pthread ID and the stack pointer in tinfo
Willy Tarreau [Wed, 22 Nov 2023 17:01:25 +0000 (18:01 +0100)] 
DEBUG: tinfo: store the pthread ID and the stack pointer in tinfo

When debugging a core, it's difficult to match a given gdb thread number
against an internal thread. Let's just store the pthread ID and the stack
pointer in each tinfo. This could help in the future by allowing to just
glance over them and pick the right one depending what info is found
first.

19 months agoBUG/MINOR: server: do not leak default-server in defaults sections
Willy Tarreau [Thu, 23 Nov 2023 13:28:14 +0000 (14:28 +0100)] 
BUG/MINOR: server: do not leak default-server in defaults sections

When a default-server directive is used in a defaults section, it's never
freed and the "defaults" proxy gets reset without freeing the fields from
that default-server. Normally there are no allocation there, except for
the config file location stored in srv->conf.file form an strdup() since
commit 9394a9444 ("REORG: server: move alert traces in parse_server")
that appeared in 2.4. In addition, if a "default-server" directive
appears multiple times in a defaults section, one more entry will be
leaked per call.

This commit addresses this by checking that we don't overwrite the file
upon multiple calls, and by clearing it when resetting the default proxy.
This should be backported to 2.4.

19 months agoBUG/MINOR: quic: Possible RX packet memory leak under heavy load
Frédéric Lécaille [Wed, 22 Nov 2023 15:29:08 +0000 (16:29 +0100)] 
BUG/MINOR: quic: Possible RX packet memory leak under heavy load

This bug could be reproduced with -dMfail and h2load generating plenty of connections.
A "show pools" CLI command showed that some memory in relation with RX packet pool
was never release. Furthermore, adding a RX packet counter to each connection
and a BUG_ON() in quic_conn_release() has proved that this unreleased memory
was in relation with RX packet which were not linked to a connection.

The responsible is quic_dgram_parse() which does not release some RX packet
memory before exiting after the connection thread affinity has changed.

Must be backported as far as 2.7.

19 months agoBUG/MINOR: quic: Possible leak of TX packets under heavy load
Frédéric Lécaille [Wed, 22 Nov 2023 13:57:28 +0000 (14:57 +0100)] 
BUG/MINOR: quic: Possible leak of TX packets under heavy load

This bug could be reproduced with -dMfail and detected added a counter of TX packet
to the QUIC connection. When released calling quic_conn_release() the connection
should have a null counter of TX packets. This was not always the case.
This could occur during the handshake step: a first packet was built, then another
one should have followed in the same datagram, but fail due to a memory allocation
issue. As the datagram length and first TX packet were not written in the TX
buffer, this latter could not really be purged by qc_purge_tx_buf() even if
called. This bug occured only when building coalesced packets in the same datagram.

To fix this, write the packet information (datagram length and first packet
address) in the TX buffer before purging it.

Must be backported as far as 2.6.

19 months agoBUG/MEDIUM: quic: Possible crash during retransmissions and heavy load
Frédéric Lécaille [Tue, 21 Nov 2023 19:31:32 +0000 (20:31 +0100)] 
BUG/MEDIUM: quic: Possible crash during retransmissions and heavy load

This bug could be reproduced with -dMfail and dectected by libasan as follows:

$ ASAN_OPTIONS=disable_coredump=0:unmap_shadow_on_exit=1:abort_on_error=f quic-freeze.cfg -dMfail -dMno-cache -dM0x55
=================================================================
==82989==ERROR: AddressSanitizer: stack-use-after-scope on address 0x7ffc 0x560790cc4749 bp 0x7fff8e0e8e30 sp 0x7fff8e0e8e28
WRITE of size 8 at 0x7fff8e0ea338 thread T0
    #0 0x560790cc4748 in qc_frm_free src/quic_frame.c:1222
    #1 0x560790cc5260 in qc_release_frm src/quic_frame.c:1261
    #2 0x560790d1de99 in qc_treat_acked_tx_frm src/quic_rx.c:312
    #3 0x560790d1e708 in qc_ackrng_pkts src/quic_rx.c:370
    #4 0x560790d22a1d in qc_parse_ack_frm src/quic_rx.c:694
    #5 0x560790d25daa in qc_parse_pkt_frms src/quic_rx.c:988
    #6 0x560790d2a509 in qc_treat_rx_pkts src/quic_rx.c:1373
    #7 0x560790c72d45 in quic_conn_io_cb src/quic_conn.c:906
    #8 0x560791207847 in run_tasks_from_lists src/task.c:596
    #9 0x5607912095f0 in process_runnable_tasks src/task.c:876
    #10 0x560791135564 in run_poll_loop src/haproxy.c:2966
    #11 0x5607911363af in run_thread_poll_loop src/haproxy.c:3165
    #12 0x56079113938c in main src/haproxy.c:3862
    #13 0x7f92606edd09 in __libc_start_main ../csu/libc-start.c:308
    #14 0x560790bcd529 in _start (/home/flecaille/src/haproxy/haproxy+0x

Address 0x7fff8e0ea338 is located in stack of thread T0 at offset 1032 i
    #0 0x560790d29b52 in qc_treat_rx_pkts src/quic_rx.c:1341

  This frame has 2 object(s):
    [32, 48) 'ar' (line 1380)
    [64, 1088) '_msg' (line 1368) <== Memory access at offset 1032 is inable
HINT: this may be a false positive if your program uses some custom stacnism, swapcontext or vfork
      (longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-use-after-scope src/quic_frame.c:1222 i
Shadow bytes around the buggy address:
  0x100071c15410: f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8
  0x100071c15420: f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8
  0x100071c15430: f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8
  0x100071c15440: f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8
  0x100071c15450: f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8
=>0x100071c15460: f8 f8 f8 f8 f8 f8 f8[f8]f8 f8 f8 f8 f8 f8 f3 f3
  0x100071c15470: f3 f3 f3 f3 f3 f3 f3 f3 f3 f3 f3 f3 f3 f3 00 00
  0x100071c15480: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100071c15490: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100071c154a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100071c154b0: 00 00 00 00 00 00 00 00 f1 f1 f1 f1 04 f3 f3 f3
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==82989==ABORTING
AddressSanitizer:DEADLYSIGNAL
AddressSanitizer:DEADLYSIGNAL
AddressSanitizer:DEADLYSIGNAL
AddressSanitizer:DEADLYSIGNAL
AddressSanitizer:DEADLYSIGNAL
AddressSanitizer:DEADLYSIGNAL
Aborted (core dumped)

Note that a coredump could not always be produced with all compilers. This was
always the case with clang 11.

When allocating frames to be retransmitted from qc_dgrams_retransmit(), if they
could not be sent for any reason, they could remain attached to a local list to
qc_dgrams_retransmit() and trigger a crash with libasan when releasing the
original frames they were duplicated from.

To fix this, always release the frames which could not be sent during
retransmissions calling qc_free_frm_list() where needed.

Must be backported as far as 2.6.

19 months agoMINOR: quic: Add traces to debug frames handling during retransmissions
Frédéric Lécaille [Wed, 22 Nov 2023 09:04:59 +0000 (10:04 +0100)] 
MINOR: quic: Add traces to debug frames handling during retransmissions

This is really boring to not know why some retransmissions could not be done
from qc_prep_hpkts() which allocates frames, prepare packets and send them.
Especially to not know about if frames are not remaining allocated and
attached to list on the stack. This patch already helped in diagnosing
such an issue during "-dMfail" tests.

19 months agoBUILD: log: silence a build warning when threads are disabled
Willy Tarreau [Mon, 20 Nov 2023 18:30:42 +0000 (19:30 +0100)] 
BUILD: log: silence a build warning when threads are disabled

Building without threads emits two warnings because the proxy pointer
is no longer used (only serves for the lock) since 2.9 commit 9a74a6cb1
("MAJOR: log: introduce log backends"). No backport is needed.

19 months agoDEBUG: connection/flags: update flags for reverse HTTP
Amaury Denoyelle [Fri, 17 Nov 2023 15:23:43 +0000 (16:23 +0100)] 
DEBUG: connection/flags: update flags for reverse HTTP

Add missing CO_FL_REVERSED and CO_FL_ACT_REVERSING flag definitions in
conn_show_flags(). These flags were introduced in this release with
reverse HTTP support.

No need to backport

19 months agoMINOR: acl: define explicit HTTP_3.0
Amaury Denoyelle [Fri, 17 Nov 2023 15:21:01 +0000 (16:21 +0100)] 
MINOR: acl: define explicit HTTP_3.0

Some ACL shortcuts are defined to match HTTP requests by their version.
This exists for HTTP_1.0 to HTTP_2.0. This patch adds HTTP_3.0
definition.

19 months agoMINOR: quic: remove unneeded QUIC specific stopping function
Amaury Denoyelle [Mon, 20 Nov 2023 14:45:36 +0000 (15:45 +0100)] 
MINOR: quic: remove unneeded QUIC specific stopping function

On CONNECTION_CLOSE reception/emission, QUIC connections enter CLOSING
state. At this stage, only CONNECTION_CLOSE can be reemitted and all
other exchanges are stopped.

Previously, on haproxy process stopping, if all QUIC connections were in
CLOSING state, they were released before their closing timer expiration
to not block the process shutdown. However, since a recent commit, the
closing timer has been shorten to a more reasonable delay. It is now
consider viable to respect connections closing state even on process
shutdown. As such, stopping specific code in QUIC connections idle timer
task was removed.

A specific function quic_handle_stopping() was implemented to notify
QUIC connections on shutdown from main() function. It should have been
deleted along the removal in QUIC idle timer task. This patch just does
this.

19 months agoBUG/MEDIUM: quic: Possible crash for connections to be killed
Frédéric Lécaille [Mon, 20 Nov 2023 15:54:57 +0000 (16:54 +0100)] 
BUG/MEDIUM: quic: Possible crash for connections to be killed

The connections are flagged as "to be killed" asap when the peer has left
(detected by sendto() "Connection refused" errno) by qc_kill_conn(). This
function has to wakeup the idle timer task to release the connection (and the idle
timer  and the idle timer task itself). Then if in the meantime the connection
was flagged as having to process some retransmissions, some packet could lead
to sendto() errors again with a call to qc_kill_conn(), this time with a released
idle timer task.

This bug could be detected by libasan as follows:

.AddressSanitizer:DEADLYSIGNAL
=================================================================
==21018==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x    560b5d898717 bp 0x7f9aaac30000 sp 0x7f9aaac2ff80 T3)
==21018==The signal is caused by a READ memory access.
==21018==Hint: address points to the zero page.
.    #0 0x560b5d898717 in _task_wakeup include/haproxy/task.h:209
    #1 0x560b5d8a563c in qc_kill_conn src/quic_conn.c:171
    #2 0x560b5d97f832 in qc_send_ppkts src/quic_tx.c:636
    #3 0x560b5d981b53 in qc_send_app_pkts src/quic_tx.c:876
    #4 0x560b5d987122 in qc_send_app_probing src/quic_tx.c:910
    #5 0x560b5d987122 in qc_dgrams_retransmit src/quic_tx.c:1397
    #6 0x560b5d8ab250 in quic_conn_app_io_cb src/quic_conn.c:712
    #7 0x560b5de41593 in run_tasks_from_lists src/task.c:596
    #8 0x560b5de4333c in process_runnable_tasks src/task.c:876
    #9 0x560b5dd6f2b0 in run_poll_loop src/haproxy.c:2966
    #10 0x560b5dd700fb in run_thread_poll_loop src/haproxy.c:3165
    #11 0x7f9ab9188ea6 in start_thread nptl/pthread_create.c:477
    #12 0x7f9ab90a8a2e in __clone (/lib/x86_64-linux-gnu/libc.so.6+0xfba2e)

AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV include/haproxy/task.h:209 in _task_wakeup
Thread T3 created by T0 here:
    #0 0x7f9ab97ac2a2 in __interceptor_pthread_create ../../../../src/libsaniti    zer/asan/asan_interceptors.cpp:214
    #1 0x560b5df4f3ef in setup_extra_threads src/thread.c:252                  o
    #2 0x560b5dd730c7 in main src/haproxy.c:3856
    #3 0x7f9ab8fd0d09 in __libc_start_main ../csu/libc-start.c:308             i

==21018==ABORTING
AddressSanitizer:DEADLYSIGNAL
Aborted (core dumped)

To fix, simply reset the connection flag QUIC_FL_CONN_RETRANS_NEEDED to cancel
the retransmission when qc_kill_conn is called.

Note that this new bug arrived with this fix which is correct and flagged as to be
backported as far as 2.6.
      BUG/MINOR: quic: idle timer task requeued in the past

Must be backported as far as 2.6.

19 months agoBUG/MAJOR: quic: complete thread migration before tcp-rules
Amaury Denoyelle [Mon, 20 Nov 2023 13:56:49 +0000 (14:56 +0100)] 
BUG/MAJOR: quic: complete thread migration before tcp-rules

A quic_conn is instantiated and tied on the first thread which has
received the first INITIAL packet. After handshake completion,
listener_accept() is called. For each quic_conn, a new thread is
selected among the least loaded ones Note that this occurs earlier if
handling 0-RTT data.

This thread connection migration is done in two steps :
* inside listener_accept(), on the origin thread, quic_conn
  tasks/tasklet are killed. After this, no quic_conn related processing
  will occur on this thread. The connection is flagged with
  QUIC_FL_CONN_AFFINITY_CHANGED.
* as soon as the first quic_conn related processing occurs on the new
  thread, the migration is finalized. This allows to allocate the new
  tasks/tasklet directly on the destination thread.

This last step on the new thread must be done prior to other quic_conn
access. There is two events which may trigger it :
* a packet is received on the new thread. In this case,
  qc_finalize_affinity_rebind() is called from quic_dgram_parse().
* the recently accepted connection is popped from accept_queue_ring via
  accept_queue_process(). This will called session_accept_fd() as
  listener.bind_conf.accept callback. This instantiates a new session
  and start connection stack via conn_xprt_start(), which itself calls
  qc_xprt_start() where qc_finalize_affinity_rebind() is used.

A condition was recently found which could cause a closing to be used
with qc_finalize_affinity_rebind() which is forbidden with a BUG_ON().

This lat step was not compatible with layer 4 rule such as "tcp-request
connection reject" which closes the connection early. In this case, most
of the body of session_accept_fd() is skipped, including
qc_xprt_start(), so thread migration is not finalized. At the end of the
function, conn_xprt_close() is then called which flags the connection as
CLOSING.

If a datagram is received for this connection before it is released,
this will call qc_finalize_affinity_rebind() which triggers its BUG_ON()
to prevent thread migration for CLOSING quic_conn.

FATAL: bug condition "qc->flags & ((1U << 29)|(1U << 30))" matched at src/quic_conn.c:2036
Thread 3 "haproxy" received signal SIGILL, Illegal instruction.
[Switching to Thread 0x7ffff794f700 (LWP 2973030)]
0x00005555556221f3 in qc_finalize_affinity_rebind (qc=0x7ffff002d060) at src/quic_conn.c:2036
2036            BUG_ON(qc->flags & (QUIC_FL_CONN_CLOSING|QUIC_FL_CONN_DRAINING));
(gdb) bt
 #0  0x00005555556221f3 in qc_finalize_affinity_rebind (qc=0x7ffff002d060) at src/quic_conn.c:2036
 #1  0x0000555555682463 in quic_dgram_parse (dgram=0x7fff5003ef10, from_qc=0x0, li=0x555555f38670) at src/quic_rx.c:2602
 #2  0x0000555555651aae in quic_lstnr_dghdlr (t=0x555555fc4440, ctx=0x555555fc3f78, state=32832) at src/quic_sock.c:189
 #3  0x00005555558c9393 in run_tasks_from_lists (budgets=0x7ffff7944c90) at src/task.c:596
 #4  0x00005555558c9e8e in process_runnable_tasks () at src/task.c:876
 #5  0x000055555586b7b2 in run_poll_loop () at src/haproxy.c:2966
 #6  0x000055555586be87 in run_thread_poll_loop (data=0x555555d3d340 <ha_thread_info+64>) at src/haproxy.c:3165
 #7  0x00007ffff7b59609 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
 #8  0x00007ffff7a7e133 in clone () from /lib/x86_64-linux-gnu/libc.so.6

To fix this issue, ensure quic_conn migration is completed earlier
inside session_accept_fd(), before any tcp rules processing. This is
done by moving qc_finalize_affinity_rebind() invocation from
qc_xprt_start() to qc_conn_init().

This must be backported up to 2.7.

19 months agoBUILD: cache: fix build error on older compilers
Willy Tarreau [Mon, 20 Nov 2023 10:43:52 +0000 (11:43 +0100)] 
BUILD: cache: fix build error on older compilers

pre-c99 compilers will fail to build the cache since commit 48f81ec09
("MAJOR: cache: Delay cache entry delete in reserve_hot function") due
to an int declaration in the for loop. No backport is needed.

19 months agoBUG/MINOR: sock: mark abns sockets as non-suspendable and always unbind them
Willy Tarreau [Mon, 20 Nov 2023 09:44:21 +0000 (10:44 +0100)] 
BUG/MINOR: sock: mark abns sockets as non-suspendable and always unbind them

In 2.3, we started to get a cleaner socket unbinding mechanism with
commit f58b8db47 ("MEDIUM: receivers: add an rx_unbind() method in
the protocols"). This mechanism rightfully refrains from unbinding
when sockets are expected to be transferrable to another worker via
"expose-fd listeners", but this is not compatible with ABNS sockets,
which do not support reuseport, unbinding nor being renamed: in short
they will always prevent a new process from binding.

It turns out that this is not much visible because by pure accident,
GTUNE_SOCKET_TRANSFER is only set in the code dealing with master mode
and deamons, so it's never set in foreground mode nor in tests even if
present on the stats socket. However with master mode, it is now always
set even when not present on the stats socket, and will always conflict.

The only reasonable approach seems to consist in marking these abns
sockets as non-suspendable so that the generic sock_unbind() code can
decide to just unbind them regardless of GTUNE_SOCKET_TRANSFER.

This should carefully be backported as far as 2.4.

19 months agoBUG/MINOR: startup: set GTUNE_SOCKET_TRANSFER correctly
William Lallemand [Mon, 20 Nov 2023 09:49:05 +0000 (10:49 +0100)] 
BUG/MINOR: startup: set GTUNE_SOCKET_TRANSFER correctly

This bug was forbidding the GTUNE_SOCKET_TRANSFER option to be set
when haproxy is neither in daemon mode nor in mworker mode. So it
basically only impacts the foreground mode.

The fix moves the code outside the 'if (global.mode & (MODE_DAEMON |
MODE_MWORKER | MODE_MWORKER_WAIT))' condition.

Bug was introduced with 7f80eb23 ("MEDIUM: proxy: zombify proxies only
when the expose-fd socket is bound").

Must be backported in every stable version.

19 months ago[RELEASE] Released version 2.9-dev10 v2.9-dev10
Willy Tarreau [Sat, 18 Nov 2023 11:00:37 +0000 (12:00 +0100)] 
[RELEASE] Released version 2.9-dev10

Released version 2.9-dev10 with the following main changes :
    - CLEANUP: Re-apply xalloc_size.cocci (3)
    - BUG/MEDIUM: stconn: Report send activity during mux-to-mux fast-forward
    - BUG/MEDIUM: stconn: Don't report rcv/snd expiration date if SC cannot epxire
    - MINOR: stconn: Don't queue stream task in past in sc_notify()
    - BUG/MEDIUM: Don't apply a max value on room_needed in sc_need_room()
    - BUG/MINOR: stconn: Sanitize report for read activity
    - CLEANUP: htx: Properly indent htx_reserve_max_data() function
    - DOC: stconn: Improve comments about lra and fsb usage
    - BUG/MEDIUM: quic: fix actconn on quic_conn alloc failure
    - BUG/MEDIUM: quic: fix sslconns on quic_conn alloc failure
    - BUG/MEDIUM: mux-h1: Be sure xprt support splicing to use it during fast-forward
    - MINOR: proto_reverse_connect: use connect timeout
    - BUG/MINOR: mux-h1: Release empty ibuf during data fast-forwarding
    - BUG/MINOR: stick-table/cli: Check for invalid ipv4 key
    - MEDIUM: stktable/cli: simplify entry key handling
    - MINOR: stktable/cli: support v6tov4 and v4tov6 conversions
    - BUG/MINOR: mux-h1: Properly handle http-request and http-keep-alive timeouts
    - BUG/MEDIUM: freq-ctr: Don't report overshoot for long inactivity period
    - BUG/MEDIUM: pool: fix releasable pool calculation when overloaded
    - BUG/MINOR: pool: check one other random bucket on alloc conflict
    - BUG/MEDIUM: pool: try once to allocate from another bucket if empty
    - MEDIUM: stconn/muxes: Loop on data fast-forwarding to forward at least a buffer
    - MINOR: stconn/mux-h2: Use a iobuf flag to report EOI to consumer side during FF
    - MEDIUM: quic: Heavy task mode during handshake
    - MEDIUM: quic: Heavy task mode with non contiguously bufferized CRYPTO data
    - MINOR: quic: release the TLS context asap from quic_conn_release()
    - MINOR: quic: Add idle timer task pointer to traces
    - BUG/MINOR: quic: idle timer task requeued in the past
    - CLEANUP: quic: Indentation fix in qc_do_build_pkt()
    - MINOR: quic: Avoid zeroing frame structures
    - BUG/MEDIUM: quic: Too short Initial packet sent (enc. level allocation failed)
    - BUG/MEDIUM: quic: Avoid trying to send ACK frames from an empty ack ranges tree
    - BUG/MEDIUM: quic: Possible crashes when sending too short Initial packets
    - BUG/MEDIUM: quic: Avoid some crashes upon TX packet allocation failures
    - BUG/MEDIUM: quic: Possible crashes during secrets allocations (heavy load)
    - BUG/MEDIUM: stconn: Don't update stream expiration date if already expired
    - MINOR: errors: ha_alert() and ha_warning() uses warn_exec_path()
    - MINOR: errors: does not check MODE_STARTING for log emission
    - MEDIUM: errors: move the MODE_QUIET test in print_message()
    - DOC: management: -q is quiet all the time
    - MEDIUM: mworker: -W is mandatory when using -S
    - BUG/MEDIUM: mux-h1: Exit early if fast-forward is not supported by opposite SC
    - MEDIUM: quic: adjust address validation
    - MINOR: quic: reduce half open counters scope
    - MEDIUM: quic: limit handshake per listener
    - MEDIUM: quic: define an accept queue limit
    - BUG/MINOR: quic: fix retry token check inconsistency
    - MINOR: task/debug: explicitly support passing a null caller to wakeup functions
    - MINOR: task/debug: make task_queue() and task_schedule() possible callers
    - OPTIM: mux-h2: don't allocate more buffers per connections than streams
    - BUG/MINOR: quic: remove dead code in error path
    - MEDIUM: quic: respect closing state even on soft-stop
    - MEDIUM: quic: release conn socket before using quic_cc_conn
    - DOC: config: use the word 'backend' instead of 'proxy' in 'track' description
    - BUG/MEDIUM: applet: Remove appctx from buffer wait list on release
    - MINOR: tools: make str2sa_range() directly return type hints
    - BUG/MEDIUM: server: invalid address (post)parsing checks
    - BUG/MINOR: sink: don't learn srv port from srv addr
    - CLEANUP: sink: bad indent in sink_new_from_logger()
    - CLEANUP: sink: useless leftover in sink_add_srv()
    - BUG/MINOR: quic: Useless use of non-contiguous buffer for in order CRYPTO data
    - MINOR: server: always initialize pp_tlvs for default servers
    - BUG/MEDIUM: proxy: always initialize the default settings after init
    - MEDIUM: startup: 'haproxy -c' is quiet when valid
    - BUG/MINOR: sample: Fix bytes converter if offset is bigger than sample length
    - BUG/MINOR: log: keep the ref in dup_logger()
    - BUG/MINOR: quic: fix crash on qc_new_conn alloc failure
    - BUG/MINOR: quic: fix decrement of half_open counter on qc alloc failure
    - BUG/MEDIUM: quic: fix FD for quic_cc_conn
    - DOC: config: Fix name for tune.disable-zero-copy-forwarding global param
    - REGTESTS: startup: -conf-OK requires -V with current VTest
    - BUG/MEDIUM: quic: Non initialized CRYPTO data stream deferencing
    - MINOR: quic: Add a max window parameter to congestion control algorithms
    - MINOR: quic: Maximum congestion control window for each algo
    - DOC: quic: Wrong syntax for "quic-cc-algo" keyword.
    - DOC: quic: Maximum congestion control window configuration
    - BUG/MINOR: quic: maximum window limits do not match the doc
    - BUG/MEDIUM: connection: report connection errors even when no mux is installed
    - BUG/MINOR: stconn: Handle abortonclose if backend connection was already set up
    - MINOR: connection: Add a CTL flag to notify mux it should wait for reads again
    - MEDIUM: mux-h1: Handle MUX_SUBS_RECV flag in h1_ctl() and susbscribe for reads
    - BUG/MEDIUM: stream: Properly handle abortonclose when set on backend only
    - MINOR: stconn: Use SC to detect frontend connections in sc_conn_recv()
    - REGTESTS: http: Improve script testing abortonclose option
    - MINOR: activity: report profiling duration and age in "show profiling"
    - BUG/MEDIUM: mworker: set the master variable earlier
    - BUG/MEDIUM: stream: Don't call mux .ctl() callback if not implemented
    - MINOR: connection: update rhttp flags usage
    - BUG/MINOR: mux_h2: reject passive reverse conn if error on add to idle
    - MINOR: server: force add to idle on reverse
    - MINOR: shctx: Set last_append to NULL when reserving block in hot list
    - MEDIUM: shctx: Move list between hot and avail list in O(1)
    - MEDIUM: shctx: Simplify shctx_row_reserve_hot loop
    - MINOR: shctx: Remove explicit 'from' param from shctx_row_data_append
    - MEDIUM: cache: Use dedicated cache tree lock alongside shctx lock
    - MINOR: cache: Remove expired entry delete in "show cache" command
    - MINOR: cache: Add option to avoid removing expired entries in lookup function
    - MEDIUM: cache: Use rdlock on cache in cache_use
    - MEDIUM: shctx: Remove 'hot' list from shared_context
    - MINOR: cache: Use dedicated trash for "show cache" cli command
    - MEDIUM: cache: Switch shctx spinlock to rwlock and restrict its scope
    - MEDIUM: cache: Add refcount on cache_entry
    - MEDIUM: shctx: Descend shctx_lock calls into the shctx_row_reserve_hot
    - MINOR: shctx: Add new reserve_finish callback call to shctx_row_reserve_hot
    - MAJOR: cache: Delay cache entry delete in reserve_hot function
    - MINOR: shctx: Remove redundant arg from free_block callback
    - MINOR: shctx: Remove 'use_shared_mem' variable
    - DOC: cache: Specify when function expects a cache lock
    - BUG/MEDIUM: stconn: Update fsb date on partial sends
    - MINOR: htx: Use a macro for overhead induced by HTX
    - MINOR: channel: Add functions to get info on buffers and deal with HTX streams
    - BUG/MINOR: stconn: Fix streamer detection for HTX streams
    - BUG/MINOR: stconn: Use HTX-aware channel's functions to get info on buffer
    - BUG/MINOR: stconn/applet: Report send activity only if there was output data
    - BUG/MINOR: stconn: Report read activity on non-indep streams for partial sends
    - BUG/MINOR: shctx: Remove old HA_SPIN_INIT
    - REGTESTS: try to activate again the seamless reload test with the master CLI
    - MINOR: proxy: Add "handshake" new timeout (frontend side)
    - MEDIUM: quic: Add support for "handshake" timeout setting.
    - MINOR: quic: Dump the expiration date of the idle timer task
    - BUG/MINOR: quic: Malformed CONNECTION_CLOSE frame
    - MEDIUM: session: handshake timeout (TCP)
    - DOC: proxy: Add "handshake" timeout documentation.
    - MINOR: quic: Rename "handshake" timeout to "client-hs"
    - CLEANUP: haproxy: remove old comment from 1.1 from the file header
    - BUG/MEDIUM: mux-h2: fail earlier on malloc in takeover()
    - BUG/MEDIUM: mux-h1: fail earlier on malloc in takeover()
    - BUG/MEDIUM: mux-fcgi: fail earlier on malloc in takeover()
    - MINOR: rhttp: remove the unused outgoing connect() function
    - MINOR: backend: without ->connect(), allow to pick another thread's connection
    - BUG/MINOR: stream/cli: report correct stream age in "show sess"
    - MINOR: stream/cli: add an optional "older" filter for "show sess"
    - MINOR: stream/cli: add another filter "susp" to "show sess"
    - MINOR: stktable: add stktable_deinit function
    - BUG/MINOR: proxy/stktable: missing frees on proxy cleanup
    - CLEANUP: backend: removing unused LB param
    - MEDIUM: lbprm: store algo params on 32bits
    - MEDIUM: log/balance: merge tcp/http algo with log ones
    - Revert "MINOR: proxy: report a warning for max_ka_queue in proxy_cfg_ensure_no_http()"
    - Revert "MINOR: tcp_rules: tcp-{request,response} requires TCP or HTTP mode"
    - Revert "MINOR: stktable: "stick" requires TCP or HTTP mode"
    - Revert "MINOR: cfgparse-listen: "http-send-name-header" requires TCP or HTTP mode"
    - Revert "MINOR: cfgparse-listen: "dynamic-cookie-key" requires TCP or HTTP mode"
    - Revert "MINOR: cfgparse-listen: "http-reuse" requires TCP or HTTP mode"
    - Revert "MINOR: fcgi-app: "use-fcgi-app" requires TCP or HTTP mode"
    - Revert "MINOR: http_htx/errors: prevent the use of some keywords when not in tcp/http mode"
    - Revert "MINOR: flt_http_comp: "compression" requires TCP or HTTP mode"
    - Revert "MINOR: filter: "filter" requires TCP or HTTP mode"
    - MINOR: log/backend: ensure log exclusive params are not used in other modes
    - MINOR: log/backend: prevent tcp-{request,response} use with LOG mode
    - MINOR: log/backend: prevent stick table and stick rules with LOG mode
    - MINOR: log/backend: prevent "http-send-name-header" use with LOG mode
    - MINOR: log/backend: prevent "dynamic-cookie-key" use with LOG mode
    - REGTESTS: http: add a test to validate chunked responses delivery

19 months agoREGTESTS: http: add a test to validate chunked responses delivery
Willy Tarreau [Sat, 18 Nov 2023 10:01:28 +0000 (11:01 +0100)] 
REGTESTS: http: add a test to validate chunked responses delivery

I've had this test here never committed over the last 2.5 years, that
works fine and I didn't notice it was not part of the tree. It makes a
server return odd-sized chunked responses with short pauses between half
of thems and verifies they're not truncated on the client. It may detect
eventually state machine breakages, so better commit it.

19 months agoMINOR: log/backend: prevent "dynamic-cookie-key" use with LOG mode
Aurelien DARRAGON [Thu, 16 Nov 2023 16:16:43 +0000 (17:16 +0100)] 
MINOR: log/backend: prevent "dynamic-cookie-key" use with LOG mode

It doesn't make sense to set "dynamic-cookie-key" inside a log backend,
thus we report a warning to the user and reset the setting.

19 months agoMINOR: log/backend: prevent "http-send-name-header" use with LOG mode
Aurelien DARRAGON [Thu, 16 Nov 2023 16:11:37 +0000 (17:11 +0100)] 
MINOR: log/backend: prevent "http-send-name-header" use with LOG mode

It doesn't make sense to use the "http-send-name-header" directive inside
a log backend so we report a warning in with case and reset the setting.

19 months agoMINOR: log/backend: prevent stick table and stick rules with LOG mode
Aurelien DARRAGON [Thu, 16 Nov 2023 10:29:58 +0000 (11:29 +0100)] 
MINOR: log/backend: prevent stick table and stick rules with LOG mode

Report a warning and prevent errors if user tries to declare a stick table
or use stick rules within a log backend.

19 months agoMINOR: log/backend: prevent tcp-{request,response} use with LOG mode
Aurelien DARRAGON [Thu, 16 Nov 2023 09:48:34 +0000 (10:48 +0100)] 
MINOR: log/backend: prevent tcp-{request,response} use with LOG mode

We start implementing some postparsing compatibility checks for log
backends.

Here we report a warning if user tries to use tcp-{request,response} rules
with log backend, and we properly ignore such rules when inherited from
defaults section.

19 months agoMINOR: log/backend: ensure log exclusive params are not used in other modes
Aurelien DARRAGON [Wed, 15 Nov 2023 11:18:52 +0000 (12:18 +0100)] 
MINOR: log/backend: ensure log exclusive params are not used in other modes

add proxy_cfg_ensure_no_log() function (similar to
proxy_cfg_ensure_no_http()) to ensure at the end of proxy parsing that
no log exclusive options are found if the proxy is not in log mode.

19 months agoRevert "MINOR: filter: "filter" requires TCP or HTTP mode"
Aurelien DARRAGON [Fri, 17 Nov 2023 17:05:25 +0000 (18:05 +0100)] 
Revert "MINOR: filter: "filter" requires TCP or HTTP mode"

This reverts commit f9422551cd2b205332e4ea4e6195ed986e0e198a since we
cannot perform the test during parsing as the effective proxy mode is
not yet known.

19 months agoRevert "MINOR: flt_http_comp: "compression" requires TCP or HTTP mode"
Aurelien DARRAGON [Fri, 17 Nov 2023 17:05:20 +0000 (18:05 +0100)] 
Revert "MINOR: flt_http_comp: "compression" requires TCP or HTTP mode"

This reverts commit 225526dc16949ccbc83f59378d644eb6bda7681c since we
cannot perform the test during parsing as the effective proxy mode is
not yet known.

19 months agoRevert "MINOR: http_htx/errors: prevent the use of some keywords when not in tcp...
Aurelien DARRAGON [Fri, 17 Nov 2023 17:05:15 +0000 (18:05 +0100)] 
Revert "MINOR: http_htx/errors: prevent the use of some keywords when not in tcp/http mode"

This reverts commit b41b77b4ccfd71647f469065006310772f4911a3 since we
cannot perform the test during parsing as the effective proxy mode is
not yet known.

19 months agoRevert "MINOR: fcgi-app: "use-fcgi-app" requires TCP or HTTP mode"
Aurelien DARRAGON [Fri, 17 Nov 2023 17:05:10 +0000 (18:05 +0100)] 
Revert "MINOR: fcgi-app: "use-fcgi-app" requires TCP or HTTP mode"

This reverts commit 0ba731f50b4e6b75d32ddf8388fe32fad5cfadf3 since we
cannot perform the test during parsing as the effective proxy mode is
not yet known.

19 months agoRevert "MINOR: cfgparse-listen: "http-reuse" requires TCP or HTTP mode"
Aurelien DARRAGON [Fri, 17 Nov 2023 17:05:05 +0000 (18:05 +0100)] 
Revert "MINOR: cfgparse-listen: "http-reuse" requires TCP or HTTP mode"

This reverts commit 65f1124b5dd4f01142337318f16968a33c2146ed since we
cannot perform the test during parsing as the effective proxy mode is
not yet known.

19 months agoRevert "MINOR: cfgparse-listen: "dynamic-cookie-key" requires TCP or HTTP mode"
Aurelien DARRAGON [Fri, 17 Nov 2023 17:02:34 +0000 (18:02 +0100)] 
Revert "MINOR: cfgparse-listen: "dynamic-cookie-key" requires TCP or HTTP mode"

This reverts commit 0b09727a22fc2bd36bc7b3e73ca9c5a85ce2601c since we
cannot perform the test during parsing as the effective proxy mode is
not yet known.

19 months agoRevert "MINOR: cfgparse-listen: "http-send-name-header" requires TCP or HTTP mode"
Aurelien DARRAGON [Fri, 17 Nov 2023 17:02:03 +0000 (18:02 +0100)] 
Revert "MINOR: cfgparse-listen: "http-send-name-header" requires TCP or HTTP mode"

This reverts commit d354947365bbbafe3f6675fec0bea8617259842a since we
cannot perform the test during parsing as the proxy mode is not yet
known.

19 months agoRevert "MINOR: stktable: "stick" requires TCP or HTTP mode"
Aurelien DARRAGON [Fri, 17 Nov 2023 17:01:37 +0000 (18:01 +0100)] 
Revert "MINOR: stktable: "stick" requires TCP or HTTP mode"

This reverts commit 098ae743fd17b3fae6671e53d9bdb74eb3f315fd since we
cannot perform the test during parsing as the effective proxy mode is
not yet known.

19 months agoRevert "MINOR: tcp_rules: tcp-{request,response} requires TCP or HTTP mode"
Aurelien DARRAGON [Fri, 17 Nov 2023 17:00:26 +0000 (18:00 +0100)] 
Revert "MINOR: tcp_rules: tcp-{request,response} requires TCP or HTTP mode"

This reverts commit 09b15e4163b6a32a418b6f8b8e29dfb356d5fee6 since
we cannot perform the test during parsing as the effective proxy mode is
not yet known.

19 months agoRevert "MINOR: proxy: report a warning for max_ka_queue in proxy_cfg_ensure_no_http()"
Aurelien DARRAGON [Thu, 16 Nov 2023 16:07:09 +0000 (17:07 +0100)] 
Revert "MINOR: proxy: report a warning for max_ka_queue in proxy_cfg_ensure_no_http()"

This reverts commit 3934901 since it makes no sense to report a warning
in this case given that max-keepalive-queue will also work with TCP
backends.