diff options
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/filter.h | 108 |
1 files changed, 38 insertions, 70 deletions
diff --git a/include/linux/filter.h b/include/linux/filter.h index 625f4de9bdf2..49ef7a298c92 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h | |||
| @@ -197,7 +197,6 @@ int sk_detach_filter(struct sock *sk); | |||
| 197 | int sk_chk_filter(struct sock_filter *filter, unsigned int flen); | 197 | int sk_chk_filter(struct sock_filter *filter, unsigned int flen); |
| 198 | int sk_get_filter(struct sock *sk, struct sock_filter __user *filter, | 198 | int sk_get_filter(struct sock *sk, struct sock_filter __user *filter, |
| 199 | unsigned int len); | 199 | unsigned int len); |
| 200 | void sk_decode_filter(struct sock_filter *filt, struct sock_filter *to); | ||
| 201 | 200 | ||
| 202 | void sk_filter_charge(struct sock *sk, struct sk_filter *fp); | 201 | void sk_filter_charge(struct sock *sk, struct sk_filter *fp); |
| 203 | void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp); | 202 | void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp); |
| @@ -205,6 +204,41 @@ void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp); | |||
| 205 | u64 __bpf_call_base(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5); | 204 | u64 __bpf_call_base(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5); |
| 206 | void bpf_int_jit_compile(struct sk_filter *fp); | 205 | void bpf_int_jit_compile(struct sk_filter *fp); |
| 207 | 206 | ||
| 207 | #define BPF_ANC BIT(15) | ||
| 208 | |||
| 209 | static inline u16 bpf_anc_helper(const struct sock_filter *ftest) | ||
| 210 | { | ||
| 211 | BUG_ON(ftest->code & BPF_ANC); | ||
| 212 | |||
| 213 | switch (ftest->code) { | ||
| 214 | case BPF_LD | BPF_W | BPF_ABS: | ||
| 215 | case BPF_LD | BPF_H | BPF_ABS: | ||
| 216 | case BPF_LD | BPF_B | BPF_ABS: | ||
| 217 | #define BPF_ANCILLARY(CODE) case SKF_AD_OFF + SKF_AD_##CODE: \ | ||
| 218 | return BPF_ANC | SKF_AD_##CODE | ||
| 219 | switch (ftest->k) { | ||
| 220 | BPF_ANCILLARY(PROTOCOL); | ||
| 221 | BPF_ANCILLARY(PKTTYPE); | ||
| 222 | BPF_ANCILLARY(IFINDEX); | ||
| 223 | BPF_ANCILLARY(NLATTR); | ||
| 224 | BPF_ANCILLARY(NLATTR_NEST); | ||
| 225 | BPF_ANCILLARY(MARK); | ||
| 226 | BPF_ANCILLARY(QUEUE); | ||
| 227 | BPF_ANCILLARY(HATYPE); | ||
| 228 | BPF_ANCILLARY(RXHASH); | ||
| 229 | BPF_ANCILLARY(CPU); | ||
| 230 | BPF_ANCILLARY(ALU_XOR_X); | ||
| 231 | BPF_ANCILLARY(VLAN_TAG); | ||
| 232 | BPF_ANCILLARY(VLAN_TAG_PRESENT); | ||
| 233 | BPF_ANCILLARY(PAY_OFFSET); | ||
| 234 | BPF_ANCILLARY(RANDOM); | ||
| 235 | } | ||
| 236 | /* Fallthrough. */ | ||
| 237 | default: | ||
| 238 | return ftest->code; | ||
| 239 | } | ||
| 240 | } | ||
| 241 | |||
| 208 | #ifdef CONFIG_BPF_JIT | 242 | #ifdef CONFIG_BPF_JIT |
| 209 | #include <stdarg.h> | 243 | #include <stdarg.h> |
| 210 | #include <linux/linkage.h> | 244 | #include <linux/linkage.h> |
| @@ -224,86 +258,20 @@ static inline void bpf_jit_dump(unsigned int flen, unsigned int proglen, | |||
| 224 | } | 258 | } |
| 225 | #else | 259 | #else |
| 226 | #include <linux/slab.h> | 260 | #include <linux/slab.h> |
| 261 | |||
| 227 | static inline void bpf_jit_compile(struct sk_filter *fp) | 262 | static inline void bpf_jit_compile(struct sk_filter *fp) |
| 228 | { | 263 | { |
| 229 | } | 264 | } |
| 265 | |||
| 230 | static inline void bpf_jit_free(struct sk_filter *fp) | 266 | static inline void bpf_jit_free(struct sk_filter *fp) |
| 231 | { | 267 | { |
| 232 | kfree(fp); | 268 | kfree(fp); |
| 233 | } | 269 | } |
| 234 | #endif | 270 | #endif /* CONFIG_BPF_JIT */ |
| 235 | 271 | ||
| 236 | static inline int bpf_tell_extensions(void) | 272 | static inline int bpf_tell_extensions(void) |
| 237 | { | 273 | { |
| 238 | return SKF_AD_MAX; | 274 | return SKF_AD_MAX; |
| 239 | } | 275 | } |
| 240 | 276 | ||
| 241 | enum { | ||
| 242 | BPF_S_RET_K = 1, | ||
| 243 | BPF_S_RET_A, | ||
| 244 | BPF_S_ALU_ADD_K, | ||
| 245 | BPF_S_ALU_ADD_X, | ||
| 246 | BPF_S_ALU_SUB_K, | ||
| 247 | BPF_S_ALU_SUB_X, | ||
| 248 | BPF_S_ALU_MUL_K, | ||
| 249 | BPF_S_ALU_MUL_X, | ||
| 250 | BPF_S_ALU_DIV_X, | ||
| 251 | BPF_S_ALU_MOD_K, | ||
| 252 | BPF_S_ALU_MOD_X, | ||
| 253 | BPF_S_ALU_AND_K, | ||
| 254 | BPF_S_ALU_AND_X, | ||
| 255 | BPF_S_ALU_OR_K, | ||
| 256 | BPF_S_ALU_OR_X, | ||
| 257 | BPF_S_ALU_XOR_K, | ||
| 258 | BPF_S_ALU_XOR_X, | ||
| 259 | BPF_S_ALU_LSH_K, | ||
| 260 | BPF_S_ALU_LSH_X, | ||
| 261 | BPF_S_ALU_RSH_K, | ||
| 262 | BPF_S_ALU_RSH_X, | ||
| 263 | BPF_S_ALU_NEG, | ||
| 264 | BPF_S_LD_W_ABS, | ||
| 265 | BPF_S_LD_H_ABS, | ||
| 266 | BPF_S_LD_B_ABS, | ||
| 267 | BPF_S_LD_W_LEN, | ||
| 268 | BPF_S_LD_W_IND, | ||
| 269 | BPF_S_LD_H_IND, | ||
| 270 | BPF_S_LD_B_IND, | ||
| 271 | BPF_S_LD_IMM, | ||
| 272 | BPF_S_LDX_W_LEN, | ||
| 273 | BPF_S_LDX_B_MSH, | ||
| 274 | BPF_S_LDX_IMM, | ||
| 275 | BPF_S_MISC_TAX, | ||
| 276 | BPF_S_MISC_TXA, | ||
| 277 | BPF_S_ALU_DIV_K, | ||
| 278 | BPF_S_LD_MEM, | ||
| 279 | BPF_S_LDX_MEM, | ||
| 280 | BPF_S_ST, | ||
| 281 | BPF_S_STX, | ||
| 282 | BPF_S_JMP_JA, | ||
| 283 | BPF_S_JMP_JEQ_K, | ||
| 284 | BPF_S_JMP_JEQ_X, | ||
| 285 | BPF_S_JMP_JGE_K, | ||
| 286 | BPF_S_JMP_JGE_X, | ||
| 287 | BPF_S_JMP_JGT_K, | ||
| 288 | BPF_S_JMP_JGT_X, | ||
| 289 | BPF_S_JMP_JSET_K, | ||
| 290 | BPF_S_JMP_JSET_X, | ||
| 291 | /* Ancillary data */ | ||
| 292 | BPF_S_ANC_PROTOCOL, | ||
| 293 | BPF_S_ANC_PKTTYPE, | ||
| 294 | BPF_S_ANC_IFINDEX, | ||
| 295 | BPF_S_ANC_NLATTR, | ||
| 296 | BPF_S_ANC_NLATTR_NEST, | ||
| 297 | BPF_S_ANC_MARK, | ||
| 298 | BPF_S_ANC_QUEUE, | ||
| 299 | BPF_S_ANC_HATYPE, | ||
| 300 | BPF_S_ANC_RXHASH, | ||
| 301 | BPF_S_ANC_CPU, | ||
| 302 | BPF_S_ANC_ALU_XOR_X, | ||
| 303 | BPF_S_ANC_VLAN_TAG, | ||
| 304 | BPF_S_ANC_VLAN_TAG_PRESENT, | ||
| 305 | BPF_S_ANC_PAY_OFFSET, | ||
| 306 | BPF_S_ANC_RANDOM, | ||
| 307 | }; | ||
| 308 | |||
| 309 | #endif /* __LINUX_FILTER_H__ */ | 277 | #endif /* __LINUX_FILTER_H__ */ |
