From patchwork Sun Feb 25 19:47:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 877611 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; 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="UhYgt262"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zqFr02hrtz9s2R for ; Mon, 26 Feb 2018 06:48:16 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752062AbeBYTsO (ORCPT ); Sun, 25 Feb 2018 14:48:14 -0500 Received: from mail-pg0-f68.google.com ([74.125.83.68]:39925 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751985AbeBYTr7 (ORCPT ); Sun, 25 Feb 2018 14:47:59 -0500 Received: by mail-pg0-f68.google.com with SMTP id w17so5382058pgv.6 for ; Sun, 25 Feb 2018 11:47:58 -0800 (PST) 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=KeuNWjvJrS8Qf+lQoI1pnOXdXQbAi++9GeTWhXoI0c4=; b=UhYgt26230fS1hd3hnA1qPiWByEoNXpa9aQGM6lCmb59cgrS1acWoj5FNWHRRuYvzp eBllfgpLHBOwppMogLWPvRgnHx77CFaFoUqEDGrfWud+ke4WJ80DtXnsI1HpzUZopk0S Wnobb5GuPr+LZImW1F0cw6qjkSLfqQIX1H4I0f1B1BewrXjQvW4kUhg7KFV9aF/3QaMa Bac60b40hFzOXcT90Cnvg4UtkaWDnfaplJq5QrRhLtIR3AkxFV6hRiITAomXNnRhTAew YZ2BInX6iuVmDTnih2ZRMx4lFOXK9VJnr/YKBIeEleLvE2F4KR6kC9fA4pdh9XaWC0ET ECSw== 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=KeuNWjvJrS8Qf+lQoI1pnOXdXQbAi++9GeTWhXoI0c4=; b=ADSDYFEm2zPYjY3mnXpl5WFlWCG0lmmNSDPGOvdwlkZqH0rHxnJQzbrDBgB1fK3MYz lHHqJqM9m2yWDrUOpz0UIwa0e0C9pqJK1rLyJ4fo0JUG6xD/1eMjjpRyO9qb8E5i8BFG FIHbpnCF4ZWqiAMpz10/SAF5M9cPjRqu1efUClzMqBOTXVsYIKV57MJIyG4RCS4nMuzG AbOzk98Q8IBTh3chi+6UlJ5Tmh8bb5i1CbgOcFruVvIG14+lQuxnQHhWEvt9lqAwEz1p s9WWW37iikrMiQ2QD89YfuA7/6BZEmX6rhBVFHWgbOT4BGGRFdMRDlh5hrHOb7smrWxk gTjA== X-Gm-Message-State: APf1xPAb6BUrLEubeJvhtryO9MMXAcmBhdseEtZfWZzxtr3PxgHzvfgr r2My07n6g4CkKSfQWpmw3jg0/g== X-Google-Smtp-Source: AH8x226KJ461lAFXSgZMY73fVN8WwnYcpfPgtQ/CA9omBFKzdXBYaRiF9/eGfml713u+J0QZMwFe8A== X-Received: by 10.101.101.204 with SMTP id y12mr6696130pgv.450.1519588078070; Sun, 25 Feb 2018 11:47:58 -0800 (PST) Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id z4sm12414196pgb.4.2018.02.25.11.47.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 25 Feb 2018 11:47:57 -0800 (PST) From: David Ahern To: netdev@vger.kernel.org Cc: davem@davemloft.net, idosch@idosch.org, roopa@cumulusnetworks.com, eric.dumazet@gmail.com, weiwan@google.com, kafai@fb.com, yoshfuji@linux-ipv6.org, David Ahern Subject: [PATCH RFC net-next 14/20] net/ipv6: Create a neigh_lookup for FIB entries Date: Sun, 25 Feb 2018 11:47:24 -0800 Message-Id: <20180225194730.30063-15-dsahern@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180225194730.30063-1-dsahern@gmail.com> References: <20180225194730.30063-1-dsahern@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Refactor dst_neigh_lookup and create a new function that takes the gateway and device. Since rt6_get_dflt_router returns a FIB entry, change ndisc_router_discovery to use the new ip6_neigh_lookup. Signed-off-by: David Ahern --- include/net/ip6_route.h | 5 +++++ net/ipv6/ndisc.c | 8 ++++++-- net/ipv6/route.c | 33 ++++++++++++++++++++------------- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index bd82ec4a57e6..aa59c6eb34e6 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h @@ -268,4 +268,9 @@ static inline bool rt6_duplicate_nexthop(struct rt6_info *a, struct rt6_info *b) ipv6_addr_equal(&a->fib6_nh.nh_gw, &b->fib6_nh.nh_gw) && !lwtunnel_cmp_encap(a->fib6_nh.nh_lwtstate, b->fib6_nh.nh_lwtstate); } + +struct neighbour *ip6_neigh_lookup(const struct in6_addr *gw, + struct net_device *dev, + struct sk_buff *skb, + const void *daddr); #endif diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index bd804e8cd73c..023da106b682 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c @@ -1276,7 +1276,9 @@ static void ndisc_router_discovery(struct sk_buff *skb) rt = rt6_get_dflt_router(net, &ipv6_hdr(skb)->saddr, skb->dev); if (rt) { - neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr); + neigh = ip6_neigh_lookup(&rt->fib6_nh.nh_gw, + rt->fib6_nh.nh_dev, NULL, + &ipv6_hdr(skb)->saddr); if (!neigh) { ND_PRINTK(0, err, "RA: %s got default router without neighbour\n", @@ -1304,7 +1306,9 @@ static void ndisc_router_discovery(struct sk_buff *skb) return; } - neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr); + neigh = ip6_neigh_lookup(&rt->fib6_nh.nh_gw, + rt->fib6_nh.nh_dev, NULL, + &ipv6_hdr(skb)->saddr); if (!neigh) { ND_PRINTK(0, err, "RA: %s got default router without neighbour\n", diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 61f4f0333c73..ad7a80ad7b59 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -182,12 +182,10 @@ static void rt6_uncached_list_flush_dev(struct net *net, struct net_device *dev) } } -static inline const void *choose_neigh_daddr(struct rt6_info *rt, +static inline const void *choose_neigh_daddr(const struct in6_addr *p, struct sk_buff *skb, const void *daddr) { - struct in6_addr *p = &rt->rt6i_gateway; - if (!ipv6_addr_any(p)) return (const void *) p; else if (skb) @@ -195,18 +193,27 @@ static inline const void *choose_neigh_daddr(struct rt6_info *rt, return daddr; } -static struct neighbour *ip6_neigh_lookup(const struct dst_entry *dst, - struct sk_buff *skb, - const void *daddr) +struct neighbour *ip6_neigh_lookup(const struct in6_addr *gw, + struct net_device *dev, + struct sk_buff *skb, + const void *daddr) { - struct rt6_info *rt = (struct rt6_info *) dst; struct neighbour *n; - daddr = choose_neigh_daddr(rt, skb, daddr); - n = __ipv6_neigh_lookup(dst->dev, daddr); + daddr = choose_neigh_daddr(gw, skb, daddr); + n = __ipv6_neigh_lookup(dev, daddr); if (n) return n; - return neigh_create(&nd_tbl, daddr, dst->dev); + return neigh_create(&nd_tbl, daddr, dev); +} + +static struct neighbour *ip6_dst_neigh_lookup(const struct dst_entry *dst, + struct sk_buff *skb, + const void *daddr) +{ + const struct rt6_info *rt = container_of(dst, struct rt6_info, dst); + + return ip6_neigh_lookup(&rt->rt6i_gateway, dst->dev, skb, daddr); } static void ip6_confirm_neigh(const struct dst_entry *dst, const void *daddr) @@ -214,7 +221,7 @@ static void ip6_confirm_neigh(const struct dst_entry *dst, const void *daddr) struct net_device *dev = dst->dev; struct rt6_info *rt = (struct rt6_info *)dst; - daddr = choose_neigh_daddr(rt, NULL, daddr); + daddr = choose_neigh_daddr(&rt->rt6i_gateway, NULL, daddr); if (!daddr) return; if (dev->flags & (IFF_NOARP | IFF_LOOPBACK)) @@ -239,7 +246,7 @@ static struct dst_ops ip6_dst_ops_template = { .update_pmtu = ip6_rt_update_pmtu, .redirect = rt6_do_redirect, .local_out = __ip6_local_out, - .neigh_lookup = ip6_neigh_lookup, + .neigh_lookup = ip6_dst_neigh_lookup, .confirm_neigh = ip6_confirm_neigh, }; @@ -269,7 +276,7 @@ static struct dst_ops ip6_dst_blackhole_ops = { .update_pmtu = ip6_rt_blackhole_update_pmtu, .redirect = ip6_rt_blackhole_redirect, .cow_metrics = dst_cow_metrics_generic, - .neigh_lookup = ip6_neigh_lookup, + .neigh_lookup = ip6_dst_neigh_lookup, }; static const u32 ip6_template_metrics[RTAX_MAX] = {