From: Frédéric Lécaille Date: Tue, 30 Nov 2021 11:01:32 +0000 (+0100) Subject: MINOR: quic: Delete the ODCIDs asap X-Git-Tag: v2.6-dev1~347 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=008386bec4bce4263a8968370f9e67cdf58a25f2;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/include/haproxy/xprt_quic-t.h b/include/haproxy/xprt_quic-t.h index cd2a2c8043..ec18c1ec67 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 9732ec17df..c7056c07a4 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))