aboutsummaryrefslogtreecommitdiff
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.c26
-rw-r--r--net/tap-solaris.c5
-rw-r--r--net/tap.c21
-rw-r--r--net/tap.h1
6 files changed, 43 insertions, 20 deletions
diff --git a/net/tap-aix.c b/net/tap-aix.c
index 27143ff36b..0de3dd9de3 100644
--- a/net/tap-aix.c
+++ b/net/tap-aix.c
@@ -40,3 +40,8 @@ int tap_probe_vnet_hdr(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 1cdde90009..1e85a3c22d 100644
--- a/net/tap-bsd.c
+++ b/net/tap-bsd.c
@@ -70,3 +70,8 @@ int tap_probe_vnet_hdr(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 0059404069..b6f1fad5e4 100644
--- a/net/tap-linux.c
+++ b/net/tap-linux.c
@@ -111,3 +111,29 @@ int tap_probe_vnet_hdr(int fd)
return ifr.ifr_flags & IFF_VNET_HDR;
}
+
+void tap_fd_set_offload(int fd, int csum, int tso4,
+ int tso6, int ecn, int ufo)
+{
+ unsigned int offload = 0;
+
+ if (csum) {
+ offload |= TUN_F_CSUM;
+ if (tso4)
+ offload |= TUN_F_TSO4;
+ if (tso6)
+ offload |= TUN_F_TSO6;
+ if ((tso4 || tso6) && ecn)
+ offload |= TUN_F_TSO_ECN;
+ if (ufo)
+ offload |= TUN_F_UFO;
+ }
+
+ if (ioctl(fd, TUNSETOFFLOAD, offload) != 0) {
+ offload &= ~TUN_F_UFO;
+ if (ioctl(fd, TUNSETOFFLOAD, offload) != 0) {
+ fprintf(stderr, "TUNSETOFFLOAD ioctl() failed: %s\n",
+ strerror(errno));
+ }
+ }
+}
diff --git a/net/tap-solaris.c b/net/tap-solaris.c
index 3f48e57328..614df01810 100644
--- a/net/tap-solaris.c
+++ b/net/tap-solaris.c
@@ -193,3 +193,8 @@ int tap_probe_vnet_hdr(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 3f6722ea6c..9b110716e6 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -243,27 +243,8 @@ void tap_set_offload(VLANClientState *vc, int csum, int tso4,
int tso6, int ecn, int ufo)
{
TAPState *s = vc->opaque;
- unsigned int offload = 0;
-
- if (csum) {
- offload |= TUN_F_CSUM;
- if (tso4)
- offload |= TUN_F_TSO4;
- if (tso6)
- offload |= TUN_F_TSO6;
- if ((tso4 || tso6) && ecn)
- offload |= TUN_F_TSO_ECN;
- if (ufo)
- offload |= TUN_F_UFO;
- }
- if (ioctl(s->fd, TUNSETOFFLOAD, offload) != 0) {
- offload &= ~TUN_F_UFO;
- if (ioctl(s->fd, TUNSETOFFLOAD, offload) != 0) {
- fprintf(stderr, "TUNSETOFFLOAD ioctl() failed: %s\n",
- strerror(errno));
- }
- }
+ return tap_fd_set_offload(s->fd, csum, tso4, tso6, ecn, ufo);
}
static void tap_cleanup(VLANClientState *vc)
diff --git a/net/tap.h b/net/tap.h
index de729a79db..16398b5f4d 100644
--- a/net/tap.h
+++ b/net/tap.h
@@ -45,5 +45,6 @@ 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);
+void tap_fd_set_offload(int fd, int csum, int tso4, int tso6, int ecn, int ufo);
#endif /* QEMU_NET_TAP_H */