From: Frédéric Lécaille Date: Mon, 25 Apr 2022 08:28:49 +0000 (+0200) Subject: MEDIUM: quic: Mark copies of acknowledged frames as acknowledged X-Git-Tag: v2.6-dev8~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=da342556c33f214f684eaa81cec67a6cacf2db7e;p=thirdparty%2Fhaproxy.git MEDIUM: quic: Mark copies of acknowledged frames as acknowledged We call qc_release_frm() to do so from this function everywhere a frame is released. --- diff --git a/include/haproxy/xprt_quic.h b/include/haproxy/xprt_quic.h index 8fb24e3706..a61af090c3 100644 --- a/include/haproxy/xprt_quic.h +++ b/include/haproxy/xprt_quic.h @@ -1250,5 +1250,7 @@ int qc_send_app_pkts(struct quic_conn *qc, int old_data, struct list *frms); void qc_notify_close(struct quic_conn *qc); +void qc_release_frm(struct quic_conn *qc, struct quic_frame *frm); + #endif /* USE_QUIC */ #endif /* _HAPROXY_XPRT_QUIC_H */ diff --git a/src/quic_stream.c b/src/quic_stream.c index e5998ef1ff..bb96738798 100644 --- a/src/quic_stream.c +++ b/src/quic_stream.c @@ -185,9 +185,7 @@ void qc_stream_desc_free(struct qc_stream_desc *stream) eb64_delete(&strm->offset); frm = container_of(strm, struct quic_frame, stream); - LIST_DELETE(&frm->list); - quic_tx_packet_refdec(frm->pkt); - pool_free(pool_head_quic_frame, frm); + qc_release_frm(qc, frm); } eb64_delete(&stream->by_id); diff --git a/src/xprt_quic.c b/src/xprt_quic.c index b43e65edfb..57f99423e1 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -1445,7 +1445,7 @@ static void qc_frm_unref(struct quic_conn *qc, struct quic_frame *frm) } /* Release frame and mark its copies as acknowledged */ -static void qc_release_frm(struct quic_conn *qc, struct quic_frame *frm) +void qc_release_frm(struct quic_conn *qc, struct quic_frame *frm) { uint64_t pn; struct quic_frame *origin, *f, *tmp; @@ -1519,9 +1519,7 @@ static int quic_stream_try_to_consume(struct quic_conn *qc, eb64_delete(&strm->offset); frm = container_of(strm, struct quic_frame, stream); - LIST_DELETE(&frm->list); - quic_tx_packet_refdec(frm->pkt); - pool_free(pool_head_quic_frame, frm); + qc_release_frm(qc, frm); } return ret; @@ -1532,7 +1530,6 @@ static inline void qc_treat_acked_tx_frm(struct quic_conn *qc, struct quic_frame *frm) { int stream_acked; - uint64_t pn; TRACE_PROTO("Removing frame", QUIC_EV_CONN_PRSAFRM, qc, frm); stream_acked = 0; @@ -1555,13 +1552,7 @@ static inline void qc_treat_acked_tx_frm(struct quic_conn *qc, node = eb64_lookup(&qc->streams_by_id, strm_frm->id); if (!node) { TRACE_PROTO("acked stream for released stream", QUIC_EV_CONN_ACKSTRM, qc, strm_frm); - LIST_DELETE(&frm->list); - pn = frm->pkt->pn_node.key; - quic_tx_packet_refdec(frm->pkt); - TRACE_PROTO("freeing frame from packet", - QUIC_EV_CONN_PRSAFRM, qc, frm, &pn); - pool_free(pool_head_quic_frame, frm); - + qc_release_frm(qc, frm); /* early return */ return; } @@ -1578,21 +1569,13 @@ static inline void qc_treat_acked_tx_frm(struct quic_conn *qc, if (!stream) { /* no need to continue if stream freed. */ TRACE_PROTO("stream released and freed", QUIC_EV_CONN_ACKSTRM, qc); - LIST_DELETE(&frm->list); - pn = frm->pkt->pn_node.key; - quic_tx_packet_refdec(frm->pkt); - TRACE_PROTO("freeing frame from packet", - QUIC_EV_CONN_PRSAFRM, qc, frm, &pn); - pool_free(pool_head_quic_frame, frm); + qc_release_frm(qc, frm); break; } - LIST_DELETE(&frm->list); - pn = frm->pkt->pn_node.key; - quic_tx_packet_refdec(frm->pkt); - TRACE_PROTO("freeing frame from packet", - QUIC_EV_CONN_PRSAFRM, qc, frm, &pn); - pool_free(pool_head_quic_frame, frm); + TRACE_PROTO("stream consumed", QUIC_EV_CONN_ACKSTRM, + qc, strm_frm, stream); + qc_release_frm(qc, frm); } else { eb64_insert(&stream->acked_frms, &strm_frm->offset); @@ -1602,12 +1585,7 @@ static inline void qc_treat_acked_tx_frm(struct quic_conn *qc, } break; default: - LIST_DELETE(&frm->list); - pn = frm->pkt->pn_node.key; - quic_tx_packet_refdec(frm->pkt); - TRACE_PROTO("freeing frame from packet", - QUIC_EV_CONN_PRSAFRM, qc, frm, &pn); - pool_free(pool_head_quic_frame, frm); + qc_release_frm(qc, frm); } if (stream_acked && qc->mux_state == QC_MUX_READY) {