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