mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-23 14:51:27 +02:00
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.
This commit is contained in:
parent
1809c33d6e
commit
da342556c3
@ -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_notify_close(struct quic_conn *qc);
|
||||||
|
|
||||||
|
void qc_release_frm(struct quic_conn *qc, struct quic_frame *frm);
|
||||||
|
|
||||||
#endif /* USE_QUIC */
|
#endif /* USE_QUIC */
|
||||||
#endif /* _HAPROXY_XPRT_QUIC_H */
|
#endif /* _HAPROXY_XPRT_QUIC_H */
|
||||||
|
@ -185,9 +185,7 @@ void qc_stream_desc_free(struct qc_stream_desc *stream)
|
|||||||
eb64_delete(&strm->offset);
|
eb64_delete(&strm->offset);
|
||||||
|
|
||||||
frm = container_of(strm, struct quic_frame, stream);
|
frm = container_of(strm, struct quic_frame, stream);
|
||||||
LIST_DELETE(&frm->list);
|
qc_release_frm(qc, frm);
|
||||||
quic_tx_packet_refdec(frm->pkt);
|
|
||||||
pool_free(pool_head_quic_frame, frm);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
eb64_delete(&stream->by_id);
|
eb64_delete(&stream->by_id);
|
||||||
|
@ -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 */
|
/* 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;
|
uint64_t pn;
|
||||||
struct quic_frame *origin, *f, *tmp;
|
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);
|
eb64_delete(&strm->offset);
|
||||||
|
|
||||||
frm = container_of(strm, struct quic_frame, stream);
|
frm = container_of(strm, struct quic_frame, stream);
|
||||||
LIST_DELETE(&frm->list);
|
qc_release_frm(qc, frm);
|
||||||
quic_tx_packet_refdec(frm->pkt);
|
|
||||||
pool_free(pool_head_quic_frame, frm);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -1532,7 +1530,6 @@ static inline void qc_treat_acked_tx_frm(struct quic_conn *qc,
|
|||||||
struct quic_frame *frm)
|
struct quic_frame *frm)
|
||||||
{
|
{
|
||||||
int stream_acked;
|
int stream_acked;
|
||||||
uint64_t pn;
|
|
||||||
|
|
||||||
TRACE_PROTO("Removing frame", QUIC_EV_CONN_PRSAFRM, qc, frm);
|
TRACE_PROTO("Removing frame", QUIC_EV_CONN_PRSAFRM, qc, frm);
|
||||||
stream_acked = 0;
|
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);
|
node = eb64_lookup(&qc->streams_by_id, strm_frm->id);
|
||||||
if (!node) {
|
if (!node) {
|
||||||
TRACE_PROTO("acked stream for released stream", QUIC_EV_CONN_ACKSTRM, qc, strm_frm);
|
TRACE_PROTO("acked stream for released stream", QUIC_EV_CONN_ACKSTRM, qc, strm_frm);
|
||||||
LIST_DELETE(&frm->list);
|
qc_release_frm(qc, frm);
|
||||||
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);
|
|
||||||
|
|
||||||
/* early return */
|
/* early return */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1578,21 +1569,13 @@ static inline void qc_treat_acked_tx_frm(struct quic_conn *qc,
|
|||||||
if (!stream) {
|
if (!stream) {
|
||||||
/* no need to continue if stream freed. */
|
/* no need to continue if stream freed. */
|
||||||
TRACE_PROTO("stream released and freed", QUIC_EV_CONN_ACKSTRM, qc);
|
TRACE_PROTO("stream released and freed", QUIC_EV_CONN_ACKSTRM, qc);
|
||||||
LIST_DELETE(&frm->list);
|
qc_release_frm(qc, frm);
|
||||||
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);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
LIST_DELETE(&frm->list);
|
TRACE_PROTO("stream consumed", QUIC_EV_CONN_ACKSTRM,
|
||||||
pn = frm->pkt->pn_node.key;
|
qc, strm_frm, stream);
|
||||||
quic_tx_packet_refdec(frm->pkt);
|
qc_release_frm(qc, frm);
|
||||||
TRACE_PROTO("freeing frame from packet",
|
|
||||||
QUIC_EV_CONN_PRSAFRM, qc, frm, &pn);
|
|
||||||
pool_free(pool_head_quic_frame, frm);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
eb64_insert(&stream->acked_frms, &strm_frm->offset);
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
LIST_DELETE(&frm->list);
|
qc_release_frm(qc, frm);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stream_acked && qc->mux_state == QC_MUX_READY) {
|
if (stream_acked && qc->mux_state == QC_MUX_READY) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user