From patchwork Mon Jul 14 22:54:46 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerry Chu X-Patchwork-Id: 369781 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id DFA8D140097 for ; Tue, 15 Jul 2014 08:54:57 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757061AbaGNWyy (ORCPT ); Mon, 14 Jul 2014 18:54:54 -0400 Received: from mail-ie0-f202.google.com ([209.85.223.202]:37524 "EHLO mail-ie0-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757021AbaGNWyw (ORCPT ); Mon, 14 Jul 2014 18:54:52 -0400 Received: by mail-ie0-f202.google.com with SMTP id rl12so478681iec.3 for ; Mon, 14 Jul 2014 15:54:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=t8+FidzFv438a22LXOL25LDIM9wzxQqrqQogBKmRcFk=; b=e4FHNrtVP8yYolvZOakU5odo+E3V8cWc9fr/LrlTkIsmjYcGftHNClcGhd+dw3xd6m klFj9xwLfji8sYmty/j26ONXgTfn5G167GqrF+8/l5DvmR+DuhqwD732BRplT2igsyQN PBahGpo9Il94AiTFPql08bnHYf8rhbKjAM83R4Er4HryiWaLXpF/ndF+DTz0v2Mv1VDz fk9qk9xklZwTtOVpnKVyXFbJHcoPmp4yfStdUA4gRY/7cEbRIBdIJxUSM0UuprNLl95P w6dg5T2xr6KPMWRfK9Y5ZifoqN9WVXW4qkBLQR+TyaLVGdtHTk4K9MoU4gFb+E0m/IXu tG6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=t8+FidzFv438a22LXOL25LDIM9wzxQqrqQogBKmRcFk=; b=Er43AFJhsJ7lwqJabV33oTMQBn0/xGzHe/6LCi7fFBDDJ59TR0uM3nv3ywL6naUHlU 8B2RKmBFAqQX8aWW4AvsEaooPhRPejaVyg0bphg2f4LFliyoHbUplitzl7z7DHf0y8tr KevNy8Y99IupeoMHvSR962MP7rKLowvfyfeaNfjWphZc6L9zfxe9wp5+T8Z2jcxC018a nWyZOVuwmsJWg4G+HA6Ak49O8o9KpMOhLbHcpaTRfKG+I1btk8IeagDMkNvnEG3xYpfw Vss2+lGiyt4jsG+ssuSSus6NJHwEAkDdEJUEbE7cUqciVlkOrLYlY/IcSMVZmRJwj6yH kYiQ== X-Gm-Message-State: ALoCoQk8nNKoIA1Q14WHp4ovbDPBYHeoElFntjdtQJlXeEd0RJjG9ALPkOLaklrLB5LhaTLGkkKO X-Received: by 10.182.134.225 with SMTP id pn1mr9612039obb.31.1405378492130; Mon, 14 Jul 2014 15:54:52 -0700 (PDT) Received: from corp2gmr1-2.hot.corp.google.com (corp2gmr1-2.hot.corp.google.com [172.24.189.93]) by gmr-mx.google.com with ESMTPS id z50si840699yhb.3.2014.07.14.15.54.52 for (version=TLSv1.1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 14 Jul 2014 15:54:52 -0700 (PDT) Received: from taipei.mtv.corp.google.com (taipei.mtv.corp.google.com [172.17.130.75]) by corp2gmr1-2.hot.corp.google.com (Postfix) with ESMTP id EB88C5A44FE; Mon, 14 Jul 2014 15:54:51 -0700 (PDT) Received: by taipei.mtv.corp.google.com (Postfix, from userid 19823) id 7FB5CA0F05; Mon, 14 Jul 2014 15:54:51 -0700 (PDT) From: "H.K. Jerry Chu" To: edumazet@google.com, linux@stwm.de, ogerlitz@mellanox.com Cc: davem@davemloft.net, netdev@vger.kernel.org, Jerry Chu Subject: [PATCH net] net-gre-gro: Fix a bug that breaks the forwarding path Date: Mon, 14 Jul 2014 15:54:46 -0700 Message-Id: <1405378486-18129-1-git-send-email-hkchu@google.com> X-Mailer: git-send-email 2.0.0.526.g5318336 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jerry Chu Fixed a bug that was introduced by my GRE-GRO patch (bf5a755f5e9186406bbf50f4087100af5bd68e40 net-gre-gro: Add GRE support to the GRO stack) that breaks the forwarding path because various GSO related fields were not set. The bug 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 diff --git a/net/core/dev.c b/net/core/dev.c index 7990984..367a586 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -4096,6 +4096,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; skb->truesize = SKB_TRUESIZE(skb_end_offset(skb)); napi->skb = skb; diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index d5e6836..d156b3c 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -1429,6 +1429,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); + csum_replace2(&iph->check, iph->tot_len, newlen); iph->tot_len = newlen; diff --git a/net/ipv4/gre_offload.c b/net/ipv4/gre_offload.c index eb92deb..f0bdd47 100644 --- a/net/ipv4/gre_offload.c +++ b/net/ipv4/gre_offload.c @@ -263,6 +263,9 @@ static int gre_gro_complete(struct sk_buff *skb, int nhoff) int err = -ENOENT; __be16 type; + skb->encapsulation = 1; + skb_shinfo(skb)->gso_type = SKB_GSO_GRE; + type = greh->protocol; if (greh->flags & GRE_KEY) grehlen += GRE_HEADER_SECTION; diff --git a/net/ipv4/tcp_offload.c b/net/ipv4/tcp_offload.c index 4e86c59..55046ec 100644 --- a/net/ipv4/tcp_offload.c +++ b/net/ipv4/tcp_offload.c @@ -309,7 +309,7 @@ static int tcp4_gro_complete(struct sk_buff *skb, int thoff) th->check = ~tcp_v4_check(skb->len - thoff, iph->saddr, iph->daddr, 0); - skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4; + skb_shinfo(skb)->gso_type |= SKB_GSO_TCPV4; return tcp_gro_complete(skb); } diff --git a/net/ipv6/tcpv6_offload.c b/net/ipv6/tcpv6_offload.c index 8517d3c..01b0ff9 100644 --- a/net/ipv6/tcpv6_offload.c +++ b/net/ipv6/tcpv6_offload.c @@ -73,7 +73,7 @@ static int tcp6_gro_complete(struct sk_buff *skb, int thoff) th->check = ~tcp_v6_check(skb->len - thoff, &iph->saddr, &iph->daddr, 0); - skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; + skb_shinfo(skb)->gso_type |= SKB_GSO_TCPV6; return tcp_gro_complete(skb); }