aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/filter.h15
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
22struct sock_fprog_kern {
23 u16 len;
24 struct sock_filter *filter;
25};
26
22struct sk_buff; 27struct sk_buff;
23struct sock; 28struct sock;
24 29
25struct sk_filter 30struct 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
45extern int sk_filter(struct sock *sk, struct sk_buff *skb); 53extern int sk_filter(struct sock *sk, struct sk_buff *skb);
46extern unsigned int sk_run_filter(const struct sk_buff *skb, 54extern unsigned int sk_run_filter(const struct sk_buff *skb,
47 const struct sock_filter *filter); 55 const struct sock_filter *filter);
56
48extern int sk_unattached_filter_create(struct sk_filter **pfp, 57extern int sk_unattached_filter_create(struct sk_filter **pfp,
49 struct sock_fprog *fprog); 58 struct sock_fprog *fprog);
50extern void sk_unattached_filter_destroy(struct sk_filter *fp); 59extern void sk_unattached_filter_destroy(struct sk_filter *fp);
60
51extern int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk); 61extern int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk);
52extern int sk_detach_filter(struct sock *sk); 62extern int sk_detach_filter(struct sock *sk);
63
53extern int sk_chk_filter(struct sock_filter *filter, unsigned int flen); 64extern int sk_chk_filter(struct sock_filter *filter, unsigned int flen);
54extern int sk_get_filter(struct sock *sk, struct sock_filter __user *filter, unsigned len); 65extern int sk_get_filter(struct sock *sk, struct sock_filter __user *filter, unsigned len);
55extern void sk_decode_filter(struct sock_filter *filt, struct sock_filter *to); 66extern void sk_decode_filter(struct sock_filter *filt, struct sock_filter *to);