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