diff options
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/filter.h | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/include/linux/filter.h b/include/linux/filter.h index e65e23087367..93a9792e27bc 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h | |||
| @@ -19,14 +19,19 @@ struct compat_sock_fprog { | |||
| 19 | }; | 19 | }; |
| 20 | #endif | 20 | #endif |
| 21 | 21 | ||
| 22 | struct sock_fprog_kern { | ||
| 23 | u16 len; | ||
| 24 | struct sock_filter *filter; | ||
| 25 | }; | ||
| 26 | |||
| 22 | struct sk_buff; | 27 | struct sk_buff; |
| 23 | struct sock; | 28 | struct sock; |
| 24 | 29 | ||
| 25 | struct sk_filter | 30 | struct sk_filter { |
| 26 | { | ||
| 27 | atomic_t refcnt; | 31 | atomic_t refcnt; |
| 28 | u32 jited:1, /* Is our filter JIT'ed? */ | 32 | u32 jited:1, /* Is our filter JIT'ed? */ |
| 29 | len:31; /* Number of filter blocks */ | 33 | len:31; /* Number of filter blocks */ |
| 34 | struct sock_fprog_kern *orig_prog; /* Original BPF program */ | ||
| 30 | struct rcu_head rcu; | 35 | struct rcu_head rcu; |
| 31 | unsigned int (*bpf_func)(const struct sk_buff *skb, | 36 | unsigned int (*bpf_func)(const struct sk_buff *skb, |
| 32 | const struct sock_filter *filter); | 37 | const struct sock_filter *filter); |
| @@ -42,14 +47,20 @@ static inline unsigned int sk_filter_size(unsigned int proglen) | |||
| 42 | offsetof(struct sk_filter, insns[proglen])); | 47 | offsetof(struct sk_filter, insns[proglen])); |
| 43 | } | 48 | } |
| 44 | 49 | ||
| 50 | #define sk_filter_proglen(fprog) \ | ||
| 51 | (fprog->len * sizeof(fprog->filter[0])) | ||
| 52 | |||
| 45 | extern int sk_filter(struct sock *sk, struct sk_buff *skb); | 53 | extern int sk_filter(struct sock *sk, struct sk_buff *skb); |
| 46 | extern unsigned int sk_run_filter(const struct sk_buff *skb, | 54 | extern unsigned int sk_run_filter(const struct sk_buff *skb, |
| 47 | const struct sock_filter *filter); | 55 | const struct sock_filter *filter); |
| 56 | |||
| 48 | extern int sk_unattached_filter_create(struct sk_filter **pfp, | 57 | extern int sk_unattached_filter_create(struct sk_filter **pfp, |
| 49 | struct sock_fprog *fprog); | 58 | struct sock_fprog *fprog); |
| 50 | extern void sk_unattached_filter_destroy(struct sk_filter *fp); | 59 | extern void sk_unattached_filter_destroy(struct sk_filter *fp); |
| 60 | |||
| 51 | extern int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk); | 61 | extern int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk); |
| 52 | extern int sk_detach_filter(struct sock *sk); | 62 | extern int sk_detach_filter(struct sock *sk); |
| 63 | |||
| 53 | extern int sk_chk_filter(struct sock_filter *filter, unsigned int flen); | 64 | 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); | 65 | 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); | 66 | extern void sk_decode_filter(struct sock_filter *filt, struct sock_filter *to); |
