diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 9925257650..ea237a05e5 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3158,6 +3158,25 @@
+
+
+
+
+
+ persistent
+
+
+
+
+ transient
+
+
+
+
+
+
+
+
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 2443e408ed..e696a8ff76 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -555,6 +555,13 @@ VIR_ENUM_IMPL(virDomainNetVirtioTxMode,
"timer",
);
+VIR_ENUM_IMPL(virDomainNetTeaming,
+ VIR_DOMAIN_NET_TEAMING_TYPE_LAST,
+ "none",
+ "persistent",
+ "transient",
+);
+
VIR_ENUM_IMPL(virDomainNetInterfaceLinkState,
VIR_DOMAIN_NET_INTERFACE_LINK_STATE_LAST,
"default",
@@ -6306,6 +6313,21 @@ virDomainNetDefValidate(const virDomainNetDef *net)
virDomainNetTypeToString(net->type));
return -1;
}
+
+ if (net->teaming.type == VIR_DOMAIN_NET_TEAMING_TYPE_TRANSIENT) {
+ if (!net->teaming.persistent) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("teaming persistent attribute must be set if teaming type is 'transient'"));
+ return -1;
+ }
+ } else {
+ if (net->teaming.persistent) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("teaming persistent attribute not allowed if teaming type is '%s'"),
+ virDomainNetTeamingTypeToString(net->teaming.type));
+ return -1;
+ }
+ }
return 0;
}
@@ -11588,6 +11610,8 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
g_autofree char *vhostuser_type = NULL;
g_autofree char *trustGuestRxFilters = NULL;
g_autofree char *vhost_path = NULL;
+ g_autofree char *teamingType = NULL;
+ g_autofree char *teamingPersistent = NULL;
const char *prefix = xmlopt ? xmlopt->config.netPrefix : NULL;
if (!(def = virDomainNetDefNew(xmlopt)))
@@ -11789,6 +11813,10 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
if (!vhost_path && (tmp = virXMLPropString(cur, "vhost")))
vhost_path = virFileSanitizePath(tmp);
VIR_FREE(tmp);
+ } else if (virXMLNodeNameEqual(cur, "teaming") &&
+ !teamingType && !teamingPersistent) {
+ teamingType = virXMLPropString(cur, "type");
+ teamingPersistent = virXMLPropString(cur, "persistent");
}
}
cur = cur->next;
@@ -12310,6 +12338,19 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
}
}
+ if (teamingType) {
+ int tmpTeaming;
+
+ if ((tmpTeaming = virDomainNetTeamingTypeFromString(teamingType)) <= 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("unknown teaming type '%s'"),
+ teamingType);
+ goto error;
+ }
+ def->teaming.type = tmpTeaming;
+ }
+ def->teaming.persistent = g_steal_pointer(&teamingPersistent);
+
rv = virXPathULong("string(./tune/sndbuf)", ctxt, &def->tune.sndbuf);
if (rv >= 0) {
def->tune.sndbuf_specified = true;
@@ -25885,6 +25926,12 @@ virDomainNetDefFormat(virBufferPtr buf,
virBufferAddLit(buf, "\n");
}
+ if (def->teaming.type != VIR_DOMAIN_NET_TEAMING_TYPE_NONE) {
+ virBufferAsprintf(buf, "teaming.type));
+ virBufferEscapeString(buf, " persistent='%s'", def->teaming.persistent);
+ virBufferAddLit(buf, "/>\n");
+ }
if (def->linkstate) {
virBufferAsprintf(buf, "\n",
virDomainNetInterfaceLinkStateTypeToString(def->linkstate));
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 5feb70938e..e144f3aad3 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -886,6 +886,15 @@ typedef enum {
VIR_DOMAIN_NET_VIRTIO_TX_MODE_LAST
} virDomainNetVirtioTxModeType;
+/* the type of teaming device */
+typedef enum {
+ VIR_DOMAIN_NET_TEAMING_TYPE_NONE,
+ VIR_DOMAIN_NET_TEAMING_TYPE_PERSISTENT,
+ VIR_DOMAIN_NET_TEAMING_TYPE_TRANSIENT,
+
+ VIR_DOMAIN_NET_TEAMING_TYPE_LAST
+} virDomainNetTeamingType;
+
/* link interface states */
typedef enum {
VIR_DOMAIN_NET_INTERFACE_LINK_STATE_DEFAULT = 0, /* Default link state (up) */
@@ -960,6 +969,10 @@ struct _virDomainNetDef {
char *tap;
char *vhost;
} backend;
+ struct {
+ virDomainNetTeamingType type;
+ char *persistent; /* alias name of persistent device */
+ } teaming;
union {
virDomainChrSourceDefPtr vhostuser;
struct {
@@ -3430,6 +3443,7 @@ VIR_ENUM_DECL(virDomainFSModel);
VIR_ENUM_DECL(virDomainNet);
VIR_ENUM_DECL(virDomainNetBackend);
VIR_ENUM_DECL(virDomainNetVirtioTxMode);
+VIR_ENUM_DECL(virDomainNetTeaming);
VIR_ENUM_DECL(virDomainNetInterfaceLinkState);
VIR_ENUM_DECL(virDomainNetModel);
VIR_ENUM_DECL(virDomainChrDevice);
diff --git a/tests/qemuxml2argvdata/net-virtio-teaming-network.xml b/tests/qemuxml2argvdata/net-virtio-teaming-network.xml
new file mode 100644
index 0000000000..edab52f3a1
--- /dev/null
+++ b/tests/qemuxml2argvdata/net-virtio-teaming-network.xml
@@ -0,0 +1,37 @@
+
+ QEMUGuest1
+ c7a5fdbd-edaf-9455-926a-d65c16db1809
+ 219100
+ 219100
+ 1
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+ /usr/bin/qemu-system-i386
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/qemuxml2argvdata/net-virtio-teaming.xml b/tests/qemuxml2argvdata/net-virtio-teaming.xml
new file mode 100644
index 0000000000..830ce28524
--- /dev/null
+++ b/tests/qemuxml2argvdata/net-virtio-teaming.xml
@@ -0,0 +1,50 @@
+
+ QEMUGuest1
+ c7a5fdbd-edaf-9455-926a-d65c16db1809
+ 219100
+ 219100
+ 1
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+ /usr/bin/qemu-system-i386
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/qemuxml2xmloutdata/net-virtio-teaming-network.xml b/tests/qemuxml2xmloutdata/net-virtio-teaming-network.xml
new file mode 100644
index 0000000000..e0dbeafe02
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/net-virtio-teaming-network.xml
@@ -0,0 +1,51 @@
+
+ QEMUGuest1
+ c7a5fdbd-edaf-9455-926a-d65c16db1809
+ 219100
+ 219100
+ 1
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+ /usr/bin/qemu-system-i386
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/qemuxml2xmloutdata/net-virtio-teaming.xml b/tests/qemuxml2xmloutdata/net-virtio-teaming.xml
new file mode 100644
index 0000000000..5a5695794a
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/net-virtio-teaming.xml
@@ -0,0 +1,66 @@
+
+ QEMUGuest1
+ c7a5fdbd-edaf-9455-926a-d65c16db1809
+ 219100
+ 219100
+ 1
+
+ hvm
+
+
+
+ destroy
+ restart
+ destroy
+
+ /usr/bin/qemu-system-i386
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 2c62de8fe8..fa238ec339 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -455,6 +455,12 @@ mymain(void)
DO_TEST("net-eth-unmanaged-tap", NONE);
DO_TEST("net-virtio-network-portgroup", NONE);
DO_TEST("net-virtio-rxtxqueuesize", NONE);
+ DO_TEST("net-virtio-teaming",
+ QEMU_CAPS_VIRTIO_NET_FAILOVER,
+ QEMU_CAPS_DEVICE_VFIO_PCI);
+ DO_TEST("net-virtio-teaming-network",
+ QEMU_CAPS_VIRTIO_NET_FAILOVER,
+ QEMU_CAPS_DEVICE_VFIO_PCI);
DO_TEST("net-hostdev", NONE);
DO_TEST("net-hostdev-bootorder", NONE);
DO_TEST("net-hostdev-vfio", QEMU_CAPS_DEVICE_VFIO_PCI);