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