mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-26 07:36:19 +00:00
qemu: build USB redirection filter qemu command line
Input XML snip: <redirdev bus='usb' type='spicevmc'> <address type='usb' bus='0' port='4'/> </redirdev> <redirfilter> <usbdev class='0x08' vendor='0x1234' product='0xbeef' \ version='2.00' allow='yes'/> <usbdev class='-1' vendor='-1' product='-1' version='-1' allow='no'/> </redirfilter> will be converted to: -device usb-redir,chardev=charredir0,id=redir0,\ filter=0x08:0x1234:0xBEEF:0x2000:1|-1👎-1👎0,bus=usb.0,port=4
This commit is contained in:
parent
5b35cc532b
commit
2d46f88d53
@ -3438,10 +3438,13 @@ qemuBuildPCIHostdevPCIDevStr(virDomainHostdevDefPtr dev)
|
|||||||
|
|
||||||
|
|
||||||
char *
|
char *
|
||||||
qemuBuildRedirdevDevStr(virDomainRedirdevDefPtr dev,
|
qemuBuildRedirdevDevStr(virDomainDefPtr def,
|
||||||
|
virDomainRedirdevDefPtr dev,
|
||||||
virBitmapPtr qemuCaps)
|
virBitmapPtr qemuCaps)
|
||||||
{
|
{
|
||||||
|
size_t i;
|
||||||
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
virBuffer buf = VIR_BUFFER_INITIALIZER;
|
||||||
|
virDomainRedirFilterDefPtr redirfilter = def->redirfilter;
|
||||||
|
|
||||||
if (dev->bus != VIR_DOMAIN_REDIRDEV_BUS_USB) {
|
if (dev->bus != VIR_DOMAIN_REDIRDEV_BUS_USB) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
@ -3461,6 +3464,44 @@ qemuBuildRedirdevDevStr(virDomainRedirdevDefPtr dev,
|
|||||||
dev->info.alias,
|
dev->info.alias,
|
||||||
dev->info.alias);
|
dev->info.alias);
|
||||||
|
|
||||||
|
if (redirfilter && redirfilter->nusbdevs) {
|
||||||
|
if (!qemuCapsGet(qemuCaps, QEMU_CAPS_USB_REDIR_FILTER)) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("USB redirection filter is not "
|
||||||
|
"supported by this version of QEMU"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
virBufferAsprintf(&buf, ",filter=");
|
||||||
|
|
||||||
|
for (i = 0; i < redirfilter->nusbdevs; i++) {
|
||||||
|
virDomainRedirFilterUsbDevDefPtr usbdev = redirfilter->usbdevs[i];
|
||||||
|
if (usbdev->usbClass >= 0)
|
||||||
|
virBufferAsprintf(&buf, "0x%02X:", usbdev->usbClass);
|
||||||
|
else
|
||||||
|
virBufferAsprintf(&buf, "-1:");
|
||||||
|
|
||||||
|
if (usbdev->vendor >= 0)
|
||||||
|
virBufferAsprintf(&buf, "0x%04X:", usbdev->vendor);
|
||||||
|
else
|
||||||
|
virBufferAsprintf(&buf, "-1:");
|
||||||
|
|
||||||
|
if (usbdev->product >= 0)
|
||||||
|
virBufferAsprintf(&buf, "0x%04X:", usbdev->product);
|
||||||
|
else
|
||||||
|
virBufferAsprintf(&buf, "-1:");
|
||||||
|
|
||||||
|
if (usbdev->version >= 0)
|
||||||
|
virBufferAsprintf(&buf, "0x%04X:", usbdev->version);
|
||||||
|
else
|
||||||
|
virBufferAsprintf(&buf, "-1:");
|
||||||
|
|
||||||
|
virBufferAsprintf(&buf, "%u", usbdev->allow);
|
||||||
|
if (i < redirfilter->nusbdevs -1)
|
||||||
|
virBufferAsprintf(&buf, "|");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
|
if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
@ -6275,7 +6316,7 @@ qemuBuildCommandLine(virConnectPtr conn,
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
virCommandAddArg(cmd, "-device");
|
virCommandAddArg(cmd, "-device");
|
||||||
if (!(devstr = qemuBuildRedirdevDevStr(redirdev, qemuCaps)))
|
if (!(devstr = qemuBuildRedirdevDevStr(def, redirdev, qemuCaps)))
|
||||||
goto error;
|
goto error;
|
||||||
virCommandAddArg(cmd, devstr);
|
virCommandAddArg(cmd, devstr);
|
||||||
VIR_FREE(devstr);
|
VIR_FREE(devstr);
|
||||||
|
@ -139,8 +139,9 @@ char * qemuBuildUSBHostdevDevStr(virDomainHostdevDefPtr dev,
|
|||||||
virBitmapPtr qemuCaps);
|
virBitmapPtr qemuCaps);
|
||||||
|
|
||||||
char * qemuBuildHubDevStr(virDomainHubDefPtr dev, virBitmapPtr qemuCaps);
|
char * qemuBuildHubDevStr(virDomainHubDefPtr dev, virBitmapPtr qemuCaps);
|
||||||
char * qemuBuildRedirdevDevStr(virDomainRedirdevDefPtr dev, virBitmapPtr qemuCaps);
|
char * qemuBuildRedirdevDevStr(virDomainDefPtr def,
|
||||||
|
virDomainRedirdevDefPtr dev,
|
||||||
|
virBitmapPtr qemuCaps);
|
||||||
|
|
||||||
int qemuNetworkIfaceConnect(virDomainDefPtr def,
|
int qemuNetworkIfaceConnect(virDomainDefPtr def,
|
||||||
virConnectPtr conn,
|
virConnectPtr conn,
|
||||||
|
@ -1022,12 +1022,13 @@ int qemuDomainAttachRedirdevDevice(struct qemud_driver *driver,
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
|
virDomainDefPtr def = vm->def;
|
||||||
char *devstr = NULL;
|
char *devstr = NULL;
|
||||||
|
|
||||||
if (qemuCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
|
if (qemuCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
|
||||||
if (qemuAssignDeviceRedirdevAlias(vm->def, redirdev, -1) < 0)
|
if (qemuAssignDeviceRedirdevAlias(vm->def, redirdev, -1) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
if (!(devstr = qemuBuildRedirdevDevStr(redirdev, priv->qemuCaps)))
|
if (!(devstr = qemuBuildRedirdevDevStr(def, redirdev, priv->qemuCaps)))
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user