]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/libpcap/pcap/bpf.h
MFV 364467:
[FreeBSD/FreeBSD.git] / contrib / libpcap / pcap / bpf.h
1 /*-
2  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * This code is derived from the Stanford/CMU enet packet filter,
6  * (net/enet.c) distributed as part of 4.3BSD, and code contributed
7  * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence
8  * Berkeley Laboratory.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. Neither the name of the University nor the names of its contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  *      @(#)bpf.h       7.1 (Berkeley) 5/7/91
35  */
36
37 /*
38  * This is libpcap's cut-down version of bpf.h; it includes only
39  * the stuff needed for the code generator and the userland BPF
40  * interpreter, and the libpcap APIs for setting filters, etc..
41  *
42  * "pcap-bpf.c" will include the native OS version, as it deals with
43  * the OS's BPF implementation.
44  *
45  * At least two programs found by Google Code Search explicitly includes
46  * <pcap/bpf.h> (even though <pcap.h>/<pcap/pcap.h> includes it for you),
47  * so moving that stuff to <pcap/pcap.h> would break the build for some
48  * programs.
49  */
50
51 /*
52  * If we've already included <net/bpf.h>, don't re-define this stuff.
53  * We assume BSD-style multiple-include protection in <net/bpf.h>,
54  * which is true of all but the oldest versions of FreeBSD and NetBSD,
55  * or Tru64 UNIX-style multiple-include protection (or, at least,
56  * Tru64 UNIX 5.x-style; I don't have earlier versions available to check),
57  * or AIX-style multiple-include protection (or, at least, AIX 5.x-style;
58  * I don't have earlier versions available to check), or QNX-style
59  * multiple-include protection (as per GitHub pull request #394).
60  *
61  * We do not check for BPF_MAJOR_VERSION, as that's defined by
62  * <linux/filter.h>, which is directly or indirectly included in some
63  * programs that also include pcap.h, and <linux/filter.h> doesn't
64  * define stuff we need.
65  *
66  * This also provides our own multiple-include protection.
67  */
68 #if !defined(_NET_BPF_H_) && !defined(_NET_BPF_H_INCLUDED) && !defined(_BPF_H_) && !defined(_H_BPF) && !defined(lib_pcap_bpf_h)
69 #define lib_pcap_bpf_h
70
71 #include <pcap/funcattrs.h>
72
73 #ifdef __cplusplus
74 extern "C" {
75 #endif
76
77 /* BSD style release date */
78 #define BPF_RELEASE 199606
79
80 #ifdef MSDOS /* must be 32-bit */
81 typedef long          bpf_int32;
82 typedef unsigned long bpf_u_int32;
83 #else
84 typedef int bpf_int32;
85 typedef u_int bpf_u_int32;
86 #endif
87
88 /*
89  * Alignment macros.  BPF_WORDALIGN rounds up to the next
90  * even multiple of BPF_ALIGNMENT.
91  *
92  * Tcpdump's print-pflog.c uses this, so we define it here.
93  */
94 #ifndef __NetBSD__
95 #define BPF_ALIGNMENT sizeof(bpf_int32)
96 #else
97 #define BPF_ALIGNMENT sizeof(long)
98 #endif
99 #define BPF_WORDALIGN(x) (((x)+(BPF_ALIGNMENT-1))&~(BPF_ALIGNMENT-1))
100
101 /*
102  * Structure for "pcap_compile()", "pcap_setfilter()", etc..
103  */
104 struct bpf_program {
105         u_int bf_len;
106         struct bpf_insn *bf_insns;
107 };
108
109 #include <pcap/dlt.h>
110
111 /*
112  * The instruction encodings.
113  *
114  * Please inform tcpdump-workers@lists.tcpdump.org if you use any
115  * of the reserved values, so that we can note that they're used
116  * (and perhaps implement it in the reference BPF implementation
117  * and encourage its implementation elsewhere).
118  */
119
120 /*
121  * The upper 8 bits of the opcode aren't used. BSD/OS used 0x8000.
122  */
123
124 /* instruction classes */
125 #define BPF_CLASS(code) ((code) & 0x07)
126 #define         BPF_LD          0x00
127 #define         BPF_LDX         0x01
128 #define         BPF_ST          0x02
129 #define         BPF_STX         0x03
130 #define         BPF_ALU         0x04
131 #define         BPF_JMP         0x05
132 #define         BPF_RET         0x06
133 #define         BPF_MISC        0x07
134
135 /* ld/ldx fields */
136 #define BPF_SIZE(code)  ((code) & 0x18)
137 #define         BPF_W           0x00
138 #define         BPF_H           0x08
139 #define         BPF_B           0x10
140 /*                              0x18    reserved; used by BSD/OS */
141 #define BPF_MODE(code)  ((code) & 0xe0)
142 #define         BPF_IMM         0x00
143 #define         BPF_ABS         0x20
144 #define         BPF_IND         0x40
145 #define         BPF_MEM         0x60
146 #define         BPF_LEN         0x80
147 #define         BPF_MSH         0xa0
148 /*                              0xc0    reserved; used by BSD/OS */
149 /*                              0xe0    reserved; used by BSD/OS */
150
151 /* alu/jmp fields */
152 #define BPF_OP(code)    ((code) & 0xf0)
153 #define         BPF_ADD         0x00
154 #define         BPF_SUB         0x10
155 #define         BPF_MUL         0x20
156 #define         BPF_DIV         0x30
157 #define         BPF_OR          0x40
158 #define         BPF_AND         0x50
159 #define         BPF_LSH         0x60
160 #define         BPF_RSH         0x70
161 #define         BPF_NEG         0x80
162 #define         BPF_MOD         0x90
163 #define         BPF_XOR         0xa0
164 /*                              0xb0    reserved */
165 /*                              0xc0    reserved */
166 /*                              0xd0    reserved */
167 /*                              0xe0    reserved */
168 /*                              0xf0    reserved */
169
170 #define         BPF_JA          0x00
171 #define         BPF_JEQ         0x10
172 #define         BPF_JGT         0x20
173 #define         BPF_JGE         0x30
174 #define         BPF_JSET        0x40
175 /*                              0x50    reserved; used on BSD/OS */
176 /*                              0x60    reserved */
177 /*                              0x70    reserved */
178 /*                              0x80    reserved */
179 /*                              0x90    reserved */
180 /*                              0xa0    reserved */
181 /*                              0xb0    reserved */
182 /*                              0xc0    reserved */
183 /*                              0xd0    reserved */
184 /*                              0xe0    reserved */
185 /*                              0xf0    reserved */
186 #define BPF_SRC(code)   ((code) & 0x08)
187 #define         BPF_K           0x00
188 #define         BPF_X           0x08
189
190 /* ret - BPF_K and BPF_X also apply */
191 #define BPF_RVAL(code)  ((code) & 0x18)
192 #define         BPF_A           0x10
193 /*                              0x18    reserved */
194
195 /* misc */
196 #define BPF_MISCOP(code) ((code) & 0xf8)
197 #define         BPF_TAX         0x00
198 /*                              0x08    reserved */
199 /*                              0x10    reserved */
200 /*                              0x18    reserved */
201 /* #define      BPF_COP         0x20    NetBSD "coprocessor" extensions */
202 /*                              0x28    reserved */
203 /*                              0x30    reserved */
204 /*                              0x38    reserved */
205 /* #define      BPF_COPX        0x40    NetBSD "coprocessor" extensions */
206 /*                                      also used on BSD/OS */
207 /*                              0x48    reserved */
208 /*                              0x50    reserved */
209 /*                              0x58    reserved */
210 /*                              0x60    reserved */
211 /*                              0x68    reserved */
212 /*                              0x70    reserved */
213 /*                              0x78    reserved */
214 #define         BPF_TXA         0x80
215 /*                              0x88    reserved */
216 /*                              0x90    reserved */
217 /*                              0x98    reserved */
218 /*                              0xa0    reserved */
219 /*                              0xa8    reserved */
220 /*                              0xb0    reserved */
221 /*                              0xb8    reserved */
222 /*                              0xc0    reserved; used on BSD/OS */
223 /*                              0xc8    reserved */
224 /*                              0xd0    reserved */
225 /*                              0xd8    reserved */
226 /*                              0xe0    reserved */
227 /*                              0xe8    reserved */
228 /*                              0xf0    reserved */
229 /*                              0xf8    reserved */
230
231 /*
232  * The instruction data structure.
233  */
234 struct bpf_insn {
235         u_short code;
236         u_char  jt;
237         u_char  jf;
238         bpf_u_int32 k;
239 };
240
241 /*
242  * Macros for insn array initializers.
243  */
244 #define BPF_STMT(code, k) { (u_short)(code), 0, 0, k }
245 #define BPF_JUMP(code, k, jt, jf) { (u_short)(code), jt, jf, k }
246
247 PCAP_API int bpf_validate(const struct bpf_insn *, int);
248 PCAP_API u_int bpf_filter(const struct bpf_insn *, const u_char *, u_int, u_int);
249
250 /*
251  * Number of scratch memory words (for BPF_LD|BPF_MEM and BPF_ST).
252  */
253 #define BPF_MEMWORDS 16
254
255 #ifdef __cplusplus
256 }
257 #endif
258
259 #endif /* !defined(_NET_BPF_H_) && !defined(_BPF_H_) && !defined(_H_BPF) && !defined(lib_pcap_bpf_h) */