From be373150c7f90fc69ccd110ed38eadb6ca0735f3 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 6 Sep 2018 11:45:30 +0200 Subject: [PATCH] MINOR: connection: make the initialization more consistent Sometimes a connection is prepared before the target is set, sometimes after. There's no real rule since the few functions involved operate on different and independent fields. Soon we'll benefit from knowing the target at the connection layer, in order to figure the associated proxy and retrieve the various parameters (timeouts etc). This patch slightly reorders a few calls to conn_prepare() so that we can make sure that the target is always known to the mux. --- include/proto/connection.h | 4 +++- src/checks.c | 13 +++++++------ src/peers.c | 5 +++-- src/session.c | 3 +-- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/include/proto/connection.h b/include/proto/connection.h index dfaaad78d..a68392656 100644 --- a/include/proto/connection.h +++ b/include/proto/connection.h @@ -579,7 +579,9 @@ static inline int conn_xprt_read0_pending(struct connection *c) /* prepares a connection to work with protocol and transport . * The transport's is initialized as well, and the mux and its context are - * cleared. + * cleared. The target is not reinitialized and it is recommended that it is + * set prior to calling this function so that the function may make use of it + * in the future to refine the mux choice if needed. */ static inline void conn_prepare(struct connection *conn, const struct protocol *proto, const struct xprt_ops *xprt) { diff --git a/src/checks.c b/src/checks.c index fc1384580..28ee4c473 100644 --- a/src/checks.c +++ b/src/checks.c @@ -1588,13 +1588,9 @@ static int connect_conn_chk(struct task *t) } proto = protocol_by_family(conn->addr.to.ss_family); - - conn_prepare(conn, proto, check->xprt); - conn_install_mux(conn, &mux_pt_ops, cs); - cs_attach(cs, check, &check_conn_cb); conn->target = &s->obj_type; - if ((conn->addr.to.ss_family == AF_INET) || (conn->addr.to.ss_family == AF_INET6)) { + if ((conn->addr.to.ss_family == AF_INET) || (conn->addr.to.ss_family == AF_INET6)) { int i = 0; i = srv_check_healthcheck_port(check); @@ -1607,6 +1603,10 @@ static int connect_conn_chk(struct task *t) /* no client address */ clear_addr(&conn->addr.from); + conn_prepare(conn, proto, check->xprt); + conn_install_mux(conn, &mux_pt_ops, cs); + cs_attach(cs, check, &check_conn_cb); + /* only plain tcp-check supports quick ACK */ quickack = check->type == 0 || check->type == PR_O2_TCPCHK_CHK; @@ -2766,7 +2766,6 @@ static int tcpcheck_main(struct check *check) check->cs = cs; conn = cs->conn; - cs_attach(cs, check, &check_conn_cb); conn->target = &s->obj_type; /* no client address */ @@ -2796,8 +2795,10 @@ static int tcpcheck_main(struct check *check) else { xprt = xprt_get(XPRT_RAW); } + conn_prepare(conn, proto, xprt); conn_install_mux(conn, &mux_pt_ops, cs); + cs_attach(cs, check, &check_conn_cb); ret = SF_ERR_INTERNAL; if (proto->connect) diff --git a/src/peers.c b/src/peers.c index f26c3dfb9..1fefa9431 100644 --- a/src/peers.c +++ b/src/peers.c @@ -1969,12 +1969,13 @@ static struct appctx *peer_session_create(struct peers *peers, struct peer *peer if (unlikely((cs = cs_new(conn)) == NULL)) goto out_free_conn; + conn->target = s->target = &s->be->obj_type; + memcpy(&conn->addr.to, &peer->addr, sizeof(conn->addr.to)); + conn_prepare(conn, peer->proto, peer->xprt); conn_install_mux(conn, &mux_pt_ops, cs); si_attach_cs(&s->si[1], cs); - conn->target = s->target = &s->be->obj_type; - memcpy(&conn->addr.to, &peer->addr, sizeof(conn->addr.to)); s->do_log = NULL; s->uniq_id = 0; diff --git a/src/session.c b/src/session.c index c40e4f60e..c9d50df5b 100644 --- a/src/session.c +++ b/src/session.c @@ -135,14 +135,13 @@ int session_accept_fd(struct listener *l, int cfd, struct sockaddr_storage *addr if (unlikely((cli_conn = conn_new()) == NULL)) goto out_close; - conn_prepare(cli_conn, l->proto, l->bind_conf->xprt); - cli_conn->handle.fd = cfd; cli_conn->addr.from = *addr; cli_conn->flags |= CO_FL_ADDR_FROM_SET; cli_conn->target = &l->obj_type; cli_conn->proxy_netns = l->netns; + conn_prepare(cli_conn, l->proto, l->bind_conf->xprt); conn_ctrl_init(cli_conn); /* wait for a PROXY protocol header */