diff --git a/include/haproxy/connection.h b/include/haproxy/connection.h index b09748860..8ccb31d38 100644 --- a/include/haproxy/connection.h +++ b/include/haproxy/connection.h @@ -312,7 +312,7 @@ static inline void cs_init(struct conn_stream *cs, struct connection *conn) * is about to be reused. It also leaves the addresses untouched, which makes * it usable across connection retries to reset a connection to a known state. */ -static inline void conn_init(struct connection *conn) +static inline void conn_init(struct connection *conn, void *target) { conn->obj_type = OBJ_TYPE_CONN; conn->flags = CO_FL_NONE; @@ -322,7 +322,7 @@ static inline void conn_init(struct connection *conn) conn->send_proxy_ofs = 0; conn->handle.fd = DEAD_FD_MAGIC; conn->err_code = CO_ER_NONE; - conn->target = NULL; + conn->target = target; conn->destroy_cb = NULL; conn->proxy_netns = NULL; MT_LIST_INIT(&conn->list); @@ -388,13 +388,13 @@ static inline void sockaddr_free(struct sockaddr_storage **sap) * connection is returned on success, NULL on failure. The connection must * be released using pool_free() or conn_free(). */ -static inline struct connection *conn_new() +static inline struct connection *conn_new(void *target) { struct connection *conn; conn = pool_alloc(pool_head_connection); if (likely(conn != NULL)) - conn_init(conn); + conn_init(conn, target); return conn; } @@ -414,7 +414,7 @@ static inline void cs_free(struct conn_stream *cs) * to the mux's stream list on success, then returned. On failure, nothing is * allocated and NULL is returned. */ -static inline struct conn_stream *cs_new(struct connection *conn) +static inline struct conn_stream *cs_new(struct connection *conn, void *target) { struct conn_stream *cs; @@ -423,12 +423,11 @@ static inline struct conn_stream *cs_new(struct connection *conn) return NULL; if (!conn) { - conn = conn_new(); + conn = conn_new(target); if (unlikely(!conn)) { cs_free(cs); return NULL; } - conn_init(conn); } cs_init(cs, conn); diff --git a/include/haproxy/stream_interface.h b/include/haproxy/stream_interface.h index 66159d581..a81a84f54 100644 --- a/include/haproxy/stream_interface.h +++ b/include/haproxy/stream_interface.h @@ -372,7 +372,7 @@ static inline struct conn_stream *si_alloc_cs(struct stream_interface *si, struc si_release_endpoint(si); - cs = cs_new(conn); + cs = cs_new(conn, conn->target); if (cs) si_attach_cs(si, cs); diff --git a/src/backend.c b/src/backend.c index 8556d4c0a..47f4bffb5 100644 --- a/src/backend.c +++ b/src/backend.c @@ -1368,10 +1368,8 @@ int connect_server(struct stream *s) /* no reuse or failed to reuse the connection above, pick a new one */ if (!srv_conn) { - srv_conn = conn_new(); + srv_conn = conn_new(s->target); was_unused = 1; - if (srv_conn) - srv_conn->target = s->target; srv_cs = NULL; srv_conn->owner = s->sess; diff --git a/src/mux_fcgi.c b/src/mux_fcgi.c index 88cc6b1e4..58d492308 100644 --- a/src/mux_fcgi.c +++ b/src/mux_fcgi.c @@ -3436,7 +3436,7 @@ static struct conn_stream *fcgi_attach(struct connection *conn, struct session * struct fcgi_conn *fconn = conn->ctx; TRACE_ENTER(FCGI_EV_FSTRM_NEW, conn); - cs = cs_new(conn); + cs = cs_new(conn, conn->target); if (!cs) { TRACE_DEVEL("leaving on CS allocation failure", FCGI_EV_FSTRM_NEW|FCGI_EV_FSTRM_ERR, conn); return NULL; diff --git a/src/mux_h1.c b/src/mux_h1.c index a27c2d0a3..3268aff6e 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -473,7 +473,7 @@ static struct conn_stream *h1s_new_cs(struct h1s *h1s) struct conn_stream *cs; TRACE_ENTER(H1_EV_STRM_NEW, h1s->h1c->conn, h1s); - cs = cs_new(h1s->h1c->conn); + cs = cs_new(h1s->h1c->conn, h1s->h1c->conn->target); if (!cs) { TRACE_DEVEL("leaving on CS allocation failure", H1_EV_STRM_NEW|H1_EV_STRM_END|H1_EV_STRM_ERR, h1s->h1c->conn, h1s); goto err; @@ -2372,7 +2372,7 @@ static struct conn_stream *h1_attach(struct connection *conn, struct session *se goto end; } - cs = cs_new(h1c->conn); + cs = cs_new(h1c->conn, h1c->conn->target); if (!cs) { TRACE_DEVEL("leaving on CS allocation failure", H1_EV_STRM_NEW|H1_EV_STRM_END|H1_EV_STRM_ERR, conn); goto end; diff --git a/src/mux_h2.c b/src/mux_h2.c index ea79371bb..4b790e614 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -1352,7 +1352,7 @@ static struct h2s *h2c_frt_stream_new(struct h2c *h2c, int id) if (!h2s) goto out; - cs = cs_new(h2c->conn); + cs = cs_new(h2c->conn, h2c->conn->target); if (!cs) goto out_close; @@ -3818,7 +3818,7 @@ static struct conn_stream *h2_attach(struct connection *conn, struct session *se struct h2c *h2c = conn->ctx; TRACE_ENTER(H2_EV_H2S_NEW, conn); - cs = cs_new(conn); + cs = cs_new(conn, conn->target); if (!cs) { TRACE_DEVEL("leaving on CS allocation failure", H2_EV_H2S_NEW|H2_EV_H2S_ERR, conn); return NULL; diff --git a/src/mux_pt.c b/src/mux_pt.c index 9a96fb862..a9fe0091f 100644 --- a/src/mux_pt.c +++ b/src/mux_pt.c @@ -100,7 +100,7 @@ static int mux_pt_init(struct connection *conn, struct proxy *prx, struct sessio ctx->conn = conn; if (!cs) { - cs = cs_new(conn); + cs = cs_new(conn, conn->target); if (!cs) goto fail_free_ctx; @@ -167,7 +167,7 @@ static struct conn_stream *mux_pt_attach(struct connection *conn, struct session if (ctx->wait_event.events) conn->xprt->unsubscribe(ctx->conn, conn->xprt_ctx, SUB_RETRY_RECV, &ctx->wait_event); - cs = cs_new(conn); + cs = cs_new(conn, conn->target); if (!cs) goto fail; diff --git a/src/session.c b/src/session.c index 4fad934ce..52d3a1fa1 100644 --- a/src/session.c +++ b/src/session.c @@ -144,7 +144,7 @@ int session_accept_fd(struct listener *l, int cfd, struct sockaddr_storage *addr ret = -1; /* assume unrecoverable error by default */ - if (unlikely((cli_conn = conn_new()) == NULL)) + if (unlikely((cli_conn = conn_new(&l->obj_type)) == NULL)) goto out_close; if (!sockaddr_alloc(&cli_conn->src)) @@ -153,7 +153,6 @@ int session_accept_fd(struct listener *l, int cfd, struct sockaddr_storage *addr cli_conn->handle.fd = cfd; *cli_conn->src = *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); diff --git a/src/tcpcheck.c b/src/tcpcheck.c index 4e714fa35..6f962cc6b 100644 --- a/src/tcpcheck.c +++ b/src/tcpcheck.c @@ -994,7 +994,7 @@ enum tcpcheck_eval_ret tcpcheck_eval_connect(struct check *check, struct tcpchec */ /* 2- prepare new connection */ - cs = cs_new(NULL); + cs = cs_new(NULL, (s ? &s->obj_type : &proxy->obj_type)); if (!cs) { chunk_printf(&trash, "TCPCHK error allocating connection at step %d", tcpcheck_get_step_id(check, rule)); @@ -1028,9 +1028,7 @@ enum tcpcheck_eval_ret tcpcheck_eval_connect(struct check *check, struct tcpchec check->wait_list.events = 0; if (s) { _HA_ATOMIC_ADD(&s->curr_used_conns, 1); - conn->target = &s->obj_type; - } else - conn->target = &proxy->obj_type; + } /* no client address */ if (!sockaddr_alloc(&conn->dst)) {