From 781fae35715227add96c7acbfdfc04711c285bde Mon Sep 17 00:00:00 2001 From: guy Date: Sun, 17 Sep 2000 04:04:36 +0000 Subject: Introduce a set of PCAP_ENCAP_ codes to specify packet encapsulations. For those PCAP_ENCAP_ codes corresponding to DLT_ codes that are (believed to be) the same in all BSDs, the PCAP_ENCAP_ codes have the same values as the corresponding DLT_ codes. For those PCAP_ENCAP_ codes corresponding to DLT_ codes that were added in libpcap 0.5 as "non-kernel" DLT_ codes, or had their values changed in libpcap 0.5 in order to cope with the fact that those DLT_ codes have different values in different systems, the PCAP_ENCAP_ codes have the same values as the corresponding DLT_ codes. We add some additional PCAP_ENCAP_ codes to handle IEEE 802.11 (which currently has its link-layer information turned into an Ethernet header by at least some of the BSDs, but John Hawkinson at MIT wants to add a DLT_ value for 802.11 and pass up the full link-layer header) and the Classical IP encapsulation for ATM on Linux (which isn't always the same as DLT_ATM_RFC1483, from what I can tell, alas). "pcap-bpf.c" maps DLT_ codes to PCAP_ENCAP_ codes, so as not to supply to libpcap's callers any DLT_ codes other than the ones that have the same values on all platforms; it supplies PCAP_ENCAP_ codes for all others. In libpcap's "bpf/net/bpf.h", we define the DLT_ values that aren't the same on all platforms with the new values starting at 100 (to keep them out of the way of the values various BSDs might assign to them), as we did in 0.5, but do so only if they're not already defined; platforms with headers that come with the kernel (e.g., the BSDs) should define them with the values that they have always had on that platform, *not* with the values we used in 0.5. (Code using this version of libpcap should check for the new PCAP_ENCAP_ codes; those are given the values that the corresponding DLT_ values had in 0.5, so code that checks for them will handle 0.5 libpcap files correctly even if the platform defines DLT_RAW, say, as something other than 101. If that code also checks for DLT_RAW - which means it can't just use a switch statement, as DLT_RAW might be defined as 101 if the platform doesn't itself define DLT_RAW with some other value - then it will also handle old DLT_RAW captures, as long as they were made on the same platform or on another platform that used the same value for DLT_RAW. It can't handle captures from a platform that uses that value for another DLT_ code, but that's always been the case, and isn't easily fixable.) The intent here is to decouple the values that are returned by "pcap_datalink()" and put into the header of tcpdump/libpcap save files from the DLT_ values returned by BIOCGDLT in BSD kernels, allowing the BSDs to assign values to DLT_ codes, in their kernels, as they choose, without creating more incompatibilities between tcpdump/libpcap save files from different platforms. --- bpf/net/bpf.h | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) (limited to 'bpf') diff --git a/bpf/net/bpf.h b/bpf/net/bpf.h index 29cf313..3e90b95 100644 --- a/bpf/net/bpf.h +++ b/bpf/net/bpf.h @@ -37,7 +37,7 @@ * * @(#)bpf.h 7.1 (Berkeley) 5/7/91 * - * @(#) $Header: /tcpdump/master/libpcap/bpf/net/Attic/bpf.h,v 1.38 2000-06-26 04:56:28 assar Exp $ (LBL) + * @(#) $Header: /tcpdump/master/libpcap/bpf/net/Attic/bpf.h,v 1.39 2000-09-17 04:04:39 guy Exp $ (LBL) */ #ifndef BPF_MAJOR_VERSION @@ -160,6 +160,12 @@ struct bpf_hdr { /* * Data-link level type codes. + * These are the types that are the same on all platforms; on other + * platforms, a should be supplied that defines the additional + * DLT_* codes appropriately for that platform (the BSDs, for example, + * should not just pick up this version of "bpf.h"; they should also define + * the additional DLT_* codes used by their kernels, as well as the values + * defined here). */ #define DLT_NULL 0 /* no link-layer encapsulation */ #define DLT_EN10MB 1 /* Ethernet (10Mb) */ @@ -172,20 +178,39 @@ struct bpf_hdr { #define DLT_SLIP 8 /* Serial Line IP */ #define DLT_PPP 9 /* Point-to-point Protocol */ #define DLT_FDDI 10 /* FDDI */ -#ifdef __FreeBSD__ -#define DLT_ATM_RFC1483 11 /* LLC/SNAP encapsulated atm */ -#endif -#ifdef __OpenBSD__ -#define DLT_ATM_RFC1483 11 /* LLC/SNAP encapsulated atm */ -#define DLT_LOOP 12 /* loopback */ -#endif -/* offset to avoid collision with BSD/OS values */ +#define DLT_ATM_CLIP 19 /* Linux Classical-IP over ATM */ + +/* + * These are the values that were traditionally defined in , + * but that are not the same on all platforms; if they are not already + * defined (e.g., defined above because this is a BSD that defines them + * for use in its kernel), we define them to have the appropriate + * PCAP_ENCAP_* value from , so that programs using those DLT_ + * codes will continue to compile and will be able to read capture files + * from the current version of libpcap. + */ #ifndef DLT_ATM_RFC1483 #define DLT_ATM_RFC1483 100 /* LLC/SNAP encapsulated atm */ #endif +#ifndef DLT_RAW #define DLT_RAW 101 /* raw IP */ +#endif + +/* + * NOTE: these two values were defined by LBL libpcap, but with values + * that didn't seem to correspond to the values that were used in BSD/OS; + * neither of them are, as far as I know, used in any kernel, so they + * should not be defined above. We therefore don't bother checking to + * see if they're already defined. + */ #define DLT_SLIP_BSDOS 102 /* BSD/OS Serial Line IP */ #define DLT_PPP_BSDOS 103 /* BSD/OS Point-to-point Protocol */ + +/* + * This value was defined by libpcap 0.5; we now use it as a DLT_* value + * solely for backwards compatibility - new programs should use + * PCAP_ENCAP_C_HDLC instead. + */ #define DLT_CHDLC 104 /* Cisco HDLC */ /* -- cgit v1.2.3