From patchwork Tue Jun 10 06:35:01 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 357745 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 DFD03140087 for ; Tue, 10 Jun 2014 16:35:10 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933793AbaFJGfE (ORCPT ); Tue, 10 Jun 2014 02:35:04 -0400 Received: from mail-pa0-f73.google.com ([209.85.220.73]:54391 "EHLO mail-pa0-f73.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933692AbaFJGfC (ORCPT ); Tue, 10 Jun 2014 02:35:02 -0400 Received: by mail-pa0-f73.google.com with SMTP id kx10so41240pab.0 for ; Mon, 09 Jun 2014 23:35:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=date:from:to:subject:message-id:user-agent:mime-version :content-type; bh=YLhvD/nIaTUrGugMm23vhwvHa1IU5AqVUvlg6FuGPOQ=; b=hZPncemElpMWu5b2eLvAywHmULXUMQNjkNcEoEZZ4kBPcQJSg8A0cIQkjb2zGi2Elj AV+wLJX1G93kmo9PSqlEnjleKloetZKY1pHd0rrGJhyka1wsEwB1KH1v3Sqk/a+kctLK Q/lukvm9QjDw2I0JINHIRNHRUvqk/tqpYUAiFTTNZcOb9IZRIrk9YAEE3C6eOk3tVdmC JzlVLf5EXWiUrwh7gSqxK4ovSDDgG7aAyzMY+Vo05GGoq/Pabbx4Bn/wTOsvduzr3wI8 jv/gvFRw3b/3mABTyk5DWfuGEBrF51uton2wvtz2z4n6x7hAPG2NzFA4TY2l6NxgaHOK 7N3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:subject:message-id:user-agent :mime-version:content-type; bh=YLhvD/nIaTUrGugMm23vhwvHa1IU5AqVUvlg6FuGPOQ=; b=fmOY5zDH+fQDDemLvm0eJ/LmxjrCHDCzYpyMucphXihoWMVBTuKW6n+CWYYj+lY6r/ Mz0kuV9HQHzxZix/j3qhtVxYCYSCD8BsVIqS29dhAiMR8jlCXbuIasJTeRWIXwDRDl2v 9XZzfA2fLrIZde1aJqZj9XiUsrQ3dPkxe87ppnbwjkXvEZcIO2rJKxmh/U+gPAHPwVyP RWswvuRn9Y2bfedkZAvBEPJAAo6n5aTq2W0dPvnzr+VuYzvnY0sMhJYf6w0XmzqiaXnr oGekSxSVc2/0ZX/UhezwzcLDMYoJrOGr7El+fUOiEWh1/XTer+9x4mqbyMlx5wB05nFK 80Iw== X-Gm-Message-State: ALoCoQkmcPY1koczdvs/oktTVffGSHOAJGZTTCbcr7WY8B6ae2Iv9D4Blyt2+nHnCgJOyiR9isJx X-Received: by 10.66.216.161 with SMTP id or1mr1731873pac.38.1402382102048; Mon, 09 Jun 2014 23:35:02 -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 c50si1215522yhl.7.2014.06.09.23.35.01 for (version=TLSv1.1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 09 Jun 2014 23:35:02 -0700 (PDT) Received: from tomh.mtv.corp.google.com (tomh.mtv.corp.google.com [172.18.117.126]) by corp2gmr1-2.hot.corp.google.com (Postfix) with ESMTP id 98E785A4FBF; Mon, 9 Jun 2014 23:35:01 -0700 (PDT) Received: by tomh.mtv.corp.google.com (Postfix, from userid 60832) id 3077B200FFC; Mon, 9 Jun 2014 23:35:01 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by tomh.mtv.corp.google.com (Postfix) with ESMTP id 1BD6B200A47; Mon, 9 Jun 2014 23:35:01 -0700 (PDT) Date: Mon, 9 Jun 2014 23:35:01 -0700 (PDT) From: Tom Herbert To: davem@davemloft.net, netdev@vger.kernel.org Subject: [PATCH 4/4] tcp: set skb checksum unnecessary and encapsulation in TCP GRO Message-ID: User-Agent: Alpine 2.02 (DEB 1266 2009-07-14) MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Once checksum has been validated in TCP RO we can assume all preceeding checksums have been properly validated so ip_summed can changed to unnecessary. Also, if UDP encapsulation was encountered we set skb->encapsulation to indicated encapsulated checksums are verified. Signed-off-by: Tom Herbert --- include/linux/netdevice.h | 5 ++++- net/ipv4/tcp_offload.c | 4 ++++ net/ipv4/udp_offload.c | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 774e539..d39221f 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -1760,7 +1760,10 @@ struct napi_gro_cb { u16 proto; /* Used in udp_gro_receive */ - u16 udp_mark; + u8 udp_mark; + + /* Crossed encpsulation boundary */ + u8 encapsulation; /* used to support CHECKSUM_COMPLETE for tunneling protocols */ __wsum csum; diff --git a/net/ipv4/tcp_offload.c b/net/ipv4/tcp_offload.c index 4e86c59..f40eb4c 100644 --- a/net/ipv4/tcp_offload.c +++ b/net/ipv4/tcp_offload.c @@ -290,7 +290,11 @@ static struct sk_buff **tcp4_gro_receive(struct sk_buff **head, struct sk_buff * case CHECKSUM_COMPLETE: if (!tcp_v4_check(skb_gro_len(skb), iph->saddr, iph->daddr, wsum)) { + /* Assume all previous checksums have succeeded + * so we can convert to CHECKSUM_UNNECESSARY now. + */ skb->ip_summed = CHECKSUM_UNNECESSARY; + skb->encapsulation = NAPI_GRO_CB(skb)->encapsulation; break; } diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c index 546d2d4..56749a2 100644 --- a/net/ipv4/udp_offload.c +++ b/net/ipv4/udp_offload.c @@ -167,6 +167,8 @@ static struct sk_buff **udp_gro_receive(struct sk_buff **head, struct sk_buff *s /* mark that this skb passed once through the udp gro layer */ NAPI_GRO_CB(skb)->udp_mark = 1; + NAPI_GRO_CB(skb)->encapsulation = 1; + off = skb_gro_offset(skb); hlen = off + sizeof(*uh); uh = skb_gro_header_fast(skb, off);