From: Frédéric Lécaille Date: Wed, 24 Aug 2022 16:59:23 +0000 (+0200) Subject: CLEANUP: quic: Remove a useless check in qc_lstnr_pkt_rcv() X-Git-Tag: v2.7-dev5~57 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=560ddfa0035cd747c2f87d70aae2fe897dfef226;p=thirdparty%2Fhaproxy.git CLEANUP: quic: Remove a useless check in qc_lstnr_pkt_rcv() This function parses the QUIC packet from a UDP datagram. It was originally supposed to be run by several thread. Here we remove a section of code where the current thread checks there is not another thread which has already inserted the new quic_conn it is trying to insert in the connections tree. Must be backported to 2.6 to ease the future backports to come. --- diff --git a/src/xprt_quic.c b/src/xprt_quic.c index 2dbb4cba07..ffa2cba1fa 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -5785,7 +5785,7 @@ static void qc_lstnr_pkt_rcv(unsigned char *buf, const unsigned char *end, struct quic_dgram *dgram, struct list **tasklist_head) { unsigned char *beg, *payload; - struct quic_conn *qc, *qc_to_purge = NULL; + struct quic_conn *qc; struct listener *l; struct proxy *prx; struct quic_counters *prx_counters; @@ -5976,7 +5976,6 @@ static void qc_lstnr_pkt_rcv(unsigned char *buf, const unsigned char *end, } if (!qc) { int ipv4; - struct ebmb_node *n = NULL; if (pkt->type != QUIC_PACKET_TYPE_INITIAL) { TRACE_PROTO("Non Initial packet", QUIC_EV_CONN_LPKT, NULL, NULL, NULL, qv); @@ -6019,31 +6018,11 @@ static void qc_lstnr_pkt_rcv(unsigned char *buf, const unsigned char *end, HA_ATOMIC_INC(&prx_counters->half_open_conn); /* Insert the DCID the QUIC client has chosen (only for listeners) */ - n = ebmb_insert(&quic_dghdlrs[tid].odcids, &qc->odcid_node, - qc->odcid.len + qc->odcid.addrlen); - - /* If the insertion failed, it means that another - * thread has already allocated a QUIC connection for - * the same CID. Liberate our allocated connection. - */ - if (unlikely(n != &qc->odcid_node)) { - qc_to_purge = qc; - - qc = ebmb_entry(n, struct quic_conn, odcid_node); - pkt->qc = qc; - } - - if (likely(!qc_to_purge)) { - /* Enqueue this packet. */ - pkt->qc = qc; - } - else { - quic_conn_release(qc_to_purge); - } - } - else { - pkt->qc = qc; + ebmb_insert(&quic_dghdlrs[tid].odcids, &qc->odcid_node, + qc->odcid.len + qc->odcid.addrlen); } + + pkt->qc = qc; } else { TRACE_PROTO("short header packet received", QUIC_EV_CONN_LPKT, qc);