ebtables.h
上传用户:szlgq88
上传日期:2009-04-28
资源大小:48287k
文件大小:12k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  ebtables
  3.  *
  4.  * Authors:
  5.  * Bart De Schuymer <bdschuym@pandora.be>
  6.  *
  7.  *  ebtables.c,v 2.0, April, 2002
  8.  *
  9.  *  This code is stongly inspired on the iptables code which is
  10.  *  Copyright (C) 1999 Paul `Rusty' Russell & Michael J. Neuling
  11.  */
  12. #ifndef __LINUX_BRIDGE_EFF_H
  13. #define __LINUX_BRIDGE_EFF_H
  14. #include <linux/if.h>
  15. #include <linux/netfilter_bridge.h>
  16. #include <linux/if_ether.h>
  17. #define EBT_TABLE_MAXNAMELEN 32
  18. #define EBT_CHAIN_MAXNAMELEN EBT_TABLE_MAXNAMELEN
  19. #define EBT_FUNCTION_MAXNAMELEN EBT_TABLE_MAXNAMELEN
  20. /* verdicts >0 are "branches" */
  21. #define EBT_ACCEPT   -1
  22. #define EBT_DROP     -2
  23. #define EBT_CONTINUE -3
  24. #define EBT_RETURN   -4
  25. #define NUM_STANDARD_TARGETS   4
  26. struct ebt_counter
  27. {
  28. uint64_t pcnt;
  29. uint64_t bcnt;
  30. };
  31. struct ebt_replace
  32. {
  33. char name[EBT_TABLE_MAXNAMELEN];
  34. unsigned int valid_hooks;
  35. /* nr of rules in the table */
  36. unsigned int nentries;
  37. /* total size of the entries */
  38. unsigned int entries_size;
  39. /* start of the chains */
  40. struct ebt_entries *hook_entry[NF_BR_NUMHOOKS];
  41. /* nr of counters userspace expects back */
  42. unsigned int num_counters;
  43. /* where the kernel will put the old counters */
  44. struct ebt_counter *counters;
  45. char *entries;
  46. };
  47. struct ebt_entries {
  48. /* this field is always set to zero
  49.  * See EBT_ENTRY_OR_ENTRIES.
  50.  * Must be same size as ebt_entry.bitmask */
  51. unsigned int distinguisher;
  52. /* the chain name */
  53. char name[EBT_CHAIN_MAXNAMELEN];
  54. /* counter offset for this chain */
  55. unsigned int counter_offset;
  56. /* one standard (accept, drop, return) per hook */
  57. int policy;
  58. /* nr. of entries */
  59. unsigned int nentries;
  60. /* entry list */
  61. char data[0] __attribute__ ((aligned (__alignof__(struct ebt_replace))));
  62. };
  63. /* used for the bitmask of struct ebt_entry */
  64. /* This is a hack to make a difference between an ebt_entry struct and an
  65.  * ebt_entries struct when traversing the entries from start to end.
  66.  * Using this simplifies the code alot, while still being able to use
  67.  * ebt_entries.
  68.  * Contrary, iptables doesn't use something like ebt_entries and therefore uses
  69.  * different techniques for naming the policy and such. So, iptables doesn't
  70.  * need a hack like this.
  71.  */
  72. #define EBT_ENTRY_OR_ENTRIES 0x01
  73. /* these are the normal masks */
  74. #define EBT_NOPROTO 0x02
  75. #define EBT_802_3 0x04
  76. #define EBT_SOURCEMAC 0x08
  77. #define EBT_DESTMAC 0x10
  78. #define EBT_F_MASK (EBT_NOPROTO | EBT_802_3 | EBT_SOURCEMAC | EBT_DESTMAC 
  79.    | EBT_ENTRY_OR_ENTRIES)
  80. #define EBT_IPROTO 0x01
  81. #define EBT_IIN 0x02
  82. #define EBT_IOUT 0x04
  83. #define EBT_ISOURCE 0x8
  84. #define EBT_IDEST 0x10
  85. #define EBT_ILOGICALIN 0x20
  86. #define EBT_ILOGICALOUT 0x40
  87. #define EBT_INV_MASK (EBT_IPROTO | EBT_IIN | EBT_IOUT | EBT_ILOGICALIN 
  88.    | EBT_ILOGICALOUT | EBT_ISOURCE | EBT_IDEST)
  89. struct ebt_entry_match
  90. {
  91. union {
  92. char name[EBT_FUNCTION_MAXNAMELEN];
  93. struct ebt_match *match;
  94. } u;
  95. /* size of data */
  96. unsigned int match_size;
  97. unsigned char data[0] __attribute__ ((aligned (__alignof__(struct ebt_replace))));
  98. };
  99. struct ebt_entry_watcher
  100. {
  101. union {
  102. char name[EBT_FUNCTION_MAXNAMELEN];
  103. struct ebt_watcher *watcher;
  104. } u;
  105. /* size of data */
  106. unsigned int watcher_size;
  107. unsigned char data[0] __attribute__ ((aligned (__alignof__(struct ebt_replace))));
  108. };
  109. struct ebt_entry_target
  110. {
  111. union {
  112. char name[EBT_FUNCTION_MAXNAMELEN];
  113. struct ebt_target *target;
  114. } u;
  115. /* size of data */
  116. unsigned int target_size;
  117. unsigned char data[0] __attribute__ ((aligned (__alignof__(struct ebt_replace))));
  118. };
  119. #define EBT_STANDARD_TARGET "standard"
  120. struct ebt_standard_target
  121. {
  122. struct ebt_entry_target target;
  123. int verdict;
  124. };
  125. /* one entry */
  126. struct ebt_entry {
  127. /* this needs to be the first field */
  128. unsigned int bitmask;
  129. unsigned int invflags;
  130. uint16_t ethproto;
  131. /* the physical in-dev */
  132. char in[IFNAMSIZ];
  133. /* the logical in-dev */
  134. char logical_in[IFNAMSIZ];
  135. /* the physical out-dev */
  136. char out[IFNAMSIZ];
  137. /* the logical out-dev */
  138. char logical_out[IFNAMSIZ];
  139. unsigned char sourcemac[ETH_ALEN];
  140. unsigned char sourcemsk[ETH_ALEN];
  141. unsigned char destmac[ETH_ALEN];
  142. unsigned char destmsk[ETH_ALEN];
  143. /* sizeof ebt_entry + matches */
  144. unsigned int watchers_offset;
  145. /* sizeof ebt_entry + matches + watchers */
  146. unsigned int target_offset;
  147. /* sizeof ebt_entry + matches + watchers + target */
  148. unsigned int next_offset;
  149. unsigned char elems[0] __attribute__ ((aligned (__alignof__(struct ebt_replace))));
  150. };
  151. /* {g,s}etsockopt numbers */
  152. #define EBT_BASE_CTL            128
  153. #define EBT_SO_SET_ENTRIES      (EBT_BASE_CTL)
  154. #define EBT_SO_SET_COUNTERS     (EBT_SO_SET_ENTRIES+1)
  155. #define EBT_SO_SET_MAX          (EBT_SO_SET_COUNTERS+1)
  156. #define EBT_SO_GET_INFO         (EBT_BASE_CTL)
  157. #define EBT_SO_GET_ENTRIES      (EBT_SO_GET_INFO+1)
  158. #define EBT_SO_GET_INIT_INFO    (EBT_SO_GET_ENTRIES+1)
  159. #define EBT_SO_GET_INIT_ENTRIES (EBT_SO_GET_INIT_INFO+1)
  160. #define EBT_SO_GET_MAX          (EBT_SO_GET_INIT_ENTRIES+1)
  161. #ifdef __KERNEL__
  162. /* return values for match() functions */
  163. #define EBT_MATCH 0
  164. #define EBT_NOMATCH 1
  165. struct ebt_match
  166. {
  167. struct list_head list;
  168. const char name[EBT_FUNCTION_MAXNAMELEN];
  169. /* 0 == it matches */
  170. int (*match)(const struct sk_buff *skb, const struct net_device *in,
  171.    const struct net_device *out, const void *matchdata,
  172.    unsigned int datalen);
  173. /* 0 == let it in */
  174. int (*check)(const char *tablename, unsigned int hookmask,
  175.    const struct ebt_entry *e, void *matchdata, unsigned int datalen);
  176. void (*destroy)(void *matchdata, unsigned int datalen);
  177. struct module *me;
  178. };
  179. struct ebt_watcher
  180. {
  181. struct list_head list;
  182. const char name[EBT_FUNCTION_MAXNAMELEN];
  183. void (*watcher)(const struct sk_buff *skb, unsigned int hooknr,
  184.    const struct net_device *in, const struct net_device *out,
  185.    const void *watcherdata, unsigned int datalen);
  186. /* 0 == let it in */
  187. int (*check)(const char *tablename, unsigned int hookmask,
  188.    const struct ebt_entry *e, void *watcherdata, unsigned int datalen);
  189. void (*destroy)(void *watcherdata, unsigned int datalen);
  190. struct module *me;
  191. };
  192. struct ebt_target
  193. {
  194. struct list_head list;
  195. const char name[EBT_FUNCTION_MAXNAMELEN];
  196. /* returns one of the standard verdicts */
  197. int (*target)(struct sk_buff **pskb, unsigned int hooknr,
  198.    const struct net_device *in, const struct net_device *out,
  199.    const void *targetdata, unsigned int datalen);
  200. /* 0 == let it in */
  201. int (*check)(const char *tablename, unsigned int hookmask,
  202.    const struct ebt_entry *e, void *targetdata, unsigned int datalen);
  203. void (*destroy)(void *targetdata, unsigned int datalen);
  204. struct module *me;
  205. };
  206. /* used for jumping from and into user defined chains (udc) */
  207. struct ebt_chainstack
  208. {
  209. struct ebt_entries *chaininfo; /* pointer to chain data */
  210. struct ebt_entry *e; /* pointer to entry data */
  211. unsigned int n; /* n'th entry */
  212. };
  213. struct ebt_table_info
  214. {
  215. /* total size of the entries */
  216. unsigned int entries_size;
  217. unsigned int nentries;
  218. /* pointers to the start of the chains */
  219. struct ebt_entries *hook_entry[NF_BR_NUMHOOKS];
  220. /* room to maintain the stack used for jumping from and into udc */
  221. struct ebt_chainstack **chainstack;
  222. char *entries;
  223. struct ebt_counter counters[0] ____cacheline_aligned;
  224. };
  225. struct ebt_table
  226. {
  227. struct list_head list;
  228. char name[EBT_TABLE_MAXNAMELEN];
  229. struct ebt_replace *table;
  230. unsigned int valid_hooks;
  231. rwlock_t lock;
  232. /* e.g. could be the table explicitly only allows certain
  233.  * matches, targets, ... 0 == let it in */
  234. int (*check)(const struct ebt_table_info *info,
  235.    unsigned int valid_hooks);
  236. /* the data used by the kernel */
  237. struct ebt_table_info *private;
  238. struct module *me;
  239. };
  240. #define EBT_ALIGN(s) (((s) + (__alignof__(struct ebt_replace)-1)) & 
  241.      ~(__alignof__(struct ebt_replace)-1))
  242. extern int ebt_register_table(struct ebt_table *table);
  243. extern void ebt_unregister_table(struct ebt_table *table);
  244. extern int ebt_register_match(struct ebt_match *match);
  245. extern void ebt_unregister_match(struct ebt_match *match);
  246. extern int ebt_register_watcher(struct ebt_watcher *watcher);
  247. extern void ebt_unregister_watcher(struct ebt_watcher *watcher);
  248. extern int ebt_register_target(struct ebt_target *target);
  249. extern void ebt_unregister_target(struct ebt_target *target);
  250. extern unsigned int ebt_do_table(unsigned int hook, struct sk_buff **pskb,
  251.    const struct net_device *in, const struct net_device *out,
  252.    struct ebt_table *table);
  253. /* Used in the kernel match() functions */
  254. #define FWINV(bool,invflg) ((bool) ^ !!(info->invflags & invflg))
  255. /* True if the hook mask denotes that the rule is in a base chain,
  256.  * used in the check() functions */
  257. #define BASE_CHAIN (hookmask & (1 << NF_BR_NUMHOOKS))
  258. /* Clear the bit in the hook mask that tells if the rule is on a base chain */
  259. #define CLEAR_BASE_CHAIN_BIT (hookmask &= ~(1 << NF_BR_NUMHOOKS))
  260. /* True if the target is not a standard target */
  261. #define INVALID_TARGET (info->target < -NUM_STANDARD_TARGETS || info->target >= 0)
  262. #endif /* __KERNEL__ */
  263. /* blatently stolen from ip_tables.h
  264.  * fn returns 0 to continue iteration */
  265. #define EBT_MATCH_ITERATE(e, fn, args...)                   
  266. ({                                                          
  267. unsigned int __i;                                   
  268. int __ret = 0;                                      
  269. struct ebt_entry_match *__match;                    
  270.                                                     
  271. for (__i = sizeof(struct ebt_entry);                
  272.      __i < (e)->watchers_offset;                    
  273.      __i += __match->match_size +                   
  274.      sizeof(struct ebt_entry_match)) {              
  275. __match = (void *)(e) + __i;                
  276.                                             
  277. __ret = fn(__match , ## args);              
  278. if (__ret != 0)                             
  279. break;                              
  280. }                                                   
  281. if (__ret == 0) {                                   
  282. if (__i != (e)->watchers_offset)            
  283. __ret = -EINVAL;                    
  284. }                                                   
  285. __ret;                                              
  286. })
  287. #define EBT_WATCHER_ITERATE(e, fn, args...)                 
  288. ({                                                          
  289. unsigned int __i;                                   
  290. int __ret = 0;                                      
  291. struct ebt_entry_watcher *__watcher;                
  292.                                                     
  293. for (__i = e->watchers_offset;                      
  294.      __i < (e)->target_offset;                      
  295.      __i += __watcher->watcher_size +               
  296.      sizeof(struct ebt_entry_watcher)) {            
  297. __watcher = (void *)(e) + __i;              
  298.                                             
  299. __ret = fn(__watcher , ## args);            
  300. if (__ret != 0)                             
  301. break;                              
  302. }                                                   
  303. if (__ret == 0) {                                   
  304. if (__i != (e)->target_offset)              
  305. __ret = -EINVAL;                    
  306. }                                                   
  307. __ret;                                              
  308. })
  309. #define EBT_ENTRY_ITERATE(entries, size, fn, args...)       
  310. ({                                                          
  311. unsigned int __i;                                   
  312. int __ret = 0;                                      
  313. struct ebt_entry *__entry;                          
  314.                                                     
  315. for (__i = 0; __i < (size);) {                      
  316. __entry = (void *)(entries) + __i;          
  317. __ret = fn(__entry , ## args);              
  318. if (__ret != 0)                             
  319. break;                              
  320. if (__entry->bitmask != 0)                  
  321. __i += __entry->next_offset;        
  322. else                                        
  323. __i += sizeof(struct ebt_entries);  
  324. }                                                   
  325. if (__ret == 0) {                                   
  326. if (__i != (size))                          
  327. __ret = -EINVAL;                    
  328. }                                                   
  329. __ret;                                              
  330. })
  331. #endif