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.
This commit is contained in:
Willy Tarreau 2019-07-17 14:46:00 +02:00
parent 1ef4cbc693
commit 226572f55f
2 changed files with 53 additions and 50 deletions

View File

@ -643,8 +643,8 @@ static inline int conn_get_src(struct connection *conn)
if (!conn_ctrl_ready(conn) || !conn->ctrl->get_src) if (!conn_ctrl_ready(conn) || !conn->ctrl->get_src)
return 0; return 0;
if (conn->ctrl->get_src(conn->handle.fd, (struct sockaddr *)&conn->addr.from, if (conn->ctrl->get_src(conn->handle.fd, (struct sockaddr *)conn->src,
sizeof(conn->addr.from), sizeof(*conn->src),
obj_type(conn->target) != OBJ_TYPE_LISTENER) == -1) obj_type(conn->target) != OBJ_TYPE_LISTENER) == -1)
return 0; return 0;
conn->flags |= CO_FL_ADDR_FROM_SET; 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) if (!conn_ctrl_ready(conn) || !conn->ctrl->get_dst)
return 0; return 0;
if (conn->ctrl->get_dst(conn->handle.fd, (struct sockaddr *)&conn->addr.to, if (conn->ctrl->get_dst(conn->handle.fd, (struct sockaddr *)conn->dst,
sizeof(conn->addr.to), sizeof(*conn->dst),
obj_type(conn->target) != OBJ_TYPE_LISTENER) == -1) obj_type(conn->target) != OBJ_TYPE_LISTENER) == -1)
return 0; return 0;
conn->flags |= CO_FL_ADDR_TO_SET; conn->flags |= CO_FL_ADDR_TO_SET;
@ -681,12 +681,12 @@ static inline void conn_set_tos(const struct connection *conn, int tos)
return; return;
#ifdef IP_TOS #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)); setsockopt(conn->handle.fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
#endif #endif
#ifdef IPV6_TCLASS #ifdef IPV6_TCLASS
if (conn->addr.from.ss_family == AF_INET6) { if (conn->src->ss_family == AF_INET6) {
if (IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)&conn->addr.from)->sin6_addr)) if (IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)conn->src)->sin6_addr))
/* v4-mapped addresses need IP_TOS */ /* v4-mapped addresses need IP_TOS */
setsockopt(conn->handle.fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)); setsockopt(conn->handle.fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
else else

View File

@ -470,13 +470,13 @@ int conn_recv_proxy(struct connection *conn, int flag)
goto bad_header; goto bad_header;
/* update the session's addresses and mark them set */ /* update the session's addresses and mark them set */
((struct sockaddr_in *)&conn->addr.from)->sin_family = AF_INET; ((struct sockaddr_in *)conn->src)->sin_family = AF_INET;
((struct sockaddr_in *)&conn->addr.from)->sin_addr.s_addr = htonl(src3); ((struct sockaddr_in *)conn->src)->sin_addr.s_addr = htonl(src3);
((struct sockaddr_in *)&conn->addr.from)->sin_port = htons(sport); ((struct sockaddr_in *)conn->src)->sin_port = htons(sport);
((struct sockaddr_in *)&conn->addr.to)->sin_family = AF_INET; ((struct sockaddr_in *)conn->dst)->sin_family = AF_INET;
((struct sockaddr_in *)&conn->addr.to)->sin_addr.s_addr = htonl(dst3); ((struct sockaddr_in *)conn->dst)->sin_addr.s_addr = htonl(dst3);
((struct sockaddr_in *)&conn->addr.to)->sin_port = htons(dport); ((struct sockaddr_in *)conn->dst)->sin_port = htons(dport);
conn->flags |= CO_FL_ADDR_FROM_SET | CO_FL_ADDR_TO_SET; conn->flags |= CO_FL_ADDR_FROM_SET | CO_FL_ADDR_TO_SET;
} }
else if (memcmp(line, "TCP6 ", 5) == 0) { else if (memcmp(line, "TCP6 ", 5) == 0) {
@ -531,13 +531,13 @@ int conn_recv_proxy(struct connection *conn, int flag)
goto bad_header; goto bad_header;
/* update the session's addresses and mark them set */ /* update the session's addresses and mark them set */
((struct sockaddr_in6 *)&conn->addr.from)->sin6_family = AF_INET6; ((struct sockaddr_in6 *)conn->src)->sin6_family = AF_INET6;
memcpy(&((struct sockaddr_in6 *)&conn->addr.from)->sin6_addr, &src3, sizeof(struct in6_addr)); memcpy(&((struct sockaddr_in6 *)conn->src)->sin6_addr, &src3, sizeof(struct in6_addr));
((struct sockaddr_in6 *)&conn->addr.from)->sin6_port = htons(sport); ((struct sockaddr_in6 *)conn->src)->sin6_port = htons(sport);
((struct sockaddr_in6 *)&conn->addr.to)->sin6_family = AF_INET6; ((struct sockaddr_in6 *)conn->dst)->sin6_family = AF_INET6;
memcpy(&((struct sockaddr_in6 *)&conn->addr.to)->sin6_addr, &dst3, sizeof(struct in6_addr)); memcpy(&((struct sockaddr_in6 *)conn->dst)->sin6_addr, &dst3, sizeof(struct in6_addr));
((struct sockaddr_in6 *)&conn->addr.to)->sin6_port = htons(dport); ((struct sockaddr_in6 *)conn->dst)->sin6_port = htons(dport);
conn->flags |= CO_FL_ADDR_FROM_SET | CO_FL_ADDR_TO_SET; conn->flags |= CO_FL_ADDR_FROM_SET | CO_FL_ADDR_TO_SET;
} }
else if (memcmp(line, "UNKNOWN\r\n", 9) == 0) { 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) if (ntohs(hdr_v2->len) < PP2_ADDR_LEN_INET)
goto bad_header; goto bad_header;
((struct sockaddr_in *)&conn->addr.from)->sin_family = AF_INET; ((struct sockaddr_in *)conn->src)->sin_family = AF_INET;
((struct sockaddr_in *)&conn->addr.from)->sin_addr.s_addr = hdr_v2->addr.ip4.src_addr; ((struct sockaddr_in *)conn->src)->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->src)->sin_port = hdr_v2->addr.ip4.src_port;
((struct sockaddr_in *)&conn->addr.to)->sin_family = AF_INET; ((struct sockaddr_in *)conn->dst)->sin_family = AF_INET;
((struct sockaddr_in *)&conn->addr.to)->sin_addr.s_addr = hdr_v2->addr.ip4.dst_addr; ((struct sockaddr_in *)conn->dst)->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->dst)->sin_port = hdr_v2->addr.ip4.dst_port;
conn->flags |= CO_FL_ADDR_FROM_SET | CO_FL_ADDR_TO_SET; conn->flags |= CO_FL_ADDR_FROM_SET | CO_FL_ADDR_TO_SET;
tlv_offset = PP2_HEADER_LEN + PP2_ADDR_LEN_INET; tlv_offset = PP2_HEADER_LEN + PP2_ADDR_LEN_INET;
tlv_length = ntohs(hdr_v2->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) if (ntohs(hdr_v2->len) < PP2_ADDR_LEN_INET6)
goto bad_header; goto bad_header;
((struct sockaddr_in6 *)&conn->addr.from)->sin6_family = AF_INET6; ((struct sockaddr_in6 *)conn->src)->sin6_family = AF_INET6;
memcpy(&((struct sockaddr_in6 *)&conn->addr.from)->sin6_addr, hdr_v2->addr.ip6.src_addr, 16); memcpy(&((struct sockaddr_in6 *)conn->src)->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->src)->sin6_port = hdr_v2->addr.ip6.src_port;
((struct sockaddr_in6 *)&conn->addr.to)->sin6_family = AF_INET6; ((struct sockaddr_in6 *)conn->dst)->sin6_family = AF_INET6;
memcpy(&((struct sockaddr_in6 *)&conn->addr.to)->sin6_addr, hdr_v2->addr.ip6.dst_addr, 16); memcpy(&((struct sockaddr_in6 *)conn->dst)->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->dst)->sin6_port = hdr_v2->addr.ip6.dst_port;
conn->flags |= CO_FL_ADDR_FROM_SET | CO_FL_ADDR_TO_SET; conn->flags |= CO_FL_ADDR_FROM_SET | CO_FL_ADDR_TO_SET;
tlv_offset = PP2_HEADER_LEN + PP2_ADDR_LEN_INET6; tlv_offset = PP2_HEADER_LEN + PP2_ADDR_LEN_INET6;
tlv_length = ntohs(hdr_v2->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)); hdr_tcp = (struct my_tcphdr *)(line + (hdr_ip4->ip_hl * 4));
/* update the session's addresses and mark them set */ /* update the session's addresses and mark them set */
((struct sockaddr_in *)&conn->addr.from)->sin_family = AF_INET; ((struct sockaddr_in *)conn->src)->sin_family = AF_INET;
((struct sockaddr_in *)&conn->addr.from)->sin_addr.s_addr = hdr_ip4->ip_src.s_addr; ((struct sockaddr_in *)conn->src)->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_port = hdr_tcp->source;
((struct sockaddr_in *)&conn->addr.to)->sin_family = AF_INET; ((struct sockaddr_in *)conn->dst)->sin_family = AF_INET;
((struct sockaddr_in *)&conn->addr.to)->sin_addr.s_addr = hdr_ip4->ip_dst.s_addr; ((struct sockaddr_in *)conn->dst)->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_port = hdr_tcp->dest;
conn->flags |= CO_FL_ADDR_FROM_SET | CO_FL_ADDR_TO_SET; 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)); hdr_tcp = (struct my_tcphdr *)(line + sizeof(struct ip6_hdr));
/* update the session's addresses and mark them set */ /* update the session's addresses and mark them set */
((struct sockaddr_in6 *)&conn->addr.from)->sin6_family = AF_INET6; ((struct sockaddr_in6 *)conn->src)->sin6_family = AF_INET6;
((struct sockaddr_in6 *)&conn->addr.from)->sin6_addr = hdr_ip6->ip6_src; ((struct sockaddr_in6 *)conn->src)->sin6_addr = hdr_ip6->ip6_src;
((struct sockaddr_in6 *)&conn->addr.from)->sin6_port = hdr_tcp->source; ((struct sockaddr_in6 *)conn->src)->sin6_port = hdr_tcp->source;
((struct sockaddr_in6 *)&conn->addr.to)->sin6_family = AF_INET6; ((struct sockaddr_in6 *)conn->dst)->sin6_family = AF_INET6;
((struct sockaddr_in6 *)&conn->addr.to)->sin6_addr = hdr_ip6->ip6_dst; ((struct sockaddr_in6 *)conn->dst)->sin6_addr = hdr_ip6->ip6_dst;
((struct sockaddr_in6 *)&conn->addr.to)->sin6_port = hdr_tcp->dest; ((struct sockaddr_in6 *)conn->dst)->sin6_port = hdr_tcp->dest;
conn->flags |= CO_FL_ADDR_FROM_SET | CO_FL_ADDR_TO_SET; 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)) if (!conn_ctrl_ready(conn))
goto out_error; goto out_error;
if (!conn_get_dst(conn))
goto out_error;
req_line.version = 0x04; req_line.version = 0x04;
req_line.command = 0x01; req_line.command = 0x01;
req_line.port = get_net_port(&(conn->addr.to)); req_line.port = get_net_port(conn->dst);
req_line.ip = is_inet_addr(&(conn->addr.to)); req_line.ip = is_inet_addr(conn->dst);
memcpy(req_line.user_id, "HAProxy\0", 8); memcpy(req_line.user_id, "HAProxy\0", 8);
if (conn->send_proxy_ofs > 0) { 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); ret = make_proxy_line_v2(buf, buf_len, srv, remote);
} }
else { else {
if (remote) if (remote && conn_get_src(remote) && conn_get_dst(remote))
ret = make_proxy_line_v1(buf, buf_len, &remote->addr.from, &remote->addr.to); ret = make_proxy_line_v1(buf, buf_len, remote->src, remote->dst);
else else
ret = make_proxy_line_v1(buf, buf_len, NULL, NULL); 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; return 0;
memcpy(hdr->sig, pp2_signature, PP2_SIGNATURE_LEN); memcpy(hdr->sig, pp2_signature, PP2_SIGNATURE_LEN);
if (remote) { if (remote && conn_get_src(remote) && conn_get_dst(remote)) {
src = &remote->addr.from; src = remote->src;
dst = &remote->addr.to; dst = remote->dst;
} }
/* At least one of src or dst is not of AF_INET or AF_INET6 */ /* At least one of src or dst is not of AF_INET or AF_INET6 */