Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/compat/linuxkpi/common/include/net/ipv6.h
39604 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, 2014 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 _LINUXKPI_NET_IPV6_H_
30
#define _LINUXKPI_NET_IPV6_H_
31
32
#include <sys/types.h>
33
#include <netinet/in.h>
34
#include <linux/types.h>
35
#include <linux/bitops.h>
36
37
#define IPV6_DEFAULT_HOPLIMIT 64
38
39
#define NEXTHDR_HOP IPPROTO_HOPOPTS
40
#define NEXTHDR_ROUTING IPPROTO_ROUTING
41
#define NEXTHDR_NONE IPPROTO_NONE
42
#define NEXTHDR_DEST IPPROTO_DSTOPTS
43
44
#define ipv6_addr_loopback(addr) IN6_IS_ADDR_LOOPBACK(addr)
45
#define ipv6_addr_any(addr) IN6_IS_ADDR_UNSPECIFIED(addr)
46
47
#define ipv6_addr_copy(dst, src) \
48
memcpy((dst), (src), sizeof(struct in6_addr))
49
50
static inline void
51
ipv6_ib_mc_map(const struct in6_addr *addr, const unsigned char *broadcast,
52
char *buf)
53
{
54
unsigned char scope;
55
56
scope = broadcast[5] & 0xF;
57
buf[0] = 0;
58
buf[1] = 0xff;
59
buf[2] = 0xff;
60
buf[3] = 0xff;
61
buf[4] = 0xff;
62
buf[5] = 0x10 | scope;
63
buf[6] = 0x60;
64
buf[7] = 0x1b;
65
buf[8] = broadcast[8];
66
buf[9] = broadcast[9];
67
memcpy(&buf[10], &addr->s6_addr[6], 10);
68
}
69
70
static inline void __ipv6_addr_set_half(__be32 *addr, __be32 wh, __be32 wl)
71
{
72
#if BITS_PER_LONG == 64
73
#if defined(__BIG_ENDIAN)
74
if (__builtin_constant_p(wh) && __builtin_constant_p(wl)) {
75
*(__force u64 *)addr = ((__force u64)(wh) << 32 | (__force u64)(wl));
76
return;
77
}
78
#elif defined(__LITTLE_ENDIAN)
79
if (__builtin_constant_p(wl) && __builtin_constant_p(wh)) {
80
*(__force u64 *)addr = ((__force u64)(wl) << 32 | (__force u64)(wh));
81
return;
82
}
83
#endif
84
#endif
85
addr[0] = wh;
86
addr[1] = wl;
87
}
88
89
static inline void ipv6_addr_set(struct in6_addr *addr,
90
__be32 w1, __be32 w2,
91
__be32 w3, __be32 w4)
92
{
93
__ipv6_addr_set_half(&addr->s6_addr32[0], w1, w2);
94
__ipv6_addr_set_half(&addr->s6_addr32[2], w3, w4);
95
}
96
97
static inline void ipv6_addr_set_v4mapped(const __be32 addr,
98
struct in6_addr *v4mapped)
99
{
100
ipv6_addr_set(v4mapped,
101
0, 0,
102
htonl(0x0000FFFF),
103
addr);
104
}
105
106
static inline int ipv6_addr_v4mapped(const struct in6_addr *a)
107
{
108
return ((a->s6_addr32[0] | a->s6_addr32[1] |
109
(a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0);
110
}
111
112
static inline int ipv6_addr_cmp(const struct in6_addr *a1, const struct in6_addr *a2)
113
{
114
return memcmp(a1, a2, sizeof(struct in6_addr));
115
}
116
117
#endif /* _LINUXKPI_NET_IPV6_H_ */
118
119