Add helper that covers logic for initializing fds, given from monitor
or helper.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
Tested-by: Lei Yang <leiyang@redhat.com>
---
net/tap.c | 89 ++++++++++++++++++++++---------------------------------
1 file changed, 36 insertions(+), 53 deletions(-)
diff --git a/net/tap.c b/net/tap.c
index faee5cbeb3..4da3f36b31 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -615,13 +615,40 @@ static int net_bridge_run_helper(const char *helper, const char *bridge,
}
}
+static int net_tap_fd_init_external(const Netdev *netdev, NetClientState *peer,
+ const char *model, const char *name,
+ const char *vhostfdname,
+ int *pvnet_hdr, int fd, Error **errp)
+{
+ int vnet_hdr;
+
+ if (!qemu_set_blocking(fd, false, errp)) {
+ return -1;
+ }
+
+ vnet_hdr = tap_probe_vnet_hdr(fd, errp);
+ if (pvnet_hdr) {
+ if (*pvnet_hdr < 0) {
+ *pvnet_hdr = vnet_hdr;
+ } else if (vnet_hdr != *pvnet_hdr) {
+ error_setg(errp,
+ "vnet_hdr not consistent across given tap fds");
+ return -1;
+ }
+ }
+
+ return net_init_tap_one(netdev, peer, model, name,
+ NULL, NULL, NULL,
+ vhostfdname, vnet_hdr, fd, errp);
+}
+
int net_init_bridge(const Netdev *netdev, const char *name,
NetClientState *peer, Error **errp)
{
const NetdevTapOptions *tap = NULL;
const NetdevBridgeOptions *bridge = NULL;
const char *helper, *br;
- int fd, vnet_hdr, ret;
+ int fd;
if (netdev->type == NET_CLIENT_DRIVER_BRIDGE) {
bridge = &netdev->u.bridge;
@@ -640,25 +667,8 @@ int net_init_bridge(const Netdev *netdev, const char *name,
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 ? tap->vhostfd : NULL,
- vnet_hdr, fd, errp);
- if (ret < 0) {
- close(fd);
- return -1;
- }
-
- return 0;
+ return net_tap_fd_init_external(netdev, peer, "bridge", name,
+ tap ? tap->vhostfd : NULL, NULL, fd, errp);
}
static int net_tap_open_one(const Netdev *netdev,
@@ -889,20 +899,8 @@ int net_init_tap(const Netdev *netdev, const char *name,
return -1;
}
- if (!qemu_set_blocking(fd, false, errp)) {
- close(fd);
- return -1;
- }
-
- vnet_hdr = tap_probe_vnet_hdr(fd, errp);
- if (vnet_hdr < 0) {
- close(fd);
- return -1;
- }
-
- return net_init_tap_one(netdev, peer, "tap", name, NULL,
- NULL, NULL,
- tap->vhostfd, vnet_hdr, fd, errp);
+ return net_tap_fd_init_external(netdev, peer, "tap", name,
+ tap->vhostfd, NULL, fd, errp);
} else if (tap->fds) {
g_auto(GStrv) fds = NULL;
g_auto(GStrv) vhost_fds = NULL;
@@ -925,31 +923,16 @@ int net_init_tap(const Netdev *netdev, const char *name,
}
}
+ vnet_hdr = -1;
for (i = 0; i < nfds; i++) {
fd = monitor_fd_param(monitor_cur(), fds[i], errp);
if (fd == -1) {
return -1;
}
- if (!qemu_set_blocking(fd, false, errp)) {
- return -1;
- }
-
- if (i == 0) {
- vnet_hdr = tap_probe_vnet_hdr(fd, errp);
- if (vnet_hdr < 0) {
- return -1;
- }
- } else if (vnet_hdr != tap_probe_vnet_hdr(fd, NULL)) {
- error_setg(errp,
- "vnet_hdr not consistent across given tap fds");
- return -1;
- }
-
- ret = net_init_tap_one(netdev, peer, "tap", name, NULL,
- NULL, NULL,
- vhost_fds ? vhost_fds[i] : NULL,
- vnet_hdr, fd, errp);
+ ret = net_tap_fd_init_external(netdev, peer, "tap", name,
+ vhost_fds ? vhost_fds[i] : NULL,
+ &vnet_hdr, fd, errp);
if (ret < 0) {
return -1;
}
--
2.48.1