aboutgitcodebugslistschat
diff options
context:
space:
mode:
-rw-r--r--tcp.c5
-rw-r--r--udp.c12
2 files changed, 11 insertions, 6 deletions
diff --git a/tcp.c b/tcp.c
index eb83cc4..8aa9740 100644
--- a/tcp.c
+++ b/tcp.c
@@ -1387,6 +1387,11 @@ static void tcp_conn_from_tap(struct ctx *c, int af, void *addr,
if (s < 0)
return;
+ if (af == AF_INET && addr4.sin_addr.s_addr == c->gw4)
+ addr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+ else if (af == AF_INET6 && !memcmp(addr, &c->gw6, sizeof(c->gw6)))
+ addr6.sin6_addr = in6addr_loopback;
+
if (af == AF_INET6 && IN6_IS_ADDR_LINKLOCAL(&addr6.sin6_addr)) {
struct sockaddr_in6 addr6_ll = {
.sin6_family = AF_INET6,
diff --git a/udp.c b/udp.c
index 097e263..e3bb1e6 100644
--- a/udp.c
+++ b/udp.c
@@ -923,9 +923,9 @@ int udp_tap_handler(struct ctx *c, int af, void *addr,
udp_tap_map[V4][src].ts = now->tv_sec;
- if (s_in.sin_addr.s_addr == c->gw4 &&
- udp_tap_map[V4][dst].ts_local) {
- if (udp_tap_map[V4][dst].loopback)
+ if (s_in.sin_addr.s_addr == c->gw4) {
+ if (!udp_tap_map[V4][dst].ts_local ||
+ udp_tap_map[V4][dst].loopback)
s_in.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
else
s_in.sin_addr.s_addr = c->addr4_seen;
@@ -941,9 +941,9 @@ int udp_tap_handler(struct ctx *c, int af, void *addr,
sa = (struct sockaddr *)&s_in6;
sl = sizeof(s_in6);
- if (!memcmp(addr, &c->gw6, sizeof(c->gw6)) &&
- udp_tap_map[V6][dst].ts_local) {
- if (udp_tap_map[V6][dst].loopback)
+ if (!memcmp(addr, &c->gw6, sizeof(c->gw6))) {
+ if (!udp_tap_map[V6][dst].ts_local ||
+ udp_tap_map[V6][dst].loopback)
s_in6.sin6_addr = in6addr_loopback;
else
s_in6.sin6_addr = c->addr6_seen;