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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  Format of an ARP firewall descriptor
  3.  *
  4.  *  src, tgt, src_mask, tgt_mask, arpop, arpop_mask are always stored in
  5.  * network byte order.
  6.  *  flags are stored in host byte order (of course).
  7.  */
  8. #ifndef _ARPTABLES_H
  9. #define _ARPTABLES_H
  10. #ifdef __KERNEL__
  11. #include <linux/if.h>
  12. #include <linux/types.h>
  13. #include <linux/in.h>
  14. #include <linux/if_arp.h>
  15. #include <linux/skbuff.h>
  16. #endif
  17. #include <linux/compiler.h>
  18. #include <linux/netfilter_arp.h>
  19. #define ARPT_FUNCTION_MAXNAMELEN 30
  20. #define ARPT_TABLE_MAXNAMELEN 32
  21. #define ARPT_DEV_ADDR_LEN_MAX 16
  22. struct arpt_devaddr_info {
  23. char addr[ARPT_DEV_ADDR_LEN_MAX];
  24. char mask[ARPT_DEV_ADDR_LEN_MAX];
  25. };
  26. /* Yes, Virginia, you have to zero the padding. */
  27. struct arpt_arp {
  28. /* Source and target IP addr */
  29. struct in_addr src, tgt;
  30. /* Mask for src and target IP addr */
  31. struct in_addr smsk, tmsk;
  32. /* Device hw address length, src+target device addresses */
  33. u_int8_t arhln, arhln_mask;
  34. struct arpt_devaddr_info src_devaddr;
  35. struct arpt_devaddr_info tgt_devaddr;
  36. /* ARP operation code. */
  37. u_int16_t arpop, arpop_mask;
  38. /* ARP hardware address and protocol address format. */
  39. u_int16_t arhrd, arhrd_mask;
  40. u_int16_t arpro, arpro_mask;
  41. /* The protocol address length is only accepted if it is 4
  42.  * so there is no use in offering a way to do filtering on it.
  43.  */
  44. char iniface[IFNAMSIZ], outiface[IFNAMSIZ];
  45. unsigned char iniface_mask[IFNAMSIZ], outiface_mask[IFNAMSIZ];
  46. /* Flags word */
  47. u_int8_t flags;
  48. /* Inverse flags */
  49. u_int16_t invflags;
  50. };
  51. struct arpt_entry_target
  52. {
  53. union {
  54. struct {
  55. u_int16_t target_size;
  56. /* Used by userspace */
  57. char name[ARPT_FUNCTION_MAXNAMELEN];
  58. } user;
  59. struct {
  60. u_int16_t target_size;
  61. /* Used inside the kernel */
  62. struct arpt_target *target;
  63. } kernel;
  64. /* Total length */
  65. u_int16_t target_size;
  66. } u;
  67. unsigned char data[0];
  68. };
  69. struct arpt_standard_target
  70. {
  71. struct arpt_entry_target target;
  72. int verdict;
  73. };
  74. struct arpt_counters
  75. {
  76. u_int64_t pcnt, bcnt; /* Packet and byte counters */
  77. };
  78. /* Values for "flag" field in struct arpt_ip (general arp structure).
  79.  * No flags defined yet.
  80.  */
  81. #define ARPT_F_MASK 0x00 /* All possible flag bits mask. */
  82. /* Values for "inv" field in struct arpt_arp. */
  83. #define ARPT_INV_VIA_IN 0x0001 /* Invert the sense of IN IFACE. */
  84. #define ARPT_INV_VIA_OUT 0x0002 /* Invert the sense of OUT IFACE */
  85. #define ARPT_INV_SRCIP 0x0004 /* Invert the sense of SRC IP. */
  86. #define ARPT_INV_TGTIP 0x0008 /* Invert the sense of TGT IP. */
  87. #define ARPT_INV_SRCDEVADDR 0x0010 /* Invert the sense of SRC DEV ADDR. */
  88. #define ARPT_INV_TGTDEVADDR 0x0020 /* Invert the sense of TGT DEV ADDR. */
  89. #define ARPT_INV_ARPOP 0x0040 /* Invert the sense of ARP OP. */
  90. #define ARPT_INV_ARPHRD 0x0080 /* Invert the sense of ARP HRD. */
  91. #define ARPT_INV_ARPPRO 0x0100 /* Invert the sense of ARP PRO. */
  92. #define ARPT_INV_ARPHLN 0x0200 /* Invert the sense of ARP HLN. */
  93. #define ARPT_INV_MASK 0x03FF /* All possible flag bits mask. */
  94. /* This structure defines each of the firewall rules.  Consists of 3
  95.    parts which are 1) general ARP header stuff 2) match specific
  96.    stuff 3) the target to perform if the rule matches */
  97. struct arpt_entry
  98. {
  99. struct arpt_arp arp;
  100. /* Size of arpt_entry + matches */
  101. u_int16_t target_offset;
  102. /* Size of arpt_entry + matches + target */
  103. u_int16_t next_offset;
  104. /* Back pointer */
  105. unsigned int comefrom;
  106. /* Packet and byte counters. */
  107. struct arpt_counters counters;
  108. /* The matches (if any), then the target. */
  109. unsigned char elems[0];
  110. };
  111. /*
  112.  * New IP firewall options for [gs]etsockopt at the RAW IP level.
  113.  * Unlike BSD Linux inherits IP options so you don't have to use a raw
  114.  * socket for this. Instead we check rights in the calls.
  115.  */
  116. #define ARPT_BASE_CTL 96 /* base for firewall socket options */
  117. #define ARPT_SO_SET_REPLACE (ARPT_BASE_CTL)
  118. #define ARPT_SO_SET_ADD_COUNTERS (ARPT_BASE_CTL + 1)
  119. #define ARPT_SO_SET_MAX ARPT_SO_SET_ADD_COUNTERS
  120. #define ARPT_SO_GET_INFO (ARPT_BASE_CTL)
  121. #define ARPT_SO_GET_ENTRIES (ARPT_BASE_CTL + 1)
  122. #define ARPT_SO_GET_MAX ARPT_SO_GET_ENTRIES
  123. /* CONTINUE verdict for targets */
  124. #define ARPT_CONTINUE 0xFFFFFFFF
  125. /* For standard target */
  126. #define ARPT_RETURN (-NF_REPEAT - 1)
  127. /* The argument to ARPT_SO_GET_INFO */
  128. struct arpt_getinfo
  129. {
  130. /* Which table: caller fills this in. */
  131. char name[ARPT_TABLE_MAXNAMELEN];
  132. /* Kernel fills these in. */
  133. /* Which hook entry points are valid: bitmask */
  134. unsigned int valid_hooks;
  135. /* Hook entry points: one per netfilter hook. */
  136. unsigned int hook_entry[NF_ARP_NUMHOOKS];
  137. /* Underflow points. */
  138. unsigned int underflow[NF_ARP_NUMHOOKS];
  139. /* Number of entries */
  140. unsigned int num_entries;
  141. /* Size of entries. */
  142. unsigned int size;
  143. };
  144. /* The argument to ARPT_SO_SET_REPLACE. */
  145. struct arpt_replace
  146. {
  147. /* Which table. */
  148. char name[ARPT_TABLE_MAXNAMELEN];
  149. /* Which hook entry points are valid: bitmask.  You can't
  150.            change this. */
  151. unsigned int valid_hooks;
  152. /* Number of entries */
  153. unsigned int num_entries;
  154. /* Total size of new entries */
  155. unsigned int size;
  156. /* Hook entry points. */
  157. unsigned int hook_entry[NF_ARP_NUMHOOKS];
  158. /* Underflow points. */
  159. unsigned int underflow[NF_ARP_NUMHOOKS];
  160. /* Information about old entries: */
  161. /* Number of counters (must be equal to current number of entries). */
  162. unsigned int num_counters;
  163. /* The old entries' counters. */
  164. struct arpt_counters __user *counters;
  165. /* The entries (hang off end: not really an array). */
  166. struct arpt_entry entries[0];
  167. };
  168. /* The argument to ARPT_SO_ADD_COUNTERS. */
  169. struct arpt_counters_info
  170. {
  171. /* Which table. */
  172. char name[ARPT_TABLE_MAXNAMELEN];
  173. unsigned int num_counters;
  174. /* The counters (actually `number' of these). */
  175. struct arpt_counters counters[0];
  176. };
  177. /* The argument to ARPT_SO_GET_ENTRIES. */
  178. struct arpt_get_entries
  179. {
  180. /* Which table: user fills this in. */
  181. char name[ARPT_TABLE_MAXNAMELEN];
  182. /* User fills this in: total entry size. */
  183. unsigned int size;
  184. /* The entries. */
  185. struct arpt_entry entrytable[0];
  186. };
  187. /* Standard return verdict, or do jump. */
  188. #define ARPT_STANDARD_TARGET ""
  189. /* Error verdict. */
  190. #define ARPT_ERROR_TARGET "ERROR"
  191. /* Helper functions */
  192. static __inline__ struct arpt_entry_target *arpt_get_target(struct arpt_entry *e)
  193. {
  194. return (void *)e + e->target_offset;
  195. }
  196. /* fn returns 0 to continue iteration */
  197. #define ARPT_ENTRY_ITERATE(entries, size, fn, args...)
  198. ({
  199. unsigned int __i;
  200. int __ret = 0;
  201. struct arpt_entry *__entry;
  202. for (__i = 0; __i < (size); __i += __entry->next_offset) { 
  203. __entry = (void *)(entries) + __i;
  204. __ret = fn(__entry , ## args);
  205. if (__ret != 0)
  206. break;
  207. }
  208. __ret;
  209. })
  210. /*
  211.  * Main firewall chains definitions and global var's definitions.
  212.  */
  213. #ifdef __KERNEL__
  214. /* Registration hooks for targets. */
  215. struct arpt_target
  216. {
  217. struct list_head list;
  218. const char name[ARPT_FUNCTION_MAXNAMELEN];
  219. /* Returns verdict. */
  220. unsigned int (*target)(struct sk_buff **pskb,
  221.        unsigned int hooknum,
  222.        const struct net_device *in,
  223.        const struct net_device *out,
  224.        const void *targinfo,
  225.        void *userdata);
  226. /* Called when user tries to insert an entry of this type:
  227.            hook_mask is a bitmask of hooks from which it can be
  228.            called. */
  229. /* Should return true or false. */
  230. int (*checkentry)(const char *tablename,
  231.   const struct arpt_entry *e,
  232.   void *targinfo,
  233.   unsigned int targinfosize,
  234.   unsigned int hook_mask);
  235. /* Called when entry of this type deleted. */
  236. void (*destroy)(void *targinfo, unsigned int targinfosize);
  237. /* Set this to THIS_MODULE if you are a module, otherwise NULL */
  238. struct module *me;
  239. };
  240. extern int arpt_register_target(struct arpt_target *target);
  241. extern void arpt_unregister_target(struct arpt_target *target);
  242. /* Furniture shopping... */
  243. struct arpt_table
  244. {
  245. struct list_head list;
  246. /* A unique name... */
  247. char name[ARPT_TABLE_MAXNAMELEN];
  248. /* What hooks you will enter on */
  249. unsigned int valid_hooks;
  250. /* Lock for the curtain */
  251. rwlock_t lock;
  252. /* Man behind the curtain... */
  253. struct arpt_table_info *private;
  254. /* Set this to THIS_MODULE if you are a module, otherwise NULL */
  255. struct module *me;
  256. };
  257. extern int arpt_register_table(struct arpt_table *table,
  258.        const struct arpt_replace *repl);
  259. extern void arpt_unregister_table(struct arpt_table *table);
  260. extern unsigned int arpt_do_table(struct sk_buff **pskb,
  261.   unsigned int hook,
  262.   const struct net_device *in,
  263.   const struct net_device *out,
  264.   struct arpt_table *table,
  265.   void *userdata);
  266. #define ARPT_ALIGN(s) (((s) + (__alignof__(struct arpt_entry)-1)) & ~(__alignof__(struct arpt_entry)-1))
  267. #endif /*__KERNEL__*/
  268. #endif /* _ARPTABLES_H */