MAJOR: backend: enable connection reuse

This commit allows an existing server-side connection to be reused if
it matches the same target. Basic controls are performed ; right now
we do not allow to reuse a connection when dynamic source binding is
in use or when the destination address or port is dynamic (eg: proxy
mode). Later we'll have to also disable connection sharing when PROXY
protocol is being used or when non-idempotent requests are processed.
diff --git a/src/backend.c b/src/backend.c
index 657da9d..7eeed8d 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -982,10 +982,33 @@
 int connect_server(struct session *s)
 {
 	struct connection *cli_conn;
-	struct connection *srv_conn = si_alloc_conn(s->req->cons, 0);
+	struct connection *srv_conn;
 	struct server *srv;
+	int reuse = 0;
 	int err;
 
+	srv_conn = objt_conn(s->req->cons->end);
+	if (srv_conn)
+		reuse = s->target == srv_conn->target;
+
+	if (reuse) {
+		/* Disable connection reuse if a dynamic source is used.
+		 * As long as we don't share connections between servers,
+		 * we don't need to disable connection reuse on no-idempotent
+		 * requests nor when PROXY protocol is used.
+		 */
+		srv = objt_server(s->target);
+		if (srv && srv->conn_src.opts & CO_SRC_BIND) {
+			if ((srv->conn_src.opts & CO_SRC_TPROXY_MASK) == CO_SRC_TPROXY_DYN)
+				reuse = 0;
+		}
+		else if (s->be->conn_src.opts & CO_SRC_BIND) {
+			if ((s->be->conn_src.opts & CO_SRC_TPROXY_MASK) == CO_SRC_TPROXY_DYN)
+				reuse = 0;
+		}
+	}
+
+	srv_conn = si_alloc_conn(s->req->cons, reuse);
 	if (!srv_conn)
 		return SN_ERR_RESOURCE;