From 387ebf84dd3da1a1777d58b9331166d4680f8531 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 4 Aug 2015 19:24:13 +0200 Subject: [PATCH] MINOR: connection: add a new flag CO_FL_PRIVATE This flag is set on an outgoing connection when this connection gets some properties that must not be shared with other connections, such as dynamic transparent source binding, SNI or a proxy protocol header, or an authentication challenge from the server. This will be needed later to implement connection reuse. --- include/types/connection.h | 5 ++++- src/backend.c | 2 ++ src/proto_http.c | 1 + src/proto_tcp.c | 5 ++++- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/include/types/connection.h b/include/types/connection.h index 8192ef5a64..12a96854f0 100644 --- a/include/types/connection.h +++ b/include/types/connection.h @@ -119,7 +119,10 @@ enum { */ CO_FL_POLL_SOCK = CO_FL_HANDSHAKE | CO_FL_WAIT_L4_CONN | CO_FL_WAIT_L6_CONN, - /* unused : 0x10000000, 0x20000000, 0x40000000 */ + /* This connection may not be shared between clients */ + CO_FL_PRIVATE = 0x10000000, + + /* unused : 0x20000000, 0x40000000 */ /* This last flag indicates that the transport layer is used (for instance * by logs) and must not be cleared yet. The last call to conn_xprt_close() diff --git a/src/backend.c b/src/backend.c index bbe9573a52..3c00acfd66 100644 --- a/src/backend.c +++ b/src/backend.c @@ -1087,6 +1087,7 @@ int connect_server(struct stream *s) /* process the case where the server requires the PROXY protocol to be sent */ srv_conn->send_proxy_ofs = 0; if (srv && srv->pp_opts) { + srv_conn->flags |= CO_FL_PRIVATE; srv_conn->send_proxy_ofs = 1; /* must compute size */ cli_conn = objt_conn(strm_orig(s)); if (cli_conn) @@ -1152,6 +1153,7 @@ int connect_server(struct stream *s) smp->data.str.len = smp->data.str.size - 1; smp->data.str.str[smp->data.str.len] = 0; ssl_sock_set_servername(srv_conn, smp->data.str.str); + srv_conn->flags |= CO_FL_PRIVATE; } } #endif /* USE_OPENSSL */ diff --git a/src/proto_http.c b/src/proto_http.c index d1acf30a9a..fb831b9833 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -5155,6 +5155,7 @@ void http_end_txn_clean_session(struct stream *s) * it's better to do it (at least it helps with debugging). */ s->txn->flags |= TX_PREFER_LAST; + srv_conn->flags |= CO_FL_PRIVATE; } if (fe->options2 & PR_O2_INDEPSTR) diff --git a/src/proto_tcp.c b/src/proto_tcp.c index 734d469bd6..e6da5d18e4 100644 --- a/src/proto_tcp.c +++ b/src/proto_tcp.c @@ -474,12 +474,15 @@ int tcp_connect_server(struct connection *conn, int data, int delack) if (is_inet_addr(&conn->addr.from)) { switch (src->opts & CO_SRC_TPROXY_MASK) { - case CO_SRC_TPROXY_ADDR: case CO_SRC_TPROXY_CLI: + conn->flags |= CO_FL_PRIVATE; + /* fall through */ + case CO_SRC_TPROXY_ADDR: flags = 3; break; case CO_SRC_TPROXY_CIP: case CO_SRC_TPROXY_DYN: + conn->flags |= CO_FL_PRIVATE; flags = 1; break; } -- 2.39.5