}
+qemuSlirpPtr
+qemuInterfacePrepareSlirp(virQEMUDriverPtr driver,
+ virDomainNetDefPtr net)
+{
+ virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+ VIR_AUTOPTR(qemuSlirp) slirp = NULL;
+ size_t i;
+
+ if (!(slirp = qemuSlirpNewForHelper(cfg->slirpHelperName)))
+ return NULL;
+
+ 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;
+
+ if (VIR_SOCKET_ADDR_IS_FAMILY(&ip->address, AF_INET6) &&
+ !qemuSlirpHasFeature(slirp, QEMU_SLIRP_FEATURE_IPV6))
+ return NULL;
+ }
+
+ VIR_RETURN_PTR(slirp);
+}
+
+
/**
* qemuInterfaceOpenVhostNet:
* @def: domain definition
#include "domain_conf.h"
#include "qemu_conf.h"
#include "qemu_domain.h"
+#include "qemu_slirp.h"
int qemuInterfaceStartDevice(virDomainNetDefPtr net);
int qemuInterfaceStartDevices(virDomainDefPtr def);
virDomainNetDefPtr net,
int *vhostfd,
size_t *vhostfdSize);
+
+qemuSlirpPtr qemuInterfacePrepareSlirp(virQEMUDriverPtr driver,
+ virDomainNetDefPtr net);
* qemuProcessNetworkPrepareDevices
*/
static int
-qemuProcessNetworkPrepareDevices(virDomainDefPtr def)
+qemuProcessNetworkPrepareDevices(virQEMUDriverPtr driver,
+ virDomainObjPtr vm)
{
+ virDomainDefPtr def = vm->def;
+ qemuDomainObjPrivatePtr priv = vm->privateData;
int ret = -1;
size_t i;
virConnectPtr conn = NULL;
}
if (virDomainHostdevInsert(def, hostdev) < 0)
goto cleanup;
- }
+ } else if (actualType == VIR_DOMAIN_NET_TYPE_USER &&
+ !priv->disableSlirp &&
+ virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_NET_SOCKET_DGRAM)) {
+ qemuSlirpPtr slirp = qemuInterfacePrepareSlirp(driver, net);
+
+ QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp = slirp;
+ }
+
}
ret = 0;
cleanup:
* will need to be setup.
*/
VIR_DEBUG("Preparing network devices");
- if (qemuProcessNetworkPrepareDevices(vm->def) < 0)
+ if (qemuProcessNetworkPrepareDevices(driver, vm) < 0)
goto cleanup;
/* Must be run before security labelling */