[PATCH v3 12/19] net/tap: net_init_bridge(): support tap

Vladimir Sementsov-Ogievskiy posted 19 patches 3 days, 1 hour ago
[PATCH v3 12/19] net/tap: net_init_bridge(): support tap
Posted by Vladimir Sementsov-Ogievskiy 3 days, 1 hour ago
Support tap in net_init_bridge() and reuse it for corresponding
case in net_init_tap().

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
Tested-by: Lei Yang <leiyang@redhat.com>
---
 net/tap.c | 47 +++++++++++++++++------------------------------
 1 file changed, 17 insertions(+), 30 deletions(-)

diff --git a/net/tap.c b/net/tap.c
index 01f9277211..79225fb233 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -618,16 +618,24 @@ static int net_bridge_run_helper(const char *helper, const char *bridge,
 int net_init_bridge(const Netdev *netdev, const char *name,
                     NetClientState *peer, Error **errp)
 {
-    const NetdevBridgeOptions *bridge;
+    const NetdevTapOptions *tap = NULL;
+    const NetdevBridgeOptions *bridge = NULL;
     const char *helper, *br;
     int fd, vnet_hdr, ret;
 
-    assert(netdev->type == NET_CLIENT_DRIVER_BRIDGE);
-    bridge = &netdev->u.bridge;
-    helper = bridge->helper;
-    br     = bridge->br ?: DEFAULT_BRIDGE_INTERFACE;
+    if (netdev->type == NET_CLIENT_DRIVER_BRIDGE) {
+        bridge = &netdev->u.bridge;
+        helper = bridge->helper;
+        br = bridge->br;
+    } else {
+        assert(netdev->type == NET_CLIENT_DRIVER_TAP);
+
+        tap = &netdev->u.tap;
+        helper = tap->helper;
+        br = tap->br;
+    }
 
-    fd = net_bridge_run_helper(helper, br, errp);
+    fd = net_bridge_run_helper(helper, br ?: DEFAULT_BRIDGE_INTERFACE, errp);
     if (fd == -1) {
         return -1;
     }
@@ -643,7 +651,8 @@ int net_init_bridge(const Netdev *netdev, const char *name,
 
     ret = net_init_tap_one(netdev, peer, "bridge", name,
                            NULL, NULL, NULL,
-                           NULL, vnet_hdr, fd, errp);
+                           tap ? tap->vhostfd : NULL,
+                           vnet_hdr, fd, errp);
     if (ret < 0) {
         close(fd);
         return -1;
@@ -897,29 +906,7 @@ int net_init_tap(const Netdev *netdev, const char *name,
             return -1;
         }
 
-        fd = net_bridge_run_helper(tap->helper,
-                                   tap->br ?: DEFAULT_BRIDGE_INTERFACE,
-                                   errp);
-        if (fd == -1) {
-            return -1;
-        }
-
-        if (!qemu_set_blocking(fd, false, errp)) {
-            return -1;
-        }
-        vnet_hdr = tap_probe_vnet_hdr(fd, errp);
-        if (vnet_hdr < 0) {
-            close(fd);
-            return -1;
-        }
-
-        ret = net_init_tap_one(netdev, peer, "bridge", name, NULL,
-                               NULL, NULL, tap->vhostfd,
-                               vnet_hdr, fd, errp);
-        if (ret < 0) {
-            close(fd);
-            return -1;
-        }
+        return net_init_bridge(netdev, name, peer, errp);
     } else {
         const char *script = tap->script;
         const char *downscript = tap->downscript;
-- 
2.48.1