summaryrefslogtreecommitdiffstats
path: root/lib/isc/win32/include/isc/ipv6.h
blob: 4ab567a7f01c96a40920e9155ff4327933f31440 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
 *
 * SPDX-License-Identifier: MPL-2.0
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0.  If a copy of the MPL was not distributed with this
 * file, you can obtain one at https://mozilla.org/MPL/2.0/.
 *
 * See the COPYRIGHT file distributed with this work for additional
 * information regarding copyright ownership.
 */

#ifndef ISC_IPV6_H
#define ISC_IPV6_H 1

/*****
***** Module Info
*****/

/*
 * IPv6 definitions for systems which do not support IPv6.
 *
 * MP:
 *	No impact.
 *
 * Reliability:
 *	No anticipated impact.
 *
 * Resources:
 *	N/A.
 *
 * Security:
 *	No anticipated impact.
 *
 * Standards:
 *	RFC2553.
 */

#if _MSC_VER < 1300
#define in6_addr in_addr6
#endif /* if _MSC_VER < 1300 */

#ifndef IN6ADDR_ANY_INIT
#define IN6ADDR_ANY_INIT                                               \
	{                                                              \
		{                                                      \
			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \
		}                                                      \
	}
#endif /* ifndef IN6ADDR_ANY_INIT */
#ifndef IN6ADDR_LOOPBACK_INIT
#define IN6ADDR_LOOPBACK_INIT                                          \
	{                                                              \
		{                                                      \
			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 \
		}                                                      \
	}
#endif /* ifndef IN6ADDR_LOOPBACK_INIT */
#ifndef IN6ADDR_V4MAPPED_INIT
#define IN6ADDR_V4MAPPED_INIT                                                \
	{                                                                    \
		{                                                            \
			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0, 0, 0, 0 \
		}                                                            \
	}
#endif /* ifndef IN6ADDR_V4MAPPED_INIT */

LIBISC_EXTERNAL_DATA extern const struct in6_addr isc_in6addr_any;
LIBISC_EXTERNAL_DATA extern const struct in6_addr isc_in6addr_loopback;

/*
 * Unspecified
 */
#ifndef IN6_IS_ADDR_UNSPECIFIED
#define IN6_IS_ADDR_UNSPECIFIED(a)               \
	(*((u_long *)((a)->s6_addr)) == 0 &&     \
	 *((u_long *)((a)->s6_addr) + 1) == 0 && \
	 *((u_long *)((a)->s6_addr) + 2) == 0 && \
	 *((u_long *)((a)->s6_addr) + 3) == 0)
#endif /* ifndef IN6_IS_ADDR_UNSPECIFIED */

/*
 * Loopback
 */
#ifndef IN6_IS_ADDR_LOOPBACK
#define IN6_IS_ADDR_LOOPBACK(a)                  \
	(*((u_long *)((a)->s6_addr)) == 0 &&     \
	 *((u_long *)((a)->s6_addr) + 1) == 0 && \
	 *((u_long *)((a)->s6_addr) + 2) == 0 && \
	 *((u_long *)((a)->s6_addr) + 3) == htonl(1))
#endif /* ifndef IN6_IS_ADDR_LOOPBACK */

/*
 * IPv4 compatible
 */
#define IN6_IS_ADDR_V4COMPAT(a)                  \
	(*((u_long *)((a)->s6_addr)) == 0 &&     \
	 *((u_long *)((a)->s6_addr) + 1) == 0 && \
	 *((u_long *)((a)->s6_addr) + 2) == 0 && \
	 *((u_long *)((a)->s6_addr) + 3) != 0 && \
	 *((u_long *)((a)->s6_addr) + 3) != htonl(1))

/*
 * Mapped
 */
#define IN6_IS_ADDR_V4MAPPED(a)                  \
	(*((u_long *)((a)->s6_addr)) == 0 &&     \
	 *((u_long *)((a)->s6_addr) + 1) == 0 && \
	 *((u_long *)((a)->s6_addr) + 2) == htonl(0x0000ffff))

/*
 * Multicast
 */
#define IN6_IS_ADDR_MULTICAST(a) ((a)->s6_addr[0] == 0xffU)

/*
 * Unicast link / site local.
 */
#ifndef IN6_IS_ADDR_LINKLOCAL
#define IN6_IS_ADDR_LINKLOCAL(a) \
	(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
#endif /* ifndef IN6_IS_ADDR_LINKLOCAL */

#ifndef IN6_IS_ADDR_SITELOCAL
#define IN6_IS_ADDR_SITELOCAL(a) \
	(((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
#endif /* ifndef IN6_IS_ADDR_SITELOCAL */

#endif /* ISC_IPV6_H */