1#ifndef _X_TABLES_H
2#define _X_TABLES_H
3
4#define XT_FUNCTION_MAXNAMELEN 30
5#define XT_TABLE_MAXNAMELEN 32
6
7struct xt_entry_match
8{
9 union {
10 struct {
11 u_int16_t match_size;
12
13
14 char name[XT_FUNCTION_MAXNAMELEN-1];
15
16 u_int8_t revision;
17 } user;
18 struct {
19 u_int16_t match_size;
20
21
22 struct xt_match *match;
23 } kernel;
24
25
26 u_int16_t match_size;
27 } u;
28
29 unsigned char data[0];
30};
31
32struct xt_entry_target
33{
34 union {
35 struct {
36 u_int16_t target_size;
37
38
39 char name[XT_FUNCTION_MAXNAMELEN-1];
40
41 u_int8_t revision;
42 } user;
43 struct {
44 u_int16_t target_size;
45
46
47 struct xt_target *target;
48 } kernel;
49
50
51 u_int16_t target_size;
52 } u;
53
54 unsigned char data[0];
55};
56
57#define XT_TARGET_INIT(__name, __size) \
58{ \
59 .target.u.user = { \
60 .target_size = XT_ALIGN(__size), \
61 .name = __name, \
62 }, \
63}
64
65struct xt_standard_target
66{
67 struct xt_entry_target target;
68 int verdict;
69};
70
71
72
73struct xt_get_revision
74{
75 char name[XT_FUNCTION_MAXNAMELEN-1];
76
77 u_int8_t revision;
78};
79
80
81#define XT_CONTINUE 0xFFFFFFFF
82
83
84#define XT_RETURN (-NF_REPEAT - 1)
85
86
87
88
89
90
91struct _xt_align
92{
93 u_int8_t u8;
94 u_int16_t u16;
95 u_int32_t u32;
96 u_int64_t u64;
97};
98
99#define XT_ALIGN(s) (((s) + (__alignof__(struct _xt_align)-1)) \
100 & ~(__alignof__(struct _xt_align)-1))
101
102
103#define XT_STANDARD_TARGET ""
104
105#define XT_ERROR_TARGET "ERROR"
106
107#define SET_COUNTER(c,b,p) do { (c).bcnt = (b); (c).pcnt = (p); } while(0)
108#define ADD_COUNTER(c,b,p) do { (c).bcnt += (b); (c).pcnt += (p); } while(0)
109
110struct xt_counters
111{
112 u_int64_t pcnt, bcnt;
113};
114
115
116struct xt_counters_info
117{
118
119 char name[XT_TABLE_MAXNAMELEN];
120
121 unsigned int num_counters;
122
123
124 struct xt_counters counters[0];
125};
126
127#define XT_INV_PROTO 0x40
128
129
130#define XT_MATCH_ITERATE(type, e, fn, args...) \
131({ \
132 unsigned int __i; \
133 int __ret = 0; \
134 struct xt_entry_match *__m; \
135 \
136 for (__i = sizeof(type); \
137 __i < (e)->target_offset; \
138 __i += __m->u.match_size) { \
139 __m = (void *)e + __i; \
140 \
141 __ret = fn(__m , ## args); \
142 if (__ret != 0) \
143 break; \
144 } \
145 __ret; \
146})
147
148
149#define XT_ENTRY_ITERATE_CONTINUE(type, entries, size, n, fn, args...) \
150({ \
151 unsigned int __i, __n; \
152 int __ret = 0; \
153 type *__entry; \
154 \
155 for (__i = 0, __n = 0; __i < (size); \
156 __i += __entry->next_offset, __n++) { \
157 __entry = (void *)(entries) + __i; \
158 if (__n < n) \
159 continue; \
160 \
161 __ret = fn(__entry , ## args); \
162 if (__ret != 0) \
163 break; \
164 } \
165 __ret; \
166})
167
168
169#define XT_ENTRY_ITERATE(type, entries, size, fn, args...) \
170 XT_ENTRY_ITERATE_CONTINUE(type, entries, size, 0, fn, args)
171
172#ifdef __KERNEL__
173
174#include <linux/netdevice.h>
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189struct xt_match_param {
190 const struct net_device *in, *out;
191 const struct xt_match *match;
192 const void *matchinfo;
193 int fragoff;
194 unsigned int thoff;
195 bool *hotdrop;
196 u_int8_t family;
197};
198
199
200
201
202
203
204
205
206
207
208
209
210struct xt_mtchk_param {
211 const char *table;
212 const void *entryinfo;
213 const struct xt_match *match;
214 void *matchinfo;
215 unsigned int hook_mask;
216 u_int8_t family;
217};
218
219
220struct xt_mtdtor_param {
221 const struct xt_match *match;
222 void *matchinfo;
223 u_int8_t family;
224};
225
226
227
228
229
230
231
232
233
234
235struct xt_target_param {
236 const struct net_device *in, *out;
237 unsigned int hooknum;
238 const struct xt_target *target;
239 const void *targinfo;
240 u_int8_t family;
241};
242
243
244
245
246
247
248
249
250
251
252struct xt_tgchk_param {
253 const char *table;
254 const void *entryinfo;
255 const struct xt_target *target;
256 void *targinfo;
257 unsigned int hook_mask;
258 u_int8_t family;
259};
260
261
262struct xt_tgdtor_param {
263 const struct xt_target *target;
264 void *targinfo;
265 u_int8_t family;
266};
267
268struct xt_match
269{
270 struct list_head list;
271
272 const char name[XT_FUNCTION_MAXNAMELEN-1];
273
274
275
276
277
278
279 bool (*match)(const struct sk_buff *skb,
280 const struct xt_match_param *);
281
282
283 bool (*checkentry)(const struct xt_mtchk_param *);
284
285
286 void (*destroy)(const struct xt_mtdtor_param *);
287
288
289 void (*compat_from_user)(void *dst, void *src);
290 int (*compat_to_user)(void __user *dst, void *src);
291
292
293 struct module *me;
294
295
296 unsigned long data;
297
298 const char *table;
299 unsigned int matchsize;
300 unsigned int compatsize;
301 unsigned int hooks;
302 unsigned short proto;
303
304 unsigned short family;
305 u_int8_t revision;
306};
307
308
309struct xt_target
310{
311 struct list_head list;
312
313 const char name[XT_FUNCTION_MAXNAMELEN-1];
314
315
316
317
318 unsigned int (*target)(struct sk_buff *skb,
319 const struct xt_target_param *);
320
321
322
323
324
325 bool (*checkentry)(const struct xt_tgchk_param *);
326
327
328 void (*destroy)(const struct xt_tgdtor_param *);
329
330
331 void (*compat_from_user)(void *dst, void *src);
332 int (*compat_to_user)(void __user *dst, void *src);
333
334
335 struct module *me;
336
337 const char *table;
338 unsigned int targetsize;
339 unsigned int compatsize;
340 unsigned int hooks;
341 unsigned short proto;
342
343 unsigned short family;
344 u_int8_t revision;
345};
346
347
348struct xt_table
349{
350 struct list_head list;
351
352
353 const char name[XT_TABLE_MAXNAMELEN];
354
355
356 unsigned int valid_hooks;
357
358
359 rwlock_t lock;
360
361
362
363 void *private;
364
365
366 struct module *me;
367
368 u_int8_t af;
369};
370
371#include <linux/netfilter_ipv4.h>
372
373
374struct xt_table_info
375{
376
377 unsigned int size;
378
379 unsigned int number;
380
381 unsigned int initial_entries;
382
383
384 unsigned int hook_entry[NF_INET_NUMHOOKS];
385 unsigned int underflow[NF_INET_NUMHOOKS];
386
387
388
389 char *entries[1];
390};
391
392#define XT_TABLE_INFO_SZ (offsetof(struct xt_table_info, entries) \
393 + nr_cpu_ids * sizeof(char *))
394extern int xt_register_target(struct xt_target *target);
395extern void xt_unregister_target(struct xt_target *target);
396extern int xt_register_targets(struct xt_target *target, unsigned int n);
397extern void xt_unregister_targets(struct xt_target *target, unsigned int n);
398
399extern int xt_register_match(struct xt_match *target);
400extern void xt_unregister_match(struct xt_match *target);
401extern int xt_register_matches(struct xt_match *match, unsigned int n);
402extern void xt_unregister_matches(struct xt_match *match, unsigned int n);
403
404extern int xt_check_match(struct xt_mtchk_param *,
405 unsigned int size, u_int8_t proto, bool inv_proto);
406extern int xt_check_target(struct xt_tgchk_param *,
407 unsigned int size, u_int8_t proto, bool inv_proto);
408
409extern struct xt_table *xt_register_table(struct net *net,
410 struct xt_table *table,
411 struct xt_table_info *bootstrap,
412 struct xt_table_info *newinfo);
413extern void *xt_unregister_table(struct xt_table *table);
414
415extern struct xt_table_info *xt_replace_table(struct xt_table *table,
416 unsigned int num_counters,
417 struct xt_table_info *newinfo,
418 int *error);
419
420extern struct xt_match *xt_find_match(u8 af, const char *name, u8 revision);
421extern struct xt_target *xt_find_target(u8 af, const char *name, u8 revision);
422extern struct xt_target *xt_request_find_target(u8 af, const char *name,
423 u8 revision);
424extern int xt_find_revision(u8 af, const char *name, u8 revision,
425 int target, int *err);
426
427extern struct xt_table *xt_find_table_lock(struct net *net, u_int8_t af,
428 const char *name);
429extern void xt_table_unlock(struct xt_table *t);
430
431extern int xt_proto_init(struct net *net, u_int8_t af);
432extern void xt_proto_fini(struct net *net, u_int8_t af);
433
434extern struct xt_table_info *xt_alloc_table_info(unsigned int size);
435extern void xt_free_table_info(struct xt_table_info *info);
436
437#ifdef CONFIG_COMPAT
438#include <net/compat.h>
439
440struct compat_xt_entry_match
441{
442 union {
443 struct {
444 u_int16_t match_size;
445 char name[XT_FUNCTION_MAXNAMELEN - 1];
446 u_int8_t revision;
447 } user;
448 struct {
449 u_int16_t match_size;
450 compat_uptr_t match;
451 } kernel;
452 u_int16_t match_size;
453 } u;
454 unsigned char data[0];
455};
456
457struct compat_xt_entry_target
458{
459 union {
460 struct {
461 u_int16_t target_size;
462 char name[XT_FUNCTION_MAXNAMELEN - 1];
463 u_int8_t revision;
464 } user;
465 struct {
466 u_int16_t target_size;
467 compat_uptr_t target;
468 } kernel;
469 u_int16_t target_size;
470 } u;
471 unsigned char data[0];
472};
473
474
475
476
477
478struct compat_xt_counters
479{
480#if defined(CONFIG_X86_64) || defined(CONFIG_IA64)
481 u_int32_t cnt[4];
482#else
483 u_int64_t cnt[2];
484#endif
485};
486
487struct compat_xt_counters_info
488{
489 char name[XT_TABLE_MAXNAMELEN];
490 compat_uint_t num_counters;
491 struct compat_xt_counters counters[0];
492};
493
494#define COMPAT_XT_ALIGN(s) (((s) + (__alignof__(struct compat_xt_counters)-1)) \
495 & ~(__alignof__(struct compat_xt_counters)-1))
496
497extern void xt_compat_lock(u_int8_t af);
498extern void xt_compat_unlock(u_int8_t af);
499
500extern int xt_compat_add_offset(u_int8_t af, unsigned int offset, short delta);
501extern void xt_compat_flush_offsets(u_int8_t af);
502extern short xt_compat_calc_jump(u_int8_t af, unsigned int offset);
503
504extern int xt_compat_match_offset(const struct xt_match *match);
505extern int xt_compat_match_from_user(struct xt_entry_match *m,
506 void **dstptr, unsigned int *size);
507extern int xt_compat_match_to_user(struct xt_entry_match *m,
508 void __user **dstptr, unsigned int *size);
509
510extern int xt_compat_target_offset(const struct xt_target *target);
511extern void xt_compat_target_from_user(struct xt_entry_target *t,
512 void **dstptr, unsigned int *size);
513extern int xt_compat_target_to_user(struct xt_entry_target *t,
514 void __user **dstptr, unsigned int *size);
515
516#endif
517#endif
518
519#endif
520