diff --git a/include/haproxy/quic_sock.h b/include/haproxy/quic_sock.h index 672255ed3..652bc414b 100644 --- a/include/haproxy/quic_sock.h +++ b/include/haproxy/quic_sock.h @@ -33,6 +33,7 @@ #include #include +int quic_session_accept(struct connection *cli_conn); int quic_sock_accepting_conn(const struct receiver *rx); struct connection *quic_sock_accept_conn(struct listener *l, int *status); void quic_sock_fd_iocb(int fd); diff --git a/src/cfgparse.c b/src/cfgparse.c index 77af77323..6ce2f529e 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -3901,7 +3901,12 @@ int check_config_validity() if (!listener->maxaccept) listener->maxaccept = global.tune.maxaccept ? global.tune.maxaccept : MAX_ACCEPT; - listener->accept = session_accept_fd; + /* listener->accept may already be initialized by some + * protocols so do not overwrite it in this case. + */ + if (!listener->accept) + listener->accept = session_accept_fd; + listener->analysers |= curproxy->fe_req_ana; listener->default_target = curproxy->default_target; diff --git a/src/proto_quic.c b/src/proto_quic.c index 9c2bbd6ef..29ae209bd 100644 --- a/src/proto_quic.c +++ b/src/proto_quic.c @@ -518,6 +518,9 @@ int quic_connect_server(struct connection *conn, int flags) */ static void quic_add_listener(struct protocol *proto, struct listener *listener) { + /* custom accept callback for QUIC */ + listener->accept = quic_session_accept; + MT_LIST_INIT(&listener->rx.pkts); listener->rx.odcids = EB_ROOT_UNIQUE; listener->rx.cids = EB_ROOT_UNIQUE; diff --git a/src/quic_sock.c b/src/quic_sock.c index 080853f48..bb593738e 100644 --- a/src/quic_sock.c +++ b/src/quic_sock.c @@ -107,8 +107,6 @@ static int new_quic_cli_conn(struct quic_conn *qc, struct listener *l, cli_conn->handle.fd = l->rx.fd; cli_conn->target = &l->obj_type; - /* XXX Should not be there. */ - l->accept = quic_session_accept; /* We need the xprt context before accepting (->accept()) the connection: * we may receive packet before this connection acception. */