From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A5EABC10F13 for ; Tue, 16 Apr 2019 21:36:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 709142075B for ; Tue, 16 Apr 2019 21:36:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1555450565; bh=73YXCJc8z1b8xWVtXPZn6c0Qp19TyRdmvVv5JvYBFSw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:List-ID:From; b=1xGXA3Z2xm+4Vd8IMGrBatQf7cCnKnlUJqIWxQ1ys1/qWcEnat0YxQATOPIfMXfZE +3IkwbHk+AdTdBKu3PtCNdXJNnzAkcrWxuh0z4iIXlPqxg1LtRRExdyG2cJEJQdSzR C6Q6LFcWNFu7lcCjB4ux59kQOQ1J1HYWoTku99e0= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730686AbfDPVgE (ORCPT ); Tue, 16 Apr 2019 17:36:04 -0400 Received: from mail.kernel.org ([198.145.29.99]:47852 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730534AbfDPVfi (ORCPT ); Tue, 16 Apr 2019 17:35:38 -0400 Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com [216.129.126.126]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id D70422183E; Tue, 16 Apr 2019 21:35:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1555450538; bh=73YXCJc8z1b8xWVtXPZn6c0Qp19TyRdmvVv5JvYBFSw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UtTrutkxtrlK0P2G+d1PgyGOBHYSoJMJJ/DAE4aXNISQDcjsa9wZzFKiT9N++b/dp TD5TrX7XHSaBH5zKjuRMMKrH6eBXp0RtQmIoCZpxQ1GVZ2CCcXid0+y+kjxpuPFUKE MZ6c8jEMdYzsTtb3X5GQ5ahCnPsCUSq91udQMVBo= From: David Ahern To: davem@davemloft.net, netdev@vger.kernel.org Cc: idosch@mellanox.com, David Ahern Subject: [PATCH v2 net-next 09/13] ipv6: Pass fib6_result to rt6_device_match Date: Tue, 16 Apr 2019 14:36:07 -0700 Message-Id: <20190416213611.8724-10-dsahern@kernel.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190416213611.8724-1-dsahern@kernel.org> References: <20190416213611.8724-1-dsahern@kernel.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: David Ahern Pass fib6_result to rt6_device_match with f6i set. rt6_device_match updates f6i in the result if it finds a better match and sets nh. Signed-off-by: David Ahern --- net/ipv6/route.c | 49 ++++++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/net/ipv6/route.c b/net/ipv6/route.c index c28fd554f7cf..7a3eecdb933d 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -491,29 +491,40 @@ static bool __rt6_device_match(struct net *net, const struct fib6_nh *nh, return false; } -static inline struct fib6_info *rt6_device_match(struct net *net, - struct fib6_info *rt, - const struct in6_addr *saddr, - int oif, - int flags) +static void rt6_device_match(struct net *net, struct fib6_result *res, + const struct in6_addr *saddr, int oif, int flags) { - const struct fib6_nh *nh; - struct fib6_info *sprt; + struct fib6_info *f6i = res->f6i; + struct fib6_info *spf6i; + struct fib6_nh *nh; - if (!oif && ipv6_addr_any(saddr) && - !(rt->fib6_nh.fib_nh_flags & RTNH_F_DEAD)) - return rt; + if (!oif && ipv6_addr_any(saddr)) { + nh = &f6i->fib6_nh; + if (!(nh->fib_nh_flags & RTNH_F_DEAD)) { + res->nh = nh; + return; + } + } - for (sprt = rt; sprt; sprt = rcu_dereference(sprt->fib6_next)) { - nh = &sprt->fib6_nh; - if (__rt6_device_match(net, nh, saddr, oif, flags)) - return sprt; + for (spf6i = f6i; spf6i; spf6i = rcu_dereference(spf6i->fib6_next)) { + nh = &spf6i->fib6_nh; + if (__rt6_device_match(net, nh, saddr, oif, flags)) { + res->f6i = spf6i; + res->nh = nh; + } } - if (oif && flags & RT6_LOOKUP_F_IFACE) - return net->ipv6.fib6_null_entry; + if (oif && flags & RT6_LOOKUP_F_IFACE) { + res->f6i = net->ipv6.fib6_null_entry; + res->nh = &res->f6i->fib6_nh; + return; + } - return rt->fib6_nh.fib_nh_flags & RTNH_F_DEAD ? net->ipv6.fib6_null_entry : rt; + res->nh = &f6i->fib6_nh; + if (res->nh->fib_nh_flags & RTNH_F_DEAD) { + res->f6i = net->ipv6.fib6_null_entry; + res->nh = &res->f6i->fib6_nh; + } } #ifdef CONFIG_IPV6_ROUTER_PREF @@ -1089,8 +1100,8 @@ static struct rt6_info *ip6_pol_route_lookup(struct net *net, if (!res.f6i) res.f6i = net->ipv6.fib6_null_entry; else - res.f6i = rt6_device_match(net, res.f6i, &fl6->saddr, - fl6->flowi6_oif, flags); + rt6_device_match(net, &res, &fl6->saddr, fl6->flowi6_oif, + flags); if (res.f6i == net->ipv6.fib6_null_entry) { fn = fib6_backtrack(fn, &fl6->saddr); -- 2.11.0