All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Peter Maydell <peter.maydell@linaro.org>,
	"Sair, Umair" <Umair_Sair@mentor.com>
Cc: QEMU Developers <qemu-devel@nongnu.org>,
	"qemu-discuss@nongnu.org" <qemu-discuss@nongnu.org>
Subject: Re: [Qemu-devel] [Qemu-discuss] TCP options ipv4 and ipv6 have no effect
Date: Sun, 4 Oct 2015 12:47:59 +0200	[thread overview]
Message-ID: <561103DF.5000704@redhat.com> (raw)
In-Reply-To: <CAFEAcA_tYB6j-APrvPyDKAdNTjZay0-b-kC2LTQhRpDJ0pPxag@mail.gmail.com>

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

  reply	other threads:[~2015-10-04 10:48 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <9B0F7F7B0E031F4A99FC8A50E22E3AA360FC1AFD@EU-MBX-01.mgc.mentorg.com>
2015-10-02 17:56 ` [Qemu-devel] [Qemu-discuss] TCP options ipv4 and ipv6 have no effect Peter Maydell
2015-10-02 18:20   ` Sair, Umair
2015-10-02 22:36     ` Peter Maydell
2015-10-04 10:47       ` Paolo Bonzini [this message]
2015-10-05 18:03         ` Sair, Umair
2015-10-05 19:22           ` Paolo Bonzini
2015-10-05 19:27           ` Paolo Bonzini
2015-10-12 13:06             ` Sair, Umair
2015-10-12 13:25               ` Paolo Bonzini
2015-10-03  8:38     ` Liviu Ionescu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=561103DF.5000704@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=Umair_Sair@mentor.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-discuss@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.