No longer used Signed-off-by: David Ahern <d...@cumulusnetworks.com> --- drivers/net/vrf.c | 92 +++------------------------------------------------- include/net/l3mdev.h | 14 -------- net/l3mdev/l3mdev.c | 32 ------------------ 3 files changed, 4 insertions(+), 134 deletions(-)
diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c index 08103bc7f1f5..23801647c113 100644 --- a/drivers/net/vrf.c +++ b/drivers/net/vrf.c @@ -48,7 +48,6 @@ static bool add_fib_rules = true; struct net_vrf { struct rtable __rcu *rth_local; - struct rt6_info __rcu *rt6; struct rt6_info __rcu *rt6_local; u32 tb_id; }; @@ -289,25 +288,11 @@ static struct sk_buff *vrf_ip6_out(struct net_device *vrf_dev, /* holding rtnl */ static void vrf_rt6_release(struct net_device *dev, struct net_vrf *vrf) { - struct rt6_info *rt6 = rtnl_dereference(vrf->rt6); struct rt6_info *rt6_local = rtnl_dereference(vrf->rt6_local); struct net *net = dev_net(dev); struct dst_entry *dst; - RCU_INIT_POINTER(vrf->rt6, NULL); - RCU_INIT_POINTER(vrf->rt6_local, NULL); - synchronize_rcu(); - - /* move dev in dst's to loopback so this VRF device can be deleted - * - based on dst_ifdown - */ - if (rt6) { - dst = &rt6->dst; - dev_put(dst->dev); - dst->dev = net->loopback_dev; - dev_hold(dst->dev); - dst_release(dst); - } + rcu_assign_pointer(vrf->rt6_local, NULL); if (rt6_local) { if (rt6_local->rt6i_idev) @@ -327,7 +312,7 @@ static int vrf_rt6_create(struct net_device *dev) struct net_vrf *vrf = netdev_priv(dev); struct net *net = dev_net(dev); struct fib6_table *rt6i_table; - struct rt6_info *rt6, *rt6_local; + struct rt6_info *rt6_local; int rc = -ENOMEM; /* IPv6 can be CONFIG enabled and then disabled runtime */ @@ -338,24 +323,12 @@ static int vrf_rt6_create(struct net_device *dev) if (!rt6i_table) goto out; - /* create a dst for routing packets out a VRF device */ - rt6 = ip6_dst_alloc(net, dev, flags); - if (!rt6) - goto out; - - dst_hold(&rt6->dst); - - rt6->rt6i_table = rt6i_table; - rt6->dst.output = vrf_output6; - /* create a dst for local routing - packets sent locally * to local address via the VRF device as a loopback */ rt6_local = ip6_dst_alloc(net, dev, flags); - if (!rt6_local) { - dst_release(&rt6->dst); + if (!rt6_local) goto out; - } dst_hold(&rt6_local->dst); @@ -364,7 +337,6 @@ static int vrf_rt6_create(struct net_device *dev) rt6_local->rt6i_table = rt6i_table; rt6_local->dst.input = ip6_input; - rcu_assign_pointer(vrf->rt6, rt6); rcu_assign_pointer(vrf->rt6_local, rt6_local); rc = 0; @@ -693,7 +665,7 @@ static struct rt6_info *vrf_ip6_route_lookup(struct net *net, rcu_read_lock(); /* fib6_table does not have a refcnt and can not be freed */ - rt6 = rcu_dereference(vrf->rt6); + rt6 = rcu_dereference(vrf->rt6_local); if (likely(rt6)) table = rt6->rt6i_table; @@ -816,66 +788,10 @@ static struct sk_buff *vrf_l3_rcv(struct net_device *vrf_dev, return skb; } -#if IS_ENABLED(CONFIG_IPV6) -static struct dst_entry *vrf_get_rt6_dst(const struct net_device *dev, - struct flowi6 *fl6) -{ - bool need_strict = rt6_need_strict(&fl6->daddr); - struct net_vrf *vrf = netdev_priv(dev); - struct net *net = dev_net(dev); - struct dst_entry *dst = NULL; - struct rt6_info *rt; - - /* send to link-local or multicast address */ - if (need_strict) { - int flags = RT6_LOOKUP_F_IFACE; - - /* VRF device does not have a link-local address and - * sending packets to link-local or mcast addresses over - * a VRF device does not make sense - */ - if (fl6->flowi6_oif == dev->ifindex) { - struct dst_entry *dst = &net->ipv6.ip6_null_entry->dst; - - dst_hold(dst); - return dst; - } - - if (!ipv6_addr_any(&fl6->saddr)) - flags |= RT6_LOOKUP_F_HAS_SADDR; - - rt = vrf_ip6_route_lookup(net, dev, fl6, fl6->flowi6_oif, flags); - if (rt) - dst = &rt->dst; - - } else if (!(fl6->flowi6_flags & FLOWI_FLAG_L3MDEV_SRC)) { - - rcu_read_lock(); - - rt = rcu_dereference(vrf->rt6); - if (likely(rt)) { - dst = &rt->dst; - dst_hold(dst); - } - - rcu_read_unlock(); - } - - /* make sure oif is set to VRF device for lookup */ - if (!need_strict) - fl6->flowi6_oif = dev->ifindex; - - return dst; -} -#endif - static const struct l3mdev_ops vrf_l3mdev_ops = { .l3mdev_fib_table = vrf_fib_table, .l3mdev_l3_rcv = vrf_l3_rcv, .l3mdev_l3_out = vrf_l3_out, -#if IS_ENABLED(CONFIG_IPV6) - .l3mdev_get_rt6_dst = vrf_get_rt6_dst, -#endif }; static void vrf_get_drvinfo(struct net_device *dev, diff --git a/include/net/l3mdev.h b/include/net/l3mdev.h index 44ceec61de63..3c1d71474f55 100644 --- a/include/net/l3mdev.h +++ b/include/net/l3mdev.h @@ -22,8 +22,6 @@ * @l3mdev_l3_rcv: Hook in L3 receive path * * @l3mdev_l3_out: Hook in L3 output path - * - * @l3mdev_get_rt6_dst: Get cached IPv6 rt6_info (dst_entry) for device */ struct l3mdev_ops { @@ -33,10 +31,6 @@ struct l3mdev_ops { struct sk_buff * (*l3mdev_l3_out)(struct net_device *dev, struct sock *sk, struct sk_buff *skb, u16 proto); - - /* IPv6 ops */ - struct dst_entry * (*l3mdev_get_rt6_dst)(const struct net_device *dev, - struct flowi6 *fl6); }; #ifdef CONFIG_NET_L3_MASTER_DEV @@ -153,8 +147,6 @@ static inline bool netif_index_is_l3_master(struct net *net, int ifindex) return rc; } -struct dst_entry *l3mdev_get_rt6_dst(struct net *net, struct flowi6 *fl6); - static inline struct sk_buff *l3mdev_l3_rcv(struct sk_buff *skb, u16 proto) { @@ -260,12 +252,6 @@ static inline bool netif_index_is_l3_master(struct net *net, int ifindex) } static inline -struct dst_entry *l3mdev_get_rt6_dst(struct net *net, struct flowi6 *fl6) -{ - return NULL; -} - -static inline struct sk_buff *l3mdev_ip_rcv(struct sk_buff *skb) { return skb; diff --git a/net/l3mdev/l3mdev.c b/net/l3mdev/l3mdev.c index 998e4dc2e6f9..2ba2a650bae9 100644 --- a/net/l3mdev/l3mdev.c +++ b/net/l3mdev/l3mdev.c @@ -100,38 +100,6 @@ u32 l3mdev_fib_table_by_index(struct net *net, int ifindex) EXPORT_SYMBOL_GPL(l3mdev_fib_table_by_index); /** - * l3mdev_get_rt6_dst - IPv6 route lookup based on flow. Returns - * cached route for L3 master device if relevant - * to flow - * @net: network namespace for device index lookup - * @fl6: IPv6 flow struct for lookup - */ - -struct dst_entry *l3mdev_get_rt6_dst(struct net *net, - struct flowi6 *fl6) -{ - struct dst_entry *dst = NULL; - struct net_device *dev; - - if (fl6->flowi6_oif) { - rcu_read_lock(); - - dev = dev_get_by_index_rcu(net, fl6->flowi6_oif); - if (dev && netif_is_l3_slave(dev)) - dev = netdev_master_upper_dev_get_rcu(dev); - - if (dev && netif_is_l3_master(dev) && - dev->l3mdev_ops->l3mdev_get_rt6_dst) - dst = dev->l3mdev_ops->l3mdev_get_rt6_dst(dev, fl6); - - rcu_read_unlock(); - } - - return dst; -} -EXPORT_SYMBOL_GPL(l3mdev_get_rt6_dst); - -/** * l3mdev_fib_rule_match - Determine if flowi references an * L3 master device * @net: network namespace for device index lookup -- 2.1.4