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