From: Marc-André Lureau Date: Fri, 2 Sep 2011 14:31:26 +0000 (+0800) Subject: Modify USB port to be defined as a port path X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=31710a5389424db6429a45a33458023e8aaa17f3;p=libvirt.git Modify USB port to be defined as a port path So that devices can be attached to hubs. Example, to attach to first port of a usb-hub on port 1.
also add a test entry --- diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng index 9d02357d1f..6ddbfe3c4f 100644 --- a/docs/schemas/domain.rng +++ b/docs/schemas/domain.rng @@ -2041,7 +2041,7 @@ - + @@ -2050,7 +2050,7 @@ - + @@ -2398,7 +2398,7 @@ - + @@ -2549,6 +2549,11 @@ (0x)?[0-9a-fA-F]{1,3} + + + ((0x)?[0-9a-fA-F]{1,3}\.){0,3}(0x)?[0-9a-fA-F]{1,3} + + (0x)?[0-9a-fA-F]{1,4} diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index e631324a44..0032c128eb 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1444,12 +1444,9 @@ int virDomainDeviceDriveAddressIsValid(virDomainDeviceDriveAddressPtr addr ATTRI return 1; /* 0 is valid for all fields, so any successfully parsed addr is valid */ } -int virDomainDeviceUSBAddressIsValid(virDomainDeviceUSBAddressPtr addr) +int virDomainDeviceUSBAddressIsValid(virDomainDeviceUSBAddressPtr addr ATTRIBUTE_UNUSED) { - if (addr->port >= 128) /* FIXME: is this correct */ - return 0; - - return 1; + return 1; /* FIXME.. any successfully parsed addr is valid */ } int virDomainDeviceVirtioSerialAddressIsValid( @@ -1472,6 +1469,10 @@ virDomainDeviceInfoIsSet(virDomainDeviceInfoPtr info, unsigned int flags) void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info) { + VIR_FREE(info->alias); + if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB) { + VIR_FREE(info->addr.usb.port); + } VIR_FREE(info->alias); memset(&info->addr, 0, sizeof(info->addr)); info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE; @@ -1621,7 +1622,7 @@ virDomainDeviceInfoFormat(virBufferPtr buf, break; case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB: - virBufferAsprintf(buf, " bus='%d' port='%d'", + virBufferAsprintf(buf, " bus='%d' port='%s'", info->addr.usb.bus, info->addr.usb.port); break; @@ -1837,7 +1838,8 @@ static int virDomainDeviceUSBAddressParseXML(xmlNodePtr node, virDomainDeviceUSBAddressPtr addr) { - char *port, *bus; + char *port, *bus, *tmp; + unsigned int p; int ret = -1; memset(addr, 0, sizeof(*addr)); @@ -1846,12 +1848,18 @@ virDomainDeviceUSBAddressParseXML(xmlNodePtr node, bus = virXMLPropString(node, "bus"); if (port && - virStrToLong_ui(port, NULL, 10, &addr->port) < 0) { + ((virStrToLong_ui(port, &tmp, 10, &p) < 0 || (*tmp != '\0' && *tmp != '.')) || + (*tmp == '.' && (virStrToLong_ui(tmp + 1, &tmp, 10, &p) < 0 || (*tmp != '\0' && *tmp != '.'))) || + (*tmp == '.' && (virStrToLong_ui(tmp + 1, &tmp, 10, &p) < 0 || (*tmp != '\0' && *tmp != '.'))) || + (*tmp == '.' && (virStrToLong_ui(tmp + 1, &tmp, 10, &p) < 0 || (*tmp != '\0'))))) { virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Cannot parse
'port' attribute")); goto cleanup; } + addr->port = port; + port = NULL; + if (bus && virStrToLong_ui(bus, NULL, 10, &addr->bus) < 0) { virDomainReportError(VIR_ERR_INTERNAL_ERROR, "%s", diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 68f8f05202..c19c81c4e0 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -110,7 +110,7 @@ typedef struct _virDomainDeviceUSBAddress virDomainDeviceUSBAddress; typedef virDomainDeviceUSBAddress *virDomainDeviceUSBAddressPtr; struct _virDomainDeviceUSBAddress { unsigned int bus; - unsigned int port; + char *port; }; enum virDomainControllerMaster { diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index d6cd180898..cf41a180bc 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1334,7 +1334,7 @@ qemuBuildDeviceAddressStr(virBufferPtr buf, virBufferAsprintf(buf, ",addr=0x%x", info->addr.pci.slot); } else if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB) { virBufferAsprintf(buf, ",bus=usb%d.0", info->addr.usb.bus); - virBufferAsprintf(buf, ",port=%d", info->addr.usb.port); + virBufferAsprintf(buf, ",port=%s", info->addr.usb.port); } return 0; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-ports.args b/tests/qemuxml2argvdata/qemuxml2argv-usb-ports.args new file mode 100644 index 0000000000..8ba5b7cf00 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-ports.args @@ -0,0 +1 @@ +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 -usb -device usb-hub,id=hub0,bus=usb0.0,port=1 -device usb-hub,id=hub1,bus=usb0.0,port=1.2 -device usb-mouse,id=input0,bus=usb0.0,port=1.1 -device usb-mouse,id=input1,bus=usb0.0,port=1.2.1 -device usb-mouse,id=input2,bus=usb0.0,port=1.2.2 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-usb-ports.xml b/tests/qemuxml2argvdata/qemuxml2argv-usb-ports.xml new file mode 100644 index 0000000000..e31e5bc85c --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-ports.xml @@ -0,0 +1,31 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219200 + 1 + + hvm + + + + /usr/bin/qemu + + + +
+ + +
+ + +
+ + +
+ + +
+ + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 1fc49a5caa..99d8711afa 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -504,6 +504,9 @@ mymain(void) DO_TEST("usb-hub", false, QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_USB_HUB, QEMU_CAPS_NODEFCONFIG); + DO_TEST("usb-ports", false, + QEMU_CAPS_CHARDEV, QEMU_CAPS_DEVICE, QEMU_CAPS_USB_HUB, + QEMU_CAPS_NODEFCONFIG); DO_TEST("smbios", false, QEMU_CAPS_SMBIOS_TYPE);