]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: honour fatal errors dealing with qemu slirp helper
authorDaniel P. Berrangé <berrange@redhat.com>
Thu, 15 Oct 2020 11:12:15 +0000 (12:12 +0100)
committerDaniel P. Berrangé <berrange@redhat.com>
Tue, 27 Oct 2020 12:03:19 +0000 (12:03 +0000)
Currently all errors from qemuInterfacePrepareSlirp() are completely
ignored by the callers. The intention is that missing qemu-slirp binary
should cause the caller to fallback to the built-in slirp impl.

Many of the possible errors though should indeed be considered fatal.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/qemu/qemu_hotplug.c
src/qemu/qemu_interface.c
src/qemu/qemu_interface.h
src/qemu/qemu_process.c
src/qemu/qemu_slirp.c

index 35e99fbfff34f145b45803bbe91a3d1e1ccfc661..81bbe178a9fc6ee4f1573f3d7e5ce14babc4ac33 100644 (file)
@@ -1313,9 +1313,12 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
     case VIR_DOMAIN_NET_TYPE_USER:
         if (!priv->disableSlirp &&
             virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DBUS_VMSTATE)) {
-            qemuSlirpPtr slirp = qemuInterfacePrepareSlirp(driver, net);
+            qemuSlirpPtr slirp = NULL;
+            int rv = qemuInterfacePrepareSlirp(driver, net, &slirp);
 
-            if (!slirp)
+            if (rv == -1)
+                return -1;
+            if (rv == 0)
                 break;
 
             QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp = slirp;
index 3714828fe12e2e5c21bab065cc69c240d7081254..32b397d28f6b4e7533be372af6ef7fb4dfc8dfd2 100644 (file)
@@ -661,30 +661,39 @@ qemuInterfaceVDPAConnect(virDomainNetDefPtr net)
 }
 
 
-qemuSlirpPtr
+/*
+ * Returns: -1 on error, 0 if slirp isn't available, 1 on succcess
+ */
+int
 qemuInterfacePrepareSlirp(virQEMUDriverPtr driver,
-                          virDomainNetDefPtr net)
+                          virDomainNetDefPtr net,
+                          qemuSlirpPtr *slirpret)
 {
     g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
     g_autoptr(qemuSlirp) slirp = NULL;
     size_t i;
 
+    if (!cfg->slirpHelperName ||
+        !virFileExists(cfg->slirpHelperName))
+        return 0; /* fallback to builtin slirp impl */
+
     if (!(slirp = qemuSlirpNewForHelper(cfg->slirpHelperName)))
-        return NULL;
+        return -1;
 
     for (i = 0; i < net->guestIP.nips; i++) {
         const virNetDevIPAddr *ip = net->guestIP.ips[i];
 
         if (VIR_SOCKET_ADDR_IS_FAMILY(&ip->address, AF_INET) &&
             !qemuSlirpHasFeature(slirp, QEMU_SLIRP_FEATURE_IPV4))
-            return NULL;
+            return 0;
 
         if (VIR_SOCKET_ADDR_IS_FAMILY(&ip->address, AF_INET6) &&
             !qemuSlirpHasFeature(slirp, QEMU_SLIRP_FEATURE_IPV6))
-            return NULL;
+            return 0;
     }
 
-    return g_steal_pointer(&slirp);
+    *slirpret = g_steal_pointer(&slirp);
+    return 1;
 }
 
 
index 1ba24f0a6f16bd5f24d99685b4c393962ef9323f..aed8464c7c4e40f2c30e0bd7e9e8262cbd2254f6 100644 (file)
@@ -56,7 +56,8 @@ int qemuInterfaceOpenVhostNet(virDomainDefPtr def,
                               int *vhostfd,
                               size_t *vhostfdSize) G_GNUC_NO_INLINE;
 
-qemuSlirpPtr qemuInterfacePrepareSlirp(virQEMUDriverPtr driver,
-                                       virDomainNetDefPtr net);
+int qemuInterfacePrepareSlirp(virQEMUDriverPtr driver,
+                              virDomainNetDefPtr net,
+                              qemuSlirpPtr *slirp);
 
 int qemuInterfaceVDPAConnect(virDomainNetDefPtr net) G_GNUC_NO_INLINE;
index d334ad1e9be6261a7701fa834d385c92272b3c9b..cd0f57da97fc9763a418fec2c70f44d877962cba 100644 (file)
@@ -5757,9 +5757,13 @@ qemuProcessNetworkPrepareDevices(virQEMUDriverPtr driver,
         } else if (actualType == VIR_DOMAIN_NET_TYPE_USER &&
                    !priv->disableSlirp &&
                    virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DBUS_VMSTATE)) {
-            qemuSlirpPtr slirp = qemuInterfacePrepareSlirp(driver, net);
+            qemuSlirpPtr slirp = NULL;
+            int rv = qemuInterfacePrepareSlirp(driver, net, &slirp);
 
-            QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp = slirp;
+            if (rv == -1)
+                return -1;
+            if (rv == 1)
+                QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp = slirp;
          }
 
     }
index d2e4ed79be33da0cb04b9bf10db762fcb7dadc48..dfb36125f0e08e410553bb745612c7ce5203cec8 100644 (file)
@@ -101,9 +101,6 @@ qemuSlirpNewForHelper(const char *helper)
     virJSONValuePtr featuresJSON;
     size_t i, nfeatures;
 
-    if (!helper)
-        return NULL;
-
     slirp = qemuSlirpNew();
     if (!slirp) {
         virReportError(VIR_ERR_INTERNAL_ERROR,