From 226572f55f2d6cad991a45643036c8cc205bbd34 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 17 Jul 2019 14:46:00 +0200 Subject: [PATCH] MINOR: connection: use conn->{src,dst} instead of &conn->addr.{from,to} 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 | 14 +++--- src/connection.c | 89 ++++++++++++++++++++------------------ 2 files changed, 53 insertions(+), 50 deletions(-) diff --git a/include/proto/connection.h b/include/proto/connection.h index 7ee54f2ca..a55f7a231 100644 --- a/include/proto/connection.h +++ b/include/proto/connection.h @@ -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 diff --git a/src/connection.c b/src/connection.c index 4d6d4d584..eabeaa001 100644 --- a/src/connection.c +++ b/src/connection.c @@ -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 */