Main Page | Modules | Class List | Directories | File List | Class Members | File Members | Related Pages

Bpf.h

Go to the documentation of this file.
00001 /* $Id$ */
00002 /*-
00003  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
00004  *      The Regents of the University of California.  All rights reserved.
00005  *
00006  * This code is derived from the Stanford/CMU enet packet filter,
00007  * (net/enet.c) distributed as part of 4.3BSD, and code contributed
00008  * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence 
00009  * Berkeley Laboratory.
00010  *
00011  * Redistribution and use in source and binary forms, with or without
00012  * modification, are permitted provided that the following conditions
00013  * are met:
00014  * 1. Redistributions of source code must retain the above copyright
00015  *    notice, this list of conditions and the following disclaimer.
00016  * 2. Redistributions in binary form must reproduce the above copyright
00017  *    notice, this list of conditions and the following disclaimer in the
00018  *    documentation and/or other materials provided with the distribution.
00019  * 3. All advertising materials mentioning features or use of this software
00020  *    must display the following acknowledgement:
00021  *      This product includes software developed by the University of
00022  *      California, Berkeley and its contributors.
00023  * 4. Neither the name of the University nor the names of its contributors
00024  *    may be used to endorse or promote products derived from this software
00025  *    without specific prior written permission.
00026  *
00027  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
00028  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00029  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00030  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
00031  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00032  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00033  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00034  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00035  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00036  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00037  * SUCH DAMAGE.
00038  *
00039  *      @(#)bpf.h       7.1 (Berkeley) 5/7/91
00040  *
00041  * @(#) $Header$ (LBL)
00042  */
00043 
00044 #ifndef BPF_MAJOR_VERSION
00045 
00046 #ifdef __cplusplus
00047 extern "C" {
00048 #endif
00049 
00050 /* BSD style release date */
00051 #define BPF_RELEASE 199606
00052 
00053 typedef int bpf_int32;
00054 typedef u_int bpf_u_int32;
00055 
00056 /*
00057  * Alignment macros.  BPF_WORDALIGN rounds up to the next 
00058  * even multiple of BPF_ALIGNMENT. 
00059  */
00060 #ifndef __NetBSD__
00061 #define BPF_ALIGNMENT sizeof(bpf_int32)
00062 #else
00063 #define BPF_ALIGNMENT sizeof(long)
00064 #endif
00065 #define BPF_WORDALIGN(x) (((x)+(BPF_ALIGNMENT-1))&~(BPF_ALIGNMENT-1))
00066 
00067 #define BPF_MAXINSNS 512
00068 #define BPF_MAXBUFSIZE 0x8000
00069 #define BPF_MINBUFSIZE 32
00070 
00071 /*
00072  *  Structure for BIOCSETF.
00073  */
00074 struct bpf_program {
00075         u_int bf_len;
00076         struct bpf_insn *bf_insns;
00077 };
00078  
00079 /*
00080  * Struct returned by BIOCGSTATS.
00081  */
00082 struct bpf_stat {
00083         u_int bs_recv;          /* number of packets received */
00084         u_int bs_drop;          /* number of packets dropped */
00085 };
00086 
00087 /*
00088  * Struct return by BIOCVERSION.  This represents the version number of 
00089  * the filter language described by the instruction encodings below.
00090  * bpf understands a program iff kernel_major == filter_major &&
00091  * kernel_minor >= filter_minor, that is, if the value returned by the
00092  * running kernel has the same major number and a minor number equal
00093  * equal to or less than the filter being downloaded.  Otherwise, the
00094  * results are undefined, meaning an error may be returned or packets
00095  * may be accepted haphazardly.
00096  * It has nothing to do with the source code version.
00097  */
00098 struct bpf_version {
00099         u_short bv_major;
00100         u_short bv_minor;
00101 };
00102 /* Current version number of filter architecture. */
00103 #define BPF_MAJOR_VERSION 1
00104 #define BPF_MINOR_VERSION 1
00105 
00106 /*
00107  * BPF ioctls
00108  *
00109  * The first set is for compatibility with Sun's pcc style
00110  * header files.  If your using gcc, we assume that you
00111  * have run fixincludes so the latter set should work.
00112  */
00113 #if (defined(sun) || defined(ibm032)) && !defined(__GNUC__)
00114 #define BIOCGBLEN       _IOR(B,102, u_int)
00115 #define BIOCSBLEN       _IOWR(B,102, u_int)
00116 #define BIOCSETF        _IOW(B,103, struct bpf_program)
00117 #define BIOCFLUSH       _IO(B,104)
00118 #define BIOCPROMISC     _IO(B,105)
00119 #define BIOCGDLT        _IOR(B,106, u_int)
00120 #define BIOCGETIF       _IOR(B,107, struct ifreq)
00121 #define BIOCSETIF       _IOW(B,108, struct ifreq)
00122 #define BIOCSRTIMEOUT   _IOW(B,109, struct timeval)
00123 #define BIOCGRTIMEOUT   _IOR(B,110, struct timeval)
00124 #define BIOCGSTATS      _IOR(B,111, struct bpf_stat)
00125 #define BIOCIMMEDIATE   _IOW(B,112, u_int)
00126 #define BIOCVERSION     _IOR(B,113, struct bpf_version)
00127 #define BIOCSTCPF       _IOW(B,114, struct bpf_program)
00128 #define BIOCSUDPF       _IOW(B,115, struct bpf_program)
00129 #else
00130 #define BIOCGBLEN       _IOR('B',102, u_int)
00131 #define BIOCSBLEN       _IOWR('B',102, u_int)
00132 #define BIOCSETF        _IOW('B',103, struct bpf_program)
00133 #define BIOCFLUSH       _IO('B',104)
00134 #define BIOCPROMISC     _IO('B',105)
00135 #define BIOCGDLT        _IOR('B',106, u_int)
00136 #define BIOCGETIF       _IOR('B',107, struct ifreq)
00137 #define BIOCSETIF       _IOW('B',108, struct ifreq)
00138 #define BIOCSRTIMEOUT   _IOW('B',109, struct timeval)
00139 #define BIOCGRTIMEOUT   _IOR('B',110, struct timeval)
00140 #define BIOCGSTATS      _IOR('B',111, struct bpf_stat)
00141 #define BIOCIMMEDIATE   _IOW('B',112, u_int)
00142 #define BIOCVERSION     _IOR('B',113, struct bpf_version)
00143 #define BIOCSTCPF       _IOW('B',114, struct bpf_program)
00144 #define BIOCSUDPF       _IOW('B',115, struct bpf_program)
00145 #endif
00146 
00147 /*
00148  * Structure prepended to each packet.
00149  */
00150 struct bpf_hdr {
00151         struct timeval  bh_tstamp;      /* time stamp */
00152         bpf_u_int32     bh_caplen;      /* length of captured portion */
00153         bpf_u_int32     bh_datalen;     /* original length of packet */
00154         u_short         bh_hdrlen;      /* length of bpf header (this struct
00155                                            plus alignment padding) */
00156 };
00157 /*
00158  * Because the structure above is not a multiple of 4 bytes, some compilers
00159  * will insist on inserting padding; hence, sizeof(struct bpf_hdr) won't work.
00160  * Only the kernel needs to know about it; applications use bh_hdrlen.
00161  */
00162 #if defined(KERNEL) || defined(_KERNEL)
00163 #define SIZEOF_BPF_HDR 18
00164 #endif
00165 
00166 /*
00167  * Data-link level type codes.
00168  */
00169 
00170 /*
00171  * These are the types that are the same on all platforms; on other
00172  * platforms, a <net/bpf.h> should be supplied that defines the additional
00173  * DLT_* codes appropriately for that platform (the BSDs, for example,
00174  * should not just pick up this version of "bpf.h"; they should also define
00175  * the additional DLT_* codes used by their kernels, as well as the values
00176  * defined here - and, if the values they use for particular DLT_ types
00177  * differ from those here, they should use their values, not the ones
00178  * here).
00179  */
00180 #define DLT_NULL        0       /* no link-layer encapsulation */
00181 #define DLT_EN10MB      1       /* Ethernet (10Mb) */
00182 #define DLT_EN3MB       2       /* Experimental Ethernet (3Mb) */
00183 #define DLT_AX25        3       /* Amateur Radio AX.25 */
00184 #define DLT_PRONET      4       /* Proteon ProNET Token Ring */
00185 #define DLT_CHAOS       5       /* Chaos */
00186 #define DLT_IEEE802     6       /* IEEE 802 Networks */
00187 #define DLT_ARCNET      7       /* ARCNET, with BSD-style header */
00188 #define DLT_SLIP        8       /* Serial Line IP */
00189 #define DLT_PPP         9       /* Point-to-point Protocol */
00190 #define DLT_FDDI        10      /* FDDI */
00191 
00192 /*
00193  * These are values from the traditional libpcap "bpf.h".
00194  * Ports of this to particular platforms should replace these definitions
00195  * with the ones appropriate to that platform, if the values are
00196  * different on that platform.
00197  */
00198 #define DLT_ATM_RFC1483 11      /* LLC/SNAP encapsulated atm */
00199 #define DLT_RAW         12      /* raw IP */
00200 
00201 /*
00202  * These are values from BSD/OS's "bpf.h".
00203  * These are not the same as the values from the traditional libpcap
00204  * "bpf.h"; however, these values shouldn't be generated by any
00205  * OS other than BSD/OS, so the correct values to use here are the
00206  * BSD/OS values.
00207  *
00208  * Platforms that have already assigned these values to other
00209  * DLT_ codes, however, should give these codes the values
00210  * from that platform, so that programs that use these codes will
00211  * continue to compile - even though they won't correctly read
00212  * files of these types.
00213  */
00214 #ifdef __NetBSD__
00215 #ifndef DLT_SLIP_BSDOS
00216 #define DLT_SLIP_BSDOS  13      /* BSD/OS Serial Line IP */
00217 #define DLT_PPP_BSDOS   14      /* BSD/OS Point-to-point Protocol */
00218 #endif
00219 #else
00220 #define DLT_SLIP_BSDOS  15      /* BSD/OS Serial Line IP */
00221 #define DLT_PPP_BSDOS   16      /* BSD/OS Point-to-point Protocol */
00222 #endif
00223 
00224 #define DLT_ATM_CLIP    19      /* Linux Classical-IP over ATM */
00225 
00226 /*
00227  * These values are defined by NetBSD; other platforms should refrain from
00228  * using them for other purposes, so that NetBSD savefiles with link
00229  * types of 50 or 51 can be read as this type on all platforms.
00230  */
00231 #define DLT_PPP_SERIAL  50      /* PPP over serial with HDLC encapsulation */
00232 #define DLT_PPP_ETHER   51      /* PPP over Ethernet */
00233 
00234 /*
00235  * Values between 100 and 103 are used in capture file headers as
00236  * link-layer types corresponding to DLT_ types that differ
00237  * between platforms; don't use those values for new DLT_ new types.
00238  */
00239 
00240 /*
00241  * This value was defined by libpcap 0.5; platforms that have defined
00242  * it with a different value should define it here with that value -
00243  * a link type of 104 in a save file will be mapped to DLT_C_HDLC,
00244  * whatever value that happens to be, so programs will correctly
00245  * handle files with that link type regardless of the value of
00246  * DLT_C_HDLC.
00247  *
00248  * The name DLT_C_HDLC was used by BSD/OS; we use that name for source
00249  * compatibility with programs written for BSD/OS.
00250  *
00251  * libpcap 0.5 defined it as DLT_CHDLC; we define DLT_CHDLC as well,
00252  * for source compatibility with programs written for libpcap 0.5.
00253  */
00254 #define DLT_C_HDLC      104     /* Cisco HDLC */
00255 #define DLT_CHDLC       DLT_C_HDLC
00256 
00257 #define DLT_IEEE802_11  105     /* IEEE 802.11 wireless */
00258 
00259 /*
00260  * 106 is reserved for Linux Classical IP over ATM; it's like DLT_RAW,
00261  * except when it isn't.  (I.e., sometimes it's just raw IP, and
00262  * sometimes it isn't.)  We currently handle it as DLT_LINUX_SLL,
00263  * so that we don't have to worry about the link-layer header.)
00264  */
00265 
00266 /*
00267  * Frame Relay; BSD/OS has a DLT_FR with a value of 11, but that collides
00268  * with other values.
00269  * DLT_FR and DLT_FRELAY packets start with the Q.922 Frame Relay header
00270  * (DLCI, etc.).
00271  */
00272 #define DLT_FRELAY      107
00273 
00274 /*
00275  * OpenBSD DLT_LOOP, for loopback devices; it's like DLT_NULL, except
00276  * that the AF_ type in the link-layer header is in network byte order.
00277  *
00278  * OpenBSD defines it as 12, but that collides with DLT_RAW, so we
00279  * define it as 108 here.  If OpenBSD picks up this file, it should
00280  * define DLT_LOOP as 12 in its version, as per the comment above -
00281  * and should not use 108 as a DLT_ value.
00282  */
00283 #define DLT_LOOP        108
00284 
00285 /*
00286  * Values between 109 and 112 are used in capture file headers as
00287  * link-layer types corresponding to DLT_ types that might differ
00288  * between platforms; don't use those values for new DLT_ types
00289  * other than the corresponding DLT_ types.
00290  */
00291 
00292 /*
00293  * This is for Linux cooked sockets.
00294  */
00295 #define DLT_LINUX_SLL   113
00296 
00297 /*
00298  * Apple LocalTalk hardware.
00299  */
00300 #define DLT_LTALK       114
00301 
00302 /*
00303  * Acorn Econet.
00304  */
00305 #define DLT_ECONET      115
00306 
00307 /*
00308  * Reserved for use with OpenBSD ipfilter.
00309  */
00310 #define DLT_IPFILTER    116
00311 
00312 /*
00313  * Reserved for use in capture-file headers as a link-layer type
00314  * corresponding to OpenBSD DLT_PFLOG; DLT_PFLOG is 17 in OpenBSD,
00315  * but that's DLT_LANE8023 in SuSE 6.3, so we can't use 17 for it
00316  * in capture-file headers.
00317  */
00318 #define DLT_PFLOG       117
00319 
00320 /*
00321  * Registered for Cisco-internal use.
00322  */
00323 #define DLT_CISCO_IOS   118
00324 
00325 /*
00326  * Reserved for 802.11 cards using the Prism II chips, with a link-layer
00327  * header including Prism monitor mode information plus an 802.11
00328  * header.
00329  */
00330 #define DLT_PRISM_HEADER        119
00331 
00332 /*
00333  * Reserved for Aironet 802.11 cards, with an Aironet link-layer header
00334  * (see Doug Ambrisko's FreeBSD patches).
00335  */
00336 #define DLT_AIRONET_HEADER      120
00337 
00338 /*
00339  * Reserved for Siemens HiPath HDLC.
00340  */
00341 #define DLT_HHDLC               121
00342 
00343 /*
00344  * This is for RFC 2625 IP-over-Fibre Channel.
00345  *
00346  * This is not for use with raw Fibre Channel, where the link-layer
00347  * header starts with a Fibre Channel frame header; it's for IP-over-FC,
00348  * where the link-layer header starts with an RFC 2625 Network_Header
00349  * field.
00350  */
00351 #define DLT_IP_OVER_FC          122
00352 
00353 /*
00354  * This is for Full Frontal ATM on Solaris with SunATM, with a
00355  * pseudo-header followed by an AALn PDU.
00356  *
00357  * There may be other forms of Full Frontal ATM on other OSes,
00358  * with different pseudo-headers.
00359  *
00360  * If ATM software returns a pseudo-header with VPI/VCI information
00361  * (and, ideally, packet type information, e.g. signalling, ILMI,
00362  * LANE, LLC-multiplexed traffic, etc.), it should not use
00363  * DLT_ATM_RFC1483, but should get a new DLT_ value, so tcpdump
00364  * and the like don't have to infer the presence or absence of a
00365  * pseudo-header and the form of the pseudo-header.
00366  */
00367 #define DLT_SUNATM              123     /* Solaris+SunATM */
00368 
00369 /* 
00370  * Reserved as per request from Kent Dahlgren <kent@praesum.com>
00371  * for private use.
00372  */
00373 #define DLT_RIO                 124     /* RapidIO */
00374 #define DLT_PCI_EXP             125     /* PCI Express */
00375 #define DLT_AURORA              126     /* Xilinx Aurora link layer */
00376 
00377 /*
00378  * For future use with 802.11 captures - defined by AbsoluteValue
00379  * Systems to store a number of bits of link-layer information:
00380  *
00381  *      http://www.shaftnet.org/~pizza/software/capturefrm.txt
00382  *
00383  * but could and arguably should also be used by non-AVS Linux
00384  * 802.11 drivers and BSD drivers; that may happen in the future.
00385  */
00386 #define DLT_IEEE802_11_RADIO    127     /* 802.11 plus WLAN header */
00387 
00388 /*
00389  * Reserved for the TZSP encapsulation, as per request from
00390  * Chris Waters <chris.waters@networkchemistry.com>
00391  * TZSP is a generic encapsulation for any other link type,
00392  * which includes a means to include meta-information
00393  * with the packet, e.g. signal strength and channel
00394  * for 802.11 packets.
00395  */
00396 #define DLT_TZSP                128     /* Tazmen Sniffer Protocol */
00397 
00398 /*
00399  * BSD's ARCNET headers have the source host, destination host,
00400  * and type at the beginning of the packet; that's what's handed
00401  * up to userland via BPF.
00402  *
00403  * Linux's ARCNET headers, however, have a 2-byte offset field
00404  * between the host IDs and the type; that's what's handed up
00405  * to userland via PF_PACKET sockets.
00406  *
00407  * We therefore have to have separate DLT_ values for them.
00408  */
00409 #define DLT_ARCNET_LINUX        129     /* ARCNET */
00410 
00411 /*
00412  * The instruction encodings.
00413  */
00414 /* instruction classes */
00415 #define BPF_CLASS(code) ((code) & 0x07)
00416 #define         BPF_LD          0x00
00417 #define         BPF_LDX         0x01
00418 #define         BPF_ST          0x02
00419 #define         BPF_STX         0x03
00420 #define         BPF_ALU         0x04
00421 #define         BPF_JMP         0x05
00422 #define         BPF_RET         0x06
00423 #define         BPF_MISC        0x07
00424 
00425 /* ld/ldx fields */
00426 #define BPF_SIZE(code)  ((code) & 0x18)
00427 #define         BPF_W           0x00
00428 #define         BPF_H           0x08
00429 #define         BPF_B           0x10
00430 #define BPF_MODE(code)  ((code) & 0xe0)
00431 #define         BPF_IMM         0x00
00432 #define         BPF_ABS         0x20
00433 #define         BPF_IND         0x40
00434 #define         BPF_MEM         0x60
00435 #define         BPF_LEN         0x80
00436 #define         BPF_MSH         0xa0
00437 
00438 /* alu/jmp fields */
00439 #define BPF_OP(code)    ((code) & 0xf0)
00440 #define         BPF_ADD         0x00
00441 #define         BPF_SUB         0x10
00442 #define         BPF_MUL         0x20
00443 #define         BPF_DIV         0x30
00444 #define         BPF_OR          0x40
00445 #define         BPF_AND         0x50
00446 #define         BPF_LSH         0x60
00447 #define         BPF_RSH         0x70
00448 #define         BPF_NEG         0x80
00449 #define         BPF_JA          0x00
00450 #define         BPF_JEQ         0x10
00451 #define         BPF_JGT         0x20
00452 #define         BPF_JGE         0x30
00453 #define         BPF_JSET        0x40
00454 #define BPF_SRC(code)   ((code) & 0x08)
00455 #define         BPF_K           0x00
00456 #define         BPF_X           0x08
00457 
00458 /* ret - BPF_K and BPF_X also apply */
00459 #define BPF_RVAL(code)  ((code) & 0x18)
00460 #define         BPF_A           0x10
00461 
00462 /* misc */
00463 #define BPF_MISCOP(code) ((code) & 0xf8)
00464 #define         BPF_TAX         0x00
00465 #define         BPF_TXA         0x80
00466 
00467 /*
00468  * The instruction data structure.
00469  */
00470 struct bpf_insn {
00471         u_short code;
00472         u_char  jt;
00473         u_char  jf;
00474         bpf_int32 k;
00475 };
00476 
00477 /*
00478  * Macros for insn array initializers.
00479  */
00480 #define BPF_STMT(code, k) { (u_short)(code), 0, 0, k }
00481 #define BPF_JUMP(code, k, jt, jf) { (u_short)(code), jt, jf, k }
00482 
00483 #if defined(BSD) && (defined(KERNEL) || defined(_KERNEL))
00484 /*
00485  * Systems based on non-BSD kernels don't have ifnet's (or they don't mean
00486  * anything if it is in <net/if.h>) and won't work like this.
00487  */
00488 # if __STDC__
00489 extern void bpf_tap(struct ifnet *, u_char *, u_int);
00490 extern void bpf_mtap(struct ifnet *, struct mbuf *);
00491 extern void bpfattach(struct ifnet *, u_int, u_int);
00492 extern void bpfilterattach(int);
00493 # else
00494 extern void bpf_tap();
00495 extern void bpf_mtap();
00496 extern void bpfattach();
00497 extern void bpfilterattach();
00498 # endif /* __STDC__ */
00499 #endif /* BSD && (_KERNEL || KERNEL) */
00500 #if __STDC__ || defined(__cplusplus)
00501 extern int bpf_validate(struct bpf_insn *, int);
00502 extern u_int bpf_filter(struct bpf_insn *, u_char *, u_int, u_int);
00503 #else
00504 extern int bpf_validate();
00505 extern u_int bpf_filter();
00506 #endif
00507 
00508 /*
00509  * Number of scratch memory words (for BPF_LD|BPF_MEM and BPF_ST).
00510  */
00511 #define BPF_MEMWORDS 16
00512 
00513 #ifdef __cplusplus
00514 }
00515 #endif
00516 
00517 #endif

Generated on Sun May 14 14:51:20 2006 by  doxygen 1.4.2