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: Andrew Melnychenko <andrew@daynix.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b22bbdd17a
commit
399e082764
|
@ -957,6 +957,10 @@ static int set_offload(struct tap_queue *q, unsigned long arg)
|
|||
if (arg & TUN_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
|
||||
|
@ -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
|
||||
* 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;
|
||||
else
|
||||
features &= ~RX_OFFLOADS;
|
||||
|
@ -1091,7 +1096,8 @@ static long tap_ioctl(struct file *file, unsigned int cmd,
|
|||
case TUNSETOFFLOAD:
|
||||
/* let the user check for future flags */
|
||||
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;
|
||||
|
||||
rtnl_lock();
|
||||
|
|
|
@ -185,7 +185,7 @@ struct tun_struct {
|
|||
struct net_device *dev;
|
||||
netdev_features_t set_features;
|
||||
#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 vnet_hdr_sz;
|
||||
|
@ -2878,6 +2878,12 @@ static int set_offload(struct tun_struct *tun, unsigned long arg)
|
|||
}
|
||||
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue