Blame view

include/linux/netfilter_bridge.h 2.84 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
  #ifndef __LINUX_BRIDGE_NETFILTER_H
  #define __LINUX_BRIDGE_NETFILTER_H
  
  /* bridge-specific defines for netfilter. 
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
  #include <linux/netfilter.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
  #include <linux/if_ether.h>
9bcfcaf5e   Stephen Hemminger   [NETFILTER] bridg...
8
  #include <linux/if_vlan.h>
516299d2f   Michael Milner   [NETFILTER]: brid...
9
  #include <linux/if_pppox.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
  
  /* Bridge Hooks */
  /* After promisc drops, checksum checks. */
  #define NF_BR_PRE_ROUTING	0
  /* If the packet is destined for this box. */
  #define NF_BR_LOCAL_IN		1
  /* If the packet is destined for another interface. */
  #define NF_BR_FORWARD		2
  /* Packets coming from a local process. */
  #define NF_BR_LOCAL_OUT		3
  /* Packets about to hit the wire. */
  #define NF_BR_POST_ROUTING	4
  /* Not really a hook, but used for the ebtables broute table */
  #define NF_BR_BROUTING		5
  #define NF_BR_NUMHOOKS		6
  
  #ifdef __KERNEL__
  
  enum nf_br_hook_priorities {
  	NF_BR_PRI_FIRST = INT_MIN,
  	NF_BR_PRI_NAT_DST_BRIDGED = -300,
  	NF_BR_PRI_FILTER_BRIDGED = -200,
  	NF_BR_PRI_BRNF = 0,
  	NF_BR_PRI_NAT_DST_OTHER = 100,
  	NF_BR_PRI_FILTER_OTHER = 200,
  	NF_BR_PRI_NAT_SRC = 300,
  	NF_BR_PRI_LAST = INT_MAX,
  };
  
  #ifdef CONFIG_BRIDGE_NETFILTER
  
  #define BRNF_PKT_TYPE			0x01
  #define BRNF_BRIDGED_DNAT		0x02
ea2d9b41b   Bart De Schuymer   netfilter: bridge...
43
44
  #define BRNF_BRIDGED			0x04
  #define BRNF_NF_BRIDGE_PREROUTING	0x08
e179e6322   Bart De Schuymer   netfilter: bridge...
45
46
  #define BRNF_8021Q			0x10
  #define BRNF_PPPoE			0x20
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
48
  
  /* Only used in br_forward.c */
07317621d   Stephen Hemminger   [NETFILTER] bridg...
49
50
  extern int nf_bridge_copy_header(struct sk_buff *skb);
  static inline int nf_bridge_maybe_copy_header(struct sk_buff *skb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
  {
4a9ecd596   Patrick McHardy   [NETFILTER]: brid...
52
53
  	if (skb->nf_bridge &&
  	    skb->nf_bridge->mask & (BRNF_BRIDGED | BRNF_BRIDGED_DNAT))
07317621d   Stephen Hemminger   [NETFILTER] bridg...
54
55
  		return nf_bridge_copy_header(skb);
    	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
  }
fc38582db   Patrick McHardy   [NETFILTER]: brid...
57
58
59
  static inline unsigned int nf_bridge_encap_header_len(const struct sk_buff *skb)
  {
  	switch (skb->protocol) {
f3a7c66b5   Harvey Harrison   net: replace __co...
60
  	case __cpu_to_be16(ETH_P_8021Q):
fc38582db   Patrick McHardy   [NETFILTER]: brid...
61
  		return VLAN_HLEN;
f3a7c66b5   Harvey Harrison   net: replace __co...
62
  	case __cpu_to_be16(ETH_P_PPP_SES):
fc38582db   Patrick McHardy   [NETFILTER]: brid...
63
64
65
66
67
  		return PPPOE_SES_HLEN;
  	default:
  		return 0;
  	}
  }
6c79bf0f2   Bart De Schuymer   netfilter: bridge...
68
69
70
71
72
73
  static inline unsigned int nf_bridge_mtu_reduction(const struct sk_buff *skb)
  {
  	if (unlikely(skb->nf_bridge->mask & BRNF_PPPoE))
  		return PPPOE_SES_HLEN;
  	return 0;
  }
ea2d9b41b   Bart De Schuymer   netfilter: bridge...
74
75
76
77
78
79
80
81
  extern int br_handle_frame_finish(struct sk_buff *skb);
  /* Only used in br_device.c */
  static inline int br_nf_pre_routing_finish_bridge_slow(struct sk_buff *skb)
  {
  	struct nf_bridge_info *nf_bridge = skb->nf_bridge;
  
  	skb_pull(skb, ETH_HLEN);
  	nf_bridge->mask ^= BRNF_BRIDGED_DNAT;
e179e6322   Bart De Schuymer   netfilter: bridge...
82
83
  	skb_copy_to_linear_data_offset(skb, -(ETH_HLEN-ETH_ALEN),
  				       skb->nf_bridge->data, ETH_HLEN-ETH_ALEN);
ea2d9b41b   Bart De Schuymer   netfilter: bridge...
84
85
86
  	skb->dev = nf_bridge->physindev;
  	return br_handle_frame_finish(skb);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87
88
  /* This is called by the IP fragmenting code and it ensures there is
   * enough room for the encapsulating header (if there is one). */
fc38582db   Patrick McHardy   [NETFILTER]: brid...
89
  static inline unsigned int nf_bridge_pad(const struct sk_buff *skb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
90
  {
fc38582db   Patrick McHardy   [NETFILTER]: brid...
91
92
93
  	if (skb->nf_bridge)
  		return nf_bridge_encap_header_len(skb);
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
94
95
96
97
  }
  
  struct bridge_skb_cb {
  	union {
47c183fa5   Al Viro   [BRIDGE]: Annotat...
98
  		__be32 ipv4;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
100
  	} daddr;
  };
10ea6ac89   Patrick McHardy   [NETFILTER]: brid...
101

07317621d   Stephen Hemminger   [NETFILTER] bridg...
102
103
  #else
  #define nf_bridge_maybe_copy_header(skb)	(0)
9bcfcaf5e   Stephen Hemminger   [NETFILTER] bridg...
104
  #define nf_bridge_pad(skb)			(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
106
107
108
  #endif /* CONFIG_BRIDGE_NETFILTER */
  
  #endif /* __KERNEL__ */
  #endif