blob: dfb4d9e52bcb3a1775eebd627d1d758aaaed6c4b [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001#ifndef __LINUX_BRIDGE_NETFILTER_H
2#define __LINUX_BRIDGE_NETFILTER_H
3
David Howells607ca462012-10-13 10:46:48 +01004#include <uapi/linux/netfilter_bridge.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -07005
Linus Torvalds1da177e2005-04-16 15:20:36 -07006
7enum nf_br_hook_priorities {
8 NF_BR_PRI_FIRST = INT_MIN,
9 NF_BR_PRI_NAT_DST_BRIDGED = -300,
10 NF_BR_PRI_FILTER_BRIDGED = -200,
11 NF_BR_PRI_BRNF = 0,
12 NF_BR_PRI_NAT_DST_OTHER = 100,
13 NF_BR_PRI_FILTER_OTHER = 200,
14 NF_BR_PRI_NAT_SRC = 300,
15 NF_BR_PRI_LAST = INT_MAX,
16};
17
18#ifdef CONFIG_BRIDGE_NETFILTER
19
20#define BRNF_PKT_TYPE 0x01
21#define BRNF_BRIDGED_DNAT 0x02
Bart De Schuymerea2d9b42010-04-15 12:14:51 +020022#define BRNF_BRIDGED 0x04
23#define BRNF_NF_BRIDGE_PREROUTING 0x08
Bart De Schuymere179e632010-04-15 12:26:39 +020024#define BRNF_8021Q 0x10
25#define BRNF_PPPoE 0x20
Linus Torvalds1da177e2005-04-16 15:20:36 -070026
27/* Only used in br_forward.c */
Stephen Hemminger073176212006-08-29 17:48:17 -070028extern int nf_bridge_copy_header(struct sk_buff *skb);
29static inline int nf_bridge_maybe_copy_header(struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070030{
Patrick McHardy4a9ecd52007-12-13 09:32:04 -080031 if (skb->nf_bridge &&
32 skb->nf_bridge->mask & (BRNF_BRIDGED | BRNF_BRIDGED_DNAT))
Stephen Hemminger073176212006-08-29 17:48:17 -070033 return nf_bridge_copy_header(skb);
34 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -070035}
36
Patrick McHardyfc385822007-05-03 03:36:16 -070037static inline unsigned int nf_bridge_encap_header_len(const struct sk_buff *skb)
38{
39 switch (skb->protocol) {
Harvey Harrisonf3a7c662009-02-14 22:58:35 -080040 case __cpu_to_be16(ETH_P_8021Q):
Patrick McHardyfc385822007-05-03 03:36:16 -070041 return VLAN_HLEN;
Harvey Harrisonf3a7c662009-02-14 22:58:35 -080042 case __cpu_to_be16(ETH_P_PPP_SES):
Patrick McHardyfc385822007-05-03 03:36:16 -070043 return PPPOE_SES_HLEN;
44 default:
45 return 0;
46 }
47}
48
Bart De Schuymer6c79bf02010-04-20 16:22:01 +020049static inline unsigned int nf_bridge_mtu_reduction(const struct sk_buff *skb)
50{
51 if (unlikely(skb->nf_bridge->mask & BRNF_PPPoE))
52 return PPPOE_SES_HLEN;
53 return 0;
54}
55
Bart De Schuymerea2d9b42010-04-15 12:14:51 +020056extern int br_handle_frame_finish(struct sk_buff *skb);
57/* Only used in br_device.c */
58static inline int br_nf_pre_routing_finish_bridge_slow(struct sk_buff *skb)
59{
60 struct nf_bridge_info *nf_bridge = skb->nf_bridge;
61
62 skb_pull(skb, ETH_HLEN);
63 nf_bridge->mask ^= BRNF_BRIDGED_DNAT;
Bart De Schuymere179e632010-04-15 12:26:39 +020064 skb_copy_to_linear_data_offset(skb, -(ETH_HLEN-ETH_ALEN),
65 skb->nf_bridge->data, ETH_HLEN-ETH_ALEN);
Bart De Schuymerea2d9b42010-04-15 12:14:51 +020066 skb->dev = nf_bridge->physindev;
67 return br_handle_frame_finish(skb);
68}
69
Linus Torvalds1da177e2005-04-16 15:20:36 -070070/* This is called by the IP fragmenting code and it ensures there is
71 * enough room for the encapsulating header (if there is one). */
Patrick McHardyfc385822007-05-03 03:36:16 -070072static inline unsigned int nf_bridge_pad(const struct sk_buff *skb)
Linus Torvalds1da177e2005-04-16 15:20:36 -070073{
Patrick McHardyfc385822007-05-03 03:36:16 -070074 if (skb->nf_bridge)
75 return nf_bridge_encap_header_len(skb);
76 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -070077}
78
79struct bridge_skb_cb {
80 union {
Al Viro47c183fa2006-11-14 21:11:51 -080081 __be32 ipv4;
Linus Torvalds1da177e2005-04-16 15:20:36 -070082 } daddr;
83};
Patrick McHardy10ea6ac2006-07-24 22:54:55 -070084
Peter Huang (Peng)a881e962012-04-19 20:12:51 +000085static inline void br_drop_fake_rtable(struct sk_buff *skb)
86{
87 struct dst_entry *dst = skb_dst(skb);
88
89 if (dst && (dst->flags & DST_FAKE_RTABLE))
90 skb_dst_drop(skb);
91}
92
Stephen Hemminger073176212006-08-29 17:48:17 -070093#else
94#define nf_bridge_maybe_copy_header(skb) (0)
Stephen Hemminger9bcfcaf2006-08-29 17:48:57 -070095#define nf_bridge_pad(skb) (0)
Peter Huang (Peng)a881e962012-04-19 20:12:51 +000096#define br_drop_fake_rtable(skb) do { } while (0)
Linus Torvalds1da177e2005-04-16 15:20:36 -070097#endif /* CONFIG_BRIDGE_NETFILTER */
98
Linus Torvalds1da177e2005-04-16 15:20:36 -070099#endif