From patchwork Sun Jan 18 05:46:16 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Herbert Xu X-Patchwork-Id: 19156 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.176.167]) by ozlabs.org (Postfix) with ESMTP id E873DDE079 for ; Sun, 18 Jan 2009 16:46:28 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753149AbZARFqV (ORCPT ); Sun, 18 Jan 2009 00:46:21 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753016AbZARFqV (ORCPT ); Sun, 18 Jan 2009 00:46:21 -0500 Received: from rhun.apana.org.au ([64.62.148.172]:56410 "EHLO arnor.apana.org.au" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752296AbZARFqU (ORCPT ); Sun, 18 Jan 2009 00:46:20 -0500 Received: from gondolin.me.apana.org.au ([192.168.0.6]) by arnor.apana.org.au with esmtp (Exim 4.63 #1 (Debian)) id 1LOQUD-0006jB-Hw; Sun, 18 Jan 2009 16:46:17 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 4.69) (envelope-from ) id 1LOQUC-0006U1-5o; Sun, 18 Jan 2009 16:46:16 +1100 Date: Sun, 18 Jan 2009 16:46:16 +1100 From: Herbert Xu To: "David S. Miller" , netdev@vger.kernel.org Subject: [1/3] gro: Fix handling of complete checksums in IPv6 Message-ID: <20090118054616.GA24899@gondor.apana.org.au> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-17) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Hi Dave: Here are three bug fixes for GRO. The first one makes sure we don't penalise CHECKSUM_COMPLETE drivers for doing the right thing. gro: Fix handling of complete checksums in IPv6 We need to perform skb_postpull_rcsum after pulling the IPv6 header in order to maintain the correctness of the complete checksum. This patch also adds a missing iph reload after pulling. Signed-off-by: Herbert Xu Cheers, diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 94f74f5..c802bc1 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c @@ -797,6 +797,7 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head, unsigned int nlen; int flush = 1; int proto; + __wsum csum; if (unlikely(!pskb_may_pull(skb, sizeof(*iph)))) goto out; @@ -808,6 +809,7 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head, rcu_read_lock(); proto = ipv6_gso_pull_exthdrs(skb, iph->nexthdr); + iph = ipv6_hdr(skb); IPV6_GRO_CB(skb)->proto = proto; ops = rcu_dereference(inet6_protos[proto]); if (!ops || !ops->gro_receive) @@ -839,8 +841,13 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head, NAPI_GRO_CB(skb)->flush |= flush; + csum = skb->csum; + skb_postpull_rcsum(skb, iph, skb_network_header_len(skb)); + pp = ops->gro_receive(head, skb); + skb->csum = csum; + out_unlock: rcu_read_unlock();