#include "qemu_alias.h"
#include "qemu_security.h"
#include "qemu_dbus.h"
+#include "qemu_slirp.h"
#include "qemu_block.h"
#include "cpu/cpu.h"
#include "dirname.h"
char **tapfd,
size_t tapfdSize,
char **vhostfd,
- size_t vhostfdSize)
+ size_t vhostfdSize,
+ const char *slirpfd)
{
bool is_tap = false;
VIR_AUTOCLEAN(virBuffer) buf = VIR_BUFFER_INITIALIZER;
break;
case VIR_DOMAIN_NET_TYPE_USER:
- virBufferAddLit(&buf, "user,");
- for (i = 0; i < net->guestIP.nips; i++) {
- const virNetDevIPAddr *ip = net->guestIP.ips[i];
- VIR_AUTOFREE(char *) addr = NULL;
- const char *prefix = "";
-
- if (!(addr = virSocketAddrFormat(&ip->address)))
- goto cleanup;
-
- if (VIR_SOCKET_ADDR_IS_FAMILY(&ip->address, AF_INET))
- prefix = "net=";
- if (VIR_SOCKET_ADDR_IS_FAMILY(&ip->address, AF_INET6))
- prefix = "ipv6-net=";
-
- virBufferAsprintf(&buf, "%s%s", prefix, addr);
- if (ip->prefix)
- virBufferAsprintf(&buf, "/%u", ip->prefix);
- virBufferAddChar(&buf, ',');
+ if (slirpfd) {
+ virBufferAsprintf(&buf, "socket,fd=%s,", slirpfd);
+ } else {
+ virBufferAddLit(&buf, "user,");
+ for (i = 0; i < net->guestIP.nips; i++) {
+ const virNetDevIPAddr *ip = net->guestIP.ips[i];
+ VIR_AUTOFREE(char *) addr = NULL;
+ const char *prefix = "";
+
+ if (!(addr = virSocketAddrFormat(&ip->address)))
+ goto cleanup;
+
+ if (VIR_SOCKET_ADDR_IS_FAMILY(&ip->address, AF_INET))
+ prefix = "net=";
+ if (VIR_SOCKET_ADDR_IS_FAMILY(&ip->address, AF_INET6))
+ prefix = "ipv6-net=";
+
+ virBufferAsprintf(&buf, "%s%s", prefix, addr);
+ if (ip->prefix)
+ virBufferAsprintf(&buf, "/%u", ip->prefix);
+ virBufferAddChar(&buf, ',');
+ }
}
break;
static int
qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
virLogManagerPtr logManager,
virSecurityManagerPtr secManager,
virCommandPtr cmd,
- virDomainDefPtr def,
virDomainNetDefPtr net,
virQEMUCapsPtr qemuCaps,
unsigned int bootindex,
size_t *nnicindexes,
int **nicindexes)
{
+ virDomainDefPtr def = vm->def;
int ret = -1;
VIR_AUTOFREE(char *) nic = NULL;
VIR_AUTOFREE(char *) host = NULL;
size_t vhostfdSize = 0;
char **tapfdName = NULL;
char **vhostfdName = NULL;
+ VIR_AUTOFREE(char *) slirpfdName = NULL;
virDomainNetType actualType = virDomainNetGetActualType(net);
virNetDevBandwidthPtr actualBandwidth;
bool requireNicdev = false;
+ qemuSlirpPtr slirp;
size_t i;
goto cleanup;
}
+ slirp = QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp;
+ if (slirp && !standalone) {
+ int slirpfd = qemuSlirpGetFD(slirp);
+ virCommandPassFD(cmd, slirpfd,
+ VIR_COMMAND_PASS_FD_CLOSE_PARENT);
+ if (virAsprintf(&slirpfdName, "%d", slirpfd) < 0)
+ goto cleanup;
+ }
+
+
for (i = 0; i < tapfdSize; i++) {
if (qemuSecuritySetTapFDLabel(driver->securityManager,
def, tapfd[i]) < 0)
if (!(host = qemuBuildHostNetStr(net, driver,
tapfdName, tapfdSize,
- vhostfdName, vhostfdSize)))
+ vhostfdName, vhostfdSize,
+ slirpfdName)))
goto cleanup;
virCommandAddArgList(cmd, "-netdev", host, NULL);
*/
static int
qemuBuildNetCommandLine(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
virLogManagerPtr logManager,
virSecurityManagerPtr secManager,
virCommandPtr cmd,
- virDomainDefPtr def,
virQEMUCapsPtr qemuCaps,
virNetDevVPortProfileOp vmop,
bool standalone,
size_t i;
int last_good_net = -1;
virErrorPtr originalError = NULL;
+ virDomainDefPtr def = vm->def;
if (def->nnets) {
unsigned int bootNet = 0;
for (i = 0; i < def->nnets; i++) {
virDomainNetDefPtr net = def->nets[i];
- if (qemuBuildInterfaceCommandLine(driver, logManager, secManager, cmd, def, net,
+ if (qemuBuildInterfaceCommandLine(driver, vm, logManager, secManager, cmd, net,
qemuCaps, bootNet, vmop,
standalone, nnicindexes,
nicindexes) < 0)
if (qemuBuildFilesystemCommandLine(cmd, def, qemuCaps) < 0)
return NULL;
- if (qemuBuildNetCommandLine(driver, logManager, secManager, cmd, def,
+ if (qemuBuildNetCommandLine(driver, vm, logManager, secManager, cmd,
qemuCaps, vmop, standalone,
nnicindexes, nicindexes, &bootHostdevNet) < 0)
return NULL;