diff --git a/src/client.c b/src/client.c index 2e3de81..9fb9f6d 100644 --- a/src/client.c +++ b/src/client.c @@ -65,12 +65,14 @@ static const char *password; static struct sockaddr_in nameserv; static struct sockaddr_in raw_serv; +static struct sockaddr_in6 raw_serv6; static const char *topdomain; static uint16_t rand_seed; #ifdef LINUX static char _v6; +static char _v6_connect = 1; #endif /* Current up/downstream IP packet */ @@ -395,7 +397,12 @@ send_raw(int fd, char *buf, int buflen, int user, int cmd) len += RAW_HDR_LEN; packet[RAW_HDR_CMD] = cmd | (user & 0x0F); - sendto(fd, packet, len, 0, (struct sockaddr*)&raw_serv, sizeof(raw_serv)); + if (_v6_connect) + sendto(fd, packet, len, 0, (struct sockaddr*) &raw_serv6, + sizeof(raw_serv)); + else + sendto(fd, packet, len, 0, (struct sockaddr*) &raw_serv, + sizeof(raw_serv)); } static void @@ -1671,6 +1678,10 @@ handshake_raw_udp(int dns_fd, int seed) raw_serv.sin_port = htons(53); raw_serv.sin_addr = server; + raw_serv6.sin6_family = AF_INET6; + raw_serv6.sin6_port = htons(53); + inet_pton(AF_INET6, "2001:4ca0:2001:0018:0216:3eff:fe99:4d2b", &(raw_serv6.sin6_addr)); + /* do login against port 53 on remote server * based on the old seed. If reply received, * switch to raw udp mode */ diff --git a/src/common.c b/src/common.c index d9f7ba0..42c4353 100644 --- a/src/common.c +++ b/src/common.c @@ -161,6 +161,7 @@ open_dns_ipv6(int localport, struct in6_addr listen_ip6) struct sockaddr_in6 addr; int flag = 1; int fd; + int false = 0; memset(&addr, 0, sizeof(addr)); addr.sin6_family = AF_INET6; @@ -173,6 +174,8 @@ open_dns_ipv6(int localport, struct in6_addr listen_ip6) err(1, "socket"); } + setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&false, sizeof(false)); + flag = 1; #ifdef SO_REUSEPORT setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, (const void*) &flag, sizeof(flag));