From patchwork Fri Apr 19 07:29:55 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Horman X-Patchwork-Id: 237863 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 C15FE2C04DF for ; Fri, 19 Apr 2013 17:30:20 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757303Ab3DSHaQ (ORCPT ); Fri, 19 Apr 2013 03:30:16 -0400 Received: from kirsty.vergenet.net ([202.4.237.240]:53596 "EHLO kirsty.vergenet.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757271Ab3DSHaN (ORCPT ); Fri, 19 Apr 2013 03:30:13 -0400 Received: from ayumi.akashicho.tokyo.vergenet.net (p8120-ipbfp1001kobeminato.hyogo.ocn.ne.jp [118.10.137.120]) by kirsty.vergenet.net (Postfix) with ESMTP id 19F7C266CF0; Fri, 19 Apr 2013 17:30:12 +1000 (EST) Received: by ayumi.akashicho.tokyo.vergenet.net (Postfix, from userid 7100) id AE93CEDE7CB; Fri, 19 Apr 2013 16:30:10 +0900 (JST) From: Simon Horman To: dev@openvswitch.org, netdev@vger.kernel.org Cc: Jesse Gross , jarno.rajahalme@nsn.com, Joseph Gasparakis , Peter P Waskiewicz Jr , Alexander Duyck , Eric Dumazet , =?UTF-8?q?Maciej=20=C5=BBenczykowski?= , Simon Horman Subject: [PATCH 2/2] net: Loosen constraints for recalculating checksum in skb_segment() Date: Fri, 19 Apr 2013 16:29:55 +0900 Message-Id: <1366356595-3405-3-git-send-email-horms@verge.net.au> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1366356595-3405-1-git-send-email-horms@verge.net.au> References: <1366356595-3405-1-git-send-email-horms@verge.net.au> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In the case where a non-MPLS GSO skb becomes an MPLS GSO skb, via Open vSwitch's push MPLS action it is desirable to provide segmentation in software. In this case the original protocol of the skb may have allowed its checksumming to be offloaded but this may no longer be supported now the skb is MPLS. Actually it seems to me that this is the likely case. In order to allow the checksum to be updated in this case loosen the rules for recalculating the checksum on in skb_segment(). N.B.: I must confess that I am a little unsure of the details of the implementation of skb_checksum(). But I have observed that this is necessary as skb_checksum() hits the following: if (!hsize && i >= nfrags) { ... fskb = fskb->next; ... } ... if (fskb != skb_shinfo(skb)->frag_list) ... Signed-off-by: Simon Horman --- net/core/skbuff.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 7504371..e3bb024 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -2825,7 +2825,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features) doffset + tnl_hlen); if (fskb != skb_shinfo(skb)->frag_list) - continue; + goto csum; if (!sg) { nskb->ip_summed = CHECKSUM_NONE; @@ -2889,6 +2889,7 @@ skip_fraglist: nskb->len += nskb->data_len; nskb->truesize += nskb->data_len; +csum: if (!csum) { nskb->csum = skb_checksum(nskb, doffset, nskb->len - doffset, 0);