summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2016-03-20 16:33:40 -0400
committerDavid S. Miller <davem@davemloft.net>2016-03-20 16:33:40 -0400
commit4320f21935534dad44e8d112fc085d13c29e7f66 (patch)
treea00832901f84e7d6eeb773061e8d0746da323bd8 /include
parent659e0bcaebc4ca36e64eac6e9f39c1904b17472c (diff)
parenta09a4c8dd1ec7f830e1fb9e59eb72bddc965d168 (diff)
Merge branch 'tunnel-fixes'
Jesse Gross says: ==================== Tunneling fixes This series fixes a problem that was reported where encapsulated packets do not have their encapsulation offload markers stripped off when being decapsulated. This causes a significant performance drop if the packets are later retransmitted. Fixing this revealed two other bugs which are also addressed as prerequisites: * GRO can aggregate packets for multiple layers of encapsulation which the stack cannot properly handle. * IPIP packets which are combined by GRO are not marked properly with their GSO type. Note that this is based off the net-next tree as the current target for bug fixes. v2: No code changes, just additional information in commit messages and a new cover letter. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r--include/linux/netdevice.h4
-rw-r--r--include/net/ip_tunnels.h16
2 files changed, 18 insertions, 2 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index be693b34662f..f9eebd518545 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2096,8 +2096,8 @@ struct napi_gro_cb {
/* This is non-zero if the packet may be of the same flow. */
u8 same_flow:1;
- /* Used in udp_gro_receive */
- u8 udp_mark:1;
+ /* Used in tunnel GRO receive */
+ u8 encap_mark:1;
/* GRO checksum is valid */
u8 csum_valid:1;
diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h
index c35dda9ec991..56050f913339 100644
--- a/include/net/ip_tunnels.h
+++ b/include/net/ip_tunnels.h
@@ -305,6 +305,22 @@ struct metadata_dst *iptunnel_metadata_reply(struct metadata_dst *md,
struct sk_buff *iptunnel_handle_offloads(struct sk_buff *skb, int gso_type_mask);
+static inline int iptunnel_pull_offloads(struct sk_buff *skb)
+{
+ if (skb_is_gso(skb)) {
+ int err;
+
+ err = skb_unclone(skb, GFP_ATOMIC);
+ if (unlikely(err))
+ return err;
+ skb_shinfo(skb)->gso_type &= ~(NETIF_F_GSO_ENCAP_ALL >>
+ NETIF_F_GSO_SHIFT);
+ }
+
+ skb->encapsulation = 0;
+ return 0;
+}
+
static inline void iptunnel_xmit_stats(struct net_device *dev, int pkt_len)
{
if (pkt_len > 0) {