]> git.ipfire.org Git - thirdparty/haproxy.git/commit
MEDIUM/OPTIM: quic: alloc quic_conn after CID collision check
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Mon, 10 Nov 2025 10:02:45 +0000 (11:02 +0100)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Mon, 10 Nov 2025 11:10:14 +0000 (12:10 +0100)
commit5a8728d03a491b89a25b5452fdf71a0cebf4e6aa
tree9789650e1f2bdea262665f08e4923b1d2f300cce
parenta9d11ab7f320e315d54a396d14cfd1395a0adf89
MEDIUM/OPTIM: quic: alloc quic_conn after CID collision check

On Initial packet parsing, a new quic_conn instance is allocated via
qc_new_conn(). Then a CID is allocated with its value derivated from
client ODCID. On CID tree insert, a collision can occur if another
thread was already parsing an Initial packet from the same client. In
this case, the connection is released and the packet will be requeued to
the other thread.

Originally, CID collision check was performed prior to quic_conn
allocation. This was changed by the commit below, as this could cause
issue on quic_conn alloc failure.

  commit 4ae29be18c5b212dd2a1a8e9fa0ee2fcb9dbb4b3
  BUG/MINOR: quic: Possible endless loop in quic_lstnr_dghdlr()

However, this procedure is less optimal. Indeed, qc_new_conn() performs
many steps, thus it could be better to skip it on Initial CID collision,
which can happen frequently. This patch restores the older order of
operations, with CID collision check prior to quic_conn allocation.

To ensure this does not cause again the same bug, the CID is removed in
case of quic_conn alloc failure. This should prevent any loop as it
ensures that a CID found in the global tree does not point to a NULL
quic_conn, unless if CID is attach to a foreign thread. When this thread
will parse a re-enqueued packet, either the quic_conn is already
allocated or the CID has been removed, triggering a fresh CID and
quic_conn allocation procedure.
include/haproxy/quic_cid.h
src/quic_cid.c
src/quic_conn.c
src/quic_rx.c