From patchwork Tue Jun 18 00:49:51 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pravin B Shelar X-Patchwork-Id: 252082 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 191D52C029B for ; Tue, 18 Jun 2013 10:50:00 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752795Ab3FRAt4 (ORCPT ); Mon, 17 Jun 2013 20:49:56 -0400 Received: from na3sys009aog103.obsmtp.com ([74.125.149.71]:54165 "HELO na3sys009aog103.obsmtp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1752687Ab3FRAty (ORCPT ); Mon, 17 Jun 2013 20:49:54 -0400 Received: from mail-pb0-f50.google.com ([209.85.160.50]) (using TLSv1) by na3sys009aob103.postini.com ([74.125.148.12]) with SMTP ID DSNKUb+usc36QQe0Ex2oAEAa+XdqLecXpHa8@postini.com; Mon, 17 Jun 2013 17:49:54 PDT Received: by mail-pb0-f50.google.com with SMTP id wz7so3339461pbc.37 for ; Mon, 17 Jun 2013 17:49:53 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:x-gm-message-state; bh=QxQ4kRzXzuGLHmt7fkSGwxjFh+90FV9GojvnHLAzd4E=; b=VnmDYNfhViLCFDqADX0lrxH4GutFUSLGjMNCn7NrwBn9KGndUUv4OYNgT+s3910YTm tV4Lv7+fd07SBf4KfbcJ1FApQMykgTHRL/KajlgoBaPuxc0giiaFbllsK7iQ9vNXPZVg Vd4N6eREu/ECJ2XFB527vdsYEokgEWzlYPNIGsPNiXsU7IoQxiy8NEuvmpwXbfTmXTUG bR0pDJWhj3iP5yfbOOWz5eMSKCUhHUb76gpiUkAcMnAHxxmSEMD0quny0lLQamCmEL8w 7j+HXoTgjVjbpuhu2AvTQGllZXkykehGlqX+0hKR2xniKB+SO+H6Eb6OWz8y/VuhXw3V BsYQ== X-Received: by 10.66.155.138 with SMTP id vw10mr14779384pab.91.1371516593882; Mon, 17 Jun 2013 17:49:53 -0700 (PDT) X-Received: by 10.66.155.138 with SMTP id vw10mr14779381pab.91.1371516593815; Mon, 17 Jun 2013 17:49:53 -0700 (PDT) Received: from localhost ([75.98.92.113]) by mx.google.com with ESMTPSA id yj2sm15685796pbb.40.2013.06.17.17.49.52 for (version=TLSv1.1 cipher=RC4-SHA bits=128/128); Mon, 17 Jun 2013 17:49:53 -0700 (PDT) From: Pravin B Shelar To: netdev@vger.kernel.org, dev@openvswitch.org Cc: Pravin B Shelar Subject: [PATCH net-next v2 04/12] gre: export gre_handle_offloads() function. Date: Mon, 17 Jun 2013 17:49:51 -0700 Message-Id: <1371516591-17778-1-git-send-email-pshelar@nicira.com> X-Mailer: git-send-email 1.8.2.135.g7b592fa X-Gm-Message-State: ALoCoQnBHg+LCFNsHMPLSn0wMhCLsoETtAkbw7yhs19LzB5/eDBKXMaRct/UVGWWA3EfLdmQuIllg1pwkAMmWI2+HyS0AqzF/mFM8xXcKMraPDW8M17NKz5nR0vvgFUASz/1WV/Rq9DZ1IZwYPUVa+K+uwDm4G2BC7AxOKgkLvcicPnuzN5qau8= Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This is required for OVS GRE offloading. Signed-off-by: Pravin B Shelar --- include/net/gre.h | 1 + net/ipv4/gre.c | 29 +++++++++++++++++++++++++++++ net/ipv4/ip_gre.c | 34 ++-------------------------------- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/include/net/gre.h b/include/net/gre.h index cbb9d51..a5a4ddf 100644 --- a/include/net/gre.h +++ b/include/net/gre.h @@ -34,6 +34,7 @@ int gre_cisco_register(struct gre_cisco_protocol *proto); int gre_cisco_unregister(struct gre_cisco_protocol *proto); void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi, int hdr_len); +struct sk_buff *gre_handle_offloads(struct sk_buff *skb, bool gre_csum); static inline int ip_gre_calc_hlen(__be16 o_flags) { diff --git a/net/ipv4/gre.c b/net/ipv4/gre.c index 1cbc465..5ecc9c4 100644 --- a/net/ipv4/gre.c +++ b/net/ipv4/gre.c @@ -93,6 +93,35 @@ void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi, } EXPORT_SYMBOL_GPL(gre_build_header); +struct sk_buff *gre_handle_offloads(struct sk_buff *skb, bool gre_csum) +{ + int err; + + if (likely(!skb->encapsulation)) { + skb_reset_inner_headers(skb); + skb->encapsulation = 1; + } + + if (skb_is_gso(skb)) { + err = skb_unclone(skb, GFP_ATOMIC); + if (unlikely(err)) + goto error; + skb_shinfo(skb)->gso_type |= SKB_GSO_GRE; + return skb; + } else if (skb->ip_summed == CHECKSUM_PARTIAL && gre_csum) { + err = skb_checksum_help(skb); + if (unlikely(err)) + goto error; + } else if (skb->ip_summed != CHECKSUM_PARTIAL) + skb->ip_summed = CHECKSUM_NONE; + + return skb; +error: + kfree_skb(skb); + return ERR_PTR(err); +} +EXPORT_SYMBOL_GPL(gre_handle_offloads); + static __sum16 check_checksum(struct sk_buff *skb) { __sum16 csum = 0; diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 362c7c4..c326e86 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c @@ -223,31 +223,6 @@ static int ipgre_rcv(struct sk_buff *skb, const struct tnl_ptk_info *tpi) return PACKET_REJECT; } -static struct sk_buff *handle_offloads(struct ip_tunnel *tunnel, struct sk_buff *skb) -{ - int err; - - if (skb_is_gso(skb)) { - err = skb_unclone(skb, GFP_ATOMIC); - if (unlikely(err)) - goto error; - skb_shinfo(skb)->gso_type |= SKB_GSO_GRE; - return skb; - } else if (skb->ip_summed == CHECKSUM_PARTIAL && - tunnel->parms.o_flags&TUNNEL_CSUM) { - err = skb_checksum_help(skb); - if (unlikely(err)) - goto error; - } else if (skb->ip_summed != CHECKSUM_PARTIAL) - skb->ip_summed = CHECKSUM_NONE; - - return skb; - -error: - kfree_skb(skb); - return ERR_PTR(err); -} - static void __gre_xmit(struct sk_buff *skb, struct net_device *dev, const struct iphdr *tnl_params, __be16 proto) @@ -255,11 +230,6 @@ static void __gre_xmit(struct sk_buff *skb, struct net_device *dev, struct ip_tunnel *tunnel = netdev_priv(dev); struct tnl_ptk_info tpi; - if (likely(!skb->encapsulation)) { - skb_reset_inner_headers(skb); - skb->encapsulation = 1; - } - tpi.flags = tunnel->parms.o_flags; tpi.proto = proto; tpi.key = tunnel->parms.o_key; @@ -279,7 +249,7 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb, struct ip_tunnel *tunnel = netdev_priv(dev); const struct iphdr *tnl_params; - skb = handle_offloads(tunnel, skb); + skb = gre_handle_offloads(skb, !!(tunnel->parms.o_flags&TUNNEL_CSUM)); if (IS_ERR(skb)) goto out; @@ -318,7 +288,7 @@ static netdev_tx_t gre_tap_xmit(struct sk_buff *skb, { struct ip_tunnel *tunnel = netdev_priv(dev); - skb = handle_offloads(tunnel, skb); + skb = gre_handle_offloads(skb, !!(tunnel->parms.o_flags&TUNNEL_CSUM)); if (IS_ERR(skb)) goto out;