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;
}
-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;
}
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;
} 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;
}
}
virJSONValuePtr featuresJSON;
size_t i, nfeatures;
- if (!helper)
- return NULL;
-
slirp = qemuSlirpNew();
if (!slirp) {
virReportError(VIR_ERR_INTERNAL_ERROR,