lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Wed, 5 Aug 2020 19:03:11 +0800 From: Ying Xue <ying.xue@...driver.com> To: Xin Long <lucien.xin@...il.com>, network dev <netdev@...r.kernel.org> Cc: davem@...emloft.net, Jon Maloy <jon.maloy@...csson.com>, tipc-discussion@...ts.sourceforge.net, Alexey Kuznetsov <kuznet@....inr.ac.ru>, Hideaki YOSHIFUJI <yoshfuji@...ux-ipv6.org> Subject: Re: [PATCH net 1/2] ipv6: add ipv6_dev_find() On 8/3/20 11:34 PM, Xin Long wrote: > This is to add an ip_dev_find like function for ipv6, used to find > the dev by saddr. > > It will be used by TIPC protocol. So also export it. > > Signed-off-by: Xin Long <lucien.xin@...il.com> Acked-by: Ying Xue <ying.xue@...driver.com> > --- > include/net/addrconf.h | 2 ++ > net/ipv6/addrconf.c | 39 +++++++++++++++++++++++++++++++++++++++ > 2 files changed, 41 insertions(+) > > diff --git a/include/net/addrconf.h b/include/net/addrconf.h > index 8418b7d..ba3f6c15 100644 > --- a/include/net/addrconf.h > +++ b/include/net/addrconf.h > @@ -97,6 +97,8 @@ bool ipv6_chk_custom_prefix(const struct in6_addr *addr, > > int ipv6_chk_prefix(const struct in6_addr *addr, struct net_device *dev); > > +struct net_device *ipv6_dev_find(struct net *net, const struct in6_addr *addr); > + > struct inet6_ifaddr *ipv6_get_ifaddr(struct net *net, > const struct in6_addr *addr, > struct net_device *dev, int strict); > diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c > index 840bfdb..857d6f9 100644 > --- a/net/ipv6/addrconf.c > +++ b/net/ipv6/addrconf.c > @@ -1983,6 +1983,45 @@ int ipv6_chk_prefix(const struct in6_addr *addr, struct net_device *dev) > } > EXPORT_SYMBOL(ipv6_chk_prefix); > > +/** > + * ipv6_dev_find - find the first device with a given source address. > + * @net: the net namespace > + * @addr: the source address > + * > + * The caller should be protected by RCU, or RTNL. > + */ > +struct net_device *ipv6_dev_find(struct net *net, const struct in6_addr *addr) > +{ > + unsigned int hash = inet6_addr_hash(net, addr); > + struct inet6_ifaddr *ifp, *result = NULL; > + struct net_device *dev = NULL; > + > + rcu_read_lock(); > + hlist_for_each_entry_rcu(ifp, &inet6_addr_lst[hash], addr_lst) { > + if (net_eq(dev_net(ifp->idev->dev), net) && > + ipv6_addr_equal(&ifp->addr, addr)) { > + result = ifp; > + break; > + } > + } > + > + if (!result) { > + struct rt6_info *rt; > + > + rt = rt6_lookup(net, addr, NULL, 0, NULL, 0); > + if (rt) { > + dev = rt->dst.dev; > + ip6_rt_put(rt); > + } > + } else { > + dev = result->idev->dev; > + } > + rcu_read_unlock(); > + > + return dev; > +} > +EXPORT_SYMBOL(ipv6_dev_find); > + > struct inet6_ifaddr *ipv6_get_ifaddr(struct net *net, const struct in6_addr *addr, > struct net_device *dev, int strict) > { >
Powered by blists - more mailing lists