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