From patchwork Sun Oct 20 14:56:19 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Samuel Thibault X-Patchwork-Id: 284989 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 6A9A72C00E4 for ; Mon, 21 Oct 2013 01:58:10 +1100 (EST) Received: from localhost ([::1]:36375 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VXuSG-0004GT-LG for incoming@patchwork.ozlabs.org; Sun, 20 Oct 2013 10:58:08 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59319) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VXuRg-00043L-Qo for qemu-devel@nongnu.org; Sun, 20 Oct 2013 10:57:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VXuRa-0007bd-Ky for qemu-devel@nongnu.org; Sun, 20 Oct 2013 10:57:32 -0400 Received: from toccata.ens-lyon.org ([140.77.166.68]:33577) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VXuRa-0007bW-CU for qemu-devel@nongnu.org; Sun, 20 Oct 2013 10:57:26 -0400 Received: from localhost (localhost [127.0.0.1]) by toccata.ens-lyon.org (Postfix) with ESMTP id C0B4A840B4; Sun, 20 Oct 2013 16:57:25 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at toccata.ens-lyon.org Received: from toccata.ens-lyon.org ([127.0.0.1]) by localhost (toccata.ens-lyon.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id MUd0c2lpoeLZ; Sun, 20 Oct 2013 16:57:25 +0200 (CEST) Received: from type.ipv6 (unknown [37.161.244.223]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by toccata.ens-lyon.org (Postfix) with ESMTPSA id 644C6840B3; Sun, 20 Oct 2013 16:57:01 +0200 (CEST) Received: from samy by type.ipv6 with local (Exim 4.80) (envelope-from ) id 1VXuQh-0005f4-1a; Sun, 20 Oct 2013 16:56:31 +0200 From: Samuel Thibault To: qemu-devel@nongnu.org Date: Sun, 20 Oct 2013 16:56:19 +0200 Message-Id: <1382280980-21676-15-git-send-email-samuel.thibault@ens-lyon.org> X-Mailer: git-send-email 1.8.4.rc3 In-Reply-To: <1382280980-21676-1-git-send-email-samuel.thibault@ens-lyon.org> References: <20131020145406.GA17618@type> <1382280980-21676-1-git-send-email-samuel.thibault@ens-lyon.org> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 140.77.166.68 Cc: Samuel Thibault , Guillaume Subiron Subject: [Qemu-devel] [PATCH 15/16] slirp: Adding IPv6 address for DNS relay X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This patch adds an IPv6 address to the DNS relay. in6_equal_dns() is developed using this Slirp attribute. sotranslate_in/out() are also updated to manage the IPv6 case so the guest can be able to join the host using one of the Slirp addresses. Signed-off-by: Guillaume Subiron --- slirp/ip6.h | 5 ++++- slirp/slirp.c | 2 ++ slirp/slirp.h | 1 + slirp/socket.c | 26 ++++++++++++++++++++++++-- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/slirp/ip6.h b/slirp/ip6.h index 16124ec..b88456d 100644 --- a/slirp/ip6.h +++ b/slirp/ip6.h @@ -74,7 +74,10 @@ static inline int in6_equal_mach(struct in6_addr a, struct in6_addr b, || (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_net(a, (struct in6_addr)LINKLOCAL_ADDR, 64))\ + && in6_equal_mach(a, slirp->vnameserver_addr6, slirp->vprefix_len)) #define in6_equal_host(a)\ (in6_equal_router(a) || in6_equal_dns(a)) diff --git a/slirp/slirp.c b/slirp/slirp.c index 0f6f006..695e8a6 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -236,6 +236,8 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork, slirp->bootp_filename = g_strdup(bootfile); slirp->vdhcp_startaddr = vdhcp_start; slirp->vnameserver_addr = vnameserver; + /* :TODO:maethor:130311: Use a parameter passed to the function */ + inet_pton(AF_INET6, "fc00::2", &slirp->vnameserver_addr6); if (vdnssearch) { translate_dnssearch(slirp, vdnssearch); diff --git a/slirp/slirp.h b/slirp/slirp.h index b6e805e..0688ea7 100644 --- a/slirp/slirp.h +++ b/slirp/slirp.h @@ -236,6 +236,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 567f9bc..a9b3957 100644 --- a/slirp/socket.c +++ b/slirp/socket.c @@ -741,12 +741,12 @@ sofwdrain(struct socket *so) /* * Translate addr in host addr when it is a virtual address - * :TODO:maethor:130314: Manage IPv6 */ 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,16 +767,29 @@ 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; } } -/* :TODO:maethor:130314: IPv6 */ 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: @@ -793,6 +806,15 @@ 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; + } + } + default: break; }