From 598a63fed190ea400bcb6a566e8044bc0da2f303 Mon Sep 17 00:00:00 2001 From: Julian Kranz Date: Sun, 22 Jan 2012 02:33:28 +0100 Subject: [PATCH] --- --- src/client.c | 13 +++++++++++-- src/common.c | 2 +- src/common.h | 9 ++++++++- src/iodine.c | 9 ++++++++- src/iodined.c | 25 ++++++++++++++++++------- 5 files changed, 46 insertions(+), 12 deletions(-) diff --git a/src/client.c b/src/client.c index 9fb9f6d..52582d9 100644 --- a/src/client.c +++ b/src/client.c @@ -64,6 +64,7 @@ static int running; static const char *password; static struct sockaddr_in nameserv; +static struct sockaddr_in6 nameserv6; static struct sockaddr_in raw_serv; static struct sockaddr_in6 raw_serv6; static const char *topdomain; @@ -226,6 +227,11 @@ setaddr: nameserv.sin_family = AF_INET; nameserv.sin_port = htons(port); nameserv.sin_addr = addr; + + memset(&nameserv6, 0, sizeof(nameserv6)); + nameserv6.sin6_family = AF_INET6; + nameserv6.sin6_port = htons(port); + inet_pton(AF_INET6, "::1", &(nameserv6.sin6_addr)); } void @@ -347,7 +353,10 @@ send_query(int fd, char *hostname) fprintf(stderr, " Sendquery: id %5d name[0] '%c'\n", q.id, hostname[0]); #endif - sendto(fd, packet, len, 0, (struct sockaddr*)&nameserv, sizeof(nameserv)); + if(_v6_connect) + sendto(fd, packet, len, 0, (struct sockaddr*)&nameserv6, sizeof(nameserv6)); + else + sendto(fd, packet, len, 0, (struct sockaddr*)&nameserv, sizeof(nameserv)); /* There are DNS relays that time out quickly but don't send anything back on timeout. @@ -1680,7 +1689,7 @@ handshake_raw_udp(int dns_fd, int seed) 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)); + inet_pton(AF_INET6, "::1", &(raw_serv6.sin6_addr)); /* do login against port 53 on remote server * based on the old seed. If reply received, diff --git a/src/common.c b/src/common.c index 42c4353..c613cdb 100644 --- a/src/common.c +++ b/src/common.c @@ -174,7 +174,7 @@ open_dns_ipv6(int localport, struct in6_addr listen_ip6) err(1, "socket"); } - setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&false, sizeof(false)); + setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&flag, sizeof(flag)); flag = 1; #ifdef SO_REUSEPORT diff --git a/src/common.h b/src/common.h index 662b06a..5bc10fd 100644 --- a/src/common.h +++ b/src/common.h @@ -94,8 +94,15 @@ struct query { unsigned short type; unsigned short rcode; unsigned short id; +// union { +// struct in_addr v4; +// struct in6_addr v6; +// } destination; struct in_addr destination; - struct sockaddr from; + union { + struct sockaddr v4; + struct sockaddr_in6 v6; + } from; int fromlen; unsigned short id2; struct sockaddr from2; diff --git a/src/iodine.c b/src/iodine.c index b068f7b..f3cbc3c 100644 --- a/src/iodine.c +++ b/src/iodine.c @@ -361,7 +361,14 @@ main(int argc, char **argv) goto cleanup1; } - if ((dns_fd = open_dns(0, INADDR_ANY)) == -1) { + /** + * Todo: Fix + */ +// if ((dns_fd = open_dns(0, INADDR_ANY)) == -1) { +// retval = 1; +// goto cleanup2; +// } + if ((dns_fd = open_dns_ipv6(0, in6addr_any)) == -1) { retval = 1; goto cleanup2; } diff --git a/src/iodined.c b/src/iodined.c index 4617c04..0fc5c16 100644 --- a/src/iodined.c +++ b/src/iodined.c @@ -95,6 +95,7 @@ static int debug; #ifdef LINUX static char v6; +static char v6_listen; #endif #if !defined(BSD) && !defined(__GLIBC__) @@ -1975,6 +1976,7 @@ static int read_dns(int fd, int tun_fd, struct query *q) /* FIXME: tun_fd is because of raw_decode() below */ { struct sockaddr_in from; + struct sockaddr_in6 from6; socklen_t addrlen; char packet[64*1024]; int r; @@ -1988,8 +1990,13 @@ read_dns(int fd, int tun_fd, struct query *q) /* FIXME: tun_fd is because of raw iov.iov_base = packet; iov.iov_len = sizeof(packet); - msg.msg_name = (caddr_t) &from; - msg.msg_namelen = (unsigned) addrlen; + if (v6_listen) { + msg.msg_name = (caddr_t) &from6; + msg.msg_namelen = sizeof(from6); + } else { + msg.msg_name = (caddr_t) &from; + msg.msg_namelen = (unsigned) addrlen; + } msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_control = address; @@ -2006,8 +2013,15 @@ read_dns(int fd, int tun_fd, struct query *q) /* FIXME: tun_fd is because of raw #endif /* !WINDOWS32 */ if (r > 0) { - memcpy((struct sockaddr*)&q->from, (struct sockaddr*)&from, addrlen); - q->fromlen = addrlen; + if (v6_listen) { + memcpy((struct sockaddr*) &q->from, (struct sockaddr*) &from6, + sizeof(struct sockaddr_in6)); + q->fromlen = sizeof(struct sockaddr_in6); + } else { + memcpy((struct sockaddr*) &q->from, (struct sockaddr*) &from, + addrlen); + q->fromlen = addrlen; + } /* TODO do not handle raw packets here! */ if (raw_decode(packet, r, q, fd, tun_fd)) { @@ -2029,7 +2043,6 @@ read_dns(int fd, int tun_fd, struct query *q) /* FIXME: tun_fd is because of raw } } #endif - return strlen(q->name); } else if (r < 0) { /* Error */ @@ -2292,8 +2305,6 @@ main(int argc, char **argv) int dnsd_fd; int tun_fd; - int v6_listen; - /* settings for forwarding normal DNS to * local real DNS server */