public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
* [PATCH] contrib: Drop libvirt out-of-tree patch, integration mostly works in 9.1.0
@ 2023-03-08 22:50 Stefano Brivio
  2023-03-08 22:54 ` David Gibson
  0 siblings, 1 reply; 2+ messages in thread
From: Stefano Brivio @ 2023-03-08 22:50 UTC (permalink / raw)
  To: passt-dev

...and in any case, this patch doesn't offer any advantage over the
current upstream integration.

Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
---
 ...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
-
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] contrib: Drop libvirt out-of-tree patch, integration mostly works in 9.1.0
  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
  0 siblings, 0 replies; 2+ messages in thread
From: David Gibson @ 2023-03-08 22:54 UTC (permalink / raw)
  To: Stefano Brivio; +Cc: passt-dev

[-- 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 --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-03-08 22:57 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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

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).