mirror of
https://passt.top/passt
synced 2024-12-22 21:55:22 +00:00
tcp, udp: Replace loopback source address by gateway address
This is symmetric with tap operation and addressing model, and allows again to reach the guest behind the tap interface by contacting the local address. Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
9ffb317cf9
commit
6488c3e848
8
tcp.c
8
tcp.c
@ -1008,6 +1008,11 @@ static void tcp_conn_from_sock(struct ctx *c, int fd)
|
|||||||
|
|
||||||
memset(&tc[s].a.a4.zero, 0, sizeof(tc[s].a.a4.zero));
|
memset(&tc[s].a.a4.zero, 0, sizeof(tc[s].a.a4.zero));
|
||||||
memset(&tc[s].a.a4.one, 0xff, sizeof(tc[s].a.a4.one));
|
memset(&tc[s].a.a4.one, 0xff, sizeof(tc[s].a.a4.one));
|
||||||
|
|
||||||
|
if (ntohl(sa4->sin_addr.s_addr) == INADDR_LOOPBACK ||
|
||||||
|
ntohl(sa4->sin_addr.s_addr) == INADDR_ANY)
|
||||||
|
sa4->sin_addr.s_addr = c->gw4;
|
||||||
|
|
||||||
memcpy(&tc[s].a.a4.a, &sa4->sin_addr, sizeof(tc[s].a.a4.a));
|
memcpy(&tc[s].a.a4.a, &sa4->sin_addr, sizeof(tc[s].a.a4.a));
|
||||||
|
|
||||||
tc[s].sock_port = sa4->sin_port;
|
tc[s].sock_port = sa4->sin_port;
|
||||||
@ -1022,6 +1027,9 @@ static void tcp_conn_from_sock(struct ctx *c, int fd)
|
|||||||
} else if (sa_l.ss_family == AF_INET6) {
|
} else if (sa_l.ss_family == AF_INET6) {
|
||||||
struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)&sa_r;
|
struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)&sa_r;
|
||||||
|
|
||||||
|
if (IN6_IS_ADDR_LOOPBACK(&sa6->sin6_addr))
|
||||||
|
memcpy(&sa6->sin6_addr, &c->gw6, sizeof(c->gw6));
|
||||||
|
|
||||||
memcpy(&tc[s].a.a6, &sa6->sin6_addr, sizeof(tc[s].a.a6));
|
memcpy(&tc[s].a.a6, &sa6->sin6_addr, sizeof(tc[s].a.a6));
|
||||||
|
|
||||||
tc[s].sock_port = sa6->sin6_port;
|
tc[s].sock_port = sa6->sin6_port;
|
||||||
|
7
udp.c
7
udp.c
@ -84,6 +84,10 @@ void udp_sock_handler(struct ctx *c, int s, uint32_t events)
|
|||||||
struct sockaddr_in *sr4 = (struct sockaddr_in *)&sr;
|
struct sockaddr_in *sr4 = (struct sockaddr_in *)&sr;
|
||||||
struct sockaddr_in *sl4 = (struct sockaddr_in *)&sl;
|
struct sockaddr_in *sl4 = (struct sockaddr_in *)&sl;
|
||||||
|
|
||||||
|
if (ntohl(sr4->sin_addr.s_addr) == INADDR_LOOPBACK ||
|
||||||
|
ntohl(sr4->sin_addr.s_addr) == INADDR_ANY)
|
||||||
|
sr4->sin_addr.s_addr = c->gw4;
|
||||||
|
|
||||||
memcpy(&a6.s6_addr[12], &sr4->sin_addr, sizeof(sr4->sin_addr));
|
memcpy(&a6.s6_addr[12], &sr4->sin_addr, sizeof(sr4->sin_addr));
|
||||||
uh->source = sr4->sin_port;
|
uh->source = sr4->sin_port;
|
||||||
uh->dest = sl4->sin_port;
|
uh->dest = sl4->sin_port;
|
||||||
@ -94,6 +98,9 @@ void udp_sock_handler(struct ctx *c, int s, uint32_t events)
|
|||||||
struct sockaddr_in6 *sr6 = (struct sockaddr_in6 *)&sr;
|
struct sockaddr_in6 *sr6 = (struct sockaddr_in6 *)&sr;
|
||||||
struct sockaddr_in6 *sl6 = (struct sockaddr_in6 *)&sl;
|
struct sockaddr_in6 *sl6 = (struct sockaddr_in6 *)&sl;
|
||||||
|
|
||||||
|
if (IN6_IS_ADDR_LOOPBACK(&sr6->sin6_addr))
|
||||||
|
memcpy(&sr6->sin6_addr, &c->gw6, sizeof(c->gw6));
|
||||||
|
|
||||||
uh->source = sr6->sin6_port;
|
uh->source = sr6->sin6_port;
|
||||||
uh->dest = sl6->sin6_port;
|
uh->dest = sl6->sin6_port;
|
||||||
uh->len = htons(n + sizeof(*uh));
|
uh->len = htons(n + sizeof(*uh));
|
||||||
|
Loading…
Reference in New Issue
Block a user