1/*	$NetBSD$	*/
2
3/*
4 * Copyright (c) 1990, 1991, 1993
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	8.2 (Berkeley) 1/9/95
37 * @(#) Header: bpf.h,v 1.36 97/06/12 14:29:53 leres Exp  (LBL)
38 */
39
40#ifndef _NET_BPF_H_
41#define _NET_BPF_H_
42
43#include <sys/time.h>
44
45/* BSD style release date */
46#define BPF_RELEASE 199606
47
48__BEGIN_DECLS
49
50typedef	int bpf_int32;
51typedef	u_int bpf_u_int32;
52
53/*
54 * Alignment macros.  BPF_WORDALIGN rounds up to the next
55 * even multiple of BPF_ALIGNMENT.
56 */
57#define BPF_ALIGNMENT sizeof(long)
58#define BPF_ALIGNMENT32 sizeof(int)
59
60#define BPF_WORDALIGN(x) (((x)+(BPF_ALIGNMENT-1))&~(BPF_ALIGNMENT-1))
61#define BPF_WORDALIGN32(x) (((x)+(BPF_ALIGNMENT32-1))&~(BPF_ALIGNMENT32-1))
62
63#define BPF_MAXINSNS 512
64#define BPF_DFLTBUFSIZE (1024*1024)	/* default static upper limit */
65#define BPF_MAXBUFSIZE (1024*1024*16)	/* hard limit on sysctl'able value */
66#define BPF_MINBUFSIZE 32
67
68/*
69 *  Structure for BIOCSETF.
70 */
71struct bpf_program {
72	u_int bf_len;
73	struct bpf_insn *bf_insns;
74};
75
76/*
77 * Struct returned by BIOCGSTATS and net.bpf.stats sysctl.
78 */
79struct bpf_stat {
80	uint64_t bs_recv;	/* number of packets received */
81	uint64_t bs_drop;	/* number of packets dropped */
82	uint64_t bs_capt;	/* number of packets captured */
83	uint64_t bs_padding[13];
84};
85
86/*
87 * Struct returned by BIOCGSTATSOLD.
88 */
89struct bpf_stat_old {
90	u_int bs_recv;		/* number of packets received */
91	u_int bs_drop;		/* number of packets dropped */
92};
93
94/*
95 * Struct return by BIOCVERSION.  This represents the version number of
96 * the filter language described by the instruction encodings below.
97 * bpf understands a program iff kernel_major == filter_major &&
98 * kernel_minor >= filter_minor, that is, if the value returned by the
99 * running kernel has the same major number and a minor number equal
100 * equal to or less than the filter being downloaded.  Otherwise, the
101 * results are undefined, meaning an error may be returned or packets
102 * may be accepted haphazardly.
103 * It has nothing to do with the source code version.
104 */
105struct bpf_version {
106	u_short bv_major;
107	u_short bv_minor;
108};
109/* Current version number of filter architecture. */
110#define BPF_MAJOR_VERSION 1
111#define BPF_MINOR_VERSION 1
112
113/*
114 * BPF ioctls
115 *
116 * The first set is for compatibility with Sun's pcc style
117 * header files.  If your using gcc, we assume that you
118 * have run fixincludes so the latter set should work.
119 */
120#define BIOCGBLEN	 _IOR('B',102, u_int)
121#define BIOCSBLEN	_IOWR('B',102, u_int)
122#define BIOCSETF	 _IOW('B',103, struct bpf_program)
123#define BIOCFLUSH	  _IO('B',104)
124#define BIOCPROMISC	  _IO('B',105)
125#define BIOCGDLT	 _IOR('B',106, u_int)
126#define BIOCGETIF	 _IOR('B',107, struct ifreq)
127#define BIOCSETIF	 _IOW('B',108, struct ifreq)
128#ifdef COMPAT_50
129#include <compat/sys/time.h>
130#define BIOCSORTIMEOUT	 _IOW('B',109, struct timeval50)
131#define BIOCGORTIMEOUT	 _IOR('B',110, struct timeval50)
132#endif
133#define BIOCGSTATS	 _IOR('B',111, struct bpf_stat)
134#define BIOCGSTATSOLD	 _IOR('B',111, struct bpf_stat_old)
135#define BIOCIMMEDIATE	 _IOW('B',112, u_int)
136#define BIOCVERSION	 _IOR('B',113, struct bpf_version)
137#define BIOCSTCPF	 _IOW('B',114, struct bpf_program)
138#define BIOCSUDPF	 _IOW('B',115, struct bpf_program)
139#define BIOCGHDRCMPLT	 _IOR('B',116, u_int)
140#define BIOCSHDRCMPLT	 _IOW('B',117, u_int)
141#define BIOCSDLT	 _IOW('B',118, u_int)
142#define BIOCGDLTLIST	_IOWR('B',119, struct bpf_dltlist)
143#define BIOCGSEESENT	 _IOR('B',120, u_int)
144#define BIOCSSEESENT	 _IOW('B',121, u_int)
145#define BIOCSRTIMEOUT	 _IOW('B',122, struct timeval)
146#define BIOCGRTIMEOUT	 _IOR('B',123, struct timeval)
147#define BIOCGFEEDBACK	 _IOR('B',124, u_int)
148#define BIOCSFEEDBACK	 _IOW('B',125, u_int)
149#define BIOCFEEDBACK     BIOCSFEEDBACK		/* FreeBSD name */
150
151/*
152 * Structure prepended to each packet. This is "wire" format, so we
153 * cannot change it unfortunately to 64 bit times on 32 bit systems [yet].
154 */
155struct bpf_timeval {
156	long tv_sec;
157	long tv_usec;
158};
159
160struct bpf_timeval32 {
161	int32_t tv_sec;
162	int32_t tv_usec;
163};
164
165struct bpf_hdr {
166	struct bpf_timeval bh_tstamp;	/* time stamp */
167	uint32_t	bh_caplen;	/* length of captured portion */
168	uint32_t	bh_datalen;	/* original length of packet */
169	uint16_t	bh_hdrlen;	/* length of bpf header (this struct
170					   plus alignment padding) */
171};
172
173struct bpf_hdr32 {
174	struct bpf_timeval32 bh_tstamp;	/* time stamp */
175	uint32_t	bh_caplen;	/* length of captured portion */
176	uint32_t	bh_datalen;	/* original length of packet */
177	uint16_t	bh_hdrlen;	/* length of bpf header (this struct
178					   plus alignment padding) */
179};
180/*
181 * Because the structure above is not a multiple of 4 bytes, some compilers
182 * will insist on inserting padding; hence, sizeof(struct bpf_hdr) won't work.
183 * Only the kernel needs to know about it; applications use bh_hdrlen.
184 * XXX To save a few bytes on 32-bit machines, we avoid end-of-struct
185 * XXX padding by using the size of the header data elements.  This is
186 * XXX fail-safe: on new machines, we just use the 'safe' sizeof.
187 */
188#ifdef _KERNEL
189#if defined(__arm32__) || defined(__i386__) || defined(__m68k__) || \
190    defined(__mips__) || defined(__ns32k__) || defined(__vax__) || \
191    defined(__sh__) || (defined(__sparc__) && !defined(__sparc64__))
192#define SIZEOF_BPF_HDR 18
193#define SIZEOF_BPF_HDR32 18
194#else
195#define SIZEOF_BPF_HDR sizeof(struct bpf_hdr)
196#define SIZEOF_BPF_HDR32 sizeof(struct bpf_hdr32)
197#endif
198#endif
199
200/* Pull in data-link level type codes. */
201#include <net/dlt.h>
202
203/*
204 * The instruction encodings.
205 */
206/* instruction classes */
207#define BPF_CLASS(code) ((code) & 0x07)
208#define		BPF_LD		0x00
209#define		BPF_LDX		0x01
210#define		BPF_ST		0x02
211#define		BPF_STX		0x03
212#define		BPF_ALU		0x04
213#define		BPF_JMP		0x05
214#define		BPF_RET		0x06
215#define		BPF_MISC	0x07
216
217/* ld/ldx fields */
218#define BPF_SIZE(code)	((code) & 0x18)
219#define		BPF_W		0x00
220#define		BPF_H		0x08
221#define		BPF_B		0x10
222#define BPF_MODE(code)	((code) & 0xe0)
223#define		BPF_IMM 	0x00
224#define		BPF_ABS		0x20
225#define		BPF_IND		0x40
226#define		BPF_MEM		0x60
227#define		BPF_LEN		0x80
228#define		BPF_MSH		0xa0
229
230/* alu/jmp fields */
231#define BPF_OP(code)	((code) & 0xf0)
232#define		BPF_ADD		0x00
233#define		BPF_SUB		0x10
234#define		BPF_MUL		0x20
235#define		BPF_DIV		0x30
236#define		BPF_OR		0x40
237#define		BPF_AND		0x50
238#define		BPF_LSH		0x60
239#define		BPF_RSH		0x70
240#define		BPF_NEG		0x80
241#define		BPF_JA		0x00
242#define		BPF_JEQ		0x10
243#define		BPF_JGT		0x20
244#define		BPF_JGE		0x30
245#define		BPF_JSET	0x40
246#define BPF_SRC(code)	((code) & 0x08)
247#define		BPF_K		0x00
248#define		BPF_X		0x08
249
250/* ret - BPF_K and BPF_X also apply */
251#define BPF_RVAL(code)	((code) & 0x18)
252#define		BPF_A		0x10
253
254/* misc */
255#define BPF_MISCOP(code) ((code) & 0xf8)
256#define		BPF_TAX		0x00
257#define		BPF_TXA		0x80
258
259/*
260 * The instruction data structure.
261 */
262struct bpf_insn {
263	uint16_t  code;
264	u_char 	  jt;
265	u_char 	  jf;
266	uint32_t  k;
267};
268
269/*
270 * Macros for insn array initializers.
271 */
272#define BPF_STMT(code, k) { (uint16_t)(code), 0, 0, k }
273#define BPF_JUMP(code, k, jt, jf) { (uint16_t)(code), jt, jf, k }
274
275/*
276 * Structure to retrieve available DLTs for the interface.
277 */
278struct bpf_dltlist {
279	u_int	bfl_len;	/* number of bfd_list array */
280	u_int	*bfl_list;	/* array of DLTs */
281};
282
283#ifdef _KERNEL
284#include <net/if.h>
285struct bpf_if;
286
287struct bpf_ops {
288	void (*bpf_attach)(struct ifnet *, u_int, u_int, struct bpf_if **);
289	void (*bpf_detach)(struct ifnet *);
290	void (*bpf_change_type)(struct ifnet *, u_int, u_int);
291
292	void (*bpf_tap)(struct bpf_if *, u_char *, u_int);
293	void (*bpf_mtap)(struct bpf_if *, struct mbuf *);
294	void (*bpf_mtap2)(struct bpf_if *, void *, u_int, struct mbuf *);
295	void (*bpf_mtap_af)(struct bpf_if *, uint32_t, struct mbuf *);
296	void (*bpf_mtap_sl_in)(struct bpf_if *, u_char *, struct mbuf **);
297	void (*bpf_mtap_sl_out)(struct bpf_if *, u_char *, struct mbuf *);
298};
299
300extern struct bpf_ops *bpf_ops;
301
302static inline void
303bpf_attach(struct ifnet *_ifp, u_int _dlt, u_int _hdrlen)
304{
305	bpf_ops->bpf_attach(_ifp, _dlt, _hdrlen, &_ifp->if_bpf);
306}
307
308static inline void
309bpf_attach2(struct ifnet *_ifp, u_int _dlt, u_int _hdrlen, struct bpf_if **_dp)
310{
311	bpf_ops->bpf_attach(_ifp, _dlt, _hdrlen, _dp);
312}
313
314static inline void
315bpf_tap(struct ifnet *_ifp, u_char *_pkt, u_int _len)
316{
317	if (_ifp->if_bpf)
318		bpf_ops->bpf_tap(_ifp->if_bpf, _pkt, _len);
319}
320
321static inline void
322bpf_mtap(struct ifnet *_ifp, struct mbuf *_m)
323{
324	if (_ifp->if_bpf)
325		bpf_ops->bpf_mtap(_ifp->if_bpf, _m);
326}
327
328static inline void
329bpf_mtap2(struct bpf_if *_bpf, void *_data, u_int _dlen, struct mbuf *_m)
330{
331	bpf_ops->bpf_mtap2(_bpf, _data, _dlen, _m);
332}
333
334static inline void
335bpf_mtap3(struct bpf_if *_bpf, struct mbuf *_m)
336{
337	if (_bpf)
338		bpf_ops->bpf_mtap(_bpf, _m);
339}
340
341static inline void
342bpf_mtap_af(struct ifnet *_ifp, uint32_t _af, struct mbuf *_m)
343{
344	if (_ifp->if_bpf)
345		bpf_ops->bpf_mtap_af(_ifp->if_bpf, _af, _m);
346}
347
348static inline void
349bpf_change_type(struct ifnet *_ifp, u_int _dlt, u_int _hdrlen)
350{
351	bpf_ops->bpf_change_type(_ifp, _dlt, _hdrlen);
352}
353
354static inline void
355bpf_detach(struct ifnet *_ifp)
356{
357	bpf_ops->bpf_detach(_ifp);
358}
359
360static inline void
361bpf_mtap_sl_in(struct ifnet *_ifp, u_char *_hdr, struct mbuf **_m)
362{
363	bpf_ops->bpf_mtap_sl_in(_ifp->if_bpf, _hdr, _m);
364}
365
366static inline void
367bpf_mtap_sl_out(struct ifnet *_ifp, u_char *_hdr, struct mbuf *_m)
368{
369	if (_ifp->if_bpf)
370		bpf_ops->bpf_mtap_sl_out(_ifp->if_bpf, _hdr, _m);
371}
372
373
374void     bpf_setops(void);
375
376void     bpf_ops_handover_enter(struct bpf_ops *);
377void     bpf_ops_handover_exit(void);
378
379void	 bpfilterattach(int);
380
381#endif
382
383int	 bpf_validate(const struct bpf_insn *, int);
384u_int	 bpf_filter(const struct bpf_insn *, const u_char *, u_int, u_int);
385
386__END_DECLS
387
388/*
389 * Number of scratch memory words (for BPF_LD|BPF_MEM and BPF_ST).
390 */
391#define BPF_MEMWORDS 16
392
393#endif /* !_NET_BPF_H_ */
394