From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44471) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Zigpz-0006YX-ST for qemu-devel@nongnu.org; Sun, 04 Oct 2015 06:48:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Zigpz-0000Z9-00 for qemu-devel@nongnu.org; Sun, 04 Oct 2015 06:48:15 -0400 Sender: Paolo Bonzini References: <9B0F7F7B0E031F4A99FC8A50E22E3AA360FC1AFD@EU-MBX-01.mgc.mentorg.com> <9B0F7F7B0E031F4A99FC8A50E22E3AA360FC1B8E@EU-MBX-01.mgc.mentorg.com> From: Paolo Bonzini Message-ID: <561103DF.5000704@redhat.com> Date: Sun, 4 Oct 2015 12:47:59 +0200 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [Qemu-discuss] TCP options ipv4 and ipv6 have no effect List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Maydell , "Sair, Umair" Cc: QEMU Developers , "qemu-discuss@nongnu.org" On 03/10/2015 00:36, Peter Maydell wrote: > > I agree about the (!ipv4 || !ipv6) condition though. > The three states I listed above ought to correspond > to "qemu_opt not set", "qemu_opt set to false" and > "qemu_opt set to true", The problem is that the underlying QemuOpts-based code treats "qemu_opt not set" and "qemu_opt set to false" the same way: ipv4 ipv6 Y Y PF_INET6 Y N PF_INET N Y PF_INET6 N N PF_UNSPEC We want: ipv4 ipv6 Y Y PF_INET6 Y N PF_INET Y - PF_INET (ipv6 = N) N Y PF_INET6 N N PF_UNSPEC N - PF_INET6 (ipv6 = Y) - Y PF_INET6 (ipv4 = N) - N PF_INET (ipv4 = Y) - - PF_UNSPEC I think this patch gets the desired semantics: diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c index 2add83a..fdcf3fa 100644 --- a/util/qemu-sockets.c +++ b/util/qemu-sockets.c @@ -586,12 +586,15 @@ fail: static void inet_addr_to_opts(QemuOpts *opts, const InetSocketAddress *addr) { - bool ipv4 = addr->ipv4 || !addr->has_ipv4; - bool ipv6 = addr->ipv6 || !addr->has_ipv6; + bool ipv4 = addr->has_ipv4 && addr->ipv4; + bool ipv6 = addr->has_ipv6 && addr->ipv6; - if (!ipv4 || !ipv6) { + if (ipv4 || ipv6) { qemu_opt_set_bool(opts, "ipv4", ipv4, &error_abort); qemu_opt_set_bool(opts, "ipv6", ipv6, &error_abort); + } else if (addr->has_ipv4 || addr->has_ipv6) { + qemu_opt_set_bool(opts, "ipv4", !addr->has_ipv4, &error_abort); + qemu_opt_set_bool(opts, "ipv6", !addr->has_ipv6, &error_abort); } if (addr->has_to) { qemu_opt_set_number(opts, "to", addr->to, &error_abort); The first if handles the "default to N" case, the second handles "default to Y", the (absent) else case handles "default to PF_UNSPEC". Paolo