From: Markus Armbruster <armbru@redhat.com>
To: Eric Blake <eblake@redhat.com>
Cc: lekiravi@yandex-team.ru, jasowang@redhat.com,
qemu-devel@nongnu.org, dgilbert@redhat.com
Subject: Re: [PATCH v2 1/2] net: Complete qapi-fication of netdev_add
Date: Tue, 17 Mar 2020 21:36:51 +0100 [thread overview]
Message-ID: <87d09ak9b0.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <20200317201711.322764-2-eblake@redhat.com> (Eric Blake's message of "Tue, 17 Mar 2020 15:17:10 -0500")
Eric Blake <eblake@redhat.com> writes:
> We've had all the required pieces for doing a type-safe representation
> of netdev_add as a flat union for quite some time now (since
> 0e55c381f6 in v2.7.0, released in 2016), but did not make the final
> switch to using it because of concern about whether a command-line
> regression in accepting "1" in place of 1 for integer arguments would
> be problematic. Back then, we did not have the deprecation cycle to
> allow us to make progress. But now that we have waited so long, other
> problems have crept in: for example, our desire to add
> qemu-storage-daemon is hampered by the inability to express net
> objects, and we are unable to introspect what we actually accept.
> Additionally, our round-trip through QemuOpts silently eats any
> argument that expands to an array, rendering dnssearch, hostfwd, and
> guestfwd useless through QMP:
>
> {"execute": "netdev_add", "arguments": { "id": "netdev0",
> "type": "user", "dnssearch": [
> { "str": "8.8.8.8" }, { "str": "8.8.4.4" }
> ]}}
>
> So without further ado, let's turn on proper QAPI. netdev_add() was a
> trivial wrapper around net_client_init(), which did a few steps prior
> to calling net_client_init1(); with this patch, we now skip directly
> to net_client_init1(). In addition to fixing array parameters, the
> following additional differences occur:
>
> - {"execute": "netdev_add", "arguments": {"type": "help"}}
> no longer attempts to print help to stdout and exit. Bug fix, broken
> in 547203ead4 'net: List available netdevs with "-netdev help"',
> v2.12.0.
>
> - {"execute": "netdev_add", "arguments': {... "ip6-net": "..." }}
> no longer attempts to desugar the undocumented ip6-net magic string
> into the proper "ipv6-prefix" and "ipv6-prefixlen". Undocumented
> misfeature, introduced in commit 7aac531ef2 "qapi-schema, qemu-options
> & slirp: Adding Qemu options for IPv6 addresses", v2.6.0.
>
> - {'execute':'netdev_add',
> 'arguments':{'id':'net2', 'type':'hubport', 'hubid':"2"}}
> {"error": {"class": "GenericError", "desc": "Invalid parameter type for 'hubid', expected: integer"}}
> Used to succeed: since our command line treats everything as strings,
> our not-so-round-trip conversion from QAPI -> QemuOpts -> QAPI lost
> the original typing and turned everything into a string; now that we
> skip the QemuOpts, the JSON input has to match the exact QAPI type.
> But this stricter QMP is desirable, and introspection is sufficient
> for any affected applications to make sure they use it correctly.
>
> In qmp_netdev_add(), we still have to create a QemuOpts object so that
> qmp_netdev_del() will be able to remove a hotplugged network device;
> but the opts->head remains empty since we now manage all parsing
> through the QAPI object rather than QemuOpts; a separate patch will
> address the abuse of QemuOpts as a witness for whether a
> NetClientState is a netdev. In the meantime, our argument that we are
> okay requires auditing all uses of option group "netdev":
>
> - qemu_netdev_opts: option group definition, empty .desc[]
> - CLI (CLI netdev parsing ends before monitors start, so while
> monitors can mess with CLI netdevs, CLI cannot mess with
> monitor netdevs):
> - main() case QEMU_OPTION_netdev: store CLI definition
> - main() case QEMU_OPTION_readconfig, case QEMU_OPTION_writeconfig:
> similar, dealing only with CLI
> - net_init_clients(): Pass CLI to net_client_init()
> - Monitor:
> - hmp_netdev_add(): straightforward parse into net_client_init()
> - qmp_netdev_add(): subject of this patch, used to add full
> object to option group, now just adds bare-bones id
> - qmp_netdev_del(), netdev_del_completion(): check the option group
> solely for id, as a 'is this a netdev' predicate
>
> Reported-by: Alex Kirillov <lekiravi@yandex-team.ru>
> Signed-off-by: Eric Blake <eblake@redhat.com>
Thanks for the nice commit message.
Reviewed-by: Markus Armbruster <armbru@redhat.com>
next prev parent reply other threads:[~2020-03-17 20:37 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-17 20:17 [PATCH v2 0/2] netdev qapification Eric Blake
2020-03-17 20:17 ` [PATCH v2 1/2] net: Complete qapi-fication of netdev_add Eric Blake
2020-03-17 20:36 ` Markus Armbruster [this message]
2020-03-17 20:50 ` Markus Armbruster
2020-03-17 20:17 ` [PATCH v2 2/2] net: Track netdevs in NetClientState rather than QemuOpt Eric Blake
2020-03-17 20:35 ` Markus Armbruster
2020-03-17 20:53 ` [PATCH v2 0/2] netdev qapification Markus Armbruster
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=87d09ak9b0.fsf@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=dgilbert@redhat.com \
--cc=eblake@redhat.com \
--cc=jasowang@redhat.com \
--cc=lekiravi@yandex-team.ru \
--cc=qemu-devel@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.