1 /* 2 * Project : ipv6calc 3 * File : ipv6calctypes.h 4 * Version : $Id: 9747850bae532c5676edd11b031e369bfbac5dd0 $ 5 * Copyright : 2002-2021 by Peter Bieringer <pb (at) bieringer.de> 6 * License : GPLv2 7 * 8 * Information: 9 * Header file for ipv6calctypes.c 10 */ 11 12 #include "ipv6calc_inttypes.h" 13 #include "ipv6calccommands.h" 14 #include <getopt.h> 15 16 17 /* defines */ 18 #ifndef _ipv6calctypes_h_ 19 20 #define _ipv6calctypes_h_ 21 22 /* text representations for defines */ 23 typedef struct { 24 const int number; 25 const char *token; 26 } s_type; 27 28 typedef struct { 29 const int number; 30 const char *token; 31 const char *tokensimple; 32 } s_type2; 33 34 35 /* 36 * Format handling matrix for new address option style 37 */ 38 39 /* Format number definitions, each possible format has one number */ 40 #define FORMAT_NUM_HEAD 0x200 41 42 #define FORMAT_NUM_auto 0 43 #define FORMAT_NUM_revnibbles_int 1 44 #define FORMAT_NUM_revnibbles_arpa 2 45 #define FORMAT_NUM_bitstring 3 46 #define FORMAT_NUM_ipv6addr 4 47 #define FORMAT_NUM_ipv4addr 5 48 #define FORMAT_NUM_mac 6 49 #define FORMAT_NUM_eui64 7 50 #define FORMAT_NUM_base85 8 51 #define FORMAT_NUM_ifinet6 9 52 #define FORMAT_NUM_iid 10 53 #define FORMAT_NUM_iid_token 11 54 #define FORMAT_NUM_addrtype 12 55 #define FORMAT_NUM_ouitype 13 56 #define FORMAT_NUM_ipv6addrtype 14 57 #define FORMAT_NUM_ipv6logconv 15 58 #define FORMAT_NUM_any 16 59 #define FORMAT_NUM_prefix_mac 17 60 #define FORMAT_NUM_revipv4 18 61 #define FORMAT_NUM_ipv4hex 19 62 #define FORMAT_NUM_ipv4revhex 20 63 #define FORMAT_NUM_octal 21 64 #define FORMAT_NUM_hex 22 65 #define FORMAT_NUM_ipv6literal 23 66 #define FORMAT_NUM_ipv6rd 24 67 #define FORMAT_NUM_asn 29 68 #define FORMAT_NUM_auto_noresult 30 69 #define FORMAT_NUM_undefined 31 70 71 #define FORMAT_auto (uint32_t) 0x00000u 72 #define FORMAT_revnibbles_int (uint32_t) (1 << FORMAT_NUM_revnibbles_int) 73 #define FORMAT_revnibbles_arpa (uint32_t) (1 << FORMAT_NUM_revnibbles_arpa) 74 #define FORMAT_bitstring (uint32_t) (1 << FORMAT_NUM_bitstring) 75 #define FORMAT_ipv6addr (uint32_t) (1 << FORMAT_NUM_ipv6addr) 76 #define FORMAT_ipv4addr (uint32_t) (1 << FORMAT_NUM_ipv4addr) 77 #define FORMAT_mac (uint32_t) (1 << FORMAT_NUM_mac) 78 #define FORMAT_macaddr (uint32_t) (1 << FORMAT_NUM_mac) // compatible syntax 79 #define FORMAT_eui64 (uint32_t) (1 << FORMAT_NUM_eui64) 80 #define FORMAT_base85 (uint32_t) (1 << FORMAT_NUM_base85) 81 #define FORMAT_ifinet6 (uint32_t) (1 << FORMAT_NUM_ifinet6) 82 #define FORMAT_iid (uint32_t) (1 << FORMAT_NUM_iid) 83 #define FORMAT_iid_token (uint32_t) (1 << FORMAT_NUM_iid_token) 84 #define FORMAT_addrtype (uint32_t) (1 << FORMAT_NUM_addrtype) 85 #define FORMAT_ouitype (uint32_t) (1 << FORMAT_NUM_ouitype) 86 #define FORMAT_ipv6addrtype (uint32_t) (1 << FORMAT_NUM_ipv6addrtype) 87 #define FORMAT_ipv6logconv (uint32_t) (1 << FORMAT_NUM_ipv6logconv) 88 #define FORMAT_any (uint32_t) (1 << FORMAT_NUM_any) 89 #define FORMAT_prefix_mac (uint32_t) (1 << FORMAT_NUM_prefix_mac) 90 #define FORMAT_revipv4 (uint32_t) (1 << FORMAT_NUM_revipv4) 91 #define FORMAT_ipv4hex (uint32_t) (1 << FORMAT_NUM_ipv4hex) 92 #define FORMAT_ipv4revhex (uint32_t) (1 << FORMAT_NUM_ipv4revhex) 93 #define FORMAT_octal (uint32_t) (1 << FORMAT_NUM_octal) 94 #define FORMAT_hex (uint32_t) (1 << FORMAT_NUM_hex) 95 #define FORMAT_ipv6literal (uint32_t) (1 << FORMAT_NUM_ipv6literal) 96 #define FORMAT_asn (uint32_t) (1 << FORMAT_NUM_asn) 97 #define FORMAT_auto_noresult (uint32_t) (1 << FORMAT_NUM_auto_noresult) 98 #define FORMAT_undefined (uint32_t) (1 << FORMAT_NUM_undefined) 99 100 /* Primary label of format number, keeping also an explanation */ 101 typedef struct { 102 const uint32_t number; 103 const char *token; 104 const char *explanation; 105 const char *aliases; 106 } s_format; 107 108 /*@unused@*/ static const s_format ipv6calc_formatstrings[] = { 109 { FORMAT_auto , "auto" , "automatic detection", "" }, 110 { FORMAT_revnibbles_int , "revnibbles.int" , "dot separated nibbles reverse, ending with ip6.int.", "" }, 111 { FORMAT_revnibbles_arpa, "revnibbles.arpa", "dot separated nibbles reverse, ending with ip6.arpa.", "" }, 112 { FORMAT_bitstring , "bitstring" , "bitstring labes, ending with ip6.arpa.", "" }, 113 { FORMAT_ipv6addr , "ipv6addr" , "IPv6 address", "ipv6" }, 114 { FORMAT_ipv4addr , "ipv4addr" , "IPv4 address", "ipv4" }, 115 { FORMAT_mac , "mac" , "MAC address (48 bits)", "eui48" }, 116 { FORMAT_eui64 , "eui64" , "EUI-64 identifier (64 bits)", "" }, 117 { FORMAT_base85 , "base85" , "Base-85 string", "" }, 118 { FORMAT_ifinet6 , "ifinet6" , "Like line in /proc/net/if_inet6", "" }, 119 { FORMAT_iid , "iid" , "Interface identifier", "" }, 120 { FORMAT_iid_token , "iid+token" , "Interface identifier and token", "" }, 121 { FORMAT_addrtype , "addrtype" , "Address type", "" }, 122 { FORMAT_ouitype , "ouitype" , "OUI (IEEE) type", "" }, 123 { FORMAT_ipv6addrtype , "ipv6addrtype" , "IPv6 address type", "" }, 124 { FORMAT_ipv6logconv , "ipv6logconv" , "ipv6logconv (currently not supported)", "" }, 125 { FORMAT_any , "any" , "any type (currently not supported)", "" }, 126 { FORMAT_revipv4 , "revipv4" , "reverse IPv4, ending with in-addr.arpa", "" }, 127 { FORMAT_ipv4hex , "ipv4hex" , "IPv4 in hexdecimal format", "" }, 128 { FORMAT_ipv4revhex , "ipv4revhex" , "IPv4 in byte-reversed hexdecimal format", "" }, 129 { FORMAT_octal , "octal" , "IP address in escaped octal format", "" }, 130 { FORMAT_hex , "hex" , "IP address in hexadecimal format", "" }, 131 { FORMAT_ipv6literal , "ipv6literal" , "IPv6 address in literal", "" }, 132 { FORMAT_prefix_mac , "prefix+mac" , "IPv6 prefix and a MAC address", "" }, 133 { FORMAT_asn , "asn" , "Autonomous System Number", "" }, 134 }; 135 136 /* Format conversion matrix */ 137 /*@unused@*/ static const uint32_t ipv6calc_formatmatrix[][2] = { 138 { FORMAT_auto , 0x5ff }, 139 { FORMAT_revnibbles_int , 0x5ff }, 140 { FORMAT_revnibbles_arpa, 0x5ff }, 141 { FORMAT_bitstring , 0x5ff }, 142 { FORMAT_ipv6addr , FORMAT_revnibbles_int | FORMAT_revnibbles_arpa | FORMAT_bitstring | FORMAT_ipv6addr | FORMAT_base85 | FORMAT_ifinet6 | FORMAT_octal | FORMAT_ipv6literal | FORMAT_hex }, 143 { FORMAT_ipv6literal , FORMAT_revnibbles_int | FORMAT_revnibbles_arpa | FORMAT_bitstring | FORMAT_ipv6addr | FORMAT_base85 | FORMAT_ifinet6 | FORMAT_octal | FORMAT_ipv6literal }, 144 { FORMAT_ipv4addr , FORMAT_ipv4addr | FORMAT_ipv6addr | FORMAT_revipv4 | FORMAT_ipv4hex | FORMAT_hex }, 145 { FORMAT_ipv4hex , FORMAT_ipv4addr | FORMAT_ipv6addr | FORMAT_revipv4 | FORMAT_ipv4hex | FORMAT_hex }, 146 { FORMAT_ipv4revhex , FORMAT_ipv4addr | FORMAT_ipv6addr | FORMAT_revipv4 | FORMAT_ipv4hex }, 147 { FORMAT_mac , FORMAT_eui64 }, 148 { FORMAT_eui64 , FORMAT_eui64 }, 149 { FORMAT_base85 , FORMAT_base85 | FORMAT_ipv6addr | FORMAT_revnibbles_int | FORMAT_revnibbles_arpa | FORMAT_bitstring | FORMAT_ifinet6 }, 150 { FORMAT_ifinet6 , FORMAT_base85 | FORMAT_ipv6addr | FORMAT_revnibbles_int | FORMAT_revnibbles_arpa | FORMAT_bitstring | FORMAT_ifinet6 }, 151 { FORMAT_iid_token , FORMAT_iid_token }, 152 { FORMAT_ipv6logconv , FORMAT_ipv6addrtype | FORMAT_addrtype | FORMAT_ouitype | FORMAT_any }, 153 { FORMAT_prefix_mac , FORMAT_revnibbles_int | FORMAT_revnibbles_arpa | FORMAT_bitstring | FORMAT_ipv6addr | FORMAT_base85 | FORMAT_ifinet6 }, 154 { FORMAT_asn , FORMAT_auto_noresult }, 155 }; 156 157 158 /* Format options */ 159 #define FORMATOPTION_NUM_HEAD 0x300 // offset 160 161 #define FORMATOPTION_NUM_printlowercase 1 // 00000002 162 #define FORMATOPTION_NUM_printuppercase 2 // 00000004 163 #define FORMATOPTION_NUM_printprefix 3 // 00000008 164 #define FORMATOPTION_NUM_printsuffix 4 // 00000010 165 #define FORMATOPTION_NUM_maskprefix 5 // 00000020 166 #define FORMATOPTION_NUM_masksuffix 6 // 00000040 167 #define FORMATOPTION_NUM_printstart 7 // 00000080 168 #define FORMATOPTION_NUM_printend 8 // 00000100 169 #define FORMATOPTION_NUM_printcompressed 9 // 00000200 170 #define FORMATOPTION_NUM_printuncompressed 10 // 00000400 171 #define FORMATOPTION_NUM_printfulluncompressed 11 // 00000800 172 #define FORMATOPTION_NUM_machinereadable 12 // 00001000 173 #define FORMATOPTION_NUM_quiet 13 // 00002000 174 #define FORMATOPTION_NUM_printmirrored 14 // 00004000 175 #define FORMATOPTION_NUM_forceprefix 15 // 00008000 176 #define FORMATOPTION_NUM_literal 16 // 00010000 177 #define FORMATOPTION_NUM_print_iid_var 17 // 00020000 178 #define FORMATOPTION_NUM_no_prefixlength 18 // 00040000 179 #define FORMATOPTION_NUM_mr_quote_always 19 // 00080000 180 #define FORMATOPTION_NUM_mr_quote_never 20 // 00100000 181 #define FORMATOPTION_NUM_mr_value_only 21 // 00200000 182 #define FORMATOPTION_NUM_mr_select_token 22 // 00400000 183 #define FORMATOPTION_NUM_mr_select_token_pa 23 // 00800000 184 #define FORMATOPTION_NUM_mr_match_token 24 // 01000000 185 #define FORMATOPTION_NUM_mr_quote_default 25 // 02000000 flag for controlling old quote behavior < 0.99.0 186 #define FORMATOPTION_NUM_mr_match_token_suffix 26 // 04000000 187 188 #define FORMATOPTION_NUM_printembedded 31 // special 189 190 #define FORMATOPTION_printlowercase (uint32_t) (1 << FORMATOPTION_NUM_printlowercase) 191 #define FORMATOPTION_printuppercase (uint32_t) (1 << FORMATOPTION_NUM_printuppercase) 192 #define FORMATOPTION_printprefix (uint32_t) (1 << FORMATOPTION_NUM_printprefix) 193 #define FORMATOPTION_printsuffix (uint32_t) (1 << FORMATOPTION_NUM_printsuffix) 194 #define FORMATOPTION_maskprefix (uint32_t) (1 << FORMATOPTION_NUM_maskprefix) 195 #define FORMATOPTION_masksuffix (uint32_t) (1 << FORMATOPTION_NUM_masksuffix) 196 #define FORMATOPTION_printstart (uint32_t) (1 << FORMATOPTION_NUM_printstart) 197 #define FORMATOPTION_printend (uint32_t) (1 << FORMATOPTION_NUM_printend) 198 #define FORMATOPTION_printcompressed (uint32_t) (1 << FORMATOPTION_NUM_printcompressed) 199 #define FORMATOPTION_printuncompressed (uint32_t) (1 << FORMATOPTION_NUM_printuncompressed) 200 #define FORMATOPTION_printfulluncompressed (uint32_t) (1 << FORMATOPTION_NUM_printfulluncompressed) 201 #define FORMATOPTION_machinereadable (uint32_t) (1 << FORMATOPTION_NUM_machinereadable) 202 #define FORMATOPTION_quiet (uint32_t) (1 << FORMATOPTION_NUM_quiet) 203 #define FORMATOPTION_printmirrored (uint32_t) (1 << FORMATOPTION_NUM_printmirrored) 204 #define FORMATOPTION_forceprefix (uint32_t) (1 << FORMATOPTION_NUM_forceprefix) 205 #define FORMATOPTION_literal (uint32_t) (1 << FORMATOPTION_NUM_literal) 206 #define FORMATOPTION_print_iid_var (uint32_t) (1 << FORMATOPTION_NUM_print_iid_var) 207 #define FORMATOPTION_no_prefixlength (uint32_t) (1 << FORMATOPTION_NUM_no_prefixlength) 208 #define FORMATOPTION_mr_quote_always (uint32_t) (1 << FORMATOPTION_NUM_mr_quote_always) 209 #define FORMATOPTION_mr_quote_never (uint32_t) (1 << FORMATOPTION_NUM_mr_quote_never) 210 #define FORMATOPTION_mr_value_only (uint32_t) (1 << FORMATOPTION_NUM_mr_value_only) 211 #define FORMATOPTION_mr_select_token (uint32_t) (1 << FORMATOPTION_NUM_mr_select_token) 212 #define FORMATOPTION_mr_select_token_pa (uint32_t) (1 << FORMATOPTION_NUM_mr_select_token_pa) 213 #define FORMATOPTION_mr_match_token (uint32_t) (1 << FORMATOPTION_NUM_mr_match_token) 214 #define FORMATOPTION_mr_quote_default (uint32_t) (1 << FORMATOPTION_NUM_mr_quote_default) // flag for controlling old quote behavior < 0.99.0 215 #define FORMATOPTION_mr_match_token_suffix (uint32_t) (1 << FORMATOPTION_NUM_mr_match_token_suffix) 216 217 #define FORMATOPTION_printembedded (uint32_t) (1 << FORMATOPTION_NUM_printembedded) 218 219 typedef struct { 220 const uint32_t number; 221 const char *token; 222 const char *explanation; 223 } s_formatoption; 224 225 /*@unused@*/ static const s_formatoption ipv6calc_formatoptionstrings[] = { 226 { FORMATOPTION_printlowercase , "--lowercase|-l" , "Print output in lower case" }, 227 { FORMATOPTION_printuppercase , "--uppercase|-u" , "Print output in upper case" }, 228 { FORMATOPTION_printprefix , "--printprefix" , "Print only prefix" }, 229 { FORMATOPTION_printsuffix , "--printsuffix" , "Print only suffix" }, 230 { FORMATOPTION_maskprefix , "--maskprefix" , "Mask prefix bits (suffix set to 0)" }, 231 { FORMATOPTION_masksuffix , "--masksuffix" , "Mask suffix bits (prefix set to 0)" }, 232 { FORMATOPTION_printstart , "--printstart <num>" , "Printing starts at bit <num>" }, 233 { FORMATOPTION_printend , "--printend <num>" , "Printing ends at bit <num>" }, 234 { FORMATOPTION_printcompressed , "--printcompressed|-C" , "Print in compressed format" }, 235 { FORMATOPTION_printuncompressed , "--printuncompressed|-U" , "Print in uncompressed format" }, 236 { FORMATOPTION_printfulluncompressed , "--printfulluncompressed|-F" , "Print in full uncompressed format" }, 237 { FORMATOPTION_machinereadable , "--machinereadable|-m" , "Print output machine readable" }, 238 { FORMATOPTION_quiet , "--quiet|-q" , "Be more quiet" }, 239 { FORMATOPTION_printmirrored , "--printmirrored" , "Print output mirrored" }, 240 { FORMATOPTION_forceprefix , "--forceprefix <num>", "Force prefix to <num>" }, 241 { FORMATOPTION_print_iid_var , "--print-iid-var" , "IPv6 address IID variance"}, 242 { FORMATOPTION_no_prefixlength , "--no-prefixlength" , "Don't print prefix length if given on input"}, 243 }; 244 245 /* Possible format option map */ 246 /*@unused@*/ static const uint32_t ipv6calc_outputformatoptionmap[][2] = { 247 { FORMAT_revnibbles_int , FORMATOPTION_printlowercase | FORMATOPTION_printuppercase | FORMATOPTION_printprefix | FORMATOPTION_printsuffix | FORMATOPTION_maskprefix | FORMATOPTION_masksuffix | FORMATOPTION_printstart | FORMATOPTION_printend | FORMATOPTION_printmirrored }, 248 { FORMAT_revnibbles_arpa, FORMATOPTION_printlowercase | FORMATOPTION_printuppercase | FORMATOPTION_printprefix | FORMATOPTION_printsuffix | FORMATOPTION_maskprefix | FORMATOPTION_masksuffix | FORMATOPTION_printstart | FORMATOPTION_printend | FORMATOPTION_printmirrored }, 249 { FORMAT_revipv4, FORMATOPTION_printlowercase | FORMATOPTION_printuppercase | FORMATOPTION_printmirrored }, 250 { FORMAT_bitstring , FORMATOPTION_printlowercase | FORMATOPTION_printuppercase | FORMATOPTION_printprefix | FORMATOPTION_printsuffix | FORMATOPTION_maskprefix | FORMATOPTION_masksuffix | FORMATOPTION_printstart | FORMATOPTION_printend }, 251 { FORMAT_ipv6addr , FORMATOPTION_machinereadable | FORMATOPTION_printlowercase | FORMATOPTION_printuppercase | FORMATOPTION_printprefix | FORMATOPTION_printsuffix | FORMATOPTION_maskprefix | FORMATOPTION_masksuffix | FORMATOPTION_printcompressed | FORMATOPTION_printuncompressed | FORMATOPTION_printfulluncompressed | FORMATOPTION_forceprefix | FORMATOPTION_print_iid_var | FORMATOPTION_no_prefixlength}, 252 { FORMAT_mac , FORMATOPTION_printlowercase | FORMATOPTION_printuppercase }, 253 { FORMAT_eui64 , FORMATOPTION_printlowercase | FORMATOPTION_printuppercase }, 254 { FORMAT_base85 , 0 }, 255 { FORMAT_ifinet6 , 0 }, 256 { FORMAT_ipv4addr , FORMATOPTION_machinereadable | FORMATOPTION_no_prefixlength | FORMATOPTION_forceprefix | FORMATOPTION_maskprefix | FORMATOPTION_masksuffix | FORMATOPTION_printcompressed | FORMATOPTION_printuncompressed | FORMATOPTION_printfulluncompressed }, 257 { FORMAT_iid_token , FORMATOPTION_printlowercase | FORMATOPTION_printuppercase }, 258 { FORMAT_octal , FORMATOPTION_printfulluncompressed }, 259 { FORMAT_ipv6literal , FORMATOPTION_machinereadable | FORMATOPTION_printlowercase | FORMATOPTION_printuppercase | FORMATOPTION_printcompressed | FORMATOPTION_printuncompressed | FORMATOPTION_printfulluncompressed }, 260 { FORMAT_hex , FORMATOPTION_printuppercase | FORMATOPTION_printprefix | FORMATOPTION_printsuffix | FORMATOPTION_forceprefix }, 261 { FORMAT_prefix_mac , FORMATOPTION_printlowercase | FORMATOPTION_printuppercase } 262 }; 263 264 265 /* Actions */ 266 #define ACTION_NUM_auto 0 267 #define ACTION_NUM_mac_to_eui64 1 268 #define ACTION_NUM_ipv4_to_6to4addr 2 269 #define ACTION_NUM_iid_token_to_privacy 3 270 #define ACTION_NUM_prefix_mac_to_ipv6 4 271 #define ACTION_NUM_anonymize 5 272 #define ACTION_NUM_6rd_local_prefix 6 273 #define ACTION_NUM_6rd_extract_ipv4 7 274 #define ACTION_NUM_ipv4_to_nat64 8 275 #define ACTION_NUM_ipv6_to_mac 9 276 #define ACTION_NUM_ipv6_to_eui64 10 277 #define ACTION_NUM_filter 15 278 #define ACTION_NUM_test 16 279 #define ACTION_NUM_addr_to_countrycode 17 280 #define ACTION_NUM_undefined 31 281 282 #define ACTION_auto (uint32_t) 0x0 283 #define ACTION_mac_to_eui64 (uint32_t) (1 << ACTION_NUM_mac_to_eui64) 284 #define ACTION_ipv4_to_6to4addr (uint32_t) (1 << ACTION_NUM_ipv4_to_6to4addr) 285 #define ACTION_iid_token_to_privacy (uint32_t) (1 << ACTION_NUM_iid_token_to_privacy) 286 #define ACTION_prefix_mac_to_ipv6 (uint32_t) (1 << ACTION_NUM_prefix_mac_to_ipv6) 287 #define ACTION_anonymize (uint32_t) (1 << ACTION_NUM_anonymize) 288 #define ACTION_6rd_local_prefix (uint32_t) (1 << ACTION_NUM_6rd_local_prefix) 289 #define ACTION_6rd_extract_ipv4 (uint32_t) (1 << ACTION_NUM_6rd_extract_ipv4) 290 #define ACTION_ipv4_to_nat64 (uint32_t) (1 << ACTION_NUM_ipv4_to_nat64) 291 #define ACTION_ipv6_to_mac (uint32_t) (1 << ACTION_NUM_ipv6_to_mac) 292 #define ACTION_ipv6_to_eui64 (uint32_t) (1 << ACTION_NUM_ipv6_to_eui64) 293 #define ACTION_filter (uint32_t) (1 << ACTION_NUM_filter) 294 #define ACTION_test (uint32_t) (1 << ACTION_NUM_test) 295 #define ACTION_addr_to_countrycode (uint32_t) (1 << ACTION_NUM_addr_to_countrycode) 296 #define ACTION_undefined (uint32_t) (1 << ACTION_NUM_undefined) 297 298 #define ANON_METHOD_ANONYMIZE 1 299 #define ANON_METHOD_ZEROIZE 2 300 #define ANON_METHOD_KEEPTYPEASNCC 3 301 #define ANON_METHOD_KEEPTYPEGEONAMEID 4 302 303 typedef struct { 304 const uint32_t number; 305 const char *token; 306 const char *explanation; 307 const char *aliases; 308 } s_action; 309 310 /*@unused@*/ static const s_action ipv6calc_actionstrings[] = { 311 { ACTION_auto , "auto" , "Automatic selection of action (default)", "" }, 312 { ACTION_mac_to_eui64 , "geneui64" , "Converts a MAC address to an EUI-64 address", "" }, 313 { ACTION_ipv4_to_6to4addr , "conv6to4" , "Converts IPv4 address <-> 6to4 IPv6 address (prefix)", "" }, 314 { ACTION_ipv4_to_nat64 , "convnat64" , "Converts IPv4 address <-> NAT64 IPv6 address", "" }, 315 { ACTION_ipv6_to_mac , "ipv6tomac" , "Extracts MAC of an IPv6 address (if detected)", "" }, 316 { ACTION_ipv6_to_eui64 , "ipv6toeui64" , "Extracts EUI64 of an IPv6 address (if detected)", "" }, 317 { ACTION_iid_token_to_privacy , "genprivacyiid" , "Generates a privacy interface ID out of a given one (arg1) and a token (arg2)", "" }, 318 { ACTION_prefix_mac_to_ipv6 , "prefixmac2ipv6" , "Generates an IPv6 address out of a prefix and a MAC address", "" }, 319 { ACTION_anonymize , "anonymize" , "Anonymize IPv4/IPv6 address without loosing much information", "" }, 320 { ACTION_6rd_local_prefix , "6rd_local_prefix", "Calculate the 6rd prefix from given IPv6 prefix (& relay prefix) and IPv4", "" }, 321 { ACTION_6rd_extract_ipv4 , "6rd_extract_ipv4", "Extract from 6rd address the include IPv4 address", "" }, 322 { ACTION_filter , "filter" , "Filter addresses related to filter options", "" }, 323 { ACTION_test , "test" , "Test address against given prefix or address", "" }, 324 { ACTION_addr_to_countrycode , "addr2cc" , "Converts IPv4/IPv6 address into Country Code", "" }, 325 }; 326 327 /* Possible action option map (required) */ 328 /*@unused@*/ static const uint32_t ipv6calc_actionoptionmap[][3] = { 329 // action, command, 0=required, 1=optional 330 { ACTION_auto , 0 , 0}, 331 { ACTION_mac_to_eui64 , 0 , 0}, 332 { ACTION_ipv4_to_6to4addr , 0 , 0}, 333 { ACTION_ipv4_to_nat64 , 0 , 0}, 334 { ACTION_ipv6_to_mac , 0 , 0}, 335 { ACTION_ipv6_to_eui64 , 0 , 0}, 336 { ACTION_iid_token_to_privacy , 0 , 0}, 337 { ACTION_prefix_mac_to_ipv6 , 0 , 0}, 338 { ACTION_anonymize , 0 , 0}, 339 { ACTION_addr_to_countrycode , 0 , 0}, 340 { ACTION_6rd_local_prefix , CMD_6rd_prefix, 0}, 341 { ACTION_6rd_local_prefix , CMD_6rd_relay_prefix, 1 }, 342 { ACTION_6rd_extract_ipv4 , CMD_6rd_prefixlength, 0}, 343 { ACTION_test , CMD_test_prefix, 1}, 344 { ACTION_test , CMD_test_gt, 1}, 345 { ACTION_test , CMD_test_ge, 1}, 346 { ACTION_test , CMD_test_lt, 1}, 347 { ACTION_test , CMD_test_le, 1}, 348 }; 349 350 /* anonymization set */ 351 typedef struct { 352 char name[32]; 353 char name_short[3]; 354 int mask_ipv4; 355 int mask_ipv6; 356 int mask_eui64; 357 int mask_mac; 358 int mask_autoadjust; 359 int method; // 1=anonymize, 2=zeroize, 3=keep type asn countrycode 360 } s_ipv6calc_anon_set; 361 362 /* anonymization methods */ 363 typedef struct { 364 const char name[32]; 365 const int method; 366 const char description[128]; 367 } s_ipv6calc_anon_methods; 368 369 370 /**** filter structures ****/ 371 #define IPV6CALC_FILTER_DB_CC_MAX 16 372 #define IPV6CALC_FILTER_DB_ASN_MAX 16 373 #define IPV6CALC_FILTER_DB_REGISTRY_MAX 8 374 #define IPV6CALC_FILTER_IPV4ADDR 16 375 #define IPV6CALC_FILTER_IPV6ADDR 16 376 377 /* DB CC (CountryCode) filter structure */ 378 typedef struct { 379 int active; 380 int cc_must_have_max; 381 int cc_may_not_have_max; 382 uint16_t cc_must_have[IPV6CALC_FILTER_DB_CC_MAX]; 383 uint16_t cc_may_not_have[IPV6CALC_FILTER_DB_CC_MAX]; 384 } s_ipv6calc_filter_db_cc; 385 386 387 /* DB ASN (Autonomous System Number) filter structure */ 388 typedef struct { 389 int active; 390 int asn_must_have_max; 391 int asn_may_not_have_max; 392 uint32_t asn_must_have[IPV6CALC_FILTER_DB_ASN_MAX]; 393 uint32_t asn_may_not_have[IPV6CALC_FILTER_DB_ASN_MAX]; 394 } s_ipv6calc_filter_db_asn; 395 396 397 /* DB Registry filter structure */ 398 typedef struct { 399 int active; 400 int registry_must_have_max; 401 int registry_may_not_have_max; 402 uint32_t registry_must_have[IPV6CALC_FILTER_DB_REGISTRY_MAX]; 403 uint32_t registry_may_not_have[IPV6CALC_FILTER_DB_REGISTRY_MAX]; 404 } s_ipv6calc_filter_db_registry; 405 406 /* typeinfo filter structure */ 407 typedef struct { 408 int active; 409 uint32_t typeinfo_must_have; 410 uint32_t typeinfo_may_not_have; 411 } s_ipv6calc_filter_typeinfo; 412 413 414 #define IPV6CALC_TEST_NONE 0 415 #define IPV6CALC_TEST_PREFIX 1 416 #define IPV6CALC_TEST_GT 2 417 #define IPV6CALC_TEST_GE 3 418 #define IPV6CALC_TEST_LT 4 419 #define IPV6CALC_TEST_LE 5 420 421 #define IPV6CALC_TEST_LIST_MIN IPV6CALC_TEST_PREFIX 422 #define IPV6CALC_TEST_LIST_MAX IPV6CALC_TEST_LE 423 424 #endif // _ipv6calctypes_h_ 425 426 427 /* prototypes */ 428 extern uint32_t ipv6calctypes_checktype(const char *string); 429 extern uint32_t ipv6calctypes_checkaction(const char *string); 430 431 extern const char *ipv6calctypes_format_string_by_type(const uint32_t format_type); 432