Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * Linux Socket Filter Data Structures | |
3 | */ | |
1da177e4 LT |
4 | #ifndef __LINUX_FILTER_H__ |
5 | #define __LINUX_FILTER_H__ | |
6 | ||
60063497 | 7 | #include <linux/atomic.h> |
0c5fe1b4 | 8 | #include <linux/compat.h> |
d45ed4a4 | 9 | #include <linux/workqueue.h> |
607ca46e | 10 | #include <uapi/linux/filter.h> |
792d4b5c | 11 | |
0c5fe1b4 WD |
12 | #ifdef CONFIG_COMPAT |
13 | /* | |
14 | * A struct sock_filter is architecture independent. | |
15 | */ | |
16 | struct compat_sock_fprog { | |
17 | u16 len; | |
18 | compat_uptr_t filter; /* struct sock_filter * */ | |
19 | }; | |
20 | #endif | |
21 | ||
792d4b5c HC |
22 | struct sk_buff; |
23 | struct sock; | |
24 | ||
b715631f SH |
25 | struct sk_filter |
26 | { | |
27 | atomic_t refcnt; | |
f8bbbfc3 DB |
28 | u32 jited:1, /* Is our filter JIT'ed? */ |
29 | len:31; /* Number of filter blocks */ | |
d45ed4a4 | 30 | struct rcu_head rcu; |
0a14842f ED |
31 | unsigned int (*bpf_func)(const struct sk_buff *skb, |
32 | const struct sock_filter *filter); | |
d45ed4a4 AS |
33 | union { |
34 | struct sock_filter insns[0]; | |
35 | struct work_struct work; | |
36 | }; | |
b715631f SH |
37 | }; |
38 | ||
d45ed4a4 | 39 | static inline unsigned int sk_filter_size(unsigned int proglen) |
b715631f | 40 | { |
d45ed4a4 AS |
41 | return max(sizeof(struct sk_filter), |
42 | offsetof(struct sk_filter, insns[proglen])); | |
b715631f SH |
43 | } |
44 | ||
43db6d65 | 45 | extern int sk_filter(struct sock *sk, struct sk_buff *skb); |
62ab0812 | 46 | extern unsigned int sk_run_filter(const struct sk_buff *skb, |
93aaae2e | 47 | const struct sock_filter *filter); |
302d6637 JP |
48 | extern int sk_unattached_filter_create(struct sk_filter **pfp, |
49 | struct sock_fprog *fprog); | |
50 | extern void sk_unattached_filter_destroy(struct sk_filter *fp); | |
1da177e4 | 51 | extern int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk); |
55b33325 | 52 | extern int sk_detach_filter(struct sock *sk); |
4f25af27 | 53 | extern int sk_chk_filter(struct sock_filter *filter, unsigned int flen); |
a8fc9277 | 54 | extern int sk_get_filter(struct sock *sk, struct sock_filter __user *filter, unsigned len); |
ed13998c | 55 | extern void sk_decode_filter(struct sock_filter *filt, struct sock_filter *to); |
0a14842f ED |
56 | |
57 | #ifdef CONFIG_BPF_JIT | |
20074f35 | 58 | #include <stdarg.h> |
a691ce7f CG |
59 | #include <linux/linkage.h> |
60 | #include <linux/printk.h> | |
61 | ||
0a14842f ED |
62 | extern void bpf_jit_compile(struct sk_filter *fp); |
63 | extern void bpf_jit_free(struct sk_filter *fp); | |
79617801 DB |
64 | |
65 | static inline void bpf_jit_dump(unsigned int flen, unsigned int proglen, | |
66 | u32 pass, void *image) | |
67 | { | |
16495445 | 68 | pr_err("flen=%u proglen=%u pass=%u image=%pK\n", |
79617801 DB |
69 | flen, proglen, pass, image); |
70 | if (image) | |
16495445 | 71 | print_hex_dump(KERN_ERR, "JIT code: ", DUMP_PREFIX_OFFSET, |
79617801 DB |
72 | 16, 1, image, proglen, false); |
73 | } | |
0a14842f ED |
74 | #define SK_RUN_FILTER(FILTER, SKB) (*FILTER->bpf_func)(SKB, FILTER->insns) |
75 | #else | |
d45ed4a4 | 76 | #include <linux/slab.h> |
0a14842f ED |
77 | static inline void bpf_jit_compile(struct sk_filter *fp) |
78 | { | |
79 | } | |
80 | static inline void bpf_jit_free(struct sk_filter *fp) | |
81 | { | |
d45ed4a4 | 82 | kfree(fp); |
0a14842f ED |
83 | } |
84 | #define SK_RUN_FILTER(FILTER, SKB) sk_run_filter(SKB, FILTER->insns) | |
85 | #endif | |
86 | ||
ea02f941 MS |
87 | static inline int bpf_tell_extensions(void) |
88 | { | |
37692299 | 89 | return SKF_AD_MAX; |
ea02f941 MS |
90 | } |
91 | ||
0a14842f ED |
92 | enum { |
93 | BPF_S_RET_K = 1, | |
94 | BPF_S_RET_A, | |
95 | BPF_S_ALU_ADD_K, | |
96 | BPF_S_ALU_ADD_X, | |
97 | BPF_S_ALU_SUB_K, | |
98 | BPF_S_ALU_SUB_X, | |
99 | BPF_S_ALU_MUL_K, | |
100 | BPF_S_ALU_MUL_X, | |
101 | BPF_S_ALU_DIV_X, | |
b6069a95 ED |
102 | BPF_S_ALU_MOD_K, |
103 | BPF_S_ALU_MOD_X, | |
0a14842f ED |
104 | BPF_S_ALU_AND_K, |
105 | BPF_S_ALU_AND_X, | |
106 | BPF_S_ALU_OR_K, | |
107 | BPF_S_ALU_OR_X, | |
9e49e889 DB |
108 | BPF_S_ALU_XOR_K, |
109 | BPF_S_ALU_XOR_X, | |
0a14842f ED |
110 | BPF_S_ALU_LSH_K, |
111 | BPF_S_ALU_LSH_X, | |
112 | BPF_S_ALU_RSH_K, | |
113 | BPF_S_ALU_RSH_X, | |
114 | BPF_S_ALU_NEG, | |
115 | BPF_S_LD_W_ABS, | |
116 | BPF_S_LD_H_ABS, | |
117 | BPF_S_LD_B_ABS, | |
118 | BPF_S_LD_W_LEN, | |
119 | BPF_S_LD_W_IND, | |
120 | BPF_S_LD_H_IND, | |
121 | BPF_S_LD_B_IND, | |
122 | BPF_S_LD_IMM, | |
123 | BPF_S_LDX_W_LEN, | |
124 | BPF_S_LDX_B_MSH, | |
125 | BPF_S_LDX_IMM, | |
126 | BPF_S_MISC_TAX, | |
127 | BPF_S_MISC_TXA, | |
128 | BPF_S_ALU_DIV_K, | |
129 | BPF_S_LD_MEM, | |
130 | BPF_S_LDX_MEM, | |
131 | BPF_S_ST, | |
132 | BPF_S_STX, | |
133 | BPF_S_JMP_JA, | |
134 | BPF_S_JMP_JEQ_K, | |
135 | BPF_S_JMP_JEQ_X, | |
136 | BPF_S_JMP_JGE_K, | |
137 | BPF_S_JMP_JGE_X, | |
138 | BPF_S_JMP_JGT_K, | |
139 | BPF_S_JMP_JGT_X, | |
140 | BPF_S_JMP_JSET_K, | |
141 | BPF_S_JMP_JSET_X, | |
142 | /* Ancillary data */ | |
143 | BPF_S_ANC_PROTOCOL, | |
144 | BPF_S_ANC_PKTTYPE, | |
145 | BPF_S_ANC_IFINDEX, | |
146 | BPF_S_ANC_NLATTR, | |
147 | BPF_S_ANC_NLATTR_NEST, | |
148 | BPF_S_ANC_MARK, | |
149 | BPF_S_ANC_QUEUE, | |
150 | BPF_S_ANC_HATYPE, | |
151 | BPF_S_ANC_RXHASH, | |
152 | BPF_S_ANC_CPU, | |
ffe06c17 | 153 | BPF_S_ANC_ALU_XOR_X, |
46b325c7 | 154 | BPF_S_ANC_SECCOMP_LD_W, |
f3335031 ED |
155 | BPF_S_ANC_VLAN_TAG, |
156 | BPF_S_ANC_VLAN_TAG_PRESENT, | |
3e5289d5 | 157 | BPF_S_ANC_PAY_OFFSET, |
0a14842f ED |
158 | }; |
159 | ||
1da177e4 | 160 | #endif /* __LINUX_FILTER_H__ */ |