diff --git a/src/udprelay.c b/src/udprelay.c index 97400590..9b9ab9ec 100644 --- a/src/udprelay.c +++ b/src/udprelay.c @@ -150,6 +150,10 @@ set_nosigpipe(int socket_fd) #define IP_TRANSPARENT 19 #endif +#ifndef IPV6_TRANSPARENT +#define IPV6_TRANSPARENT 75 +#endif + #ifndef IP_RECVORIGDSTADDR #ifdef IP_ORIGDSTADDR #define IP_RECVORIGDSTADDR IP_ORIGDSTADDR @@ -508,18 +512,17 @@ create_server_socket(const char *host, const char *port) #endif #ifdef MODULE_REDIR - if (setsockopt(server_sock, SOL_IP, IP_TRANSPARENT, &opt, sizeof(opt))) { + int sol = rp->ai_family == AF_INET ? SOL_IP : SOL_IPV6; + int flag_t = rp->ai_family == AF_INET ? IP_TRANSPARENT : IPV6_TRANSPARENT; + int flag_r = rp->ai_family == AF_INET ? IP_RECVORIGDSTADDR : IPV6_TRANSPARENT; + + if (setsockopt(server_sock, sol, flag_t, &opt, sizeof(opt))) { ERROR("[udp] setsockopt IP_TRANSPARENT"); exit(EXIT_FAILURE); } - if (rp->ai_family == AF_INET) { - if (setsockopt(server_sock, SOL_IP, IP_RECVORIGDSTADDR, &opt, sizeof(opt))) { - FATAL("[udp] setsockopt IP_RECVORIGDSTADDR"); - } - } else if (rp->ai_family == AF_INET6) { - if (setsockopt(server_sock, SOL_IPV6, IPV6_RECVORIGDSTADDR, &opt, sizeof(opt))) { - FATAL("[udp] setsockopt IPV6_RECVORIGDSTADDR"); - } + + if (setsockopt(server_sock, SOL_IP, flag_r, &opt, sizeof(opt))) { + FATAL("[udp] setsockopt IP_RECVORIGDSTADDR"); } #endif @@ -844,9 +847,10 @@ remote_recv_cb(EV_P_ ev_io *w, int revents) ERROR("[udp] remote_recv_socket"); goto CLEAN_UP; } - int opt = 1; - int sol = remote_ctx->src_addr.ss_family == AF_INET6 ? SOL_IPV6 : SOL_IP; - if (setsockopt(src_fd, sol, IP_TRANSPARENT, &opt, sizeof(opt))) { + int opt = 1; + int sol = remote_ctx->src_addr.ss_family == AF_INET6 ? SOL_IPV6 : SOL_IP; + int flag = remote_ctx->src_addr.ss_family == AF_INET6 ? IPV6_TRANSPARENT : IP_TRANSPARENT; + if (setsockopt(src_fd, sol, flag, &opt, sizeof(opt))) { ERROR("[udp] remote_recv_setsockopt"); close(src_fd); goto CLEAN_UP;