diff options
-rw-r--r-- | tools/libxl/libxl.c | 29 | ||||
-rw-r--r-- | tools/libxl/libxl.h | 3 | ||||
-rw-r--r-- | tools/libxl/libxl_create.c | 51 | ||||
-rw-r--r-- | tools/libxl/libxl_device.c | 2 | ||||
-rw-r--r-- | tools/libxl/libxl_dm.c | 38 | ||||
-rw-r--r-- | tools/libxl/libxl_internal.h | 9 | ||||
-rw-r--r-- | tools/libxl/xl_cmdimpl.c | 2 | ||||
-rw-r--r-- | tools/ocaml/libs/xl/xenlight_stubs.c | 2 |
8 files changed, 114 insertions, 22 deletions
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 85475586ba..0a5e4e9ee2 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2506,12 +2506,13 @@ static int libxl__device_from_nic(libxl__gc *gc, uint32_t domid, return 0; } -int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic) +void libxl__device_nic_add(libxl__egc *egc, uint32_t domid, + libxl_device_nic *nic, libxl__ao_device *aodev) { - GC_INIT(ctx); + STATE_AO_GC(aodev->ao); flexarray_t *front; flexarray_t *back; - libxl__device device; + libxl__device *device; char *dompath, **l; unsigned int nb, rc; @@ -2542,7 +2543,8 @@ int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic) } } - rc = libxl__device_from_nic(gc, domid, nic, &device); + GCNEW(device); + rc = libxl__device_from_nic(gc, domid, nic, device); if ( rc != 0 ) goto out_free; flexarray_append(back, "frontend-id"); @@ -2583,6 +2585,9 @@ int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic) flexarray_append(back, libxl__strdup(gc, nic->bridge)); flexarray_append(back, "handle"); flexarray_append(back, libxl__sprintf(gc, "%d", nic->devid)); + flexarray_append(back, "type"); + flexarray_append(back, libxl__strdup(gc, + libxl_nic_type_to_string(nic->nictype))); flexarray_append(front, "backend-id"); flexarray_append(front, libxl__sprintf(gc, "%d", nic->backend_domid)); @@ -2593,18 +2598,22 @@ int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic) flexarray_append(front, "mac"); flexarray_append(front, libxl__sprintf(gc, LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nic->mac))); - libxl__device_generic_add(gc, XBT_NULL, &device, + libxl__device_generic_add(gc, XBT_NULL, device, libxl__xs_kvs_of_flexarray(gc, back, back->count), libxl__xs_kvs_of_flexarray(gc, front, front->count)); - /* FIXME: wait for plug */ + aodev->dev = device; + aodev->action = DEVICE_CONNECT; + libxl__wait_device_connection(egc, aodev); + rc = 0; out_free: flexarray_free(back); flexarray_free(front); out: - GC_FREE; - return rc; + aodev->rc = rc; + if (rc) aodev->callback(egc, aodev); + return; } static void libxl__device_nic_from_xs_be(libxl__gc *gc, @@ -3096,6 +3105,7 @@ DEFINE_DEVICE_REMOVE(vfb, destroy, 1) /* Macro for defining device addition functions in a compact way */ /* The following functions are defined: * libxl_device_disk_add + * libxl_device_nic_add */ #define DEFINE_DEVICE_ADD(type) \ @@ -3119,6 +3129,9 @@ DEFINE_DEVICE_REMOVE(vfb, destroy, 1) /* disk */ DEFINE_DEVICE_ADD(disk) +/* nic */ +DEFINE_DEVICE_ADD(nic) + #undef DEFINE_DEVICE_ADD /******************************************************************************/ diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index cc872ba971..e6e549f318 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -697,7 +697,8 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, const libxl_asyncop_how *ao_how); /* Network Interfaces */ -int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic); +int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic, + const libxl_asyncop_how *ao_how); int libxl_device_nic_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic, const libxl_asyncop_how *ao_how); diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 0d47eb472a..707e7dd728 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -564,6 +564,9 @@ static void domcreate_bootloader_done(libxl__egc *egc, static void domcreate_launch_dm(libxl__egc *egc, libxl__ao_devices *aodevs, int ret); +static void domcreate_attach_pci(libxl__egc *egc, libxl__ao_devices *aodevs, + int ret); + static void domcreate_console_available(libxl__egc *egc, libxl__domain_create_state *dcs); @@ -898,13 +901,11 @@ static void domcreate_launch_dm(libxl__egc *egc, libxl__ao_devices *aodevs, goto error_out; } for (i = 0; i < d_config->num_nics; i++) { - ret = libxl_device_nic_add(ctx, domid, &d_config->nics[i]); - if (ret) { - LIBXL__LOG(ctx, LIBXL__LOG_ERROR, - "cannot add nic %d to domain: %d", i, ret); - ret = ERROR_FAIL; - goto error_out; - } + /* We have to init the nic here, because we still haven't + * 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]); } switch (d_config->c_info.type) { case LIBXL_DOMAIN_TYPE_HVM: @@ -977,7 +978,6 @@ static void domcreate_devmodel_started(libxl__egc *egc, { libxl__domain_create_state *dcs = CONTAINER_OF(dmss, *dcs, dmss.dm); STATE_AO_GC(dmss->spawn.ao); - int i; libxl_ctx *ctx = CTX; int domid = dcs->guest_domid; @@ -997,6 +997,41 @@ static void domcreate_devmodel_started(libxl__egc *egc, } } + /* Plug nic interfaces */ + if (d_config->num_nics > 0) { + /* Attach nics */ + dcs->aodevs.size = d_config->num_nics; + dcs->aodevs.callback = domcreate_attach_pci; + libxl__prepare_ao_devices(ao, &dcs->aodevs); + libxl__add_nics(egc, ao, domid, 0, d_config, &dcs->aodevs); + return; + } + + domcreate_attach_pci(egc, &dcs->aodevs, 0); + return; + +error_out: + assert(ret); + domcreate_complete(egc, dcs, ret); +} + +static void domcreate_attach_pci(libxl__egc *egc, libxl__ao_devices *aodevs, + int ret) +{ + libxl__domain_create_state *dcs = CONTAINER_OF(aodevs, *dcs, aodevs); + STATE_AO_GC(dcs->ao); + int i; + libxl_ctx *ctx = CTX; + int domid = dcs->guest_domid; + + /* convenience aliases */ + libxl_domain_config *const d_config = dcs->guest_config; + + if (ret) { + LOG(ERROR, "unable to add nic devices"); + goto error_out; + } + for (i = 0; i < d_config->num_pcidevs; i++) libxl__device_pci_add(gc, domid, &d_config->pcidevs[i], 1); diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c index 835b4ad235..ed33f6f644 100644 --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -455,6 +455,7 @@ void libxl__ao_devices_callback(libxl__egc *egc, libxl__ao_device *aodev) * * The following functions are defined: * libxl__add_disks + * libxl__add_nics */ #define DEFINE_DEVICES_ADD(type) \ @@ -473,6 +474,7 @@ void libxl__ao_devices_callback(libxl__egc *egc, libxl__ao_device *aodev) } DEFINE_DEVICES_ADD(disk) +DEFINE_DEVICES_ADD(nic) #undef DEFINE_DEVICES_ADD diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index 8a731ae500..1b17ef516f 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -716,6 +716,10 @@ static void spawn_stubdom_pvqemu_cb(libxl__egc *egc, static void spawn_stub_launch_dm(libxl__egc *egc, libxl__ao_devices *aodevs, int ret); +static void stubdom_pvqemu_cb(libxl__egc *egc, + libxl__ao_devices *aodevs, + int rc); + static void spaw_stubdom_pvqemu_destroy_cb(libxl__egc *egc, libxl__destroy_domid_state *dis, int rc); @@ -887,9 +891,11 @@ static void spawn_stub_launch_dm(libxl__egc *egc, } for (i = 0; i < dm_config->num_nics; i++) { - ret = libxl_device_nic_add(ctx, dm_domid, &dm_config->nics[i]); - if (ret) - goto out; + /* We have to init the nic here, because we still haven't + * 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_vfb_add(ctx, dm_domid, &dm_config->vfbs[0]); if (ret) @@ -966,9 +972,35 @@ static void spawn_stubdom_pvqemu_cb(libxl__egc *egc, CONTAINER_OF(stubdom_dmss, *sdss, pvqemu); STATE_AO_GC(sdss->dm.spawn.ao); uint32_t dm_domid = sdss->pvqemu.guest_domid; + libxl_domain_config *d_config = stubdom_dmss->guest_config; if (rc) goto out; + if (d_config->num_nics > 0) { + sdss->aodevs.size = d_config->num_nics; + sdss->aodevs.callback = stubdom_pvqemu_cb; + libxl__prepare_ao_devices(ao, &sdss->aodevs); + libxl__add_nics(egc, ao, dm_domid, 0, d_config, &sdss->aodevs); + return; + } + +out: + stubdom_pvqemu_cb(egc, &sdss->aodevs, rc); +} + +static void stubdom_pvqemu_cb(libxl__egc *egc, + libxl__ao_devices *aodevs, + int rc) +{ + libxl__stub_dm_spawn_state *sdss = CONTAINER_OF(aodevs, *sdss, aodevs); + STATE_AO_GC(sdss->dm.spawn.ao); + uint32_t dm_domid = sdss->pvqemu.guest_domid; + + if (rc) { + LOGE(ERROR, "error connecting nics devices"); + goto out; + } + rc = libxl_domain_unpause(CTX, dm_domid); if (rc) goto out; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 19a9cdc39c..e89f37c296 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1933,6 +1933,11 @@ _hidden void libxl__device_disk_add(libxl__egc *egc, uint32_t domid, libxl_device_disk *disk, libxl__ao_device *aodev); +/* AO operation to connect a nic device */ +_hidden void libxl__device_nic_add(libxl__egc *egc, uint32_t domid, + libxl_device_nic *nic, + libxl__ao_device *aodev); + /* Waits for the passed device to reach state XenbusStateInitWait. * This is not really useful by itself, but is important when executing * hotplug scripts, since we need to be sure the device is in the correct @@ -2328,6 +2333,10 @@ _hidden void libxl__add_disks(libxl__egc *egc, libxl__ao *ao, uint32_t domid, int start, libxl_domain_config *d_config, libxl__ao_devices *aodevs); +_hidden void libxl__add_nics(libxl__egc *egc, libxl__ao *ao, uint32_t domid, + int start, libxl_domain_config *d_config, + libxl__ao_devices *aodevs); + /*----- device model creation -----*/ /* First layer; wraps libxl__spawn_spawn. */ diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 8fbd4483b4..72892f3dfd 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -5249,7 +5249,7 @@ int main_networkattach(int argc, char **argv) return 0; } - if (libxl_device_nic_add(ctx, domid, &nic)) { + if (libxl_device_nic_add(ctx, domid, &nic, 0)) { fprintf(stderr, "libxl_device_nic_add failed.\n"); return 1; } diff --git a/tools/ocaml/libs/xl/xenlight_stubs.c b/tools/ocaml/libs/xl/xenlight_stubs.c index a158351794..0e9c65e8cd 100644 --- a/tools/ocaml/libs/xl/xenlight_stubs.c +++ b/tools/ocaml/libs/xl/xenlight_stubs.c @@ -281,7 +281,7 @@ value stub_xl_device_nic_add(value info, value domid) device_nic_val(&gc, &lg, &c_info, info); INIT_CTX(); - ret = libxl_device_nic_add(ctx, Int_val(domid), &c_info); + ret = libxl_device_nic_add(ctx, Int_val(domid), &c_info, 0); if (ret != 0) failwith_xl("nic_add", &lg); FREE_CTX(); |