From eef413e7280498a34461d68e7471e93e5a1ee118 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marc-Andr=C3=A9=20Lureau?= Date: Thu, 8 Aug 2019 18:55:10 +0400 Subject: [PATCH] qemu-extdevice: prepare, start and stop slirp-helper MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit If a slirp-helper is associated with a network interface, prepare/start/stop the process via qemu-extdevice. Signed-off-by: Marc-André Lureau Signed-off-by: Michal Privoznik Reviewed-by: Michal Privoznik --- src/qemu/qemu_extdevice.c | 43 ++++++++++++++++++++++++++++++++++----- src/qemu/qemu_extdevice.h | 2 +- src/qemu/qemu_process.c | 2 +- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_extdevice.c b/src/qemu/qemu_extdevice.c index fc3d1519b0..409e2d82ee 100644 --- a/src/qemu/qemu_extdevice.c +++ b/src/qemu/qemu_extdevice.c @@ -23,6 +23,7 @@ #include "qemu_extdevice.h" #include "qemu_domain.h" #include "qemu_tpm.h" +#include "qemu_slirp.h" #include "viralloc.h" #include "virlog.h" @@ -87,14 +88,24 @@ qemuExtDevicesInitPaths(virQEMUDriverPtr driver, */ int qemuExtDevicesPrepareHost(virQEMUDriverPtr driver, - virDomainDefPtr def) + virDomainObjPtr vm) { - int ret = 0; + virDomainDefPtr def = vm->def; + size_t i; - if (def->tpm) - ret = qemuExtTPMPrepareHost(driver, def); + if (def->tpm && + qemuExtTPMPrepareHost(driver, def) < 0) + return -1; - return ret; + for (i = 0; i < def->nnets; i++) { + virDomainNetDefPtr net = def->nets[i]; + qemuSlirpPtr slirp = QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp; + + if (slirp && qemuSlirpOpen(slirp, driver, def) < 0) + return -1; + } + + return 0; } @@ -115,7 +126,9 @@ qemuExtDevicesStart(virQEMUDriverPtr driver, virDomainObjPtr vm, bool incomingMigration) { + virDomainDefPtr def = vm->def; int ret = 0; + size_t i; if (qemuExtDevicesInitPaths(driver, vm->def) < 0) return -1; @@ -123,6 +136,15 @@ qemuExtDevicesStart(virQEMUDriverPtr driver, if (vm->def->tpm) ret = qemuExtTPMStart(driver, vm, incomingMigration); + for (i = 0; i < def->nnets; i++) { + virDomainNetDefPtr net = def->nets[i]; + qemuSlirpPtr slirp = QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp; + + if (slirp && + qemuSlirpStart(slirp, vm, driver, net, false, incomingMigration) < 0) + return -1; + } + return ret; } @@ -131,11 +153,22 @@ void qemuExtDevicesStop(virQEMUDriverPtr driver, virDomainObjPtr vm) { + virDomainDefPtr def = vm->def; + size_t i; + if (qemuExtDevicesInitPaths(driver, vm->def) < 0) return; if (vm->def->tpm) qemuExtTPMStop(driver, vm); + + for (i = 0; i < def->nnets; i++) { + virDomainNetDefPtr net = def->nets[i]; + qemuSlirpPtr slirp = QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp; + + if (slirp) + qemuSlirpStop(slirp, vm, driver, net, false); + } } diff --git a/src/qemu/qemu_extdevice.h b/src/qemu/qemu_extdevice.h index dc2ae366b9..f29317498b 100644 --- a/src/qemu/qemu_extdevice.h +++ b/src/qemu/qemu_extdevice.h @@ -31,7 +31,7 @@ int qemuExtDeviceLogCommand(virQEMUDriverPtr driver, ATTRIBUTE_RETURN_CHECK; int qemuExtDevicesPrepareHost(virQEMUDriverPtr driver, - virDomainDefPtr def) + virDomainObjPtr vm) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 128e7ef017..1dd6790263 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6619,7 +6619,7 @@ qemuProcessPrepareHost(virQEMUDriverPtr driver, goto cleanup; VIR_DEBUG("Preparing external devices"); - if (qemuExtDevicesPrepareHost(driver, vm->def) < 0) + if (qemuExtDevicesPrepareHost(driver, vm) < 0) goto cleanup; if (qemuProcessPrepareSEVGuestInput(vm) < 0) -- 2.39.5