The new public functions can be used for
attaching/detaching devices.
---
src/libxl/libxl_conf.c | 304 ++++++++++++++++++++++++++----------------------
src/libxl/libxl_conf.h | 8 ++
2 files changed, 171 insertions(+), 141 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 3cebf41..5ae8494 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -1,5 +1,6 @@
/*---------------------------------------------------------------------------*/
/* Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany.
+ * Copyright (C) 2011 Univention GmbH.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -17,6 +18,7 @@
*
* Authors:
* Jim Fehlig <jfehlig(a)novell.com>
+ * Markus Groß <gross(a)univention.de>
*/
/*---------------------------------------------------------------------------*/
@@ -461,6 +463,68 @@ error:
return -1;
}
+int
+libxlMakeDisk(virDomainDiskDefPtr l_disk, libxl_device_disk *x_disk)
+{
+ if (l_disk->src && (x_disk->pdev_path = strdup(l_disk->src)) ==
NULL) {
+ virReportOOMError();
+ return -1;
+ }
+
+ if (l_disk->dst && (x_disk->vdev = strdup(l_disk->dst)) == NULL) {
+ virReportOOMError();
+ return -1;
+ }
+
+ if (l_disk->driverName) {
+ if (STREQ(l_disk->driverName, "tap") ||
+ STREQ(l_disk->driverName, "tap2")) {
+ if (l_disk->driverType) {
+ if (STREQ(l_disk->driverType, "qcow")) {
+ x_disk->format = DISK_FORMAT_QCOW;
+ x_disk->backend = DISK_BACKEND_QDISK;
+ } else if (STREQ(l_disk->driverType, "qcow2")) {
+ x_disk->format = DISK_FORMAT_QCOW2;
+ x_disk->backend = DISK_BACKEND_QDISK;
+ } else if (STREQ(l_disk->driverType, "vhd")) {
+ x_disk->format = DISK_FORMAT_VHD;
+ x_disk->backend = DISK_BACKEND_TAP;
+ } else if (STREQ(l_disk->driverType, "aio") ||
+ STREQ(l_disk->driverType, "raw")) {
+ x_disk->format = DISK_FORMAT_RAW;
+ x_disk->backend = DISK_BACKEND_TAP;
+ }
+ } else {
+ /* No subtype specified, default to raw/tap */
+ x_disk->format = DISK_FORMAT_RAW;
+ x_disk->backend = DISK_BACKEND_TAP;
+ }
+ } else if (STREQ(l_disk->driverName, "file")) {
+ x_disk->format = DISK_FORMAT_RAW;
+ x_disk->backend = DISK_BACKEND_TAP;
+ } else if (STREQ(l_disk->driverName, "phy")) {
+ x_disk->format = DISK_FORMAT_RAW;
+ x_disk->backend = DISK_BACKEND_PHY;
+ } else {
+ libxlError(VIR_ERR_INTERNAL_ERROR,
+ _("libxenlight does not support disk driver %s"),
+ l_disk->driverName);
+ return -1;
+ }
+ } else {
+ /* No driverName - default to raw/tap?? */
+ x_disk->format = DISK_FORMAT_RAW;
+ x_disk->backend = DISK_BACKEND_TAP;
+ }
+
+ /* How to set unpluggable? */
+ x_disk->unpluggable = 1;
+ x_disk->readwrite = !l_disk->readonly;
+ x_disk->is_cdrom = l_disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM ? 1 : 0;
+
+ return 0;
+}
+
static int
libxlMakeDiskList(virDomainDefPtr def, libxl_domain_config *d_config)
{
@@ -475,64 +539,8 @@ libxlMakeDiskList(virDomainDefPtr def, libxl_domain_config
*d_config)
}
for (i = 0; i < ndisks; i++) {
- if (l_disks[i]->src &&
- (x_disks[i].pdev_path = strdup(l_disks[i]->src)) == NULL) {
- virReportOOMError();
+ if (libxlMakeDisk(l_disks[i], &x_disks[i]) < 0)
goto error;
- }
-
- if (l_disks[i]->dst &&
- (x_disks[i].vdev = strdup(l_disks[i]->dst)) == NULL) {
- virReportOOMError();
- goto error;
- }
-
- if (l_disks[i]->driverName) {
- if (STREQ(l_disks[i]->driverName, "tap") ||
- STREQ(l_disks[i]->driverName, "tap2")) {
- if (l_disks[i]->driverType) {
- if (STREQ(l_disks[i]->driverType, "qcow")) {
- x_disks[i].format = DISK_FORMAT_QCOW;
- x_disks[i].backend = DISK_BACKEND_QDISK;
- } else if (STREQ(l_disks[i]->driverType, "qcow2")) {
- x_disks[i].format = DISK_FORMAT_QCOW2;
- x_disks[i].backend = DISK_BACKEND_QDISK;
- } else if (STREQ(l_disks[i]->driverType, "vhd")) {
- x_disks[i].format = DISK_FORMAT_VHD;
- x_disks[i].backend = DISK_BACKEND_TAP;
- } else if (STREQ(l_disks[i]->driverType, "aio") ||
- STREQ(l_disks[i]->driverType, "raw")) {
- x_disks[i].format = DISK_FORMAT_RAW;
- x_disks[i].backend = DISK_BACKEND_TAP;
- }
- } else {
- /* No subtype specified, default to raw/tap */
- x_disks[i].format = DISK_FORMAT_RAW;
- x_disks[i].backend = DISK_BACKEND_TAP;
- }
- } else if (STREQ(l_disks[i]->driverName, "file")) {
- x_disks[i].format = DISK_FORMAT_RAW;
- x_disks[i].backend = DISK_BACKEND_TAP;
- } else if (STREQ(l_disks[i]->driverName, "phy")) {
- x_disks[i].format = DISK_FORMAT_RAW;
- x_disks[i].backend = DISK_BACKEND_PHY;
- } else {
- libxlError(VIR_ERR_INTERNAL_ERROR,
- _("libxenlight does not support disk driver %s"),
- l_disks[i]->driverName);
- goto error;
- }
- } else {
- /* No driverName - default to raw/tap?? */
- x_disks[i].format = DISK_FORMAT_RAW;
- x_disks[i].backend = DISK_BACKEND_TAP;
- }
-
- /* How to set unpluggable? */
- x_disks[i].unpluggable = 1;
- x_disks[i].readwrite = !l_disks[i]->readonly;
- x_disks[i].is_cdrom =
- l_disks[i]->device == VIR_DOMAIN_DISK_DEVICE_CDROM ? 1 : 0;
}
d_config->disks = x_disks;
@@ -547,6 +555,45 @@ error:
return -1;
}
+int
+libxlMakeNic(virDomainNetDefPtr l_nic, libxl_device_nic *x_nic)
+{
+ // TODO: Where is mtu stored?
+ //x_nics[i].mtu = 1492;
+
+ memcpy(x_nic->mac, l_nic->mac, sizeof(libxl_mac));
+
+ if (l_nic->model && !STREQ(l_nic->model, "netfront")) {
+ if ((x_nic->model = strdup(l_nic->model)) == NULL) {
+ virReportOOMError();
+ return -1;
+ }
+ x_nic->nictype = NICTYPE_IOEMU;
+ } else {
+ x_nic->nictype = NICTYPE_VIF;
+ }
+
+ if (l_nic->ifname && (x_nic->ifname = strdup(l_nic->ifname)) ==
NULL) {
+ virReportOOMError();
+ return -1;
+ }
+
+ if (l_nic->type == VIR_DOMAIN_NET_TYPE_BRIDGE) {
+ if (l_nic->data.bridge.brname &&
+ (x_nic->bridge = strdup(l_nic->data.bridge.brname)) == NULL) {
+ virReportOOMError();
+ return -1;
+ }
+ if (l_nic->data.bridge.script &&
+ (x_nic->script = strdup(l_nic->data.bridge.script)) == NULL) {
+ virReportOOMError();
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
static int
libxlMakeNicList(virDomainDefPtr def, libxl_domain_config *d_config)
{
@@ -563,41 +610,8 @@ libxlMakeNicList(virDomainDefPtr def, libxl_domain_config
*d_config)
for (i = 0; i < nnics; i++) {
x_nics[i].devid = i;
- // TODO: Where is mtu stored?
- //x_nics[i].mtu = 1492;
-
- memcpy(x_nics[i].mac, l_nics[i]->mac, sizeof(libxl_mac));
-
- if (l_nics[i]->model && !STREQ(l_nics[i]->model,
"netfront")) {
- if ((x_nics[i].model = strdup(l_nics[i]->model)) == NULL) {
- virReportOOMError();
- goto error;
- }
- x_nics[i].nictype = NICTYPE_IOEMU;
- } else {
- x_nics[i].nictype = NICTYPE_VIF;
- }
-
- if (l_nics[i]->ifname &&
- (x_nics[i].ifname = strdup(l_nics[i]->ifname)) == NULL) {
- virReportOOMError();
+ if (libxlMakeNic(l_nics[i], &x_nics[i]))
goto error;
- }
-
- if (l_nics[i]->type == VIR_DOMAIN_NET_TYPE_BRIDGE) {
- if (l_nics[i]->data.bridge.brname &&
- (x_nics[i].bridge =
- strdup(l_nics[i]->data.bridge.brname)) == NULL) {
- virReportOOMError();
- goto error;
- }
- if (l_nics[i]->data.bridge.script &&
- (x_nics[i].script =
- strdup(l_nics[i]->data.bridge.script)) == NULL) {
- virReportOOMError();
- goto error;
- }
- }
}
d_config->vifs = x_nics;
@@ -612,6 +626,62 @@ error:
return -1;
}
+int
+libxlMakeVfb(libxlDriverPrivatePtr driver, virDomainGraphicsDefPtr l_vfb,
+ libxl_device_vfb *x_vfb)
+{
+ int port;
+
+ switch (l_vfb->type) {
+ case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
+ x_vfb->sdl = 1;
+ if (l_vfb->data.sdl.display &&
+ (x_vfb->display = strdup(l_vfb->data.sdl.display)) == NULL) {
+ virReportOOMError();
+ return -1;
+ }
+ if (l_vfb->data.sdl.xauth &&
+ (x_vfb->xauthority =
+ strdup(l_vfb->data.sdl.xauth)) == NULL) {
+ virReportOOMError();
+ return -1;
+ }
+ break;
+ case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
+ x_vfb->vnc = 1;
+ /* driver handles selection of free port */
+ x_vfb->vncunused = 0;
+ if (l_vfb->data.vnc.autoport) {
+ port = libxlNextFreeVncPort(driver, LIBXL_VNC_PORT_MIN);
+ if (port < 0) {
+ libxlError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("Unable to find an unused VNC
port"));
+ return -1;
+ }
+ l_vfb->data.vnc.port = port;
+ }
+ x_vfb->vncdisplay = l_vfb->data.vnc.port - LIBXL_VNC_PORT_MIN;
+
+ if (l_vfb->data.vnc.listenAddr) {
+ /* libxl_device_vfb_init() does strdup("127.0.0.1") */
+ free(x_vfb->vnclisten);
+ if ((x_vfb->vnclisten =
+ strdup(l_vfb->data.vnc.listenAddr)) == NULL) {
+ virReportOOMError();
+ return -1;
+ }
+ }
+ if (l_vfb->data.vnc.keymap &&
+ (x_vfb->keymap =
+ strdup(l_vfb->data.vnc.keymap)) == NULL) {
+ virReportOOMError();
+ return -1;
+ }
+ break;
+ }
+ return 0;
+}
+
static int
libxlMakeVfbList(libxlDriverPrivatePtr driver,
virDomainDefPtr def, libxl_domain_config *d_config)
@@ -621,7 +691,6 @@ libxlMakeVfbList(libxlDriverPrivatePtr driver,
libxl_device_vfb *x_vfbs;
libxl_device_vkb *x_vkbs;
int i;
- int port;
if (nvfbs == 0)
return 0;
@@ -640,55 +709,8 @@ libxlMakeVfbList(libxlDriverPrivatePtr driver,
libxl_device_vfb_init(&x_vfbs[i], i);
libxl_device_vkb_init(&x_vkbs[i], i);
- switch (l_vfbs[i]->type) {
- case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
- x_vfbs[i].sdl = 1;
- if (l_vfbs[i]->data.sdl.display &&
- (x_vfbs[i].display =
- strdup(l_vfbs[i]->data.sdl.display)) == NULL) {
- virReportOOMError();
- goto error;
- }
- if (l_vfbs[i]->data.sdl.xauth &&
- (x_vfbs[i].xauthority =
- strdup(l_vfbs[i]->data.sdl.xauth)) == NULL) {
- virReportOOMError();
- goto error;
- }
- break;
- case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
- x_vfbs[i].vnc = 1;
- /* driver handles selection of free port */
- x_vfbs[i].vncunused = 0;
- if (l_vfbs[i]->data.vnc.autoport) {
- port = libxlNextFreeVncPort(driver, LIBXL_VNC_PORT_MIN);
- if (port < 0) {
- libxlError(VIR_ERR_INTERNAL_ERROR,
- "%s", _("Unable to find an unused VNC
port"));
- goto error;
- }
- l_vfbs[i]->data.vnc.port = port;
- }
- x_vfbs[i].vncdisplay = l_vfbs[i]->data.vnc.port -
- LIBXL_VNC_PORT_MIN;
-
- if (l_vfbs[i]->data.vnc.listenAddr) {
- /* libxl_device_vfb_init() does strdup("127.0.0.1") */
- free(x_vfbs[i].vnclisten);
- if ((x_vfbs[i].vnclisten =
- strdup(l_vfbs[i]->data.vnc.listenAddr)) == NULL) {
- virReportOOMError();
- goto error;
- }
- }
- if (l_vfbs[i]->data.vnc.keymap &&
- (x_vfbs[i].keymap =
- strdup(l_vfbs[i]->data.vnc.keymap)) == NULL) {
- virReportOOMError();
- goto error;
- }
- break;
- }
+ if (libxlMakeVfb(driver, l_vfbs[i], &x_vfbs[i]) < 0)
+ goto error;
}
d_config->vfbs = x_vfbs;
diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h
index 65110cf..5707b4e 100644
--- a/src/libxl/libxl_conf.h
+++ b/src/libxl/libxl_conf.h
@@ -90,6 +90,14 @@ virCapsPtr
libxlMakeCapabilities(libxl_ctx *ctx);
int
+libxlMakeDisk(virDomainDiskDefPtr l_dev, libxl_device_disk *x_dev);
+int
+libxlMakeNic(virDomainNetDefPtr l_nic, libxl_device_nic *x_nic);
+int
+libxlMakeVfb(libxlDriverPrivatePtr driver, virDomainGraphicsDefPtr l_vfb,
+ libxl_device_vfb *x_vfb);
+
+int
libxlBuildDomainConfig(libxlDriverPrivatePtr driver,
virDomainDefPtr def, libxl_domain_config *d_config);
--
1.7.5.1