1 /*	$NetBSD: ipv6.h,v 1.4 2014/12/10 04:38:02 christos Exp $	*/
2 
3 /*
4  * Copyright (C) 2004-2007  Internet Systems Consortium, Inc. ("ISC")
5  * Copyright (C) 2000, 2001  Internet Software Consortium.
6  *
7  * Permission to use, copy, modify, and/or distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /* Id: ipv6.h,v 1.16 2007/06/19 23:47:23 tbox Exp  */
21 
22 #ifndef LWRES_IPV6_H
23 #define LWRES_IPV6_H 1
24 
25 /*****
26  ***** Module Info
27  *****/
28 
29 /*! \file lwres/ipv6.h
30  * IPv6 definitions for systems which do not support IPv6.
31  */
32 
33 /***
34  *** Imports.
35  ***/
36 
37 #include <lwres/int.h>
38 #include <lwres/platform.h>
39 
40 /***
41  *** Types.
42  ***/
43 
44 /*% in6_addr structure */
45 struct in6_addr {
46         union {
47 		lwres_uint8_t	_S6_u8[16];
48 		lwres_uint16_t	_S6_u16[8];
49 		lwres_uint32_t	_S6_u32[4];
50         } _S6_un;
51 };
52 /*@{*/
53 /*% IP v6 types */
54 #define s6_addr		_S6_un._S6_u8
55 #define s6_addr8	_S6_un._S6_u8
56 #define s6_addr16	_S6_un._S6_u16
57 #define s6_addr32	_S6_un._S6_u32
58 /*@}*/
59 
60 #define IN6ADDR_ANY_INIT 	{{{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }}}
61 #define IN6ADDR_LOOPBACK_INIT 	{{{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }}}
62 
63 LIBLWRES_EXTERNAL_DATA extern const struct in6_addr in6addr_any;
64 LIBLWRES_EXTERNAL_DATA extern const struct in6_addr in6addr_loopback;
65 
66 /*% used in getaddrinfo.c and getnameinfo.c */
67 struct sockaddr_in6 {
68 #ifdef LWRES_PLATFORM_HAVESALEN
69 	lwres_uint8_t		sin6_len;
70 	lwres_uint8_t		sin6_family;
71 #else
72 	lwres_uint16_t		sin6_family;
73 #endif
74 	lwres_uint16_t		sin6_port;
75 	lwres_uint32_t		sin6_flowinfo;
76 	struct in6_addr		sin6_addr;
77 	lwres_uint32_t		sin6_scope_id;
78 };
79 
80 #ifdef LWRES_PLATFORM_HAVESALEN
81 #define SIN6_LEN 1
82 #endif
83 
84 /*% in6_pktinfo structure */
85 struct in6_pktinfo {
86 	struct in6_addr ipi6_addr;    /*%< src/dst IPv6 address */
87 	unsigned int    ipi6_ifindex; /*%< send/recv interface index */
88 };
89 
90 /*!
91  * Unspecified IPv6 address
92  */
93 #define IN6_IS_ADDR_UNSPECIFIED(a)      \
94         (((a)->s6_addr32[0] == 0) &&    \
95          ((a)->s6_addr32[1] == 0) &&    \
96          ((a)->s6_addr32[2] == 0) &&    \
97          ((a)->s6_addr32[3] == 0))
98 
99 /*
100  * Loopback
101  */
102 #define IN6_IS_ADDR_LOOPBACK(a)         \
103         (((a)->s6_addr32[0] == 0) &&    \
104          ((a)->s6_addr32[1] == 0) &&    \
105          ((a)->s6_addr32[2] == 0) &&    \
106          ((a)->s6_addr32[3] == htonl(1)))
107 
108 /*
109  * IPv4 compatible
110  */
111 #define IN6_IS_ADDR_V4COMPAT(a)         \
112         (((a)->s6_addr32[0] == 0) &&    \
113          ((a)->s6_addr32[1] == 0) &&    \
114          ((a)->s6_addr32[2] == 0) &&    \
115          ((a)->s6_addr32[3] != 0) &&    \
116          ((a)->s6_addr32[3] != htonl(1)))
117 
118 /*
119  * Mapped
120  */
121 #define IN6_IS_ADDR_V4MAPPED(a)               \
122         (((a)->s6_addr32[0] == 0) &&          \
123          ((a)->s6_addr32[1] == 0) &&          \
124          ((a)->s6_addr32[2] == htonl(0x0000ffff)))
125 
126 #endif /* LWRES_IPV6_H */
127