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