aboutgitcodebugslistschat
diff options
context:
space:
mode:
-rw-r--r--contrib/libvirt/0001-conf-Introduce-support-for-UNIX-domain-socket-as-qem.patch427
1 files changed, 0 insertions, 427 deletions
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
-