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 | 39 +++++++++++++++++++++++++--------------
1 file changed, 25 insertions(+), 14 deletions(-)
diff --git a/net/tap.c b/net/tap.c
index 5a74cb325f..877564405a 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);
@@ -709,11 +713,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);
@@ -732,6 +731,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;
@@ -747,20 +761,20 @@ 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 (!qemu_set_blocking(vhostfd, false, errp)) {
- goto failed;
+ 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 (!qemu_set_blocking(vhostfd, false, errp)) {
- goto failed;
+ return false;
}
}
options.opaque = (void *)(uintptr_t)vhostfd;
@@ -775,14 +789,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