Patchwork [15/15] net: move UFO support detection to tap-linux.c

login
register
mail settings
Submitter Mark McLoughlin
Date Oct. 22, 2009, 4:49 p.m.
Message ID <1256230156-29652-16-git-send-email-markmc@redhat.com>
Download mbox | patch
Permalink /patch/36733/
State New
Headers show

Comments

Mark McLoughlin - Oct. 22, 2009, 4:49 p.m.
Only supported on Linux

Signed-off-by: Mark McLoughlin <markmc@redhat.com>
---
 net/tap-aix.c     |    5 +++++
 net/tap-bsd.c     |    5 +++++
 net/tap-linux.c   |   12 ++++++++++++
 net/tap-solaris.c |    5 +++++
 net/tap.c         |    7 +------
 net/tap.h         |    1 +
 6 files changed, 29 insertions(+), 6 deletions(-)

Patch

diff --git a/net/tap-aix.c b/net/tap-aix.c
index 0de3dd9..4bc9f2f 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 1e85a3c..3ad14bb 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 b6f1fad..0f621a2 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 614df01..ef4e60c 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 9b11071..60354e4 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 16398b5..538a562 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 */