}
+static bool
+qemuDomainGetSlirpHelperOk(virDomainObjPtr vm)
+{
+ size_t i;
+
+ for (i = 0; i < vm->def->nnets; i++) {
+ virDomainNetDefPtr net = vm->def->nets[i];
+
+ /* if there is a builtin slirp, prevent slirp-helper */
+ if (net->type == VIR_DOMAIN_NET_TYPE_USER &&
+ !QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp)
+ return false;
+ }
+
+ return true;
+}
+
+
static int
qemuDomainObjPrivateXMLFormatSlirp(virBufferPtr buf,
virDomainObjPtr vm)
qemuDomainSaveCookiePtr
-qemuDomainSaveCookieNew(virDomainObjPtr vm ATTRIBUTE_UNUSED)
+qemuDomainSaveCookieNew(virDomainObjPtr vm)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
qemuDomainSaveCookiePtr cookie = NULL;
if (priv->origCPU && !(cookie->cpu = virCPUDefCopy(vm->def->cpu)))
goto error;
- VIR_DEBUG("Save cookie %p, cpu=%p", cookie, cookie->cpu);
+ cookie->slirpHelper = qemuDomainGetSlirpHelperOk(vm);
+
+ VIR_DEBUG("Save cookie %p, cpu=%p, slirpHelper=%d",
+ cookie, cookie->cpu, cookie->slirpHelper);
return cookie;
&cookie->cpu) < 0)
goto error;
+ cookie->slirpHelper = virXPathBoolean("boolean(./slirpHelper)", ctxt) > 0;
+
*obj = (virObjectPtr) cookie;
return 0;
virCPUDefFormatBufFull(buf, cookie->cpu, NULL) < 0)
return -1;
+ if (cookie->slirpHelper)
+ virBufferAddLit(buf, "<slirpHelper/>\n");
+
return 0;
}
bool start_paused,
qemuDomainAsyncJob asyncJob)
{
+ qemuDomainObjPrivatePtr priv = vm->privateData;
int ret = -1;
bool restored = false;
virObjectEventPtr event;
qemuDomainFixupCPUs(vm, &cookie->cpu) < 0)
goto cleanup;
+ if (!cookie->slirpHelper)
+ priv->disableSlirp = true;
+
if (qemuProcessStart(conn, driver, vm, cookie ? cookie->cpu : NULL,
asyncJob, "stdio", *fd, path, NULL,
VIR_NETDEV_VPORT_PROFILE_OP_RESTORE,
virCPUDefFree(priv->origCPU);
VIR_STEAL_PTR(priv->origCPU, origCPU);
}
+
+ if (cookie && !cookie->slirpHelper)
+ priv->disableSlirp = true;
+
} else {
/* Transitions 2, 3 */
load: