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

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef __LINUX_BRIDGE_NETFILTER_H
  2. #define __LINUX_BRIDGE_NETFILTER_H
  3. /* bridge-specific defines for netfilter. 
  4.  */
  5. #include <linux/config.h>
  6. #include <linux/netfilter.h>
  7. #if defined(__KERNEL__) && defined(CONFIG_BRIDGE_NETFILTER)
  8. #include <asm/atomic.h>
  9. #include <linux/if_ether.h>
  10. #endif
  11. /* Bridge Hooks */
  12. /* After promisc drops, checksum checks. */
  13. #define NF_BR_PRE_ROUTING 0
  14. /* If the packet is destined for this box. */
  15. #define NF_BR_LOCAL_IN 1
  16. /* If the packet is destined for another interface. */
  17. #define NF_BR_FORWARD 2
  18. /* Packets coming from a local process. */
  19. #define NF_BR_LOCAL_OUT 3
  20. /* Packets about to hit the wire. */
  21. #define NF_BR_POST_ROUTING 4
  22. /* Not really a hook, but used for the ebtables broute table */
  23. #define NF_BR_BROUTING 5
  24. #define NF_BR_NUMHOOKS 6
  25. #ifdef __KERNEL__
  26. enum nf_br_hook_priorities {
  27. NF_BR_PRI_FIRST = INT_MIN,
  28. NF_BR_PRI_NAT_DST_BRIDGED = -300,
  29. NF_BR_PRI_FILTER_BRIDGED = -200,
  30. NF_BR_PRI_BRNF = 0,
  31. NF_BR_PRI_NAT_DST_OTHER = 100,
  32. NF_BR_PRI_FILTER_OTHER = 200,
  33. NF_BR_PRI_NAT_SRC = 300,
  34. NF_BR_PRI_LAST = INT_MAX,
  35. };
  36. #ifdef CONFIG_BRIDGE_NETFILTER
  37. #define BRNF_PKT_TYPE 0x01
  38. #define BRNF_BRIDGED_DNAT 0x02
  39. #define BRNF_DONT_TAKE_PARENT 0x04
  40. #define BRNF_BRIDGED 0x08
  41. #define BRNF_NF_BRIDGE_PREROUTING 0x10
  42. static inline
  43. struct nf_bridge_info *nf_bridge_alloc(struct sk_buff *skb)
  44. {
  45. struct nf_bridge_info **nf_bridge = &(skb->nf_bridge);
  46. if ((*nf_bridge = kmalloc(sizeof(**nf_bridge), GFP_ATOMIC)) != NULL) {
  47. atomic_set(&(*nf_bridge)->use, 1);
  48. (*nf_bridge)->mask = 0;
  49. (*nf_bridge)->physindev = (*nf_bridge)->physoutdev = NULL;
  50. #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
  51. (*nf_bridge)->netoutdev = NULL;
  52. #endif
  53. }
  54. return *nf_bridge;
  55. }
  56. /* Only used in br_forward.c */
  57. static inline
  58. void nf_bridge_maybe_copy_header(struct sk_buff *skb)
  59. {
  60. if (skb->nf_bridge) {
  61. if (skb->protocol == __constant_htons(ETH_P_8021Q)) {
  62. memcpy(skb->data - 18, skb->nf_bridge->data, 18);
  63. skb_push(skb, 4);
  64. } else
  65. memcpy(skb->data - 16, skb->nf_bridge->data, 16);
  66. }
  67. }
  68. static inline
  69. void nf_bridge_save_header(struct sk_buff *skb)
  70. {
  71.         int header_size = 16;
  72. if (skb->protocol == __constant_htons(ETH_P_8021Q))
  73. header_size = 18;
  74. memcpy(skb->nf_bridge->data, skb->data - header_size, header_size);
  75. }
  76. /* This is called by the IP fragmenting code and it ensures there is
  77.  * enough room for the encapsulating header (if there is one). */
  78. static inline
  79. int nf_bridge_pad(struct sk_buff *skb)
  80. {
  81. if (skb->protocol == __constant_htons(ETH_P_IP))
  82. return 0;
  83. if (skb->nf_bridge) {
  84. if (skb->protocol == __constant_htons(ETH_P_8021Q))
  85. return 4;
  86. }
  87. return 0;
  88. }
  89. struct bridge_skb_cb {
  90. union {
  91. __u32 ipv4;
  92. } daddr;
  93. };
  94. #endif /* CONFIG_BRIDGE_NETFILTER */
  95. #endif /* __KERNEL__ */
  96. #endif