Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / net / bpf.h @ 14

History | View | Annotate | Download (14.8 KB)

1 13 up20180614
/*        $NetBSD: bpf.h,v 1.67 2015/09/05 20:01:21 dholland Exp $        */
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/ioccom.h>
44
#include <sys/time.h>
45
46
/* BSD style release date */
47
#define BPF_RELEASE 199606
48
49
/* Date when COP instructions and external memory have been released. */
50
#define BPF_COP_EXTMEM_RELEASE 20140624
51
52
__BEGIN_DECLS
53
54
typedef        int bpf_int32;
55
typedef        u_int bpf_u_int32;
56
57
/*
58
 * Alignment macros.  BPF_WORDALIGN rounds up to the next
59
 * even multiple of BPF_ALIGNMENT.
60
 */
61
#define BPF_ALIGNMENT sizeof(long)
62
#define BPF_ALIGNMENT32 sizeof(int)
63
64
#define BPF_WORDALIGN(x) (((x)+(BPF_ALIGNMENT-1))&~(BPF_ALIGNMENT-1))
65
#define BPF_WORDALIGN32(x) (((x)+(BPF_ALIGNMENT32-1))&~(BPF_ALIGNMENT32-1))
66
67
#define BPF_MAXINSNS 512
68
#define BPF_DFLTBUFSIZE (1024*1024)        /* default static upper limit */
69
#define BPF_MAXBUFSIZE (1024*1024*16)        /* hard limit on sysctl'able value */
70
#define BPF_MINBUFSIZE 32
71
72
/*
73
 *  Structure for BIOCSETF.
74
 */
75
struct bpf_program {
76
        u_int bf_len;
77
        struct bpf_insn *bf_insns;
78
};
79
80
/*
81
 * Struct returned by BIOCGSTATS and net.bpf.stats sysctl.
82
 */
83
struct bpf_stat {
84
        uint64_t bs_recv;        /* number of packets received */
85
        uint64_t bs_drop;        /* number of packets dropped */
86
        uint64_t bs_capt;        /* number of packets captured */
87
        uint64_t bs_padding[13];
88
};
89
90
/*
91
 * Struct returned by BIOCGSTATSOLD.
92
 */
93
struct bpf_stat_old {
94
        u_int bs_recv;                /* number of packets received */
95
        u_int bs_drop;                /* number of packets dropped */
96
};
97
98
/*
99
 * Struct return by BIOCVERSION.  This represents the version number of
100
 * the filter language described by the instruction encodings below.
101
 * bpf understands a program iff kernel_major == filter_major &&
102
 * kernel_minor >= filter_minor, that is, if the value returned by the
103
 * running kernel has the same major number and a minor number equal
104
 * equal to or less than the filter being downloaded.  Otherwise, the
105
 * results are undefined, meaning an error may be returned or packets
106
 * may be accepted haphazardly.
107
 * It has nothing to do with the source code version.
108
 */
109
struct bpf_version {
110
        u_short bv_major;
111
        u_short bv_minor;
112
};
113
/* Current version number of filter architecture. */
114
#define BPF_MAJOR_VERSION 1
115
#define BPF_MINOR_VERSION 1
116
117
/*
118
 * BPF ioctls
119
 *
120
 * The first set is for compatibility with Sun's pcc style
121
 * header files.  If your using gcc, we assume that you
122
 * have run fixincludes so the latter set should work.
123
 */
124
#define BIOCGBLEN         _IOR('B',102, u_int)
125
#define BIOCSBLEN        _IOWR('B',102, u_int)
126
#define BIOCSETF         _IOW('B',103, struct bpf_program)
127
#define BIOCFLUSH          _IO('B',104)
128
#define BIOCPROMISC          _IO('B',105)
129
#define BIOCGDLT         _IOR('B',106, u_int)
130
#define BIOCGETIF         _IOR('B',107, struct ifreq)
131
#define BIOCSETIF         _IOW('B',108, struct ifreq)
132
#ifdef COMPAT_50
133
#include <compat/sys/time.h>
134
#define BIOCSORTIMEOUT         _IOW('B',109, struct timeval50)
135
#define BIOCGORTIMEOUT         _IOR('B',110, struct timeval50)
136
#endif
137
#define BIOCGSTATS         _IOR('B',111, struct bpf_stat)
138
#define BIOCGSTATSOLD         _IOR('B',111, struct bpf_stat_old)
139
#define BIOCIMMEDIATE         _IOW('B',112, u_int)
140
#define BIOCVERSION         _IOR('B',113, struct bpf_version)
141
#define BIOCSTCPF         _IOW('B',114, struct bpf_program)
142
#define BIOCSUDPF         _IOW('B',115, struct bpf_program)
143
#define BIOCGHDRCMPLT         _IOR('B',116, u_int)
144
#define BIOCSHDRCMPLT         _IOW('B',117, u_int)
145
#define BIOCSDLT         _IOW('B',118, u_int)
146
#define BIOCGDLTLIST        _IOWR('B',119, struct bpf_dltlist)
147
#define BIOCGSEESENT         _IOR('B',120, u_int)
148
#define BIOCSSEESENT         _IOW('B',121, u_int)
149
#define BIOCSRTIMEOUT         _IOW('B',122, struct timeval)
150
#define BIOCGRTIMEOUT         _IOR('B',123, struct timeval)
151
#define BIOCGFEEDBACK         _IOR('B',124, u_int)
152
#define BIOCSFEEDBACK         _IOW('B',125, u_int)
153
#define BIOCFEEDBACK     BIOCSFEEDBACK                /* FreeBSD name */
154
155
/*
156
 * Structure prepended to each packet. This is "wire" format, so we
157
 * cannot change it unfortunately to 64 bit times on 32 bit systems [yet].
158
 */
159
struct bpf_timeval {
160
        long tv_sec;
161
        long tv_usec;
162
};
163
164
struct bpf_timeval32 {
165
        int32_t tv_sec;
166
        int32_t tv_usec;
167
};
168
169
struct bpf_hdr {
170
        struct bpf_timeval bh_tstamp;        /* time stamp */
171
        uint32_t        bh_caplen;        /* length of captured portion */
172
        uint32_t        bh_datalen;        /* original length of packet */
173
        uint16_t        bh_hdrlen;        /* length of bpf header (this struct
174
                                           plus alignment padding) */
175
};
176
177
struct bpf_hdr32 {
178
        struct bpf_timeval32 bh_tstamp;        /* time stamp */
179
        uint32_t        bh_caplen;        /* length of captured portion */
180
        uint32_t        bh_datalen;        /* original length of packet */
181
        uint16_t        bh_hdrlen;        /* length of bpf header (this struct
182
                                           plus alignment padding) */
183
};
184
/*
185
 * Because the structure above is not a multiple of 4 bytes, some compilers
186
 * will insist on inserting padding; hence, sizeof(struct bpf_hdr) won't work.
187
 * Only the kernel needs to know about it; applications use bh_hdrlen.
188
 * XXX To save a few bytes on 32-bit machines, we avoid end-of-struct
189
 * XXX padding by using the size of the header data elements.  This is
190
 * XXX fail-safe: on new machines, we just use the 'safe' sizeof.
191
 */
192
#ifdef _KERNEL
193
#if defined(__arm32__) || defined(__i386__) || defined(__m68k__) || \
194
    defined(__mips__) || defined(__ns32k__) || defined(__vax__) || \
195
    defined(__sh__) || (defined(__sparc__) && !defined(__sparc64__))
196
#define SIZEOF_BPF_HDR 18
197
#define SIZEOF_BPF_HDR32 18
198
#else
199
#define SIZEOF_BPF_HDR sizeof(struct bpf_hdr)
200
#define SIZEOF_BPF_HDR32 sizeof(struct bpf_hdr32)
201
#endif
202
#endif
203
204
/* Pull in data-link level type codes. */
205
#include <net/dlt.h>
206
207
/*
208
 * The instruction encodings.
209
 */
210
/* instruction classes */
211
#define BPF_CLASS(code) ((code) & 0x07)
212
#define                BPF_LD                0x00
213
#define                BPF_LDX                0x01
214
#define                BPF_ST                0x02
215
#define                BPF_STX                0x03
216
#define                BPF_ALU                0x04
217
#define                BPF_JMP                0x05
218
#define                BPF_RET                0x06
219
#define                BPF_MISC        0x07
220
221
/* ld/ldx fields */
222
#define BPF_SIZE(code)        ((code) & 0x18)
223
#define                BPF_W                0x00
224
#define                BPF_H                0x08
225
#define                BPF_B                0x10
226
/*                                0x18        reserved; used by BSD/OS */
227
#define BPF_MODE(code)        ((code) & 0xe0)
228
#define                BPF_IMM         0x00
229
#define                BPF_ABS                0x20
230
#define                BPF_IND                0x40
231
#define                BPF_MEM                0x60
232
#define                BPF_LEN                0x80
233
#define                BPF_MSH                0xa0
234
/*                                0xc0        reserved; used by BSD/OS */
235
/*                                0xe0        reserved; used by BSD/OS */
236
237
/* alu/jmp fields */
238
#define BPF_OP(code)        ((code) & 0xf0)
239
#define                BPF_ADD                0x00
240
#define                BPF_SUB                0x10
241
#define                BPF_MUL                0x20
242
#define                BPF_DIV                0x30
243
#define                BPF_OR                0x40
244
#define                BPF_AND                0x50
245
#define                BPF_LSH                0x60
246
#define                BPF_RSH                0x70
247
#define                BPF_NEG                0x80
248
#define                BPF_MOD                0x90
249
#define                BPF_XOR                0xa0
250
/*                                0xb0        reserved */
251
/*                                0xc0        reserved */
252
/*                                0xd0        reserved */
253
/*                                0xe0        reserved */
254
/*                                0xf0        reserved */
255
#define                BPF_JA                0x00
256
#define                BPF_JEQ                0x10
257
#define                BPF_JGT                0x20
258
#define                BPF_JGE                0x30
259
#define                BPF_JSET        0x40
260
/*                                0x50        reserved; used by BSD/OS */
261
/*                                0x60        reserved */
262
/*                                0x70        reserved */
263
/*                                0x80        reserved */
264
/*                                0x90        reserved */
265
/*                                0xa0        reserved */
266
/*                                0xb0        reserved */
267
/*                                0xc0        reserved */
268
/*                                0xd0        reserved */
269
/*                                0xe0        reserved */
270
/*                                0xf0        reserved */
271
#define BPF_SRC(code)        ((code) & 0x08)
272
#define                BPF_K                0x00
273
#define                BPF_X                0x08
274
275
/* ret - BPF_K and BPF_X also apply */
276
#define BPF_RVAL(code)        ((code) & 0x18)
277
#define                BPF_A                0x10
278
/*                                0x18        reserved */
279
280
/* misc */
281
#define BPF_MISCOP(code) ((code) & 0xf8)
282
#define                BPF_TAX                0x00
283
/*                                0x10        reserved */
284
/*                                0x18        reserved */
285
#define                BPF_COP                0x20
286
/*                                0x28        reserved */
287
/*                                0x30        reserved */
288
/*                                0x38        reserved */
289
#define                BPF_COPX        0x40        /* XXX: also used by BSD/OS */
290
/*                                0x48        reserved */
291
/*                                0x50        reserved */
292
/*                                0x58        reserved */
293
/*                                0x60        reserved */
294
/*                                0x68        reserved */
295
/*                                0x70        reserved */
296
/*                                0x78        reserved */
297
#define                BPF_TXA                0x80
298
/*                                0x88        reserved */
299
/*                                0x90        reserved */
300
/*                                0x98        reserved */
301
/*                                0xa0        reserved */
302
/*                                0xa8        reserved */
303
/*                                0xb0        reserved */
304
/*                                0xb8        reserved */
305
/*                                0xc0        reserved; used by BSD/OS */
306
/*                                0xc8        reserved */
307
/*                                0xd0        reserved */
308
/*                                0xd8        reserved */
309
/*                                0xe0        reserved */
310
/*                                0xe8        reserved */
311
/*                                0xf0        reserved */
312
/*                                0xf8        reserved */
313
314
/*
315
 * The instruction data structure.
316
 */
317
struct bpf_insn {
318
        uint16_t  code;
319
        u_char           jt;
320
        u_char           jf;
321
        uint32_t  k;
322
};
323
324
/*
325
 * Macros for insn array initializers.
326
 */
327
#define BPF_STMT(code, k) { (uint16_t)(code), 0, 0, k }
328
#define BPF_JUMP(code, k, jt, jf) { (uint16_t)(code), jt, jf, k }
329
330
/*
331
 * Number of scratch memory words (for BPF_LD|BPF_MEM and BPF_ST).
332
 */
333
#define        BPF_MEMWORDS                16
334
335
/*
336
 * bpf_memword_init_t: bits indicate which words in the external memory
337
 * store will be initialised by the caller before BPF program execution.
338
 */
339
typedef uint32_t bpf_memword_init_t;
340
#define        BPF_MEMWORD_INIT(k)        (UINT32_C(1) << (k))
341
342
/* Note: two most significant bits are reserved by bpfjit. */
343
__CTASSERT(BPF_MEMWORDS + 2 <= sizeof(bpf_memword_init_t) * NBBY);
344
345
#ifdef _KERNEL
346
/*
347
 * Max number of external memory words (for BPF_LD|BPF_MEM and BPF_ST).
348
 */
349
#define        BPF_MAX_MEMWORDS        30
350
351
__CTASSERT(BPF_MAX_MEMWORDS >= BPF_MEMWORDS);
352
__CTASSERT(BPF_MAX_MEMWORDS + 2 <= sizeof(bpf_memword_init_t) * NBBY);
353
#endif
354
355
/*
356
 * Structure to retrieve available DLTs for the interface.
357
 */
358
struct bpf_dltlist {
359
        u_int        bfl_len;        /* number of bfd_list array */
360
        u_int        *bfl_list;        /* array of DLTs */
361
};
362
363
struct bpf_ctx;
364
typedef struct bpf_ctx bpf_ctx_t;
365
366
typedef struct bpf_args {
367
        const uint8_t *        pkt;
368
        size_t                wirelen;
369
        size_t                buflen;
370
        /*
371
         * The following arguments are used only by some kernel
372
         * subsystems.
373
         * They aren't required for classical bpf filter programs.
374
         * For such programs, bpfjit generated code doesn't read
375
         * those arguments at all. Note however that bpf interpreter
376
         * always needs a pointer to memstore.
377
         */
378
        uint32_t *        mem; /* pointer to external memory store */
379
        void *                arg; /* auxiliary argument for a copfunc */
380
} bpf_args_t;
381
382
#if defined(_KERNEL) || defined(__BPF_PRIVATE)
383
384
typedef uint32_t (*bpf_copfunc_t)(const bpf_ctx_t *, bpf_args_t *, uint32_t);
385
386
struct bpf_ctx {
387
        /*
388
         * BPF coprocessor functions and the number of them.
389
         */
390
        const bpf_copfunc_t *        copfuncs;
391
        size_t                        nfuncs;
392
393
        /*
394
         * The number of memory words in the external memory store.
395
         * There may be up to BPF_MAX_MEMWORDS words; if zero is set,
396
         * then the internal memory store is used which has a fixed
397
         * number of words (BPF_MEMWORDS).
398
         */
399
        size_t                        extwords;
400
401
        /*
402
         * The bitmask indicating which words in the external memstore
403
         * will be initialised by the caller.
404
         */
405
        bpf_memword_init_t        preinited;
406
};
407
#endif
408
409
#ifdef _KERNEL
410
#include <net/bpfjit.h>
411
#include <net/if.h>
412
413
struct bpf_if;
414
415
struct bpf_ops {
416
        void (*bpf_attach)(struct ifnet *, u_int, u_int, struct bpf_if **);
417
        void (*bpf_detach)(struct ifnet *);
418
        void (*bpf_change_type)(struct ifnet *, u_int, u_int);
419
420
        void (*bpf_tap)(struct bpf_if *, u_char *, u_int);
421
        void (*bpf_mtap)(struct bpf_if *, struct mbuf *);
422
        void (*bpf_mtap2)(struct bpf_if *, void *, u_int, struct mbuf *);
423
        void (*bpf_mtap_af)(struct bpf_if *, uint32_t, struct mbuf *);
424
        void (*bpf_mtap_sl_in)(struct bpf_if *, u_char *, struct mbuf **);
425
        void (*bpf_mtap_sl_out)(struct bpf_if *, u_char *, struct mbuf *);
426
};
427
428
extern struct bpf_ops *bpf_ops;
429
430
static inline void
431
bpf_attach(struct ifnet *_ifp, u_int _dlt, u_int _hdrlen)
432
{
433
        bpf_ops->bpf_attach(_ifp, _dlt, _hdrlen, &_ifp->if_bpf);
434
}
435
436
static inline void
437
bpf_attach2(struct ifnet *_ifp, u_int _dlt, u_int _hdrlen, struct bpf_if **_dp)
438
{
439
        bpf_ops->bpf_attach(_ifp, _dlt, _hdrlen, _dp);
440
}
441
442
static inline void
443
bpf_tap(struct ifnet *_ifp, u_char *_pkt, u_int _len)
444
{
445
        if (_ifp->if_bpf)
446
                bpf_ops->bpf_tap(_ifp->if_bpf, _pkt, _len);
447
}
448
449
static inline void
450
bpf_mtap(struct ifnet *_ifp, struct mbuf *_m)
451
{
452
        if (_ifp->if_bpf)
453
                bpf_ops->bpf_mtap(_ifp->if_bpf, _m);
454
}
455
456
static inline void
457
bpf_mtap2(struct bpf_if *_bpf, void *_data, u_int _dlen, struct mbuf *_m)
458
{
459
        bpf_ops->bpf_mtap2(_bpf, _data, _dlen, _m);
460
}
461
462
static inline void
463
bpf_mtap3(struct bpf_if *_bpf, struct mbuf *_m)
464
{
465
        if (_bpf)
466
                bpf_ops->bpf_mtap(_bpf, _m);
467
}
468
469
static inline void
470
bpf_mtap_af(struct ifnet *_ifp, uint32_t _af, struct mbuf *_m)
471
{
472
        if (_ifp->if_bpf)
473
                bpf_ops->bpf_mtap_af(_ifp->if_bpf, _af, _m);
474
}
475
476
static inline void
477
bpf_change_type(struct ifnet *_ifp, u_int _dlt, u_int _hdrlen)
478
{
479
        bpf_ops->bpf_change_type(_ifp, _dlt, _hdrlen);
480
}
481
482
static inline void
483
bpf_detach(struct ifnet *_ifp)
484
{
485
        bpf_ops->bpf_detach(_ifp);
486
}
487
488
static inline void
489
bpf_mtap_sl_in(struct ifnet *_ifp, u_char *_hdr, struct mbuf **_m)
490
{
491
        bpf_ops->bpf_mtap_sl_in(_ifp->if_bpf, _hdr, _m);
492
}
493
494
static inline void
495
bpf_mtap_sl_out(struct ifnet *_ifp, u_char *_hdr, struct mbuf *_m)
496
{
497
        if (_ifp->if_bpf)
498
                bpf_ops->bpf_mtap_sl_out(_ifp->if_bpf, _hdr, _m);
499
}
500
501
502
void        bpf_setops(void);
503
504
void        bpf_ops_handover_enter(struct bpf_ops *);
505
void        bpf_ops_handover_exit(void);
506
507
void        bpfilterattach(int);
508
509
bpf_ctx_t *bpf_create(void);
510
void        bpf_destroy(bpf_ctx_t *);
511
512
int        bpf_set_cop(bpf_ctx_t *, const bpf_copfunc_t *, size_t);
513
int        bpf_set_extmem(bpf_ctx_t *, size_t, bpf_memword_init_t);
514
u_int        bpf_filter_ext(const bpf_ctx_t *, const struct bpf_insn *, bpf_args_t *);
515
int        bpf_validate_ext(const bpf_ctx_t *, const struct bpf_insn *, int);
516
517
bpfjit_func_t bpf_jit_generate(bpf_ctx_t *, void *, size_t);
518
void        bpf_jit_freecode(bpfjit_func_t);
519
520
#endif
521
522
int        bpf_validate(const struct bpf_insn *, int);
523
u_int        bpf_filter(const struct bpf_insn *, const u_char *, u_int, u_int);
524
525
__END_DECLS
526
527
#endif /* !_NET_BPF_H_ */