10d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#ifndef _X_TABLES_H
20d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#define _X_TABLES_H
3491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt#include <linux/kernel.h>
4350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt#include <linux/types.h>
5350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt
60d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#define XT_FUNCTION_MAXNAMELEN 30
7491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt#define XT_EXTENSION_MAXNAMELEN 29
80d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#define XT_TABLE_MAXNAMELEN 32
90d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
10350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardtstruct xt_entry_match {
110d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI	union {
120d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI		struct {
13350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt			__u16 match_size;
140d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
150d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI			/* Used by userspace */
16491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt			char name[XT_EXTENSION_MAXNAMELEN];
17350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt			__u8 revision;
180d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI		} user;
190d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI		struct {
20350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt			__u16 match_size;
210d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
220d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI			/* Used inside the kernel */
230d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI			struct xt_match *match;
240d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI		} kernel;
250d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
260d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI		/* Total length */
27350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt		__u16 match_size;
280d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI	} u;
290d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
300d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI	unsigned char data[0];
310d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI};
320d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
33350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardtstruct xt_entry_target {
340d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI	union {
350d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI		struct {
36350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt			__u16 target_size;
370d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
380d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI			/* Used by userspace */
39491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt			char name[XT_EXTENSION_MAXNAMELEN];
40350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt			__u8 revision;
410d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI		} user;
420d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI		struct {
43350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt			__u16 target_size;
440d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
450d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI			/* Used inside the kernel */
460d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI			struct xt_target *target;
470d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI		} kernel;
480d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
490d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI		/* Total length */
50350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt		__u16 target_size;
510d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI	} u;
520d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
530d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI	unsigned char data[0];
540d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI};
550d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
562cfa903a2882a5d7819c697870af9ae3ab106386Jesper Brouer#define XT_TARGET_INIT(__name, __size)					       \
572cfa903a2882a5d7819c697870af9ae3ab106386Jesper Brouer{									       \
582cfa903a2882a5d7819c697870af9ae3ab106386Jesper Brouer	.target.u.user = {						       \
592cfa903a2882a5d7819c697870af9ae3ab106386Jesper Brouer		.target_size	= XT_ALIGN(__size),			       \
602cfa903a2882a5d7819c697870af9ae3ab106386Jesper Brouer		.name		= __name,				       \
612cfa903a2882a5d7819c697870af9ae3ab106386Jesper Brouer	},								       \
622cfa903a2882a5d7819c697870af9ae3ab106386Jesper Brouer}
632cfa903a2882a5d7819c697870af9ae3ab106386Jesper Brouer
64350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardtstruct xt_standard_target {
650d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI	struct xt_entry_target target;
660d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI	int verdict;
670d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI};
680d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
69dbe77cc974cee656eae37e75039dd1a410a4535bJan Engelhardtstruct xt_error_target {
70dbe77cc974cee656eae37e75039dd1a410a4535bJan Engelhardt	struct xt_entry_target target;
71dbe77cc974cee656eae37e75039dd1a410a4535bJan Engelhardt	char errorname[XT_FUNCTION_MAXNAMELEN];
72dbe77cc974cee656eae37e75039dd1a410a4535bJan Engelhardt};
73dbe77cc974cee656eae37e75039dd1a410a4535bJan Engelhardt
740d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI/* The argument to IPT_SO_GET_REVISION_*.  Returns highest revision
750d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI * kernel supports, if >= revision. */
76350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardtstruct xt_get_revision {
77491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt	char name[XT_EXTENSION_MAXNAMELEN];
78350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt	__u8 revision;
790d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI};
800d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
810d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI/* CONTINUE verdict for targets */
820d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#define XT_CONTINUE 0xFFFFFFFF
830d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
840d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI/* For standard target */
850d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#define XT_RETURN (-NF_REPEAT - 1)
860d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
870d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI/* this is a dummy structure to find out the alignment requirement for a struct
880d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI * containing all the fundamental data types that are used in ipt_entry,
890d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI * ip6t_entry and arpt_entry.  This sucks, and it is a hack.  It will be my
900d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI * personal pleasure to remove it -HW
910d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI */
92350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardtstruct _xt_align {
93350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt	__u8 u8;
94350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt	__u16 u16;
95350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt	__u32 u32;
96350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt	__u64 u64;
970d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI};
980d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
99491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt#define XT_ALIGN(s) __ALIGN_KERNEL((s), __alignof__(struct _xt_align))
1000d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
1010d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI/* Standard return verdict, or do jump. */
1020d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#define XT_STANDARD_TARGET ""
1030d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI/* Error verdict. */
1040d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#define XT_ERROR_TARGET "ERROR"
1050d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
1060d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#define SET_COUNTER(c,b,p) do { (c).bcnt = (b); (c).pcnt = (p); } while(0)
1070d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#define ADD_COUNTER(c,b,p) do { (c).bcnt += (b); (c).pcnt += (p); } while(0)
1080d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
109350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardtstruct xt_counters {
110350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardt	__u64 pcnt, bcnt;			/* Packet and byte counters */
1110d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI};
1120d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
1130d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI/* The argument to IPT_SO_ADD_COUNTERS. */
114350661a6eb089f3e54e67e022db9e16ea280499fJan Engelhardtstruct xt_counters_info {
1150d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI	/* Which table. */
1160d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI	char name[XT_TABLE_MAXNAMELEN];
1170d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
1180d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI	unsigned int num_counters;
1190d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
1200d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI	/* The counters (actually `number' of these). */
1210d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI	struct xt_counters counters[0];
1220d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI};
1230d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
1240d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#define XT_INV_PROTO		0x40	/* Invert the sense of PROTO. */
1250d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI
126ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt/* fn returns 0 to continue iteration */
127ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt#define XT_MATCH_ITERATE(type, e, fn, args...)			\
128ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt({								\
129ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt	unsigned int __i;					\
130ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt	int __ret = 0;						\
131ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt	struct xt_entry_match *__m;				\
132ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt								\
133ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt	for (__i = sizeof(type);				\
134ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt	     __i < (e)->target_offset;				\
135ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt	     __i += __m->u.match_size) {			\
136ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt		__m = (void *)e + __i;				\
137ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt								\
138ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt		__ret = fn(__m , ## args);			\
139ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt		if (__ret != 0)					\
140ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt			break;					\
141ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt	}							\
142ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt	__ret;							\
143ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt})
144ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt
145ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt/* fn returns 0 to continue iteration */
146ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt#define XT_ENTRY_ITERATE_CONTINUE(type, entries, size, n, fn, args...) \
147ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt({								\
148ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt	unsigned int __i, __n;					\
149ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt	int __ret = 0;						\
150ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt	type *__entry;						\
151ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt								\
152ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt	for (__i = 0, __n = 0; __i < (size);			\
153ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt	     __i += __entry->next_offset, __n++) { 		\
154ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt		__entry = (void *)(entries) + __i;		\
155ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt		if (__n < n)					\
156ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt			continue;				\
157ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt								\
158ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt		__ret = fn(__entry , ## args);			\
159ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt		if (__ret != 0)					\
160ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt			break;					\
161ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt	}							\
162ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt	__ret;							\
163ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt})
164ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt
165ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt/* fn returns 0 to continue iteration */
166ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt#define XT_ENTRY_ITERATE(type, entries, size, fn, args...) \
167ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt	XT_ENTRY_ITERATE_CONTINUE(type, entries, size, 0, fn, args)
168ca7cd666949b68bf41a32de38ee38e332e89863bJan Engelhardt
1692cfa903a2882a5d7819c697870af9ae3ab106386Jesper Brouer
170491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt/* pos is normally a struct ipt_entry/ip6t_entry/etc. */
171491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt#define xt_entry_foreach(pos, ehead, esize) \
172491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt	for ((pos) = (typeof(pos))(ehead); \
173491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt	     (pos) < (typeof(pos))((char *)(ehead) + (esize)); \
174491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt	     (pos) = (typeof(pos))((char *)(pos) + (pos)->next_offset))
175491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt
176491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt/* can only be xt_entry_match, so no use of typeof here */
177491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt#define xt_ematch_foreach(pos, entry) \
178491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt	for ((pos) = (struct xt_entry_match *)entry->elems; \
179491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt	     (pos) < (struct xt_entry_match *)((char *)(entry) + \
180491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt	             (entry)->target_offset); \
181491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt	     (pos) = (struct xt_entry_match *)((char *)(pos) + \
182491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt	             (pos)->u.match_size))
183491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt
184491c1660fced08e2d1a08c101c63af04250275d0Jan Engelhardt
1850d502bcdbc97ed359e84f6a21dfa0049b3b60a6cYasuyuki KOZAKAI#endif /* _X_TABLES_H */
186