summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--net/tap-aix.c5
-rw-r--r--net/tap-bsd.c5
-rw-r--r--net/tap-linux.c12
-rw-r--r--net/tap-solaris.c5
-rw-r--r--net/tap.c7
-rw-r--r--net/tap.h1
6 files changed, 29 insertions, 6 deletions
diff --git a/net/tap-aix.c b/net/tap-aix.c
index 0de3dd9de3..4bc9f2f6d2 100644
--- a/net/tap-aix.c
+++ b/net/tap-aix.c
@@ -41,6 +41,11 @@ int tap_probe_vnet_hdr(int fd)
return 0;
}
+int tap_probe_has_ufo(int fd)
+{
+ return 0;
+}
+
void tap_fd_set_offload(int fd, int csum, int tso4,
int tso6, int ecn, int ufo)
{
diff --git a/net/tap-bsd.c b/net/tap-bsd.c
index 1e85a3c22d..3ad14bb2c8 100644
--- a/net/tap-bsd.c
+++ b/net/tap-bsd.c
@@ -71,6 +71,11 @@ int tap_probe_vnet_hdr(int fd)
return 0;
}
+int tap_probe_has_ufo(int fd)
+{
+ return 0;
+}
+
void tap_fd_set_offload(int fd, int csum, int tso4,
int tso6, int ecn, int ufo)
{
diff --git a/net/tap-linux.c b/net/tap-linux.c
index b6f1fad5e4..0f621a2315 100644
--- a/net/tap-linux.c
+++ b/net/tap-linux.c
@@ -112,6 +112,18 @@ int tap_probe_vnet_hdr(int fd)
return ifr.ifr_flags & IFF_VNET_HDR;
}
+int tap_probe_has_ufo(int fd)
+{
+ unsigned offload;
+
+ offload = TUN_F_CSUM | TUN_F_UFO;
+
+ if (ioctl(fd, TUNSETOFFLOAD, offload) < 0)
+ return 0;
+
+ return 1;
+}
+
void tap_fd_set_offload(int fd, int csum, int tso4,
int tso6, int ecn, int ufo)
{
diff --git a/net/tap-solaris.c b/net/tap-solaris.c
index 614df01810..ef4e60c878 100644
--- a/net/tap-solaris.c
+++ b/net/tap-solaris.c
@@ -194,6 +194,11 @@ int tap_probe_vnet_hdr(int fd)
return 0;
}
+int tap_probe_has_ufo(int fd)
+{
+ return 0;
+}
+
void tap_fd_set_offload(int fd, int csum, int tso4,
int tso6, int ecn, int ufo)
{
diff --git a/net/tap.c b/net/tap.c
index 9b110716e6..60354e47a9 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -271,7 +271,6 @@ static TAPState *net_tap_fd_init(VLANState *vlan,
int vnet_hdr)
{
TAPState *s;
- unsigned int offload;
s = qemu_mallocz(sizeof(TAPState));
s->fd = fd;
@@ -281,11 +280,7 @@ static TAPState *net_tap_fd_init(VLANState *vlan,
vlan, NULL, model, name, NULL,
tap_receive, tap_receive_raw,
tap_receive_iov, tap_cleanup, s);
- s->has_ufo = 0;
- /* Check if tap supports UFO */
- offload = TUN_F_CSUM | TUN_F_UFO;
- if (ioctl(s->fd, TUNSETOFFLOAD, offload) == 0)
- s->has_ufo = 1;
+ s->has_ufo = tap_probe_has_ufo(s->fd);
tap_set_offload(s->vc, 0, 0, 0, 0, 0);
tap_read_poll(s, 1);
return s;
diff --git a/net/tap.h b/net/tap.h
index 16398b5f4d..538a562720 100644
--- a/net/tap.h
+++ b/net/tap.h
@@ -45,6 +45,7 @@ void tap_set_offload(VLANClientState *vc, int csum, int tso4, int tso6, int ecn,
int tap_set_sndbuf(int fd, QemuOpts *opts);
int tap_probe_vnet_hdr(int fd);
+int tap_probe_has_ufo(int fd);
void tap_fd_set_offload(int fd, int csum, int tso4, int tso6, int ecn, int ufo);
#endif /* QEMU_NET_TAP_H */