From: Alexey Kirillov <lekiravi@yandex-team.ru>
To: Jason Wang <jasowang@redhat.com>, Eric Blake <eblake@redhat.com>,
Markus Armbruster <armbru@redhat.com>,
Thomas Huth <thuth@redhat.com>
Cc: Laurent Vivier <lvivier@redhat.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
Stefan Weil <sw@weilnetz.de>,
"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
Vincenzo Maffione <v.maffione@gmail.com>,
"yc-core@yandex-team.ru" <yc-core@yandex-team.ru>,
Samuel Thibault <samuel.thibault@ens-lyon.org>,
Paolo Bonzini <pbonzini@redhat.com>,
Giuseppe Lettieri <g.lettieri@iet.unipi.it>,
Luigi Rizzo <rizzo@iet.unipi.it>
Subject: Re: [PATCH v5 3/4] hmp: Use QMP query-netdev in hmp_info_network
Date: Mon, 14 Dec 2020 20:14:43 +0300 [thread overview]
Message-ID: <159211607963975@mail.yandex-team.ru> (raw)
In-Reply-To: <3e019e9d-2649-5df8-8f9c-8d76eb2615a5@redhat.com>
Hi!
07.12.2020, 08:52, "Jason Wang" <jasowang@redhat.com>:
> On 2020/11/9 上午7:59, Alexey Kirillov wrote:
>> +#ifdef CONFIG_SLIRP
>> + case NET_BACKEND_USER: {
>> + size_t len = strchr(ni->u.user.net, '/') - ni->u.user.net;
>> + char *net = g_strndup(ni->u.user.net, len);
>> +
>> + info_str = g_strdup_printf("net=%s,restrict=%s",
>> + net,
>> + ni->u.user.q_restrict ? "on" : "off");
>> + g_free(net);
>> + break;
>> + }
>> +#endif /* CONFIG_SLIRP */
>> + case NET_BACKEND_TAP: {
>> +#ifndef _WIN32
>> + if (ni->u.tap.has_fds) {
>> + char **fds = g_strsplit(ni->u.tap.fds, ":", -1);
>> +
>> + info_str = g_strdup_printf("fd=%s", fds[nc->queue_index]);
>> + g_strfreev(fds);
>> + } else if (ni->u.tap.has_helper) {
>> + info_str = g_strdup_printf("helper=%s", ni->u.tap.helper);
>> + } else {
>> + info_str = g_strdup_printf("ifname=%s,script=%s,downscript=%s",
>> + ni->u.tap.ifname,
>> + nc->queue_index == 0 ? ni->u.tap.script : "no",
>> + nc->queue_index == 0 ? ni->u.tap.downscript : "no");
>> + }
>> +#else
>> + info_str = g_strdup_printf("tap: ifname=%s", ni->u.tap.ifname);
>> +#endif /* _WIN32 */
>> + break;
>> + }
>> +#ifdef CONFIG_L2TPV3
>> + case NET_BACKEND_L2TPV3: {
>> + info_str = g_strdup_printf("l2tpv3: connected");
>> + break;
>> + }
>> +#endif /* CONFIG_L2TPV3 */
>> + case NET_BACKEND_SOCKET: {
>> + if (ni->u.socket.has_listen) {
>> + if (ni->u.socket.has_fd) {
>> + info_str = g_strdup_printf("socket: connection from %s",
>> + ni->u.socket.listen);
>> + } else {
>> + info_str = g_strdup_printf("socket: wait from %s",
>> + ni->u.socket.listen);
>> + }
>> + } else if (ni->u.socket.has_connect && ni->u.socket.has_fd) {
>> + info_str = g_strdup_printf("socket: connect to %s",
>> + ni->u.socket.connect);
>> + } else if (ni->u.socket.has_mcast && ni->u.socket.has_fd) {
>> + info_str = g_strdup_printf("socket: mcast=%s",
>> + ni->u.socket.mcast);
>> + } else if (ni->u.socket.has_udp && ni->u.socket.has_fd) {
>> + info_str = g_strdup_printf("socket: udp=%s", ni->u.socket.udp);
>> + } else {
>> + g_assert(ni->u.socket.has_fd);
>> + int so_type = -1;
>> + int optlen = sizeof(so_type);
>> + int fd = atoi(ni->u.socket.fd);
>> +
>> + getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type,
>> + (socklen_t *)&optlen);
>> + if (so_type == SOCK_STREAM) {
>> + info_str = g_strdup_printf("socket: fd=%s",
>> + ni->u.socket.fd);
>> + } else {
>> + if (ni->u.socket.has_mcast) {
>> + /*
>> + * This branch is unreachable, according to how it is in
>> + * net/socket.c at this moment
>> + */
>> + info_str = g_strdup_printf("socket: fd=%s "
>> + "(cloned mcast=%s)",
>> + ni->u.socket.fd,
>> + ni->u.socket.mcast);
>> + } else {
>> + SocketAddress *sa = socket_local_address(fd, NULL);
>> +
>> + info_str = g_strdup_printf("socket: fd=%s %s",
>> + ni->u.socket.fd,
>> + SocketAddressType_str(sa->type));
>> + qapi_free_SocketAddress(sa);
>> + }
>> + }
>> + }
>> + break;
>> + }
>> +#ifdef CONFIG_VDE
>> + case NET_BACKEND_VDE: {
>> + info_str = g_strdup_printf("sock=%s,fd=%d",
>> + ni->u.vde.sock,
>> + net_vde_get_fd(nc));
>> + break;
>> + }
>> +#endif /* CONFIG_VDE */
>> +#ifdef CONFIG_NET_BRIDGE
>> + case NET_BACKEND_BRIDGE: {
>> + info_str = g_strdup_printf("helper=%s,br=%s",
>> + ni->u.bridge.helper,
>> + ni->u.bridge.br);
>> + break;
>> + }
>> +#endif /* CONFIG_NET_BRIDGE */
>> +#ifdef CONFIG_NETMAP
>> + case NET_BACKEND_NETMAP: {
>> + info_str = g_strdup_printf("netmap: ifname=%s",
>> + ni->u.netmap.ifname);
>> + break;
>> + }
>> +#endif /* CONFIG_NETMAP */
>> +#ifdef CONFIG_VHOST_NET_USER
>> + case NET_BACKEND_VHOST_USER: {
>> + info_str = g_strdup_printf("vhost-user%d to %s",
>> + nc->queue_index,
>> + ni->u.vhost_user.chardev);
>> + break;
>> + }
>> +#endif /* CONFIG_VHOST_NET_USER */
>> +#ifdef CONFIG_VHOST_NET_VDPA
>> + case NET_BACKEND_VHOST_VDPA: {
>> + info_str = g_strdup("vhost-vdpa");
>> + break;
>> + }
>> +#endif /* CONFIG_VHOST_NET_VDPA */
>
> This will introduce burdens for new netdevs or new attributes since
> people can easily forget to add the routine here.
>
> I think at least we need introduce callbacks for this.
Thanks for pointing. I can't remember why exactly I chose to not do it.
So it's definitely better to split this chunk to several callbacks.
I'll do it in the next version of series.
> One more stupid question, instead of generating the string via hard
> codes, is there any method (dict?) to iterate all the key/values
> automatically?
>
> Thanks
Oh yes, that the point.
Now there are no common format for info_str.
This patch is aimed to keep old HMP command mostly untouched.
But if we can drop old format, all this mess can be generalized as JSON
lines replacing old info_str stuff.
What do you think about that?
Originally I wanted to completely drop old info_str and use
QAPI to store and provide information about netdevs (and NICs too).
Thanks!
--
Alexey Kirillov
Yandex.Cloud
next prev parent reply other threads:[~2020-12-14 17:16 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-08 23:59 [PATCH v5 0/4] Introducing QMP query-netdev command Alexey Kirillov
2020-11-08 23:59 ` [PATCH v5 1/4] qapi: net: Add " Alexey Kirillov
2020-11-08 23:59 ` [PATCH v5 2/4] tests: Add tests for " Alexey Kirillov
2020-11-08 23:59 ` [PATCH v5 3/4] hmp: Use QMP query-netdev in hmp_info_network Alexey Kirillov
2020-12-07 5:52 ` Jason Wang
2020-12-14 17:14 ` Alexey Kirillov [this message]
2020-12-15 4:16 ` Jason Wang
2020-12-15 8:39 ` Markus Armbruster
2020-12-16 5:58 ` Jason Wang
2020-12-16 9:16 ` Alexey Kirillov
2020-11-08 23:59 ` [PATCH v5 4/4] net: Do not use legacy info_str for backends Alexey Kirillov
2020-11-23 15:19 ` [PATCH v5 0/4] Introducing QMP query-netdev command Alexey Kirillov
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=159211607963975@mail.yandex-team.ru \
--to=lekiravi@yandex-team.ru \
--cc=armbru@redhat.com \
--cc=eblake@redhat.com \
--cc=g.lettieri@iet.unipi.it \
--cc=jasowang@redhat.com \
--cc=lvivier@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=rizzo@iet.unipi.it \
--cc=samuel.thibault@ens-lyon.org \
--cc=sw@weilnetz.de \
--cc=thuth@redhat.com \
--cc=v.maffione@gmail.com \
--cc=yc-core@yandex-team.ru \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).