GSO: Add GSO type for fixed IPv4 ID
This patch adds support for TSO using IPv4 headers with a fixed IP ID field. This is meant to allow us to do a lossless GRO in the case of TCP flows that use a fixed IP ID such as those that convert IPv6 header to IPv4 headers. In addition I am adding a feature that for now I am referring to TSO with IP ID mangling. Basically when this flag is enabled the device has the option to either output the flow with incrementing IP IDs or with a fixed IP ID regardless of what the original IP ID ordering was. This is useful in cases where the DF bit is set and we do not care if the original IP ID value is maintained. Signed-off-by: Alexander Duyck <aduyck@mirantis.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
518f213ddd
commit
cbc53e08a7
@ -2825,14 +2825,36 @@ static netdev_features_t dflt_features_check(const struct sk_buff *skb,
|
||||
return vlan_features_check(skb, features);
|
||||
}
|
||||
|
||||
static netdev_features_t gso_features_check(const struct sk_buff *skb,
|
||||
struct net_device *dev,
|
||||
netdev_features_t features)
|
||||
{
|
||||
u16 gso_segs = skb_shinfo(skb)->gso_segs;
|
||||
|
||||
if (gso_segs > dev->gso_max_segs)
|
||||
return features & ~NETIF_F_GSO_MASK;
|
||||
|
||||
/* Make sure to clear the IPv4 ID mangling feature if
|
||||
* the IPv4 header has the potential to be fragmented.
|
||||
*/
|
||||
if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4) {
|
||||
struct iphdr *iph = skb->encapsulation ?
|
||||
inner_ip_hdr(skb) : ip_hdr(skb);
|
||||
|
||||
if (!(iph->frag_off & htons(IP_DF)))
|
||||
features &= ~NETIF_F_TSO_MANGLEID;
|
||||
}
|
||||
|
||||
return features;
|
||||
}
|
||||
|
||||
netdev_features_t netif_skb_features(struct sk_buff *skb)
|
||||
{
|
||||
struct net_device *dev = skb->dev;
|
||||
netdev_features_t features = dev->features;
|
||||
u16 gso_segs = skb_shinfo(skb)->gso_segs;
|
||||
|
||||
if (gso_segs > dev->gso_max_segs)
|
||||
features &= ~NETIF_F_GSO_MASK;
|
||||
if (skb_is_gso(skb))
|
||||
features = gso_features_check(skb, dev, features);
|
||||
|
||||
/* If encapsulation offload request, verify we are testing
|
||||
* hardware encapsulation features instead of standard
|
||||
@ -6976,9 +6998,11 @@ int register_netdevice(struct net_device *dev)
|
||||
dev->features |= NETIF_F_SOFT_FEATURES;
|
||||
dev->wanted_features = dev->features & dev->hw_features;
|
||||
|
||||
if (!(dev->flags & IFF_LOOPBACK)) {
|
||||
if (!(dev->flags & IFF_LOOPBACK))
|
||||
dev->hw_features |= NETIF_F_NOCACHE_COPY;
|
||||
}
|
||||
|
||||
if (dev->hw_features & NETIF_F_TSO)
|
||||
dev->hw_features |= NETIF_F_TSO_MANGLEID;
|
||||
|
||||
/* Make NETIF_F_HIGHDMA inheritable to VLAN devices.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user