From: David Gibson <david@gibson.dropbear.id.au>
To: Stefano Brivio <sbrivio@redhat.com>
Cc: passt-dev@passt.top
Subject: Re: [PATCH] contrib: Drop libvirt out-of-tree patch, integration mostly works in 9.1.0
Date: Thu, 9 Mar 2023 09:54:34 +1100 [thread overview]
Message-ID: <ZAkSKo4214LpTHm4@yekko> (raw)
In-Reply-To: <20230308225011.2589937-1-sbrivio@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 20420 bytes --]
On Wed, Mar 08, 2023 at 11:50:11PM +0100, Stefano Brivio wrote:
> ...and in any case, this patch doesn't offer any advantage over the
> current upstream integration.
>
> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
> ---
> ...upport-for-UNIX-domain-socket-as-qem.patch | 427 ------------------
> 1 file changed, 427 deletions(-)
> delete mode 100644 contrib/libvirt/0001-conf-Introduce-support-for-UNIX-domain-socket-as-qem.patch
>
> diff --git a/contrib/libvirt/0001-conf-Introduce-support-for-UNIX-domain-socket-as-qem.patch b/contrib/libvirt/0001-conf-Introduce-support-for-UNIX-domain-socket-as-qem.patch
> deleted file mode 100644
> index 386cc4a..0000000
> --- a/contrib/libvirt/0001-conf-Introduce-support-for-UNIX-domain-socket-as-qem.patch
> +++ /dev/null
> @@ -1,427 +0,0 @@
> -From 7afbbab2ccada16c87e1095e85184bb21c028012 Mon Sep 17 00:00:00 2001
> -Message-Id: <7afbbab2ccada16c87e1095e85184bb21c028012.1619091487.git.sbrivio@redhat.com>
> -From: Stefano Brivio <sbrivio@redhat.com>
> -Date: Wed, 21 Apr 2021 19:29:31 +0200
> -Subject: [PATCH] conf: Introduce support for UNIX domain socket as qemu netdev
> - back-end
> -
> -Since qemu [TODO], named UNIX domain sockets can be used instead of
> -TCP to establish a virtual network between VMs.
> -
> -The obvious difference compared with TCP is that we need pass a path
> -instead of address and port.
> -
> -Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
> ----
> -SPDX-FileCopyrightText: 2020-2021 Red Hat GmbH <sbrivio@redhat.com>
> -SPDX-License-Identifier: AGPL-3.0-or-later
> -
> - docs/formatdomain.rst | 41 +++++++++++++++++++------
> - docs/schemas/domaincommon.rng | 50 +++++++++++++++++++++++-------
> - src/conf/domain_conf.c | 58 +++++++++++++++++++++++++++--------
> - src/conf/domain_conf.h | 13 +++++---
> - src/qemu/qemu_command.c | 46 ++++++++++++++++++---------
> - src/qemu/qemu_hotplug.c | 8 +++--
> - 6 files changed, 160 insertions(+), 56 deletions(-)
> -
> -diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
> -index 1b9b2216111c..87c3c956fa23 100644
> ---- a/docs/formatdomain.rst
> -+++ b/docs/formatdomain.rst
> -@@ -5010,18 +5010,20 @@ must be from the multicast address block.
> - </devices>
> - ...
> -
> --:anchor:`<a id="elementsNICSTCP"/>`
> -+:anchor:`<a id="elementsNICSStream"/>`
> -
> --TCP tunnel
> --^^^^^^^^^^
> -+TCP or UNIX domain socket tunnel
> -+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> -+
> -+A stream-oriented client/server architecture provides a virtual network. One VM
> -+provides the server end of the network, all other VMS are configured as clients.
> -+All network traffic is routed between the VMs via the server. This mode is also
> -+available to unprivileged users. There is no default DNS or DHCP support and no
> -+outgoing network access. To provide outgoing network access, one of the VMs
> -+should have a 2nd NIC which is connected to one of the first 4 network types and
> -+do the appropriate routing.
> -
> --A TCP client/server architecture provides a virtual network. One VM provides the
> --server end of the network, all other VMS are configured as clients. All network
> --traffic is routed between the VMs via the server. This mode is also available to
> --unprivileged users. There is no default DNS or DHCP support and no outgoing
> --network access. To provide outgoing network access, one of the VMs should have a
> --2nd NIC which is connected to one of the first 4 network types and do the
> --appropriate routing.
> -+TCP endpoints can be specified as follows:
> -
> - ::
> -
> -@@ -5039,6 +5041,25 @@ appropriate routing.
> - </devices>
> - ...
> -
> -+Named UNIX domain sockets can be specified as follows:
> -+:since:`Since 7.3.0, qemu`
> -+
> -+::
> -+
> -+ ...
> -+ <devices>
> -+ <interface type='server'>
> -+ <mac address='52:54:00:22:c9:42'/>
> -+ <source path='/tmp/qemu.socket'/>
> -+ </interface>
> -+ ...
> -+ <interface type='client'>
> -+ <mac address='52:54:00:8b:c9:51'/>
> -+ <source path='/tmp/qemu.socket'/>
> -+ </interface>
> -+ </devices>
> -+ ...
> -+
> - :anchor:`<a id="elementsNICSUDP"/>`
> -
> - UDP unicast tunnel
> -diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> -index a2e5c50c1d77..7c0a90ba199b 100644
> ---- a/docs/schemas/domaincommon.rng
> -+++ b/docs/schemas/domaincommon.rng
> -@@ -3161,10 +3161,7 @@
> - </group>
> - <group>
> - <attribute name="type">
> -- <choice>
> -- <value>mcast</value>
> -- <value>client</value>
> -- </choice>
> -+ <value>mcast</value>
> - </attribute>
> - <interleave>
> - <element name="source">
> -@@ -3179,6 +3176,30 @@
> - <ref name="interface-options"/>
> - </interleave>
> - </group>
> -+ <group>
> -+ <attribute name="type">
> -+ <value>client</value>
> -+ </attribute>
> -+ <interleave>
> -+ <element name="source">
> -+ <choice>
> -+ <group>
> -+ <attribute name="address">
> -+ <ref name="ipv4Addr"/>
> -+ </attribute>
> -+ <attribute name="port">
> -+ <ref name="PortNumber"/>
> -+ </attribute>
> -+ </group>
> -+ <attribute name="path">
> -+ <ref name="absFilePath"/>
> -+ </attribute>
> -+ </choice>
> -+ <empty/>
> -+ </element>
> -+ <ref name="interface-options"/>
> -+ </interleave>
> -+ </group>
> - <group>
> - <attribute name="type">
> - <value>udp</value>
> -@@ -3210,14 +3231,21 @@
> - </attribute>
> - <interleave>
> - <element name="source">
> -- <optional>
> -- <attribute name="address">
> -- <ref name="ipv4Addr"/>
> -+ <choice>
> -+ <group>
> -+ <optional>
> -+ <attribute name="address">
> -+ <ref name="ipv4Addr"/>
> -+ </attribute>
> -+ </optional>
> -+ <attribute name="port">
> -+ <ref name="PortNumber"/>
> -+ </attribute>
> -+ </group>
> -+ <attribute name="path">
> -+ <ref name="absFilePath"/>
> - </attribute>
> -- </optional>
> -- <attribute name="port">
> -- <ref name="PortNumber"/>
> -- </attribute>
> -+ </choice>
> - <empty/>
> - </element>
> - <ref name="interface-options"/>
> -diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> -index f8a462fb3b99..8c6a5d4f974e 100644
> ---- a/src/conf/domain_conf.c
> -+++ b/src/conf/domain_conf.c
> -@@ -2562,8 +2562,9 @@ virDomainNetDefFree(virDomainNetDef *def)
> - case VIR_DOMAIN_NET_TYPE_CLIENT:
> - case VIR_DOMAIN_NET_TYPE_MCAST:
> - case VIR_DOMAIN_NET_TYPE_UDP:
> -- g_free(def->data.socket.address);
> -- g_free(def->data.socket.localaddr);
> -+ g_free(def->data.socket.net.address);
> -+ g_free(def->data.socket.net.localaddr);
> -+ g_free(def->data.socket.path);
> - break;
> -
> - case VIR_DOMAIN_NET_TYPE_NETWORK:
> -@@ -10555,6 +10556,7 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
> - g_autofree char *downscript = NULL;
> - g_autofree char *address = NULL;
> - g_autofree char *port = NULL;
> -+ g_autofree char *path = NULL;
> - g_autofree char *localaddr = NULL;
> - g_autofree char *localport = NULL;
> - g_autofree char *model = NULL;
> -@@ -10699,7 +10701,7 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
> - " <interface type='%s'>"), type);
> - goto error;
> - }
> -- } else if (!address &&
> -+ } else if (!address && !path &&
> - (def->type == VIR_DOMAIN_NET_TYPE_SERVER ||
> - def->type == VIR_DOMAIN_NET_TYPE_CLIENT ||
> - def->type == VIR_DOMAIN_NET_TYPE_MCAST ||
> -@@ -10707,6 +10709,7 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
> - virXMLNodeNameEqual(cur, "source")) {
> - address = virXMLPropString(cur, "address");
> - port = virXMLPropString(cur, "port");
> -+ path = virXMLPropString(cur, "path");
> - if (!localaddr && def->type == VIR_DOMAIN_NET_TYPE_UDP) {
> - xmlNodePtr tmpnode = ctxt->node;
> - ctxt->node = cur;
> -@@ -10950,6 +10953,27 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
> -
> - case VIR_DOMAIN_NET_TYPE_CLIENT:
> - case VIR_DOMAIN_NET_TYPE_SERVER:
> -+ if (path != NULL) {
> -+ if (port != NULL || address != NULL ||
> -+ localport != NULL || localaddr != NULL) {
> -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -+ _("<source> 'path' attribute "
> -+ "for socket interface cannot be specified "
> -+ "together with other attributes"));
> -+ goto error;
> -+ }
> -+ def->data.socket.path = g_steal_pointer(&path);
> -+ break;
> -+ }
> -+
> -+ if (port == NULL) {
> -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -+ _("Neither <source> 'port' nor 'path' attribute "
> -+ "specified with socket interface"));
> -+ goto error;
> -+ }
> -+
> -+ G_GNUC_FALLTHROUGH;
> - case VIR_DOMAIN_NET_TYPE_MCAST:
> - case VIR_DOMAIN_NET_TYPE_UDP:
> - if (port == NULL) {
> -@@ -10958,7 +10982,7 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
> - "specified with socket interface"));
> - goto error;
> - }
> -- if (virStrToLong_i(port, NULL, 10, &def->data.socket.port) < 0) {
> -+ if (virStrToLong_i(port, NULL, 10, &def->data.socket.net.port) < 0) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("Cannot parse <source> 'port' attribute "
> - "with socket interface"));
> -@@ -10975,7 +10999,7 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
> - goto error;
> - }
> - } else {
> -- def->data.socket.address = g_steal_pointer(&address);
> -+ def->data.socket.net.address = g_steal_pointer(&address);
> - }
> -
> - if (def->type != VIR_DOMAIN_NET_TYPE_UDP)
> -@@ -10987,7 +11011,8 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
> - "specified with socket interface"));
> - goto error;
> - }
> -- if (virStrToLong_i(localport, NULL, 10, &def->data.socket.localport) < 0) {
> -+ if (virStrToLong_i(localport, NULL, 10,
> -+ &def->data.socket.net.localport) < 0) {
> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> - _("Cannot parse <local> 'port' attribute "
> - "with socket interface"));
> -@@ -11000,7 +11025,7 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
> - "specified with socket interface"));
> - goto error;
> - } else {
> -- def->data.socket.localaddr = g_steal_pointer(&localaddr);
> -+ def->data.socket.net.localaddr = g_steal_pointer(&localaddr);
> - }
> - break;
> -
> -@@ -25940,15 +25965,22 @@ virDomainNetDefFormat(virBuffer *buf,
> -
> - case VIR_DOMAIN_NET_TYPE_SERVER:
> - case VIR_DOMAIN_NET_TYPE_CLIENT:
> -+ if (def->data.socket.path) {
> -+ virBufferAsprintf(buf, "<source path='%s'",
> -+ def->data.socket.path);
> -+ sourceLines++;
> -+ break;
> -+ }
> -+ G_GNUC_FALLTHROUGH;
> - case VIR_DOMAIN_NET_TYPE_MCAST:
> - case VIR_DOMAIN_NET_TYPE_UDP:
> -- if (def->data.socket.address) {
> -+ if (def->data.socket.net.address) {
> - virBufferAsprintf(buf, "<source address='%s' port='%d'",
> -- def->data.socket.address,
> -- def->data.socket.port);
> -+ def->data.socket.net.address,
> -+ def->data.socket.net.port);
> - } else {
> - virBufferAsprintf(buf, "<source port='%d'",
> -- def->data.socket.port);
> -+ def->data.socket.net.port);
> - }
> - sourceLines++;
> -
> -@@ -25960,8 +25992,8 @@ virDomainNetDefFormat(virBuffer *buf,
> - virBufferAdjustIndent(buf, 2);
> -
> - virBufferAsprintf(buf, "<local address='%s' port='%d'/>\n",
> -- def->data.socket.localaddr,
> -- def->data.socket.localport);
> -+ def->data.socket.net.localaddr,
> -+ def->data.socket.net.localport);
> - virBufferAdjustIndent(buf, -2);
> - break;
> -
> -diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> -index 7688f17b18cd..054b08330c8c 100644
> ---- a/src/conf/domain_conf.h
> -+++ b/src/conf/domain_conf.h
> -@@ -1055,11 +1055,14 @@ struct _virDomainNetDef {
> - virDomainNetTeamingInfo *teaming;
> - union {
> - virDomainChrSourceDef *vhostuser;
> -- struct {
> -- char *address;
> -- int port;
> -- char *localaddr;
> -- int localport;
> -+ union {
> -+ struct {
> -+ char *address;
> -+ int port;
> -+ char *localaddr;
> -+ int localport;
> -+ } net;
> -+ char *path;
> - } socket; /* any of NET_CLIENT or NET_SERVER or NET_MCAST */
> - struct {
> - char *name;
> -diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> -index 2ceff155124e..dbef58f37879 100644
> ---- a/src/qemu/qemu_command.c
> -+++ b/src/qemu/qemu_command.c
> -@@ -3713,37 +3713,55 @@ qemuBuildHostNetStr(virDomainNetDef *net,
> - break;
> -
> - case VIR_DOMAIN_NET_TYPE_CLIENT:
> -- if (virJSONValueObjectCreate(&netprops, "s:type", "socket", NULL) < 0 ||
> -- virJSONValueObjectAppendStringPrintf(netprops, "connect", "%s:%d",
> -- net->data.socket.address,
> -- net->data.socket.port) < 0)
> -+ if (virJSONValueObjectCreate(&netprops, "s:type", "socket", NULL) < 0)
> -+ return NULL;
> -+
> -+ if (net->data.socket.path != NULL) {
> -+ if (virJSONValueObjectAppendStringPrintf(netprops, "connect", "%s",
> -+ net->data.socket.path) < 0)
> -+ return NULL;
> -+ break;
> -+ }
> -+
> -+ if (virJSONValueObjectAppendStringPrintf(netprops, "connect", "%s:%d",
> -+ net->data.socket.net.address,
> -+ net->data.socket.net.port) < 0)
> - return NULL;
> - break;
> -
> - case VIR_DOMAIN_NET_TYPE_SERVER:
> -- if (virJSONValueObjectCreate(&netprops, "s:type", "socket", NULL) < 0 ||
> -- virJSONValueObjectAppendStringPrintf(netprops, "listen", "%s:%d",
> -- NULLSTR_EMPTY(net->data.socket.address),
> -- net->data.socket.port) < 0)
> -+ if (virJSONValueObjectCreate(&netprops, "s:type", "socket", NULL) < 0)
> -+ return NULL;
> -+
> -+ if (net->data.socket.path != NULL) {
> -+ if (virJSONValueObjectAppendStringPrintf(netprops, "listen", "%s",
> -+ net->data.socket.path) < 0)
> -+ return NULL;
> -+ break;
> -+ }
> -+
> -+ if (virJSONValueObjectAppendStringPrintf(netprops, "listen", "%s:%d",
> -+ NULLSTR_EMPTY(net->data.socket.net.address),
> -+ net->data.socket.net.port) < 0)
> - return NULL;
> - break;
> -
> - case VIR_DOMAIN_NET_TYPE_MCAST:
> - if (virJSONValueObjectCreate(&netprops, "s:type", "socket", NULL) < 0 ||
> - virJSONValueObjectAppendStringPrintf(netprops, "mcast", "%s:%d",
> -- net->data.socket.address,
> -- net->data.socket.port) < 0)
> -+ net->data.socket.net.address,
> -+ net->data.socket.net.port) < 0)
> - return NULL;
> - break;
> -
> - case VIR_DOMAIN_NET_TYPE_UDP:
> - if (virJSONValueObjectCreate(&netprops, "s:type", "socket", NULL) < 0 ||
> - virJSONValueObjectAppendStringPrintf(netprops, "udp", "%s:%d",
> -- net->data.socket.address,
> -- net->data.socket.port) < 0 ||
> -+ net->data.socket.net.address,
> -+ net->data.socket.net.port) < 0 ||
> - virJSONValueObjectAppendStringPrintf(netprops, "localaddr", "%s:%d",
> -- net->data.socket.localaddr,
> -- net->data.socket.localport) < 0)
> -+ net->data.socket.net.localaddr,
> -+ net->data.socket.net.localport) < 0)
> - return NULL;
> - break;
> -
> -diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> -index 4344edc75b80..69ef7abd0ee2 100644
> ---- a/src/qemu/qemu_hotplug.c
> -+++ b/src/qemu/qemu_hotplug.c
> -@@ -3741,9 +3741,11 @@ qemuDomainChangeNet(virQEMUDriver *driver,
> - case VIR_DOMAIN_NET_TYPE_CLIENT:
> - case VIR_DOMAIN_NET_TYPE_MCAST:
> - case VIR_DOMAIN_NET_TYPE_UDP:
> -- if (STRNEQ_NULLABLE(olddev->data.socket.address,
> -- newdev->data.socket.address) ||
> -- olddev->data.socket.port != newdev->data.socket.port) {
> -+ if (STRNEQ_NULLABLE(olddev->data.socket.path,
> -+ newdev->data.socket.path) ||
> -+ STRNEQ_NULLABLE(olddev->data.socket.net.address,
> -+ newdev->data.socket.net.address) ||
> -+ olddev->data.socket.net.port != newdev->data.socket.net.port) {
> - needReconnect = true;
> - }
> - break;
> ---
> -2.29.2
> -
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
prev parent reply other threads:[~2023-03-08 22:57 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-08 22:50 [PATCH] contrib: Drop libvirt out-of-tree patch, integration mostly works in 9.1.0 Stefano Brivio
2023-03-08 22:54 ` David Gibson [this message]
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=ZAkSKo4214LpTHm4@yekko \
--to=david@gibson.dropbear.id.au \
--cc=passt-dev@passt.top \
--cc=sbrivio@redhat.com \
/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.
Code repositories for project(s) associated with this public inbox
https://passt.top/passt
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 IMAP folder(s).