qemu-extdevice: prepare, start and stop slirp-helper

If a slirp-helper is associated with a network interface,
prepare/start/stop the process via qemu-extdevice.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Marc-André Lureau 2019-08-08 18:55:10 +04:00 committed by Michal Privoznik
parent 8f2a6bac55
commit eef413e728
3 changed files with 40 additions and 7 deletions

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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)