]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: quic: Mark copies of acknowledged frames as acknowledged
authorFrédéric Lécaille <flecaille@haproxy.com>
Mon, 25 Apr 2022 08:28:49 +0000 (10:28 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Thu, 28 Apr 2022 14:22:40 +0000 (16:22 +0200)
We call qc_release_frm() to do so from this function everywhere a frame
is released.

include/haproxy/xprt_quic.h
src/quic_stream.c
src/xprt_quic.c

index 8fb24e3706e7f54f91e821c7cdb70838b93d39bc..a61af090c34a9a949cb7a22ccd29dbe84bdcb0e3 100644 (file)
@@ -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 */
index e5998ef1ff690ae6fdc52947ea9628c6563c2fc4..bb96738798e1fd00bb7fb4c4ef27692154450857 100644 (file)
@@ -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);
index b43e65edfb9138a651bbb72aa10f2a32e6679092..57f99423e10fa2a3d31a3f5709635b3e98f5b6a8 100644 (file)
@@ -1445,7 +1445,7 @@ static void qc_frm_unref(struct quic_conn *qc, struct quic_frame *frm)
 }
 
 /* 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 @@ 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) {