Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
422 | giacomo | 1 | /* |
2 | * Linux Socket Filter Data Structures |
||
3 | */ |
||
4 | |||
5 | #ifndef __LINUX_FILTER_H__ |
||
6 | #define __LINUX_FILTER_H__ |
||
7 | |||
8 | /* |
||
9 | * Current version of the filter code architecture. |
||
10 | */ |
||
11 | #define BPF_MAJOR_VERSION 1 |
||
12 | #define BPF_MINOR_VERSION 1 |
||
13 | |||
14 | /* |
||
15 | * Try and keep these values and structures similar to BSD, especially |
||
16 | * the BPF code definitions which need to match so you can share filters |
||
17 | */ |
||
18 | |||
19 | struct sock_filter /* Filter block */ |
||
20 | { |
||
21 | __u16 code; /* Actual filter code */ |
||
22 | __u8 jt; /* Jump true */ |
||
23 | __u8 jf; /* Jump false */ |
||
24 | __u32 k; /* Generic multiuse field */ |
||
25 | }; |
||
26 | |||
27 | struct sock_fprog /* Required for SO_ATTACH_FILTER. */ |
||
28 | { |
||
29 | unsigned short len; /* Number of filter blocks */ |
||
30 | struct sock_filter *filter; |
||
31 | }; |
||
32 | |||
33 | #ifdef __KERNEL__ |
||
34 | struct sk_filter |
||
35 | { |
||
36 | atomic_t refcnt; |
||
37 | unsigned int len; /* Number of filter blocks */ |
||
38 | struct sock_filter insns[0]; |
||
39 | }; |
||
40 | |||
41 | static inline unsigned int sk_filter_len(struct sk_filter *fp) |
||
42 | { |
||
43 | return fp->len*sizeof(struct sock_filter) + sizeof(*fp); |
||
44 | } |
||
45 | #endif |
||
46 | |||
47 | /* |
||
48 | * Instruction classes |
||
49 | */ |
||
50 | |||
51 | #define BPF_CLASS(code) ((code) & 0x07) |
||
52 | #define BPF_LD 0x00 |
||
53 | #define BPF_LDX 0x01 |
||
54 | #define BPF_ST 0x02 |
||
55 | #define BPF_STX 0x03 |
||
56 | #define BPF_ALU 0x04 |
||
57 | #define BPF_JMP 0x05 |
||
58 | #define BPF_RET 0x06 |
||
59 | #define BPF_MISC 0x07 |
||
60 | |||
61 | /* ld/ldx fields */ |
||
62 | #define BPF_SIZE(code) ((code) & 0x18) |
||
63 | #define BPF_W 0x00 |
||
64 | #define BPF_H 0x08 |
||
65 | #define BPF_B 0x10 |
||
66 | #define BPF_MODE(code) ((code) & 0xe0) |
||
67 | #define BPF_IMM 0x00 |
||
68 | #define BPF_ABS 0x20 |
||
69 | #define BPF_IND 0x40 |
||
70 | #define BPF_MEM 0x60 |
||
71 | #define BPF_LEN 0x80 |
||
72 | #define BPF_MSH 0xa0 |
||
73 | |||
74 | /* alu/jmp fields */ |
||
75 | #define BPF_OP(code) ((code) & 0xf0) |
||
76 | #define BPF_ADD 0x00 |
||
77 | #define BPF_SUB 0x10 |
||
78 | #define BPF_MUL 0x20 |
||
79 | #define BPF_DIV 0x30 |
||
80 | #define BPF_OR 0x40 |
||
81 | #define BPF_AND 0x50 |
||
82 | #define BPF_LSH 0x60 |
||
83 | #define BPF_RSH 0x70 |
||
84 | #define BPF_NEG 0x80 |
||
85 | #define BPF_JA 0x00 |
||
86 | #define BPF_JEQ 0x10 |
||
87 | #define BPF_JGT 0x20 |
||
88 | #define BPF_JGE 0x30 |
||
89 | #define BPF_JSET 0x40 |
||
90 | #define BPF_SRC(code) ((code) & 0x08) |
||
91 | #define BPF_K 0x00 |
||
92 | #define BPF_X 0x08 |
||
93 | |||
94 | /* ret - BPF_K and BPF_X also apply */ |
||
95 | #define BPF_RVAL(code) ((code) & 0x18) |
||
96 | #define BPF_A 0x10 |
||
97 | |||
98 | /* misc */ |
||
99 | #define BPF_MISCOP(code) ((code) & 0xf8) |
||
100 | #define BPF_TAX 0x00 |
||
101 | #define BPF_TXA 0x80 |
||
102 | |||
103 | #ifndef BPF_MAXINSNS |
||
104 | #define BPF_MAXINSNS 4096 |
||
105 | #endif |
||
106 | |||
107 | /* |
||
108 | * Macros for filter block array initializers. |
||
109 | */ |
||
110 | #ifndef BPF_STMT |
||
111 | #define BPF_STMT(code, k) { (unsigned short)(code), 0, 0, k } |
||
112 | #endif |
||
113 | #ifndef BPF_JUMP |
||
114 | #define BPF_JUMP(code, k, jt, jf) { (unsigned short)(code), jt, jf, k } |
||
115 | #endif |
||
116 | |||
117 | /* |
||
118 | * Number of scratch memory words for: BPF_ST and BPF_STX |
||
119 | */ |
||
120 | #define BPF_MEMWORDS 16 |
||
121 | |||
122 | /* RATIONALE. Negative offsets are invalid in BPF. |
||
123 | We use them to reference ancillary data. |
||
124 | Unlike introduction new instructions, it does not break |
||
125 | existing compilers/optimizers. |
||
126 | */ |
||
127 | #define SKF_AD_OFF (-0x1000) |
||
128 | #define SKF_AD_PROTOCOL 0 |
||
129 | #define SKF_AD_PKTTYPE 4 |
||
130 | #define SKF_AD_IFINDEX 8 |
||
131 | #define SKF_AD_MAX 12 |
||
132 | #define SKF_NET_OFF (-0x100000) |
||
133 | #define SKF_LL_OFF (-0x200000) |
||
134 | |||
135 | #ifdef __KERNEL__ |
||
136 | extern int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen); |
||
137 | extern int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk); |
||
138 | extern int sk_chk_filter(struct sock_filter *filter, int flen); |
||
139 | #endif /* __KERNEL__ */ |
||
140 | |||
141 | #endif /* __LINUX_FILTER_H__ */ |