Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/ofed/include/rdma/ib_addr_freebsd.h
39482 views
1
/*-
2
* Copyright (c) 2010 Isilon Systems, Inc.
3
* Copyright (c) 2010 iX Systems, Inc.
4
* Copyright (c) 2010 Panasas, Inc.
5
* Copyright (c) 2013-2017 Mellanox Technologies, Ltd.
6
* All rights reserved.
7
*
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions
10
* are met:
11
* 1. Redistributions of source code must retain the above copyright
12
* notice unmodified, this list of conditions, and the following
13
* disclaimer.
14
* 2. Redistributions in binary form must reproduce the above copyright
15
* notice, this list of conditions and the following disclaimer in the
16
* documentation and/or other materials provided with the distribution.
17
*
18
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
*/
29
#ifndef _RDMA_IB_ADDR_FREEBSD_H
30
#define _RDMA_IB_ADDR_FREEBSD_H
31
32
#ifdef INET
33
static inline if_t
34
ip_ifp_find(struct vnet *vnet, uint32_t addr)
35
{
36
struct sockaddr_in sin;
37
struct epoch_tracker et;
38
struct ifaddr *ifa;
39
if_t ifp;
40
41
memset(&sin, 0, sizeof(sin));
42
sin.sin_addr.s_addr = addr;
43
sin.sin_len = sizeof(sin);
44
sin.sin_family = AF_INET;
45
NET_EPOCH_ENTER(et);
46
CURVNET_SET_QUIET(vnet);
47
ifa = ifa_ifwithaddr((struct sockaddr *)&sin);
48
CURVNET_RESTORE();
49
if (ifa) {
50
ifp = ifa->ifa_ifp;
51
if_ref(ifp);
52
} else {
53
ifp = NULL;
54
}
55
NET_EPOCH_EXIT(et);
56
return (ifp);
57
}
58
#endif
59
60
#ifdef INET6
61
static inline if_t
62
ip6_ifp_find(struct vnet *vnet, struct in6_addr addr, uint16_t scope_id)
63
{
64
struct sockaddr_in6 sin6;
65
struct epoch_tracker et;
66
struct ifaddr *ifa;
67
if_t ifp;
68
69
memset(&sin6, 0, sizeof(sin6));
70
sin6.sin6_addr = addr;
71
sin6.sin6_len = sizeof(sin6);
72
sin6.sin6_family = AF_INET6;
73
if (IN6_IS_SCOPE_LINKLOCAL(&addr) ||
74
IN6_IS_ADDR_MC_INTFACELOCAL(&addr)) {
75
/* embed the IPv6 scope ID */
76
sin6.sin6_addr.s6_addr16[1] = htons(scope_id);
77
}
78
NET_EPOCH_ENTER(et);
79
CURVNET_SET_QUIET(vnet);
80
ifa = ifa_ifwithaddr((struct sockaddr *)&sin6);
81
CURVNET_RESTORE();
82
if (ifa != NULL) {
83
ifp = ifa->ifa_ifp;
84
if_ref(ifp);
85
} else {
86
ifp = NULL;
87
}
88
NET_EPOCH_EXIT(et);
89
return (ifp);
90
}
91
#endif
92
93
static inline if_t
94
dev_get_by_index(struct vnet *vnet, int if_index)
95
{
96
struct epoch_tracker et;
97
if_t retval;
98
99
NET_EPOCH_ENTER(et);
100
CURVNET_SET(vnet);
101
retval = ifnet_byindex_ref(if_index);
102
CURVNET_RESTORE();
103
NET_EPOCH_EXIT(et);
104
105
return (retval);
106
}
107
108
#endif /* _RDMA_IB_ADDR_FREEBSD_H */
109
110