BUG/MINOR: quic: split max-idle-timeout option for FE/BE usage

Streamline max-idle-timeout option. Rename it to use the newer cohesive
naming scheme 'tune.quic.fe|be.'.

Two different fields were already defined in global struct. These fields
are moved into quic_tune along with other QUIC settings. However, no
parser was defined for backend option, this commit fixes this.

No need to backport this.
This commit is contained in:
Amaury Denoyelle 2025-09-10 09:53:48 +02:00
parent 5bc659a4a2
commit 33afba0dda
7 changed files with 53 additions and 30 deletions

View File

@ -1892,6 +1892,7 @@ The following keywords are supported in the "global" section :
- tune.quic.be.cc.hystart
- tune.quic.be.cc.max-frame-loss
- tune.quic.be.cc.reorder-ratio
- tune.quic.be.max-idle-timeout
- tune.quic.be.sec.glitches-threshold
- tune.quic.be.tx.pacing
- tune.quic.be.tx.udp-gso
@ -1903,13 +1904,14 @@ The following keywords are supported in the "global" section :
- tune.quic.fe.cc.hystart
- tune.quic.fe.cc.max-frame-loss
- tune.quic.fe.cc.reorder-ratio
- tune.quic.fe.max-idle-timeout
- tune.quic.fe.sec.glitches-threshold
- tune.quic.fe.sec.retry-threshold
- tune.quic.fe.sock-per-conn
- tune.quic.fe.tx.pacing
- tune.quic.fe.tx.udp-gso
- tune.quic.frontend.max-data-size
- tune.quic.frontend.max-idle-timeout
- tune.quic.frontend.max-idle-timeout (deprecated)
- tune.quic.frontend.max-streams-bidi
- tune.quic.frontend.max-tx-mem (deprecated)
- tune.quic.frontend.stream-data-ratio
@ -4763,6 +4765,24 @@ tune.quic.reorder-ratio <0..100, in percent> (deprecated)
part of the streamlining process apply on QUIC configuration. If used, this
setting will only be applied on frontend connections.
tune.quic.be.max-idle-timeout <timeout>
tune.quic.fe.max-idle-timeout <timeout>
Sets the QUIC max_idle_timeout transport parameters on either frontend or
backend side. It follows the HAProxy time format and is expressed in
milliseconds. This determines the period of time after which a connection is
silently closed if it has remained inactive during an effective period of
time. Both endpoints relies on the same negotiated value :
- the minimum of the two parameters if both are not null,
- the maximum if only one of them is not null,
- if both parameters are null, this feature is disabled.
The default value is 30s.
tune.quic.frontend.max-idle-timeout <timeout> (deprecated)
This keyword has been deprecated in 3.3 and will be removed in 3.5. It is
part of the streamlining process apply on QUIC configuration. If used, this
setting will only be applied on frontend connections.
tune.quic.be.sec.glitches-threshold <number>
tune.quic.fe.sec.glitches-threshold <number>
Sets the threshold for the number of glitches per connection either on
@ -4881,17 +4901,6 @@ tune.quic.frontend.max-data-size <size>
See also: "tune.quic.frontend.max-streams-bidi",
"tune.quic.frontend.stream-data-ratio"
tune.quic.frontend.max-idle-timeout <timeout>
Sets the QUIC max_idle_timeout transport parameters in milliseconds for
frontends which determines the period of time after which a connection silently
closes if it has remained inactive during an effective period of time deduced
from the two max_idle_timeout values announced by the two endpoints:
- the minimum of the two values if both are not null,
- the maximum if only one of them is not null,
- if both values are null, this feature is disabled.
The default value is 30000.
tune.quic.frontend.max-streams-bidi <number>
Sets the QUIC initial_max_streams_bidi transport parameter for frontends.
This is the initial maximum number of bidirectional streams the remote peer

View File

@ -215,8 +215,6 @@ struct global {
uint ring_queues; /* if >0, #ring queues, otherwise equals #thread groups */
enum threadgroup_takeover tg_takeover; /* Policy for threadgroup takeover */
#ifdef USE_QUIC
unsigned int quic_backend_max_idle_timeout;
unsigned int quic_frontend_max_idle_timeout;
unsigned int quic_frontend_max_data;
unsigned int quic_frontend_max_streams_bidi;
size_t quic_frontend_max_window_size;

View File

@ -41,9 +41,7 @@ struct tp_version_information {
/* These ones are our implementation default values when not set
* by configuration
*/
#define QUIC_TP_DFLT_FRONT_MAX_IDLE_TIMEOUT 30000 /* milliseconds */
#define QUIC_TP_DFLT_FRONT_MAX_STREAMS_BIDI 100
#define QUIC_TP_DFLT_BACK_MAX_IDLE_TIMEOUT 30000 /* milliseconds */
#define QUIC_TP_DFLT_FRONT_STREAM_DATA_RATIO 90
/* Types of QUIC transport parameters */

View File

@ -11,6 +11,9 @@
#define QUIC_DFLT_CC_MAX_FRAME_LOSS 10
/* Default ratio value applied to a dynamic Packet reorder threshold. */
#define QUIC_DFLT_CC_REORDER_RATIO 50 /* in percent */
/* Default max-idle-timeout advertised via TP */
#define QUIC_DFLT_FE_MAX_IDLE_TIMEOUT 30000 /* milliseconds */
#define QUIC_DFLT_BE_MAX_IDLE_TIMEOUT 30000 /* milliseconds */
/* Default Retry threshold */
#define QUIC_DFLT_SEC_RETRY_THRESHOLD 100 /* in connection openings */
@ -27,6 +30,7 @@ struct quic_tune {
uint cc_cubic_min_losses;
uint cc_max_frame_loss;
uint cc_reorder_ratio;
uint max_idle_timeout;
uint sec_glitches_threshold;
uint sec_retry_threshold;
uint opts; /* QUIC_TUNE_FE_* options specific to FE side */
@ -37,6 +41,7 @@ struct quic_tune {
uint cc_cubic_min_losses;
uint cc_max_frame_loss;
uint cc_reorder_ratio;
uint max_idle_timeout;
uint sec_glitches_threshold;
uint fb_opts; /* QUIC_TUNE_FB_* options shared by both side */
} be;

View File

@ -27,6 +27,7 @@ struct quic_tune quic_tune = {
.fe = {
.cc_max_frame_loss = QUIC_DFLT_CC_MAX_FRAME_LOSS,
.cc_reorder_ratio = QUIC_DFLT_CC_REORDER_RATIO,
.max_idle_timeout = QUIC_DFLT_FE_MAX_IDLE_TIMEOUT,
.sec_retry_threshold = QUIC_DFLT_SEC_RETRY_THRESHOLD,
.fb_opts = QUIC_TUNE_FB_TX_PACING|QUIC_TUNE_FB_TX_UDP_GSO,
.opts = QUIC_TUNE_FE_SOCK_PER_CONN,
@ -34,6 +35,7 @@ struct quic_tune quic_tune = {
.be = {
.cc_max_frame_loss = QUIC_DFLT_CC_MAX_FRAME_LOSS,
.cc_reorder_ratio = QUIC_DFLT_CC_REORDER_RATIO,
.max_idle_timeout = QUIC_DFLT_BE_MAX_IDLE_TIMEOUT,
.fb_opts = QUIC_TUNE_FB_TX_PACING|QUIC_TUNE_FB_TX_UDP_GSO,
},
.mem_tx_max = QUIC_MAX_TX_MEM,
@ -276,9 +278,11 @@ static int cfg_parse_quic_time(char **args, int section_type,
const struct proxy *defpx,
const char *file, int line, char **err)
{
int ret = 0;
unsigned int time;
const char *res, *name, *value;
int prefix_len = strlen("tune.quic.");
const int prefix_len = strlen("tune.quic.");
const char *suffix;
if (too_many_args(1, args, err, NULL))
return -1;
@ -301,16 +305,26 @@ static int cfg_parse_quic_time(char **args, int section_type,
return -1;
}
if (strcmp(name + prefix_len, "frontend.max-idle-timeout") == 0)
global.tune.quic_frontend_max_idle_timeout = time;
else if (strcmp(name + prefix_len, "backend.max-idle-timeout") == 0)
global.tune.quic_backend_max_idle_timeout = time;
suffix = name + prefix_len;
if (strcmp(suffix, "be.max-idle-timeout") == 0 ||
strcmp(suffix, "fe.max-idle-timeout") == 0) {
uint *ptr = (suffix[0] == 'b') ? &quic_tune.be.max_idle_timeout :
&quic_tune.fe.max_idle_timeout;
*ptr = time;
}
/* legacy options */
else if (strcmp(name + prefix_len, "frontend.max-idle-timeout") == 0) {
memprintf(err, "'%s' is deprecated in 3.3 and will be removed in 3.5. "
"Please use the newer keyword syntax 'tune.quic.fe.max-idle-timeout'.", args[0]);
quic_tune.fe.max_idle_timeout = time;
ret = 1;
}
else {
memprintf(err, "'%s' keyword not unhandled (please report this bug).", args[0]);
return -1;
ret = -1;
}
return 0;
return ret;
}
/* Parse any tune.quic.* setting with strictly positive integer values.
@ -582,7 +596,6 @@ static struct cfg_kw_list cfg_kws = {ILH, {
{ CFG_GLOBAL, "tune.quic.mem.tx-max", cfg_parse_quic_tune_setting },
{ CFG_GLOBAL, "tune.quic.frontend.max-data-size", cfg_parse_quic_tune_setting },
{ CFG_GLOBAL, "tune.quic.frontend.max-streams-bidi", cfg_parse_quic_tune_setting },
{ CFG_GLOBAL, "tune.quic.frontend.max-idle-timeout", cfg_parse_quic_time },
{ CFG_GLOBAL, "tune.quic.frontend.default-max-window-size", cfg_parse_quic_tune_setting },
{ CFG_GLOBAL, "tune.quic.frontend.stream-data-ratio", cfg_parse_quic_tune_setting },
{ CFG_GLOBAL, "tune.quic.zero-copy-fwd-send", cfg_parse_quic_tune_on_off },
@ -591,6 +604,7 @@ static struct cfg_kw_list cfg_kws = {ILH, {
{ CFG_GLOBAL, "tune.quic.fe.cc.hystart", cfg_parse_quic_tune_on_off },
{ CFG_GLOBAL, "tune.quic.fe.cc.max-frame-loss", cfg_parse_quic_tune_setting },
{ CFG_GLOBAL, "tune.quic.fe.cc.reorder-ratio", cfg_parse_quic_tune_setting },
{ CFG_GLOBAL, "tune.quic.fe.max-idle-timeout", cfg_parse_quic_time },
{ CFG_GLOBAL, "tune.quic.fe.sec.glitches-threshold", cfg_parse_quic_tune_setting },
{ CFG_GLOBAL, "tune.quic.fe.sec.retry-threshold", cfg_parse_quic_tune_setting },
{ CFG_GLOBAL, "tune.quic.fe.sock-per-conn", cfg_parse_quic_tune_sock_per_conn },
@ -601,6 +615,7 @@ static struct cfg_kw_list cfg_kws = {ILH, {
{ CFG_GLOBAL, "tune.quic.be.cc.hystart", cfg_parse_quic_tune_on_off },
{ CFG_GLOBAL, "tune.quic.be.cc.max-frame-loss", cfg_parse_quic_tune_setting },
{ CFG_GLOBAL, "tune.quic.be.cc.reorder-ratio", cfg_parse_quic_tune_setting },
{ CFG_GLOBAL, "tune.quic.be.max-idle-timeout", cfg_parse_quic_time },
{ CFG_GLOBAL, "tune.quic.be.sec.glitches-threshold", cfg_parse_quic_tune_setting },
{ CFG_GLOBAL, "tune.quic.be.tx.pacing", cfg_parse_quic_tune_on_off },
{ CFG_GLOBAL, "tune.quic.be.tx.udp-gso", cfg_parse_quic_tune_on_off },
@ -611,6 +626,7 @@ static struct cfg_kw_list cfg_kws = {ILH, {
{ CFG_GLOBAL, "tune.quic.disable-tx-pacing", cfg_parse_quic_tune_setting0 },
{ CFG_GLOBAL, "tune.quic.disable-udp-gso", cfg_parse_quic_tune_setting0 },
{ CFG_GLOBAL, "tune.quic.frontend.glitches-threshold", cfg_parse_quic_tune_setting },
{ CFG_GLOBAL, "tune.quic.frontend.max-idle-timeout", cfg_parse_quic_time },
{ CFG_GLOBAL, "tune.quic.frontend.max-tx-mem", cfg_parse_quic_tune_setting },
{ CFG_GLOBAL, "tune.quic.max-frame-loss", cfg_parse_quic_tune_setting },
{ CFG_GLOBAL, "tune.quic.reorder-ratio", cfg_parse_quic_tune_setting },

View File

@ -199,8 +199,6 @@ struct global global = {
.nb_stk_ctr = MAX_SESS_STKCTR,
.default_shards = -2, /* by-group */
#ifdef USE_QUIC
.quic_backend_max_idle_timeout = QUIC_TP_DFLT_BACK_MAX_IDLE_TIMEOUT,
.quic_frontend_max_idle_timeout = QUIC_TP_DFLT_FRONT_MAX_IDLE_TIMEOUT,
.quic_frontend_max_data = 0,
.quic_frontend_max_streams_bidi = QUIC_TP_DFLT_FRONT_MAX_STREAMS_BIDI,
.quic_frontend_max_window_size = QUIC_DFLT_MAX_WINDOW_SIZE,

View File

@ -58,10 +58,9 @@ void quic_transport_params_init(struct quic_transport_params *p, int server)
* QUIC_TP_DFLT_MAX_UDP_PAYLOAD_SIZE
*/
p->max_udp_payload_size = QUIC_MAX_UDP_PAYLOAD_SIZE;
if (server)
p->max_idle_timeout = global.tune.quic_frontend_max_idle_timeout;
else
p->max_idle_timeout = global.tune.quic_backend_max_idle_timeout;
p->max_idle_timeout = server ? quic_tune.fe.max_idle_timeout :
quic_tune.be.max_idle_timeout;
/* Set limit on number of concurrently opened streams. */
p->initial_max_streams_bidi = max_streams_bidi;