From: Willy Tarreau Date: Thu, 6 Sep 2018 09:45:30 +0000 (+0200) Subject: MINOR: connection: make the initialization more consistent X-Git-Tag: v1.9-dev2~78 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=be373150c7f90fc69ccd110ed38eadb6ca0735f3;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/include/proto/connection.h b/include/proto/connection.h index dfaaad78d2..a683926566 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 fc1384580f..28ee4c473c 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 f26c3dfb9e..1fefa9431c 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 c40e4f60e1..c9d50df5b7 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 */