[libvirt] [PATCH V2 5/7] xenconfig: add conversion of usb controller config to and from xml

Cedric Bosdonnat cbosdonnat at suse.com
Tue Aug 2 12:09:42 UTC 2016


On Wed, 2016-06-15 at 14:00 +0800, Chunyan Liu wrote:

Missing a commit description, even a short one to say we're adding
USB controller conversion to and from libxl's config files.

> Signed-off-by: Chunyan Liu <cyliu at suse.com>
> ---
> Changes:
>   drop pvusb1 and pvusb2 models
> 
>  src/xenconfig/xen_xl.c | 190 +++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 190 insertions(+)
> 
> diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c
> index 5879c66..90213ec 100644
> --- a/src/xenconfig/xen_xl.c
> +++ b/src/xenconfig/xen_xl.c
> @@ -503,6 +503,110 @@ xenParseXLInputDevs(virConfPtr conf, virDomainDefPtr def)
>  }
>  
>  static int
> +xenParseXLUSBController(virConfPtr conf, virDomainDefPtr def)
> +{
> +    virConfValuePtr list = virConfGetValue(conf, "usbctrl");
> +    virDomainControllerDefPtr controller = NULL;
> +
> +    if (list && list->type == VIR_CONF_LIST) {
> +        list = list->list;
> +        while (list) {
> +            char type[8];
> +            char version[4];
> +            char ports[4];
> +            char *key;
> +            int usbctrl_version = 2; /* by default USB 2.0 */
> +            int usbctrl_ports = 8; /* by default 8 ports */
> +            int usbctrl_type = -1;
> +
> +            type[0] = version[0] = ports[0] = '\0';
> +
> +            if ((list->type != VIR_CONF_STRING) || (list->str == NULL))
> +                goto skipusbctrl;
> +            /* usbctrl=['type=pv,version=2,ports=8'] */
> +            key = list->str;
> +            while (key) {
> +                char *data;
> +                char *nextkey = strchr(key, ',');
> +
> +                if (!(data = strchr(key, '=')))
> +                    goto skipusbctrl;
> +                data++;
> +
> +                if (STRPREFIX(key, "type=")) {
> +                    int len = nextkey ? (nextkey - data) : sizeof(type) - 1;
> +                    if (virStrncpy(type, data, len, sizeof(type)) == NULL) {
> +                        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                                       _("type %s invalid"),
> +                                       data);
> +                        goto skipusbctrl;
> +                    }
> +                } else if (STRPREFIX(key, "version=")) {
> +                    int len = nextkey ? (nextkey - data) : sizeof(version) - 1;
> +                    if (virStrncpy(version, data, len, sizeof(version)) == NULL) {
> +                        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                                       _("version %s invalid"),
> +                                       data);
> +                        goto skipusbctrl;
> +                    }
> +                    if (virStrToLong_i(version, NULL, 16, &usbctrl_version) < 0)
> +                        goto skipusbctrl;
> +                } else if (STRPREFIX(key, "ports=")) {
> +                    int len = nextkey ? (nextkey - data) : sizeof(ports) - 1;
> +                    if (virStrncpy(ports, data, len, sizeof(ports)) == NULL) {
> +                        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                                       _("version %s invalid"),
> +                                       data);
> +                        goto skipusbctrl;
> +                    }
> +                    if (virStrToLong_i(ports, NULL, 16, &usbctrl_ports) < 0)
> +                        goto skipusbctrl;
> +                }
> +
> +                while (nextkey && (nextkey[0] == ',' ||
> +                                   nextkey[0] == ' ' ||
> +                                   nextkey[0] == '\t'))
> +                    nextkey++;
> +                key = nextkey;
> +            }
> +
> +            if (type[0] == '\0') {
> +                if (usbctrl_version == 1)
> +                    usbctrl_type = VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB1;
> +                else
> +                    usbctrl_type = VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB2;
> +            } else {
> +                if (STREQLEN(type, "qusb", 4)) {
> +                    if (usbctrl_version == 1)
> +                        usbctrl_type = VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB1;
> +                    else
> +                        usbctrl_type = VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB2;
> +                } else {
> +                    goto skipusbctrl;
> +                }
> +            }
> +
> +            if (!(controller = virDomainControllerDefNew(VIR_DOMAIN_CONTROLLER_TYPE_USB)))
> +                return -1;
> +
> +            controller->type = VIR_DOMAIN_CONTROLLER_TYPE_USB;
> +            controller->model = usbctrl_type;
> +            controller->opts.usbopts.ports = usbctrl_ports;
> +
> +            if (VIR_APPEND_ELEMENT(def->controllers, def->ncontrollers, controller) < 0) {
> +                virDomainControllerDefFree(controller);
> +                return -1;
> +            }
> +
> +        skipusbctrl:
> +            list = list->next;
> +        }
> +    }
> +
> +    return 0;
> +}
> +
> +static int
>  xenParseXLUSB(virConfPtr conf, virDomainDefPtr def)
>  {
>      virConfValuePtr list = virConfGetValue(conf, "usbdev");
> @@ -612,6 +716,9 @@ xenParseXL(virConfPtr conf,
>      if (xenParseXLUSB(conf, def) < 0)
>          goto cleanup;
>  
> +    if (xenParseXLUSBController(conf, def) < 0)
> +        goto cleanup;
> +
>      if (virDomainDefPostParse(def, caps, VIR_DOMAIN_DEF_PARSE_ABI_UPDATE,
>                                xmlopt) < 0)
>          goto cleanup;
> @@ -1090,6 +1197,86 @@ xenFormatXLInputDevs(virConfPtr conf, virDomainDefPtr def)
>  }
>  
>  static int
> +xenFormatXLUSBController(virConfPtr conf,
> +                         virDomainDefPtr def)
> +{
> +    virConfValuePtr usbctrlVal = NULL;
> +    int hasUSBCtrl = 0;
> +    size_t i;
> +
> +    for (i = 0; i < def->ncontrollers; i++) {
> +        if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) {
> +            hasUSBCtrl = 1;
> +            break;
> +        }
> +    }
> +
> +    if (!hasUSBCtrl)
> +        return 0;
> +
> +    if (VIR_ALLOC(usbctrlVal) < 0)
> +        return -1;
> +
> +    usbctrlVal->type = VIR_CONF_LIST;
> +    usbctrlVal->list = NULL;
> +
> +    for (i = 0; i < def->ncontrollers; i++) {
> +        if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) {
> +            virConfValuePtr val, tmp;
> +            virBuffer buf = VIR_BUFFER_INITIALIZER;
> +
> +            if (def->controllers[i]->model != -1) {
> +                switch (def->controllers[i]->model) {
> +                case VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB1:
> +                    virBufferAddLit(&buf, "type=qusb,version=1,");
> +                    break;
> +
> +                case VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB2:
> +                    virBufferAddLit(&buf, "type=qusb,version=2,");
> +                    break;
> +
> +                default:
> +                    goto error;
> +                }
> +            }
> +
> +            if (def->controllers[i]->opts.usbopts.ports != -1)
> +                virBufferAsprintf(&buf, "ports=%x",
> +                                  def->controllers[i]->opts.usbopts.ports);
> +
> +            if (VIR_ALLOC(val) < 0) {
> +                virBufferFreeAndReset(&buf);
> +                goto error;
> +            }
> +            val->type = VIR_CONF_STRING;
> +            val->str = virBufferContentAndReset(&buf);
> +            tmp = usbctrlVal->list;
> +            while (tmp && tmp->next)
> +                tmp = tmp->next;
> +            if (tmp)
> +                tmp->next = val;
> +            else
> +                usbctrlVal->list = val;
> +        }
> +    }
> +
> +    if (usbctrlVal->list != NULL) {
> +        int ret = virConfSetValue(conf, "usbctrl", usbctrlVal);
> +        usbctrlVal = NULL;
> +        if (ret < 0)
> +            return -1;
> +    }
> +    VIR_FREE(usbctrlVal);
> +
> +    return 0;
> +
> + error:
> +    virConfFreeValue(usbctrlVal);
> +    return -1;
> +}
> +
> +
> +static int
>  xenFormatXLUSB(virConfPtr conf,
>                 virDomainDefPtr def)
>  {
> @@ -1182,6 +1369,9 @@ xenFormatXL(virDomainDefPtr def, virConnectPtr conn)
>      if (xenFormatXLUSB(conf, def) < 0)
>          goto cleanup;
>  
> +    if (xenFormatXLUSBController(conf, def) < 0)
> +        goto cleanup;
> +
>      return conf;
>  
>   cleanup:

ACK and pushed with a commit message description

--
Cedric




More information about the libvir-list mailing list