summaryrefslogtreecommitdiff
path: root/net/tap-linux.c
diff options
context:
space:
mode:
authorMark McLoughlin <markmc@redhat.com>2009-10-22 17:49:15 +0100
committerAnthony Liguori <aliguori@us.ibm.com>2009-10-30 08:39:28 -0500
commit1faac1f7d48d3f7bfa2d168b1ad5680d3288f585 (patch)
tree0b22b4e1f779608f3917bea94a3a09d5a38096ef /net/tap-linux.c
parentdc69004c7d89afb6ede02ca9379075c062c0c091 (diff)
downloadqemu-1faac1f7d48d3f7bfa2d168b1ad5680d3288f585.tar.gz
net: move tap_set_offload() code into tap-linux.c
TUNSETOFFLOAD is only available on Linux Signed-off-by: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'net/tap-linux.c')
-rw-r--r--net/tap-linux.c26
1 files changed, 26 insertions, 0 deletions
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));
+ }
+ }
+}