diff options
author | Roger Pau Monne <roger.pau@citrix.com> | 2012-07-26 16:47:33 +0100 |
---|---|---|
committer | Roger Pau Monne <roger.pau@citrix.com> | 2012-07-26 16:47:33 +0100 |
commit | 24bc7a06aea0dd3cb3c9e0ba6c0367d54fdd503e (patch) | |
tree | f4067a4c79079169d2d8fb5b6d82c32e8ce88e7d | |
parent | 314e64084d310263417f5caf0668cca3d160ba1c (diff) | |
download | xen-24bc7a06aea0dd3cb3c9e0ba6c0367d54fdd503e.tar.gz xen-24bc7a06aea0dd3cb3c9e0ba6c0367d54fdd503e.tar.bz2 xen-24bc7a06aea0dd3cb3c9e0ba6c0367d54fdd503e.zip |
libxl: set correct nic type depending on the guest
Fix the use of nic type, which results in the following for each type
of domain:
* HVM: let the user choose, if none specified use VIF_IOEMU.
* PV: use VIF is none provided, return error if VIF_IOEMU requested.
Signed-off-by: Roger Pau Monne <roger.pau@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Committed-by: Ian Campbell <ian.campbell@citrix.com>
-rw-r--r-- | tools/libxl/libxl.c | 26 | ||||
-rw-r--r-- | tools/libxl/libxl_create.c | 4 | ||||
-rw-r--r-- | tools/libxl/libxl_dm.c | 4 | ||||
-rw-r--r-- | tools/libxl/libxl_internal.h | 3 |
4 files changed, 30 insertions, 7 deletions
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 0a5e4e9ee2..da9ddff4aa 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2457,7 +2457,8 @@ out: /******************************************************************************/ -int libxl__device_nic_setdefault(libxl__gc *gc, libxl_device_nic *nic) +int libxl__device_nic_setdefault(libxl__gc *gc, libxl_device_nic *nic, + uint32_t domid) { if (!nic->mtu) nic->mtu = 1492; @@ -2487,8 +2488,25 @@ int libxl__device_nic_setdefault(libxl__gc *gc, libxl_device_nic *nic) if ( !nic->script && asprintf(&nic->script, "%s/vif-bridge", libxl__xen_script_dir_path()) < 0 ) return ERROR_FAIL; - if (!nic->nictype) - nic->nictype = LIBXL_NIC_TYPE_VIF_IOEMU; + + switch (libxl__domain_type(gc, domid)) { + case LIBXL_DOMAIN_TYPE_HVM: + if (!nic->nictype) + nic->nictype = LIBXL_NIC_TYPE_VIF_IOEMU; + break; + case LIBXL_DOMAIN_TYPE_PV: + if (nic->nictype == LIBXL_NIC_TYPE_VIF_IOEMU) { + LOG(ERROR, "trying to create PV guest with an emulated interface"); + return ERROR_INVAL; + } + nic->nictype = LIBXL_NIC_TYPE_VIF; + break; + case LIBXL_DOMAIN_TYPE_INVALID: + return ERROR_FAIL; + default: + abort(); + } + return 0; } @@ -2516,7 +2534,7 @@ void libxl__device_nic_add(libxl__egc *egc, uint32_t domid, char *dompath, **l; unsigned int nb, rc; - rc = libxl__device_nic_setdefault(gc, nic); + rc = libxl__device_nic_setdefault(gc, nic, domid); if (rc) goto out; front = flexarray_make(16, 1); diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index b9dd547c6a..3fd33e7065 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -943,7 +943,9 @@ static void domcreate_launch_dm(libxl__egc *egc, libxl__ao_devices *aodevs, * called libxl_device_nic_add at this point, but qemu needs * the nic information to be complete. */ - libxl__device_nic_setdefault(gc, &d_config->nics[i]); + ret = libxl__device_nic_setdefault(gc, &d_config->nics[i], domid); + if (ret) + goto error_out; } switch (d_config->c_info.type) { case LIBXL_DOMAIN_TYPE_HVM: diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index dec7c19661..606cc29cdd 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -898,7 +898,9 @@ static void spawn_stub_launch_dm(libxl__egc *egc, * called libxl_device_nic_add at this point, but qemu needs * the nic information to be complete. */ - libxl__device_nic_setdefault(gc, &dm_config->nics[i]); + ret = libxl__device_nic_setdefault(gc, &dm_config->nics[i], dm_domid); + if (ret) + goto out; } ret = libxl_device_vfb_add(ctx, dm_domid, &dm_config->vfbs[0]); if (ret) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 1ac681db55..382ec79dd7 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -938,7 +938,8 @@ _hidden int libxl__domain_build_info_setdefault(libxl__gc *gc, libxl_domain_build_info *b_info); _hidden int libxl__device_disk_setdefault(libxl__gc *gc, libxl_device_disk *disk); -_hidden int libxl__device_nic_setdefault(libxl__gc *gc, libxl_device_nic *nic); +_hidden int libxl__device_nic_setdefault(libxl__gc *gc, libxl_device_nic *nic, + uint32_t domid); _hidden int libxl__device_vfb_setdefault(libxl__gc *gc, libxl_device_vfb *vfb); _hidden int libxl__device_vkb_setdefault(libxl__gc *gc, libxl_device_vkb *vkb); _hidden int libxl__device_pci_setdefault(libxl__gc *gc, libxl_device_pci *pci); |