[PATCH v2 0/2] qemu: Improve support for usb-net devices

Though usb-net is not explicitly supported, it is already possible to use usb-net devices directly with libvirt (Simply by setting model type as 'usb-net' and manually providing a USB address) This patch series intends to fill in some remaining gaps. 1. Automatic USB address assignment 2. New testcase [Changes in v2] 1. Drop qemu_capabilities patch 2. Fix documentation to reflect correct version. 3. Remove unnecessary comment. 4. Fix commit subject. Resolves: https://gitlab.com/libvirt/libvirt/-/issues/14 Rayhan Faizel (2): conf: Automatically assign address to usb-net device tests: Add testcase for usb-net docs/formatdomain.rst | 1 + src/conf/domain_conf.c | 9 ++++- src/qemu/qemu_domain_address.c | 4 +++ .../net-usb.x86_64-latest.args | 35 +++++++++++++++++++ .../qemuxmlconfdata/net-usb.x86_64-latest.xml | 35 +++++++++++++++++++ tests/qemuxmlconfdata/net-usb.xml | 20 +++++++++++ tests/qemuxmlconftest.c | 1 + 7 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxmlconfdata/net-usb.x86_64-latest.args create mode 100644 tests/qemuxmlconfdata/net-usb.x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/net-usb.xml -- 2.34.1

This patch will allow usb-net devices to be automatically assigned a USB address (and skip any attempt to assign a PCI one). Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com> --- docs/formatdomain.rst | 1 + src/conf/domain_conf.c | 9 ++++++++- src/qemu/qemu_domain_address.c | 4 ++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 2adc2ff968..5fe2f3468c 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -5600,6 +5600,7 @@ ne2k_pci pcnet rtl8139 e1000 virtio. :since:`Since 5.2.0`, ``virtio-transitional`` and ``virtio-non-transitional`` values are supported. See `Virtio transitional devices`_ for more details. :since:`Since 9.3.0` igb is also supported. +:since:`Since 10.3.0` usb-net is supported. Setting NIC driver-specific options ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 770b5fbbff..c45484c359 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -28677,7 +28677,14 @@ virDomainUSBDeviceDefForeach(virDomainDef *def, } } - /* TODO: add def->nets here when libvirt starts supporting usb-net */ + /* usb-net */ + for (i = 0; i < def->nnets; i++) { + virDomainNetDef *net = def->nets[i]; + if (net->model == VIR_DOMAIN_NET_MODEL_USB_NET) { + if (iter(&net->info, opaque) < 0) + return -1; + } + } /* usb-ccid */ for (i = 0; i < def->ncontrollers; i++) { diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index cc3bc76971..7690021ca7 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -2087,6 +2087,10 @@ qemuDomainAssignDevicePCISlots(virDomainDef *def, for (i = 0; i < def->nnets; i++) { virDomainNetDef *net = def->nets[i]; + if (net->model == VIR_DOMAIN_NET_MODEL_USB_NET) { + continue; + } + /* type='hostdev' network devices might be USB, and are also * in hostdevs list anyway, so handle them with other hostdevs * instead of here. -- 2.34.1

Add small test case to demonstrate use of usb-net with user networking backend. Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com> --- .../net-usb.x86_64-latest.args | 35 +++++++++++++++++++ .../qemuxmlconfdata/net-usb.x86_64-latest.xml | 35 +++++++++++++++++++ tests/qemuxmlconfdata/net-usb.xml | 20 +++++++++++ tests/qemuxmlconftest.c | 1 + 4 files changed, 91 insertions(+) create mode 100644 tests/qemuxmlconfdata/net-usb.x86_64-latest.args create mode 100644 tests/qemuxmlconfdata/net-usb.x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/net-usb.xml diff --git a/tests/qemuxmlconfdata/net-usb.x86_64-latest.args b/tests/qemuxmlconfdata/net-usb.x86_64-latest.args new file mode 100644 index 0000000000..714ab9aafe --- /dev/null +++ b/tests/qemuxmlconfdata/net-usb.x86_64-latest.args @@ -0,0 +1,35 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-x86_64 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ +-accel tcg \ +-cpu qemu64 \ +-m size=4194304k \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":4294967296}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 2d4d4b20-b19b-4713-af0a-bf1cab8b455b \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device '{"driver":"qemu-xhci","p2":1,"p3":1,"id":"usb","bus":"pci.0","addr":"0x2"}' \ +-netdev '{"type":"user","id":"hostnet0"}' \ +-device '{"driver":"usb-net","netdev":"hostnet0","id":"net0","mac":"00:11:22:33:44:55","bus":"usb.0","port":"1"}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x3"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxmlconfdata/net-usb.x86_64-latest.xml b/tests/qemuxmlconfdata/net-usb.x86_64-latest.xml new file mode 100644 index 0000000000..071fc9cfc4 --- /dev/null +++ b/tests/qemuxmlconfdata/net-usb.x86_64-latest.xml @@ -0,0 +1,35 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>2d4d4b20-b19b-4713-af0a-bf1cab8b455b</uuid> + <memory unit='KiB'>4194304</memory> + <currentMemory unit='KiB'>4194304</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <controller type='usb' index='0' model='qemu-xhci' ports='1'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <interface type='user'> + <mac address='00:11:22:33:44:55'/> + <model type='usb-net'/> + </interface> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <audio id='1' type='none'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxmlconfdata/net-usb.xml b/tests/qemuxmlconfdata/net-usb.xml new file mode 100644 index 0000000000..8a678e5731 --- /dev/null +++ b/tests/qemuxmlconfdata/net-usb.xml @@ -0,0 +1,20 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>2d4d4b20-b19b-4713-af0a-bf1cab8b455b</uuid> + <memory unit='KiB'>4194304</memory> + <currentMemory unit='KiB'>4194304</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <controller type='usb' index='0' model='qemu-xhci' ports='1'/> + <interface type="user"> + <mac address="00:11:22:33:44:55"/> + <model type="usb-net"/> + </interface> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c index 9e2c7da15a..d40b826279 100644 --- a/tests/qemuxmlconftest.c +++ b/tests/qemuxmlconftest.c @@ -2976,6 +2976,7 @@ mymain(void) DO_TEST_CAPS_LATEST("tap-vhost"); DO_TEST_CAPS_LATEST("mtp-usb-device") + DO_TEST_CAPS_LATEST("net-usb") /* check that all input files were actually used here */ if (testConfXMLCheck(existingTestCases) < 0) -- 2.34.1
participants (1)
-
Rayhan Faizel