1 /*
2  * Project    : ipv6calc
3  * File       : libipv6addr.h
4  * Version    : $Id: a4a6d603b6684727a405a791d21d5f5563ffe08b $
5  * Copyright  : 2001-2019 by Peter Bieringer <pb (at) bieringer.de> except the parts taken from kernel source
6  * License    : GNU GPL v2
7  *
8  * Information:
9  *  Header file for libipv6addr.c
10  */
11 
12 #include "ipv6calctypes.h"
13 #include <netinet/in.h>
14 #include <ctype.h>
15 
16 /* typedefs & defines */
17 
18 #ifndef _libipv6addr_h
19 
20 #define _libipv6addr_h 1
21 
22 /* IPv6 anonymization */
23 /*
24  * IID anonymization is done by replacing with related information (64-bit)
25  * xxxx:xxxx:xxxx:xxxC  (C = 4-bit checksum)
26  *
27  * a9p9 4941 0000 000C  -> RFC 4941 anonymized privacy extension Interface ID
28  *
29  * a9p9 4291 4xxx xxxC  -> RFC 4291 anonymized EUI-48 Interface ID, xxx xxx = converted OUI
30  * a9p9 4291 5xxx xxxC  -> RFC 4291 anonymized EUI-48 Interface ID, xxx xxx = converted mapped IAB/OUI-36/OUI-28
31  * a9p9 4291 6xxx xxxC  -> RFC 4291 anonymized EUI-64 Interface ID, xxx xxx = converted OUI
32  * a9p9 4291 7xxx xxxC  -> RFC 4291 anonymized EUI-64 Interface ID, xxx xxx = converted mapped IAB/OUI-36/OUI-28
33  * a9p9 4291 8xxx xxxC  -> RFC 4291 embedded anonymized IPv4 address, xxx xxx = first 24 bit of included (anonymized) IPv4 address
34  * a9p9 4291 c02d 5d1C  -> RFC 4291 Chapter 2.5.1 anonymized static Interface ID
35  *
36  * a9p9 5214 4xxx xxxC  -> RFC 5214 anonymized ISATAP Interface ID, xxx xxx = first 24 bit of included (anonymized) IPv4 address (local scope)
37  * a9p9 5214 5xxx xxxC  -> RFC 5214 anonymized ISATAP Interface ID, xxx xxx = first 24 bit of included (anonymized) IPv4 address (global scope)
38  * a9p9 5214 cxx0 000C  -> RFC 5214 anonymized ISATAP Interface ID, xx      = first  8 bit of included vendor ID (local scope)
39  * a9p9 5214 dxx0 000C  -> RFC 5214 anonymized ISATAP Interface ID, xx      = first  8 bit of included vendor ID (global scope)
40  * a9p9 5214 exxx xxxC  -> RFC 5214 anonymized ISATAP Interface ID, xxx xxx = first 24 bit of included extension ID (local scope)
41  * a9p9 5214 fxxx xxxC  -> RFC 5214 anonymized ISATAP Interface ID, xxx xxx = first 24 bit of included extension ID (global scope)
42  *
43  * a9p9 4843 0000 000C  -> RFC 4843 anonymized ORCHID hash
44  *
45  * SLA/NLA prefix part anonymization is done by replacing with pattern a909a909
46  *   p = number of nibbles anonymized in prefix
47  *   		0 : no nibble of prefix is anonymized
48  *   		f : Prefix anonymization with method=kp|kg
49  *
50  * Prefix anonymization, but skipped for
51  *  - LISP anycast
52  * in case of method=kp: p=0x0f
53  * a909:ccca:aaaa:aaaC  (C = 4-bit checksum)
54  *                      ccc      -> 10-bit Country Code mapping [A-Z]*[A-Z0-9] (936)
55  *                                   0x3FD = LISP
56  *                                   0x3FE = unknown country
57  *                                   0x3FF - 16 + REGISTRY_6BONE && ASN=0 = 6bone
58  *                                   0x000-0x3A7: c1= c / 36, c2 = c % 36
59  *                               -> 2 leftmost bit are |0 0|
60  *                      aaaaaaaa -> 32-bit ASN
61  *
62  * in case of method=kg: p=0x0f
63  * a909:sssg:gggg:gggC  (C = 4-bit checksum)
64  *                      sss      -> 10-bit source mapping
65  *                                   GeonameID source information
66  *                                   0x000 = unknown
67  *			             0x001 = continent  (prio: lowest)
68  *                                   0x002 = country
69  *                                   0x003 = state/prov
70  *                                   0x004 = district
71  *                                   0x005 = city       (prio: highest)
72  *                                   0x006 = (reserved)
73  *                                   0x007 = LISP
74  *                                   0x0r. = registry
75  *                               -> 2 leftmost bit are |0 1|
76  *                      gggggggg -> 32-bit GeonameID
77  *                                   0x11800 = LISP
78  */
79 #define ANON_TOKEN_VALUE_00_31		(uint32_t) 0xa9090000u
80 #define ANON_TOKEN_MASK_00_31		(uint32_t) 0xff0f0000u
81 
82 #define ANON_IID_PREFIX_NIBBLES_MASK	(uint32_t) 0x0000000fu
83 #define ANON_IID_PREFIX_NIBBLES_SHIFT	20
84 
85 #define ANON_CHECKSUM_MASK_32_63	(uint32_t) 0x0000000fu
86 
87 #define ANON_IID_RANDOM_VALUE_00_31	(uint32_t) 0x00004941u
88 #define ANON_IID_RANDOM_MASK_00_31	(uint32_t) 0x0000ffffu
89 #define ANON_IID_RANDOM_VALUE_32_63	(uint32_t) 0x00000000u
90 #define ANON_IID_RANDOM_MASK_32_63	(uint32_t) 0xfffffff0u
91 
92 #define ANON_IID_STATIC_VALUE_00_31	(uint32_t) 0x00004291u
93 #define ANON_IID_STATIC_MASK_00_31	(uint32_t) 0x0000ffffu
94 #define ANON_IID_STATIC_VALUE_32_63	(uint32_t) 0xc02d5d10u
95 #define ANON_IID_STATIC_MASK_32_63	(uint32_t) 0xfffffff0u
96 
97 #define ANON_ORCHID_VALUE_00_31		(uint32_t) 0x00004843u
98 #define ANON_ORCHID_STATIC_MASK_00_31	(uint32_t) 0x0000ffffu
99 #define ANON_ORCHID_VALUE_32_63		(uint32_t) 0x00000000u
100 #define ANON_ORCHID_STATIC_MASK_32_63	(uint32_t) 0xfffffff0u
101 
102 #define ANON_IID_EUI48_VALUE_00_31	(uint32_t) 0x00004291u
103 #define ANON_IID_EUI48_MASK_00_31	(uint32_t) 0x0000ffffu
104 #define ANON_IID_EUI48_VALUE_32_63	(uint32_t) 0x40000000u
105 #define ANON_IID_EUI48_MASK_32_63	(uint32_t) 0xe0000000u
106 #define ANON_IID_EUI48_PAYLOAD_32_63	(uint32_t) 0x1ffffff0u
107 #define ANON_IID_EUI48_PAYLOAD_SHIFT	4
108 #define ANON_IID_EUI48_PAYLOAD_LENGTH	24
109 
110 #define ANON_IID_EUI64_VALUE_00_31	(uint32_t) 0x00004291u
111 #define ANON_IID_EUI64_MASK_00_31	(uint32_t) 0x0000ffffu
112 #define ANON_IID_EUI64_VALUE_32_63	(uint32_t) 0x60000000u
113 #define ANON_IID_EUI64_MASK_32_63	(uint32_t) 0xe0000000u
114 #define ANON_IID_EUI64_PAYLOAD_32_63	(uint32_t) 0x1ffffff0u
115 #define ANON_IID_EUI64_PAYLOAD_SHIFT	4
116 #define ANON_IID_EUI64_PAYLOAD_LENGTH	24
117 
118 #define ANON_IID_IPV4_VALUE_00_31	(uint32_t) 0x00004291u
119 #define ANON_IID_IPV4_MASK_00_31	(uint32_t) 0x0000ffffu
120 #define ANON_IID_IPV4_VALUE_32_63	(uint32_t) 0x80000000u
121 #define ANON_IID_IPV4_MASK_32_63	(uint32_t) 0xf0000000u
122 #define ANON_IID_IPV4_PAYLOAD_32_63	(uint32_t) 0x0ffffff0u
123 #define ANON_IID_IPV4_PAYLOAD_SHIFT	4
124 #define ANON_IID_IPV4_PAYLOAD_LENGTH	24
125 
126 #define ANON_IID_EUIxx_SCOPE_MASK	(uint32_t) 0x00200000u
127 #define ANON_IID_EUIxx_SCOPE_GLOBAL	(uint32_t) 0x00200000u
128 #define ANON_IID_EUIxx_SCOPE_LOCAL	(uint32_t) 0x00000000u
129 
130 #define ANON_IID_ISATAP_VALUE_00_31			(uint32_t) 0x00005214u
131 #define ANON_IID_ISATAP_MASK_00_31			(uint32_t) 0x0000ffffu
132 #define ANON_IID_ISATAP_PAYLOAD_SHIFT			4
133 #define ANON_IID_ISATAP_PAYLOAD_LENGTH			24
134 
135 #define ANON_IID_ISATAP_SCOPE_MASK			(uint32_t) 0x10000000u
136 #define ANON_IID_ISATAP_SCOPE_LOCAL			(uint32_t) 0x00000000u
137 #define ANON_IID_ISATAP_SCOPE_GLOBAL			(uint32_t) 0x10000000u
138 
139 #define ANON_IID_ISATAP_TYPE_MASK_32_63			(uint32_t) 0xe0000000u
140 #define ANON_IID_ISATAP_TYPE_IPV4_VALUE_32_63		(uint32_t) 0x40000000u
141 #define ANON_IID_ISATAP_TYPE_IPV4_PAYLOAD_32_63		(uint32_t) 0x0ffffff0u
142 #define ANON_IID_ISATAP_TYPE_VENDOR_VALUE_32_63		(uint32_t) 0xc0000000u
143 #define ANON_IID_ISATAP_TYPE_VENDOR_PAYLOAD_32_63	(uint32_t) 0x0ff00000u
144 #define ANON_IID_ISATAP_TYPE_EXTID_VALUE_32_63		(uint32_t) 0xe0000000u
145 #define ANON_IID_ISATAP_TYPE_EXTID_PAYLOAD_32_63	(uint32_t) 0x0ffffff0u
146 
147 #define ANON_CHECKSUM_FLAG_CREATE	1
148 #define ANON_CHECKSUM_FLAG_VERIFY	2
149 
150 // Prefix anonymization on method=kp
151 #define ANON_METHOD_KEEPTYPEASNCC_IPV6_REQ_DB	(IPV6CALC_DB_IPV6_TO_CC | IPV6CALC_DB_IPV6_TO_AS)
152 // Prefix anonymization on method=kg
153 #define ANON_METHOD_KEEPTYPEGEONAMEID_IPV6_REQ_DB	(IPV6CALC_DB_IPV6_TO_GEONAMEID)
154 
155 #define ANON_PREFIX_CCINDEX_DWORD	0
156 #define ANON_PREFIX_CCINDEX_SHIFT	4
157 #define ANON_PREFIX_CCINDEX_MASK	0x3ff
158 #define ANON_PREFIX_CCINDEX_XOR		0x0
159 
160 #define ANON_PREFIX_GEONAMEID_TYPE_DWORD	0
161 #define ANON_PREFIX_GEONAMEID_TYPE_SHIFT	4
162 #define ANON_PREFIX_GEONAMEID_TYPE_MASK		0x3ff
163 #define ANON_PREFIX_GEONAMEID_TYPE_XOR		0x0
164 
165 #define ANON_PREFIX_ASN32_MSB_DWORD	0
166 #define ANON_PREFIX_ASN32_MSB_SHIFT	0
167 #define ANON_PREFIX_ASN32_MSB_AMOUNT	4
168 #define ANON_PREFIX_ASN32_MSB_MASK	((1 << ANON_PREFIX_ASN32_MSB_AMOUNT) - 1)
169 #define ANON_PREFIX_ASN32_MSB_XOR	0x0000000a
170 
171 #define ANON_PREFIX_ASN32_LSB_DWORD	1
172 #define ANON_PREFIX_ASN32_LSB_SHIFT	4
173 #define ANON_PREFIX_ASN32_LSB_AMOUNT	28
174 #define ANON_PREFIX_ASN32_LSB_MASK	((1 << ANON_PREFIX_ASN32_LSB_AMOUNT) - 1)
175 #define ANON_PREFIX_ASN32_LSB_XOR	0x09090000
176 
177 #define ANON_PREFIX_GEONAMEID_MSB_DWORD	0
178 #define ANON_PREFIX_GEONAMEID_MSB_SHIFT	0
179 #define ANON_PREFIX_GEONAMEID_MSB_AMOUNT	4
180 #define ANON_PREFIX_GEONAMEID_MSB_MASK	((1 << ANON_PREFIX_GEONAMEID_MSB_AMOUNT) - 1)
181 #define ANON_PREFIX_GEONAMEID_MSB_XOR	0x0000000a
182 
183 #define ANON_PREFIX_GEONAMEID_LSB_DWORD	1
184 #define ANON_PREFIX_GEONAMEID_LSB_SHIFT	4
185 #define ANON_PREFIX_GEONAMEID_LSB_AMOUNT	28
186 #define ANON_PREFIX_GEONAMEID_LSB_MASK	((1 << ANON_PREFIX_GEONAMEID_LSB_AMOUNT) - 1)
187 #define ANON_PREFIX_GEONAMEID_LSB_XOR	0x09090000
188 
189 #define ANON_PREFIX_FLAGS_DWORD		0
190 #define ANON_PREFIX_FLAGS_SHIFT		14
191 #define ANON_PREFIX_FLAGS_MASK		0x3
192 #define ANON_PREFIX_FLAGS_XOR		0x0
193 
194 #define ANON_PREFIX_TOKEN_DWORD		0
195 #define ANON_PREFIX_TOKEN_SHIFT		16
196 #define ANON_PREFIX_TOKEN_MASK		0xffff
197 #define ANON_PREFIX_TOKEN_XOR		0x0
198 #define ANON_PREFIX_TOKEN_VALUE		0xa909		// fix
199 
200 // Payload selector
201 #define ANON_PREFIX_PAYLOAD_FLAGS		0
202 #define ANON_PREFIX_PAYLOAD_CCINDEX		1
203 #define ANON_PREFIX_PAYLOAD_ASN32		2
204 #define ANON_PREFIX_PAYLOAD_GEONAMEID		3
205 #define ANON_PREFIX_PAYLOAD_GEONAMEID_TYPE	4
206 
207 
208 /* IPv6 address storage structure */
209 typedef struct {
210 	struct   in6_addr in6_addr;	/* in6_addr structure */
211 	uint8_t  prefixlength;		/* prefix length (0-128) 8 bit */
212 	int      flag_prefixuse;	/* =1: prefix length in use */
213 	uint32_t typeinfo;		/* address typeinfo/scope */
214 	uint32_t typeinfo2;		/* address typeinfo2 */
215 	int8_t   flag_typeinfo;		/* =1: typeinfo valid */
216 	uint8_t  bit_start;		/* start of bit */
217 	uint8_t  bit_end;		/* end of bit */
218 	int8_t   flag_startend_use;	/* =1: start or end of bit in use */
219 	int8_t   flag_valid;		/* address structure filled */
220 	char     scopeid[IPV6CALC_SCOPEID_STRING_MAX];	/* scope ID value */
221 	int8_t   flag_scopeid;		/* =1: scope ID value (above) set */
222 	uint8_t  prefix2length;		/* prefix 2 length (0-128) 8 bit (usage depends on typeinfo/typeinfo2)*/
223 	uint8_t  test_mode;		/* address test mode */
224 } ipv6calc_ipv6addr;
225 
226 /* IPv6 Address filter structure */
227 typedef struct {
228         int active;
229         int addr_must_have_max;
230         int addr_may_not_have_max;
231         ipv6calc_ipv6addr ipv6addr_must_have[IPV6CALC_FILTER_IPV4ADDR];
232         ipv6calc_ipv6addr ipv6addr_may_not_have[IPV6CALC_FILTER_IPV6ADDR];
233 } s_ipv6calc_filter_addr_ipv6;
234 
235 /* IPv6 filter structure */
236 typedef struct {
237 	int active;
238 	s_ipv6calc_filter_typeinfo    filter_typeinfo;
239 	s_ipv6calc_filter_typeinfo    filter_typeinfo2;
240 	s_ipv6calc_filter_db_cc       filter_db_cc;        // Country Code filter
241 	s_ipv6calc_filter_db_asn      filter_db_asn;       // Autonomous System Number filter
242 	s_ipv6calc_filter_db_registry filter_db_registry;  // Registry filter
243 	s_ipv6calc_filter_addr_ipv6   filter_addr;         // IPv6 Address filter
244 	/* others may come next */
245 } s_ipv6calc_filter_ipv6addr;
246 
247 
248 /* IID statistics */
249 typedef struct {
250 	float hexdigit;
251 	float lls_residual;		// lls: linear least square
252 	int   digit_blocks[16];		// block length of same digit
253 	int   digit_blocks_hexdigit[16];// hex digits used in blocks of same digit
254 	int   digit_amount[16]; 	// amount of digits
255 	int   digit_delta[31];  	// delta of digits
256 	int   digit_delta_amount;  	// amount of delta of digits
257 } s_iid_statistics;
258 
259 /* IID random limits */
260 // this filter values detects 999.744 from 1.000.000 generated random (using privacy extension) IIDs (256 are not detected)
261 /*@unused@*/ static const s_iid_statistics s_iid_statistics_ok_min = {
262 	0.249,		// fits to 100% of 1 million tested
263 	6.275,		// fits to 100% of 1 million tested
264 	{  4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},	// fit to 100% of 1 million tested
265 	{  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},	// fit to 100% of 1 million tested
266 	{  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},	// default
267 	{  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // default
268 	6	// fit to 1 million
269 };
270 
271 /*@unused@*/ static const s_iid_statistics s_iid_statistics_ok_max = {
272 	2.5,		// fits to 1 million - 90 tested (100%: 4.016)
273 	26.042,		// fits to 100% of 1 million tested
274 	{ 16, 6, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},	// fit to 1 million - 3 tested
275 	{  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},	// TODO
276 	{  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7},	// fit to 1 million - 38 tested
277 	{  3, 4, 3, 3, 4, 5, 4, 5, 5, 5, 6, 6, 6, 7, 7, 6, 6, 7, 6, 6, 6, 5, 5, 5, 4, 4, 4, 4, 4, 3, 2},	// fit to 1 million
278 	15	// fit to 1 million
279 };
280 
281 
282 
283 /* IPv6 address type definitions
284  * with credits to kernel and USAGI developer team
285  * basic information was taken from "kernel/include/net/ipv6.h"
286  */
287 
288 /*
289  *	Addr type
290  *
291  *	type	-	unicast | multicast | anycast
292  *	scope	-	local	| site	    | global
293  *	v4	-	compat
294  *	v4mapped
295  *	any
296  *	loopback
297  */
298 
299 #define IPV6_ADDR_ANY				(uint32_t) 0x00000000U
300 
301 #define IPV6_ADDR_UNICAST			(uint32_t) 0x00000001U
302 #define IPV6_ADDR_MULTICAST			(uint32_t) 0x00000002U
303 #define IPV6_ADDR_ANYCAST			(uint32_t) 0x00000004U
304 #define IPV6_ADDR_ANONYMIZED_PREFIX		(uint32_t) 0x00000008U	/* anonymized IPv6 address (prefix) */
305 
306 #define IPV6_ADDR_LOOPBACK			(uint32_t) 0x00000010U
307 #define IPV6_ADDR_LINKLOCAL			(uint32_t) 0x00000020U
308 #define IPV6_ADDR_SITELOCAL			(uint32_t) 0x00000040U
309 #define IPV6_ADDR_COMPATv4			(uint32_t) 0x00000080U
310 
311 #define IPV6_ADDR_SCOPE_MASK			(uint32_t) 0x000000f0U
312 
313 #define IPV6_NEW_ADDR_IID_TEREDO		(uint32_t) 0x00000100U	/* RFC xxxx */
314 #define IPV6_NEW_ADDR_IID_ISATAP		(uint32_t) 0x00000200U	/* RFC 5214 (ex 4214) */
315 #define IPV6_NEW_ADDR_IID_EUI48			(uint32_t) 0x00000400U
316 #define IPV6_NEW_ADDR_IID_EUI64			(uint32_t) 0x00000800U
317 
318 #define IPV6_ADDR_MAPPED			(uint32_t) 0x00001000U
319 #define IPV6_ADDR_RESERVED			(uint32_t) 0x00002000U	/* reserved address space */
320 #define IPV6_ADDR_ULUA				(uint32_t) 0x00004000U	/* Unique Local Unicast Address */
321 #define IPV6_ADDR_ANONYMIZED_IID		(uint32_t) 0x00008000U	/* anonymized IPv6 address (IID) */
322 
323 #define IPV6_NEW_ADDR_6TO4			(uint32_t) 0x00010000U
324 #define IPV6_NEW_ADDR_6BONE			(uint32_t) 0x00020000U
325 #define IPV6_NEW_ADDR_AGU			(uint32_t) 0x00040000U
326 #define IPV6_NEW_ADDR_UNSPECIFIED		(uint32_t) 0x00080000U
327 
328 #define IPV6_NEW_ADDR_SOLICITED_NODE		(uint32_t) 0x00100000U
329 #define IPV6_ADDR_IID_32_63_HAS_IPV4		(uint32_t) 0x00200000U
330 #define IPV6_NEW_ADDR_PRODUCTIVE		(uint32_t) 0x00400000U
331 #define IPV6_NEW_ADDR_6TO4_MICROSOFT		(uint32_t) 0x00800000U
332 
333 #define IPV6_NEW_ADDR_TEREDO			(uint32_t) 0x01000000U
334 #define IPV6_NEW_ADDR_ORCHID			(uint32_t) 0x02000000U  /* RFC 4843 */
335 #define IPV6_NEW_ADDR_LINKLOCAL_TEREDO		(uint32_t) 0x04000000U
336 #define IPV6_NEW_ADDR_NAT64			(uint32_t) 0x08000000U	/* RFC 6052 */
337 
338 #define IPV6_NEW_ADDR_IID_RANDOM		(uint32_t) 0x10000000U	/* possible RFC 4941 (ex 3041) */
339 #define IPV6_NEW_ADDR_IID			(uint32_t) 0x20000000U	/* IPv6 address with IID inside */
340 #define IPV6_NEW_ADDR_IID_LOCAL			(uint32_t) 0x40000000U	/* IPv6 address with local generated IID */
341 #define IPV6_NEW_ADDR_IID_GLOBAL		(uint32_t) 0x80000000U	/* IPv6 address with global IID */
342 
343 #define IPV6_ADDR_HAS_PUBLIC_IPV4_IN_PREFIX	(IPV6_NEW_ADDR_6TO4 | IPV6_NEW_ADDR_TEREDO)
344 #define IPV6_ADDR_HAS_PUBLIC_IPV4_IN_IID	(IPV6_NEW_ADDR_NAT64 | IPV6_NEW_ADDR_TEREDO | IPV6_ADDR_COMPATv4 | IPV6_ADDR_MAPPED | IPV6_NEW_ADDR_6TO4_MICROSOFT)
345 #define IPV6_ADDR_HAS_PUBLIC_IPV4		(IPV6_ADDR_HAS_PUBLIC_IPV4_IN_IID | IPV6_ADDR_HAS_PUBLIC_IPV4_IN_PREFIX)
346 
347 #define IPV6_ADDR_GLOBAL			(IPV6_NEW_ADDR_PRODUCTIVE)
348 
349 // typeinfo2
350 #define IPV6_ADDR_TYPE2_6RD			(uint32_t) 0x00000001U	/* IPv6 Rapid Deployment address (RFC5569), not autodetectable (triggered by --6rd_prefixlength) */
351 #define IPV6_ADDR_TYPE2_LISP			(uint32_t) 0x00010000U	/* IPv6 LISP (RFC6830) */
352 #define IPV6_ADDR_TYPE2_LISP_PETR		(uint32_t) 0x00020000U	/* IPv6 LISP Proxy Egress Tunnel Routers (PETRY) Anycast */
353 #define IPV6_ADDR_TYPE2_LISP_MAP_RESOLVER	(uint32_t) 0x00040000U	/* IPv6 LISP Map Resolver Anycast */
354 #define IPV6_ADDR_TYPE2_ANON_MASKED_PREFIX	(uint32_t) 0x00080000U	/* IPv6 partially masked prefix */
355 #define IPV6_ADDR_TYPE2_ANONYMIZED_GEONAMEID	(uint32_t) 0x00100000U  /* IPv6 prefix anonymized contains GeonameID */
356 
357 // IPv4 address extractor selector
358 #define IPV6_ADDR_SELECT_IPV4_DEFAULT		0
359 #define IPV6_ADDR_SELECT_IPV4_TEREDO_SERVER	1
360 #define IPV6_ADDR_SELECT_IPV4_PREFIX2_LENGTH	2
361 
362 /* text representations */
363 /*@unused@*/ static const s_type ipv6calc_ipv6addrtypestrings[] = {
364 	{ IPV6_ADDR_ANY			, "unknown" },
365 	{ IPV6_ADDR_UNICAST		, "unicast" },
366 	{ IPV6_ADDR_MULTICAST		, "multicast" },
367 	{ IPV6_ADDR_ANYCAST		, "anycast" },
368 	{ IPV6_ADDR_LOOPBACK		, "loopback" },
369 	{ IPV6_ADDR_LINKLOCAL		, "link-local" },
370 	{ IPV6_ADDR_SITELOCAL		, "site-local" },
371 	{ IPV6_ADDR_COMPATv4		, "compat-v4" },
372 	{ IPV6_ADDR_MAPPED		, "mapped" },
373 	{ IPV6_ADDR_RESERVED		, "reserved" },
374 	{ IPV6_ADDR_ULUA		, "unique-local-unicast" },
375 	{ IPV6_ADDR_ANONYMIZED_IID	, "anonymized-iid" },
376 	{ IPV6_ADDR_ANONYMIZED_PREFIX	, "anonymized-prefix" },
377 	{ IPV6_NEW_ADDR_6TO4		, "6to4" },
378 	{ IPV6_NEW_ADDR_6BONE		, "6bone" },
379 	{ IPV6_NEW_ADDR_AGU		, "global-unicast" },
380 	{ IPV6_NEW_ADDR_UNSPECIFIED	, "unspecified" },
381 	{ IPV6_NEW_ADDR_SOLICITED_NODE	, "solicited-node" },
382 	{ IPV6_NEW_ADDR_PRODUCTIVE	, "productive" },
383 	{ IPV6_NEW_ADDR_6TO4_MICROSOFT	, "6to4-microsoft" },
384 	{ IPV6_NEW_ADDR_TEREDO		, "teredo" },
385 	{ IPV6_NEW_ADDR_ORCHID		, "orchid" },
386 	{ IPV6_NEW_ADDR_LINKLOCAL_TEREDO, "link-local-teredo" },
387 	{ IPV6_NEW_ADDR_NAT64		, "nat64" },
388 	{ IPV6_NEW_ADDR_IID_RANDOM	, "iid-random" },
389 	{ IPV6_NEW_ADDR_IID		, "iid" },
390 	{ IPV6_NEW_ADDR_IID_LOCAL	, "iid-local" },
391 	{ IPV6_NEW_ADDR_IID_GLOBAL	, "iid-global" },
392 	{ IPV6_NEW_ADDR_IID_TEREDO	, "iid-teredo" },
393 	{ IPV6_NEW_ADDR_IID_EUI48	, "iid-eui48" },
394 	{ IPV6_NEW_ADDR_IID_EUI64	, "iid-eui64" },
395 	{ IPV6_NEW_ADDR_IID_ISATAP	, "iid-isatap" },
396 	{ IPV6_ADDR_IID_32_63_HAS_IPV4	, "iid-includes-ipv4" }
397 };
398 
399 /* text representations */
400 /*@unused@*/ static const s_type ipv6calc_ipv6addr_type2_strings[] = {
401 	{ IPV6_ADDR_TYPE2_6RD		, "6rd" },
402 	{ IPV6_ADDR_TYPE2_LISP	 		, "lisp" },
403 	{ IPV6_ADDR_TYPE2_LISP_PETR		, "lisp-proxyegresstunnelrouter-anycast" },
404 	{ IPV6_ADDR_TYPE2_LISP_MAP_RESOLVER	, "lisp-mapresolver-anycast" },
405 	{ IPV6_ADDR_TYPE2_ANON_MASKED_PREFIX    , "anonymized-masked-prefix" },
406 	{ IPV6_ADDR_TYPE2_ANONYMIZED_GEONAMEID  , "anonymized-geonameid" },
407 };
408 
409 /* Registries */
410 #include "libipv6calc.h"
411 
412 #define IPV6_ADDR_REGISTRY_6BONE	REGISTRY_6BONE
413 #define IPV6_ADDR_REGISTRY_IANA		REGISTRY_IANA
414 #define IPV6_ADDR_REGISTRY_APNIC	REGISTRY_APNIC
415 #define IPV6_ADDR_REGISTRY_ARIN		REGISTRY_ARIN
416 #define IPV6_ADDR_REGISTRY_RIPENCC	REGISTRY_RIPENCC
417 #define IPV6_ADDR_REGISTRY_LACNIC	REGISTRY_LACNIC
418 #define IPV6_ADDR_REGISTRY_AFRINIC	REGISTRY_AFRINIC
419 #define IPV6_ADDR_REGISTRY_RESERVED	REGISTRY_RESERVED
420 #define IPV6_ADDR_REGISTRY_UNKNOWN	REGISTRY_UNKNOWN
421 
422 /*@unused@*/ static const s_type2 ipv6calc_ipv6addrregistry[] = {
423 	{ IPV6_ADDR_REGISTRY_6BONE	, "6BONE"	, "6BONE" 	},
424 	{ IPV6_ADDR_REGISTRY_IANA	, "IANA"	, "IANA" 	},
425 	{ IPV6_ADDR_REGISTRY_APNIC	, "APNIC"	, "APNIC" 	},
426 	{ IPV6_ADDR_REGISTRY_ARIN	, "ARIN" 	, "ARIN"	},
427 	{ IPV6_ADDR_REGISTRY_RIPENCC	, "RIPE NCC"	, "RIPENCC"	},
428 	{ IPV6_ADDR_REGISTRY_LACNIC	, "LACNIC"	, "LACNIC"	},
429 	{ IPV6_ADDR_REGISTRY_AFRINIC	, "AFRINIC"	, "AFRINIC"	},
430 	{ IPV6_ADDR_REGISTRY_RESERVED	, "reserved"	, "reserved"	},
431 	{ IPV6_ADDR_REGISTRY_UNKNOWN	, "unknown"	, "unknown"	}
432 };
433 #endif
434 
435 
436 /* prototypes */
437 extern uint8_t  ipv6addr_getoctet(const ipv6calc_ipv6addr *ipv6addrp, const unsigned int numoctet);
438 extern uint16_t ipv6addr_getword(const ipv6calc_ipv6addr *ipv6addrp, const unsigned int numword);
439 extern uint32_t ipv6addr_getdword(const ipv6calc_ipv6addr *ipv6addrp, const unsigned int numdword);
440 
441 extern void ipv6addr_setoctet(ipv6calc_ipv6addr *ipv6addrp, const unsigned int numoctet, unsigned int value);
442 extern void ipv6addr_setword(ipv6calc_ipv6addr *ipv6addrp, const unsigned int numword, unsigned int value);
443 extern void ipv6addr_setdword(ipv6calc_ipv6addr *ipv6addrp, const unsigned int numdword, unsigned int value);
444 
445 extern void ipv6addr_clear(ipv6calc_ipv6addr *ipv6addrp);
446 extern void ipv6addr_clearall(ipv6calc_ipv6addr *ipv6addrp);
447 extern void ipv6addr_copy(ipv6calc_ipv6addr *ipv6addrp_dst, const ipv6calc_ipv6addr *ipv6addrp_src);
448 
449 extern int ipv6addr_compare(const ipv6calc_ipv6addr *ipv6addrp1, const ipv6calc_ipv6addr *ipv6addrp2, const uint16_t compare_flags);
450 
451 extern void ipv6addr_settype(ipv6calc_ipv6addr *ipv6addrp);
452 
453 extern int  addr_to_ipv6addrstruct(const char *addrstring, char *resultstring, const size_t resultstring_length, ipv6calc_ipv6addr *ipv6addrp);
454 extern int  addrliteral_to_ipv6addrstruct(const char *addrstring, char *resultstring, const size_t resultstring_length, ipv6calc_ipv6addr *ipv6addrp);
455 
456 extern int  libipv6addr_ipv6addrstruct_to_uncompaddr(const ipv6calc_ipv6addr *ipv6addrp, char *resultstring, const size_t resultstring_length, const uint32_t formatoptions);
457 extern int  libipv6addr_to_octal(const ipv6calc_ipv6addr *ipv6addrp, char *resultstring, const size_t resultstring_length, const uint32_t formatoptions);
458 extern int  libipv6addr_to_hex(const ipv6calc_ipv6addr *ipv6addrp, char *resultstring, const size_t resultstring_length, const uint32_t formatoptions);
459 
460 extern void ipv6addrstruct_maskprefix(ipv6calc_ipv6addr *ipv6addrp);
461 extern void ipv6addrstruct_masksuffix(ipv6calc_ipv6addr *ipv6addrp);
462 
463 extern int  identifier_to_ipv6addrstruct(const char *addrstring, char *resultstring, const size_t resultstring_length, ipv6calc_ipv6addr *ipv6addrp);
464 
465 extern int  tokenlsb64_to_ipv6addrstruct(const char *addrstring, char *resultstring, const size_t resultstring_length, ipv6calc_ipv6addr *ipv6addrp);
466 extern int  libipv6addr_ipv6addrstruct_to_tokenlsb64(const ipv6calc_ipv6addr *ipv6addrp, char *resultstring, const size_t resultstring_length, const uint32_t formatoptions);
467 
468 extern int      libipv6addr_anonymize(ipv6calc_ipv6addr *ipv6addrp, const s_ipv6calc_anon_set *ipv6calc_anon_set);
469 extern uint32_t ipv6addr_get_payload_anonymized_iid(const ipv6calc_ipv6addr *ipv6addrp, const uint32_t typeinfo);
470 extern int      ipv6addr_get_payload_anonymized_prefix(const ipv6calc_ipv6addr *ipv6addrp, const int payload_selector, uint32_t *result_ptr);
471 
472 extern int ipv6addr_iidrandomdetection(const ipv6calc_ipv6addr *ipv6addrp, s_iid_statistics *variancesp);
473 
474 extern int  ipv6addr_filter(const ipv6calc_ipv6addr *ipv6addrp, const s_ipv6calc_filter_ipv6addr *filter);
475 extern int  ipv6addr_filter_parse(s_ipv6calc_filter_ipv6addr *filter, const char *token);
476 extern int  ipv6addr_filter_check(const s_ipv6calc_filter_ipv6addr *filter);
477 extern void ipv6addr_filter_clear(s_ipv6calc_filter_ipv6addr *filter);
478 
479 extern int  libipv6addr_get_included_ipv4addr(const ipv6calc_ipv6addr *ipv6addrp, ipv6calc_ipv4addr *ipv4addrp, const int selector);
480 
481 extern uint16_t libipv6addr_cc_index_by_addr(const ipv6calc_ipv6addr *ipv6addrp, unsigned int *data_source_ptr);
482 extern uint32_t libipv6addr_as_num32_by_addr(const ipv6calc_ipv6addr *ipv6addrp, unsigned int *data_source_ptr);
483 extern uint32_t libipv6addr_GeonameID_by_addr(const ipv6calc_ipv6addr *ipv6addrp, unsigned int *data_source_ptr, unsigned int *GeonameID_type_ptr);
484 extern int libipv6addr_registry_num_by_addr(const ipv6calc_ipv6addr *ipv6addrp);
485