xref: /freebsd/sys/compat/linuxkpi/common/include/net/ipv6.h (revision 8d59ecb214f7e078e57d35b865f33efc5d7cdf4d)
1*8d59ecb2SHans Petter Selasky /*-
2*8d59ecb2SHans Petter Selasky  * Copyright (c) 2010 Isilon Systems, Inc.
3*8d59ecb2SHans Petter Selasky  * Copyright (c) 2010 iX Systems, Inc.
4*8d59ecb2SHans Petter Selasky  * Copyright (c) 2010 Panasas, Inc.
5*8d59ecb2SHans Petter Selasky  * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
6*8d59ecb2SHans Petter Selasky  * All rights reserved.
7*8d59ecb2SHans Petter Selasky  *
8*8d59ecb2SHans Petter Selasky  * Redistribution and use in source and binary forms, with or without
9*8d59ecb2SHans Petter Selasky  * modification, are permitted provided that the following conditions
10*8d59ecb2SHans Petter Selasky  * are met:
11*8d59ecb2SHans Petter Selasky  * 1. Redistributions of source code must retain the above copyright
12*8d59ecb2SHans Petter Selasky  *    notice unmodified, this list of conditions, and the following
13*8d59ecb2SHans Petter Selasky  *    disclaimer.
14*8d59ecb2SHans Petter Selasky  * 2. Redistributions in binary form must reproduce the above copyright
15*8d59ecb2SHans Petter Selasky  *    notice, this list of conditions and the following disclaimer in the
16*8d59ecb2SHans Petter Selasky  *    documentation and/or other materials provided with the distribution.
17*8d59ecb2SHans Petter Selasky  *
18*8d59ecb2SHans Petter Selasky  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19*8d59ecb2SHans Petter Selasky  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20*8d59ecb2SHans Petter Selasky  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21*8d59ecb2SHans Petter Selasky  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22*8d59ecb2SHans Petter Selasky  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23*8d59ecb2SHans Petter Selasky  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*8d59ecb2SHans Petter Selasky  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*8d59ecb2SHans Petter Selasky  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*8d59ecb2SHans Petter Selasky  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27*8d59ecb2SHans Petter Selasky  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*8d59ecb2SHans Petter Selasky  *
29*8d59ecb2SHans Petter Selasky  * $FreeBSD$
30*8d59ecb2SHans Petter Selasky  */
31*8d59ecb2SHans Petter Selasky #ifndef _LINUX_NET_IPV6_H_
32*8d59ecb2SHans Petter Selasky #define	_LINUX_NET_IPV6_H_
33*8d59ecb2SHans Petter Selasky 
34*8d59ecb2SHans Petter Selasky #include "opt_inet6.h"
35*8d59ecb2SHans Petter Selasky 
36*8d59ecb2SHans Petter Selasky #define	ipv6_addr_loopback IN6_IS_ADDR_LOOPBACK
37*8d59ecb2SHans Petter Selasky #define	ipv6_addr_copy(dst, src)					\
38*8d59ecb2SHans Petter Selasky 	memcpy((dst), (src), sizeof(struct in6_addr))
39*8d59ecb2SHans Petter Selasky 
40*8d59ecb2SHans Petter Selasky #ifdef INET6
41*8d59ecb2SHans Petter Selasky static inline void
42*8d59ecb2SHans Petter Selasky ipv6_ib_mc_map(const struct in6_addr *addr, const unsigned char *broadcast,
43*8d59ecb2SHans Petter Selasky     char *buf)
44*8d59ecb2SHans Petter Selasky {
45*8d59ecb2SHans Petter Selasky 	unsigned char scope;
46*8d59ecb2SHans Petter Selasky 
47*8d59ecb2SHans Petter Selasky 	scope = broadcast[5] & 0xF;
48*8d59ecb2SHans Petter Selasky 	buf[0]  = 0;
49*8d59ecb2SHans Petter Selasky 	buf[1]  = 0xff;
50*8d59ecb2SHans Petter Selasky 	buf[2]  = 0xff;
51*8d59ecb2SHans Petter Selasky 	buf[3]  = 0xff;
52*8d59ecb2SHans Petter Selasky 	buf[4]  = 0xff;
53*8d59ecb2SHans Petter Selasky 	buf[5]  = 0x10 | scope;
54*8d59ecb2SHans Petter Selasky 	buf[6]  = 0x60;
55*8d59ecb2SHans Petter Selasky 	buf[7]  = 0x1b;
56*8d59ecb2SHans Petter Selasky 	buf[8]  = broadcast[8];
57*8d59ecb2SHans Petter Selasky 	buf[9]  = broadcast[9];
58*8d59ecb2SHans Petter Selasky 	memcpy(&buf[10], &addr->s6_addr[6], 10);
59*8d59ecb2SHans Petter Selasky }
60*8d59ecb2SHans Petter Selasky #endif
61*8d59ecb2SHans Petter Selasky 
62*8d59ecb2SHans Petter Selasky static inline void __ipv6_addr_set_half(__be32 *addr,
63*8d59ecb2SHans Petter Selasky                                         __be32 wh, __be32 wl)
64*8d59ecb2SHans Petter Selasky {
65*8d59ecb2SHans Petter Selasky #if BITS_PER_LONG == 64
66*8d59ecb2SHans Petter Selasky #if defined(__BIG_ENDIAN)
67*8d59ecb2SHans Petter Selasky         if (__builtin_constant_p(wh) && __builtin_constant_p(wl)) {
68*8d59ecb2SHans Petter Selasky                 *(__force u64 *)addr = ((__force u64)(wh) << 32 | (__force u64)(wl));
69*8d59ecb2SHans Petter Selasky                 return;
70*8d59ecb2SHans Petter Selasky         }
71*8d59ecb2SHans Petter Selasky #elif defined(__LITTLE_ENDIAN)
72*8d59ecb2SHans Petter Selasky         if (__builtin_constant_p(wl) && __builtin_constant_p(wh)) {
73*8d59ecb2SHans Petter Selasky                 *(__force u64 *)addr = ((__force u64)(wl) << 32 | (__force u64)(wh));
74*8d59ecb2SHans Petter Selasky                 return;
75*8d59ecb2SHans Petter Selasky         }
76*8d59ecb2SHans Petter Selasky #endif
77*8d59ecb2SHans Petter Selasky #endif
78*8d59ecb2SHans Petter Selasky         addr[0] = wh;
79*8d59ecb2SHans Petter Selasky         addr[1] = wl;
80*8d59ecb2SHans Petter Selasky }
81*8d59ecb2SHans Petter Selasky 
82*8d59ecb2SHans Petter Selasky static inline void ipv6_addr_set(struct in6_addr *addr,
83*8d59ecb2SHans Petter Selasky                                      __be32 w1, __be32 w2,
84*8d59ecb2SHans Petter Selasky                                      __be32 w3, __be32 w4)
85*8d59ecb2SHans Petter Selasky {
86*8d59ecb2SHans Petter Selasky         __ipv6_addr_set_half(&addr->s6_addr32[0], w1, w2);
87*8d59ecb2SHans Petter Selasky         __ipv6_addr_set_half(&addr->s6_addr32[2], w3, w4);
88*8d59ecb2SHans Petter Selasky }
89*8d59ecb2SHans Petter Selasky 
90*8d59ecb2SHans Petter Selasky static inline void ipv6_addr_set_v4mapped(const __be32 addr,
91*8d59ecb2SHans Petter Selasky 					  struct in6_addr *v4mapped)
92*8d59ecb2SHans Petter Selasky {
93*8d59ecb2SHans Petter Selasky 	ipv6_addr_set(v4mapped,
94*8d59ecb2SHans Petter Selasky 			0, 0,
95*8d59ecb2SHans Petter Selasky 			htonl(0x0000FFFF),
96*8d59ecb2SHans Petter Selasky 			addr);
97*8d59ecb2SHans Petter Selasky }
98*8d59ecb2SHans Petter Selasky 
99*8d59ecb2SHans Petter Selasky static inline int ipv6_addr_v4mapped(const struct in6_addr *a)
100*8d59ecb2SHans Petter Selasky {
101*8d59ecb2SHans Petter Selasky 	return ((a->s6_addr32[0] | a->s6_addr32[1] |
102*8d59ecb2SHans Petter Selasky 		(a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0);
103*8d59ecb2SHans Petter Selasky }
104*8d59ecb2SHans Petter Selasky 
105*8d59ecb2SHans Petter Selasky static inline int ipv6_addr_cmp(const struct in6_addr *a1, const struct in6_addr *a2)
106*8d59ecb2SHans Petter Selasky {
107*8d59ecb2SHans Petter Selasky         return memcmp(a1, a2, sizeof(struct in6_addr));
108*8d59ecb2SHans Petter Selasky }
109*8d59ecb2SHans Petter Selasky 
110*8d59ecb2SHans Petter Selasky 
111*8d59ecb2SHans Petter Selasky #endif	/* _LINUX_NET_IPV6_H_ */
112