From 008386bec4bce4263a8968370f9e67cdf58a25f2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20L=C3=A9caille?= Date: Tue, 30 Nov 2021 12:01:32 +0100 Subject: [PATCH] MINOR: quic: Delete the ODCIDs asap As soon as the connection ID (the one choosen by the QUIC server) has been used by the client, we can delete its original destination connection ID from its tree. --- include/haproxy/xprt_quic-t.h | 2 ++ src/xprt_quic.c | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/include/haproxy/xprt_quic-t.h b/include/haproxy/xprt_quic-t.h index cd2a2c804..ec18c1ec6 100644 --- a/include/haproxy/xprt_quic-t.h +++ b/include/haproxy/xprt_quic-t.h @@ -619,6 +619,8 @@ struct rxbuf { #define QUIC_FL_PKTNS_ACK_REQUIRED (1UL << QUIC_FL_PKTNS_ACK_REQUIRED_BIT) #define QUIC_FL_CONN_ANTI_AMPLIFICATION_REACHED (1U << 1) +#define QUIC_FL_CONN_ODCID_NODE_TO_DELETE_BIT 2 +#define QUIC_FL_CONN_ODCID_NODE_TO_DELETE (1U << QUIC_FL_CONN_ODCID_NODE_TO_DELETE_BIT) #define QUIC_FL_CONN_IMMEDIATE_CLOSE (1U << 31) struct quic_conn { uint32_t version; diff --git a/src/xprt_quic.c b/src/xprt_quic.c index 9732ec17d..c7056c07a 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -3996,6 +3996,7 @@ static ssize_t qc_lstnr_pkt_rcv(unsigned char **buf, const unsigned char *end, HA_RWLOCK_WRLOCK(QUIC_LOCK, &l->rx.cids_lock); /* Insert the DCID the QUIC client has chosen (only for listeners) */ n = ebmb_insert(&l->rx.odcids, &qc->odcid_node, qc->odcid.len); + HA_ATOMIC_OR(&qc->flags, QUIC_FL_CONN_ODCID_NODE_TO_DELETE); HA_RWLOCK_WRUNLOCK(QUIC_LOCK, &l->rx.cids_lock); /* If the insertion failed, it means that another @@ -4025,6 +4026,12 @@ static ssize_t qc_lstnr_pkt_rcv(unsigned char **buf, const unsigned char *end, else { struct quic_connection_id *cid = ebmb_entry(node, struct quic_connection_id, node); qc = cid->qc; + if (HA_ATOMIC_BTR(&qc->flags, QUIC_FL_CONN_ODCID_NODE_TO_DELETE_BIT)) { + /* Delete the ODCID from its tree */ + HA_RWLOCK_WRLOCK(QUIC_LOCK, &l->rx.cids_lock); + ebmb_delete(&qc->odcid_node); + HA_RWLOCK_WRUNLOCK(QUIC_LOCK, &l->rx.cids_lock); + } } pkt->qc = qc; if (HA_ATOMIC_LOAD(&qc->conn)) -- 2.47.3