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 8fb24e3..a61af09 100644
--- a/include/haproxy/xprt_quic.h
+++ b/include/haproxy/xprt_quic.h
@@ -1250,5 +1250,7 @@
 
 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 e5998ef..bb96738 100644
--- a/src/quic_stream.c
+++ b/src/quic_stream.c
@@ -185,9 +185,7 @@
 		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 b43e65e..57f9942 100644
--- a/src/xprt_quic.c
+++ b/src/xprt_quic.c
@@ -1445,7 +1445,7 @@
 }
 
 /* Release <frm> 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 @@
 		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 @@
                                          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 @@
 		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 @@
 			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 @@
 	}
 	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) {