diff --git a/src/mux_quic.c b/src/mux_quic.c index 78baccb82..513ca5aa1 100644 --- a/src/mux_quic.c +++ b/src/mux_quic.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -974,6 +975,7 @@ static int qcc_decode_qcs(struct qcc *qcc, struct qcs *qcs) struct buffer b; ssize_t ret; int fin = 0; + int prev_glitches = qcc->glitches; TRACE_ENTER(QMUX_EV_QCS_RECV, qcc->conn, qcs); @@ -985,6 +987,10 @@ static int qcc_decode_qcs(struct qcc *qcc, struct qcs *qcs) if (!(qcs->flags & QC_SF_READ_ABORTED)) { ret = qcc->app_ops->rcv_buf(qcs, &b, fin); + + if (qcc->glitches != prev_glitches) + session_add_glitch_ctr(qcc->conn->owner, qcc->glitches - prev_glitches); + if (ret < 0) { TRACE_ERROR("decoding error", QMUX_EV_QCS_RECV, qcc->conn, qcs); goto err; @@ -1566,6 +1572,7 @@ int qcc_recv_max_stream_data(struct qcc *qcc, uint64_t id, uint64_t max) int qcc_recv_reset_stream(struct qcc *qcc, uint64_t id, uint64_t err, uint64_t final_size) { struct qcs *qcs; + int prev_glitches = qcc->glitches; TRACE_ENTER(QMUX_EV_QCC_RECV, qcc->conn); @@ -1624,6 +1631,9 @@ int qcc_recv_reset_stream(struct qcc *qcc, uint64_t id, uint64_t err, uint64_t f qcs_free_ncbuf(qcs, &qcs->rx.ncbuf); out: + if (qcc->glitches != prev_glitches) + session_add_glitch_ctr(qcc->conn->owner, qcc->glitches - prev_glitches); + TRACE_LEAVE(QMUX_EV_QCC_RECV, qcc->conn); return 0; @@ -1641,6 +1651,7 @@ int qcc_recv_reset_stream(struct qcc *qcc, uint64_t id, uint64_t err, uint64_t f int qcc_recv_stop_sending(struct qcc *qcc, uint64_t id, uint64_t err) { struct qcs *qcs; + int prev_glitches = qcc->glitches; TRACE_ENTER(QMUX_EV_QCC_RECV, qcc->conn); @@ -1726,6 +1737,9 @@ int qcc_recv_stop_sending(struct qcc *qcc, uint64_t id, uint64_t err) qcc_refresh_timeout(qcc); out: + if (qcc->glitches != prev_glitches) + session_add_glitch_ctr(qcc->conn->owner, qcc->glitches - prev_glitches); + TRACE_LEAVE(QMUX_EV_QCC_RECV, qcc->conn); return 0;