netfilter_ingress.h 1.44 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0 */
2 3 4 5 6 7 8
#ifndef _NETFILTER_INGRESS_H_
#define _NETFILTER_INGRESS_H_

#include <linux/netfilter.h>
#include <linux/netdevice.h>

#ifdef CONFIG_NETFILTER_INGRESS
9
static inline bool nf_hook_ingress_active(const struct sk_buff *skb)
10
{
11 12 13 14
#ifdef HAVE_JUMP_LABEL
	if (!static_key_false(&nf_hooks_needed[NFPROTO_NETDEV][NF_NETDEV_INGRESS]))
		return false;
#endif
15
	return rcu_access_pointer(skb->dev->nf_hooks_ingress);
16 17
}

18
/* caller must hold rcu_read_lock */
19 20
static inline int nf_hook_ingress(struct sk_buff *skb)
{
21
	struct nf_hook_entries *e = rcu_dereference(skb->dev->nf_hooks_ingress);
22
	struct nf_hook_state state;
23
	int ret;
24

25 26 27 28 29 30
	/* Must recheck the ingress hook head, in the event it became NULL
	 * after the check in nf_hook_ingress_active evaluated to true.
	 */
	if (unlikely(!e))
		return 0;

31
	nf_hook_state_init(&state, NF_NETDEV_INGRESS,
32 33
			   NFPROTO_NETDEV, skb->dev, NULL, NULL,
			   dev_net(skb->dev), NULL);
34
	ret = nf_hook_slow(skb, &state, e, 0);
35 36 37 38
	if (ret == 0)
		return -1;

	return ret;
39 40 41 42
}

static inline void nf_hook_ingress_init(struct net_device *dev)
{
43
	RCU_INIT_POINTER(dev->nf_hooks_ingress, NULL);
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
}
#else /* CONFIG_NETFILTER_INGRESS */
static inline int nf_hook_ingress_active(struct sk_buff *skb)
{
	return 0;
}

static inline int nf_hook_ingress(struct sk_buff *skb)
{
	return 0;
}

static inline void nf_hook_ingress_init(struct net_device *dev) {}
#endif /* CONFIG_NETFILTER_INGRESS */
#endif /* _NETFILTER_INGRESS_H_ */