---
docs/schemas/domaincommon.rng | 66 ++++++++++++++++++++
.../qemuxml2argv-usb-redir-filter.args | 10 +++
.../qemuxml2argv-usb-redir-filter.xml | 45 +++++++++++++
tests/qemuxml2argvtest.c | 6 ++
4 files changed, 127 insertions(+), 0 deletions(-)
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-redir-filter.args
create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-redir-filter.xml
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 35e9f82..a53c853 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2265,6 +2265,49 @@
</choice>
</define>
+ <define name="usbdevfilter">
+ <element name="usbdev">
+ <attribute name="allow">
+ <choice>
+ <value>yes</value>
+ <value>no</value>
+ </choice>
+ </attribute>
+ <optional>
+ <attribute name="class">
+ <choice>
+ <ref name="usbClass"/>
+ <ref name="usbIdDefault"/>
+ </choice>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="vendor">
+ <choice>
+ <ref name="usbId"/>
+ <ref name="usbIdDefault"/>
+ </choice>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="product">
+ <choice>
+ <ref name="usbId"/>
+ <ref name="usbIdDefault"/>
+ </choice>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="version">
+ <choice>
+ <ref name="usbVersion"/>
+ <ref name="usbIdDefault"/>
+ </choice>
+ </attribute>
+ </optional>
+ </element>
+ </define>
+
<define name="qemucdevSrcType">
<attribute name="type">
<ref name="qemucdevSrcTypeChoice"/>
@@ -2561,6 +2604,13 @@
</optional>
</element>
</define>
+ <define name="redirfilter">
+ <element name="redirfilter">
+ <zeroOrMore>
+ <ref name="usbdevfilter"/>
+ </zeroOrMore>
+ </element>
+ </define>
<define name="hostdev">
<element name="hostdev">
<optional>
@@ -2724,6 +2774,7 @@
<ref name="smartcard"/>
<ref name="hub"/>
<ref name="redirdev"/>
+ <ref name="redirfilter"/>
</choice>
</zeroOrMore>
<optional>
@@ -3337,16 +3388,31 @@
<param
name="pattern">(([0-2]?[0-9]?[0-9]\.){3}[0-2]?[0-9]?[0-9])|(([0-9a-fA-F]+|:)+[0-9a-fA-F]+)|([a-zA-Z0-9_\.\+\-]*)</param>
</data>
</define>
+ <define name="usbIdDefault">
+ <data type="string">
+ <param name="pattern">-1</param>
+ </data>
+ </define>
<define name="usbId">
<data type="string">
<param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
</data>
</define>
+ <define name="usbVersion">
+ <data type="string">
+ <param name="pattern">[0-9]{1,2}.[0-9]{1,2}</param>
+ </data>
+ </define>
<define name="usbAddr">
<data type="string">
<param name="pattern">(0x)?[0-9a-fA-F]{1,3}</param>
</data>
</define>
+ <define name="usbClass">
+ <data type="string">
+ <param name="pattern">(0x)?[0-9a-fA-F]{1,2}</param>
+ </data>
+ </define>
<define name="usbPort">
<data type="string">
<param
name="pattern">((0x)?[0-9a-fA-F]{1,3}\.){0,3}(0x)?[0-9a-fA-F]{1,3}</param>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-redir-filter.args
b/tests/qemuxml2argvdata/qemuxml2argv-usb-redir-filter.args
new file mode 100644
index 0000000..215844a
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-redir-filter.args
@@ -0,0 +1,10 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214
-smp 1 -nographic -nodefconfig -nodefaults -chardev
socket,id=charmonitor,path=/tmp/test-monitor,server,nowait -mon
chardev=charmonitor,id=monitor,mode=readline -no-acpi -boot c \
+-device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x4.0x7 \
+-device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x4 \
+-device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x4.0x1 \
+-device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x4.0x2 \
+-chardev spicevmc,id=charredir0,name=usbredir \
+-device
usb-redir,chardev=charredir0,id=redir0,filter=0x08:0x15E1:0x2007:0x0110:1|-1:-1:-1:-1:0,bus=usb.0,port=4
\
+-chardev spicevmc,id=charredir1,name=usbredir \
+-device
usb-redir,chardev=charredir1,id=redir1,filter=0x08:0x15E1:0x2007:0x0110:1|-1:-1:-1:-1:0,bus=usb.0,port=5
\
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-redir-filter.xml
b/tests/qemuxml2argvdata/qemuxml2argv-usb-redir-filter.xml
new file mode 100644
index 0000000..6ff4da2
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-redir-filter.xml
@@ -0,0 +1,45 @@
+<domain type='qemu'>
+ <name>QEMUGuest1</name>
+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+ <memory unit='KiB'>219136</memory>
+ <currentMemory unit='KiB'>219136</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='i686' machine='pc'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu</emulator>
+ <controller type='usb' index='0' model='ich9-ehci1'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x04' function='0x7'/>
+ </controller>
+ <controller type='usb' index='0' model='ich9-uhci1'>
+ <master startport='0'/>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x04' function='0x0' multifunction='on'/>
+ </controller>
+ <controller type='usb' index='0' model='ich9-uhci2'>
+ <master startport='2'/>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x04' function='0x1'/>
+ </controller>
+ <controller type='usb' index='0' model='ich9-uhci3'>
+ <master startport='4'/>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x04' function='0x2'/>
+ </controller>
+ <redirdev bus='usb' type='spicevmc'>
+ <address type='usb' bus='0' port='4'/>
+ </redirdev>
+ <redirdev bus='usb' type='spicevmc'>
+ <alias name='redir1'/>
+ <address type='usb' bus='0' port='5'/>
+ </redirdev>
+ <redirfilter>
+ <usbdev class='0x08' vendor='0x15E1' product='0x2007'
version='1.10' allow='yes'/>
+ <usbdev class='-1' vendor='-1' product='-1'
version='-1' allow='no'/>
+ </redirfilter>
+ <memballoon model='virtio'/>
+ </devices>
+</domain>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index f8d8db5..30b0be1 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -672,6 +672,12 @@ mymain(void)
QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_USB_HUB,
QEMU_CAPS_ICH9_USB_EHCI1, QEMU_CAPS_USB_REDIR,
QEMU_CAPS_SPICE, QEMU_CAPS_CHARDEV_SPICEVMC);
+ DO_TEST("usb-redir-filter",
+ QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
+ QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_USB_HUB,
+ QEMU_CAPS_ICH9_USB_EHCI1, QEMU_CAPS_USB_REDIR,
+ QEMU_CAPS_SPICE, QEMU_CAPS_CHARDEV_SPICEVMC,
+ QEMU_CAPS_USB_REDIR_FILTER);
DO_TEST("usb1-usb2",
QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
QEMU_CAPS_PCI_MULTIFUNCTION, QEMU_CAPS_PIIX3_USB_UHCI,
--
1.7.7.6