diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 992525765002efe8e6f8f3946a3916eda02f0792..ea237a05e56654bc3ed3c0c3aad891bfe8e6ca3a 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 2443e408ed8a6d00f537bd27cf6e08c81790c329..e696a8ff76be627fe9b8f0b21f4b426b4e5ab00e 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 5feb70938e40b53ea9630c2b89991c76becdd947..e144f3aad3d7fce464eb1ede57b15da9debfdcc7 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 0000000000000000000000000000000000000000..edab52f3a1da0fc5ee68ed58190fea08f2277bb4 --- /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 0000000000000000000000000000000000000000..830ce2852438681a0228eb0a78eddfe8e737410c --- /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 0000000000000000000000000000000000000000..e0dbeafe028de7b22e6c46c8c6df8a8800fbaa2a --- /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 0000000000000000000000000000000000000000..5a5695794a354e0b0dcb40401a3e896ffc75bc0e --- /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 2c62de8fe8d6394d4e9dfec94200d7980d862696..fa238ec339249aac2bb2ca0d34ef836adcd9a775 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);