Home | History | Annotate | Line # | Download | only in ipftest
      1 /*	$NetBSD: bpf-ipf.h,v 1.1 2012/03/23 21:29:45 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. All advertising materials mentioning features or use of this software
     21  *    must display the following acknowledgement:
     22  *      This product includes software developed by the University of
     23  *      California, Berkeley and its contributors.
     24  * 4. Neither the name of the University nor the names of its contributors
     25  *    may be used to endorse or promote products derived from this software
     26  *    without specific prior written permission.
     27  *
     28  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     29  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     30  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     31  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     32  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     33  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     34  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     35  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     36  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     37  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     38  * SUCH DAMAGE.
     39  *
     40  *      @(#)bpf.h       7.1 (Berkeley) 5/7/91
     41  *
     42  * @(#) Header: /devel/CVS/IP-Filter/bpf-ipf.h,v 2.2 2007/10/25 17:03:18 darrenr Exp (LBL)
     43  */
     44 
     45 #ifndef BPF_MAJOR_VERSION
     46 
     47 #ifdef __cplusplus
     48 extern "C" {
     49 #endif
     50 
     51 /* BSD style release date */
     52 #define BPF_RELEASE 199606
     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 #ifndef __NetBSD__
     62 #define BPF_ALIGNMENT sizeof(bpf_int32)
     63 #else
     64 #define BPF_ALIGNMENT sizeof(long)
     65 #endif
     66 #define BPF_WORDALIGN(x) (((x)+(BPF_ALIGNMENT-1))&~(BPF_ALIGNMENT-1))
     67 
     68 #define BPF_MAXINSNS 512
     69 #define BPF_MAXBUFSIZE 0x8000
     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.
     82  */
     83 struct bpf_stat {
     84 	u_int bs_recv;		/* number of packets received */
     85 	u_int bs_drop;		/* number of packets dropped */
     86 };
     87 
     88 /*
     89  * Struct return by BIOCVERSION.  This represents the version number of
     90  * the filter language described by the instruction encodings below.
     91  * bpf understands a program iff kernel_major == filter_major &&
     92  * kernel_minor >= filter_minor, that is, if the value returned by the
     93  * running kernel has the same major number and a minor number equal
     94  * equal to or less than the filter being downloaded.  Otherwise, the
     95  * results are undefined, meaning an error may be returned or packets
     96  * may be accepted haphazardly.
     97  * It has nothing to do with the source code version.
     98  */
     99 struct bpf_version {
    100 	u_short bv_major;
    101 	u_short bv_minor;
    102 };
    103 /* Current version number of filter architecture. */
    104 #define BPF_MAJOR_VERSION 1
    105 #define BPF_MINOR_VERSION 1
    106 
    107 /*
    108  * BPF ioctls
    109  *
    110  * The first set is for compatibility with Sun's pcc style
    111  * header files.  If your using gcc, we assume that you
    112  * have run fixincludes so the latter set should work.
    113  */
    114 #if (defined(sun) || defined(ibm032)) && !defined(__GNUC__)
    115 #define	BIOCGBLEN	_IOR(B,102, u_int)
    116 #define	BIOCSBLEN	_IOWR(B,102, u_int)
    117 #define	BIOCSETF	_IOW(B,103, struct bpf_program)
    118 #define	BIOCFLUSH	_IO(B,104)
    119 #define BIOCPROMISC	_IO(B,105)
    120 #define	BIOCGDLT	_IOR(B,106, u_int)
    121 #define BIOCGETIF	_IOR(B,107, struct ifreq)
    122 #define BIOCSETIF	_IOW(B,108, struct ifreq)
    123 #define BIOCSRTIMEOUT	_IOW(B,109, struct timeval)
    124 #define BIOCGRTIMEOUT	_IOR(B,110, struct timeval)
    125 #define BIOCGSTATS	_IOR(B,111, struct bpf_stat)
    126 #define BIOCIMMEDIATE	_IOW(B,112, u_int)
    127 #define BIOCVERSION	_IOR(B,113, struct bpf_version)
    128 #define BIOCSTCPF	_IOW(B,114, struct bpf_program)
    129 #define BIOCSUDPF	_IOW(B,115, struct bpf_program)
    130 #else
    131 #define	BIOCGBLEN	_IOR('B',102, u_int)
    132 #define	BIOCSBLEN	_IOWR('B',102, u_int)
    133 #define	BIOCSETF	_IOW('B',103, struct bpf_program)
    134 #define	BIOCFLUSH	_IO('B',104)
    135 #define BIOCPROMISC	_IO('B',105)
    136 #define	BIOCGDLT	_IOR('B',106, u_int)
    137 #define BIOCGETIF	_IOR('B',107, struct ifreq)
    138 #define BIOCSETIF	_IOW('B',108, struct ifreq)
    139 #define BIOCSRTIMEOUT	_IOW('B',109, struct timeval)
    140 #define BIOCGRTIMEOUT	_IOR('B',110, struct timeval)
    141 #define BIOCGSTATS	_IOR('B',111, struct bpf_stat)
    142 #define BIOCIMMEDIATE	_IOW('B',112, u_int)
    143 #define BIOCVERSION	_IOR('B',113, struct bpf_version)
    144 #define BIOCSTCPF	_IOW('B',114, struct bpf_program)
    145 #define BIOCSUDPF	_IOW('B',115, struct bpf_program)
    146 #endif
    147 
    148 /*
    149  * Structure prepended to each packet.
    150  */
    151 struct bpf_hdr {
    152 	struct timeval	bh_tstamp;	/* time stamp */
    153 	bpf_u_int32	bh_caplen;	/* length of captured portion */
    154 	bpf_u_int32	bh_datalen;	/* original length of packet */
    155 	u_short		bh_hdrlen;	/* length of bpf header (this struct
    156 					   plus alignment padding) */
    157 };
    158 /*
    159  * Because the structure above is not a multiple of 4 bytes, some compilers
    160  * will insist on inserting padding; hence, sizeof(struct bpf_hdr) won't work.
    161  * Only the kernel needs to know about it; applications use bh_hdrlen.
    162  */
    163 #if defined(KERNEL) || defined(_KERNEL)
    164 #define SIZEOF_BPF_HDR 18
    165 #endif
    166 
    167 /*
    168  * Data-link level type codes.
    169  */
    170 
    171 /*
    172  * These are the types that are the same on all platforms; on other
    173  * platforms, a <net/bpf.h> should be supplied that defines the additional
    174  * DLT_* codes appropriately for that platform (the BSDs, for example,
    175  * should not just pick up this version of "bpf.h"; they should also define
    176  * the additional DLT_* codes used by their kernels, as well as the values
    177  * defined here - and, if the values they use for particular DLT_ types
    178  * differ from those here, they should use their values, not the ones
    179  * here).
    180  */
    181 #define DLT_NULL	0	/* no link-layer encapsulation */
    182 #define DLT_EN10MB	1	/* Ethernet (10Mb) */
    183 #define DLT_EN3MB	2	/* Experimental Ethernet (3Mb) */
    184 #define DLT_AX25	3	/* Amateur Radio AX.25 */
    185 #define DLT_PRONET	4	/* Proteon ProNET Token Ring */
    186 #define DLT_CHAOS	5	/* Chaos */
    187 #define DLT_IEEE802	6	/* IEEE 802 Networks */
    188 #define DLT_ARCNET	7	/* ARCNET */
    189 #define DLT_SLIP	8	/* Serial Line IP */
    190 #define DLT_PPP		9	/* Point-to-point Protocol */
    191 #define DLT_FDDI	10	/* FDDI */
    192 
    193 /*
    194  * These are values from the traditional libpcap "bpf.h".
    195  * Ports of this to particular platforms should replace these definitions
    196  * with the ones appropriate to that platform, if the values are
    197  * different on that platform.
    198  */
    199 #define DLT_ATM_RFC1483	11	/* LLC/SNAP encapsulated atm */
    200 #define DLT_RAW		12	/* raw IP */
    201 
    202 /*
    203  * These are values from BSD/OS's "bpf.h".
    204  * These are not the same as the values from the traditional libpcap
    205  * "bpf.h"; however, these values shouldn't be generated by any
    206  * OS other than BSD/OS, so the correct values to use here are the
    207  * BSD/OS values.
    208  *
    209  * Platforms that have already assigned these values to other
    210  * DLT_ codes, however, should give these codes the values
    211  * from that platform, so that programs that use these codes will
    212  * continue to compile - even though they won't correctly read
    213  * files of these types.
    214  */
    215 #ifdef __NetBSD__
    216 #ifndef DLT_SLIP_BSDOS
    217 #define DLT_SLIP_BSDOS	13	/* BSD/OS Serial Line IP */
    218 #define DLT_PPP_BSDOS	14	/* BSD/OS Point-to-point Protocol */
    219 #endif
    220 #else
    221 #define DLT_SLIP_BSDOS	15	/* BSD/OS Serial Line IP */
    222 #define DLT_PPP_BSDOS	16	/* BSD/OS Point-to-point Protocol */
    223 #endif
    224 
    225 #define DLT_ATM_CLIP	19	/* Linux Classical-IP over ATM */
    226 
    227 /*
    228  * These values are defined by NetBSD; other platforms should refrain from
    229  * using them for other purposes, so that NetBSD savefiles with link
    230  * types of 50 or 51 can be read as this type on all platforms.
    231  */
    232 #define DLT_PPP_SERIAL	50	/* PPP over serial with HDLC encapsulation */
    233 #define DLT_PPP_ETHER	51	/* PPP over Ethernet */
    234 
    235 /*
    236  * Values between 100 and 103 are used in capture file headers as
    237  * link-layer types corresponding to DLT_ types that differ
    238  * between platforms; don't use those values for new DLT_ new types.
    239  */
    240 
    241 /*
    242  * This value was defined by libpcap 0.5; platforms that have defined
    243  * it with a different value should define it here with that value -
    244  * a link type of 104 in a save file will be mapped to DLT_C_HDLC,
    245  * whatever value that happens to be, so programs will correctly
    246  * handle files with that link type regardless of the value of
    247  * DLT_C_HDLC.
    248  *
    249  * The name DLT_C_HDLC was used by BSD/OS; we use that name for source
    250  * compatibility with programs written for BSD/OS.
    251  *
    252  * libpcap 0.5 defined it as DLT_CHDLC; we define DLT_CHDLC as well,
    253  * for source compatibility with programs written for libpcap 0.5.
    254  */
    255 #define DLT_C_HDLC	104	/* Cisco HDLC */
    256 #define DLT_CHDLC	DLT_C_HDLC
    257 
    258 #define DLT_IEEE802_11	105	/* IEEE 802.11 wireless */
    259 
    260 /*
    261  * Values between 106 and 107 are used in capture file headers as
    262  * link-layer types corresponding to DLT_ types that might differ
    263  * between platforms; don't use those values for new DLT_ new types.
    264  */
    265 
    266 /*
    267  * OpenBSD DLT_LOOP, for loopback devices; it's like DLT_NULL, except
    268  * that the AF_ type in the link-layer header is in network byte order.
    269  *
    270  * OpenBSD defines it as 12, but that collides with DLT_RAW, so we
    271  * define it as 108 here.  If OpenBSD picks up this file, it should
    272  * define DLT_LOOP as 12 in its version, as per the comment above -
    273  * and should not use 108 as a DLT_ value.
    274  */
    275 #define DLT_LOOP	108
    276 
    277 /*
    278  * Values between 109 and 112 are used in capture file headers as
    279  * link-layer types corresponding to DLT_ types that might differ
    280  * between platforms; don't use those values for new DLT_ types
    281  * other than the corresponding DLT_ types.
    282  */
    283 
    284 /*
    285  * This is for Linux cooked sockets.
    286  */
    287 #define DLT_LINUX_SLL	113
    288 
    289 /*
    290  * Apple LocalTalk hardware.
    291  */
    292 #define DLT_LTALK	114
    293 
    294 /*
    295  * Acorn Econet.
    296  */
    297 #define DLT_ECONET	115
    298 
    299 /*
    300  * Reserved for use with OpenBSD ipfilter.
    301  */
    302 #define DLT_IPFILTER	116
    303 
    304 /*
    305  * Reserved for use in capture-file headers as a link-layer type
    306  * corresponding to OpenBSD DLT_PFLOG; DLT_PFLOG is 17 in OpenBSD,
    307  * but that's DLT_LANE8023 in SuSE 6.3, so we can't use 17 for it
    308  * in capture-file headers.
    309  */
    310 #define DLT_PFLOG	117
    311 
    312 /*
    313  * Registered for Cisco-internal use.
    314  */
    315 #define DLT_CISCO_IOS	118
    316 
    317 /*
    318  * Reserved for 802.11 cards using the Prism II chips, with a link-layer
    319  * header including Prism monitor mode information plus an 802.11
    320  * header.
    321  */
    322 #define DLT_PRISM_HEADER	119
    323 
    324 /*
    325  * Reserved for Aironet 802.11 cards, with an Aironet link-layer header
    326  * (see Doug Ambrisko's FreeBSD patches).
    327  */
    328 #define DLT_AIRONET_HEADER	120
    329 
    330 /*
    331  * Reserved for Siemens HiPath HDLC.
    332  */
    333 #define DLT_HHDLC		121
    334 
    335 /*
    336  * Reserved for RFC 2625 IP-over-Fibre Channel, as per a request from
    337  * Don Lee <donlee (at) cray.com>.
    338  *
    339  * This is not for use with raw Fibre Channel, where the link-layer
    340  * header starts with a Fibre Channel frame header; it's for IP-over-FC,
    341  * where the link-layer header starts with an RFC 2625 Network_Header
    342  * field.
    343  */
    344 #define DLT_IP_OVER_FC		122
    345 
    346 /*
    347  * The instruction encodings.
    348  */
    349 /* instruction classes */
    350 #define BPF_CLASS(code) ((code) & 0x07)
    351 #define		BPF_LD		0x00
    352 #define		BPF_LDX		0x01
    353 #define		BPF_ST		0x02
    354 #define		BPF_STX		0x03
    355 #define		BPF_ALU		0x04
    356 #define		BPF_JMP		0x05
    357 #define		BPF_RET		0x06
    358 #define		BPF_MISC	0x07
    359 
    360 /* ld/ldx fields */
    361 #define BPF_SIZE(code)	((code) & 0x18)
    362 #define		BPF_W		0x00
    363 #define		BPF_H		0x08
    364 #define		BPF_B		0x10
    365 #define BPF_MODE(code)	((code) & 0xe0)
    366 #define		BPF_IMM 	0x00
    367 #define		BPF_ABS		0x20
    368 #define		BPF_IND		0x40
    369 #define		BPF_MEM		0x60
    370 #define		BPF_LEN		0x80
    371 #define		BPF_MSH		0xa0
    372 
    373 /* alu/jmp fields */
    374 #define BPF_OP(code)	((code) & 0xf0)
    375 #define		BPF_ADD		0x00
    376 #define		BPF_SUB		0x10
    377 #define		BPF_MUL		0x20
    378 #define		BPF_DIV		0x30
    379 #define		BPF_OR		0x40
    380 #define		BPF_AND		0x50
    381 #define		BPF_LSH		0x60
    382 #define		BPF_RSH		0x70
    383 #define		BPF_NEG		0x80
    384 #define		BPF_JA		0x00
    385 #define		BPF_JEQ		0x10
    386 #define		BPF_JGT		0x20
    387 #define		BPF_JGE		0x30
    388 #define		BPF_JSET	0x40
    389 #define BPF_SRC(code)	((code) & 0x08)
    390 #define		BPF_K		0x00
    391 #define		BPF_X		0x08
    392 
    393 /* ret - BPF_K and BPF_X also apply */
    394 #define BPF_RVAL(code)	((code) & 0x18)
    395 #define		BPF_A		0x10
    396 
    397 /* misc */
    398 #define BPF_MISCOP(code) ((code) & 0xf8)
    399 #define		BPF_TAX		0x00
    400 #define		BPF_TXA		0x80
    401 
    402 /*
    403  * The instruction data structure.
    404  */
    405 struct bpf_insn {
    406 	u_short	code;
    407 	u_char 	jt;
    408 	u_char 	jf;
    409 	bpf_int32 k;
    410 };
    411 
    412 /*
    413  * Macros for insn array initializers.
    414  */
    415 #define BPF_STMT(code, k) { (u_short)(code), 0, 0, k }
    416 #define BPF_JUMP(code, k, jt, jf) { (u_short)(code), jt, jf, k }
    417 
    418 #if defined(BSD) && (defined(KERNEL) || defined(_KERNEL))
    419 /*
    420  * Systems based on non-BSD kernels don't have ifnet's (or they don't mean
    421  * anything if it is in <net/if.h>) and won't work like this.
    422  */
    423 # if __STDC__
    424 extern void bpf_tap(struct ifnet *, u_char *, u_int);
    425 extern void bpf_mtap(struct ifnet *, struct mbuf *);
    426 extern void bpfattach(struct ifnet *, u_int, u_int);
    427 extern void bpfilterattach(int);
    428 # else
    429 extern void bpf_tap();
    430 extern void bpf_mtap();
    431 extern void bpfattach();
    432 extern void bpfilterattach();
    433 # endif /* __STDC__ */
    434 #endif /* BSD && (_KERNEL || KERNEL) */
    435 #if __STDC__ || defined(__cplusplus)
    436 extern int bpf_validate(struct bpf_insn *, int);
    437 extern u_int bpf_filter(struct bpf_insn *, u_char *, u_int, u_int);
    438 #else
    439 extern int bpf_validate();
    440 extern u_int bpf_filter();
    441 #endif
    442 
    443 /*
    444  * Number of scratch memory words (for BPF_LD|BPF_MEM and BPF_ST).
    445  */
    446 #define BPF_MEMWORDS 16
    447 
    448 #ifdef __cplusplus
    449 }
    450 #endif
    451 
    452 #endif
    453