]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: connection: use conn->{src,dst} instead of &conn->addr.{from,to}
authorWilly Tarreau <w@1wt.eu>
Wed, 17 Jul 2019 12:46:00 +0000 (14:46 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 19 Jul 2019 11:50:09 +0000 (13:50 +0200)
This is in preparation for the switch to dynamic address allocation,
let's migrate the code using the old fields to the pointers instead.
Note that no extra check was added for now, the purpose is only to
get the code to use the pointers and still work.

In the proxy protocol message handling we make sure the addresses are
properly allocated before declaring them unset.

include/proto/connection.h
src/connection.c

index 7ee54f2cab1a2c43ee2ccceed59d6ea5da412bc3..a55f7a23161f0d9305e32eaa255f4e1534300b4d 100644 (file)
@@ -643,8 +643,8 @@ static inline int conn_get_src(struct connection *conn)
        if (!conn_ctrl_ready(conn) || !conn->ctrl->get_src)
                return 0;
 
-       if (conn->ctrl->get_src(conn->handle.fd, (struct sockaddr *)&conn->addr.from,
-                               sizeof(conn->addr.from),
+       if (conn->ctrl->get_src(conn->handle.fd, (struct sockaddr *)conn->src,
+                               sizeof(*conn->src),
                                obj_type(conn->target) != OBJ_TYPE_LISTENER) == -1)
                return 0;
        conn->flags |= CO_FL_ADDR_FROM_SET;
@@ -663,8 +663,8 @@ static inline int conn_get_dst(struct connection *conn)
        if (!conn_ctrl_ready(conn) || !conn->ctrl->get_dst)
                return 0;
 
-       if (conn->ctrl->get_dst(conn->handle.fd, (struct sockaddr *)&conn->addr.to,
-                               sizeof(conn->addr.to),
+       if (conn->ctrl->get_dst(conn->handle.fd, (struct sockaddr *)conn->dst,
+                               sizeof(*conn->dst),
                                obj_type(conn->target) != OBJ_TYPE_LISTENER) == -1)
                return 0;
        conn->flags |= CO_FL_ADDR_TO_SET;
@@ -681,12 +681,12 @@ static inline void conn_set_tos(const struct connection *conn, int tos)
                return;
 
 #ifdef IP_TOS
-       if (conn->addr.from.ss_family == AF_INET)
+       if (conn->src->ss_family == AF_INET)
                setsockopt(conn->handle.fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
 #endif
 #ifdef IPV6_TCLASS
-       if (conn->addr.from.ss_family == AF_INET6) {
-               if (IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)&conn->addr.from)->sin6_addr))
+       if (conn->src->ss_family == AF_INET6) {
+               if (IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)conn->src)->sin6_addr))
                        /* v4-mapped addresses need IP_TOS */
                        setsockopt(conn->handle.fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
                else
index 4d6d4d584ab87da44d406d955eebc06828ab5370..eabeaa00105919eb48dba5b84ff58fcc9f0ee45e 100644 (file)
@@ -470,13 +470,13 @@ int conn_recv_proxy(struct connection *conn, int flag)
                        goto bad_header;
 
                /* update the session's addresses and mark them set */
-               ((struct sockaddr_in *)&conn->addr.from)->sin_family      = AF_INET;
-               ((struct sockaddr_in *)&conn->addr.from)->sin_addr.s_addr = htonl(src3);
-               ((struct sockaddr_in *)&conn->addr.from)->sin_port        = htons(sport);
+               ((struct sockaddr_in *)conn->src)->sin_family      = AF_INET;
+               ((struct sockaddr_in *)conn->src)->sin_addr.s_addr = htonl(src3);
+               ((struct sockaddr_in *)conn->src)->sin_port        = htons(sport);
 
-               ((struct sockaddr_in *)&conn->addr.to)->sin_family        = AF_INET;
-               ((struct sockaddr_in *)&conn->addr.to)->sin_addr.s_addr   = htonl(dst3);
-               ((struct sockaddr_in *)&conn->addr.to)->sin_port          = htons(dport);
+               ((struct sockaddr_in *)conn->dst)->sin_family        = AF_INET;
+               ((struct sockaddr_in *)conn->dst)->sin_addr.s_addr   = htonl(dst3);
+               ((struct sockaddr_in *)conn->dst)->sin_port          = htons(dport);
                conn->flags |= CO_FL_ADDR_FROM_SET | CO_FL_ADDR_TO_SET;
        }
        else if (memcmp(line, "TCP6 ", 5) == 0) {
@@ -531,13 +531,13 @@ int conn_recv_proxy(struct connection *conn, int flag)
                        goto bad_header;
 
                /* update the session's addresses and mark them set */
-               ((struct sockaddr_in6 *)&conn->addr.from)->sin6_family      = AF_INET6;
-               memcpy(&((struct sockaddr_in6 *)&conn->addr.from)->sin6_addr, &src3, sizeof(struct in6_addr));
-               ((struct sockaddr_in6 *)&conn->addr.from)->sin6_port        = htons(sport);
+               ((struct sockaddr_in6 *)conn->src)->sin6_family      = AF_INET6;
+               memcpy(&((struct sockaddr_in6 *)conn->src)->sin6_addr, &src3, sizeof(struct in6_addr));
+               ((struct sockaddr_in6 *)conn->src)->sin6_port        = htons(sport);
 
-               ((struct sockaddr_in6 *)&conn->addr.to)->sin6_family        = AF_INET6;
-               memcpy(&((struct sockaddr_in6 *)&conn->addr.to)->sin6_addr, &dst3, sizeof(struct in6_addr));
-               ((struct sockaddr_in6 *)&conn->addr.to)->sin6_port          = htons(dport);
+               ((struct sockaddr_in6 *)conn->dst)->sin6_family        = AF_INET6;
+               memcpy(&((struct sockaddr_in6 *)conn->dst)->sin6_addr, &dst3, sizeof(struct in6_addr));
+               ((struct sockaddr_in6 *)conn->dst)->sin6_port          = htons(dport);
                conn->flags |= CO_FL_ADDR_FROM_SET | CO_FL_ADDR_TO_SET;
        }
        else if (memcmp(line, "UNKNOWN\r\n", 9) == 0) {
@@ -576,12 +576,12 @@ int conn_recv_proxy(struct connection *conn, int flag)
                        if (ntohs(hdr_v2->len) < PP2_ADDR_LEN_INET)
                                goto bad_header;
 
-                       ((struct sockaddr_in *)&conn->addr.from)->sin_family = AF_INET;
-                       ((struct sockaddr_in *)&conn->addr.from)->sin_addr.s_addr = hdr_v2->addr.ip4.src_addr;
-                       ((struct sockaddr_in *)&conn->addr.from)->sin_port = hdr_v2->addr.ip4.src_port;
-                       ((struct sockaddr_in *)&conn->addr.to)->sin_family = AF_INET;
-                       ((struct sockaddr_in *)&conn->addr.to)->sin_addr.s_addr = hdr_v2->addr.ip4.dst_addr;
-                       ((struct sockaddr_in *)&conn->addr.to)->sin_port = hdr_v2->addr.ip4.dst_port;
+                       ((struct sockaddr_in *)conn->src)->sin_family = AF_INET;
+                       ((struct sockaddr_in *)conn->src)->sin_addr.s_addr = hdr_v2->addr.ip4.src_addr;
+                       ((struct sockaddr_in *)conn->src)->sin_port = hdr_v2->addr.ip4.src_port;
+                       ((struct sockaddr_in *)conn->dst)->sin_family = AF_INET;
+                       ((struct sockaddr_in *)conn->dst)->sin_addr.s_addr = hdr_v2->addr.ip4.dst_addr;
+                       ((struct sockaddr_in *)conn->dst)->sin_port = hdr_v2->addr.ip4.dst_port;
                        conn->flags |= CO_FL_ADDR_FROM_SET | CO_FL_ADDR_TO_SET;
                        tlv_offset = PP2_HEADER_LEN + PP2_ADDR_LEN_INET;
                        tlv_length = ntohs(hdr_v2->len) - PP2_ADDR_LEN_INET;
@@ -590,12 +590,12 @@ int conn_recv_proxy(struct connection *conn, int flag)
                        if (ntohs(hdr_v2->len) < PP2_ADDR_LEN_INET6)
                                goto bad_header;
 
-                       ((struct sockaddr_in6 *)&conn->addr.from)->sin6_family = AF_INET6;
-                       memcpy(&((struct sockaddr_in6 *)&conn->addr.from)->sin6_addr, hdr_v2->addr.ip6.src_addr, 16);
-                       ((struct sockaddr_in6 *)&conn->addr.from)->sin6_port = hdr_v2->addr.ip6.src_port;
-                       ((struct sockaddr_in6 *)&conn->addr.to)->sin6_family = AF_INET6;
-                       memcpy(&((struct sockaddr_in6 *)&conn->addr.to)->sin6_addr, hdr_v2->addr.ip6.dst_addr, 16);
-                       ((struct sockaddr_in6 *)&conn->addr.to)->sin6_port = hdr_v2->addr.ip6.dst_port;
+                       ((struct sockaddr_in6 *)conn->src)->sin6_family = AF_INET6;
+                       memcpy(&((struct sockaddr_in6 *)conn->src)->sin6_addr, hdr_v2->addr.ip6.src_addr, 16);
+                       ((struct sockaddr_in6 *)conn->src)->sin6_port = hdr_v2->addr.ip6.src_port;
+                       ((struct sockaddr_in6 *)conn->dst)->sin6_family = AF_INET6;
+                       memcpy(&((struct sockaddr_in6 *)conn->dst)->sin6_addr, hdr_v2->addr.ip6.dst_addr, 16);
+                       ((struct sockaddr_in6 *)conn->dst)->sin6_port = hdr_v2->addr.ip6.dst_port;
                        conn->flags |= CO_FL_ADDR_FROM_SET | CO_FL_ADDR_TO_SET;
                        tlv_offset = PP2_HEADER_LEN + PP2_ADDR_LEN_INET6;
                        tlv_length = ntohs(hdr_v2->len) - PP2_ADDR_LEN_INET6;
@@ -798,13 +798,13 @@ int conn_recv_netscaler_cip(struct connection *conn, int flag)
                hdr_tcp = (struct my_tcphdr *)(line + (hdr_ip4->ip_hl * 4));
 
                /* update the session's addresses and mark them set */
-               ((struct sockaddr_in *)&conn->addr.from)->sin_family = AF_INET;
-               ((struct sockaddr_in *)&conn->addr.from)->sin_addr.s_addr = hdr_ip4->ip_src.s_addr;
-               ((struct sockaddr_in *)&conn->addr.from)->sin_port = hdr_tcp->source;
+               ((struct sockaddr_in *)conn->src)->sin_family = AF_INET;
+               ((struct sockaddr_in *)conn->src)->sin_addr.s_addr = hdr_ip4->ip_src.s_addr;
+               ((struct sockaddr_in *)conn->src)->sin_port = hdr_tcp->source;
 
-               ((struct sockaddr_in *)&conn->addr.to)->sin_family = AF_INET;
-               ((struct sockaddr_in *)&conn->addr.to)->sin_addr.s_addr = hdr_ip4->ip_dst.s_addr;
-               ((struct sockaddr_in *)&conn->addr.to)->sin_port = hdr_tcp->dest;
+               ((struct sockaddr_in *)conn->dst)->sin_family = AF_INET;
+               ((struct sockaddr_in *)conn->dst)->sin_addr.s_addr = hdr_ip4->ip_dst.s_addr;
+               ((struct sockaddr_in *)conn->dst)->sin_port = hdr_tcp->dest;
 
                conn->flags |= CO_FL_ADDR_FROM_SET | CO_FL_ADDR_TO_SET;
        }
@@ -828,13 +828,13 @@ int conn_recv_netscaler_cip(struct connection *conn, int flag)
                hdr_tcp = (struct my_tcphdr *)(line + sizeof(struct ip6_hdr));
 
                /* update the session's addresses and mark them set */
-               ((struct sockaddr_in6 *)&conn->addr.from)->sin6_family = AF_INET6;
-               ((struct sockaddr_in6 *)&conn->addr.from)->sin6_addr = hdr_ip6->ip6_src;
-               ((struct sockaddr_in6 *)&conn->addr.from)->sin6_port = hdr_tcp->source;
+               ((struct sockaddr_in6 *)conn->src)->sin6_family = AF_INET6;
+               ((struct sockaddr_in6 *)conn->src)->sin6_addr = hdr_ip6->ip6_src;
+               ((struct sockaddr_in6 *)conn->src)->sin6_port = hdr_tcp->source;
 
-               ((struct sockaddr_in6 *)&conn->addr.to)->sin6_family = AF_INET6;
-               ((struct sockaddr_in6 *)&conn->addr.to)->sin6_addr = hdr_ip6->ip6_dst;
-               ((struct sockaddr_in6 *)&conn->addr.to)->sin6_port = hdr_tcp->dest;
+               ((struct sockaddr_in6 *)conn->dst)->sin6_family = AF_INET6;
+               ((struct sockaddr_in6 *)conn->dst)->sin6_addr = hdr_ip6->ip6_dst;
+               ((struct sockaddr_in6 *)conn->dst)->sin6_port = hdr_tcp->dest;
 
                conn->flags |= CO_FL_ADDR_FROM_SET | CO_FL_ADDR_TO_SET;
        }
@@ -899,10 +899,13 @@ int conn_send_socks4_proxy_request(struct connection *conn)
        if (!conn_ctrl_ready(conn))
                goto out_error;
 
+       if (!conn_get_dst(conn))
+               goto out_error;
+
        req_line.version = 0x04;
        req_line.command = 0x01;
-       req_line.port    = get_net_port(&(conn->addr.to));
-       req_line.ip      = is_inet_addr(&(conn->addr.to));
+       req_line.port    = get_net_port(conn->dst);
+       req_line.ip      = is_inet_addr(conn->dst);
        memcpy(req_line.user_id, "HAProxy\0", 8);
 
        if (conn->send_proxy_ofs > 0) {
@@ -1096,8 +1099,8 @@ int make_proxy_line(char *buf, int buf_len, struct server *srv, struct connectio
                ret = make_proxy_line_v2(buf, buf_len, srv, remote);
        }
        else {
-               if (remote)
-                       ret = make_proxy_line_v1(buf, buf_len, &remote->addr.from, &remote->addr.to);
+               if (remote && conn_get_src(remote) && conn_get_dst(remote))
+                       ret = make_proxy_line_v1(buf, buf_len, remote->src, remote->dst);
                else
                        ret = make_proxy_line_v1(buf, buf_len, NULL, NULL);
        }
@@ -1216,9 +1219,9 @@ int make_proxy_line_v2(char *buf, int buf_len, struct server *srv, struct connec
                return 0;
        memcpy(hdr->sig, pp2_signature, PP2_SIGNATURE_LEN);
 
-       if (remote) {
-               src = &remote->addr.from;
-               dst = &remote->addr.to;
+       if (remote && conn_get_src(remote) && conn_get_dst(remote)) {
+               src = remote->src;
+               dst = remote->dst;
        }
 
        /* At least one of src or dst is not of AF_INET or AF_INET6 */