- lua-prepend-path
- mworker-max-reloads
- nbthread
- - no-quic
- node
- numa-cpu-mapping
- ocsp-update.disable
- tune.quic.frontend.max-tx-mem
- tune.quic.frontend.stream-data-ratio
- tune.quic.frontend.default-max-window-size
+ - tune.quic.listen
- tune.quic.max-frame-loss
- tune.quic.reorder-ratio
- tune.quic.retry-threshold
output of "haproxy -vv". Note that values set here or automatically detected
are subject to the limit set by "thread-hard-limit" (if set).
-no-quic
- Disable QUIC transport protocol. All the QUIC listeners will still be created.
- But they will not bind their addresses. Hence, no QUIC traffic will be
- processed by haproxy. See also "quic_enabled" sample fetch.
-
numa-cpu-mapping
When running on a NUMA-aware platform, this enables the "cpu-policy"
directive to inspect the topology and figure the best set of CPUs to use and
See also the "quic-cc-algo" bind option.
+tune.quic.listen { on | off }
+ Disable QUIC transport protocol on the frontend side. All the QUIC listeners
+ will still be created, but they won't listen for incoming datagrams. Hence,
+ no QUIC traffic will be processed by haproxy on the frontend side.
+
+ The default value is "on". If an issue is suspected with QUIC traffic, this
+ option can be used to easily toggle QUIC listeners without messing with each
+ individual config lines.
+
+ See also "quic_enabled" sample fetch.
+
tune.quic.max-frame-loss <number>
Sets the limit for which a single QUIC frame can be marked as lost. If
exceeded, the connection is considered as failing and is closed immediately.
also the "avg_queue", "be_conn", and "be_sess_rate" fetches.
quic_enabled : boolean
- Return true when the support for QUIC transport protocol was compiled and
- if this protocol was not disabled by "no-quic" global option. See also "no-quic"
- global option.
+ Return true when the support for QUIC transport protocol was compiled and if
+ QUIC listeners are not disabled by "tune.quic.listen" global option. See also
+ "tune.quic.listen" global option.
rand([<range>]) : integer
Returns a random integer value within a range of <range> possible values,
#define GTUNE_DISABLE_ACTIVE_CLOSE (1<<22)
#define GTUNE_QUICK_EXIT (1<<23)
/* (1<<24) unused */
-#define GTUNE_NO_QUIC (1<<25)
+/* (1<<25) unused */
#define GTUNE_USE_FAST_FWD (1<<26)
#define GTUNE_LISTENER_MQ_FAIR (1<<27)
#define GTUNE_LISTENER_MQ_OPT (1<<28)
#error "Must define USE_OPENSSL"
#endif
+#define QUIC_TUNE_FE_LISTEN_OFF 0x00000001
+
#define QUIC_TUNE_NO_PACING 0x00000001
#define QUIC_TUNE_NO_UDP_GSO 0x00000002
#define QUIC_TUNE_SOCK_PER_CONN 0x00000004
struct quic_tune {
struct {
+ uint opts; /* QUIC_TUNE_FE_* options specific to FE side */
uint fb_opts; /* QUIC_TUNE_FB_* options shared by both side */
} fe;
"log-tag", "spread-checks", "max-spread-checks", "cpu-map",
"strict-limits",
"numa-cpu-mapping", "defaults", "listen", "frontend", "backend",
- "peers", "resolvers", "cluster-secret", "no-quic", "limited-quic",
+ "peers", "resolvers", "cluster-secret", "limited-quic",
"stats-file",
NULL /* must be last */
};
global.tune.options |= GTUNE_LIMITED_QUIC;
}
- else if (strcmp(args[0], "no-quic") == 0) {
- if (alertif_too_many_args(0, file, linenum, args, &err_code))
- goto out;
-
- global.tune.options |= GTUNE_NO_QUIC;
- }
else if (strcmp(args[0], "busy-polling") == 0) { /* "no busy-polling" or "busy-polling" */
if (alertif_too_many_args(0, file, linenum, args, &err_code))
goto out;
}
suffix = args[0] + prefix_len;
+ if (strcmp(suffix, "listen") == 0 ) {
+ if (on)
+ quic_tune.fe.opts &= ~QUIC_TUNE_FE_LISTEN_OFF;
+ else
+ quic_tune.fe.opts |= QUIC_TUNE_FE_LISTEN_OFF;
+ }
if (strcmp(suffix, "zero-copy-fwd-send") == 0 ) {
if (on)
global.tune.no_zero_copy_fwd &= ~NO_ZERO_COPY_FWD_QUIC_SND;
}
static struct cfg_kw_list cfg_kws = {ILH, {
+ { CFG_GLOBAL, "tune.quic.listen", cfg_parse_quic_tune_on_off },
{ CFG_GLOBAL, "tune.quic.socket-owner", cfg_parse_quic_tune_socket_owner },
{ CFG_GLOBAL, "tune.quic.cc-hystart", cfg_parse_quic_tune_on_off },
{ CFG_GLOBAL, "tune.quic.cc.cubic.min-losses", cfg_parse_quic_tune_setting },
# ifdef USE_QUIC_OPENSSL_COMPAT
/* store the last checked bind_conf in bind_conf */
- if (!(global.tune.options & GTUNE_NO_QUIC) &&
+ if (!(global.tune.options & GTUNE_QUIC_LISTEN_OFF) &&
!(global.tune.options & GTUNE_LIMITED_QUIC) &&
listener->bind_conf != bind_conf) {
bind_conf = listener->bind_conf;
#include <haproxy/proto_quic.h>
#include <haproxy/protocol.h>
#include <haproxy/proxy.h>
+#include <haproxy/quic_tune.h>
#include <haproxy/sock.h>
#include <haproxy/tools.h>
*/
static inline int protocol_may_bind_quic(struct listener *l)
{
- if (global.tune.options & GTUNE_NO_QUIC)
- return 0;
- return 1;
+ return !(quic_tune.fe.opts & QUIC_TUNE_FE_LISTEN_OFF);
}
#endif
#include <haproxy/net_helper.h>
#include <haproxy/protobuf.h>
#include <haproxy/proxy.h>
+#include <haproxy/quic_tune.h>
#include <haproxy/regex.h>
#include <haproxy/sample.h>
#include <haproxy/sc_strm.h>
}
-/* Check if QUIC support was compiled and was not disabled by "no-quic" global option */
+/* Check if QUIC support was compiled and was not disabled by "tune.quic.listen" global option */
static int smp_fetch_quic_enabled(const struct arg *args, struct sample *smp, const char *kw, void *private)
{
smp->data.type = SMP_T_BOOL;
smp->flags = 0;
#ifdef USE_QUIC
- smp->data.u.sint = !(global.tune.options & GTUNE_NO_QUIC);
+ smp->data.u.sint = !(quic_tune.fe.opts & QUIC_TUNE_FE_LISTEN_OFF);
#else
smp->data.u.sint = 0;
#endif