* 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;
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);
* 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;
}
* 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;
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);
si_release_endpoint(si);
- cs = cs_new(conn);
+ cs = cs_new(conn, conn->target);
if (cs)
si_attach_cs(si, cs);
/* 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;
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;
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;
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;
if (!h2s)
goto out;
- cs = cs_new(h2c->conn);
+ cs = cs_new(h2c->conn, h2c->conn->target);
if (!cs)
goto out_close;
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;
ctx->conn = conn;
if (!cs) {
- cs = cs_new(conn);
+ cs = cs_new(conn, conn->target);
if (!cs)
goto fail_free_ctx;
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;
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))
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);
*/
/* 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));
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)) {