[libvirt] [v2 09/13] Modify USB port to be defined as a port path

Daniel P. Berrange berrange at redhat.com
Thu Sep 1 11:01:22 UTC 2011


On Fri, Aug 26, 2011 at 01:44:25AM +0300, Marc-André Lureau wrote:
> So that devices can be attached to hubs. Example, to attach to first port
> of a usb-hub on port 1.
> 
>       <hub type='usb'>
>          <address type='usb' bus='0' port='1'/>
>       </hub>
> 
>       <input type='mouse' type='usb'>
>          <address type='usb' bus='0' port='1.1'/>
>       </hub>
> ---
>  docs/schemas/domain.rng                            |   11 +++++--
>  src/conf/domain_conf.c                             |   24 ++++++++++-----
>  src/conf/domain_conf.h                             |    2 +-
>  src/qemu/qemu_command.c                            |    2 +-
>  tests/qemuxml2argvdata/qemuxml2argv-usb-ports.args |    1 +
>  tests/qemuxml2argvdata/qemuxml2argv-usb-ports.xml  |   31 ++++++++++++++++++++
>  tests/qemuxml2argvtest.c                           |    3 ++
>  7 files changed, 61 insertions(+), 13 deletions(-)
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-ports.args
>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-usb-ports.xml
> 
> diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
> index 16e9687..b496a32 100644
> --- a/docs/schemas/domain.rng
> +++ b/docs/schemas/domain.rng
> @@ -2040,7 +2040,7 @@
>          <ref name="usbAddr"/>
>        </attribute>
>        <attribute name="device">
> -        <ref name="usbAddr"/>
> +        <ref name="usbPort"/>
>        </attribute>
>      </element>
>    </define>
> @@ -2049,7 +2049,7 @@
>        <ref name="usbAddr"/>
>      </attribute>
>      <attribute name="port">
> -      <ref name="usbAddr"/>
> +      <ref name="usbPort"/>
>      </attribute>
>    </define>
>    <define name="pciaddress">
> @@ -2397,7 +2397,7 @@
>    <define name="usbmaster">
>      <element name="master">
>        <attribute name="startport">
> -        <ref name="usbAddr"/>
> +        <ref name="usbPort"/>
>        </attribute>
>        <empty/>
>      </element>
> @@ -2548,6 +2548,11 @@
>        <param name="pattern">(0x)?[0-9a-fA-F]{1,3}</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>
> +    </data>
> +  </define>
>    <define name="pciDomain">
>      <data type="string">
>        <param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index bd05c2a..80fe2a0 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -1443,12 +1443,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;
>  }
> @@ -1615,7 +1616,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;
> @@ -1831,7 +1832,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));
> @@ -1840,12 +1842,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 <address> '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 f880264..4b48efc 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 9b09daa..aea5bcc 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -1336,7 +1336,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 0000000..556eb4c
> --- /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=usb.0,port=1 -device usb-hub,id=hub1,bus=usb.0,port=1.2 -device usb-mouse,id=input0,bus=usb.0,port=1.1 -device usb-mouse,id=input1,bus=usb.0,port=1.2.1 -device usb-mouse,id=input2,bus=usb.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 0000000..e31e5bc
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-usb-ports.xml
> @@ -0,0 +1,31 @@
> +<domain type='qemu'>
> +  <name>QEMUGuest1</name>
> +  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
> +  <memory>219136</memory>
> +  <currentMemory>219200</currentMemory>
> +  <vcpu>1</vcpu>
> +  <os>
> +    <type arch='i686' machine='pc'>hvm</type>
> +    <boot dev='hd'/>
> +  </os>
> +  <devices>
> +    <emulator>/usr/bin/qemu</emulator>
> +    <controller type='usb' index='0'/>
> +    <memballoon model='virtio'/>
> +    <hub type='usb'>
> +      <address type='usb' bus='0' port='1'/>
> +    </hub>
> +    <input type='mouse' bus='usb'>
> +      <address type='usb' bus='0' port='1.1'/>
> +    </input>
> +    <hub type='usb'>
> +      <address type='usb' bus='0' port='1.2'/>
> +    </hub>
> +    <input type='mouse' bus='usb'>
> +      <address type='usb' bus='0' port='1.2.1'/>
> +    </input>
> +    <input type='mouse' bus='usb'>
> +      <address type='usb' bus='0' port='1.2.2'/>
> +    </input>
> +  </devices>
> +</domain>
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index a053693..4c6c486 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -501,6 +501,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);
>  


ACK

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list