Move most of net_init_tap_one() to net_tap_setup() - future pair
for net_tap_new(), for postponed setup.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
---
net/tap.c | 43 +++++++++++++++++++++++++++----------------
1 file changed, 27 insertions(+), 16 deletions(-)
diff --git a/net/tap.c b/net/tap.c
index 87d851203b..b4682d7400 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -85,6 +85,10 @@ typedef struct TAPState {
int sndbuf;
} TAPState;
+static bool net_tap_setup(TAPState *s, const NetdevTapOptions *tap,
+ const char *vhostfdname,
+ int fd, int vnet_hdr, Error **errp);
+
static void launch_script(const char *setup_script, const char *ifname,
int fd, Error **errp);
@@ -697,11 +701,6 @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
int vnet_hdr, int fd, Error **errp)
{
TAPState *s = net_tap_new(peer, model, name, tap);
- int vhostfd;
-
- if (!net_tap_set_fd(s, fd, vnet_hdr, errp)) {
- goto failed;
- }
if (tap->fd || tap->fds) {
qemu_set_info_str(&s->nc, "fd=%d", fd);
@@ -720,6 +719,21 @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
}
}
+ if (!net_tap_setup(s, tap, vhostfdname, fd, vnet_hdr, errp)) {
+ qemu_del_net_client(&s->nc);
+ }
+}
+
+static bool net_tap_setup(TAPState *s, const NetdevTapOptions *tap,
+ const char *vhostfdname,
+ int fd, int vnet_hdr, Error **errp)
+{
+ int vhostfd;
+
+ if (!net_tap_set_fd(s, fd, vnet_hdr, errp)) {
+ return false;
+ }
+
if (tap->has_vhost ? tap->vhost :
vhostfdname || (tap->has_vhostforce && tap->vhostforce)) {
VhostNetOptions options;
@@ -735,23 +749,23 @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
if (vhostfdname) {
vhostfd = monitor_fd_param(monitor_cur(), vhostfdname, errp);
if (vhostfd == -1) {
- goto failed;
+ return false;
}
if (!g_unix_set_fd_nonblocking(vhostfd, true, NULL)) {
- error_setg_errno(errp, errno, "%s: Can't use file descriptor %d",
- name, fd);
- goto failed;
+ error_setg_errno(errp, errno, "Can't use file descriptor %d",
+ fd);
+ return false;
}
} else {
vhostfd = open("/dev/vhost-net", O_RDWR);
if (vhostfd < 0) {
error_setg_errno(errp, errno,
"tap: open vhost char device failed");
- goto failed;
+ return false;
}
if (!g_unix_set_fd_nonblocking(vhostfd, true, NULL)) {
error_setg_errno(errp, errno, "Failed to set FD nonblocking");
- goto failed;
+ return false;
}
}
options.opaque = (void *)(uintptr_t)vhostfd;
@@ -766,14 +780,11 @@ static void net_init_tap_one(const NetdevTapOptions *tap, NetClientState *peer,
if (!s->vhost_net) {
error_setg(errp,
"vhost-net requested but could not be initialized");
- goto failed;
+ return false;
}
}
- return;
-
-failed:
- qemu_del_net_client(&s->nc);
+ return true;
}
static int get_fds(char *str, char *fds[], int max)
--
2.48.1