[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 1/2] socket: treat ipv4=on, ipv6=on uniformly
From: |
Gerd Hoffmann |
Subject: |
Re: [Qemu-devel] [PATCH 1/2] socket: treat ipv4=on, ipv6=on uniformly |
Date: |
Fri, 28 Feb 2014 13:23:21 +0100 |
On Fr, 2014-02-28 at 11:16 +0100, Paolo Bonzini wrote:
> In some cases, "ipv4=on,ipv6=on" means "try both kinds of address";
> in others, it means "try IPv6 only" just by virtue of how the code
> is structured.
> @@ -127,10 +127,13 @@ int inet_listen_opts(QemuOpts *opts, int port_offset,
> Error **errp)
> - if (qemu_opt_get_bool(opts, "ipv4", 0))
> - ai.ai_family = PF_INET;
> - if (qemu_opt_get_bool(opts, "ipv6", 0))
> - ai.ai_family = PF_INET6;
> + if (qemu_opt_get_bool(opts, "ipv4", 0) != qemu_opt_get_bool(opts,
> "ipv6", 0)) {
> + if (qemu_opt_get_bool(opts, "ipv4", 0)) {
> + ai.ai_family = PF_INET;
> + } else {
> + ai.ai_family = PF_INET6;
> + }
> + }
This is wrong for the listening side.
ipv6 sockets can listen on both ipv4 and ipv6. qemu configures ipv6
sockets to do that, unconditionally.
So ipv4=yes,ipv6=no works correctly.
ipv4=yes,ipv6=yes works too.
ipv4=no,ipv6=yes doesn't work, but to fix that you have to set the
IPV6_V6ONLY socket option according to the ipv4 option.
Canevat: Listening on both ipv4+ipv6 with a single file handle works for
the wildcard address only. Specifying -- say --
host=localhost,ipv4=yes,ipv6=yes, then expect qemu to listen on both
127.0.0.1 and ::1 doesn't work.
This can only be fixed by allowing multiple listening filehandles.
Which is a non-trivial change as this also affects the public api (which
will have to report a list of listening addresses instead of a single
address).
> @@ -319,11 +322,12 @@ static struct addrinfo
> *inet_parse_connect_opts(QemuOpts *opts, Error **errp)
> - if (qemu_opt_get_bool(opts, "ipv4", 0)) {
> - ai.ai_family = PF_INET;
> - }
> - if (qemu_opt_get_bool(opts, "ipv6", 0)) {
> - ai.ai_family = PF_INET6;
> + if (qemu_opt_get_bool(opts, "ipv4", 0) != qemu_opt_get_bool(opts,
> "ipv6", 0)) {
> + if (qemu_opt_get_bool(opts, "ipv4", 0)) {
> + ai.ai_family = PF_INET;
> + } else {
> + ai.ai_family = PF_INET6;
> + }
For connect this change is fine I think.
> @@ -418,10 +422,13 @@ int inet_dgram_opts(QemuOpts *opts, Error **errp)
> - if (qemu_opt_get_bool(opts, "ipv4", 0))
> - ai.ai_family = PF_INET;
> - if (qemu_opt_get_bool(opts, "ipv6", 0))
> - ai.ai_family = PF_INET6;
> + if (qemu_opt_get_bool(opts, "ipv4", 0) != qemu_opt_get_bool(opts,
> "ipv6", 0)) {
> + if (qemu_opt_get_bool(opts, "ipv4", 0)) {
> + ai.ai_family = PF_INET;
> + } else {
> + ai.ai_family = PF_INET6;
> + }
> + }
Not fully sure, but I think this is fine too.
cheers,
Gerd