diff --git a/include/haproxy/quic_conn.h b/include/haproxy/quic_conn.h index 599153ab0..b6d2c317c 100644 --- a/include/haproxy/quic_conn.h +++ b/include/haproxy/quic_conn.h @@ -82,6 +82,9 @@ void qc_idle_timer_rearm(struct quic_conn *qc, int read, int arm_ack); void qc_check_close_on_released_mux(struct quic_conn *qc); int quic_stateless_reset_token_cpy(unsigned char *pos, size_t len, const unsigned char *salt, size_t saltlen); +int quic_reuse_srv_params(struct quic_conn *qc, + const unsigned char *alpn, + const struct quic_early_transport_params *etps); /* Free the CIDs attached to QUIC connection. */ static inline void free_quic_conn_cids(struct quic_conn *conn) diff --git a/src/quic_conn.c b/src/quic_conn.c index 4beee74dc..4acb38466 100644 --- a/src/quic_conn.c +++ b/src/quic_conn.c @@ -285,6 +285,30 @@ int quic_set_app_ops(struct quic_conn *qc, const unsigned char *alpn, size_t alp return 1; } +/* Try to reuse ALPN and early transport parameters. + * Return 1 if succeeded, 0 if not. + */ +int quic_reuse_srv_params(struct quic_conn *qc, + const unsigned char *alpn, + const struct quic_early_transport_params *etps) +{ + int ret = 0; + + TRACE_ENTER(QUIC_EV_CONN_NEW, qc); + + if (!alpn || !quic_set_app_ops(qc, alpn, strlen((char *)alpn))) + goto err; + + qc_early_transport_params_reuse(qc, &qc->tx.params, etps); + ret = 1; + leave: + TRACE_LEAVE(QUIC_EV_CONN_NEW, qc); + return ret; + err: + TRACE_DEVEL("leaving on error", QUIC_EV_CONN_NEW, qc); + goto leave; +} + /* Schedule a CONNECTION_CLOSE emission on if the MUX has been released * and all STREAM data are acknowledged. The MUX is responsible to have set * before as it is reused for the CONNECTION_CLOSE frame.