diff options
author | Bjoern A. Zeeb <bz@FreeBSD.org> | 2021-03-26 17:52:24 +0000 |
---|---|---|
committer | Bjoern A. Zeeb <bz@FreeBSD.org> | 2021-07-18 00:34:59 +0000 |
commit | f752ee737f2f9125d696801723c3c2a65551383a (patch) | |
tree | ea102ffd287f8e2a9763bd38988359ec5733fedc /sys/ofed | |
parent | 0bbb50ec872d6997a70e4ca55cfba548504410e6 (diff) | |
download | src-f752ee737f2f9125d696801723c3c2a65551383a.tar.gz src-f752ee737f2f9125d696801723c3c2a65551383a.zip |
LinuxKPI/OFED: (re)move inetdevice.h implementation
The two functions in linux/inetdevice.h are highly FreeBSD/ifnet
specific. This is a result of struct net_device being mapped to
struct ifnet.
The only known consumer of these functions are two files in the
ofed/infiniband code.
As a first step of cleaning up copy linux/inetdevice.h to
rdma/ib_addr_freebsd.h. (It stayed a separate file to preserve
copyright and license of the original file; otherwise it could be
merged into ib_addr.h where more EPOCH/vnet/.. are already used).
Slightly rename the function to not conflict with LinuxKPI
in the future.
Remove the three last, now unneeded includes of inetdevice.h and
zap linux/inetdevice.h to an empty header file with only the forward
include to netdevice.h remaining.
Sponsored by: The FreeBSD Foundation
Reviewed by: hselasky, kib
Differential Revision: https://reviews.freebsd.org/D29434
(cherry picked from commit 7069b4c6a4e516e1435d8beb7a436d88193156d3)
Diffstat (limited to 'sys/ofed')
-rw-r--r-- | sys/ofed/drivers/infiniband/core/ib_addr.c | 10 | ||||
-rw-r--r-- | sys/ofed/drivers/infiniband/core/ib_cma.c | 6 | ||||
-rw-r--r-- | sys/ofed/include/rdma/ib_addr.h | 1 | ||||
-rw-r--r-- | sys/ofed/include/rdma/ib_addr_freebsd.h | 95 |
4 files changed, 103 insertions, 9 deletions
diff --git a/sys/ofed/drivers/infiniband/core/ib_addr.c b/sys/ofed/drivers/infiniband/core/ib_addr.c index 7d0055032903..f8c1cb180af8 100644 --- a/sys/ofed/drivers/infiniband/core/ib_addr.c +++ b/sys/ofed/drivers/infiniband/core/ib_addr.c @@ -39,7 +39,6 @@ __FBSDID("$FreeBSD$"); #include <linux/mutex.h> -#include <linux/inetdevice.h> #include <linux/slab.h> #include <linux/workqueue.h> #include <linux/module.h> @@ -47,6 +46,7 @@ __FBSDID("$FreeBSD$"); #include <net/route/nhop.h> #include <net/netevent.h> #include <rdma/ib_addr.h> +#include <rdma/ib_addr_freebsd.h> #include <rdma/ib.h> #include <netinet/in_fib.h> @@ -181,13 +181,13 @@ int rdma_translate_ip(const struct sockaddr *addr, } else switch (addr->sa_family) { #ifdef INET case AF_INET: - dev = ip_dev_find(dev_addr->net, + dev = ip_ifp_find(dev_addr->net, ((const struct sockaddr_in *)addr)->sin_addr.s_addr); break; #endif #ifdef INET6 case AF_INET6: - dev = ip6_dev_find(dev_addr->net, + dev = ip6_ifp_find(dev_addr->net, ((const struct sockaddr_in6 *)addr)->sin6_addr, 0); break; #endif @@ -325,7 +325,7 @@ static int addr4_resolve(struct sockaddr_in *src_in, if (addr->bound_dev_if != 0) { ifp = dev_get_by_index(addr->net, addr->bound_dev_if); } else { - ifp = ip_dev_find(addr->net, src_in->sin_addr.s_addr); + ifp = ip_ifp_find(addr->net, src_in->sin_addr.s_addr); } /* check source interface */ @@ -516,7 +516,7 @@ static int addr6_resolve(struct sockaddr_in6 *src_in, if (addr->bound_dev_if != 0) { ifp = dev_get_by_index(addr->net, addr->bound_dev_if); } else { - ifp = ip6_dev_find(addr->net, src_in->sin6_addr, 0); + ifp = ip6_ifp_find(addr->net, src_in->sin6_addr, 0); } /* check source interface */ diff --git a/sys/ofed/drivers/infiniband/core/ib_cma.c b/sys/ofed/drivers/infiniband/core/ib_cma.c index 215a3c7aae35..717d7c70e9de 100644 --- a/sys/ofed/drivers/infiniband/core/ib_cma.c +++ b/sys/ofed/drivers/infiniband/core/ib_cma.c @@ -46,7 +46,6 @@ __FBSDID("$FreeBSD$"); #include <linux/mutex.h> #include <linux/random.h> #include <linux/idr.h> -#include <linux/inetdevice.h> #include <linux/slab.h> #include <linux/module.h> #include <net/route.h> @@ -66,6 +65,7 @@ __FBSDID("$FreeBSD$"); #include <rdma/rdma_sdp.h> #include <rdma/ib.h> #include <rdma/ib_addr.h> +#include <rdma/ib_addr_freebsd.h> #include <rdma/ib_cache.h> #include <rdma/ib_cm.h> #include <rdma/ib_sa.h> @@ -1364,7 +1364,7 @@ static bool validate_ipv4_net_dev(struct net_device *net_dev, ipv4_is_loopback(saddr)) return false; - dst_dev = ip_dev_find(net_dev->if_vnet, daddr); + dst_dev = ip_ifp_find(net_dev->if_vnet, daddr); if (dst_dev != net_dev) { if (dst_dev != NULL) dev_put(dst_dev); @@ -1402,7 +1402,7 @@ static bool validate_ipv6_net_dev(struct net_device *net_dev, struct nhop_object *nh; bool ret; - dst_dev = ip6_dev_find(net_dev->if_vnet, dst_tmp.sin6_addr, + dst_dev = ip6_ifp_find(net_dev->if_vnet, dst_tmp.sin6_addr, net_dev->if_index); if (dst_dev != net_dev) { if (dst_dev != NULL) diff --git a/sys/ofed/include/rdma/ib_addr.h b/sys/ofed/include/rdma/ib_addr.h index 15d6a937c4db..052fc636f617 100644 --- a/sys/ofed/include/rdma/ib_addr.h +++ b/sys/ofed/include/rdma/ib_addr.h @@ -42,7 +42,6 @@ #include <linux/in6.h> #include <linux/if_arp.h> #include <linux/netdevice.h> -#include <linux/inetdevice.h> #include <linux/socket.h> #include <linux/if_vlan.h> #include <net/ipv6.h> diff --git a/sys/ofed/include/rdma/ib_addr_freebsd.h b/sys/ofed/include/rdma/ib_addr_freebsd.h new file mode 100644 index 000000000000..5ce5f2f8a5ed --- /dev/null +++ b/sys/ofed/include/rdma/ib_addr_freebsd.h @@ -0,0 +1,95 @@ +/*- + * Copyright (c) 2010 Isilon Systems, Inc. + * Copyright (c) 2010 iX Systems, Inc. + * Copyright (c) 2010 Panasas, Inc. + * Copyright (c) 2013-2017 Mellanox Technologies, Ltd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice unmodified, this list of conditions, and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ +#ifndef _RDMA_IB_ADDR_FREEBSD_H +#define _RDMA_IB_ADDR_FREEBSD_H + +#ifdef INET +static inline struct ifnet * +ip_ifp_find(struct vnet *vnet, uint32_t addr) +{ + struct sockaddr_in sin; + struct epoch_tracker et; + struct ifaddr *ifa; + struct ifnet *ifp; + + memset(&sin, 0, sizeof(sin)); + sin.sin_addr.s_addr = addr; + sin.sin_len = sizeof(sin); + sin.sin_family = AF_INET; + NET_EPOCH_ENTER(et); + CURVNET_SET_QUIET(vnet); + ifa = ifa_ifwithaddr((struct sockaddr *)&sin); + CURVNET_RESTORE(); + if (ifa) { + ifp = ifa->ifa_ifp; + if_ref(ifp); + } else { + ifp = NULL; + } + NET_EPOCH_EXIT(et); + return (ifp); +} +#endif + +#ifdef INET6 +static inline struct ifnet * +ip6_ifp_find(struct vnet *vnet, struct in6_addr addr, uint16_t scope_id) +{ + struct sockaddr_in6 sin6; + struct epoch_tracker et; + struct ifaddr *ifa; + struct ifnet *ifp; + + memset(&sin6, 0, sizeof(sin6)); + sin6.sin6_addr = addr; + sin6.sin6_len = sizeof(sin6); + sin6.sin6_family = AF_INET6; + if (IN6_IS_SCOPE_LINKLOCAL(&addr) || + IN6_IS_ADDR_MC_INTFACELOCAL(&addr)) { + /* embed the IPv6 scope ID */ + sin6.sin6_addr.s6_addr16[1] = htons(scope_id); + } + NET_EPOCH_ENTER(et); + CURVNET_SET_QUIET(vnet); + ifa = ifa_ifwithaddr((struct sockaddr *)&sin6); + CURVNET_RESTORE(); + if (ifa != NULL) { + ifp = ifa->ifa_ifp; + if_ref(ifp); + } else { + ifp = NULL; + } + NET_EPOCH_EXIT(et); + return (ifp); +} +#endif + +#endif /* _RDMA_IB_ADDR_FREEBSD_H */ |