From patchwork Thu May 3 03:53:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 907817 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="nAgd4Yca"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40c1Tk1Fcxz9rvt for ; Thu, 3 May 2018 13:53:46 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752130AbeECDxm (ORCPT ); Wed, 2 May 2018 23:53:42 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:34653 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752114AbeECDxd (ORCPT ); Wed, 2 May 2018 23:53:33 -0400 Received: by mail-pf0-f196.google.com with SMTP id a14so13588594pfi.1 for ; Wed, 02 May 2018 20:53:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=7T2I6bfku1r09R8+/ckokWUwBHxQiESyK2Pfr+Cp6WA=; b=nAgd4YcaxdGtbs9VUN0oAuLVdxpmrvT6MYLSqk95KlVucHdl4+XsOFbWN+6vubrM9X 7/ucsx2Wwd66LLysFfE73H4wUzS0vXI2HK4wa4MItNQPzNnrX/42wn3556E6FgkRZaTh l7SDW1XCx+rRcaWWqodiQ1SwoQDF0FNBtRwItqFptD3Rbz4G9hePINfKDjCjfHgsXVee zKUNe+9Lx41o1qOdOwKo53STyHNUMAXyBO/dbT5Q9mK4YnY5JsDEeb/MzTSxCB6WkGKO Ka31jZ9Xd/Q0bB0PFcS0o0AoWRASPZvknE4Iy+1h3SeUtIHZqqQ1MgrjcmcgZsSQimRj 8IWQ== 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=7T2I6bfku1r09R8+/ckokWUwBHxQiESyK2Pfr+Cp6WA=; b=ET7PBPZquXTdmJ/ROLKyJ6h5SVktZMh/0LYhDV5pNHACgeD1z3Y+FSRY+0qjiusD6T 7Iv/DsAR8SUhrvWY+xim6qjS65dVnbX8QbrDApOE1vKBBI/Nr652OrW+6CNn2pI82ojw iZScqBjXVnlE6QEdj/aCkjEbhqYbYD3j5bprnC8GUWeJBIVG0sVH0a+hR5JH2rvpsa/H SO04JvA5cNAGbA0+woksVx3Itpccb4UMIv21J8jxetJKi4qjFSwB8e6JpuBNeV19zT5G +iG4JZ9AzVufhH7GNBcOhSApwJTMJ6Q75nioZhkplb1r8RC+VBJEYe4qjUEH+t0a/usU 4agg== X-Gm-Message-State: ALQs6tCwwMYJOlCTNrPP7pzrKg7mD4qcBEAV1n88znJ925f6H6EGx9SC OGZnwKwkQqYNBpk+esTIX/9ulw== X-Google-Smtp-Source: AB8JxZpCgnBe9P5uGGL7lYcwPIivjFA9L0zi8S9TTpLNt6eYuAK8jZSmZ3ODnQgDUyzCyhhLIv1Cbg== X-Received: by 10.98.166.206 with SMTP id r75mr21771460pfl.82.1525319612753; Wed, 02 May 2018 20:53:32 -0700 (PDT) Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id b3sm24015577pff.11.2018.05.02.20.53.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 May 2018 20:53:31 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org, borkmann@iogearbox.net, ast@kernel.org Cc: davem@davemloft.net, shm@cumulusnetworks.com, roopa@cumulusnetworks.com, brouer@redhat.com, toke@toke.dk, john.fastabend@gmail.com, David Ahern Subject: [bpf-next v1 4/9] net/ipv6: Refactor fib6_rule_action Date: Wed, 2 May 2018 20:53:14 -0700 Message-Id: <20180503035319.18290-5-dsahern@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180503035319.18290-1-dsahern@gmail.com> References: <20180503035319.18290-1-dsahern@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Move source address lookup from fib6_rule_action to a helper. It will be used in a later patch by a second variant for fib6_rule_action. Signed-off-by: David Ahern --- net/ipv6/fib6_rules.c | 52 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c index 6547fc6491a6..d040c4bff3a0 100644 --- a/net/ipv6/fib6_rules.c +++ b/net/ipv6/fib6_rules.c @@ -96,6 +96,31 @@ struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6, return &net->ipv6.ip6_null_entry->dst; } +static int fib6_rule_saddr(struct net *net, struct fib_rule *rule, int flags, + struct flowi6 *flp6, const struct net_device *dev) +{ + struct fib6_rule *r = (struct fib6_rule *)rule; + + /* If we need to find a source address for this traffic, + * we check the result if it meets requirement of the rule. + */ + if ((rule->flags & FIB_RULE_FIND_SADDR) && + r->src.plen && !(flags & RT6_LOOKUP_F_HAS_SADDR)) { + struct in6_addr saddr; + + if (ipv6_dev_get_saddr(net, dev, &flp6->daddr, + rt6_flags2srcprefs(flags), &saddr)) + return -EAGAIN; + + if (!ipv6_prefix_equal(&saddr, &r->src.addr, r->src.plen)) + return -EAGAIN; + + flp6->saddr = saddr; + } + + return 0; +} + static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp, int flags, struct fib_lookup_arg *arg) { @@ -134,27 +159,12 @@ static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp, rt = lookup(net, table, flp6, arg->lookup_data, flags); if (rt != net->ipv6.ip6_null_entry) { - struct fib6_rule *r = (struct fib6_rule *)rule; - - /* - * If we need to find a source address for this traffic, - * we check the result if it meets requirement of the rule. - */ - if ((rule->flags & FIB_RULE_FIND_SADDR) && - r->src.plen && !(flags & RT6_LOOKUP_F_HAS_SADDR)) { - struct in6_addr saddr; - - if (ipv6_dev_get_saddr(net, - ip6_dst_idev(&rt->dst)->dev, - &flp6->daddr, - rt6_flags2srcprefs(flags), - &saddr)) - goto again; - if (!ipv6_prefix_equal(&saddr, &r->src.addr, - r->src.plen)) - goto again; - flp6->saddr = saddr; - } + err = fib6_rule_saddr(net, rule, flags, flp6, + ip6_dst_idev(&rt->dst)->dev); + + if (err == -EAGAIN) + goto again; + err = rt->dst.error; if (err != -EAGAIN) goto out;