x_tables.h revision 8552b387df5ff1c1df2b0a8e6585b53928838471
123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#ifndef _X_TABLES_H 223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define _X_TABLES_H 323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <linux/kernel.h> 423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <linux/types.h> 523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define XT_FUNCTION_MAXNAMELEN 30 723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define XT_EXTENSION_MAXNAMELEN 29 823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define XT_TABLE_MAXNAMELEN 32 923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)struct xt_entry_match { 1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) union { 1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) struct { 1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __u16 match_size; 1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) /* Used by userspace */ 1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) char name[XT_EXTENSION_MAXNAMELEN]; 1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __u8 revision; 1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } user; 1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) struct { 2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __u16 match_size; 2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) /* Used inside the kernel */ 2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) struct xt_match *match; 2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } kernel; 2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) /* Total length */ 2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __u16 match_size; 2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } u; 2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) unsigned char data[0]; 3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}; 3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)struct xt_entry_target { 3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) union { 3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) struct { 3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __u16 target_size; 3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) /* Used by userspace */ 3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) char name[XT_EXTENSION_MAXNAMELEN]; 4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __u8 revision; 4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } user; 4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) struct { 4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __u16 target_size; 4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) /* Used inside the kernel */ 4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) struct xt_target *target; 4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } kernel; 4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) /* Total length */ 5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __u16 target_size; 5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } u; 5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) unsigned char data[0]; 5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}; 5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define XT_TARGET_INIT(__name, __size) \ 5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles){ \ 5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) .target.u.user = { \ 5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) .target_size = XT_ALIGN(__size), \ 6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) .name = __name, \ 6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) }, \ 6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)struct xt_standard_target { 6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) struct xt_entry_target target; 6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int verdict; 6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}; 6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)struct xt_error_target { 7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) struct xt_entry_target target; 7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) char errorname[XT_FUNCTION_MAXNAMELEN]; 7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}; 7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)/* The argument to IPT_SO_GET_REVISION_*. Returns highest revision 7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * kernel supports, if >= revision. */ 7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)struct xt_get_revision { 7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) char name[XT_EXTENSION_MAXNAMELEN]; 7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __u8 revision; 7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}; 8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)/* CONTINUE verdict for targets */ 8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define XT_CONTINUE 0xFFFFFFFF 8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)/* For standard target */ 8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define XT_RETURN (-NF_REPEAT - 1) 8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)/* this is a dummy structure to find out the alignment requirement for a struct 8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * containing all the fundamental data types that are used in ipt_entry, 8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * ip6t_entry and arpt_entry. This sucks, and it is a hack. It will be my 9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * personal pleasure to remove it -HW 9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) */ 9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)struct _xt_align { 9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __u8 u8; 9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __u16 u16; 9523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __u32 u32; 9623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __u64 u64; 9723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}; 9823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 9923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define XT_ALIGN(s) __ALIGN_KERNEL((s), __alignof__(struct _xt_align)) 10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)/* Standard return verdict, or do jump. */ 10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define XT_STANDARD_TARGET "" 10323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)/* Error verdict. */ 10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define XT_ERROR_TARGET "ERROR" 10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define SET_COUNTER(c,b,p) do { (c).bcnt = (b); (c).pcnt = (p); } while(0) 10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define ADD_COUNTER(c,b,p) do { (c).bcnt += (b); (c).pcnt += (p); } while(0) 10823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 10923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)struct xt_counters { 11023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __u64 pcnt, bcnt; /* Packet and byte counters */ 11123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}; 11223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 11323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)/* The argument to IPT_SO_ADD_COUNTERS. */ 11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)struct xt_counters_info { 11523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) /* Which table. */ 11623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) char name[XT_TABLE_MAXNAMELEN]; 11723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 11823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) unsigned int num_counters; 11923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 12023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) /* The counters (actually `number' of these). */ 12123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) struct xt_counters counters[0]; 12223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}; 12323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 12423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define XT_INV_PROTO 0x40 /* Invert the sense of PROTO. */ 12523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 12623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)/* fn returns 0 to continue iteration */ 12723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define XT_MATCH_ITERATE(type, e, fn, args...) \ 12823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)({ \ 12923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) unsigned int __i; \ 13023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int __ret = 0; \ 13123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) struct xt_entry_match *__m; \ 13223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) \ 13323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) for (__i = sizeof(type); \ 13423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __i < (e)->target_offset; \ 13523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __i += __m->u.match_size) { \ 13623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __m = (void *)e + __i; \ 13723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) \ 13823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __ret = fn(__m , ## args); \ 13923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (__ret != 0) \ 14023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) break; \ 14123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } \ 14223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) __ret; \ 14323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}) 14423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)/* fn returns 0 to continue iteration */ 14623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define XT_ENTRY_ITERATE_CONTINUE(type, entries, size, n, fn, args...) \ 14723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)({ \ 14823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) unsigned int __i, __n; \ 14923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int __ret = 0; \ 15023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) type *__entry; \ 15123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) \ 15223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) for (__i = 0, __n = 0; __i < (size); \ 153 __i += __entry->next_offset, __n++) { \ 154 __entry = (void *)(entries) + __i; \ 155 if (__n < n) \ 156 continue; \ 157 \ 158 __ret = fn(__entry , ## args); \ 159 if (__ret != 0) \ 160 break; \ 161 } \ 162 __ret; \ 163}) 164 165/* fn returns 0 to continue iteration */ 166#define XT_ENTRY_ITERATE(type, entries, size, fn, args...) \ 167 XT_ENTRY_ITERATE_CONTINUE(type, entries, size, 0, fn, args) 168 169 170/* pos is normally a struct ipt_entry/ip6t_entry/etc. */ 171#define xt_entry_foreach(pos, ehead, esize) \ 172 for ((pos) = (typeof(pos))(ehead); \ 173 (pos) < (typeof(pos))((char *)(ehead) + (esize)); \ 174 (pos) = (typeof(pos))((char *)(pos) + (pos)->next_offset)) 175 176/* can only be xt_entry_match, so no use of typeof here */ 177#define xt_ematch_foreach(pos, entry) \ 178 for ((pos) = (struct xt_entry_match *)entry->elems; \ 179 (pos) < (struct xt_entry_match *)((char *)(entry) + \ 180 (entry)->target_offset); \ 181 (pos) = (struct xt_entry_match *)((char *)(pos) + \ 182 (pos)->u.match_size)) 183 184 185#endif /* _X_TABLES_H */ 186