blob: 0b0c35c37125eb8c15ba42e9413ba8206447a2c6 [file] [log] [blame]
Pablo Neira Ayuso4b7fd5d2014-10-02 11:13:21 +02001#ifndef _BR_NETFILTER_H_
2#define _BR_NETFILTER_H_
3
Pablo Neira Ayuso230ac492015-06-16 14:07:03 +02004#include "../../../net/bridge/br_private.h"
5
6static inline struct nf_bridge_info *nf_bridge_alloc(struct sk_buff *skb)
7{
8 skb->nf_bridge = kzalloc(sizeof(struct nf_bridge_info), GFP_ATOMIC);
9
10 if (likely(skb->nf_bridge))
11 atomic_set(&(skb->nf_bridge->use), 1);
12
13 return skb->nf_bridge;
14}
15
16void nf_bridge_update_protocol(struct sk_buff *skb);
17
Florian Westphalc5136b12016-09-21 11:35:01 -040018int br_nf_hook_thresh(unsigned int hook, struct net *net, struct sock *sk,
19 struct sk_buff *skb, struct net_device *indev,
20 struct net_device *outdev,
21 int (*okfn)(struct net *, struct sock *,
22 struct sk_buff *));
23
Pablo Neira Ayuso230ac492015-06-16 14:07:03 +020024static inline struct nf_bridge_info *
25nf_bridge_info_get(const struct sk_buff *skb)
26{
27 return skb->nf_bridge;
28}
29
30unsigned int nf_bridge_encap_header_len(const struct sk_buff *skb);
31
32static inline void nf_bridge_push_encap_header(struct sk_buff *skb)
33{
34 unsigned int len = nf_bridge_encap_header_len(skb);
35
36 skb_push(skb, len);
37 skb->network_header -= len;
38}
39
Eric W. Biederman0c4b51f2015-09-15 20:04:18 -050040int br_nf_pre_routing_finish_bridge(struct net *net, struct sock *sk, struct sk_buff *skb);
Pablo Neira Ayuso230ac492015-06-16 14:07:03 +020041
42static inline struct rtable *bridge_parent_rtable(const struct net_device *dev)
43{
44 struct net_bridge_port *port;
45
46 port = br_port_get_rcu(dev);
47 return port ? &port->br->fake_rtable : NULL;
48}
49
50struct net_device *setup_pre_routing(struct sk_buff *skb);
Pablo Neira Ayuso4b7fd5d2014-10-02 11:13:21 +020051void br_netfilter_enable(void);
52
Pablo Neira Ayuso230ac492015-06-16 14:07:03 +020053#if IS_ENABLED(CONFIG_IPV6)
Eric W. Biedermanc1444c62015-09-25 16:52:51 -050054int br_validate_ipv6(struct net *net, struct sk_buff *skb);
Eric W. Biederman06198b32015-09-18 14:33:06 -050055unsigned int br_nf_pre_routing_ipv6(void *priv,
Pablo Neira Ayuso230ac492015-06-16 14:07:03 +020056 struct sk_buff *skb,
57 const struct nf_hook_state *state);
58#else
Eric W. Biedermanc1444c62015-09-25 16:52:51 -050059static inline int br_validate_ipv6(struct net *net, struct sk_buff *skb)
Pablo Neira Ayuso230ac492015-06-16 14:07:03 +020060{
61 return -1;
62}
63
64static inline unsigned int
65br_nf_pre_routing_ipv6(const struct nf_hook_ops *ops, struct sk_buff *skb,
66 const struct nf_hook_state *state)
67{
Bernhard Thaler18e1db62015-08-13 08:58:15 +020068 return NF_ACCEPT;
Pablo Neira Ayuso230ac492015-06-16 14:07:03 +020069}
70#endif
71
Pablo Neira Ayuso4b7fd5d2014-10-02 11:13:21 +020072#endif /* _BR_NETFILTER_H_ */