filter.h 3.6 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6
/*
 * Linux Socket Filter Data Structures
 */
#ifndef __LINUX_FILTER_H__
#define __LINUX_FILTER_H__

A
Arun Sharma 已提交
7
#include <linux/atomic.h>
8
#include <linux/compat.h>
9
#include <linux/workqueue.h>
10
#include <uapi/linux/filter.h>
11

12 13 14 15 16 17 18 19 20 21
#ifdef CONFIG_COMPAT
/*
 * A struct sock_filter is architecture independent.
 */
struct compat_sock_fprog {
	u16		len;
	compat_uptr_t	filter;		/* struct sock_filter * */
};
#endif

22 23 24
struct sk_buff;
struct sock;

25 26 27
struct sk_filter
{
	atomic_t		refcnt;
28 29
	u32			jited:1,	/* Is our filter JIT'ed? */
				len:31;		/* Number of filter blocks */
30
	struct rcu_head		rcu;
31 32
	unsigned int		(*bpf_func)(const struct sk_buff *skb,
					    const struct sock_filter *filter);
33 34 35 36
	union {
		struct sock_filter     	insns[0];
		struct work_struct	work;
	};
37 38
};

39
static inline unsigned int sk_filter_size(unsigned int proglen)
40
{
41 42
	return max(sizeof(struct sk_filter),
		   offsetof(struct sk_filter, insns[proglen]));
43 44
}

S
Stephen Hemminger 已提交
45
extern int sk_filter(struct sock *sk, struct sk_buff *skb);
E
Eric Dumazet 已提交
46
extern unsigned int sk_run_filter(const struct sk_buff *skb,
E
Eric Dumazet 已提交
47
				  const struct sock_filter *filter);
48 49 50
extern int sk_unattached_filter_create(struct sk_filter **pfp,
				       struct sock_fprog *fprog);
extern void sk_unattached_filter_destroy(struct sk_filter *fp);
L
Linus Torvalds 已提交
51
extern int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk);
52
extern int sk_detach_filter(struct sock *sk);
53
extern int sk_chk_filter(struct sock_filter *filter, unsigned int flen);
54
extern int sk_get_filter(struct sock *sk, struct sock_filter __user *filter, unsigned len);
55
extern void sk_decode_filter(struct sock_filter *filt, struct sock_filter *to);
56 57

#ifdef CONFIG_BPF_JIT
X
Xi Wang 已提交
58
#include <stdarg.h>
59 60 61
#include <linux/linkage.h>
#include <linux/printk.h>

62 63
extern void bpf_jit_compile(struct sk_filter *fp);
extern void bpf_jit_free(struct sk_filter *fp);
64 65 66 67

static inline void bpf_jit_dump(unsigned int flen, unsigned int proglen,
				u32 pass, void *image)
{
68
	pr_err("flen=%u proglen=%u pass=%u image=%pK\n",
69 70
	       flen, proglen, pass, image);
	if (image)
71
		print_hex_dump(KERN_ERR, "JIT code: ", DUMP_PREFIX_OFFSET,
72 73
			       16, 1, image, proglen, false);
}
74 75
#define SK_RUN_FILTER(FILTER, SKB) (*FILTER->bpf_func)(SKB, FILTER->insns)
#else
76
#include <linux/slab.h>
77 78 79 80 81
static inline void bpf_jit_compile(struct sk_filter *fp)
{
}
static inline void bpf_jit_free(struct sk_filter *fp)
{
82
	kfree(fp);
83 84 85 86
}
#define SK_RUN_FILTER(FILTER, SKB) sk_run_filter(SKB, FILTER->insns)
#endif

87 88
static inline int bpf_tell_extensions(void)
{
89
	return SKF_AD_MAX;
90 91
}

92 93 94 95 96 97 98 99 100 101
enum {
	BPF_S_RET_K = 1,
	BPF_S_RET_A,
	BPF_S_ALU_ADD_K,
	BPF_S_ALU_ADD_X,
	BPF_S_ALU_SUB_K,
	BPF_S_ALU_SUB_X,
	BPF_S_ALU_MUL_K,
	BPF_S_ALU_MUL_X,
	BPF_S_ALU_DIV_X,
E
Eric Dumazet 已提交
102 103
	BPF_S_ALU_MOD_K,
	BPF_S_ALU_MOD_X,
104 105 106 107
	BPF_S_ALU_AND_K,
	BPF_S_ALU_AND_X,
	BPF_S_ALU_OR_K,
	BPF_S_ALU_OR_X,
108 109
	BPF_S_ALU_XOR_K,
	BPF_S_ALU_XOR_X,
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
	BPF_S_ALU_LSH_K,
	BPF_S_ALU_LSH_X,
	BPF_S_ALU_RSH_K,
	BPF_S_ALU_RSH_X,
	BPF_S_ALU_NEG,
	BPF_S_LD_W_ABS,
	BPF_S_LD_H_ABS,
	BPF_S_LD_B_ABS,
	BPF_S_LD_W_LEN,
	BPF_S_LD_W_IND,
	BPF_S_LD_H_IND,
	BPF_S_LD_B_IND,
	BPF_S_LD_IMM,
	BPF_S_LDX_W_LEN,
	BPF_S_LDX_B_MSH,
	BPF_S_LDX_IMM,
	BPF_S_MISC_TAX,
	BPF_S_MISC_TXA,
	BPF_S_ALU_DIV_K,
	BPF_S_LD_MEM,
	BPF_S_LDX_MEM,
	BPF_S_ST,
	BPF_S_STX,
	BPF_S_JMP_JA,
	BPF_S_JMP_JEQ_K,
	BPF_S_JMP_JEQ_X,
	BPF_S_JMP_JGE_K,
	BPF_S_JMP_JGE_X,
	BPF_S_JMP_JGT_K,
	BPF_S_JMP_JGT_X,
	BPF_S_JMP_JSET_K,
	BPF_S_JMP_JSET_X,
	/* Ancillary data */
	BPF_S_ANC_PROTOCOL,
	BPF_S_ANC_PKTTYPE,
	BPF_S_ANC_IFINDEX,
	BPF_S_ANC_NLATTR,
	BPF_S_ANC_NLATTR_NEST,
	BPF_S_ANC_MARK,
	BPF_S_ANC_QUEUE,
	BPF_S_ANC_HATYPE,
	BPF_S_ANC_RXHASH,
	BPF_S_ANC_CPU,
J
Jiri Pirko 已提交
153
	BPF_S_ANC_ALU_XOR_X,
154
	BPF_S_ANC_SECCOMP_LD_W,
E
Eric Dumazet 已提交
155 156
	BPF_S_ANC_VLAN_TAG,
	BPF_S_ANC_VLAN_TAG_PRESENT,
157
	BPF_S_ANC_PAY_OFFSET,
158 159
};

L
Linus Torvalds 已提交
160
#endif /* __LINUX_FILTER_H__ */