MINOR: cfg-quic: define tune.quic.conn-buf-limit
Add a new global configuration option to set the limit of buffers per
QUIC connection. By default, this value is set to 30.
diff --git a/doc/configuration.txt b/doc/configuration.txt
index a3f3e46..1acc560 100644
--- a/doc/configuration.txt
+++ b/doc/configuration.txt
@@ -1109,6 +1109,7 @@
- tune.pipesize
- tune.pool-high-fd-ratio
- tune.pool-low-fd-ratio
+ - tune.quic.conn-buf-limit
- tune.rcvbuf.client
- tune.rcvbuf.server
- tune.recv_enough
@@ -2788,6 +2789,16 @@
use before we stop putting connection into the idle pool for reuse. The
default is 20.
+tune.quic.conn-buf-limit <number>
+ Warning: QUIC support in HAProxy is currently experimental. Configuration may
+ change without deprecation in the future.
+
+ This settings defines the maximum number of buffers allocated for a QUIC
+ connection on data emission. By default, it is set to 30. QUIC buffers are
+ drained on ACK reception. This setting has a direct impact on the throughput
+ and memory consumption and can be adjusted according to an estimated round
+ time-trip.
+
tune.rcvbuf.client <number>
tune.rcvbuf.server <number>
Forces the kernel socket receive buffer size on the client or the server side
diff --git a/include/haproxy/global-t.h b/include/haproxy/global-t.h
index 27707d2..186968d 100644
--- a/include/haproxy/global-t.h
+++ b/include/haproxy/global-t.h
@@ -154,6 +154,9 @@
int pool_low_count; /* max number of opened fd before we stop using new idle connections */
int pool_high_count; /* max number of opened fd before we start killing idle connections when creating new connections */
unsigned short idle_timer; /* how long before an empty buffer is considered idle (ms) */
+#ifdef USE_QUIC
+ unsigned int quic_streams_buf;
+#endif /* USE_QUIC */
} tune;
struct {
char *prefix; /* path prefix of unix bind socket */
diff --git a/src/cfgparse-quic.c b/src/cfgparse-quic.c
index 4a94bb3..deaa13f 100644
--- a/src/cfgparse-quic.c
+++ b/src/cfgparse-quic.c
@@ -1,6 +1,9 @@
#include <haproxy/api.h>
+#include <haproxy/cfgparse.h>
+#include <haproxy/global-t.h>
#include <haproxy/listener.h>
#include <haproxy/proxy-t.h>
+#include <haproxy/tools.h>
static int bind_parse_quic_force_retry(char **args, int cur_arg, struct proxy *px, struct bind_conf *conf, char **err)
{
@@ -14,3 +17,33 @@
}};
INITCALL1(STG_REGISTER, bind_register_keywords, &bind_kws);
+
+static int cfg_parse_quic_conn_buf_limit(char **args, int section_type,
+ struct proxy *curpx,
+ const struct proxy *defpx,
+ const char *file, int line, char **err)
+{
+ unsigned int arg = 0;
+
+ if (too_many_args(1, args, err, NULL))
+ return -1;
+
+ if (*(args[1]) != 0)
+ arg = atoi(args[1]);
+
+ if (arg < 1) {
+ memprintf(err, "'%s' expects a positive integer.", args[0]);
+ return -1;
+ }
+
+ global.tune.quic_streams_buf = arg;
+
+ return 0;
+}
+
+static struct cfg_kw_list cfg_kws = {ILH, {
+ { CFG_GLOBAL, "tune.quic.conn-buf-limit", cfg_parse_quic_conn_buf_limit },
+ { 0, NULL, NULL }
+}};
+
+INITCALL1(STG_REGISTER, cfg_register_keywords, &cfg_kws);
diff --git a/src/haproxy.c b/src/haproxy.c
index a26c8f3..0187bc6 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -203,6 +203,9 @@
#else
.idle_timer = 1000, /* 1 second */
#endif
+#ifdef USE_QUIC
+ .quic_streams_buf = 30,
+#endif /* USE_QUIC */
},
#ifdef USE_OPENSSL
#ifdef DEFAULT_MAXSSLCONN
diff --git a/src/quic_stream.c b/src/quic_stream.c
index 839efd0..e5998ef 100644
--- a/src/quic_stream.c
+++ b/src/quic_stream.c
@@ -208,8 +208,7 @@
*/
static int qc_stream_buf_avail(struct quic_conn *qc)
{
- /* TODO use a global tune settings for max */
- return qc->stream_buf_count < 30;
+ return qc->stream_buf_count < global.tune.quic_streams_buf;
}
/* Allocate a new current buffer for <stream>. The buffer limit count for the