]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
CLEANUP: backend: use the same tproxy address selection code for servers and backends
authorWilly Tarreau <w@1wt.eu>
Sat, 8 Dec 2012 22:13:33 +0000 (23:13 +0100)
committerWilly Tarreau <w@1wt.eu>
Sun, 9 Dec 2012 09:06:01 +0000 (10:06 +0100)
This is just like previous commit, but for the backend this time. All this
code did not need to remain duplicated. These are 500 more bytes shaved off.

src/backend.c

index f81b75f8d6677edb00e85d1a91eb697e4539833f..e550d35bc2f39ff9a37021491333b9bbb3e9c611 100644 (file)
@@ -884,74 +884,46 @@ static void assign_tproxy_address(struct session *s)
 {
 #if defined(CONFIG_HAP_CTTPROXY) || defined(CONFIG_HAP_LINUX_TPROXY)
        struct server *srv = objt_server(s->target);
+       struct conn_src *src;
 
-       if (srv && srv->conn_src.opts & CO_SRC_BIND) {
-               switch (srv->conn_src.opts & CO_SRC_TPROXY_MASK) {
-               case CO_SRC_TPROXY_ADDR:
-                       s->req->cons->conn->addr.from = srv->conn_src.tproxy_addr;
-                       break;
-               case CO_SRC_TPROXY_CLI:
-               case CO_SRC_TPROXY_CIP:
-                       /* FIXME: what can we do if the client connects in IPv6 or unix socket ? */
-                       s->req->cons->conn->addr.from = s->req->prod->conn->addr.from;
-                       break;
-               case CO_SRC_TPROXY_DYN:
-                       if (srv->conn_src.bind_hdr_occ) {
-                               char *vptr;
-                               int vlen;
-                               int rewind;
-
-                               /* bind to the IP in a header */
-                               ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_family = AF_INET;
-                               ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_port = 0;
-                               ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_addr.s_addr = 0;
-
-                               b_rew(s->req->buf, rewind = s->req->buf->o);
-                               if (http_get_hdr(&s->txn.req, srv->conn_src.bind_hdr_name, srv->conn_src.bind_hdr_len,
-                                                &s->txn.hdr_idx, srv->conn_src.bind_hdr_occ, NULL, &vptr, &vlen)) {
-                                       ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_addr.s_addr =
-                                               htonl(inetaddr_host_lim(vptr, vptr + vlen));
-                               }
-                               b_adv(s->req->buf, rewind);
-                       }
-                       break;
-               default:
-                       memset(&s->req->cons->conn->addr.from, 0, sizeof(s->req->cons->conn->addr.from));
-               }
-       }
-       else if (s->be->conn_src.opts & CO_SRC_BIND) {
-               switch (s->be->conn_src.opts & CO_SRC_TPROXY_MASK) {
-               case CO_SRC_TPROXY_ADDR:
-                       s->req->cons->conn->addr.from = s->be->conn_src.tproxy_addr;
-                       break;
-               case CO_SRC_TPROXY_CLI:
-               case CO_SRC_TPROXY_CIP:
-                       /* FIXME: what can we do if the client connects in IPv6 or socket unix? */
-                       s->req->cons->conn->addr.from = s->req->prod->conn->addr.from;
-                       break;
-               case CO_SRC_TPROXY_DYN:
-                       if (s->be->conn_src.bind_hdr_occ) {
-                               char *vptr;
-                               int vlen;
-                               int rewind;
-
-                               /* bind to the IP in a header */
-                               ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_family = AF_INET;
-                               ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_port = 0;
-                               ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_addr.s_addr = 0;
-
-                               b_rew(s->req->buf, rewind = s->req->buf->o);
-                               if (http_get_hdr(&s->txn.req, s->be->conn_src.bind_hdr_name, s->be->conn_src.bind_hdr_len,
-                                                &s->txn.hdr_idx, s->be->conn_src.bind_hdr_occ, NULL, &vptr, &vlen)) {
-                                       ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_addr.s_addr =
-                                               htonl(inetaddr_host_lim(vptr, vptr + vlen));
-                               }
-                               b_adv(s->req->buf, rewind);
+       if (srv && srv->conn_src.opts & CO_SRC_BIND)
+               src = &srv->conn_src;
+       else if (s->be->conn_src.opts & CO_SRC_BIND)
+               src = &s->be->conn_src;
+       else
+               return;
+
+       switch (src->opts & CO_SRC_TPROXY_MASK) {
+       case CO_SRC_TPROXY_ADDR:
+               s->req->cons->conn->addr.from = src->tproxy_addr;
+               break;
+       case CO_SRC_TPROXY_CLI:
+       case CO_SRC_TPROXY_CIP:
+               /* FIXME: what can we do if the client connects in IPv6 or unix socket ? */
+               s->req->cons->conn->addr.from = s->req->prod->conn->addr.from;
+               break;
+       case CO_SRC_TPROXY_DYN:
+               if (src->bind_hdr_occ) {
+                       char *vptr;
+                       int vlen;
+                       int rewind;
+
+                       /* bind to the IP in a header */
+                       ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_family = AF_INET;
+                       ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_port = 0;
+                       ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_addr.s_addr = 0;
+
+                       b_rew(s->req->buf, rewind = s->req->buf->o);
+                       if (http_get_hdr(&s->txn.req, src->bind_hdr_name, src->bind_hdr_len,
+                                        &s->txn.hdr_idx, src->bind_hdr_occ, NULL, &vptr, &vlen)) {
+                               ((struct sockaddr_in *)&s->req->cons->conn->addr.from)->sin_addr.s_addr =
+                                       htonl(inetaddr_host_lim(vptr, vptr + vlen));
                        }
-                       break;
-               default:
-                       memset(&s->req->cons->conn->addr.from, 0, sizeof(s->req->cons->conn->addr.from));
+                       b_adv(s->req->buf, rewind);
                }
+               break;
+       default:
+               memset(&s->req->cons->conn->addr.from, 0, sizeof(s->req->cons->conn->addr.from));
        }
 #endif
 }