Re: [PATCH] net-gre-gro: Fix a bug that breaks the forwarding path
From: Or Gerlitz <hidden>
Date: 2014-02-27 22:25:46
On Thu, Feb 27, 2014 at 11:26 PM, H.K. Jerry Chu [off-list ref] wrote:
quoted hunk ↗ jump to hunk
From: Jerry Chu <redacted> I stumbled across a bug that was introduced by my own GRE-GRO patch (bf5a755f5e9186406bbf50f4087100af5bd68e40 net-gre-gro: Add GRE support to the GRO stack) submitted a while back that breaks the forwarding path because various GSO related fields were not set. This will cause on the egress path either the GSO code to fail, or a GRE-TSO capable (NETIF_F_GSO_GRE) NICs to choke. The following fix has been tested for both cases. Signed-off-by: H.K. Jerry Chu <redacted> --- net/core/dev.c | 2 ++ net/ipv4/af_inet.c | 3 +++ net/ipv4/gre_offload.c | 3 +++ net/ipv4/tcp_offload.c | 2 +- net/ipv6/tcpv6_offload.c | 2 +- 5 files changed, 10 insertions(+), 2 deletions(-)diff --git a/net/core/dev.c b/net/core/dev.c index b1b0c8d..75517d8 100644 --- a/net/core/dev.c +++ b/net/core/dev.c@@ -4045,6 +4045,8 @@ static void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb) skb->vlan_tci = 0; skb->dev = napi->dev; skb->skb_iif = 0; + skb->encapsulation = 0; + skb_shinfo(skb)->gso_type = 0; napi->skb = skb; }diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index ecd2c3f..68229ca 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c@@ -1431,6 +1431,9 @@ static int inet_gro_complete(struct sk_buff *skb, int nhoff) int proto = iph->protocol; int err = -ENOSYS; + if (skb->encapsulation) + skb_set_inner_network_header(skb, nhoff); +
Note that packets (e.g those who are UDP encapsulated) will pass here twice, once for the external IP header and once for the internal, so if the driver marks the encapsulation sign the inner header setting will happen twice, is that what we want?
csum_replace2(&iph->check, iph->tot_len, newlen);
iph->tot_len = newlen;