mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-14 12:58:33 +03:00
qemu: move runtime netdev validation into a separate function
The same validation should be done for both static network devices and hotplugged devices, but they are currently inconsistent. Move all the relevant validation from qemuBuildInterfaceCommandLine() into the new function qemuDomainValidateActualNetDef() and call the latter from the former. Signed-off-by: Laine Stump <laine@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
57de1988c4
commit
3cff23f7f1
@ -8352,50 +8352,8 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
|
|||||||
if (!bootindex)
|
if (!bootindex)
|
||||||
bootindex = net->info.bootIndex;
|
bootindex = net->info.bootIndex;
|
||||||
|
|
||||||
/* Currently nothing besides TAP devices supports multiqueue. */
|
if (qemuDomainValidateActualNetDef(net, qemuCaps) < 0)
|
||||||
if (net->driver.virtio.queues > 0 &&
|
|
||||||
!(actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
|
|
||||||
actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
|
|
||||||
actualType == VIR_DOMAIN_NET_TYPE_DIRECT ||
|
|
||||||
actualType == VIR_DOMAIN_NET_TYPE_ETHERNET ||
|
|
||||||
actualType == VIR_DOMAIN_NET_TYPE_VHOSTUSER)) {
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
||||||
_("Multiqueue network is not supported for: %s"),
|
|
||||||
virDomainNetTypeToString(actualType));
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
/* and only TAP devices support nwfilter rules */
|
|
||||||
if (net->filter) {
|
|
||||||
virNetDevVPortProfilePtr vport = virDomainNetGetActualVirtPortProfile(net);
|
|
||||||
if (!(actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
|
|
||||||
actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
|
|
||||||
actualType == VIR_DOMAIN_NET_TYPE_ETHERNET)) {
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
||||||
_("filterref is not supported for "
|
|
||||||
"network interfaces of type %s"),
|
|
||||||
virDomainNetTypeToString(actualType));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (vport && vport->virtPortType != VIR_NETDEV_VPORT_PROFILE_NONE) {
|
|
||||||
/* currently none of the defined virtualport types support iptables */
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
||||||
_("filterref is not supported for "
|
|
||||||
"network interfaces with virtualport type %s"),
|
|
||||||
virNetDevVPortTypeToString(vport->virtPortType));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (net->backend.tap &&
|
|
||||||
!(actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
|
|
||||||
actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
|
|
||||||
actualType == VIR_DOMAIN_NET_TYPE_ETHERNET)) {
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
|
||||||
_("Custom tap device path is not supported for: %s"),
|
|
||||||
virDomainNetTypeToString(actualType));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (actualType) {
|
switch (actualType) {
|
||||||
case VIR_DOMAIN_NET_TYPE_NETWORK:
|
case VIR_DOMAIN_NET_TYPE_NETWORK:
|
||||||
@ -8458,14 +8416,6 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
|
|||||||
case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
|
case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
|
||||||
requireNicdev = true;
|
requireNicdev = true;
|
||||||
|
|
||||||
if (net->driver.virtio.queues > 1 &&
|
|
||||||
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VHOSTUSER_MULTIQUEUE)) {
|
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
|
||||||
_("multi-queue is not supported for vhost-user "
|
|
||||||
"with this QEMU binary"));
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qemuInterfaceVhostuserConnect(driver, logManager, secManager,
|
if (qemuInterfaceVhostuserConnect(driver, logManager, secManager,
|
||||||
cmd, def, net, qemuCaps, &chardev) < 0)
|
cmd, def, net, qemuCaps, &chardev) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
@ -5300,6 +5300,86 @@ qemuDomainWatchdogDefValidate(const virDomainWatchdogDef *dev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
qemuDomainValidateActualNetDef(const virDomainNetDef *net,
|
||||||
|
virQEMUCapsPtr qemuCaps)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Validations that can only be properly checked at runtime (after
|
||||||
|
* an <interface type='network'> has been resolved to its actual
|
||||||
|
* type.
|
||||||
|
*
|
||||||
|
* (In its current form this function can still be called before
|
||||||
|
* the actual type has been resolved (e.g. at domain definition
|
||||||
|
* time), but only if the validations would SUCCEED for
|
||||||
|
* type='network'.)
|
||||||
|
*/
|
||||||
|
virDomainNetType actualType = virDomainNetGetActualType(net);
|
||||||
|
|
||||||
|
/* Only tap/macvtap devices support multiqueue. */
|
||||||
|
if (net->driver.virtio.queues > 0) {
|
||||||
|
|
||||||
|
if (!(actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
|
||||||
|
actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
|
||||||
|
actualType == VIR_DOMAIN_NET_TYPE_DIRECT ||
|
||||||
|
actualType == VIR_DOMAIN_NET_TYPE_ETHERNET ||
|
||||||
|
actualType == VIR_DOMAIN_NET_TYPE_VHOSTUSER)) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
_("multiqueue network is not supported for: %s"),
|
||||||
|
virDomainNetTypeToString(actualType));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (net->driver.virtio.queues > 1 &&
|
||||||
|
actualType == VIR_DOMAIN_NET_TYPE_VHOSTUSER &&
|
||||||
|
!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VHOSTUSER_MULTIQUEUE)) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("multiqueue network is not supported for vhost-user "
|
||||||
|
"with this QEMU binary"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Only standard tap devices support nwfilter rules, and even then only
|
||||||
|
* when *not* connected to an OVS bridge or midonet (indicated by having
|
||||||
|
* a <virtualport> element in the config)
|
||||||
|
*/
|
||||||
|
if (net->filter) {
|
||||||
|
virNetDevVPortProfilePtr vport = virDomainNetGetActualVirtPortProfile(net);
|
||||||
|
if (!(actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
|
||||||
|
actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
|
||||||
|
actualType == VIR_DOMAIN_NET_TYPE_ETHERNET)) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
_("filterref is not supported for "
|
||||||
|
"network interfaces of type %s"),
|
||||||
|
virDomainNetTypeToString(actualType));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (vport && vport->virtPortType != VIR_NETDEV_VPORT_PROFILE_NONE) {
|
||||||
|
/* currently none of the defined virtualport types support iptables */
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
_("filterref is not supported for "
|
||||||
|
"network interfaces with virtualport type %s"),
|
||||||
|
virNetDevVPortTypeToString(vport->virtPortType));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (net->backend.tap &&
|
||||||
|
!(actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
|
||||||
|
actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
|
||||||
|
actualType == VIR_DOMAIN_NET_TYPE_ETHERNET)) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
_("Custom tap device path is not supported for: %s"),
|
||||||
|
virDomainNetTypeToString(actualType));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
qemuDomainDeviceDefValidateNetwork(const virDomainNetDef *net)
|
qemuDomainDeviceDefValidateNetwork(const virDomainNetDef *net)
|
||||||
{
|
{
|
||||||
|
@ -1215,3 +1215,7 @@ qemuDomainNVRAMPathGenerate(virQEMUDriverConfigPtr cfg,
|
|||||||
|
|
||||||
virDomainEventSuspendedDetailType
|
virDomainEventSuspendedDetailType
|
||||||
qemuDomainPausedReasonToSuspendedEvent(virDomainPausedReason reason);
|
qemuDomainPausedReasonToSuspendedEvent(virDomainPausedReason reason);
|
||||||
|
|
||||||
|
int
|
||||||
|
qemuDomainValidateActualNetDef(const virDomainNetDef *net,
|
||||||
|
virQEMUCapsPtr qemuCaps);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user