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