From patchwork Sat Oct 28 00:09:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 831553 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=quantonium-net.20150623.gappssmtp.com header.i=@quantonium-net.20150623.gappssmtp.com header.b="dC/+y6xD"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yP1NJ4jhKz9t4X for ; Sat, 28 Oct 2017 11:10:24 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751617AbdJ1AKT (ORCPT ); Fri, 27 Oct 2017 20:10:19 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:56556 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751381AbdJ1AKJ (ORCPT ); Fri, 27 Oct 2017 20:10:09 -0400 Received: by mail-pf0-f194.google.com with SMTP id b85so5996367pfj.13 for ; Fri, 27 Oct 2017 17:10:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quantonium-net.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=0Vs249g8KFibi/hTwDBA/hTAfGlB+QSLg+DbDOQBVYE=; b=dC/+y6xDHqnYBExBFAMciULesmZxNfmKTh3BjsXi501tOCr1VAC9fiqFMxNhZ5xW/4 8Dmd6uY88WCKF4Q2rW34xzWAjGi7TauIwDSc4TjBTIEZJOoZ8cSDhMqiQRpi26zMcFfR 1scbph6R5o2+x2lyjSVtTpplgh+/Z9ID9BmoviF6yMoZ+4BZOk/bVnkzXoMLfmVyoCHn kGTL6HMLtdKuFE9Bw2cUWZRKagEJlgh/hAAR+EraFV7Cne3Hnt2gYEiG1yomcxc3Rv8E imBrkcjBFhPy/lYA2XN5HCf3Ak45B/FQkzaq8lxb6IV3Embyj2JBxmiysMu/9xtGRZx0 fcHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=0Vs249g8KFibi/hTwDBA/hTAfGlB+QSLg+DbDOQBVYE=; b=sPhGFnqKhg2olZTww55WPCKTnV5Rk/TGXjFi/0tPvFd56joP3oOSVn0mPf4NNV/28T e1UT7HztIychDhHGlEhGOBTRIJu/MInHdbwMqeQcr/+z8ypanGNgGeIr3cRnR9Jp7lsN tFyALgY26iNRDdH4AePpwFUEXqw8xdVvQGKcLFkcZB5uHEcJzb7YbtAxTr62kDnWOMcK vyT24TtmLjm21+85ALfPmE4p6DCRkbhdww1pHD5ALHUHDlNmPaZ3XNaU0OjaQhKAl6AF cf7UHKTyOh2ToFCoZ+/Vo552UnREPaKsP2XPp+kMLvqpbTyzODRGoAVI92QAXKqBZ08s D1yQ== X-Gm-Message-State: AMCzsaXPy5pkITzs4lpvHa6/wd83KTOmBa/lrRs0eKYlnsfwoXLCyBll b1HG5Zym0mZbRxExal5AA8p8YQ== X-Google-Smtp-Source: ABhQp+QucvwndUFBxd7npcASjWB5JPGMO2h+fZ6tpEx2/8yHMWEb0hbQtpD1M4Qyd4ZbokLkNluQ9g== X-Received: by 10.99.116.22 with SMTP id p22mr607181pgc.372.1509149409034; Fri, 27 Oct 2017 17:10:09 -0700 (PDT) Received: from localhost.localdomain (c-73-162-13-107.hsd1.ca.comcast.net. [73.162.13.107]) by smtp.gmail.com with ESMTPSA id 2sm9068398pgb.30.2017.10.27.17.10.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 27 Oct 2017 17:10:08 -0700 (PDT) From: Tom Herbert To: davem@davemloft.net Cc: pablo@netfilter.org, laforge@gnumonks.org, aschultz@tpip.net, netdev@vger.kernel.org, rohit@quantonium.net, Tom Herbert Subject: [PATCH v7 net-next 04/13] gtp: Call common functions to get tunnel routes and add dst_cache Date: Fri, 27 Oct 2017 17:09:28 -0700 Message-Id: <20171028000937.2631-5-tom@quantonium.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171028000937.2631-1-tom@quantonium.net> References: <20171028000937.2631-1-tom@quantonium.net> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Call ip_tunnel_get_route and dst_cache to pdp context which should improve performance by obviating the need to perform a route lookup on every packet. Signed-off-by: Tom Herbert --- drivers/net/gtp.c | 62 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c index f38e32a7ec9c..6dabd605607c 100644 --- a/drivers/net/gtp.c +++ b/drivers/net/gtp.c @@ -63,6 +63,8 @@ struct pdp_ctx { atomic_t tx_seq; struct rcu_head rcu_head; + + struct dst_cache dst_cache; }; /* One instance of the GTP device. */ @@ -379,20 +381,6 @@ static void gtp_dev_uninit(struct net_device *dev) free_percpu(dev->tstats); } -static struct rtable *ip4_route_output_gtp(struct flowi4 *fl4, - const struct sock *sk, - __be32 daddr) -{ - memset(fl4, 0, sizeof(*fl4)); - fl4->flowi4_oif = sk->sk_bound_dev_if; - fl4->daddr = daddr; - fl4->saddr = inet_sk(sk)->inet_saddr; - fl4->flowi4_tos = RT_CONN_FLAGS(sk); - fl4->flowi4_proto = sk->sk_protocol; - - return ip_route_output_key(sock_net(sk), fl4); -} - static inline void gtp0_push_header(struct sk_buff *skb, struct pdp_ctx *pctx) { int payload_len = skb->len; @@ -479,6 +467,8 @@ static int gtp_build_skb_ip4(struct sk_buff *skb, struct net_device *dev, struct rtable *rt; struct flowi4 fl4; struct iphdr *iph; + struct sock *sk; + __be32 saddr; __be16 df; int mtu; @@ -498,19 +488,30 @@ static int gtp_build_skb_ip4(struct sk_buff *skb, struct net_device *dev, } netdev_dbg(dev, "found PDP context %p\n", pctx); - rt = ip4_route_output_gtp(&fl4, pctx->sk, pctx->peer_addr_ip4.s_addr); - if (IS_ERR(rt)) { - netdev_dbg(dev, "no route to SSGN %pI4\n", - &pctx->peer_addr_ip4.s_addr); - dev->stats.tx_carrier_errors++; - goto err; - } + sk = pctx->sk; + saddr = inet_sk(sk)->inet_saddr; - if (rt->dst.dev == dev) { - netdev_dbg(dev, "circular route to SSGN %pI4\n", - &pctx->peer_addr_ip4.s_addr); - dev->stats.collisions++; - goto err_rt; + /* Source address returned by route lookup is ignored since + * we get the address from a socket. + */ + rt = ip_tunnel_get_route(dev, skb, sk->sk_protocol, + sk->sk_bound_dev_if, RT_CONN_FLAGS(sk), + pctx->peer_addr_ip4.s_addr, &saddr, + pktinfo->gtph_port, pktinfo->gtph_port, + &pctx->dst_cache, NULL); + + if (IS_ERR(rt)) { + if (rt == ERR_PTR(-ELOOP)) { + netdev_dbg(dev, "circular route to SSGN %pI4\n", + &pctx->peer_addr_ip4.s_addr); + dev->stats.collisions++; + goto err_rt; + } else { + netdev_dbg(dev, "no route to SSGN %pI4\n", + &pctx->peer_addr_ip4.s_addr); + dev->stats.tx_carrier_errors++; + goto err; + } } skb_dst_drop(skb); @@ -543,7 +544,7 @@ static int gtp_build_skb_ip4(struct sk_buff *skb, struct net_device *dev, goto err_rt; } - gtp_set_pktinfo_ipv4(pktinfo, pctx->sk, iph, pctx, rt, &fl4, dev); + gtp_set_pktinfo_ipv4(pktinfo, sk, iph, pctx, rt, &fl4, dev); gtp_push_header(skb, pktinfo); return 0; @@ -917,6 +918,7 @@ static int ipv4_pdp_add(struct gtp_dev *gtp, struct sock *sk, struct pdp_ctx *pctx; bool found = false; __be32 ms_addr; + int err; ms_addr = nla_get_be32(info->attrs[GTPA_MS_ADDRESS]); hash_ms = ipv4_hashfn(ms_addr) % gtp->hash_size; @@ -951,6 +953,12 @@ static int ipv4_pdp_add(struct gtp_dev *gtp, struct sock *sk, if (pctx == NULL) return -ENOMEM; + err = dst_cache_init(&pctx->dst_cache, GFP_KERNEL); + if (err) { + kfree(pctx); + return err; + } + sock_hold(sk); pctx->sk = sk; pctx->dev = gtp->dev;