quiche: trust its timeout handling

- set the idle timeout transport parameter
  in milliseconds as documented by quiche
- do not calculate the idle timeout, rely on
  quiche handling it

Closes #13581
This commit is contained in:
Stefan Eissing 2024-05-10 14:01:20 +02:00 committed by Daniel Stenberg
parent bc5261a1b4
commit 2036bebb07
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -101,7 +101,6 @@ struct cf_quiche_ctx {
struct bufc_pool stream_bufcp; /* chunk pool for streams */
struct Curl_hash streams; /* hash `data->id` to `stream_ctx` */
curl_off_t data_recvd;
curl_uint64_t max_idle_ms; /* max idle time for QUIC conn */
BIT(goaway); /* got GOAWAY from server */
BIT(x509_store_setup); /* if x509 store has been set up */
};
@ -1257,7 +1256,6 @@ static CURLcode cf_connect_start(struct Curl_cfilter *cf,
debug_log_init = 1;
}
#endif
ctx->max_idle_ms = CURL_QUIC_MAX_IDLE_MS;
Curl_bufcp_init(&ctx->stream_bufcp, H3_STREAM_CHUNK_SIZE,
H3_STREAM_POOL_SPARES);
Curl_hash_offt_init(&ctx->streams, 63, h3_stream_hash_free);
@ -1277,7 +1275,7 @@ static CURLcode cf_connect_start(struct Curl_cfilter *cf,
return CURLE_FAILED_INIT;
}
quiche_config_enable_pacing(ctx->cfg, false);
quiche_config_set_max_idle_timeout(ctx->cfg, ctx->max_idle_ms * 1000);
quiche_config_set_max_idle_timeout(ctx->cfg, CURL_QUIC_MAX_IDLE_MS);
quiche_config_set_initial_max_data(ctx->cfg, (1 * 1024 * 1024)
/* (QUIC_MAX_STREAMS/2) * H3_STREAM_WINDOW_SIZE */);
quiche_config_set_initial_max_streams_bidi(ctx->cfg, QUIC_MAX_STREAMS);
@ -1549,23 +1547,12 @@ static bool cf_quiche_conn_is_alive(struct Curl_cfilter *cf,
if(!ctx->qconn)
return FALSE;
/* Both sides of the QUIC connection announce they max idle times in
* the transport parameters. Look at the minimum of both and if
* we exceed this, regard the connection as dead. The other side
* may have completely purged it and will no longer respond
* to any packets from us. */
{
quiche_transport_params qpeerparams;
timediff_t idletime;
curl_uint64_t idle_ms = ctx->max_idle_ms;
if(quiche_conn_peer_transport_params(ctx->qconn, &qpeerparams) &&
qpeerparams.peer_max_idle_timeout &&
qpeerparams.peer_max_idle_timeout < idle_ms)
idle_ms = qpeerparams.peer_max_idle_timeout;
idletime = Curl_timediff(Curl_now(), cf->conn->lastused);
if(idletime > 0 && (curl_uint64_t)idletime > idle_ms)
return FALSE;
if(quiche_conn_is_closed(ctx->qconn)) {
if(quiche_conn_is_timed_out(ctx->qconn))
CURL_TRC_CF(data, cf, "connection was closed due to idle timeout");
else
CURL_TRC_CF(data, cf, "connection is closed");
return FALSE;
}
if(!cf->next || !cf->next->cft->is_alive(cf->next, data, input_pending))