On 8/8/19 4:55 PM, marcandre.lur...@redhat.com wrote:
From: Marc-André Lureau <marcandre.lur...@redhat.com>

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.lur...@redhat.com>
---
  src/qemu/qemu_extdevice.c | 47 +++++++++++++++++++++++++++++++++------
  src/qemu/qemu_extdevice.h |  5 +++--
  src/qemu/qemu_process.c   |  4 ++--
  3 files changed, 45 insertions(+), 11 deletions(-)

diff --git a/src/qemu/qemu_extdevice.c b/src/qemu/qemu_extdevice.c
index 0aa050cb0a..179552a3ae 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;
  }
@@ -114,15 +125,26 @@ int
  qemuExtDevicesStart(virQEMUDriverPtr driver,
                      virDomainObjPtr vm,
                      qemuDomainLogContextPtr logCtxt,
-                    bool incomingMigration)
+                    qemuProcessIncomingDefPtr incoming)

No need for this change.

  {
+    virDomainDefPtr def = vm->def;
      int ret = 0;
+    size_t i;
if (qemuExtDevicesInitPaths(driver, vm->def) < 0)
          return -1;
if (vm->def->tpm)
-        ret = qemuExtTPMStart(driver, vm, logCtxt, incomingMigration);
+        ret = qemuExtTPMStart(driver, vm, logCtxt, incoming != NULL);
+
+    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, incoming) < 0)
+            return -1;
+    }
return ret;
  }
@@ -132,11 +154,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 cdd20c28ef..a526308c51 100644
--- a/src/qemu/qemu_extdevice.h
+++ b/src/qemu/qemu_extdevice.h
@@ -22,6 +22,7 @@
#include "qemu_conf.h"
  #include "qemu_domain.h"
+#include "qemu_process.h"
int qemuExtDeviceLogCommand(virQEMUDriverPtr driver,
                              virDomainObjPtr vm,
@@ -31,7 +32,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;
@@ -42,7 +43,7 @@ void qemuExtDevicesCleanupHost(virQEMUDriverPtr driver,
  int qemuExtDevicesStart(virQEMUDriverPtr driver,
                          virDomainObjPtr vm,
                          qemuDomainLogContextPtr logCtxt,
-                        bool incomingMigration)
+                        qemuProcessIncomingDefPtr incoming)

This change is not needed and thus so the include of qemu_process.h is needless too.

      ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
      ATTRIBUTE_RETURN_CHECK;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index f8d740979d..d41ee0f25b 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -6602,7 +6602,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)
@@ -6776,7 +6776,7 @@ qemuProcessLaunch(virConnectPtr conn,
      if (qemuProcessGenID(vm, flags) < 0)
          goto cleanup;
- if (qemuExtDevicesStart(driver, vm, logCtxt, incoming != NULL) < 0)
+    if (qemuExtDevicesStart(driver, vm, logCtxt, incoming) < 0)


Just keep this as is.

Reviewed-by: Michal Privoznik <mpriv...@redhat.com>

Michal

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to