blob: 3f556c1c9a147c2b87496bdaf7437b0f922a2d33 [file] [log] [blame]
Yasuyuki KOZAKAI52088062007-07-24 05:44:11 +00001#ifndef _XTABLES_H
2#define _XTABLES_H
3
Jan Engelhardtdacafa52009-01-27 20:56:23 +01004/*
5 * Changing any structs/functions may incur a needed change
6 * in libxtables_vcurrent/vage too.
7 */
8
Jan Engelhardtef18e812008-08-04 12:47:48 +02009#include <sys/socket.h> /* PF_* */
Yasuyuki KOZAKAI0d502bc2007-07-24 05:52:07 +000010#include <sys/types.h>
Jan Engelhardtef18e812008-08-04 12:47:48 +020011#include <stdbool.h>
Jan Engelhardt03d99482008-11-18 12:27:54 +010012#include <netinet/in.h>
Jan Engelhardtef18e812008-08-04 12:47:48 +020013#include <net/if.h>
Jan Engelhardt5e9eaed2007-12-17 13:12:01 +000014#include <linux/types.h>
Jan Engelhardt03d99482008-11-18 12:27:54 +010015#include <linux/netfilter.h>
Yasuyuki KOZAKAI0d502bc2007-07-24 05:52:07 +000016#include <linux/netfilter/x_tables.h>
Yasuyuki KOZAKAI0d502bc2007-07-24 05:52:07 +000017
Yasuyuki KOZAKAI5cd1ff52007-07-24 05:55:12 +000018#ifndef IPPROTO_SCTP
19#define IPPROTO_SCTP 132
20#endif
21#ifndef IPPROTO_DCCP
22#define IPPROTO_DCCP 33
23#endif
Jan Engelhardt1de7edf2009-01-30 05:38:11 +010024#ifndef IPPROTO_MH
25# define IPPROTO_MH 135
26#endif
Yasuyuki KOZAKAI5cd1ff52007-07-24 05:55:12 +000027#ifndef IPPROTO_UDPLITE
28#define IPPROTO_UDPLITE 136
29#endif
30
Jan Engelhardtdacafa52009-01-27 20:56:23 +010031#define XTABLES_VERSION "libxtables.so.@libxtables_vmajor@"
32#define XTABLES_VERSION_CODE @libxtables_vmajor@
Jan Engelhardt493c7122008-04-15 11:15:16 +020033
Jan Engelhardtef18e812008-08-04 12:47:48 +020034struct in_addr;
35
Yasuyuki KOZAKAI0d502bc2007-07-24 05:52:07 +000036/* Include file for additions: new matches and targets. */
37struct xtables_match
38{
39 struct xtables_match *next;
40
Jan Engelhardtef18e812008-08-04 12:47:48 +020041 const char *name;
Yasuyuki KOZAKAI0d502bc2007-07-24 05:52:07 +000042
43 /* Revision of match (0 by default). */
44 u_int8_t revision;
45
46 u_int16_t family;
47
48 const char *version;
49
50 /* Size of match data. */
51 size_t size;
52
53 /* Size of match data relevent for userspace comparison purposes */
54 size_t userspacesize;
55
56 /* Function which prints out usage message. */
57 void (*help)(void);
58
59 /* Initialize the match. */
Peter Rileyea146a92007-09-02 13:09:07 +000060 void (*init)(struct xt_entry_match *m);
Yasuyuki KOZAKAI0d502bc2007-07-24 05:52:07 +000061
62 /* Function which parses command options; returns true if it
63 ate an option */
64 /* entry is struct ipt_entry for example */
65 int (*parse)(int c, char **argv, int invert, unsigned int *flags,
66 const void *entry,
Yasuyuki KOZAKAI0d502bc2007-07-24 05:52:07 +000067 struct xt_entry_match **match);
68
69 /* Final check; exit if not ok. */
70 void (*final_check)(unsigned int flags);
71
72 /* Prints out the match iff non-NULL: put space at end */
73 /* ip is struct ipt_ip * for example */
74 void (*print)(const void *ip,
75 const struct xt_entry_match *match, int numeric);
76
77 /* Saves the match info in parsable form to stdout. */
78 /* ip is struct ipt_ip * for example */
79 void (*save)(const void *ip, const struct xt_entry_match *match);
80
81 /* Pointer to list of extra command-line options */
82 const struct option *extra_opts;
83
84 /* Ignore these men behind the curtain: */
85 unsigned int option_offset;
86 struct xt_entry_match *m;
87 unsigned int mflags;
88#ifdef NO_SHARED_LIBS
89 unsigned int loaded; /* simulate loading so options are merged properly */
90#endif
91};
92
93struct xtables_target
94{
95 struct xtables_target *next;
96
Jan Engelhardtef18e812008-08-04 12:47:48 +020097 const char *name;
Yasuyuki KOZAKAI0d502bc2007-07-24 05:52:07 +000098
99 /* Revision of target (0 by default). */
100 u_int8_t revision;
101
102 u_int16_t family;
103
104 const char *version;
105
106 /* Size of target data. */
107 size_t size;
108
109 /* Size of target data relevent for userspace comparison purposes */
110 size_t userspacesize;
111
112 /* Function which prints out usage message. */
113 void (*help)(void);
114
115 /* Initialize the target. */
Peter Rileyea146a92007-09-02 13:09:07 +0000116 void (*init)(struct xt_entry_target *t);
Yasuyuki KOZAKAI0d502bc2007-07-24 05:52:07 +0000117
118 /* Function which parses command options; returns true if it
119 ate an option */
120 /* entry is struct ipt_entry for example */
121 int (*parse)(int c, char **argv, int invert, unsigned int *flags,
122 const void *entry,
123 struct xt_entry_target **targetinfo);
124
125 /* Final check; exit if not ok. */
126 void (*final_check)(unsigned int flags);
127
128 /* Prints out the target iff non-NULL: put space at end */
129 void (*print)(const void *ip,
130 const struct xt_entry_target *target, int numeric);
131
132 /* Saves the targinfo in parsable form to stdout. */
133 void (*save)(const void *ip,
134 const struct xt_entry_target *target);
135
136 /* Pointer to list of extra command-line options */
Jan Engelhardt33653322007-07-30 13:20:43 +0000137 const struct option *extra_opts;
Yasuyuki KOZAKAI0d502bc2007-07-24 05:52:07 +0000138
139 /* Ignore these men behind the curtain: */
140 unsigned int option_offset;
141 struct xt_entry_target *t;
142 unsigned int tflags;
143 unsigned int used;
144#ifdef NO_SHARED_LIBS
145 unsigned int loaded; /* simulate loading so options are merged properly */
146#endif
147};
148
Jan Engelhardt2338efd2009-01-27 15:23:01 +0100149struct xtables_rule_match {
150 struct xtables_rule_match *next;
151 struct xtables_match *match;
152 /* Multiple matches of the same type: the ones before
153 the current one are completed from parsing point of view */
154 bool completed;
155};
156
Jan Engelhardt1de7edf2009-01-30 05:38:11 +0100157/**
158 * struct xtables_pprot -
159 *
160 * A few hardcoded protocols for 'all' and in case the user has no
161 * /etc/protocols.
162 */
163struct xtables_pprot {
164 const char *name;
165 u_int8_t num;
166};
167
Jan Engelhardt2338efd2009-01-27 15:23:01 +0100168enum xtables_tryload {
169 XTF_DONT_LOAD,
170 XTF_DURING_LOAD,
171 XTF_TRY_LOAD,
172 XTF_LOAD_MUST_SUCCEED,
173};
174
Jan Engelhardta41545c2009-01-27 21:27:19 +0100175enum xtables_exittype {
176 OTHER_PROBLEM = 1,
177 PARAMETER_PROBLEM,
178 VERSION_PROBLEM,
179 RESOURCE_PROBLEM,
180 XTF_ONLY_ONCE,
181 XTF_NO_INVERT,
182 XTF_BAD_VALUE,
183 XTF_ONE_ACTION,
184};
185
Jamal Hadi Salim40a83432009-02-11 13:02:21 +0100186struct xtables_globals
187{
188 unsigned int option_offset;
Jan Engelhardt41f03ba2009-02-11 16:13:47 +0100189 const char *program_name, *program_version;
Jamal Hadi Salim139b3fe2009-02-12 11:43:01 -0500190 struct option *orig_opts;
Jamal Hadi Salim40a83432009-02-11 13:02:21 +0100191 struct option *opts;
Jamal Hadi Salim8b7baeb2009-02-11 13:05:43 +0100192 void (*exit_err)(enum xtables_exittype status, const char *msg, ...) __attribute__((noreturn, format(printf,2,3)));
Jamal Hadi Salim40a83432009-02-11 13:02:21 +0100193};
194
Jan Engelhardtc021c3c2009-01-27 15:10:05 +0100195extern const char *xtables_modprobe_program;
Jan Engelhardt2338efd2009-01-27 15:23:01 +0100196extern struct xtables_match *xtables_matches;
197extern struct xtables_target *xtables_targets;
Jan Engelhardtc021c3c2009-01-27 15:10:05 +0100198
Jan Engelhardt39bf9c82009-01-27 15:59:06 +0100199extern void xtables_init(void);
Jan Engelhardt77f48c22009-02-07 19:59:53 +0100200extern void xtables_set_nfproto(uint8_t);
Jan Engelhardt630ef482009-01-27 14:58:41 +0100201extern void *xtables_calloc(size_t, size_t);
202extern void *xtables_malloc(size_t);
203
Jan Engelhardtc021c3c2009-01-27 15:10:05 +0100204extern int xtables_insmod(const char *, const char *, bool);
205extern int xtables_load_ko(const char *, bool);
Jamal Hadi Salim8b7baeb2009-02-11 13:05:43 +0100206extern int xtables_set_params(struct xtables_globals *xtp);
Jamal Hadi Salim85332212009-02-12 09:33:59 -0500207extern void xtables_set_revision(char *name, u_int8_t revision);
Jamal Hadi Salim139b3fe2009-02-12 11:43:01 -0500208extern void xtables_free_opts(int reset_offset);
Jamal Hadi Salim70581922009-02-13 08:36:44 -0500209extern struct option *xtables_merge_options(struct option *oldopts,
210 const struct option *newopts, unsigned int *option_offset);
Jan Engelhardtc021c3c2009-01-27 15:10:05 +0100211
Jamal Hadi Salim7e4db2f2009-02-13 09:14:17 -0500212extern int xtables_init_all(struct xtables_globals *xtp, uint8_t nfproto);
Jan Engelhardt2338efd2009-01-27 15:23:01 +0100213extern struct xtables_match *xtables_find_match(const char *name,
214 enum xtables_tryload, struct xtables_rule_match **match);
215extern struct xtables_target *xtables_find_target(const char *name,
216 enum xtables_tryload);
217
Yasuyuki KOZAKAI0d502bc2007-07-24 05:52:07 +0000218/* Your shared library should call one of these. */
219extern void xtables_register_match(struct xtables_match *me);
220extern void xtables_register_target(struct xtables_target *me);
221
Jan Engelhardt5f2922c2009-01-27 18:43:01 +0100222extern bool xtables_strtoul(const char *, char **, unsigned long *,
Jan Engelhardtcd9e7aa2008-01-20 13:18:54 +0000223 unsigned long, unsigned long);
Jan Engelhardt5f2922c2009-01-27 18:43:01 +0100224extern bool xtables_strtoui(const char *, char **, unsigned int *,
Jan Engelhardtcd9e7aa2008-01-20 13:18:54 +0000225 unsigned int, unsigned int);
Jan Engelhardtaae6be92009-01-30 04:24:47 +0100226extern int xtables_service_to_port(const char *name, const char *proto);
227extern u_int16_t xtables_parse_port(const char *port, const char *proto);
Yasuyuki KOZAKAI04f8c542007-07-24 05:53:48 +0000228extern void
Jan Engelhardtaae6be92009-01-30 04:24:47 +0100229xtables_parse_interface(const char *arg, char *vianame, unsigned char *mask);
Yasuyuki KOZAKAI04f8c542007-07-24 05:53:48 +0000230
Yasuyuki KOZAKAIa3732db2007-07-24 06:39:40 +0000231/* this is a special 64bit data type that is 8-byte aligned */
Patrick McHardyc329d6a2007-09-05 14:19:23 +0000232#define aligned_u64 u_int64_t __attribute__((aligned(8)))
Yasuyuki KOZAKAIa3732db2007-07-24 06:39:40 +0000233
Jan Engelhardt0f16c722009-01-30 04:55:38 +0100234int xtables_check_inverse(const char option[], int *invert,
235 int *my_optind, int argc);
Jamal Hadi Salim8b7baeb2009-02-11 13:05:43 +0100236extern struct xtables_globals *xt_params;
Jan Engelhardt1829ed42009-02-21 03:29:44 +0100237#define xtables_error (xt_params->exit_err)
Jamal Hadi Salim70581922009-02-13 08:36:44 -0500238
Jan Engelhardta41545c2009-01-27 21:27:19 +0100239extern void xtables_param_act(unsigned int, const char *, ...);
Yasuyuki KOZAKAIa3732db2007-07-24 06:39:40 +0000240
Jan Engelhardte44ea7f2009-01-30 03:55:09 +0100241extern const char *xtables_ipaddr_to_numeric(const struct in_addr *);
242extern const char *xtables_ipaddr_to_anyname(const struct in_addr *);
243extern const char *xtables_ipmask_to_numeric(const struct in_addr *);
Jan Engelhardt1e01b0b2009-01-30 04:20:32 +0100244extern struct in_addr *xtables_numeric_to_ipaddr(const char *);
245extern struct in_addr *xtables_numeric_to_ipmask(const char *);
Jan Engelhardta0baae82009-01-30 04:32:50 +0100246extern void xtables_ipparse_any(const char *, struct in_addr **,
Jan Engelhardtbd943842008-01-20 13:38:08 +0000247 struct in_addr *, unsigned int *);
Jan Engelhardt08b16162008-01-20 13:36:08 +0000248
Jan Engelhardt1e01b0b2009-01-30 04:20:32 +0100249extern struct in6_addr *xtables_numeric_to_ip6addr(const char *);
Jan Engelhardte44ea7f2009-01-30 03:55:09 +0100250extern const char *xtables_ip6addr_to_numeric(const struct in6_addr *);
251extern const char *xtables_ip6addr_to_anyname(const struct in6_addr *);
252extern const char *xtables_ip6mask_to_numeric(const struct in6_addr *);
Jan Engelhardta0baae82009-01-30 04:32:50 +0100253extern void xtables_ip6parse_any(const char *, struct in6_addr **,
Jan Engelhardtbd943842008-01-20 13:38:08 +0000254 struct in6_addr *, unsigned int *);
Jan Engelhardt08b16162008-01-20 13:36:08 +0000255
Max Kellermanna5d09942008-01-29 13:44:34 +0000256/**
257 * Print the specified value to standard output, quoting dangerous
258 * characters if required.
259 */
Jan Engelhardta0baae82009-01-30 04:32:50 +0100260extern void xtables_save_string(const char *value);
Max Kellermanna5d09942008-01-29 13:44:34 +0000261
Yasuyuki KOZAKAIa3732db2007-07-24 06:39:40 +0000262#ifdef NO_SHARED_LIBS
Jan Engelhardtf82070f2008-01-20 13:14:00 +0000263# ifdef _INIT
264# undef _init
265# define _init _INIT
266# endif
267 extern void init_extensions(void);
268#else
269# define _init __attribute__((constructor)) _INIT
Yasuyuki KOZAKAIa3732db2007-07-24 06:39:40 +0000270#endif
271
Jan Engelhardt1de7edf2009-01-30 05:38:11 +0100272extern const struct xtables_pprot xtables_chain_protos[];
273extern u_int16_t xtables_parse_protocol(const char *s);
Jan Engelhardt33690a12008-02-11 00:54:00 +0100274
275#ifdef XTABLES_INTERNAL
Jan Engelhardtc02e8082009-02-10 10:40:15 +0100276
277/* Shipped modules rely on this... */
278
Jan Engelhardt1de7edf2009-01-30 05:38:11 +0100279# ifndef ARRAY_SIZE
280# define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
281# endif
Jan Engelhardtc02e8082009-02-10 10:40:15 +0100282
283extern void _init(void);
284
Jan Engelhardt33690a12008-02-11 00:54:00 +0100285#endif
286
Yasuyuki KOZAKAI52088062007-07-24 05:44:11 +0000287#endif /* _XTABLES_H */