mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-29 04:03:45 +00:00
Fix #2600
This commit is contained in:
+16
-12
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user