9119d9
From 0d1763b206f9ff068c26f3b75dfc494117fdd51b Mon Sep 17 00:00:00 2001
9119d9
Message-Id: <0d1763b206f9ff068c26f3b75dfc494117fdd51b@dist-git>
9119d9
From: =?UTF-8?q?J=C3=A1n=20Tomko?= <jtomko@redhat.com>
9119d9
Date: Wed, 17 Sep 2014 19:15:59 +0200
9119d9
Subject: [PATCH] Wire up the interface backend options
9119d9
9119d9
https://bugzilla.redhat.com/show_bug.cgi?id=1139362
9119d9
9119d9
Pass the user-specified tun path down when creating tap device
9119d9
when called from the qemu driver.
9119d9
9119d9
Also honor the vhost device path specified by user.
9119d9
9119d9
(cherry picked from commit b20d39a56f36ee41f585864587c97137363acc3e)
9119d9
9119d9
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
9119d9
---
9119d9
 src/bhyve/bhyve_command.c   |  2 +-
9119d9
 src/bhyve/bhyve_process.c   |  2 +-
9119d9
 src/network/bridge_driver.c |  6 +++---
9119d9
 src/qemu/qemu_command.c     | 22 +++++++++++++++-------
9119d9
 src/qemu/qemu_process.c     |  2 +-
9119d9
 src/uml/uml_conf.c          |  2 +-
9119d9
 src/uml/uml_driver.c        |  3 ++-
9119d9
 src/util/virnetdevtap.c     | 37 +++++++++++++++++++++++++++----------
9119d9
 src/util/virnetdevtap.h     |  5 ++++-
9119d9
 9 files changed, 55 insertions(+), 26 deletions(-)
9119d9
9119d9
diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c
9119d9
index 94829e7..bea4a59 100644
9119d9
--- a/src/bhyve/bhyve_command.c
9119d9
+++ b/src/bhyve/bhyve_command.c
9119d9
@@ -72,7 +72,7 @@ bhyveBuildNetArgStr(const virDomainDef *def,
9119d9
 
9119d9
     if (!dryRun) {
9119d9
         if (virNetDevTapCreateInBridgePort(brname, &net->ifname, &net->mac,
9119d9
-                                           def->uuid, NULL, 0,
9119d9
+                                           def->uuid, NULL, NULL, 0,
9119d9
                                            virDomainNetGetActualVirtPortProfile(net),
9119d9
                                            virDomainNetGetActualVlan(net),
9119d9
                                            VIR_NETDEV_TAP_CREATE_IFUP | VIR_NETDEV_TAP_CREATE_PERSIST) < 0) {
9119d9
diff --git a/src/bhyve/bhyve_process.c b/src/bhyve/bhyve_process.c
9119d9
index 6b5403d..0bbe388 100644
9119d9
--- a/src/bhyve/bhyve_process.c
9119d9
+++ b/src/bhyve/bhyve_process.c
9119d9
@@ -82,7 +82,7 @@ bhyveNetCleanup(virDomainObjPtr vm)
9119d9
                 ignore_value(virNetDevBridgeRemovePort(
9119d9
                                 virDomainNetGetActualBridgeName(net),
9119d9
                                 net->ifname));
9119d9
-                ignore_value(virNetDevTapDelete(net->ifname));
9119d9
+                ignore_value(virNetDevTapDelete(net->ifname, NULL));
9119d9
             }
9119d9
         }
9119d9
     }
9119d9
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
9119d9
index 4b3f07f..b77dc76 100644
9119d9
--- a/src/network/bridge_driver.c
9119d9
+++ b/src/network/bridge_driver.c
9119d9
@@ -1991,7 +1991,7 @@ networkStartNetworkVirtual(virNetworkDriverStatePtr driver,
9119d9
         /* Keep tun fd open and interface up to allow for IPv6 DAD to happen */
9119d9
         if (virNetDevTapCreateInBridgePort(network->def->bridge,
9119d9
                                            &macTapIfName, &network->def->mac,
9119d9
-                                           NULL, &tapfd, 1, NULL, NULL,
9119d9
+                                           NULL, NULL, &tapfd, 1, NULL, NULL,
9119d9
                                            VIR_NETDEV_TAP_CREATE_USE_MAC_FOR_BRIDGE |
9119d9
                                            VIR_NETDEV_TAP_CREATE_IFUP |
9119d9
                                            VIR_NETDEV_TAP_CREATE_PERSIST) < 0) {
9119d9
@@ -2117,7 +2117,7 @@ networkStartNetworkVirtual(virNetworkDriverStatePtr driver,
9119d9
 
9119d9
     if (macTapIfName) {
9119d9
         VIR_FORCE_CLOSE(tapfd);
9119d9
-        ignore_value(virNetDevTapDelete(macTapIfName));
9119d9
+        ignore_value(virNetDevTapDelete(macTapIfName, NULL));
9119d9
         VIR_FREE(macTapIfName);
9119d9
     }
9119d9
 
9119d9
@@ -2156,7 +2156,7 @@ static int networkShutdownNetworkVirtual(virNetworkDriverStatePtr driver ATTRIBU
9119d9
     if (network->def->mac_specified) {
9119d9
         char *macTapIfName = networkBridgeDummyNicName(network->def->bridge);
9119d9
         if (macTapIfName) {
9119d9
-            ignore_value(virNetDevTapDelete(macTapIfName));
9119d9
+            ignore_value(virNetDevTapDelete(macTapIfName, NULL));
9119d9
             VIR_FREE(macTapIfName);
9119d9
         }
9119d9
     }
9119d9
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
9119d9
index ce5daae..81395a8 100644
9119d9
--- a/src/qemu/qemu_command.c
9119d9
+++ b/src/qemu/qemu_command.c
9119d9
@@ -288,6 +288,10 @@ qemuNetworkIfaceConnect(virDomainDefPtr def,
9119d9
     bool template_ifname = false;
9119d9
     int actualType = virDomainNetGetActualType(net);
9119d9
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
9119d9
+    const char *tunpath = "/dev/net/tun";
9119d9
+
9119d9
+    if (net->backend.tap)
9119d9
+        tunpath = net->backend.tap;
9119d9
 
9119d9
     if (actualType == VIR_DOMAIN_NET_TYPE_NETWORK) {
9119d9
         bool fail = false;
9119d9
@@ -336,18 +340,18 @@ qemuNetworkIfaceConnect(virDomainDefPtr def,
9119d9
 
9119d9
     if (cfg->privileged) {
9119d9
         if (virNetDevTapCreateInBridgePort(brname, &net->ifname, &net->mac,
9119d9
-                                           def->uuid, tapfd, *tapfdSize,
9119d9
+                                           def->uuid, tunpath, tapfd, *tapfdSize,
9119d9
                                            virDomainNetGetActualVirtPortProfile(net),
9119d9
                                            virDomainNetGetActualVlan(net),
9119d9
                                            tap_create_flags) < 0) {
9119d9
-            virDomainAuditNetDevice(def, net, "/dev/net/tun", false);
9119d9
+            virDomainAuditNetDevice(def, net, tunpath, false);
9119d9
             goto cleanup;
9119d9
         }
9119d9
     } else {
9119d9
         if (qemuCreateInBridgePortWithHelper(cfg, brname,
9119d9
                                              &net->ifname,
9119d9
                                              tapfd, tap_create_flags) < 0) {
9119d9
-            virDomainAuditNetDevice(def, net, "/dev/net/tun", false);
9119d9
+            virDomainAuditNetDevice(def, net, tunpath, false);
9119d9
             goto cleanup;
9119d9
         }
9119d9
         /* qemuCreateInBridgePortWithHelper can only create a single FD */
9119d9
@@ -357,7 +361,7 @@ qemuNetworkIfaceConnect(virDomainDefPtr def,
9119d9
         }
9119d9
     }
9119d9
 
9119d9
-    virDomainAuditNetDevice(def, net, "/dev/net/tun", true);
9119d9
+    virDomainAuditNetDevice(def, net, tunpath, true);
9119d9
 
9119d9
     if (cfg->macFilter &&
9119d9
         ebtablesAddForwardAllowIn(driver->ebtables,
9119d9
@@ -441,6 +445,10 @@ qemuOpenVhostNet(virDomainDefPtr def,
9119d9
                  int *vhostfdSize)
9119d9
 {
9119d9
     size_t i;
9119d9
+    const char *vhostnet_path = net->backend.vhost;
9119d9
+
9119d9
+    if (!vhostnet_path)
9119d9
+        vhostnet_path = "/dev/vhost-net";
9119d9
 
9119d9
     /* If running a plain QEMU guest, or
9119d9
      * if the config says explicitly to not use vhost, return now*/
9119d9
@@ -478,13 +486,13 @@ qemuOpenVhostNet(virDomainDefPtr def,
9119d9
     }
9119d9
 
9119d9
     for (i = 0; i < *vhostfdSize; i++) {
9119d9
-        vhostfd[i] = open("/dev/vhost-net", O_RDWR);
9119d9
+        vhostfd[i] = open(vhostnet_path, O_RDWR);
9119d9
 
9119d9
         /* If the config says explicitly to use vhost and we couldn't open it,
9119d9
          * report an error.
9119d9
          */
9119d9
         if (vhostfd[i] < 0) {
9119d9
-            virDomainAuditNetDevice(def, net, "/dev/vhost-net", false);
9119d9
+            virDomainAuditNetDevice(def, net, vhostnet_path, false);
9119d9
             if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
9119d9
                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
9119d9
                                "%s", _("vhost-net was requested for an interface, "
9119d9
@@ -497,7 +505,7 @@ qemuOpenVhostNet(virDomainDefPtr def,
9119d9
             break;
9119d9
         }
9119d9
     }
9119d9
-    virDomainAuditNetDevice(def, net, "/dev/vhost-net", *vhostfdSize);
9119d9
+    virDomainAuditNetDevice(def, net, vhostnet_path, *vhostfdSize);
9119d9
     return 0;
9119d9
 
9119d9
  error:
9119d9
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
9119d9
index d7f6bdf..bf1f0de 100644
9119d9
--- a/src/qemu/qemu_process.c
9119d9
+++ b/src/qemu/qemu_process.c
9119d9
@@ -4764,7 +4764,7 @@ void qemuProcessStop(virQEMUDriverPtr driver,
9119d9
         case VIR_DOMAIN_NET_TYPE_NETWORK:
9119d9
 #ifdef VIR_NETDEV_TAP_REQUIRE_MANUAL_CLEANUP
9119d9
             if (!(vport && vport->virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH))
9119d9
-                ignore_value(virNetDevTapDelete(net->ifname));
9119d9
+                ignore_value(virNetDevTapDelete(net->ifname, net->backend.tap));
9119d9
 #endif
9119d9
             break;
9119d9
         }
9119d9
diff --git a/src/uml/uml_conf.c b/src/uml/uml_conf.c
9119d9
index 41ce03c..a99e8e9 100644
9119d9
--- a/src/uml/uml_conf.c
9119d9
+++ b/src/uml/uml_conf.c
9119d9
@@ -124,7 +124,7 @@ umlConnectTapDevice(virConnectPtr conn,
9119d9
     }
9119d9
 
9119d9
     if (virNetDevTapCreateInBridgePort(bridge, &net->ifname, &net->mac,
9119d9
-                                       vm->uuid, &tapfd, 1,
9119d9
+                                       vm->uuid, net->backend.tap, &tapfd, 1,
9119d9
                                        virDomainNetGetActualVirtPortProfile(net),
9119d9
                                        virDomainNetGetActualVlan(net),
9119d9
                                        VIR_NETDEV_TAP_CREATE_IFUP |
9119d9
diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
9119d9
index 7039afc..f9712e8 100644
9119d9
--- a/src/uml/uml_driver.c
9119d9
+++ b/src/uml/uml_driver.c
9119d9
@@ -1032,7 +1032,8 @@ static void umlCleanupTapDevices(virDomainObjPtr vm)
9119d9
             def->type != VIR_DOMAIN_NET_TYPE_NETWORK)
9119d9
             continue;
9119d9
 
9119d9
-        ignore_value(virNetDevTapDelete(def->ifname));
9119d9
+        ignore_value(virNetDevTapDelete(def->ifname,
9119d9
+                                        def->backend.tap));
9119d9
     }
9119d9
 }
9119d9
 
9119d9
diff --git a/src/util/virnetdevtap.c b/src/util/virnetdevtap.c
9119d9
index d64e64f..3674f9b 100644
9119d9
--- a/src/util/virnetdevtap.c
9119d9
+++ b/src/util/virnetdevtap.c
9119d9
@@ -216,6 +216,7 @@ virNetDevProbeVnetHdr(int tapfd)
9119d9
 /**
9119d9
  * virNetDevTapCreate:
9119d9
  * @ifname: the interface name
9119d9
+ * @tunpath: path to the tun device (if NULL, /dev/net/tun is used)
9119d9
  * @tapfds: array of file descriptors return value for the new tap device
9119d9
  * @tapfdSize: number of file descriptors in @tapfd
9119d9
  * @flags: OR of virNetDevTapCreateFlags. Only one flag is recognized:
9119d9
@@ -233,6 +234,7 @@ virNetDevProbeVnetHdr(int tapfd)
9119d9
  * Returns 0 in case of success or -1 on failure.
9119d9
  */
9119d9
 int virNetDevTapCreate(char **ifname,
9119d9
+                       const char *tunpath,
9119d9
                        int *tapfd,
9119d9
                        int tapfdSize,
9119d9
                        unsigned int flags)
9119d9
@@ -242,11 +244,15 @@ int virNetDevTapCreate(char **ifname,
9119d9
     int ret = -1;
9119d9
     int fd;
9119d9
 
9119d9
+    if (!tunpath)
9119d9
+        tunpath = "/dev/net/tun";
9119d9
+
9119d9
     memset(&ifr, 0, sizeof(ifr));
9119d9
     for (i = 0; i < tapfdSize; i++) {
9119d9
-        if ((fd = open("/dev/net/tun", O_RDWR)) < 0) {
9119d9
-            virReportSystemError(errno, "%s",
9119d9
-                                 _("Unable to open /dev/net/tun, is tun module loaded?"));
9119d9
+        if ((fd = open(tunpath, O_RDWR)) < 0) {
9119d9
+            virReportSystemError(errno,
9119d9
+                                 _("Unable to open %s, is tun module loaded?"),
9119d9
+                                 tunpath);
9119d9
             goto cleanup;
9119d9
         }
9119d9
 
9119d9
@@ -316,15 +322,20 @@ int virNetDevTapCreate(char **ifname,
9119d9
 }
9119d9
 
9119d9
 
9119d9
-int virNetDevTapDelete(const char *ifname)
9119d9
+int virNetDevTapDelete(const char *ifname,
9119d9
+                       const char *tunpath)
9119d9
 {
9119d9
     struct ifreq try;
9119d9
     int fd;
9119d9
     int ret = -1;
9119d9
 
9119d9
-    if ((fd = open("/dev/net/tun", O_RDWR)) < 0) {
9119d9
-        virReportSystemError(errno, "%s",
9119d9
-                             _("Unable to open /dev/net/tun, is tun module loaded?"));
9119d9
+    if (!tunpath)
9119d9
+        tunpath = "/dev/net/tun";
9119d9
+
9119d9
+    if ((fd = open(tunpath, O_RDWR)) < 0) {
9119d9
+        virReportSystemError(errno,
9119d9
+                             _("Unable to open %s, is tun module loaded?"),
9119d9
+                             tunpath);
9119d9
         return -1;
9119d9
     }
9119d9
 
9119d9
@@ -358,6 +369,7 @@ int virNetDevTapDelete(const char *ifname)
9119d9
 }
9119d9
 #elif defined(SIOCIFCREATE2) && defined(SIOCIFDESTROY) && defined(IF_MAXUNIT)
9119d9
 int virNetDevTapCreate(char **ifname,
9119d9
+                       const char *tunpath ATTRIBUTE_UNUSED,
9119d9
                        int *tapfd,
9119d9
                        int tapfdSize,
9119d9
                        unsigned int flags ATTRIBUTE_UNUSED)
9119d9
@@ -444,7 +456,8 @@ int virNetDevTapCreate(char **ifname,
9119d9
     return ret;
9119d9
 }
9119d9
 
9119d9
-int virNetDevTapDelete(const char *ifname)
9119d9
+int virNetDevTapDelete(const char *ifname,
9119d9
+                       const char *tunpath ATTRIBUTE_UNUSED)
9119d9
 {
9119d9
     int s;
9119d9
     struct ifreq ifr;
9119d9
@@ -468,6 +481,7 @@ int virNetDevTapDelete(const char *ifname)
9119d9
 
9119d9
 #else
9119d9
 int virNetDevTapCreate(char **ifname ATTRIBUTE_UNUSED,
9119d9
+                       const char *tunpath ATTRIBUTE_UNUSED,
9119d9
                        int *tapfd ATTRIBUTE_UNUSED,
9119d9
                        int tapfdSize ATTRIBUTE_UNUSED,
9119d9
                        unsigned int flags ATTRIBUTE_UNUSED)
9119d9
@@ -476,7 +490,8 @@ int virNetDevTapCreate(char **ifname ATTRIBUTE_UNUSED,
9119d9
                          _("Unable to create TAP devices on this platform"));
9119d9
     return -1;
9119d9
 }
9119d9
-int virNetDevTapDelete(const char *ifname ATTRIBUTE_UNUSED)
9119d9
+int virNetDevTapDelete(const char *ifname ATTRIBUTE_UNUSED,
9119d9
+                       const char *tunpath ATTRIBUTE_UNUSED)
9119d9
 {
9119d9
     virReportSystemError(ENOSYS, "%s",
9119d9
                          _("Unable to delete TAP devices on this platform"));
9119d9
@@ -490,6 +505,7 @@ int virNetDevTapDelete(const char *ifname ATTRIBUTE_UNUSED)
9119d9
  * @brname: the bridge name
9119d9
  * @ifname: the interface name (or name template)
9119d9
  * @macaddr: desired MAC address
9119d9
+ * @tunpath: path to the tun device (if NULL, /dev/net/tun is used)
9119d9
  * @tapfd: array of file descriptor return value for the new tap device
9119d9
  * @tapfdSize: number of file descriptors in @tapfd
9119d9
  * @virtPortProfile: bridge/port specific configuration
9119d9
@@ -518,6 +534,7 @@ int virNetDevTapCreateInBridgePort(const char *brname,
9119d9
                                    char **ifname,
9119d9
                                    const virMacAddr *macaddr,
9119d9
                                    const unsigned char *vmuuid,
9119d9
+                                   const char *tunpath,
9119d9
                                    int *tapfd,
9119d9
                                    int tapfdSize,
9119d9
                                    virNetDevVPortProfilePtr virtPortProfile,
9119d9
@@ -528,7 +545,7 @@ int virNetDevTapCreateInBridgePort(const char *brname,
9119d9
     char macaddrstr[VIR_MAC_STRING_BUFLEN];
9119d9
     size_t i;
9119d9
 
9119d9
-    if (virNetDevTapCreate(ifname, tapfd, tapfdSize, flags) < 0)
9119d9
+    if (virNetDevTapCreate(ifname, tunpath, tapfd, tapfdSize, flags) < 0)
9119d9
         return -1;
9119d9
 
9119d9
     /* We need to set the interface MAC before adding it
9119d9
diff --git a/src/util/virnetdevtap.h b/src/util/virnetdevtap.h
9119d9
index 03fb5f8..c0a4e15 100644
9119d9
--- a/src/util/virnetdevtap.h
9119d9
+++ b/src/util/virnetdevtap.h
9119d9
@@ -34,12 +34,14 @@
9119d9
 # endif
9119d9
 
9119d9
 int virNetDevTapCreate(char **ifname,
9119d9
+                       const char *tunpath,
9119d9
                        int *tapfd,
9119d9
                        int tapfdSize,
9119d9
                        unsigned int flags)
9119d9
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
9119d9
 
9119d9
-int virNetDevTapDelete(const char *ifname)
9119d9
+int virNetDevTapDelete(const char *ifname,
9119d9
+                       const char *tunpath)
9119d9
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
9119d9
 
9119d9
 int virNetDevTapGetName(int tapfd, char **ifname)
9119d9
@@ -64,6 +66,7 @@ int virNetDevTapCreateInBridgePort(const char *brname,
9119d9
                                    char **ifname,
9119d9
                                    const virMacAddr *macaddr,
9119d9
                                    const unsigned char *vmuuid,
9119d9
+                                   const char *tunpath,
9119d9
                                    int *tapfd,
9119d9
                                    int tapfdSize,
9119d9
                                    virNetDevVPortProfilePtr virtPortProfile,
9119d9
-- 
9119d9
2.1.0
9119d9