From: Frédéric Lécaille Date: Fri, 28 Jan 2022 14:38:52 +0000 (+0100) Subject: MINOR: quic: Iterate over all received datagrams X-Git-Tag: v2.6-dev1~42 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=df1c7c78c1f0ae711a06bb9e9e74fd9535d31021;p=thirdparty%2Fhaproxy.git MINOR: quic: Iterate over all received datagrams Make the listener datagram handler iterate over all received datagrams --- diff --git a/src/xprt_quic.c b/src/xprt_quic.c index a3a7bd0d69..caea3e67c7 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -5368,37 +5368,39 @@ struct task *quic_lstnr_dghdlr(struct task *t, void *ctx, unsigned int state) struct quic_dgram *dgram; int first_pkt = 1; - dgram = MT_LIST_POP(&dghdlr->dgrams, typeof(dgram), mt_list); - if (!dgram) - goto err; + while ((dgram = MT_LIST_POP(&dghdlr->dgrams, typeof(dgram), mt_list))) { + if (!dgram) + goto err; - pos = dgram->buf; - end = pos + dgram->len; - do { - int ret; - struct quic_rx_packet *pkt; + pos = dgram->buf; + end = pos + dgram->len; + do { + int ret; + struct quic_rx_packet *pkt; - pkt = pool_zalloc(pool_head_quic_rx_packet); - if (!pkt) - goto err; + pkt = pool_zalloc(pool_head_quic_rx_packet); + if (!pkt) + goto err; - quic_rx_packet_refinc(pkt); - ret = qc_lstnr_pkt_rcv(pos, end, pkt, first_pkt, dgram); - first_pkt = 0; - pos += pkt->len; - quic_rx_packet_refdec(pkt); - if (ret == -1) - /* If the packet length could not be found, we cannot continue. */ - break; - } while (pos < end); - /* Mark this datagram as consumed */ - HA_ATOMIC_STORE(&dgram->buf, NULL); + quic_rx_packet_refinc(pkt); + ret = qc_lstnr_pkt_rcv(pos, end, pkt, first_pkt, dgram); + first_pkt = 0; + pos += pkt->len; + quic_rx_packet_refdec(pkt); + if (ret == -1) + /* If the packet length could not be found, we cannot continue. */ + break; + } while (pos < end); - /* Increasing the received bytes counter by the UDP datagram length - * if this datagram could be associated to a connection. - */ - if (dgram->qc) - dgram->qc->rx.bytes += dgram->len; + /* Mark this datagram as consumed */ + HA_ATOMIC_STORE(&dgram->buf, NULL); + + /* Increasing the received bytes counter by the UDP datagram length + * if this datagram could be associated to a connection. + */ + if (dgram->qc) + dgram->qc->rx.bytes += dgram->len; + } return t;