From: Ján Tomko Date: Thu, 5 Feb 2015 12:40:11 +0000 (+0100) Subject: Error out when custom tap device path makes no sense X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=8e724e9f3eab08ff1bef96ce1b3319558a86176b;p=libvirt.git Error out when custom tap device path makes no sense It is only usable for NETWORK and BRIDGE type interfaces. Error out when trying to start a domain where the custom tap device path is specified for interfaces of other types, or when the daemon is not privileged. Note that this cannot be checked at definition time, because the comparison is against actual type. https://bugzilla.redhat.com/show_bug.cgi?id=1147195 --- diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 18e472220e..679194f4cc 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -4144,8 +4144,9 @@ qemu-kvm -net nic,model=? /dev/null For tuning the backend of the network, the backend element can be used. The vhost attribute can override the default vhost device path (/dev/vhost-net) for devices with virtio model. - Supported attributes are tap and vhost, - allowing to override the default devices for creating tap and vhost devices. + The tap attribute overrides the tun/tap device path (default: + /dev/net/tun) for network and bridge interfaces. This does not work + in session mode.

Overriding the target element
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 3b6eddcd5c..06a59d015f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -299,8 +299,14 @@ qemuNetworkIfaceConnect(virDomainDefPtr def, virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); const char *tunpath = "/dev/net/tun"; - if (net->backend.tap) + if (net->backend.tap) { tunpath = net->backend.tap; + if (!cfg->privileged) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("cannot use custom tap device in session mode")); + goto cleanup; + } + } if (!(brname = virDomainNetGetActualBridgeName(net))) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing bridge name")); @@ -7721,6 +7727,15 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, return -1; } + if (net->backend.tap && + !(actualType == VIR_DOMAIN_NET_TYPE_NETWORK || + actualType == VIR_DOMAIN_NET_TYPE_BRIDGE)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Custom tap device path is not supported for: %s"), + virDomainNetTypeToString(actualType)); + return -1; + } + if (actualType == VIR_DOMAIN_NET_TYPE_NETWORK || actualType == VIR_DOMAIN_NET_TYPE_BRIDGE) { tapfdSize = net->driver.virtio.queues;