diff --git a/include/haproxy/quic_conn-t.h b/include/haproxy/quic_conn-t.h index 7aecde5d3..e3b1d4ce0 100644 --- a/include/haproxy/quic_conn-t.h +++ b/include/haproxy/quic_conn-t.h @@ -305,6 +305,7 @@ struct qcc_app_ops; /* Number of received bytes. */ \ uint64_t rx; \ } bytes; \ + size_t max_udp_payload; \ /* First DCID used by client on its Initial packet. */ \ struct quic_cid odcid; \ /* DCID of our endpoint - not updated when a new DCID is used */ \ diff --git a/src/quic_conn.c b/src/quic_conn.c index 1d9ce9666..1be6c9687 100644 --- a/src/quic_conn.c +++ b/src/quic_conn.c @@ -1238,6 +1238,10 @@ struct quic_conn *qc_new_conn(const struct quic_version *qv, int ipv4, qc->rx.buf = b_make(qc->rx.buf.area, QUIC_CONN_RX_BUFSZ, 0, 0); qc->rx.stream_max_uni = qc->rx.stream_max_bidi = 0; + qc->max_udp_payload = l ? + l->bind_conf->quic_params.max_udp_payload_size : + srv->quic_params.max_udp_payload_size; + qc->nb_pkt_for_cc = 1; qc->nb_pkt_since_cc = 0; diff --git a/src/quic_sock.c b/src/quic_sock.c index 7af0bad54..4cd9317cc 100644 --- a/src/quic_sock.c +++ b/src/quic_sock.c @@ -815,10 +815,8 @@ int qc_snd_buf(struct quic_conn *qc, const struct buffer *buf, size_t sz, int qc_rcv_buf(struct quic_conn *qc) { struct sockaddr_storage saddr = {0}, daddr = {0}; - struct quic_transport_params *params; struct quic_dgram *new_dgram = NULL; struct buffer buf = BUF_NULL; - size_t max_sz; unsigned char *dgram_buf; struct listener *l; ssize_t ret = 0; @@ -829,22 +827,19 @@ int qc_rcv_buf(struct quic_conn *qc) TRACE_ENTER(QUIC_EV_CONN_RCV, qc); l = qc->li; - params = &l->bind_conf->quic_params; - max_sz = params->max_udp_payload_size; - do { if (!b_alloc(&buf, DB_MUX_RX)) break; /* TODO subscribe for memory again available. */ b_reset(&buf); - BUG_ON(b_contig_space(&buf) < max_sz); + BUG_ON(b_contig_space(&buf) < qc->max_udp_payload); /* Allocate datagram on first loop or after requeuing. */ if (!new_dgram && !(new_dgram = pool_alloc(pool_head_quic_dgram))) break; /* TODO subscribe for memory again available. */ dgram_buf = (unsigned char *)b_tail(&buf); - ret = quic_recv(qc->fd, dgram_buf, max_sz, + ret = quic_recv(qc->fd, dgram_buf, qc->max_udp_payload, (struct sockaddr *)&saddr, sizeof(saddr), (struct sockaddr *)&daddr, sizeof(daddr), get_net_port(&qc->local_addr));