]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: slirp: Pass FDs to qemu via qemuFDPass in the network private data
authorPeter Krempa <pkrempa@redhat.com>
Tue, 10 May 2022 14:45:12 +0000 (16:45 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 16 May 2022 07:15:46 +0000 (09:15 +0200)
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>
src/qemu/qemu_command.c
src/qemu/qemu_command.h
src/qemu/qemu_hotplug.c
src/qemu/qemu_slirp.c

index 4b973fb22eefbb8e7e468d51983a7d261d1e79c9..a52ba700668c01319b37cc8607e6f242e8033beb 100644 (file)
@@ -4207,8 +4207,7 @@ qemuBuildNicDevProps(virDomainDef *def,
 
 
 virJSONValue *
-qemuBuildHostNetProps(virDomainNetDef *net,
-                      const char *slirpfd)
+qemuBuildHostNetProps(virDomainNetDef *net)
 {
     virDomainNetType netType = virDomainNetGetActualType(net);
     size_t i;
@@ -4323,9 +4322,11 @@ qemuBuildHostNetProps(virDomainNetDef *net,
         break;
 
     case VIR_DOMAIN_NET_TYPE_USER:
-        if (slirpfd) {
-            if (virJSONValueObjectAdd(&netprops, "s:type", "socket", NULL) < 0 ||
-                virJSONValueObjectAppendString(netprops, "fd", slirpfd) < 0)
+        if (netpriv->slirpfd) {
+            if (virJSONValueObjectAdd(&netprops,
+                                      "s:type", "socket",
+                                      "s:fd", qemuFDPassGetPath(netpriv->slirpfd),
+                                      NULL) < 0)
                 return NULL;
         } else {
             if (virJSONValueObjectAdd(&netprops, "s:type", "user", NULL) < 0)
@@ -8782,11 +8783,9 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
     int ret = -1;
     g_autoptr(virJSONValue) nicprops = NULL;
     g_autofree char *nic = NULL;
-    g_autofree char *slirpfdName = NULL;
     virDomainNetType actualType = virDomainNetGetActualType(net);
     const virNetDevBandwidth *actualBandwidth;
     bool requireNicdev = false;
-    qemuSlirp *slirp;
     g_autoptr(virJSONValue) hostnetprops = NULL;
     qemuDomainNetworkPrivate *netpriv = QEMU_DOMAIN_NETWORK_PRIVATE(net);
     GSList *n;
@@ -8912,14 +8911,6 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
         virNetDevSetMTU(net->ifname, net->mtu) < 0)
         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) {
         if (qemuFDPassTransferCommand(n->data, cmd) < 0)
             return -1;
@@ -8930,11 +8921,11 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
             return -1;
     }
 
-    if (qemuFDPassTransferCommand(netpriv->vdpafd, cmd) < 0)
+    if (qemuFDPassTransferCommand(netpriv->slirpfd, cmd) < 0 ||
+        qemuFDPassTransferCommand(netpriv->vdpafd, cmd) < 0)
         return -1;
 
-    if (!(hostnetprops = qemuBuildHostNetProps(net,
-                                               slirpfdName)))
+    if (!(hostnetprops = qemuBuildHostNetProps(net)))
         goto cleanup;
 
     if (qemuBuildNetdevCommandlineFromJSON(cmd, hostnetprops, qemuCaps) < 0)
index 9bb63d9598fe12d8f1e35c3537a573e6709f933a..84877b3d902afb7ea8899481a05411ec7f93388f 100644 (file)
@@ -86,8 +86,7 @@ virJSONValue *
 qemuBuildChannelGuestfwdNetdevProps(virDomainChrDef *chr);
 
 virJSONValue *
-qemuBuildHostNetProps(virDomainNetDef *net,
-                      const char *slirpfd);
+qemuBuildHostNetProps(virDomainNetDef *net);
 
 int
 qemuBuildInterfaceConnect(virDomainObj *vm,
index 8f5e9715701901cf5bee4dcb159ddad2c826b245..3f368551e36748e53e3638143918d05b5dc684f9 100644 (file)
@@ -1318,9 +1318,6 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
                                "%s", _("Failed to start slirp"));
                 goto cleanup;
             }
-
-            slirpfd = qemuSlirpGetFD(slirp);
-            slirpfdName = g_strdup_printf("slirpfd-%s", net->info.alias);
         }
         break;
 
@@ -1376,8 +1373,7 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
         virNetDevSetMTU(net->ifname, net->mtu) < 0)
         goto cleanup;
 
-    if (!(netprops = qemuBuildHostNetProps(net,
-                                           slirpfdName)))
+    if (!(netprops = qemuBuildHostNetProps(net)))
         goto cleanup;
 
     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);
         goto cleanup;
     }
index 136e4b29d221bd88e3c12dff12b79f74a43c0ff1..b62934f292482574f631f3cf1d29e2163e92aab7 100644 (file)
@@ -251,7 +251,8 @@ qemuSlirpStart(virDomainObj *vm,
 {
     qemuDomainObjPrivate *priv = vm->privateData;
     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(virCommand) cmd = NULL;
     g_autofree char *pidfile = NULL;
@@ -262,6 +263,7 @@ qemuSlirpStart(virDomainObj *vm,
     int cmdret = 0;
     VIR_AUTOCLOSE errfd = -1;
     bool killDBusDaemon = false;
+    g_autofree char *fdname = g_strdup_printf("slirpfd-%s", net->info.alias);
 
     if (!slirp)
         return 0;
@@ -359,6 +361,10 @@ qemuSlirpStart(virDomainObj *vm,
 
     slirp->pid = pid;
 
+    netpriv->slirpfd = qemuFDPassNewDirect(fdname, priv);
+
+    qemuFDPassAddFD(netpriv->slirpfd, &slirp->fd[0], NULL);
+
     return 0;
 
  error: