Commit 399e0827 authored by Andrew Melnychenko's avatar Andrew Melnychenko Committed by David S. Miller

driver/net/tun: Added features for USO.

Added support for USO4 and USO6.
For now, to "enable" USO, it's required to set both USO4 and USO6 simultaneously.
USO enables NETIF_F_GSO_UDP_L4.
Signed-off-by: default avatarAndrew Melnychenko <andrew@daynix.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b22bbdd1
...@@ -957,6 +957,10 @@ static int set_offload(struct tap_queue *q, unsigned long arg) ...@@ -957,6 +957,10 @@ static int set_offload(struct tap_queue *q, unsigned long arg)
if (arg & TUN_F_TSO6) if (arg & TUN_F_TSO6)
feature_mask |= NETIF_F_TSO6; feature_mask |= NETIF_F_TSO6;
} }
/* TODO: for now USO4 and USO6 should work simultaneously */
if ((arg & (TUN_F_USO4 | TUN_F_USO6)) == (TUN_F_USO4 | TUN_F_USO6))
features |= NETIF_F_GSO_UDP_L4;
} }
/* tun/tap driver inverts the usage for TSO offloads, where /* tun/tap driver inverts the usage for TSO offloads, where
...@@ -967,7 +971,8 @@ static int set_offload(struct tap_queue *q, unsigned long arg) ...@@ -967,7 +971,8 @@ static int set_offload(struct tap_queue *q, unsigned long arg)
* When user space turns off TSO, we turn off GSO/LRO so that * When user space turns off TSO, we turn off GSO/LRO so that
* user-space will not receive TSO frames. * user-space will not receive TSO frames.
*/ */
if (feature_mask & (NETIF_F_TSO | NETIF_F_TSO6)) if (feature_mask & (NETIF_F_TSO | NETIF_F_TSO6) ||
(feature_mask & (TUN_F_USO4 | TUN_F_USO6)) == (TUN_F_USO4 | TUN_F_USO6))
features |= RX_OFFLOADS; features |= RX_OFFLOADS;
else else
features &= ~RX_OFFLOADS; features &= ~RX_OFFLOADS;
...@@ -1091,7 +1096,8 @@ static long tap_ioctl(struct file *file, unsigned int cmd, ...@@ -1091,7 +1096,8 @@ static long tap_ioctl(struct file *file, unsigned int cmd,
case TUNSETOFFLOAD: case TUNSETOFFLOAD:
/* let the user check for future flags */ /* let the user check for future flags */
if (arg & ~(TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 | if (arg & ~(TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 |
TUN_F_TSO_ECN | TUN_F_UFO)) TUN_F_TSO_ECN | TUN_F_UFO |
TUN_F_USO4 | TUN_F_USO6))
return -EINVAL; return -EINVAL;
rtnl_lock(); rtnl_lock();
......
...@@ -185,7 +185,7 @@ struct tun_struct { ...@@ -185,7 +185,7 @@ struct tun_struct {
struct net_device *dev; struct net_device *dev;
netdev_features_t set_features; netdev_features_t set_features;
#define TUN_USER_FEATURES (NETIF_F_HW_CSUM|NETIF_F_TSO_ECN|NETIF_F_TSO| \ #define TUN_USER_FEATURES (NETIF_F_HW_CSUM|NETIF_F_TSO_ECN|NETIF_F_TSO| \
NETIF_F_TSO6) NETIF_F_TSO6 | NETIF_F_GSO_UDP_L4)
int align; int align;
int vnet_hdr_sz; int vnet_hdr_sz;
...@@ -2878,6 +2878,12 @@ static int set_offload(struct tun_struct *tun, unsigned long arg) ...@@ -2878,6 +2878,12 @@ static int set_offload(struct tun_struct *tun, unsigned long arg)
} }
arg &= ~TUN_F_UFO; arg &= ~TUN_F_UFO;
/* TODO: for now USO4 and USO6 should work simultaneously */
if (arg & TUN_F_USO4 && arg & TUN_F_USO6) {
features |= NETIF_F_GSO_UDP_L4;
arg &= ~(TUN_F_USO4 | TUN_F_USO6);
}
} }
/* This gives the user a way to test for new features in future by /* This gives the user a way to test for new features in future by
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment