[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCHv9 08/10] slirp: Adding IPv6 address for DNS relay
From: |
Samuel Thibault |
Subject: |
[Qemu-devel] [PATCHv9 08/10] slirp: Adding IPv6 address for DNS relay |
Date: |
Mon, 22 Feb 2016 20:28:23 +0100 |
From: Guillaume Subiron <address@hidden>
This patch adds an IPv6 address to the DNS relay. in6_equal_dns() is
developed using this Slirp attribute.
sotranslate_in/out/accept() are also updated to manage the IPv6 case so the
guest can be able to join the host using one of the Slirp addresses.
For now this only points to localhost. Further development will be needed to
automatically fetch the IPv6 address from resolv.conf, and announce this via
RDNSS.
Signed-off-by: Guillaume Subiron <address@hidden>
Signed-off-by: Samuel Thibault <address@hidden>
---
slirp/ip6.h | 6 +++++-
slirp/slirp.c | 1 +
slirp/slirp.h | 1 +
slirp/socket.c | 32 ++++++++++++++++++++++++++++++++
4 files changed, 39 insertions(+), 1 deletion(-)
diff --git a/slirp/ip6.h b/slirp/ip6.h
index 55e52a1..c2df8d3 100644
--- a/slirp/ip6.h
+++ b/slirp/ip6.h
@@ -73,7 +73,11 @@ static inline bool in6_equal_mach(const struct in6_addr *a,
|| (in6_equal_net(a, &(struct in6_addr)LINKLOCAL_ADDR, 64)\
&& in6_equal_mach(a, &slirp->vhost_addr6, 64)))
-#define in6_equal_dns(a) 0
+#define in6_equal_dns(a)\
+ ((in6_equal_net(a, &slirp->vprefix_addr6, slirp->vprefix_len)\
+ && in6_equal_mach(a, &slirp->vnameserver_addr6, slirp->vprefix_len))\
+ || (in6_equal_net(a, &(struct in6_addr)LINKLOCAL_ADDR, 64)\
+ && in6_equal_mach(a, &slirp->vnameserver_addr6, 64)))
#define in6_equal_host(a)\
(in6_equal_router(a) || in6_equal_dns(a))
diff --git a/slirp/slirp.c b/slirp/slirp.c
index d908422..a201a5a 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -234,6 +234,7 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork,
slirp->bootp_filename = g_strdup(bootfile);
slirp->vdhcp_startaddr = vdhcp_start;
slirp->vnameserver_addr = vnameserver;
+ inet_pton(AF_INET6, "fec0::3", &slirp->vnameserver_addr6);
if (vdnssearch) {
translate_dnssearch(slirp, vdnssearch);
diff --git a/slirp/slirp.h b/slirp/slirp.h
index 967d93e..a830353 100644
--- a/slirp/slirp.h
+++ b/slirp/slirp.h
@@ -232,6 +232,7 @@ struct Slirp {
struct in6_addr vhost_addr6;
struct in_addr vdhcp_startaddr;
struct in_addr vnameserver_addr;
+ struct in6_addr vnameserver_addr6;
struct in_addr client_ipaddr;
char client_hostname[33];
diff --git a/slirp/socket.c b/slirp/socket.c
index d4b02c8..0661fa9 100644
--- a/slirp/socket.c
+++ b/slirp/socket.c
@@ -747,6 +747,7 @@ void sotranslate_out(struct socket *so, struct
sockaddr_storage *addr)
{
Slirp *slirp = so->slirp;
struct sockaddr_in *sin = (struct sockaddr_in *)addr;
+ struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr;
switch (addr->ss_family) {
case AF_INET:
@@ -767,6 +768,19 @@ void sotranslate_out(struct socket *so, struct
sockaddr_storage *addr)
ntohs(sin->sin_port), inet_ntoa(sin->sin_addr)));
break;
+ case AF_INET6:
+ if (in6_equal_net(&so->so_faddr6, &slirp->vprefix_addr6,
+ slirp->vprefix_len)) {
+ if (in6_equal(&so->so_faddr6, &slirp->vnameserver_addr6)) {
+ /*if (get_dns_addr(&addr) < 0) {*/ /* TODO */
+ sin6->sin6_addr = in6addr_loopback;
+ /*}*/
+ } else {
+ sin6->sin6_addr = in6addr_loopback;
+ }
+ }
+ break;
+
default:
break;
}
@@ -776,6 +790,7 @@ void sotranslate_in(struct socket *so, struct
sockaddr_storage *addr)
{
Slirp *slirp = so->slirp;
struct sockaddr_in *sin = (struct sockaddr_in *)addr;
+ struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr;
switch (addr->ss_family) {
case AF_INET:
@@ -792,6 +807,16 @@ void sotranslate_in(struct socket *so, struct
sockaddr_storage *addr)
}
break;
+ case AF_INET6:
+ if (in6_equal_net(&so->so_faddr6, &slirp->vprefix_addr6,
+ slirp->vprefix_len)) {
+ if (in6_equal(&sin6->sin6_addr, &in6addr_loopback)
+ || !in6_equal(&so->so_faddr6, &slirp->vhost_addr6)) {
+ sin6->sin6_addr = so->so_faddr6;
+ }
+ }
+ break;
+
default:
break;
}
@@ -813,6 +838,13 @@ void sotranslate_accept(struct socket *so)
}
break;
+ case AF_INET6:
+ if (in6_equal(&so->so_faddr6, &in6addr_any) ||
+ in6_equal(&so->so_faddr6, &in6addr_loopback)) {
+ so->so_faddr6 = slirp->vhost_addr6;
+ }
+ break;
+
default:
break;
}
--
2.7.0
- [Qemu-devel] [PATCHv9 0/10] slirp: Adding IPv6 support to Qemu -net user mode, Samuel Thibault, 2016/02/22
- [Qemu-devel] [PATCHv9 03/10] slirp: Adding IPv6 UDP support, Samuel Thibault, 2016/02/22
- [Qemu-devel] [PATCHv9 10/10] slirp: Add IPv6 support to the TFTP code, Samuel Thibault, 2016/02/22
- [Qemu-devel] [PATCHv9 08/10] slirp: Adding IPv6 address for DNS relay,
Samuel Thibault <=
- [Qemu-devel] [PATCHv9 06/10] slirp: Reindent after refactoring, Samuel Thibault, 2016/02/22
- [Qemu-devel] [PATCHv9 09/10] qapi-schema, qemu-options & slirp: Adding Qemu options for IPv6 addresses, Samuel Thibault, 2016/02/22
- [Qemu-devel] [PATCHv9 07/10] slirp: Handle IPv6 in TCP functions, Samuel Thibault, 2016/02/22
- [Qemu-devel] [PATCHv9 04/10] slirp: Factorizing tcpiphdr structure with an union, Samuel Thibault, 2016/02/22
- [Qemu-devel] [PATCHv9 02/10] slirp: Adding ICMPv6 error sending, Samuel Thibault, 2016/02/22
- [Qemu-devel] [PATCHv9 05/10] slirp: Generalizing and neutralizing various TCP functions before adding IPv6 stuff, Samuel Thibault, 2016/02/22
- [Qemu-devel] [PATCHv9 01/10] slirp: Adding IPv6, ICMPv6 Echo and NDP autoconfiguration, Samuel Thibault, 2016/02/22