mirror of https://gitee.com/openkylin/libvirt.git
xenconfig: add support for multiple USB devices syntax
In Xen>=4.3, libxl supports new syntax for USB devices: usbdevice=[ "DEVICE", "DEVICE", ... ] Add support for that in xenconfig driver. When only one device is defined, keep using old syntax for backward compatibility. Adjust tests for changed options order. Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
This commit is contained in:
parent
4ab8cd77ad
commit
cd5dc3031f
|
@ -972,33 +972,6 @@ xenParseEmulatedDevices(virConfPtr conf, virDomainDefPtr def)
|
||||||
if (str &&
|
if (str &&
|
||||||
xenParseSxprSound(def, str) < 0)
|
xenParseSxprSound(def, str) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (xenConfigGetString(conf, "usbdevice", &str, NULL) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (str &&
|
|
||||||
(STREQ(str, "tablet") ||
|
|
||||||
STREQ(str, "mouse") ||
|
|
||||||
STREQ(str, "keyboard"))) {
|
|
||||||
virDomainInputDefPtr input;
|
|
||||||
if (VIR_ALLOC(input) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
input->bus = VIR_DOMAIN_INPUT_BUS_USB;
|
|
||||||
if (STREQ(str, "mouse"))
|
|
||||||
input->type = VIR_DOMAIN_INPUT_TYPE_MOUSE;
|
|
||||||
else if (STREQ(str, "tablet"))
|
|
||||||
input->type = VIR_DOMAIN_INPUT_TYPE_TABLET;
|
|
||||||
else if (STREQ(str, "keyboard"))
|
|
||||||
input->type = VIR_DOMAIN_INPUT_TYPE_KBD;
|
|
||||||
if (VIR_ALLOC_N(def->inputs, 1) < 0) {
|
|
||||||
virDomainInputDefFree(input);
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
}
|
|
||||||
def->inputs[0] = input;
|
|
||||||
def->ninputs = 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1949,42 +1922,6 @@ xenFormatSound(virConfPtr conf, virDomainDefPtr def)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
xenFormatInputDevs(virConfPtr conf, virDomainDefPtr def)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
if (STREQ(def->os.type, "hvm")) {
|
|
||||||
for (i = 0; i < def->ninputs; i++) {
|
|
||||||
if (def->inputs[i]->bus == VIR_DOMAIN_INPUT_BUS_USB) {
|
|
||||||
if (xenConfigSetInt(conf, "usb", 1) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
switch (def->inputs[i]->type) {
|
|
||||||
case VIR_DOMAIN_INPUT_TYPE_MOUSE:
|
|
||||||
if (xenConfigSetString(conf, "usbdevice", "mouse") < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case VIR_DOMAIN_INPUT_TYPE_TABLET:
|
|
||||||
if (xenConfigSetString(conf, "usbdevice", "tablet") < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case VIR_DOMAIN_INPUT_TYPE_KBD:
|
|
||||||
if (xenConfigSetString(conf, "usbdevice", "keyboard") < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
xenFormatVif(virConfPtr conf,
|
xenFormatVif(virConfPtr conf,
|
||||||
|
@ -2059,9 +1996,6 @@ xenFormatConfigCommon(virConfPtr conf,
|
||||||
if (xenFormatEmulator(conf, def) < 0)
|
if (xenFormatEmulator(conf, def) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (xenFormatInputDevs(conf, def) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (xenFormatVfb(conf, def, xendConfigVersion) < 0)
|
if (xenFormatVfb(conf, def, xendConfigVersion) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
|
|
@ -289,6 +289,59 @@ xenParseXLDisk(virConfPtr conf, virDomainDefPtr def)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
xenParseXLInputDevs(virConfPtr conf, virDomainDefPtr def)
|
||||||
|
{
|
||||||
|
const char *str;
|
||||||
|
virConfValuePtr val;
|
||||||
|
|
||||||
|
if (STREQ(def->os.type, "hvm")) {
|
||||||
|
val = virConfGetValue(conf, "usbdevice");
|
||||||
|
/* usbdevice can be defined as either a single string or a list */
|
||||||
|
if (val && val->type == VIR_CONF_LIST) {
|
||||||
|
#ifdef LIBXL_HAVE_BUILDINFO_USBDEVICE_LIST
|
||||||
|
val = val->list;
|
||||||
|
#else
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("multiple USB devices not supported"));
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
/* otherwise val->next is NULL, so can be handled by the same code */
|
||||||
|
while (val) {
|
||||||
|
if (val->type != VIR_CONF_STRING) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("config value %s was malformed"),
|
||||||
|
"usbdevice");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
str = val->str;
|
||||||
|
|
||||||
|
if (str &&
|
||||||
|
(STREQ(str, "tablet") ||
|
||||||
|
STREQ(str, "mouse") ||
|
||||||
|
STREQ(str, "keyboard"))) {
|
||||||
|
virDomainInputDefPtr input;
|
||||||
|
if (VIR_ALLOC(input) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
input->bus = VIR_DOMAIN_INPUT_BUS_USB;
|
||||||
|
if (STREQ(str, "mouse"))
|
||||||
|
input->type = VIR_DOMAIN_INPUT_TYPE_MOUSE;
|
||||||
|
else if (STREQ(str, "tablet"))
|
||||||
|
input->type = VIR_DOMAIN_INPUT_TYPE_TABLET;
|
||||||
|
else if (STREQ(str, "keyboard"))
|
||||||
|
input->type = VIR_DOMAIN_INPUT_TYPE_KBD;
|
||||||
|
if (VIR_APPEND_ELEMENT(def->inputs, def->ninputs, input) < 0) {
|
||||||
|
virDomainInputDefFree(input);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val = val->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
virDomainDefPtr
|
virDomainDefPtr
|
||||||
xenParseXL(virConfPtr conf, virCapsPtr caps, int xendConfigVersion)
|
xenParseXL(virConfPtr conf, virCapsPtr caps, int xendConfigVersion)
|
||||||
|
@ -310,6 +363,9 @@ xenParseXL(virConfPtr conf, virCapsPtr caps, int xendConfigVersion)
|
||||||
if (xenParseXLSpice(conf, def) < 0)
|
if (xenParseXLSpice(conf, def) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
if (xenParseXLInputDevs(conf, def) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
return def;
|
return def;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
@ -488,6 +544,74 @@ xenFormatXLSpice(virConfPtr conf, virDomainDefPtr def)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
xenFormatXLInputDevs(virConfPtr conf, virDomainDefPtr def)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
const char *devtype;
|
||||||
|
virConfValuePtr usbdevices = NULL, lastdev;
|
||||||
|
|
||||||
|
if (STREQ(def->os.type, "hvm")) {
|
||||||
|
if (VIR_ALLOC(usbdevices) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
usbdevices->type = VIR_CONF_LIST;
|
||||||
|
usbdevices->list = NULL;
|
||||||
|
lastdev = NULL;
|
||||||
|
for (i = 0; i < def->ninputs; i++) {
|
||||||
|
if (def->inputs[i]->bus == VIR_DOMAIN_INPUT_BUS_USB) {
|
||||||
|
if (xenConfigSetInt(conf, "usb", 1) < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
switch (def->inputs[i]->type) {
|
||||||
|
case VIR_DOMAIN_INPUT_TYPE_MOUSE:
|
||||||
|
devtype = "mouse";
|
||||||
|
break;
|
||||||
|
case VIR_DOMAIN_INPUT_TYPE_TABLET:
|
||||||
|
devtype = "tablet";
|
||||||
|
break;
|
||||||
|
case VIR_DOMAIN_INPUT_TYPE_KBD:
|
||||||
|
devtype = "keyboard";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastdev == NULL) {
|
||||||
|
if (VIR_ALLOC(lastdev) < 0)
|
||||||
|
goto error;
|
||||||
|
usbdevices->list = lastdev;
|
||||||
|
} else {
|
||||||
|
if (VIR_ALLOC(lastdev->next) < 0)
|
||||||
|
goto error;
|
||||||
|
lastdev = lastdev->next;
|
||||||
|
}
|
||||||
|
lastdev->type = VIR_CONF_STRING;
|
||||||
|
if (VIR_STRDUP(lastdev->str, devtype) < 0)
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (usbdevices->list != NULL) {
|
||||||
|
if (usbdevices->list->next == NULL) {
|
||||||
|
/* for compatibility with Xen <= 4.2, use old syntax when
|
||||||
|
* only one device present */
|
||||||
|
if (xenConfigSetString(conf, "usbdevice", usbdevices->list->str) < 0)
|
||||||
|
goto error;
|
||||||
|
virConfFreeValue(usbdevices);
|
||||||
|
} else {
|
||||||
|
virConfSetValue(conf, "usbdevice", usbdevices);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
VIR_FREE(usbdevices);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
error:
|
||||||
|
virConfFreeValue(usbdevices);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
virConfPtr
|
virConfPtr
|
||||||
xenFormatXL(virDomainDefPtr def, virConnectPtr conn, int xendConfigVersion)
|
xenFormatXL(virDomainDefPtr def, virConnectPtr conn, int xendConfigVersion)
|
||||||
|
@ -506,6 +630,9 @@ xenFormatXL(virDomainDefPtr def, virConnectPtr conn, int xendConfigVersion)
|
||||||
if (xenFormatXLSpice(conf, def) < 0)
|
if (xenFormatXLSpice(conf, def) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
if (xenFormatXLInputDevs(conf, def) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
return conf;
|
return conf;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
|
|
@ -365,6 +365,38 @@ xenFormatXMDisks(virConfPtr conf, virDomainDefPtr def, int xendConfigVersion)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
xenParseXMInputDevs(virConfPtr conf, virDomainDefPtr def)
|
||||||
|
{
|
||||||
|
const char *str;
|
||||||
|
|
||||||
|
if (STREQ(def->os.type, "hvm")) {
|
||||||
|
if (xenConfigGetString(conf, "usbdevice", &str, NULL) < 0)
|
||||||
|
return -1;
|
||||||
|
if (str &&
|
||||||
|
(STREQ(str, "tablet") ||
|
||||||
|
STREQ(str, "mouse") ||
|
||||||
|
STREQ(str, "keyboard"))) {
|
||||||
|
virDomainInputDefPtr input;
|
||||||
|
if (VIR_ALLOC(input) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
input->bus = VIR_DOMAIN_INPUT_BUS_USB;
|
||||||
|
if (STREQ(str, "mouse"))
|
||||||
|
input->type = VIR_DOMAIN_INPUT_TYPE_MOUSE;
|
||||||
|
else if (STREQ(str, "tablet"))
|
||||||
|
input->type = VIR_DOMAIN_INPUT_TYPE_TABLET;
|
||||||
|
else if (STREQ(str, "keyboard"))
|
||||||
|
input->type = VIR_DOMAIN_INPUT_TYPE_KBD;
|
||||||
|
if (VIR_APPEND_ELEMENT(def->inputs, def->ninputs, input) < 0) {
|
||||||
|
virDomainInputDefFree(input);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert an XM config record into a virDomainDef object.
|
* Convert an XM config record into a virDomainDef object.
|
||||||
*/
|
*/
|
||||||
|
@ -387,6 +419,9 @@ xenParseXM(virConfPtr conf,
|
||||||
if (xenParseXMDisk(conf, def, xendConfigVersion) < 0)
|
if (xenParseXMDisk(conf, def, xendConfigVersion) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
if (xenParseXMInputDevs(conf, def) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
return def;
|
return def;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
@ -394,6 +429,40 @@ xenParseXM(virConfPtr conf,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
xenFormatXMInputDevs(virConfPtr conf, virDomainDefPtr def)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
const char *devtype;
|
||||||
|
|
||||||
|
if (STREQ(def->os.type, "hvm")) {
|
||||||
|
for (i = 0; i < def->ninputs; i++) {
|
||||||
|
if (def->inputs[i]->bus == VIR_DOMAIN_INPUT_BUS_USB) {
|
||||||
|
if (xenConfigSetInt(conf, "usb", 1) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
switch (def->inputs[i]->type) {
|
||||||
|
case VIR_DOMAIN_INPUT_TYPE_MOUSE:
|
||||||
|
devtype = "mouse";
|
||||||
|
break;
|
||||||
|
case VIR_DOMAIN_INPUT_TYPE_TABLET:
|
||||||
|
devtype = "tablet";
|
||||||
|
break;
|
||||||
|
case VIR_DOMAIN_INPUT_TYPE_KBD:
|
||||||
|
devtype = "keyboard";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (xenConfigSetString(conf, "usbdevice", devtype) < 0)
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Computing the vcpu_avail bitmask works because MAX_VIRT_CPUS is
|
/* Computing the vcpu_avail bitmask works because MAX_VIRT_CPUS is
|
||||||
either 32, or 64 on a platform where long is big enough. */
|
either 32, or 64 on a platform where long is big enough. */
|
||||||
|
@ -418,6 +487,9 @@ xenFormatXM(virConnectPtr conn,
|
||||||
if (xenFormatXMDisks(conf, def, xendConfigVersion) < 0)
|
if (xenFormatXMDisks(conf, def, xendConfigVersion) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
if (xenFormatXMInputDevs(conf, def) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
return conf;
|
return conf;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
|
|
@ -14,8 +14,6 @@ on_poweroff = "destroy"
|
||||||
on_reboot = "restart"
|
on_reboot = "restart"
|
||||||
on_crash = "restart"
|
on_crash = "restart"
|
||||||
device_model = "/usr/lib/xen/bin/qemu-dm"
|
device_model = "/usr/lib/xen/bin/qemu-dm"
|
||||||
usb = 1
|
|
||||||
usbdevice = "mouse"
|
|
||||||
sdl = 0
|
sdl = 0
|
||||||
vnc = 1
|
vnc = 1
|
||||||
vncunused = 1
|
vncunused = 1
|
||||||
|
@ -25,3 +23,5 @@ vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000,type=
|
||||||
parallel = "none"
|
parallel = "none"
|
||||||
serial = "none"
|
serial = "none"
|
||||||
disk = [ "phy:/dev/HostVG/XenGuest2,hda,w", "file:/root/boot.iso,hdc:cdrom,r" ]
|
disk = [ "phy:/dev/HostVG/XenGuest2,hda,w", "file:/root/boot.iso,hdc:cdrom,r" ]
|
||||||
|
usb = 1
|
||||||
|
usbdevice = "mouse"
|
||||||
|
|
|
@ -14,8 +14,6 @@ on_poweroff = "destroy"
|
||||||
on_reboot = "restart"
|
on_reboot = "restart"
|
||||||
on_crash = "restart"
|
on_crash = "restart"
|
||||||
device_model = "/usr/lib/xen/bin/qemu-dm"
|
device_model = "/usr/lib/xen/bin/qemu-dm"
|
||||||
usb = 1
|
|
||||||
usbdevice = "tablet"
|
|
||||||
sdl = 0
|
sdl = 0
|
||||||
vnc = 1
|
vnc = 1
|
||||||
vncunused = 1
|
vncunused = 1
|
||||||
|
@ -25,3 +23,5 @@ vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000,type=
|
||||||
parallel = "none"
|
parallel = "none"
|
||||||
serial = "none"
|
serial = "none"
|
||||||
disk = [ "phy:/dev/HostVG/XenGuest2,hda,w", "file:/root/boot.iso,hdc:cdrom,r" ]
|
disk = [ "phy:/dev/HostVG/XenGuest2,hda,w", "file:/root/boot.iso,hdc:cdrom,r" ]
|
||||||
|
usb = 1
|
||||||
|
usbdevice = "tablet"
|
||||||
|
|
Loading…
Reference in New Issue