mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
qemu: slirp: Pass FDs to qemu via qemuFDPass in the network private data
Populate the 'slirpfd' qemuFDPass structure inside the private data for passing the fd to qemu rather than using out-of-band variables. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Jonathon Jongsma <jjongsma@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
@@ -4207,8 +4207,7 @@ qemuBuildNicDevProps(virDomainDef *def,
|
|||||||
|
|
||||||
|
|
||||||
virJSONValue *
|
virJSONValue *
|
||||||
qemuBuildHostNetProps(virDomainNetDef *net,
|
qemuBuildHostNetProps(virDomainNetDef *net)
|
||||||
const char *slirpfd)
|
|
||||||
{
|
{
|
||||||
virDomainNetType netType = virDomainNetGetActualType(net);
|
virDomainNetType netType = virDomainNetGetActualType(net);
|
||||||
size_t i;
|
size_t i;
|
||||||
@@ -4323,9 +4322,11 @@ qemuBuildHostNetProps(virDomainNetDef *net,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_NET_TYPE_USER:
|
case VIR_DOMAIN_NET_TYPE_USER:
|
||||||
if (slirpfd) {
|
if (netpriv->slirpfd) {
|
||||||
if (virJSONValueObjectAdd(&netprops, "s:type", "socket", NULL) < 0 ||
|
if (virJSONValueObjectAdd(&netprops,
|
||||||
virJSONValueObjectAppendString(netprops, "fd", slirpfd) < 0)
|
"s:type", "socket",
|
||||||
|
"s:fd", qemuFDPassGetPath(netpriv->slirpfd),
|
||||||
|
NULL) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
} else {
|
} else {
|
||||||
if (virJSONValueObjectAdd(&netprops, "s:type", "user", NULL) < 0)
|
if (virJSONValueObjectAdd(&netprops, "s:type", "user", NULL) < 0)
|
||||||
@@ -8782,11 +8783,9 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
|
|||||||
int ret = -1;
|
int ret = -1;
|
||||||
g_autoptr(virJSONValue) nicprops = NULL;
|
g_autoptr(virJSONValue) nicprops = NULL;
|
||||||
g_autofree char *nic = NULL;
|
g_autofree char *nic = NULL;
|
||||||
g_autofree char *slirpfdName = NULL;
|
|
||||||
virDomainNetType actualType = virDomainNetGetActualType(net);
|
virDomainNetType actualType = virDomainNetGetActualType(net);
|
||||||
const virNetDevBandwidth *actualBandwidth;
|
const virNetDevBandwidth *actualBandwidth;
|
||||||
bool requireNicdev = false;
|
bool requireNicdev = false;
|
||||||
qemuSlirp *slirp;
|
|
||||||
g_autoptr(virJSONValue) hostnetprops = NULL;
|
g_autoptr(virJSONValue) hostnetprops = NULL;
|
||||||
qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
|
qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
|
||||||
GSList *n;
|
GSList *n;
|
||||||
@@ -8912,14 +8911,6 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
|
|||||||
virNetDevSetMTU(net->ifname, net->mtu) < 0)
|
virNetDevSetMTU(net->ifname, net->mtu) < 0)
|
||||||
goto cleanup;
|
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);
|
|
||||||
slirpfdName = g_strdup_printf("%d", slirpfd);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (n = netpriv->tapfds; n; n = n->next) {
|
for (n = netpriv->tapfds; n; n = n->next) {
|
||||||
if (qemuFDPassTransferCommand(n->data, cmd) < 0)
|
if (qemuFDPassTransferCommand(n->data, cmd) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
@@ -8930,11 +8921,11 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qemuFDPassTransferCommand(netpriv->vdpafd, cmd) < 0)
|
if (qemuFDPassTransferCommand(netpriv->slirpfd, cmd) < 0 ||
|
||||||
|
qemuFDPassTransferCommand(netpriv->vdpafd, cmd) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (!(hostnetprops = qemuBuildHostNetProps(net,
|
if (!(hostnetprops = qemuBuildHostNetProps(net)))
|
||||||
slirpfdName)))
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (qemuBuildNetdevCommandlineFromJSON(cmd, hostnetprops, qemuCaps) < 0)
|
if (qemuBuildNetdevCommandlineFromJSON(cmd, hostnetprops, qemuCaps) < 0)
|
||||||
|
|||||||
@@ -86,8 +86,7 @@ virJSONValue *
|
|||||||
qemuBuildChannelGuestfwdNetdevProps(virDomainChrDef *chr);
|
qemuBuildChannelGuestfwdNetdevProps(virDomainChrDef *chr);
|
||||||
|
|
||||||
virJSONValue *
|
virJSONValue *
|
||||||
qemuBuildHostNetProps(virDomainNetDef *net,
|
qemuBuildHostNetProps(virDomainNetDef *net);
|
||||||
const char *slirpfd);
|
|
||||||
|
|
||||||
int
|
int
|
||||||
qemuBuildInterfaceConnect(virDomainObj *vm,
|
qemuBuildInterfaceConnect(virDomainObj *vm,
|
||||||
|
|||||||
@@ -1318,9 +1318,6 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
|
|||||||
"%s", _("Failed to start slirp"));
|
"%s", _("Failed to start slirp"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
slirpfd = qemuSlirpGetFD(slirp);
|
|
||||||
slirpfdName = g_strdup_printf("slirpfd-%s", net->info.alias);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1376,8 +1373,7 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
|
|||||||
virNetDevSetMTU(net->ifname, net->mtu) < 0)
|
virNetDevSetMTU(net->ifname, net->mtu) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (!(netprops = qemuBuildHostNetProps(net,
|
if (!(netprops = qemuBuildHostNetProps(net)))
|
||||||
slirpfdName)))
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
qemuDomainObjEnterMonitor(driver, vm);
|
qemuDomainObjEnterMonitor(driver, vm);
|
||||||
@@ -1396,7 +1392,8 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qemuFDPassTransferMonitor(netpriv->vdpafd, priv->mon) < 0) {
|
if (qemuFDPassTransferMonitor(netpriv->slirpfd, priv->mon) < 0 ||
|
||||||
|
qemuFDPassTransferMonitor(netpriv->vdpafd, priv->mon) < 0) {
|
||||||
qemuDomainObjExitMonitor(vm);
|
qemuDomainObjExitMonitor(vm);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -251,7 +251,8 @@ qemuSlirpStart(virDomainObj *vm,
|
|||||||
{
|
{
|
||||||
qemuDomainObjPrivate *priv = vm->privateData;
|
qemuDomainObjPrivate *priv = vm->privateData;
|
||||||
virQEMUDriver *driver = priv->driver;
|
virQEMUDriver *driver = priv->driver;
|
||||||
qemuSlirp *slirp = QEMU_DOMAIN_NETWORK_PRIVATE(net)->slirp;
|
qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
|
||||||
|
qemuSlirp *slirp = netpriv->slirp;
|
||||||
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
|
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
|
||||||
g_autoptr(virCommand) cmd = NULL;
|
g_autoptr(virCommand) cmd = NULL;
|
||||||
g_autofree char *pidfile = NULL;
|
g_autofree char *pidfile = NULL;
|
||||||
@@ -262,6 +263,7 @@ qemuSlirpStart(virDomainObj *vm,
|
|||||||
int cmdret = 0;
|
int cmdret = 0;
|
||||||
VIR_AUTOCLOSE errfd = -1;
|
VIR_AUTOCLOSE errfd = -1;
|
||||||
bool killDBusDaemon = false;
|
bool killDBusDaemon = false;
|
||||||
|
g_autofree char *fdname = g_strdup_printf("slirpfd-%s", net->info.alias);
|
||||||
|
|
||||||
if (!slirp)
|
if (!slirp)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -359,6 +361,10 @@ qemuSlirpStart(virDomainObj *vm,
|
|||||||
|
|
||||||
slirp->pid = pid;
|
slirp->pid = pid;
|
||||||
|
|
||||||
|
netpriv->slirpfd = qemuFDPassNewDirect(fdname, priv);
|
||||||
|
|
||||||
|
qemuFDPassAddFD(netpriv->slirpfd, &slirp->fd[0], NULL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
|
|||||||
Reference in New Issue
Block a user