From patchwork Tue Nov 4 17:06:56 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 406690 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 CBD291400D2 for ; Wed, 5 Nov 2014 04:07:45 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752427AbaKDRHh (ORCPT ); Tue, 4 Nov 2014 12:07:37 -0500 Received: from mail-ig0-f169.google.com ([209.85.213.169]:65007 "EHLO mail-ig0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752372AbaKDRHf (ORCPT ); Tue, 4 Nov 2014 12:07:35 -0500 Received: by mail-ig0-f169.google.com with SMTP id hn18so6779346igb.4 for ; Tue, 04 Nov 2014 09:07:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:subject:date:message-id:in-reply-to:references; bh=7OS34lbXeZ81WJmMm7KbEBFZtOEVqRFf/C/tlv/tWM8=; b=mPh0y1XVKzWNK1sPJJdACNpDGyC7UlC8BIBDvhF4bY0z0qmiiEQNGzmSyLAUIPMvnO ye/yhV6JbzyBqh6DQGka/2wQWmLteTQcSkEpYU8NDnGyb5FFod/L5FwUM5QdHKYuwU4e TJKYjbNn5I4CRSNlulQcsxcZRTh2qQEDK5fzCIlQpXkprbmbijvVJPxWXkKMhuQCNRfQ v64UQSRkJKbUU3W7t5k9fOJPiiduc/5tUknE/wmgPPRJ3QcvhtL9yI783n16b8Cpr7WH kUAmcL7usLG5BC1GKoEpwH/11ZV+HuKMhcmUH1iO90/qoJGZ5myUKaDdZP09PCpD3v/e I7hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=7OS34lbXeZ81WJmMm7KbEBFZtOEVqRFf/C/tlv/tWM8=; b=m1U6Npgo6W+GB75bRhDGHygQGwJkERH2bAgmCCAH/gEKgTpE+1sjWei+8rS2MmZ0EC 16BJmBqly7UAwDHh9T+t97mAyLiQkHmYL2KmGQirpGsVdBhbbgFsz7LoaAvNfiXh2E57 wWahZzsqFlDI7wfhzpBj+DqMn67T6shWc1CHM6j9styYkXmB+jV61/dqxUYKtleeKB2R LSnYnzbRN90dYK4DXNoIQHAY+2qIhz/uBM1RBbVPgePFI9R25o0dklBqFfD6M6rCchHS jzLLOR1FqZ/R3rlpF/HuTXem08LCGxbl0GCjFBqnNnAQp/Nc8fwNWU+bjHyHBJZORmvo JJWw== X-Gm-Message-State: ALoCoQlVPdtx5OM6mQ/azkiwHoAgbqvyc2ajosvBdRWE+l9Uizqth8GGkPgolUurBCdIgM9IOtgY X-Received: by 10.107.165.19 with SMTP id o19mr56523750ioe.1.1415120854079; Tue, 04 Nov 2014 09:07:34 -0800 (PST) Received: from tomh.mtv.corp.google.com ([172.18.117.126]) by mx.google.com with ESMTPSA id j36sm402221ioo.23.2014.11.04.09.07.33 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 04 Nov 2014 09:07:33 -0800 (PST) From: Tom Herbert To: davem@davemloft.net, netdev@vger.kernel.org Subject: [PATCH v2 net-next 6/7] gue: TX support for using remote checksum offload option Date: Tue, 4 Nov 2014 09:06:56 -0800 Message-Id: <1415120817-2105-7-git-send-email-therbert@google.com> X-Mailer: git-send-email 2.1.0.rc2.206.gedb03e5 In-Reply-To: <1415120817-2105-1-git-send-email-therbert@google.com> References: <1415120817-2105-1-git-send-email-therbert@google.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add if_tunnel flag TUNNEL_ENCAP_FLAG_REMCSUM to configure remote checksum offload on an IP tunnel. Add logic in gue_build_header to insert remote checksum offload option. Signed-off-by: Tom Herbert --- include/net/fou.h | 14 +++++++++++++- include/uapi/linux/if_tunnel.h | 1 + net/ipv4/fou.c | 35 ++++++++++++++++++++++++++++++++--- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/include/net/fou.h b/include/net/fou.h index cf4ce88..25b26ff 100644 --- a/include/net/fou.h +++ b/include/net/fou.h @@ -20,7 +20,19 @@ static size_t fou_encap_hlen(struct ip_tunnel_encap *e) static size_t gue_encap_hlen(struct ip_tunnel_encap *e) { - return sizeof(struct udphdr) + sizeof(struct guehdr); + size_t len; + bool need_priv = false; + + len = sizeof(struct udphdr) + sizeof(struct guehdr); + + if (e->flags & TUNNEL_ENCAP_FLAG_REMCSUM) { + len += GUE_PLEN_REMCSUM; + need_priv = true; + } + + len += need_priv ? GUE_LEN_PRIV : 0; + + return len; } #endif diff --git a/include/uapi/linux/if_tunnel.h b/include/uapi/linux/if_tunnel.h index 280d9e0..bd3cc11 100644 --- a/include/uapi/linux/if_tunnel.h +++ b/include/uapi/linux/if_tunnel.h @@ -69,6 +69,7 @@ enum tunnel_encap_types { #define TUNNEL_ENCAP_FLAG_CSUM (1<<0) #define TUNNEL_ENCAP_FLAG_CSUM6 (1<<1) +#define TUNNEL_ENCAP_FLAG_REMCSUM (1<<2) /* SIT-mode i_flags */ #define SIT_ISATAP 0x0001 diff --git a/net/ipv4/fou.c b/net/ipv4/fou.c index a3b8c5b..fb0db99 100644 --- a/net/ipv4/fou.c +++ b/net/ipv4/fou.c @@ -562,11 +562,19 @@ int gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e, bool csum = !!(e->flags & TUNNEL_ENCAP_FLAG_CSUM); int type = csum ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL; struct guehdr *guehdr; - size_t optlen = 0; + size_t hdrlen, optlen = 0; __be16 sport; void *data; bool need_priv = false; + if ((e->flags & TUNNEL_ENCAP_FLAG_REMCSUM) && + skb->ip_summed == CHECKSUM_PARTIAL) { + csum = false; + optlen += GUE_PLEN_REMCSUM; + type |= SKB_GSO_TUNNEL_REMCSUM; + need_priv = true; + } + optlen += need_priv ? GUE_LEN_PRIV : 0; skb = iptunnel_handle_offloads(skb, csum, type); @@ -578,7 +586,9 @@ int gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e, sport = e->sport ? : udp_flow_src_port(dev_net(skb->dev), skb, 0, 0, false); - skb_push(skb, sizeof(struct guehdr) + optlen); + hdrlen = sizeof(struct guehdr) + optlen; + + skb_push(skb, hdrlen); guehdr = (struct guehdr *)skb->data; @@ -597,7 +607,26 @@ int gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e, *flags = 0; data += GUE_LEN_PRIV; - /* Add private flags */ + if (type & SKB_GSO_TUNNEL_REMCSUM) { + u16 csum_start = skb_checksum_start_offset(skb); + __be16 *pd = data; + + if (csum_start < hdrlen) + return -EINVAL; + + csum_start -= hdrlen; + pd[0] = htons(csum_start); + pd[1] = htons(csum_start + skb->csum_offset); + + if (!skb_is_gso(skb)) { + skb->ip_summed = CHECKSUM_NONE; + skb->encapsulation = 0; + } + + *flags |= GUE_PFLAG_REMCSUM; + data += GUE_PLEN_REMCSUM; + } + } fou_build_udp(skb, e, fl4, protocol, sport);