Merge branch 'vendor/LIBPCAP'
authorPeter Avalos <pavalos@dragonflybsd.org>
Mon, 23 Jan 2012 00:08:22 +0000 (16:08 -0800)
committerPeter Avalos <pavalos@dragonflybsd.org>
Mon, 23 Jan 2012 00:08:22 +0000 (16:08 -0800)
103 files changed:
contrib/libpcap/CHANGES
contrib/libpcap/README
contrib/libpcap/README.DELETED
contrib/libpcap/VERSION
contrib/libpcap/arcnet.h
contrib/libpcap/atmuni31.h
contrib/libpcap/bpf/net/bpf_filter.c
contrib/libpcap/bpf_dump.c
contrib/libpcap/bpf_image.c
contrib/libpcap/etherent.c
contrib/libpcap/ethertype.h
contrib/libpcap/fad-getad.c
contrib/libpcap/gencode.c
contrib/libpcap/gencode.h
contrib/libpcap/grammar.y
contrib/libpcap/ieee80211.h [new file with mode: 0644]
contrib/libpcap/inet.c
contrib/libpcap/llc.h
contrib/libpcap/nametoaddr.c
contrib/libpcap/nlpid.h
contrib/libpcap/optimize.c
contrib/libpcap/pcap-bpf.c
contrib/libpcap/pcap-bpf.h [copied from contrib/libpcap/arcnet.h with 67% similarity]
contrib/libpcap/pcap-common.c [new file with mode: 0644]
contrib/libpcap/pcap-common.h [new file with mode: 0644]
contrib/libpcap/pcap-filter.manmisc.in
contrib/libpcap/pcap-int.h
contrib/libpcap/pcap-linktype.manmisc.in
contrib/libpcap/pcap-namedb.h
contrib/libpcap/pcap-savefile.manfile.in
contrib/libpcap/pcap-tstamp.manmisc.in [new file with mode: 0644]
contrib/libpcap/pcap.3pcap.in
contrib/libpcap/pcap.c
contrib/libpcap/pcap.h
contrib/libpcap/pcap/bluetooth.h [copied from contrib/libpcap/pcap/usb.h with 54% similarity]
contrib/libpcap/pcap/bpf.h [new file with mode: 0644]
contrib/libpcap/pcap/ipnet.h [copied from contrib/libpcap/arcnet.h with 67% similarity]
contrib/libpcap/pcap/namedb.h
contrib/libpcap/pcap/pcap.h
contrib/libpcap/pcap/sll.h
contrib/libpcap/pcap/usb.h
contrib/libpcap/pcap/vlan.h [copied from contrib/libpcap/pcap-namedb.h with 69% similarity]
contrib/libpcap/pcap_activate.3pcap
contrib/libpcap/pcap_breakloop.3pcap
contrib/libpcap/pcap_can_set_rfmon.3pcap
contrib/libpcap/pcap_close.3pcap
contrib/libpcap/pcap_compile.3pcap.in
contrib/libpcap/pcap_create.3pcap
contrib/libpcap/pcap_datalink.3pcap.in
contrib/libpcap/pcap_datalink_name_to_val.3pcap
contrib/libpcap/pcap_datalink_val_to_name.3pcap
contrib/libpcap/pcap_dump.3pcap
contrib/libpcap/pcap_dump_close.3pcap
contrib/libpcap/pcap_dump_file.3pcap
contrib/libpcap/pcap_dump_flush.3pcap
contrib/libpcap/pcap_dump_ftell.3pcap
contrib/libpcap/pcap_dump_open.3pcap.in
contrib/libpcap/pcap_file.3pcap
contrib/libpcap/pcap_fileno.3pcap
contrib/libpcap/pcap_findalldevs.3pcap
contrib/libpcap/pcap_free_datalinks.3pcap [deleted file]
contrib/libpcap/pcap_freealldevs.3pcap [deleted file]
contrib/libpcap/pcap_freecode.3pcap
contrib/libpcap/pcap_get_selectable_fd.3pcap
contrib/libpcap/pcap_geterr.3pcap
contrib/libpcap/pcap_inject.3pcap
contrib/libpcap/pcap_is_swapped.3pcap
contrib/libpcap/pcap_lib_version.3pcap
contrib/libpcap/pcap_list_datalinks.3pcap.in
contrib/libpcap/pcap_list_tstamp_types.3pcap.in [copied from contrib/libpcap/pcap_list_datalinks.3pcap.in with 61% similarity]
contrib/libpcap/pcap_lookupdev.3pcap
contrib/libpcap/pcap_lookupnet.3pcap
contrib/libpcap/pcap_loop.3pcap
contrib/libpcap/pcap_major_version.3pcap
contrib/libpcap/pcap_next_ex.3pcap
contrib/libpcap/pcap_offline_filter.3pcap
contrib/libpcap/pcap_open_dead.3pcap.in
contrib/libpcap/pcap_open_live.3pcap
contrib/libpcap/pcap_open_offline.3pcap.in
contrib/libpcap/pcap_set_buffer_size.3pcap
contrib/libpcap/pcap_set_datalink.3pcap
contrib/libpcap/pcap_set_promisc.3pcap
contrib/libpcap/pcap_set_rfmon.3pcap
contrib/libpcap/pcap_set_snaplen.3pcap
contrib/libpcap/pcap_set_timeout.3pcap
contrib/libpcap/pcap_set_tstamp_type.3pcap.in [copied from contrib/libpcap/pcap_set_buffer_size.3pcap with 53% similarity]
contrib/libpcap/pcap_setdirection.3pcap
contrib/libpcap/pcap_setfilter.3pcap
contrib/libpcap/pcap_setnonblock.3pcap
contrib/libpcap/pcap_snapshot.3pcap
contrib/libpcap/pcap_stats.3pcap
contrib/libpcap/pcap_statustostr.3pcap
contrib/libpcap/pcap_strerror.3pcap
contrib/libpcap/pcap_tstamp_type_name_to_val.3pcap [copied from contrib/libpcap/pcap_close.3pcap with 71% similarity]
contrib/libpcap/pcap_tstamp_type_val_to_name.3pcap [copied from contrib/libpcap/pcap_datalink_val_to_name.3pcap with 67% similarity]
contrib/libpcap/ppp.h
contrib/libpcap/savefile.c
contrib/libpcap/scanner.l
contrib/libpcap/sf-pcap-ng.c [new file with mode: 0644]
contrib/libpcap/sf-pcap-ng.h [copied from contrib/libpcap/bpf_dump.c with 55% similarity]
contrib/libpcap/sf-pcap.c [new file with mode: 0644]
contrib/libpcap/sf-pcap.h [copied from contrib/libpcap/bpf_dump.c with 55% similarity]
contrib/libpcap/sunatmpos.h

index dc4e006..3c82052 100644 (file)
@@ -1,4 +1,151 @@
-@(#) $Header: /tcpdump/master/libpcap/CHANGES,v 1.67.2.4 2008-10-28 00:27:42 ken Exp $ (LBL)
+Friday  December 9, 2011.  guy@alum.mit.edu.
+Summary for 1.2.1 libpcap release
+       Update README file.
+       Fix typoes in README.linux file.
+       Clean up some compiler warnings.
+       Fix Linux compile problems and tests for ethtool.h.
+       Treat Debian/kFreeBSD and GNU/Hurd as systems with GNU
+        toolchains.
+       Support 802.1 QinQ as a form of VLAN in filters.
+       Treat "carp" as equivalent to "vrrp" in filters.
+       Fix code generated for "ip6 protochain".
+       Add some new link-layer header types.
+       Support capturing NetFilter log messages on Linux.
+       Clean up some error messages.
+       Turn off monitor mode on exit for mac80211 interfaces on Linux.
+       Fix problems turning monitor mode on for non-mac80211 interfaces
+        on Linux.
+       Properly fail if /sys/class/net or /proc/net/dev exist but can't
+        be opened.
+       Fail if pcap_activate() is called on an already-activated
+        pcap_t, and add a test program for that.
+       Fix filtering in pcap-ng files.
+       Don't build for PowerPC on Mac OS X Lion.
+       Simplify handling of new DLT_/LINKTYPE_ values.
+       Expand pcap(3PCAP) man page.
+
+Sunday  July 24, 2011.  mcr@sandelman.ca.
+Summary for 1.2 libpcap release
+        All of the changes listed below for 1.1.1 and 1.1.2.
+        Changes to error handling for pcap_findalldevs().
+        Fix the calculation of the frame size in memory-mapped captures.
+        Add a link-layer header type for STANAG 5066 D_PDUs.
+        Add a link-layer type for a variant of 3GPP TS 27.010.
+        Noted real nature of LINKTYPE_ARCNET.
+        Add a link-layer type for DVB-CI.
+        Fix configure-script discovery of VLAN acceleration support.
+         see http://netoptimizer.blogspot.com/2010/09/tcpdump-vs-vlan-tags.html
+        Linux, HP-UX, AIX, NetBSD and OpenBSD compilation/conflict fixes.
+        Protect against including AIX 5.x's <net/bpf.h> having been included.
+        Add DLT_DBUS, for raw D-Bus messages.
+        Treat either EPERM or EACCES as "no soup for you".
+        Changes to permissions on DLPI systems.
+        Add DLT_IEEE802_15_4_NOFCS for 802.15.4 interfaces.
+
+Fri.    August 6, 2010.  guy@alum.mit.edu.
+Summary for 1.1.2 libpcap release
+       Return DLT_ values, not raw LINKTYPE_ values from
+         pcap_datalink() when reading pcap-ng files
+       Add support for "wlan ra" and "wlan ta", to check the RA and TA
+         of WLAN frames that have them
+       Don't crash if "wlan addr{1,2,3,4}" are used without 802.11
+         headers
+       Do filtering on USB and Bluetooth capturing
+       On FreeBSD/SPARC64, use -fPIC - it's apparently necessary
+       Check for valid port numbers (fit in a 16-bit unsigned field) in
+         "port" filters
+       Reject attempts to put savefiles into non-blocking mode
+       Check for "no such device" for the "get the media types" ioctl
+         in *BSD
+       Improve error messages from bpf_open(), and let it do the error
+         handling
+       Return more specific errors from pcap_can_set_rfmon(); fix
+         documentation
+       Update description fetching code for FreeBSD, fix code for
+         OpenBSD
+       Ignore /sys/net/dev files if we get ENODEV for them, not just
+         ENXIO; fixes handling of bonding devices on Linux
+       Fix check for a constant 0 argument to BPF_DIV
+       Use the right version of ar when cross-building
+       Free any filter set on a savefile when the savefile is closed
+       Include the CFLAGS setting when configure was run in the
+         compiler flags
+       Add support for 802.15.4 interfaces on Linux
+
+Thu.    April 1, 2010.  guy@alum.mit.edu.
+Summary for 1.1.1 libpcap release
+       Update CHANGES to reflect more of the changes in 1.1.0.
+       Fix build on RHEL5.
+       Fix shared library build on AIX.
+
+Thu.   March 11, 2010.  ken@netfunctional.ca/guy@alum.mit.edu.
+Summary for 1.1.0 libpcap release
+       Add SocketCAN capture support
+       Add Myricom SNF API support
+       Update Endace DAG and ERF support
+       Add support for shared libraries on Solaris, HP-UX, and AIX
+       Build, install, and un-install shared libraries by default;
+         don't build/install shared libraries on platforms we don't support
+       Fix building from a directory other than the source directory
+       Fix compiler warnings and builds on some platforms
+       Update config.guess and config.sub
+       Support monitor mode on mac80211 devices on Linux
+       Fix USB memory-mapped capturing on Linux; it requires a new DLT_
+         value
+       On Linux, scan /sys/class/net for devices if we have it; scan
+         it, or /proc/net/dev if we don't have /sys/class/net, even if
+         we have getifaddrs(), as it'll find interfaces with no
+         addresses
+       Add limited support for reading pcap-ng files
+       Fix BPF driver-loading error handling on AIX
+       Support getting the full-length interface description on FreeBSD
+       In the lexical analyzer, free up any addrinfo structure we got back
+         from getaddrinfo().
+       Add support for BPF and libdlpi in OpenSolaris (and SXCE)
+       Hyphenate "link-layer" everywhere
+       Add /sys/kernel/debug/usb/usbmon to the list of usbmon locations
+       In pcap_read_linux_mmap(), if there are no frames available, call
+         poll() even if we're in non-blocking mode, so we pick up
+         errors, and check for the errors in question.
+       Note that poll() works on BPF devices is Snow Leopard
+       If an ENXIO or ENETDOWN is received, it may mean the device has
+         gone away.  Deal with it.
+       For BPF, raise the default capture buffer size to from 32k to 512k
+       Support ps_ifdrop on Linux
+       Added a bunch of #ifdef directives to make wpcap.dll (WinPcap) compile
+        under cygwin.
+       Changes to Linux mmapped captures.
+       Fix bug where create_ring would fail for particular snaplen and
+         buffer size combinations
+       Update pcap-config so that it handles libpcap requiring
+         additional libraries
+       Add workaround for threadsafeness on Windows
+       Add missing mapping for DLT_ENC <-> LINKTYPE_ENC
+       DLT: Add DLT_CAN_SOCKETCAN
+       DLT: Add Solaris ipnet
+       Don't check for DLT_IPNET if it's not defined
+       Add link-layer types for Fibre Channel FC-2
+       Add link-layer types for Wireless HART
+       Add link-layer types for AOS
+       Add link-layer types for DECT
+       Autoconf fixes (AIX, HP-UX, OSF/1, Tru64 cleanups)
+       Install headers unconditionally, and include vlan.h/bluetooth.h if
+         enabled
+       Autoconf fixes+cleanup
+       Support enabling/disabling bluetooth (--{en,dis}able-bluetooth)
+       Support disabling SITA support (--without-sita)
+       Return -1 on failure to create packet ring (if supported but
+         creation failed)
+       Fix handling of 'any' device, so that it can be opened, and no longer
+         attempt to open it in Monitor mode
+       Add support for snapshot length for USB Memory-Mapped Interface
+       Fix configure and build on recent Linux kernels
+       Fix memory-mapped Linux capture to support pcap_next() and
+         pcap_next_ex()
+       Fixes for Linux USB capture
+       DLT: Add DLT_LINUX_EVDEV
+       DLT: Add DLT_GSMTAP_UM
+       DLT: Add DLT_GSMTAP_ABIS
 
 Mon.    October 27, 2008.  ken@netfunctional.ca.  Summary for 1.0.0 libpcap release
        Compile with IPv6 support by default
@@ -12,7 +159,10 @@ Mon.    October 27, 2008.  ken@netfunctional.ca.  Summary for 1.0.0 libpcap rele
        Variable length 802.11 header support
        X2E data type support 
        SITA ACN Interface support - see README.sita
+       Support for memory-mapped capture on Linux
        Support for zerocopy BPF on platforms that support it
+       Support for setting buffer size when opening devices
+       Support for setting monitor mode when opening 802.11 devices
        Better support for dealing with VLAN tagging/stripping on Linux
        Fix dynamic library support on OSX
        Return PCAP_ERROR_IFACE_NOT_UP if the interface isn't 'UP', so applications
@@ -22,7 +172,7 @@ Mon.    October 27, 2008.  ken@netfunctional.ca.  Summary for 1.0.0 libpcap rele
        On Linux, ignore ENETDOWN so we can continue to capture packets if the 
         interface goes down and comes back up again.
        On Linux, support new tpacket frame headers (2.6.27+)
-       On Mac OS X, add scripts for changing permissions on /dev/pbf* and launchd plist
+       On Mac OS X, add scripts for changing permissions on /dev/bpf* and launchd plist
        On Solaris, support 'passive mode' on systems that support it
        Fixes to autoconf and general build environment
        Man page reorganization + cleanup
index ee1a141..a206474 100644 (file)
@@ -1,19 +1,17 @@
-@(#) $Header: /tcpdump/master/libpcap/README,v 1.30.4.3 2008-10-17 10:39:20 ken Exp $ (LBL)
+@(#) $Header: /tcpdump/master/libpcap/README,v 1.34 2008-12-14 19:44:14 guy Exp $ (LBL)
 
-LIBPCAP 1.0.0
+LIBPCAP 1.x.y
 
 www.tcpdump.org
 
 Please send inquiries/comments/reports to:
        tcpdump-workers@lists.tcpdump.org
 
-Anonymous CVS is available via:
-       cvs -d :pserver:tcpdump@cvs.tcpdump.org:/tcpdump/master login
-       (password "anoncvs")
-       cvs -d :pserver:tcpdump@cvs.tcpdump.org:/tcpdump/master checkout libpcap
+Anonymous Git is available via:
+       git clone git://bpf.tcpdump.org/libpcap
 
-Version 1.0.0 of LIBPCAP can be retrieved with the CVS tag "libpcap_1_0":
-       cvs -d :pserver:tcpdump@cvs.tcpdump.org:/tcpdump/master checkout -r libpcap_1_0 libpcap
+Version 1.x.y of LIBPCAP can be retrieved with the CVS tag "libpcap_1_{x}rel{y}":
+       cvs -d :pserver:tcpdump@cvs.tcpdump.org:/tcpdump/master checkout -r libpcap_1_{x}rel{y} libpcap
 
 Please submit patches against the master copy to the libpcap project on
 sourceforge.net.
@@ -65,13 +63,14 @@ added overhead (especially, for selective filters).  Ideally, libpcap
 would translate BPF filters into a filter program that is compatible
 with the underlying kernel subsystem, but this is not yet implemented.
 
-BPF is standard in 4.4BSD, BSD/OS, NetBSD, FreeBSD, and OpenBSD.  DEC
-OSF/1/Digital UNIX/Tru64 UNIX uses the packetfilter interface but has
-been extended to accept BPF filters (which libpcap utilizes).  Also, you
-can add BPF filter support to Ultrix using the kernel source and/or
-object patches available in:
+BPF is standard in 4.4BSD, BSD/OS, NetBSD, FreeBSD, OpenBSD, DragonFly
+BSD, and Mac OS X; an older, modified and undocumented version is
+standard in AIX.  {DEC OSF/1, Digital UNIX, Tru64 UNIX} uses the
+packetfilter interface but has been extended to accept BPF filters
+(which libpcap utilizes).  Also, you can add BPF filter support to
+Ultrix using the kernel source and/or object patches available in:
 
-       ftp://gatekeeper.dec.com/pub/DEC/net/bpfext42.tar.Z.
+       http://www.tcpdump.org/other/bpfext42.tar.Z
 
 Linux, in the 2.2 kernel and later kernels, has a "Socket Filter"
 mechanism that accepts BPF filters; see the README.linux file for
@@ -80,10 +79,10 @@ information on configuring that option.
 Note to Linux distributions and *BSD systems that include libpcap:
 
 There's now a rule to make a shared library, which should work on Linux 
-and *BSD (and OS X).
+and *BSD, among other platforms.
 
 It sets the soname of the library to "libpcap.so.1"; this is what it 
-should be, *NOT* libpcap.so.1.0 or libpcap.so.1.0.0 or something such as 
+should be, *NOT* libpcap.so.1.x or libpcap.so.1.x.y or something such as 
 that.
 
 We've been maintaining binary compatibility between libpcap releases for 
index f6a678a..bade67d 100644 (file)
@@ -14,9 +14,7 @@ README.tru64
 SUNOS4/
 TODO
 Win32/
-acconfig.h
 aclocal.m4
-bpf_filter.c
 chmod_bpf
 config.guess
 config.h.in
@@ -30,23 +28,17 @@ fad-glifc.c
 fad-null.c
 fad-sita.c
 fad-win32.c
-filtertest.c
-findalldevstest.c
-ieee80211.h
 install-sh
 lbl/
 missing/
 mkdep
 msdos/
-net/
 org.tcpdump.chmod_bpf.plist
 packaging/
-pcap/bluetooth.h
-pcap/bpf.h
-pcap/vlan.h
-pcap-bpf.h
 pcap-bt-linux.c
 pcap-bt-linux.h
+pcap-can-linux.c
+pcap-can-linux.h
 pcap-config.1
 pcap-config.in
 pcap-dag.c
@@ -57,6 +49,8 @@ pcap-dos.h
 pcap-enet.c
 pcap-libdlpi.c
 pcap-linux.c
+pcap-netfilter-linux.c
+pcap-netfilter-linux.h
 pcap-nit.c
 pcap-null.c
 pcap-pf.c
@@ -65,6 +59,8 @@ pcap-septel.h
 pcap-sita.c
 pcap-sita.h
 pcap-sita.html
+pcap-snf.c
+pcap-snf.h
 pcap-snit.c
 pcap-snoop.c
 pcap-stdinc.h
@@ -72,3 +68,4 @@ pcap-usb-linux.c
 pcap-usb-linux.h
 pcap-win32.c
 runlex.sh
+tests/
index dce7335..4f86043 100644 (file)
@@ -30,7 +30,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * @(#) $Id: arcnet.h,v 1.2 2001/04/24 02:17:52 guy Exp $ (LBL)
+ * @(#) $Id: arcnet.h,v 1.2 2001-04-24 02:17:52 guy Exp $ (LBL)
  *
  * from: NetBSD: if_arc.h,v 1.13 1999/11/19 20:41:19 thorpej Exp
  */
index 11242b8..880cc1a 100644 (file)
@@ -29,7 +29,7 @@
  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/atmuni31.h,v 1.1.6.2 2007/10/22 19:30:14 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/atmuni31.h,v 1.3 2007-10-22 19:28:58 guy Exp $ (LBL)
  */
 
 /* Based on UNI3.1 standard by ATM Forum */
index 6094eb3..a1a5228 100644 (file)
@@ -40,7 +40,7 @@
 
 #if !(defined(lint) || defined(KERNEL) || defined(_KERNEL))
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/bpf/net/bpf_filter.c,v 1.45.2.1 2008/01/02 04:22:16 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/bpf/net/bpf_filter.c,v 1.46 2008-01-02 04:16:46 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -53,6 +53,15 @@ static const char rcsid[] _U_ =
 
 #else /* WIN32 */
 
+#if HAVE_INTTYPES_H
+#include <inttypes.h>
+#elif HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
+
 #include <sys/param.h>
 #include <sys/types.h>
 #include <sys/time.h>
@@ -65,9 +74,9 @@ static const char rcsid[] _U_ =
 # define       m_next  b_cont
 # define       MLEN(m) ((m)->b_wptr - (m)->b_rptr)
 # define       mtod(m,t)       ((t)(m)->b_rptr)
-#else
+#else /* defined(__hpux) || SOLARIS */
 # define       MLEN(m) ((m)->m_len)
-#endif
+#endif /* defined(__hpux) || SOLARIS */
 
 #endif /* WIN32 */
 
@@ -396,7 +405,18 @@ bpf_filter(pc, p, wirelen, buflen)
                        continue;
 
                case BPF_JMP|BPF_JA:
+#if defined(KERNEL) || defined(_KERNEL)
+                       /*
+                        * No backward jumps allowed.
+                        */
                        pc += pc->k;
+#else
+                       /*
+                        * XXX - we currently implement "ip6 protochain"
+                        * with backward jumps, so sign-extend pc->k.
+                        */
+                       pc += (bpf_int32)pc->k;
+#endif
                        continue;
 
                case BPF_JMP|BPF_JGT|BPF_K:
@@ -599,7 +619,7 @@ bpf_validate(f, len)
                                /*
                                 * Check for constant division by 0.
                                 */
-                               if (BPF_RVAL(p->code) == BPF_K && p->k == 0)
+                               if (BPF_SRC(p->code) == BPF_K && p->k == 0)
                                        return 0;
                                break;
                        default:
index 5c0033d..e4ff4a2 100644 (file)
@@ -20,7 +20,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/bpf_dump.c,v 1.14.4.1 2008/01/02 04:22:16 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/bpf_dump.c,v 1.15 2008-01-02 04:16:46 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
index 91f7cef..e2f1a77 100644 (file)
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/bpf_image.c,v 1.27.2.1 2008/01/02 04:22:16 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/bpf_image.c,v 1.28 2008-01-02 04:16:46 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
+#ifdef WIN32
+#include <pcap-stdinc.h>
+#else /* WIN32 */
+#if HAVE_INTTYPES_H
+#include <inttypes.h>
+#elif HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
+#include <sys/types.h>
+#endif /* WIN32 */
+
 #include <stdio.h>
 #include <string.h>
 
index 27e5502..d9de114 100644 (file)
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/etherent.c,v 1.23 2006/10/04 18:09:22 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/etherent.c,v 1.23 2006-10-04 18:09:22 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
+#ifdef WIN32
+#include <pcap-stdinc.h>
+#else /* WIN32 */
+#if HAVE_INTTYPES_H
+#include <inttypes.h>
+#elif HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
 #include <sys/types.h>
+#endif /* WIN32 */
 
 #include <ctype.h>
 #include <memory.h>
index 867d33e..2d6bbeb 100644 (file)
@@ -18,7 +18,7 @@
  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/ethertype.h,v 1.14 2005/09/05 09:06:58 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/ethertype.h,v 1.14 2005-09-05 09:06:58 guy Exp $ (LBL)
  */
 
 /*
 #ifndef        ETHERTYPE_LOOPBACK
 #define        ETHERTYPE_LOOPBACK      0x9000
 #endif
+#ifndef ETHERTYPE_8021QINQ
+#define ETHERTYPE_8021QINQ     0x9100
+#endif
index 2ce6d70..742ae1f 100644 (file)
@@ -34,7 +34,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/fad-getad.c,v 1.12 2007/09/14 00:44:55 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/fad-getad.c,v 1.12 2007-09-14 00:44:55 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -61,12 +61,21 @@ static const char rcsid[] _U_ =
 #endif
 
 #ifdef AF_PACKET
+# ifdef HAVE_NETPACKET_PACKET_H
+/* Solaris 11 and later, Linux distributions with newer glibc */
+#  include <netpacket/packet.h>
+# else /* HAVE_NETPACKET_PACKET_H */
+/* LynxOS, Linux distributions with older glibc */
 # ifdef __Lynx__
-#  include <netpacket/if_packet.h>     /* LynxOS */
-# else
-#  include <linux/if_packet.h>         /* Linux */
-# endif
-#endif
+/* LynxOS */
+#  include <netpacket/if_packet.h>
+# else /* __Lynx__ */
+/* Linux */
+#  include <linux/types.h>
+#  include <linux/if_packet.h>
+# endif /* __Lynx__ */
+# endif /* HAVE_NETPACKET_PACKET_H */
+#endif /* AF_PACKET */
 
 /*
  * This is fun.
index bd38224..2a0fb51 100644 (file)
@@ -21,7 +21,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.290.2.16 2008-09-22 20:16:01 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.309 2008-12-23 20:13:29 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -31,6 +31,14 @@ static const char rcsid[] _U_ =
 #ifdef WIN32
 #include <pcap-stdinc.h>
 #else /* WIN32 */
+#if HAVE_INTTYPES_H
+#include <inttypes.h>
+#elif HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
 #include <sys/types.h>
 #include <sys/socket.h>
 #endif /* WIN32 */
@@ -39,7 +47,7 @@ static const char rcsid[] _U_ =
  * XXX - why was this included even on UNIX?
  */
 #ifdef __MINGW32__
-#include "IP6_misc.h"
+#include "ip6_misc.h"
 #endif
 
 #ifndef WIN32
@@ -49,6 +57,7 @@ static const char rcsid[] _U_ =
 #endif
 
 #include <netinet/in.h>
+#include <arpa/inet.h>
 
 #endif /* WIN32 */
 
@@ -73,6 +82,7 @@ static const char rcsid[] _U_ =
 #include "sunatmpos.h"
 #include "ppp.h"
 #include "pcap/sll.h"
+#include "pcap/ipnet.h"
 #include "arcnet.h"
 #ifdef HAVE_NET_PFVAR_H
 #include <sys/socket.h>
@@ -158,6 +168,17 @@ enum e_offrel {
        OR_TRAN_IPV6    /* relative to the transport-layer header, with IPv6 network layer */
 };
 
+#ifdef INET6
+/*
+ * As errors are handled by a longjmp, anything allocated must be freed
+ * in the longjmp handler, so it must be reachable from that handler.
+ * One thing that's allocated is the result of pcap_nametoaddrinfo();
+ * it must be freed with freeaddrinfo().  This variable points to any
+ * addrinfo structure that would need to be freed.
+ */
+static struct addrinfo *ai;
+#endif
+
 /*
  * We divy out chunks of memory rather than call malloc each time so
  * we don't have to worry about leaking memory.  It's probably
@@ -203,6 +224,7 @@ static struct block *gen_uncond(int);
 static inline struct block *gen_true(void);
 static inline struct block *gen_false(void);
 static struct block *gen_ether_linktype(int);
+static struct block *gen_ipnet_linktype(int);
 static struct block *gen_linux_sll_linktype(int);
 static struct slist *gen_load_prism_llprefixlen(void);
 static struct slist *gen_load_avs_llprefixlen(void);
@@ -368,11 +390,35 @@ syntax()
 static bpf_u_int32 netmask;
 static int snaplen;
 int no_optimize;
+#ifdef WIN32
+static int
+pcap_compile_unsafe(pcap_t *p, struct bpf_program *program,
+            const char *buf, int optimize, bpf_u_int32 mask);
 
 int
 pcap_compile(pcap_t *p, struct bpf_program *program,
             const char *buf, int optimize, bpf_u_int32 mask)
 {
+       int result;
+
+       EnterCriticalSection(&g_PcapCompileCriticalSection);
+
+       result = pcap_compile_unsafe(p, program, buf, optimize, mask);
+
+       LeaveCriticalSection(&g_PcapCompileCriticalSection);
+       
+       return result;
+}
+
+static int
+pcap_compile_unsafe(pcap_t *p, struct bpf_program *program,
+            const char *buf, int optimize, bpf_u_int32 mask)
+#else /* WIN32 */
+int
+pcap_compile(pcap_t *p, struct bpf_program *program,
+            const char *buf, int optimize, bpf_u_int32 mask)
+#endif /* WIN32 */
+{
        extern int n_errors;
        const char * volatile xbuf = buf;
        int len;
@@ -383,6 +429,12 @@ pcap_compile(pcap_t *p, struct bpf_program *program,
        bpf_pcap = p;
        init_regs();
        if (setjmp(top_ctx)) {
+#ifdef INET6
+               if (ai != NULL) {
+                       freeaddrinfo(ai);
+                       ai = NULL;
+               }
+#endif
                lex_cleanup();
                freechunks();
                return (-1);
@@ -723,7 +775,8 @@ static int reg_off_ll;
  * This is the offset of the beginning of the MAC-layer header from
  * the beginning of the link-layer header.
  * It's usually 0, except for ATM LANE, where it's the offset, relative
- * to the beginning of the raw packet data, of the Ethernet header.
+ * to the beginning of the raw packet data, of the Ethernet header, and
+ * for Ethernet with various additional information.
  */
 static u_int off_mac;
 
@@ -1115,6 +1168,8 @@ init_linktype(p)
                return;
 
        case DLT_RAW:
+       case DLT_IPV4:
+       case DLT_IPV6:
                off_linktype = -1;
                off_macpl = 0;
                off_nl = 0;
@@ -1187,26 +1242,6 @@ init_linktype(p)
                off_nl_nosnap = 0;      /* no 802.2 LLC */
                return;
 
-       case DLT_LINUX_IRDA:
-               /*
-                * Currently, only raw "link[N:M]" filtering is supported.
-                */
-               off_linktype = -1;
-               off_macpl = -1;
-               off_nl = -1;
-               off_nl_nosnap = -1;
-               return;
-
-       case DLT_DOCSIS:
-               /*
-                * Currently, only raw "link[N:M]" filtering is supported.
-                */
-               off_linktype = -1;
-               off_macpl = -1;
-               off_nl = -1;
-               off_nl_nosnap = -1;
-               return;
-
        case DLT_SYMANTEC_FIREWALL:
                off_linktype = 6;
                off_macpl = 44;
@@ -1315,6 +1350,16 @@ init_linktype(p)
                off_nl_nosnap = -1;
                return;
 
+       case DLT_JUNIPER_VS:
+       case DLT_JUNIPER_SRX_E2E:
+       case DLT_JUNIPER_FIBRECHANNEL:
+       case DLT_JUNIPER_ATM_CEMIC:
+               off_linktype = 8;
+               off_macpl = -1;
+               off_nl = -1;
+               off_nl_nosnap = -1;
+               return;
+
        case DLT_MTP2:
                off_li = 2;
                off_sio = 3;
@@ -1360,146 +1405,54 @@ init_linktype(p)
                return;
 #endif
 
-       case DLT_LINUX_LAPD:
-               /*
-                * Currently, only raw "link[N:M]" filtering is supported.
-                */
-               off_linktype = -1;
-               off_macpl = -1;
-               off_nl = -1;
-               off_nl_nosnap = -1;
-               return;
-
-       case DLT_USB:
-               /*
-                * Currently, only raw "link[N:M]" filtering is supported.
-                */
-               off_linktype = -1;
-               off_macpl = -1;
-               off_nl = -1;
-               off_nl_nosnap = -1;
-               return;
-
-       case DLT_BLUETOOTH_HCI_H4:
-               /*
-                * Currently, only raw "link[N:M]" filtering is supported.
-                */
-               off_linktype = -1;
-               off_macpl = -1;
-               off_nl = -1;
-               off_nl_nosnap = -1;
-               return;
-
-       case DLT_USB_LINUX:
-               /*
-                * Currently, only raw "link[N:M]" filtering is supported.
-                */
-               off_linktype = -1;
-               off_macpl = -1;
-               off_nl = -1;
-               off_nl_nosnap = -1;
-               return;
-
-       case DLT_CAN20B:
-               /*
-                * Currently, only raw "link[N:M]" filtering is supported.
-                */
-               off_linktype = -1;
-               off_macpl = -1;
-               off_nl = -1;
-               off_nl_nosnap = -1;
-               return;
-
-       case DLT_IEEE802_15_4_LINUX:
-               /*
-                * Currently, only raw "link[N:M]" filtering is supported.
-                */
-               off_linktype = -1;
-               off_macpl = -1;
-               off_nl = -1;
-               off_nl_nosnap = -1;
-               return;
-
-       case DLT_IEEE802_16_MAC_CPS_RADIO:
-               /*
-                * Currently, only raw "link[N:M]" filtering is supported.
-                */
-               off_linktype = -1;
-               off_macpl = -1;
-               off_nl = -1;
-               off_nl_nosnap = -1;
-               return;
-
-       case DLT_IEEE802_15_4:
-               /*
-                * Currently, only raw "link[N:M]" filtering is supported.
-                */
-               off_linktype = -1;
-               off_macpl = -1;
-               off_nl = -1;
-               off_nl_nosnap = -1;
-               return;
-
-       case DLT_SITA:
+       case DLT_AX25_KISS:
                /*
                 * Currently, only raw "link[N:M]" filtering is supported.
                 */
-               off_linktype = -1;
+               off_linktype = -1;      /* variable, min 15, max 71 steps of 7 */
                off_macpl = -1;
-               off_nl = -1;
-               off_nl_nosnap = -1;
+               off_nl = -1;            /* variable, min 16, max 71 steps of 7 */
+               off_nl_nosnap = -1;     /* no 802.2 LLC */
+               off_mac = 1;            /* step over the kiss length byte */
                return;
 
-       case DLT_RAIF1:
-               /*
-                * Currently, only raw "link[N:M]" filtering is supported.
-                */
-               off_linktype = -1;
-               off_macpl = -1;
-               off_nl = -1;
+       case DLT_IPNET:
+               off_linktype = 1;
+               off_macpl = 24;         /* ipnet header length */
+               off_nl = 0;
                off_nl_nosnap = -1;
                return;
 
-       case DLT_IPMB:
-               /*
-                * Currently, only raw "link[N:M]" filtering is supported.
-                */
-               off_linktype = -1;
-               off_macpl = -1;
-               off_nl = -1;
-               off_nl_nosnap = -1;
+       case DLT_NETANALYZER:
+               off_mac = 4;            /* MAC header is past 4-byte pseudo-header */
+               off_linktype = 16;      /* includes 4-byte pseudo-header */
+               off_macpl = 18;         /* pseudo-header+Ethernet header length */
+               off_nl = 0;             /* Ethernet II */
+               off_nl_nosnap = 3;      /* 802.3+802.2 */
                return;
 
-       case DLT_BLUETOOTH_HCI_H4_WITH_PHDR:
-               /*
-                * Currently, only raw "link[N:M]" filtering is supported.
-                */
-               off_linktype = -1;
-               off_macpl = -1;
-               off_nl = -1;
-               off_nl_nosnap = -1;
+       case DLT_NETANALYZER_TRANSPARENT:
+               off_mac = 12;           /* MAC header is past 4-byte pseudo-header, preamble, and SFD */
+               off_linktype = 24;      /* includes 4-byte pseudo-header+preamble+SFD */
+               off_macpl = 26;         /* pseudo-header+preamble+SFD+Ethernet header length */
+               off_nl = 0;             /* Ethernet II */
+               off_nl_nosnap = 3;      /* 802.3+802.2 */
                return;
 
-       case DLT_AX25_KISS:
+       default:
                /*
-                * Currently, only raw "link[N:M]" filtering is supported.
+                * For values in the range in which we've assigned new
+                * DLT_ values, only raw "link[N:M]" filtering is supported.
                 */
-               off_linktype = -1;      /* variable, min 15, max 71 steps of 7 */
-               off_macpl = -1;
-               off_nl = -1;            /* variable, min 16, max 71 steps of 7 */
-               off_nl_nosnap = -1;     /* no 802.2 LLC */
-               off_mac = 1;            /* step over the kiss length byte */
-               return;
+               if (linktype >= DLT_MATCHING_MIN &&
+                   linktype <= DLT_MATCHING_MAX) {
+                       off_linktype = -1;
+                       off_macpl = -1;
+                       off_nl = -1;
+                       off_nl_nosnap = -1;
+                       return;
+               }
 
-       case DLT_IEEE802_15_4_NONASK_PHY:
-               /*
-                * Currently, only raw "link[N:M]" filtering is supported.
-                */
-               off_linktype = -1;
-               off_macpl = -1;
-               off_nl = -1;
-               off_nl_nosnap = -1;
-               return;
        }
        bpf_error("unknown data link type %d", linktype);
        /* NOTREACHED */
@@ -1934,6 +1887,33 @@ gen_ether_linktype(proto)
 }
 
 /*
+ * "proto" is an Ethernet type value and for IPNET, if it is not IPv4
+ * or IPv6 then we have an error.
+ */
+static struct block *
+gen_ipnet_linktype(proto)
+       register int proto;
+{
+       switch (proto) {
+
+       case ETHERTYPE_IP:
+               return gen_cmp(OR_LINK, off_linktype, BPF_B,
+                   (bpf_int32)IPH_AF_INET);
+               /* NOTREACHED */
+
+       case ETHERTYPE_IPV6:
+               return gen_cmp(OR_LINK, off_linktype, BPF_B,
+                   (bpf_int32)IPH_AF_INET6);
+               /* NOTREACHED */
+
+       default:
+               break;
+       }
+
+       return gen_false();
+}
+
+/*
  * Generate code to match a particular packet type.
  *
  * "proto" is an Ethernet type value, if > ETHERMTU, or an LLC SAP
@@ -2944,6 +2924,8 @@ gen_linktype(proto)
        switch (linktype) {
 
        case DLT_EN10MB:
+       case DLT_NETANALYZER:
+       case DLT_NETANALYZER_TRANSPARENT:
                return gen_ether_linktype(proto);
                /*NOTREACHED*/
                break;
@@ -3074,6 +3056,32 @@ gen_linktype(proto)
                /*NOTREACHED*/
                break;
 
+       case DLT_IPV4:
+               /*
+                * Raw IPv4, so no type field.
+                */
+               if (proto == ETHERTYPE_IP)
+                       return gen_true();              /* always true */
+
+               /* Checking for something other than IPv4; always false */
+               return gen_false();
+               /*NOTREACHED*/
+               break;
+
+       case DLT_IPV6:
+               /*
+                * Raw IPv6, so no type field.
+                */
+#ifdef INET6
+               if (proto == ETHERTYPE_IPV6)
+                       return gen_true();              /* always true */
+#endif
+
+               /* Checking for something other than IPv6; always false */
+               return gen_false();
+               /*NOTREACHED*/
+               break;
+
        case DLT_PPP:
        case DLT_PPP_PPPD:
        case DLT_PPP_SERIAL:
@@ -3321,6 +3329,11 @@ gen_linktype(proto)
         case DLT_JUNIPER_VP:
         case DLT_JUNIPER_ST:
         case DLT_JUNIPER_ISM:
+        case DLT_JUNIPER_VS:
+        case DLT_JUNIPER_SRX_E2E:
+        case DLT_JUNIPER_FIBRECHANNEL:
+       case DLT_JUNIPER_ATM_CEMIC:
+
                /* just lets verify the magic number for now -
                 * on ATM we may have up to 6 different encapsulations on the wire
                 * and need a lot of heuristics to figure out that the payload
@@ -3330,6 +3343,9 @@ gen_linktype(proto)
                 */
                return gen_mcmp(OR_LINK, 0, BPF_W, 0x4d474300, 0xffffff00); /* compare the magic number */
 
+       case DLT_IPNET:
+               return gen_ipnet_linktype(proto);
+
        case DLT_LINUX_IRDA:
                bpf_error("IrDA link-layer type filtering not implemented");
 
@@ -3353,6 +3369,7 @@ gen_linktype(proto)
 
        case DLT_USB:
        case DLT_USB_LINUX:
+       case DLT_USB_LINUX_MMAPPED:
                bpf_error("USB link-layer type filtering not implemented");
 
        case DLT_BLUETOOTH_HCI_H4:
@@ -3360,11 +3377,13 @@ gen_linktype(proto)
                bpf_error("Bluetooth link-layer type filtering not implemented");
 
        case DLT_CAN20B:
-               bpf_error("CAN20B link-layer type filtering not implemented");
+       case DLT_CAN_SOCKETCAN:
+               bpf_error("CAN link-layer type filtering not implemented");
 
        case DLT_IEEE802_15_4:
        case DLT_IEEE802_15_4_LINUX:
        case DLT_IEEE802_15_4_NONASK_PHY:
+       case DLT_IEEE802_15_4_NOFCS:
                bpf_error("IEEE 802.15.4 link-layer type filtering not implemented");
 
        case DLT_IEEE802_16_MAC_CPS_RADIO:
@@ -3639,6 +3658,30 @@ gen_ehostop(eaddr, dir)
                b1 = gen_ehostop(eaddr, Q_DST);
                gen_or(b0, b1);
                return b1;
+
+       case Q_ADDR1:
+               bpf_error("'addr1' is only supported on 802.11 with 802.11 headers");
+               break;
+
+       case Q_ADDR2:
+               bpf_error("'addr2' is only supported on 802.11 with 802.11 headers");
+               break;
+
+       case Q_ADDR3:
+               bpf_error("'addr3' is only supported on 802.11 with 802.11 headers");
+               break;
+
+       case Q_ADDR4:
+               bpf_error("'addr4' is only supported on 802.11 with 802.11 headers");
+               break;
+
+       case Q_RA:
+               bpf_error("'ra' is only supported on 802.11 with 802.11 headers");
+               break;
+
+       case Q_TA:
+               bpf_error("'ta' is only supported on 802.11 with 802.11 headers");
+               break;
        }
        abort();
        /* NOTREACHED */
@@ -3681,6 +3724,30 @@ gen_fhostop(eaddr, dir)
                b1 = gen_fhostop(eaddr, Q_DST);
                gen_or(b0, b1);
                return b1;
+
+       case Q_ADDR1:
+               bpf_error("'addr1' is only supported on 802.11");
+               break;
+
+       case Q_ADDR2:
+               bpf_error("'addr2' is only supported on 802.11");
+               break;
+
+       case Q_ADDR3:
+               bpf_error("'addr3' is only supported on 802.11");
+               break;
+
+       case Q_ADDR4:
+               bpf_error("'addr4' is only supported on 802.11");
+               break;
+
+       case Q_RA:
+               bpf_error("'ra' is only supported on 802.11");
+               break;
+
+       case Q_TA:
+               bpf_error("'ta' is only supported on 802.11");
+               break;
        }
        abort();
        /* NOTREACHED */
@@ -3715,6 +3782,30 @@ gen_thostop(eaddr, dir)
                b1 = gen_thostop(eaddr, Q_DST);
                gen_or(b0, b1);
                return b1;
+
+       case Q_ADDR1:
+               bpf_error("'addr1' is only supported on 802.11");
+               break;
+
+       case Q_ADDR2:
+               bpf_error("'addr2' is only supported on 802.11");
+               break;
+
+       case Q_ADDR3:
+               bpf_error("'addr3' is only supported on 802.11");
+               break;
+
+       case Q_ADDR4:
+               bpf_error("'addr4' is only supported on 802.11");
+               break;
+
+       case Q_RA:
+               bpf_error("'ra' is only supported on 802.11");
+               break;
+
+       case Q_TA:
+               bpf_error("'ta' is only supported on 802.11");
+               break;
        }
        abort();
        /* NOTREACHED */
@@ -4008,8 +4099,79 @@ gen_wlanhostop(eaddr, dir)
                gen_and(b1, b0);
                return b0;
 
+       case Q_RA:
+               /*
+                * Not present in management frames; addr1 in other
+                * frames.
+                */
+
+               /*
+                * If the high-order bit of the type value is 0, this
+                * is a management frame.
+                * I.e, check "(link[0] & 0x08)".
+                */
+               s = gen_load_a(OR_LINK, 0, BPF_B);
+               b1 = new_block(JMP(BPF_JSET));
+               b1->s.k = 0x08;
+               b1->stmts = s;
+
+               /*
+                * Check addr1.
+                */
+               b0 = gen_bcmp(OR_LINK, 4, 6, eaddr);
+
+               /*
+                * AND that with the check of addr1.
+                */
+               gen_and(b1, b0);
+               return (b0);
+
+       case Q_TA:
+               /*
+                * Not present in management frames; addr2, if present,
+                * in other frames.
+                */
+
+               /*
+                * Not present in CTS or ACK control frames.
+                */
+               b0 = gen_mcmp(OR_LINK, 0, BPF_B, IEEE80211_FC0_TYPE_CTL,
+                       IEEE80211_FC0_TYPE_MASK);
+               gen_not(b0);
+               b1 = gen_mcmp(OR_LINK, 0, BPF_B, IEEE80211_FC0_SUBTYPE_CTS,
+                       IEEE80211_FC0_SUBTYPE_MASK);
+               gen_not(b1);
+               b2 = gen_mcmp(OR_LINK, 0, BPF_B, IEEE80211_FC0_SUBTYPE_ACK,
+                       IEEE80211_FC0_SUBTYPE_MASK);
+               gen_not(b2);
+               gen_and(b1, b2);
+               gen_or(b0, b2);
+
+               /*
+                * If the high-order bit of the type value is 0, this
+                * is a management frame.
+                * I.e, check "(link[0] & 0x08)".
+                */
+               s = gen_load_a(OR_LINK, 0, BPF_B);
+               b1 = new_block(JMP(BPF_JSET));
+               b1->s.k = 0x08;
+               b1->stmts = s;
+
+               /*
+                * AND that with the check for frames other than
+                * CTS and ACK frames.
+                */
+               gen_and(b1, b2);
+
+               /*
+                * Check addr2.
+                */
+               b1 = gen_bcmp(OR_LINK, 10, 6, eaddr);
+               gen_and(b2, b1);
+               return b1;
+
        /*
-        * XXX - add RA, TA, and BSSID keywords?
+        * XXX - add BSSID keyword?
         */
        case Q_ADDR1:
                return (gen_bcmp(OR_LINK, 4, 6, eaddr));
@@ -4105,6 +4267,30 @@ gen_ipfchostop(eaddr, dir)
                b1 = gen_ipfchostop(eaddr, Q_DST);
                gen_or(b0, b1);
                return b1;
+
+       case Q_ADDR1:
+               bpf_error("'addr1' is only supported on 802.11");
+               break;
+
+       case Q_ADDR2:
+               bpf_error("'addr2' is only supported on 802.11");
+               break;
+
+       case Q_ADDR3:
+               bpf_error("'addr3' is only supported on 802.11");
+               break;
+
+       case Q_ADDR4:
+               bpf_error("'addr4' is only supported on 802.11");
+               break;
+
+       case Q_RA:
+               bpf_error("'ra' is only supported on 802.11");
+               break;
+
+       case Q_TA:
+               bpf_error("'ta' is only supported on 802.11");
+               break;
        }
        abort();
        /* NOTREACHED */
@@ -4298,6 +4484,9 @@ gen_host(addr, mask, proto, dir, type)
        case Q_VRRP:
                bpf_error("'vrrp' modifier applied to %s", typestr);
 
+       case Q_CARP:
+               bpf_error("'carp' modifier applied to %s", typestr);
+
        case Q_ATALK:
                bpf_error("ATALK host filtering not implemented");
 
@@ -4417,6 +4606,9 @@ gen_host6(addr, mask, proto, dir, type)
        case Q_VRRP:
                bpf_error("'vrrp' modifier applied to %s", typestr);
 
+       case Q_CARP:
+               bpf_error("'carp' modifier applied to %s", typestr);
+
        case Q_ATALK:
                bpf_error("ATALK host filtering not implemented");
 
@@ -4501,6 +4693,8 @@ gen_gateway(eaddr, alist, proto, dir)
        case Q_RARP:
                switch (linktype) {
                case DLT_EN10MB:
+               case DLT_NETANALYZER:
+               case DLT_NETANALYZER_TRANSPARENT:
                        b0 = gen_ehostop(eaddr, Q_OR);
                        break;
                case DLT_FDDI:
@@ -4517,29 +4711,30 @@ gen_gateway(eaddr, alist, proto, dir)
                        b0 = gen_wlanhostop(eaddr, Q_OR);
                        break;
                case DLT_SUNATM:
-                       if (is_lane) {
-                               /*
-                                * Check that the packet doesn't begin with an
-                                * LE Control marker.  (We've already generated
-                                * a test for LANE.)
-                                */
-                               b1 = gen_cmp(OR_LINK, SUNATM_PKT_BEGIN_POS,
-                                   BPF_H, 0xFF00);
-                               gen_not(b1);
+                       if (!is_lane)
+                               bpf_error(
+                                   "'gateway' supported only on ethernet/FDDI/token ring/802.11/ATM LANE/Fibre Channel");
+                       /*
+                        * Check that the packet doesn't begin with an
+                        * LE Control marker.  (We've already generated
+                        * a test for LANE.)
+                        */
+                       b1 = gen_cmp(OR_LINK, SUNATM_PKT_BEGIN_POS,
+                           BPF_H, 0xFF00);
+                       gen_not(b1);
 
-                               /*
-                                * Now check the MAC address.
-                                */
-                               b0 = gen_ehostop(eaddr, Q_OR);
-                               gen_and(b1, b0);
-                       }
+                       /*
+                        * Now check the MAC address.
+                        */
+                       b0 = gen_ehostop(eaddr, Q_OR);
+                       gen_and(b1, b0);
                        break;
                case DLT_IP_OVER_FC:
                        b0 = gen_ipfchostop(eaddr, Q_OR);
                        break;
                default:
                        bpf_error(
-                           "'gateway' supported only on ethernet/FDDI/token ring/802.11/Fibre Channel");
+                           "'gateway' supported only on ethernet/FDDI/token ring/802.11/ATM LANE/Fibre Channel");
                }
                b1 = gen_host(**alist++, 0xffffffff, proto, Q_OR, Q_HOST);
                while (*alist) {
@@ -4629,6 +4824,14 @@ gen_proto_abbrev(proto)
                b1 = gen_proto(IPPROTO_VRRP, Q_IP, Q_DEFAULT);
                break;
 
+#ifndef IPPROTO_CARP
+#define IPPROTO_CARP   112
+#endif
+
+       case Q_CARP:
+               b1 = gen_proto(IPPROTO_CARP, Q_IP, Q_DEFAULT);
+               break;
+
        case Q_IP:
                b1 =  gen_linktype(ETHERTYPE_IP);
                break;
@@ -4810,7 +5013,7 @@ gen_ipfrag()
        struct slist *s;
        struct block *b;
 
-       /* not ip frag */
+       /* not IPv4 frag other than the first frag */
        s = gen_load_a(OR_NET, 6, BPF_H);
        b = new_block(JMP(BPF_JSET));
        b->s.k = 0x1fff;
@@ -4853,7 +5056,7 @@ gen_portop(port, proto, dir)
 {
        struct block *b0, *b1, *tmp;
 
-       /* ip proto 'proto' */
+       /* ip proto 'proto' and not a fragment other than the first fragment */
        tmp = gen_cmp(OR_NET, 9, BPF_B, (bpf_int32)proto);
        b0 = gen_ipfrag();
        gen_and(tmp, b0);
@@ -4945,6 +5148,7 @@ gen_portop6(port, proto, dir)
        struct block *b0, *b1, *tmp;
 
        /* ip6 proto 'proto' */
+       /* XXX - catch the first fragment of a fragmented packet? */
        b0 = gen_cmp(OR_NET, 6, BPF_B, (bpf_int32)proto);
 
        switch (dir) {
@@ -5046,7 +5250,7 @@ gen_portrangeop(port1, port2, proto, dir)
 {
        struct block *b0, *b1, *tmp;
 
-       /* ip proto 'proto' */
+       /* ip proto 'proto' and not a fragment other than the first fragment */
        tmp = gen_cmp(OR_NET, 9, BPF_B, (bpf_int32)proto);
        b0 = gen_ipfrag();
        gen_and(tmp, b0);
@@ -5150,6 +5354,7 @@ gen_portrangeop6(port1, port2, proto, dir)
        struct block *b0, *b1, *tmp;
 
        /* ip6 proto 'proto' */
+       /* XXX - catch the first fragment of a fragmented packet? */
        b0 = gen_cmp(OR_NET, 6, BPF_B, (bpf_int32)proto);
 
        switch (dir) {
@@ -5427,12 +5632,9 @@ gen_protochain(v, proto, dir)
 
                /*
                 * in short,
-                * A = P[X];
-                * X = X + (P[X + 1] + 1) * 8;
+                * A = P[X + packet head];
+                * X = X + (P[X + packet head + 1] + 1) * 8;
                 */
-               /* A = X */
-               s[i] = new_stmt(BPF_MISC|BPF_TXA);
-               i++;
                /* A = P[X + packet head] */
                s[i] = new_stmt(BPF_LD|BPF_IND|BPF_B);
                s[i]->s.k = off_macpl + off_nl;
@@ -5441,19 +5643,9 @@ gen_protochain(v, proto, dir)
                s[i] = new_stmt(BPF_ST);
                s[i]->s.k = reg2;
                i++;
-               /* A = X */
-               s[i] = new_stmt(BPF_MISC|BPF_TXA);
-               i++;
-               /* A += 1 */
-               s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
-               s[i]->s.k = 1;
-               i++;
-               /* X = A */
-               s[i] = new_stmt(BPF_MISC|BPF_TAX);
-               i++;
-               /* A = P[X + packet head]; */
+               /* A = P[X + packet head + 1]; */
                s[i] = new_stmt(BPF_LD|BPF_IND|BPF_B);
-               s[i]->s.k = off_macpl + off_nl;
+               s[i]->s.k = off_macpl + off_nl + 1;
                i++;
                /* A += 1 */
                s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
@@ -5463,6 +5655,10 @@ gen_protochain(v, proto, dir)
                s[i] = new_stmt(BPF_ALU|BPF_MUL|BPF_K);
                s[i]->s.k = 8;
                i++;
+               /* A += X */
+               s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_X);
+               s[i]->s.k = 0;
+               i++;
                /* X = A; */
                s[i] = new_stmt(BPF_MISC|BPF_TAX);
                i++;
@@ -5786,6 +5982,10 @@ gen_proto(v, proto, dir)
                bpf_error("'vrrp proto' is bogus");
                /* NOTREACHED */
 
+       case Q_CARP:
+               bpf_error("'carp proto' is bogus");
+               /* NOTREACHED */
+
 #ifdef INET6
        case Q_IPV6:
                b0 = gen_linktype(ETHERTYPE_IPV6);
@@ -5869,6 +6069,8 @@ gen_scode(name, q)
                        switch (linktype) {
 
                        case DLT_EN10MB:
+                       case DLT_NETANALYZER:
+                       case DLT_NETANALYZER_TRANSPARENT:
                                eaddr = pcap_ether_hostton(name);
                                if (eaddr == NULL)
                                        bpf_error(
@@ -5969,6 +6171,7 @@ gen_scode(name, q)
                        res0 = res = pcap_nametoaddrinfo(name);
                        if (res == NULL)
                                bpf_error("unknown host '%s'", name);
+                       ai = res;
                        b = tmp = NULL;
                        tproto = tproto6 = proto;
                        if (off_linktype == -1 && tproto == Q_DEFAULT) {
@@ -6002,6 +6205,7 @@ gen_scode(name, q)
                                        gen_or(b, tmp);
                                b = tmp;
                        }
+                       ai = NULL;
                        freeaddrinfo(res0);
                        if (b == NULL) {
                                bpf_error("unknown host '%s'%s", name,
@@ -6048,6 +6252,10 @@ gen_scode(name, q)
                                /* override PROTO_UNDEF */
                                real_proto = IPPROTO_SCTP;
                }
+               if (port < 0)
+                       bpf_error("illegal port number %d < 0", port);
+               if (port > 65535)
+                       bpf_error("illegal port number %d > 65535", port);
 #ifndef INET6
                return gen_port(port, real_proto, dir);
 #else
@@ -6089,6 +6297,15 @@ gen_scode(name, q)
                                /* override PROTO_UNDEF */
                                real_proto = IPPROTO_SCTP;      
                }
+               if (port1 < 0)
+                       bpf_error("illegal port number %d < 0", port1);
+               if (port1 > 65535)
+                       bpf_error("illegal port number %d > 65535", port1);
+               if (port2 < 0)
+                       bpf_error("illegal port number %d < 0", port2);
+               if (port2 > 65535)
+                       bpf_error("illegal port number %d > 65535", port2);
+
 #ifndef INET6
                return gen_portrange(port1, port2, real_proto, dir);
 #else
@@ -6240,6 +6457,9 @@ gen_ncode(s, v, q)
                else
                        bpf_error("illegal qualifier of 'port'");
 
+               if (v > 65535)
+                       bpf_error("illegal port number %u > 65535", v);
+
 #ifndef INET6
                return gen_port((int)v, proto, dir);
 #else
@@ -6263,6 +6483,9 @@ gen_ncode(s, v, q)
                else
                        bpf_error("illegal qualifier of 'portrange'");
 
+               if (v > 65535)
+                       bpf_error("illegal port number %u > 65535", v);
+
 #ifndef INET6
                return gen_portrange((int)v, (int)v, proto, dir);
 #else
@@ -6314,6 +6537,7 @@ gen_mcode6(s1, s2, masklen, q)
        res = pcap_nametoaddrinfo(s1);
        if (!res)
                bpf_error("invalid ip6 address %s", s1);
+       ai = res;
        if (res->ai_next)
                bpf_error("%s resolved to multiple address", s1);
        addr = &((struct sockaddr_in6 *)res->ai_addr)->sin6_addr;
@@ -6344,6 +6568,7 @@ gen_mcode6(s1, s2, masklen, q)
 
        case Q_NET:
                b = gen_host6(addr, &mask, q.proto, q.dir, q.addr);
+               ai = NULL;
                freeaddrinfo(res);
                return b;
 
@@ -6365,6 +6590,8 @@ gen_ecode(eaddr, q)
        if ((q.addr == Q_HOST || q.addr == Q_DEFAULT) && q.proto == Q_LINK) {
                switch (linktype) {
                case DLT_EN10MB:
+               case DLT_NETANALYZER:
+               case DLT_NETANALYZER_TRANSPARENT:
                        return gen_ehostop(eaddr, (int)q.dir);
                case DLT_FDDI:
                        return gen_fhostop(eaddr, (int)q.dir);
@@ -6494,7 +6721,7 @@ gen_load(proto, inst, size)
 
                /*
                 * Load into the X register the offset computed into the
-                * register specifed by "index".
+                * register specified by "index".
                 */
                s = xfer_to_x(inst);
 
@@ -6526,7 +6753,7 @@ gen_load(proto, inst, size)
                 * the link-layer header.  Add to it the offset computed
                 * into the register specified by "index", and move that
                 * into the X register.  Otherwise, just load into the X
-                * register the offset computed into the register specifed
+                * register the offset computed into the register specified
                 * by "index".
                 */
                if (s != NULL) {
@@ -6575,7 +6802,7 @@ gen_load(proto, inst, size)
                 * payload.  Add to it the offset computed into the
                 * register specified by "index", and move that into
                 * the X register.  Otherwise, just load into the X
-                * register the offset computed into the register specifed
+                * register the offset computed into the register specified
                 * by "index".
                 */
                if (s != NULL) {
@@ -6620,6 +6847,7 @@ gen_load(proto, inst, size)
        case Q_IGRP:
        case Q_PIM:
        case Q_VRRP:
+       case Q_CARP:
                /*
                 * The offset is relative to the beginning of
                 * the transport-layer header.
@@ -6968,6 +7196,8 @@ gen_broadcast(proto)
                case DLT_ARCNET_LINUX:
                        return gen_ahostop(abroadcast, Q_DST);
                case DLT_EN10MB:
+               case DLT_NETANALYZER:
+               case DLT_NETANALYZER_TRANSPARENT:
                        return gen_ehostop(ebroadcast, Q_DST);
                case DLT_FDDI:
                        return gen_fhostop(ebroadcast, Q_DST);
@@ -7006,6 +7236,13 @@ gen_broadcast(proto)
                break;
 
        case Q_IP:
+               /*
+                * We treat a netmask of PCAP_NETMASK_UNKNOWN (0xffffffff)
+                * as an indication that we don't know the netmask, and fail
+                * in that case.
+                */
+               if (netmask == PCAP_NETMASK_UNKNOWN)
+                       bpf_error("netmask not known, so 'ip broadcast' not supported");
                b0 = gen_linktype(ETHERTYPE_IP);
                hostmask = ~netmask;
                b1 = gen_mcmp(OR_NET, 16, BPF_W, (bpf_int32)0, hostmask);
@@ -7056,6 +7293,8 @@ gen_multicast(proto)
                        /* all ARCnet multicasts use the same address */
                        return gen_ahostop(abroadcast, Q_DST);
                case DLT_EN10MB:
+               case DLT_NETANALYZER:
+               case DLT_NETANALYZER_TRANSPARENT:
                        /* ether[0] & 1 != 0 */
                        return gen_mac_multicast(0);
                case DLT_FDDI:
@@ -7253,6 +7492,16 @@ gen_inbound(dir)
                          dir);
                break;
 
+       case DLT_IPNET:
+               if (dir) {
+                       /* match outgoing packets */
+                       b0 = gen_cmp(OR_LINK, 2, BPF_H, IPNET_OUTBOUND);
+               } else {
+                       /* match incoming packets */
+                       b0 = gen_cmp(OR_LINK, 2, BPF_H, IPNET_INBOUND);
+               }
+               break;
+
        case DLT_LINUX_SLL:
                if (dir) {
                        /*
@@ -7309,6 +7558,11 @@ gen_inbound(dir)
         case DLT_JUNIPER_VP:
         case DLT_JUNIPER_ST:
         case DLT_JUNIPER_ISM:
+        case DLT_JUNIPER_VS:
+        case DLT_JUNIPER_SRX_E2E:
+        case DLT_JUNIPER_FIBRECHANNEL:
+       case DLT_JUNIPER_ATM_CEMIC:
+
                /* juniper flags (including direction) are stored
                 * the byte after the 3-byte magic number */
                if (dir) {
@@ -7589,6 +7843,30 @@ gen_ahostop(eaddr, dir)
                b1 = gen_ahostop(eaddr, Q_DST);
                gen_or(b0, b1);
                return b1;
+
+       case Q_ADDR1:
+               bpf_error("'addr1' is only supported on 802.11");
+               break;
+
+       case Q_ADDR2:
+               bpf_error("'addr2' is only supported on 802.11");
+               break;
+
+       case Q_ADDR3:
+               bpf_error("'addr3' is only supported on 802.11");
+               break;
+
+       case Q_ADDR4:
+               bpf_error("'addr4' is only supported on 802.11");
+               break;
+
+       case Q_RA:
+               bpf_error("'ra' is only supported on 802.11");
+               break;
+
+       case Q_TA:
+               bpf_error("'ta' is only supported on 802.11");
+               break;
        }
        abort();
        /* NOTREACHED */
@@ -7643,9 +7921,15 @@ gen_vlan(vlan_num)
        switch (linktype) {
 
        case DLT_EN10MB:
-               /* check for VLAN */
+       case DLT_NETANALYZER:
+       case DLT_NETANALYZER_TRANSPARENT:
+               /* check for VLAN, including QinQ */
                b0 = gen_cmp(OR_LINK, off_linktype, BPF_H,
                    (bpf_int32)ETHERTYPE_8021Q);
+               b1 = gen_cmp(OR_LINK, off_linktype, BPF_H,
+                   (bpf_int32)ETHERTYPE_8021QINQ);
+               gen_or(b0,b1);
+               b0 = b1;
 
                /* If a specific VLAN is requested, check VLAN id */
                if (vlan_num >= 0) {
@@ -7706,6 +7990,8 @@ gen_mpls(label_num)
                 
             case DLT_C_HDLC: /* fall through */
             case DLT_EN10MB:
+            case DLT_NETANALYZER:
+            case DLT_NETANALYZER_TRANSPARENT:
                     b0 = gen_linktype(ETHERTYPE_MPLS);
                     break;
                 
index 39b1eea..e8b0593 100644 (file)
@@ -18,7 +18,7 @@
  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/gencode.h,v 1.70.2.1 2007/11/18 02:04:55 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/gencode.h,v 1.71 2007-11-18 02:03:52 guy Exp $ (LBL)
  */
 
 /*
 
 #define Q_RADIO                40
 
+#define Q_CARP         41
+
 /* Directional qualifiers. */
 
 #define Q_SRC          1
 #define Q_ADDR2                6
 #define Q_ADDR3                7
 #define Q_ADDR4                8
+#define Q_RA           9
+#define Q_TA           10
 
 #define Q_DEFAULT      0
 #define Q_UNDEF                255
index 2698716..eca9f1f 100644 (file)
@@ -22,7 +22,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/grammar.y,v 1.99.2.2 2007/11/18 02:04:55 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/grammar.y,v 1.101 2007-11-18 02:03:52 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -45,6 +45,7 @@ struct rtentry;
 #endif
 
 #include <netinet/in.h>
+#include <arpa/inet.h>
 #endif /* WIN32 */
 
 #include <stdio.h>
@@ -272,12 +273,12 @@ pfaction_to_num(const char *action)
 
 %token  DST SRC HOST GATEWAY
 %token  NET NETMASK PORT PORTRANGE LESS GREATER PROTO PROTOCHAIN CBYTE
-%token  ARP RARP IP SCTP TCP UDP ICMP IGMP IGRP PIM VRRP
+%token  ARP RARP IP SCTP TCP UDP ICMP IGMP IGRP PIM VRRP CARP
 %token  ATALK AARP DECNET LAT SCA MOPRC MOPDL
 %token  TK_BROADCAST TK_MULTICAST
 %token  NUM INBOUND OUTBOUND
 %token  PF_IFNAME PF_RSET PF_RNR PF_SRNR PF_REASON PF_ACTION
-%token TYPE SUBTYPE DIR ADDR1 ADDR2 ADDR3 ADDR4
+%token TYPE SUBTYPE DIR ADDR1 ADDR2 ADDR3 ADDR4 RA TA
 %token  LINK
 %token GEQ LEQ NEQ
 %token ID EID HID HID6 AID
@@ -442,6 +443,8 @@ dqual:        SRC                   { $$ = Q_SRC; }
        | ADDR2                 { $$ = Q_ADDR2; }
        | ADDR3                 { $$ = Q_ADDR3; }
        | ADDR4                 { $$ = Q_ADDR4; }
+       | RA                    { $$ = Q_RA; }
+       | TA                    { $$ = Q_TA; }
        ;
 /* address type qualifiers */
 aqual:   HOST                  { $$ = Q_HOST; }
@@ -464,6 +467,7 @@ pname:        LINK                  { $$ = Q_LINK; }
        | IGRP                  { $$ = Q_IGRP; }
        | PIM                   { $$ = Q_PIM; }
        | VRRP                  { $$ = Q_VRRP; }
+       | CARP                  { $$ = Q_CARP; }
        | ATALK                 { $$ = Q_ATALK; }
        | AARP                  { $$ = Q_AARP; }
        | DECNET                { $$ = Q_DECNET; }
diff --git a/contrib/libpcap/ieee80211.h b/contrib/libpcap/ieee80211.h
new file mode 100644 (file)
index 0000000..473803d
--- /dev/null
@@ -0,0 +1,146 @@
+/*-
+ * Copyright (c) 2001 Atsushi Onoe
+ * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD: src/sys/net80211/ieee80211.h,v 1.10 2005/07/22 16:55:27 sam Exp $
+ */
+#ifndef _NET80211_IEEE80211_H_
+#define _NET80211_IEEE80211_H_
+
+/*
+ * 802.11 protocol definitions.
+ */
+
+#define        IEEE80211_FC0_VERSION_MASK              0x03
+#define        IEEE80211_FC0_VERSION_SHIFT             0
+#define        IEEE80211_FC0_VERSION_0                 0x00
+#define        IEEE80211_FC0_TYPE_MASK                 0x0c
+#define        IEEE80211_FC0_TYPE_SHIFT                2
+#define        IEEE80211_FC0_TYPE_MGT                  0x00
+#define        IEEE80211_FC0_TYPE_CTL                  0x04
+#define        IEEE80211_FC0_TYPE_DATA                 0x08
+
+#define        IEEE80211_FC0_SUBTYPE_MASK              0xf0
+#define        IEEE80211_FC0_SUBTYPE_SHIFT             4
+/* for TYPE_MGT */
+#define        IEEE80211_FC0_SUBTYPE_ASSOC_REQ         0x00
+#define        IEEE80211_FC0_SUBTYPE_ASSOC_RESP        0x10
+#define        IEEE80211_FC0_SUBTYPE_REASSOC_REQ       0x20
+#define        IEEE80211_FC0_SUBTYPE_REASSOC_RESP      0x30
+#define        IEEE80211_FC0_SUBTYPE_PROBE_REQ         0x40
+#define        IEEE80211_FC0_SUBTYPE_PROBE_RESP        0x50
+#define        IEEE80211_FC0_SUBTYPE_BEACON            0x80
+#define        IEEE80211_FC0_SUBTYPE_ATIM              0x90
+#define        IEEE80211_FC0_SUBTYPE_DISASSOC          0xa0
+#define        IEEE80211_FC0_SUBTYPE_AUTH              0xb0
+#define        IEEE80211_FC0_SUBTYPE_DEAUTH            0xc0
+/* for TYPE_CTL */
+#define        IEEE80211_FC0_SUBTYPE_PS_POLL           0xa0
+#define        IEEE80211_FC0_SUBTYPE_RTS               0xb0
+#define        IEEE80211_FC0_SUBTYPE_CTS               0xc0
+#define        IEEE80211_FC0_SUBTYPE_ACK               0xd0
+#define        IEEE80211_FC0_SUBTYPE_CF_END            0xe0
+#define        IEEE80211_FC0_SUBTYPE_CF_END_ACK        0xf0
+/* for TYPE_DATA (bit combination) */
+#define        IEEE80211_FC0_SUBTYPE_DATA              0x00
+#define        IEEE80211_FC0_SUBTYPE_CF_ACK            0x10
+#define        IEEE80211_FC0_SUBTYPE_CF_POLL           0x20
+#define        IEEE80211_FC0_SUBTYPE_CF_ACPL           0x30
+#define        IEEE80211_FC0_SUBTYPE_NODATA            0x40
+#define        IEEE80211_FC0_SUBTYPE_NODATA_CF_ACK     0x50
+#define        IEEE80211_FC0_SUBTYPE_NODATA_CF_POLL    0x60
+#define        IEEE80211_FC0_SUBTYPE_NODATA_CF_ACPL    0x70
+#define        IEEE80211_FC0_SUBTYPE_QOS               0x80
+#define        IEEE80211_FC0_SUBTYPE_QOS_NULL          0xc0
+
+#define        IEEE80211_FC1_DIR_MASK                  0x03
+#define        IEEE80211_FC1_DIR_NODS                  0x00    /* STA->STA */
+#define        IEEE80211_FC1_DIR_TODS                  0x01    /* STA->AP  */
+#define        IEEE80211_FC1_DIR_FROMDS                0x02    /* AP ->STA */
+#define        IEEE80211_FC1_DIR_DSTODS                0x03    /* AP ->AP  */
+
+#define        IEEE80211_FC1_MORE_FRAG                 0x04
+#define        IEEE80211_FC1_RETRY                     0x08
+#define        IEEE80211_FC1_PWR_MGT                   0x10
+#define        IEEE80211_FC1_MORE_DATA                 0x20
+#define        IEEE80211_FC1_WEP                       0x40
+#define        IEEE80211_FC1_ORDER                     0x80
+
+#define        IEEE80211_SEQ_FRAG_MASK                 0x000f
+#define        IEEE80211_SEQ_FRAG_SHIFT                0
+#define        IEEE80211_SEQ_SEQ_MASK                  0xfff0
+#define        IEEE80211_SEQ_SEQ_SHIFT                 4
+
+#define        IEEE80211_NWID_LEN                      32
+
+#define        IEEE80211_QOS_TXOP                      0x00ff
+/* bit 8 is reserved */
+#define        IEEE80211_QOS_ACKPOLICY                 0x60
+#define        IEEE80211_QOS_ACKPOLICY_S               5
+#define        IEEE80211_QOS_ESOP                      0x10
+#define        IEEE80211_QOS_ESOP_S                    4
+#define        IEEE80211_QOS_TID                       0x0f
+
+#define IEEE80211_MGT_SUBTYPE_NAMES {                  \
+       "assoc-req",            "assoc-resp",           \
+       "reassoc-req",          "reassoc-resp",         \
+       "probe-req",            "probe-resp",           \
+       "reserved#6",           "reserved#7",           \
+       "beacon",               "atim",                 \
+       "disassoc",             "auth",                 \
+       "deauth",               "reserved#13",          \
+       "reserved#14",          "reserved#15"           \
+}
+
+#define IEEE80211_CTL_SUBTYPE_NAMES {                  \
+       "reserved#0",           "reserved#1",           \
+       "reserved#2",           "reserved#3",           \
+       "reserved#3",           "reserved#5",           \
+       "reserved#6",           "reserved#7",           \
+       "reserved#8",           "reserved#9",           \
+       "ps-poll",              "rts",                  \
+       "cts",                  "ack",                  \
+       "cf-end",               "cf-end-ack"            \
+}
+
+#define IEEE80211_DATA_SUBTYPE_NAMES {                 \
+       "data",                 "data-cf-ack",          \
+       "data-cf-poll",         "data-cf-ack-poll",     \
+       "null",                 "cf-ack",               \
+       "cf-poll",              "cf-ack-poll",          \
+       "qos-data",             "qos-data-cf-ack",      \
+       "qos-data-cf-poll",     "qos-data-cf-ack-poll", \
+       "qos",                  "reserved#13",          \
+       "qos-cf-poll",          "qos-cf-ack-poll"       \
+}
+
+#define IEEE80211_TYPE_NAMES   { "mgt", "ctl", "data", "reserved#4" }
+
+#endif /* _NET80211_IEEE80211_H_ */
index aad8796..6ae46ef 100644 (file)
@@ -34,7 +34,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/inet.c,v 1.75.2.4 2008-04-20 18:19:24 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/inet.c,v 1.79 2008-04-20 18:19:02 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -133,6 +133,7 @@ add_or_find_if(pcap_if_t **curdev_ret, pcap_if_t **alldevs, const char *name,
        pcap_t *p;
        pcap_if_t *curdev, *prevdev, *nextdev;
        int this_instance;
+       char open_errbuf[PCAP_ERRBUF_SIZE];
 
        /*
         * Is there already an entry in the list for this interface?
@@ -192,11 +193,11 @@ add_or_find_if(pcap_if_t **curdev_ret, pcap_if_t **alldevs, const char *name,
                        }
                        strcpy(en_name, "en");
                        strcat(en_name, name + 3);
-                       p = pcap_open_live(en_name, 68, 0, 0, errbuf);
+                       p = pcap_open_live(en_name, 68, 0, 0, open_errbuf);
                        free(en_name);
                } else
 #endif /* __APPLE */
-               p = pcap_open_live(name, 68, 0, 0, errbuf);
+               p = pcap_open_live(name, 68, 0, 0, open_errbuf);
                if (p == NULL) {
                        /*
                         * No.  Don't bother including it.
@@ -366,26 +367,38 @@ add_or_find_if(pcap_if_t **curdev_ret, pcap_if_t **alldevs, const char *name,
  * a Cisco 340 or 350, rather than an old Aironet card, it should use
  * that in the description.
  *
- * Do NetBSD, DragonflyBSD, or OpenBSD support this as well?  OpenBSD
- * lets you get a description, but it's not generated by the OS, it's
- * set with another ioctl that ifconfig supports; we use that to get
- * the description in OpenBSD.
+ * Do NetBSD, DragonflyBSD, or OpenBSD support this as well?  FreeBSD
+ * and OpenBSD let you get a description, but it's not generated by the OS,
+ * it's set with another ioctl that ifconfig supports; we use that to get
+ * a description in FreeBSD and OpenBSD, but if there is no such
+ * description available, it still might be nice to get some description
+ * string based on the device type or something such as that.
  *
  * In OS X, the System Configuration framework can apparently return
- * names in 10.4 and later; it also appears that freedesktop.org's HAL
- * offers an "info.product" string, but the HAL specification says
- * it "should not be used in any UI" and "subsystem/capability
- * specific properties" should be used instead.  Using that would
- * require that libpcap applications be linked with the frameworks/
- * libraries in question, which would be a bit of a pain unless we
- * offer, for example, a pkg-config:
+ * names in 10.4 and later.
  *
- *     http://pkg-config.freedesktop.org/wiki/
+ * It also appears that freedesktop.org's HAL offers an "info.product"
+ * string, but the HAL specification says it "should not be used in any
+ * UI" and "subsystem/capability specific properties" should be used
+ * instead and, in any case, I think HAL is being deprecated in
+ * favor of other stuff such as DeviceKit.  DeviceKit doesn't appear
+ * to have any obvious product information for devices, but maybe
+ * I haven't looked hard enough.
  *
- * script, so applications can just use that script to find out what
- * libraries you need to link with when linking with libpcap.
- * pkg-config is GPLed; I don't know whether that would prevent its
- * use with a BSD-licensed library such as libpcap.
+ * Using the System Configuration framework, or HAL, or DeviceKit, or
+ * whatever, would require that libpcap applications be linked with
+ * the frameworks/libraries in question.  That shouldn't be a problem
+ * for programs linking with the shared version of libpcap (unless
+ * you're running on AIX - which I think is the only UN*X that doesn't
+ * support linking a shared library with other libraries on which it
+ * depends, and having an executable linked only with the first shared
+ * library automatically pick up the other libraries when started -
+ * and using HAL or whatever).  Programs linked with the static
+ * version of libpcap would have to use pcap-config with the --static
+ * flag in order to get the right linker flags in order to pick up
+ * the additional libraries/frameworks; those programs need that anyway
+ * for libpcap 1.1 and beyond on Linux, as, by default, it requires
+ * -lnl.
  *
  * Do any other UN*Xes, or desktop environments support getting a
  * description?
@@ -402,10 +415,14 @@ add_addr_to_iflist(pcap_if_t **alldevs, const char *name, u_int flags,
        char *description = NULL;
        pcap_addr_t *curaddr, *prevaddr, *nextaddr;
 #ifdef SIOCGIFDESCR
-       struct ifreq ifrdesc;
-       char ifdescr[IFDESCRSIZE];
        int s;
-#endif
+       struct ifreq ifrdesc;
+#ifndef IFDESCRSIZE
+       size_t descrlen = 64;
+#else
+       size_t descrlen = IFDESCRSIZE;
+#endif /* IFDESCRSIZE */
+#endif /* SIOCGIFDESCR */
 
 #ifdef SIOCGIFDESCR
        /*
@@ -413,23 +430,72 @@ add_addr_to_iflist(pcap_if_t **alldevs, const char *name, u_int flags,
         */
        memset(&ifrdesc, 0, sizeof ifrdesc);
        strlcpy(ifrdesc.ifr_name, name, sizeof ifrdesc.ifr_name);
-       ifrdesc.ifr_data = (caddr_t)&ifdescr;
        s = socket(AF_INET, SOCK_DGRAM, 0);
        if (s >= 0) {
-               if (ioctl(s, SIOCGIFDESCR, &ifrdesc) == 0 &&
-                   strlen(ifrdesc.ifr_data) != 0)
-                       description = ifrdesc.ifr_data;
+#ifdef __FreeBSD__
+               /*
+                * On FreeBSD, if the buffer isn't big enough for the
+                * description, the ioctl succeeds, but the description
+                * isn't copied, ifr_buffer.length is set to the description
+                * length, and ifr_buffer.buffer is set to NULL.
+                */
+               for (;;) {
+                       free(description);
+                       if ((description = malloc(descrlen)) != NULL) {
+                               ifrdesc.ifr_buffer.buffer = description;
+                               ifrdesc.ifr_buffer.length = descrlen;
+                               if (ioctl(s, SIOCGIFDESCR, &ifrdesc) == 0) {
+                                       if (ifrdesc.ifr_buffer.buffer ==
+                                           description)
+                                               break;
+                                       else
+                                               descrlen = ifrdesc.ifr_buffer.length;
+                               } else {
+                                       /*
+                                        * Failed to get interface description.
+                                        */
+                                       free(description);
+                                       description = NULL;
+                                       break;
+                               }
+                       } else
+                               break;
+               }
+#else /* __FreeBSD__ */
+               /*
+                * The only other OS that currently supports
+                * SIOCGIFDESCR is OpenBSD, and it has no way
+                * to get the description length - it's clamped
+                * to a maximum of IFDESCRSIZE.
+                */
+               if ((description = malloc(descrlen)) != NULL) {
+                       ifrdesc.ifr_data = (caddr_t)description;
+                       if (ioctl(s, SIOCGIFDESCR, &ifrdesc) != 0) {
+                               /*
+                                * Failed to get interface description.
+                                */
+                               free(description);
+                               description = NULL;
+                       }
+               }
+#endif /* __FreeBSD__ */
                close(s);
+               if (description != NULL && strlen(description) == 0) {
+                       free(description);
+                       description = NULL;
+               }
        }
-#endif
+#endif /* SIOCGIFDESCR */
 
        if (add_or_find_if(&curdev, alldevs, name, flags, description,
            errbuf) == -1) {
+               free(description);
                /*
                 * Error - give up.
                 */
                return (-1);
        }
+       free(description);
        if (curdev == NULL) {
                /*
                 * Device wasn't added because it can't be opened.
@@ -669,7 +735,10 @@ pcap_lookupnet(device, netp, maskp, errbuf)
            || strstr(device, "bluetooth") != NULL
 #endif
 #ifdef PCAP_SUPPORT_USB
-           || strstr(device, "usb") != NULL
+           || strstr(device, "usbmon") != NULL
+#endif
+#ifdef HAVE_SNF_API
+           || strstr(device, "snf") != NULL
 #endif
            ) {
                *netp = *maskp = 0;
@@ -702,6 +771,12 @@ pcap_lookupnet(device, netp, maskp, errbuf)
        }
        sin4 = (struct sockaddr_in *)&ifr.ifr_addr;
        *netp = sin4->sin_addr.s_addr;
+       memset(&ifr, 0, sizeof(ifr));
+#ifdef linux
+       /* XXX Work around Linux kernel bug */
+       ifr.ifr_addr.sa_family = AF_INET;
+#endif
+       (void)strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));
        if (ioctl(fd, SIOCGIFNETMASK, (char *)&ifr) < 0) {
                (void)snprintf(errbuf, PCAP_ERRBUF_SIZE,
                    "SIOCGIFNETMASK: %s: %s", device, pcap_strerror(errno));
@@ -803,8 +878,10 @@ pcap_lookupdev(errbuf)
                 */
                while(NAdapts--)
                {
-                       strcpy((char*)tUstr, tAstr);
-                       (char*)tUstr += strlen(tAstr) + 1;;
+                       char* tmp = (char*)tUstr;
+                       strcpy(tmp, tAstr);
+                       tmp += strlen(tAstr) + 1;
+                       tUstr = (WCHAR*)tmp;
                        tAstr += strlen(tAstr) + 1;
                }
 
index ffd3a60..b8c221f 100644 (file)
@@ -18,7 +18,7 @@
  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/llc.h,v 1.2 2001/01/28 09:44:50 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/llc.h,v 1.2 2001-01-28 09:44:50 guy Exp $ (LBL)
  */
 
 /*
index c21e784..5835e4d 100644 (file)
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/nametoaddr.c,v 1.82.2.1 2008/02/06 10:21:47 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/nametoaddr.c,v 1.83 2008-02-06 10:21:30 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
+#ifdef DECNETLIB
+#include <sys/types.h>
+#include <netdnet/dnetdb.h>
+#endif
+
 #ifdef WIN32
 #include <pcap-stdinc.h>
 
@@ -44,13 +49,6 @@ static const char rcsid[] _U_ =
 #include <netinet/in.h>
 #endif /* WIN32 */
 
-/*
- * XXX - why was this included even on UNIX?
- */
-#ifdef __MINGW32__
-#include "IP6_misc.h"
-#endif
-
 #ifndef WIN32
 #ifdef HAVE_ETHER_HOSTTON
 /*
index c3ab8c2..5327a36 100644 (file)
@@ -15,7 +15,7 @@
  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/nlpid.h,v 1.2 2002/12/06 00:01:34 hannes Exp $ (Juniper)
+ * @(#) $Header: /tcpdump/master/libpcap/nlpid.h,v 1.2 2002-12-06 00:01:34 hannes Exp $ (Juniper)
  */
 
 /* Types missing from some systems */
index 475313f..46dffec 100644 (file)
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/optimize.c,v 1.90.2.1 2008/01/02 04:22:16 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/optimize.c,v 1.91 2008-01-02 04:16:46 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
+#ifdef WIN32
+#include <pcap-stdinc.h>
+#else /* WIN32 */
+#if HAVE_INTTYPES_H
+#include <inttypes.h>
+#elif HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
+#include <sys/types.h>
+#endif /* WIN32 */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <memory.h>
index 6ec6515..1d3c8cb 100644 (file)
@@ -20,7 +20,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/pcap-bpf.c,v 1.99.2.17 2008-09-16 18:43:02 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/pcap-bpf.c,v 1.116 2008-09-16 18:42:29 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -31,11 +31,25 @@ static const char rcsid[] _U_ =
 #ifdef HAVE_ZEROCOPY_BPF
 #include <sys/mman.h>
 #endif
-#include <sys/time.h>
-#include <sys/timeb.h>
 #include <sys/socket.h>
-#include <sys/file.h>
+#include <time.h>
+/*
+ * <net/bpf.h> defines ioctls, but doesn't include <sys/ioccom.h>.
+ *
+ * We include <sys/ioctl.h> as it might be necessary to declare ioctl();
+ * at least on *BSD and Mac OS X, it also defines various SIOC ioctls -
+ * we could include <sys/sockio.h>, but if we're already including
+ * <sys/ioctl.h>, which includes <sys/sockio.h> on those platforms,
+ * there's not much point in doing so.
+ *
+ * If we have <sys/ioccom.h>, we include it as well, to handle systems
+ * such as Solaris which don't arrange to include <sys/ioccom.h> if you
+ * include <sys/ioctl.h>
+ */
 #include <sys/ioctl.h>
+#ifdef HAVE_SYS_IOCCOM_H
+#include <sys/ioccom.h>
+#endif
 #include <sys/utsname.h>
 
 #ifdef HAVE_ZEROCOPY_BPF
@@ -85,6 +99,8 @@ static const char rcsid[] _U_ =
 static int bpfloadedflag = 0;
 static int odmlockid = 0;
 
+static int bpf_load(char *errbuf);
+
 #else /* _AIX */
 
 #include <net/bpf.h>
@@ -92,6 +108,7 @@ static int odmlockid = 0;
 #endif /* _AIX */
 
 #include <ctype.h>
+#include <fcntl.h>
 #include <errno.h>
 #include <netdb.h>
 #include <stdio.h>
@@ -109,6 +126,10 @@ static int odmlockid = 0;
 #include "pcap-dag.h"
 #endif /* HAVE_DAG_API */
 
+#ifdef HAVE_SNF_API
+#include "pcap-snf.h"
+#endif /* HAVE_SNF_API */
+
 #ifdef HAVE_OS_PROTO_H
 #include "os-proto.h"
 #endif
@@ -165,62 +186,67 @@ static int pcap_setfilter_bpf(pcap_t *p, struct bpf_program *fp);
 static int pcap_setdirection_bpf(pcap_t *, pcap_direction_t);
 static int pcap_set_datalink_bpf(pcap_t *p, int dlt);
 
-#ifdef HAVE_ZEROCOPY_BPF
 /*
- * For zerocopy bpf, we need to override the setnonblock/getnonblock routines
- * so we don't call select(2) if the pcap handle is in non-blocking mode.  We
- * preserve the timeout supplied by pcap_open functions to make sure it
- * does not get clobbered if the pcap handle moves between blocking and non-
- * blocking mode.
+ * For zerocopy bpf, the setnonblock/getnonblock routines need to modify
+ * p->md.timeout so we don't call select(2) if the pcap handle is in non-
+ * blocking mode.  We preserve the timeout supplied by pcap_open functions
+ * to make sure it does not get clobbered if the pcap handle moves between
+ * blocking and non-blocking mode.
  */
 static int
-pcap_getnonblock_zbuf(pcap_t *p, char *errbuf)
+pcap_getnonblock_bpf(pcap_t *p, char *errbuf)
 { 
-       /*
-        * Use a negative value for the timeout to represent that the
-        * pcap handle is in non-blocking mode.
-        */
-       return (p->md.timeout < 0);
+#ifdef HAVE_ZEROCOPY_BPF
+       if (p->md.zerocopy) {
+               /*
+                * Use a negative value for the timeout to represent that the
+                * pcap handle is in non-blocking mode.
+                */
+               return (p->md.timeout < 0);
+       }
+#endif
+       return (pcap_getnonblock_fd(p, errbuf));
 }
 
 static int
-pcap_setnonblock_zbuf(pcap_t *p, int nonblock, char *errbuf)
+pcap_setnonblock_bpf(pcap_t *p, int nonblock, char *errbuf)
 {   
-       /*
-        * Map each value to the corresponding 2's complement, to
-        * preserve the timeout value provided with pcap_set_timeout.
-        * (from pcap-linux.c).
-        */
-       if (nonblock) {
-               if (p->md.timeout > 0)
-                       p->md.timeout = p->md.timeout * -1 - 1;
-       } else
-               if (p->md.timeout < 0)
-                       p->md.timeout = (p->md.timeout + 1) * -1;
-       return (0);
-}
-
-/*
- * Zero-copy specific close method.  Un-map the shared buffers then call
- * pcap_cleanup_live_common.
- */
-static void
-pcap_cleanup_zbuf(pcap_t *p)
-{
-       /*
-        * Delete the mappings.  Note that p->buffer gets initialized to one
-        * of the mmapped regions in this case, so do not try and free it
-        * directly; null it out so that pcap_cleanup_live_common() doesn't
-        * try to free it.
-        */
-       if (p->md.zbuf1 != MAP_FAILED && p->md.zbuf1 != NULL)
-               (void) munmap(p->md.zbuf1, p->md.zbufsize);
-       if (p->md.zbuf2 != MAP_FAILED && p->md.zbuf2 != NULL)
-               (void) munmap(p->md.zbuf2, p->md.zbufsize);
-       p->buffer = NULL;
-       pcap_cleanup_live_common(p);
+#ifdef HAVE_ZEROCOPY_BPF
+       if (p->md.zerocopy) {
+               /*
+                * Map each value to the corresponding 2's complement, to
+                * preserve the timeout value provided with pcap_set_timeout.
+                * (from pcap-linux.c).
+                */
+               if (nonblock) {
+                       if (p->md.timeout >= 0) {
+                               /*
+                                * Timeout is non-negative, so we're not
+                                * currently in non-blocking mode; set it
+                                * to the 2's complement, to make it
+                                * negative, as an indication that we're
+                                * in non-blocking mode.
+                                */
+                               p->md.timeout = p->md.timeout * -1 - 1;
+                       }
+               } else {
+                       if (p->md.timeout < 0) {
+                               /*
+                                * Timeout is negative, so we're currently
+                                * in blocking mode; reverse the previous
+                                * operation, to make the timeout non-negative
+                                * again.
+                                */
+                               p->md.timeout = (p->md.timeout + 1) * -1;
+                       }
+               }
+               return (0);
+       }
+#endif
+       return (pcap_setnonblock_fd(p, nonblock, errbuf));
 }
 
+#ifdef HAVE_ZEROCOPY_BPF
 /*
  * Zero-copy BPF buffer routines to check for and acknowledge BPF data in
  * shared memory buffers.
@@ -374,7 +400,7 @@ pcap_ack_zbuf(pcap_t *p)
        p->buffer = NULL;
        return (0);
 }
-#endif
+#endif /* HAVE_ZEROCOPY_BPF */
 
 pcap_t *
 pcap_create(const char *device, char *ebuf)
@@ -385,6 +411,10 @@ pcap_create(const char *device, char *ebuf)
        if (strstr(device, "dag"))
                return (dag_create(device, ebuf));
 #endif /* HAVE_DAG_API */
+#ifdef HAVE_SNF_API
+       if (strstr(device, "snf"))
+               return (snf_create(device, ebuf));
+#endif /* HAVE_SNF_API */
 
        p = pcap_create_common(device, ebuf);
        if (p == NULL)
@@ -395,6 +425,10 @@ pcap_create(const char *device, char *ebuf)
        return (p);
 }
 
+/*
+ * On success, returns a file descriptor for a BPF device.
+ * On failure, returns a PCAP_ERROR_ value, and sets p->errbuf.
+ */
 static int
 bpf_open(pcap_t *p)
 {
@@ -455,12 +489,52 @@ bpf_open(pcap_t *p)
         * XXX better message for all minors used
         */
        if (fd < 0) {
-               if (errno == EACCES)
+               switch (errno) {
+
+               case ENOENT:
+                       fd = PCAP_ERROR;
+                       if (n == 1) {
+                               /*
+                                * /dev/bpf0 doesn't exist, which
+                                * means we probably have no BPF
+                                * devices.
+                                */
+                               snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+                                   "(there are no BPF devices)");
+                       } else {
+                               /*
+                                * We got EBUSY on at least one
+                                * BPF device, so we have BPF
+                                * devices, but all the ones
+                                * that exist are busy.
+                                */
+                               snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+                                   "(all BPF devices are busy)");
+                       }
+                       break;
+
+               case EACCES:
+                       /*
+                        * Got EACCES on the last device we tried,
+                        * and EBUSY on all devices before that,
+                        * if any.
+                        */
                        fd = PCAP_ERROR_PERM_DENIED;
-               else
+                       snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+                           "(cannot open BPF device) %s: %s", device,
+                           pcap_strerror(errno));
+                       break;
+
+               default:
+                       /*
+                        * Some other problem.
+                        */
                        fd = PCAP_ERROR;
-               snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "(no devices found) %s: %s",
-                   device, pcap_strerror(errno));
+                       snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+                           "(cannot open BPF device) %s: %s", device,
+                           pcap_strerror(errno));
+                       break;
+               }
        }
 #endif
 
@@ -506,11 +580,20 @@ get_dlt_list(int fd, int v, struct bpf_dltlist *bdlp, char *ebuf)
                 * right thing to do, but I suspect it is - Ethernet <->
                 * 802.11 bridges would probably badly mishandle frames
                 * that don't have Ethernet headers).
+                *
+                * On Solaris with BPF, Ethernet devices also offer
+                * DLT_IPNET, so we, if DLT_IPNET is defined, we don't
+                * treat it as an indication that the device isn't an
+                * Ethernet.
                 */
                if (v == DLT_EN10MB) {
                        is_ethernet = 1;
                        for (i = 0; i < bdlp->bfl_len; i++) {
-                               if (bdlp->bfl_list[i] != DLT_EN10MB) {
+                               if (bdlp->bfl_list[i] != DLT_EN10MB
+#ifdef DLT_IPNET
+                                   && bdlp->bfl_list[i] != DLT_IPNET
+#endif
+                                   ) {
                                        is_ethernet = 0;
                                        break;
                                }
@@ -624,14 +707,23 @@ pcap_can_set_rfmon_bpf(pcap_t *p)
         */
        fd = bpf_open(p);
        if (fd < 0)
-               return (fd);
+               return (fd);    /* fd is the appropriate error code */
 
        /*
         * Now bind to the device.
         */
        (void)strncpy(ifr.ifr_name, p->opt.source, sizeof(ifr.ifr_name));
        if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) < 0) {
-               if (errno == ENETDOWN) {
+               switch (errno) {
+
+               case ENXIO:
+                       /*
+                        * There's no such device.
+                        */
+                       close(fd);
+                       return (PCAP_ERROR_NO_SUCH_DEVICE);
+
+               case ENETDOWN:
                        /*
                         * Return a "network down" indication, so that
                         * the application can report that rather than
@@ -641,7 +733,8 @@ pcap_can_set_rfmon_bpf(pcap_t *p)
                         */
                        close(fd);
                        return (PCAP_ERROR_IFACE_NOT_UP);
-               } else {
+
+               default:
                        snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
                            "BIOCSETIF: %s: %s",
                            p->opt.source, pcap_strerror(errno));
@@ -712,6 +805,7 @@ pcap_stats_bpf(pcap_t *p, struct pcap_stat *ps)
 
        ps->ps_recv = s.bs_recv;
        ps->ps_drop = s.bs_drop;
+       ps->ps_ifdrop = 0;
        return (0);
 }
 
@@ -801,7 +895,22 @@ pcap_read_bpf(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
 
                        case EWOULDBLOCK:
                                return (0);
-#if defined(sun) && !defined(BSD)
+
+                       case ENXIO:
+                               /*
+                                * The device on which we're capturing
+                                * went away.
+                                *
+                                * XXX - we should really return
+                                * PCAP_ERROR_IFACE_NOT_UP, but
+                                * pcap_dispatch() etc. aren't
+                                * defined to retur that.
+                                */
+                               snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+                                   "The interface went down");
+                               return (PCAP_ERROR);
+
+#if defined(sun) && !defined(BSD) && !defined(__svr4__) && !defined(__SVR4)
                        /*
                         * Due to a SunOS bug, after 2^31 bytes, the kernel
                         * file offset overflows and read fails with EINVAL.
@@ -846,14 +955,28 @@ pcap_read_bpf(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
                 * processed so far.
                 */
                if (p->break_loop) {
+                       p->bp = bp;
+                       p->cc = ep - bp;
+                       /*
+                        * ep is set based on the return value of read(),
+                        * but read() from a BPF device doesn't necessarily
+                        * return a value that's a multiple of the alignment
+                        * value for BPF_WORDALIGN().  However, whenever we
+                        * increment bp, we round up the increment value by
+                        * a value rounded up by BPF_WORDALIGN(), so we
+                        * could increment bp past ep after processing the
+                        * last packet in the buffer.
+                        *
+                        * We treat ep < bp as an indication that this
+                        * happened, and just set p->cc to 0.
+                        */
+                       if (p->cc < 0)
+                               p->cc = 0;
                        if (n == 0) {
                                p->break_loop = 0;
                                return (PCAP_ERROR_BREAK);
-                       } else {
-                               p->bp = bp;
-                               p->cc = ep - bp;
+                       } else
                                return (n);
-                       }
                }
 
                caplen = bhp->bh_caplen;
@@ -905,6 +1028,11 @@ pcap_read_bpf(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
                        if (++n >= cnt && cnt > 0) {
                                p->bp = bp;
                                p->cc = ep - bp;
+                               /*
+                                * See comment above about p->cc < 0.
+                                */
+                               if (p->cc < 0)
+                                       p->cc = 0;
                                return (n);
                        }
                } else {
@@ -989,6 +1117,7 @@ bpf_odminit(char *errbuf)
                snprintf(errbuf, PCAP_ERRBUF_SIZE,
                    "bpf_load: odm_lock of /etc/objrepos/config_lock failed: %s",
                    errstr);
+               (void)odm_terminate();
                return (PCAP_ERROR);
        }
 
@@ -1001,20 +1130,24 @@ bpf_odmcleanup(char *errbuf)
        char *errstr;
 
        if (odm_unlock(odmlockid) == -1) {
-               if (odm_err_msg(odmerrno, &errstr) == -1)
-                       errstr = "Unknown error";
-               snprintf(errbuf, PCAP_ERRBUF_SIZE,
-                   "bpf_load: odm_unlock failed: %s",
-                   errstr);
+               if (errbuf != NULL) {
+                       if (odm_err_msg(odmerrno, &errstr) == -1)
+                               errstr = "Unknown error";
+                       snprintf(errbuf, PCAP_ERRBUF_SIZE,
+                           "bpf_load: odm_unlock failed: %s",
+                           errstr);
+               }
                return (PCAP_ERROR);
        }
 
        if (odm_terminate() == -1) {
-               if (odm_err_msg(odmerrno, &errstr) == -1)
-                       errstr = "Unknown error";
-               snprintf(errbuf, PCAP_ERRBUF_SIZE,
-                   "bpf_load: odm_terminate failed: %s",
-                   errstr);
+               if (errbuf != NULL) {
+                       if (odm_err_msg(odmerrno, &errstr) == -1)
+                               errstr = "Unknown error";
+                       snprintf(errbuf, PCAP_ERRBUF_SIZE,
+                           "bpf_load: odm_terminate failed: %s",
+                           errstr);
+               }
                return (PCAP_ERROR);
        }
 
@@ -1047,6 +1180,7 @@ bpf_load(char *errbuf)
        if (major == -1) {
                snprintf(errbuf, PCAP_ERRBUF_SIZE,
                    "bpf_load: genmajor failed: %s", pcap_strerror(errno));
+               (void)bpf_odmcleanup(NULL);
                return (PCAP_ERROR);
        }
 
@@ -1057,6 +1191,7 @@ bpf_load(char *errbuf)
                        snprintf(errbuf, PCAP_ERRBUF_SIZE,
                            "bpf_load: genminor failed: %s",
                            pcap_strerror(errno));
+                       (void)bpf_odmcleanup(NULL);
                        return (PCAP_ERROR);
                }
        }
@@ -1133,13 +1268,13 @@ pcap_cleanup_bpf(pcap_t *p)
        struct ifreq ifr;
 #endif
 
-       if (p->md.must_clear != 0) {
+       if (p->md.must_do_on_close != 0) {
                /*
                 * There's something we have to do when closing this
                 * pcap_t.
                 */
 #ifdef HAVE_BSD_IEEE80211
-               if (p->md.must_clear & MUST_CLEAR_RFMON) {
+               if (p->md.must_do_on_close & MUST_CLEAR_RFMON) {
                        /*
                         * We put the interface into rfmon mode;
                         * take it out of rfmon mode.
@@ -1194,19 +1329,23 @@ pcap_cleanup_bpf(pcap_t *p)
                 * have to take the interface out of some mode.
                 */
                pcap_remove_from_pcaps_to_close(p);
-               p->md.must_clear = 0;
+               p->md.must_do_on_close = 0;
        }
 
 #ifdef HAVE_ZEROCOPY_BPF
-       /*
-        * In zero-copy mode, p->buffer is just a pointer into one of the two
-        * memory-mapped buffers, so no need to free it.
-        */
        if (p->md.zerocopy) {
+               /*
+                * Delete the mappings.  Note that p->buffer gets
+                * initialized to one of the mmapped regions in
+                * this case, so do not try and free it directly;
+                * null it out so that pcap_cleanup_live_common()
+                * doesn't try to free it.
+                */
                if (p->md.zbuf1 != MAP_FAILED && p->md.zbuf1 != NULL)
-                       munmap(p->md.zbuf1, p->md.zbufsize);
+                       (void) munmap(p->md.zbuf1, p->md.zbufsize);
                if (p->md.zbuf2 != MAP_FAILED && p->md.zbuf2 != NULL)
-                       munmap(p->md.zbuf2, p->md.zbufsize);
+                       (void) munmap(p->md.zbuf2, p->md.zbufsize);
+               p->buffer = NULL;
        }
 #endif
        if (p->md.device != NULL) {
@@ -1251,7 +1390,9 @@ check_setif_failure(pcap_t *p, int error)
                                         * exist.
                                         */
                                        err = PCAP_ERROR_NO_SUCH_DEVICE;
-                                       strcpy(p->errbuf, "");
+                                       snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+                                           "SIOCGIFFLAGS on %s failed: %s",
+                                           ifr.ifr_name, pcap_strerror(errno));
                                } else {
                                        /*
                                         * The underlying "enN" device
@@ -1273,7 +1414,9 @@ check_setif_failure(pcap_t *p, int error)
                                 * just report "no such device".
                                 */
                                err = PCAP_ERROR_NO_SUCH_DEVICE;
-                               strcpy(p->errbuf, "");
+                               snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+                                   "socket() failed: %s",
+                                   pcap_strerror(errno));
                        }
                        return (err);
                }
@@ -1281,7 +1424,8 @@ check_setif_failure(pcap_t *p, int error)
                /*
                 * No such device.
                 */
-               strcpy(p->errbuf, "");
+               snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSETIF failed: %s",
+                   pcap_strerror(errno));
                return (PCAP_ERROR_NO_SUCH_DEVICE);
        } else if (errno == ENETDOWN) {
                /*
@@ -1303,12 +1447,27 @@ check_setif_failure(pcap_t *p, int error)
        }
 }
 
+/*
+ * Default capture buffer size.
+ * 32K isn't very much for modern machines with fast networks; we
+ * pick .5M, as that's the maximum on at least some systems with BPF.
+ */
+#define DEFAULT_BUFSIZE        524288
+
 static int
 pcap_activate_bpf(pcap_t *p)
 {
        int status = 0;
        int fd;
+#ifdef LIFNAMSIZ
+       struct lifreq ifr;
+       char *ifrname = ifr.lifr_name;
+       const size_t ifnamsiz = sizeof(ifr.lifr_name);
+#else
        struct ifreq ifr;
+       char *ifrname = ifr.ifr_name;
+       const size_t ifnamsiz = sizeof(ifr.ifr_name);
+#endif
        struct bpf_version bv;
 #ifdef __APPLE__
        int sockfd;
@@ -1400,9 +1559,8 @@ pcap_activate_bpf(pcap_t *p)
                                         */
                                        sockfd = socket(AF_INET, SOCK_DGRAM, 0);
                                        if (sockfd != -1) {
-                                               strlcpy(ifr.ifr_name,
-                                                   p->opt.source,
-                                                   sizeof(ifr.ifr_name));
+                                               strlcpy(ifrname,
+                                                   p->opt.source, ifnamsiz);
                                                if (ioctl(sockfd, SIOCGIFFLAGS,
                                                    (char *)&ifr) < 0) {
                                                        /*
@@ -1413,7 +1571,10 @@ pcap_activate_bpf(pcap_t *p)
                                                         * exist.
                                                         */
                                                        status = PCAP_ERROR_NO_SUCH_DEVICE;
-                                                       strcpy(p->errbuf, "");
+                                                       snprintf(p->errbuf,
+                                                           PCAP_ERRBUF_SIZE,
+                                                           "SIOCGIFFLAGS failed: %s",
+                                                           pcap_strerror(errno));
                                                } else
                                                        status = PCAP_ERROR_RFMON_NOTSUP;
                                                close(sockfd);
@@ -1424,7 +1585,10 @@ pcap_activate_bpf(pcap_t *p)
                                                 * report "no such device".
                                                 */
                                                status = PCAP_ERROR_NO_SUCH_DEVICE;
-                                               strcpy(p->errbuf, "");
+                                               snprintf(p->errbuf,
+                                                   PCAP_ERRBUF_SIZE,
+                                                   "socket() failed: %s",
+                                                   pcap_strerror(errno));
                                        }
                                        goto bad;
                                }
@@ -1462,14 +1626,6 @@ pcap_activate_bpf(pcap_t *p)
                p->md.zerocopy = 1;
 
                /*
-                * Set the cleanup and set/get nonblocking mode ops
-                * as appropriate for zero-copy mode.
-                */
-               p->cleanup_op = pcap_cleanup_zbuf;
-               p->setnonblock_op = pcap_setnonblock_zbuf;
-               p->getnonblock_op = pcap_getnonblock_zbuf;
-
-               /*
                 * How to pick a buffer size: first, query the maximum buffer
                 * size supported by zero-copy.  This also lets us quickly
                 * determine whether the kernel generally supports zero-copy.
@@ -1491,8 +1647,8 @@ pcap_activate_bpf(pcap_t *p)
                        v = p->opt.buffer_size;
                } else {
                        if ((ioctl(fd, BIOCGBLEN, (caddr_t)&v) < 0) ||
-                           v < 32768)
-                               v = 32768;
+                           v < DEFAULT_BUFSIZE)
+                               v = DEFAULT_BUFSIZE;
                }
 #ifndef roundup
 #define roundup(x, y)   ((((x)+((y)-1))/(y))*(y))  /* to any y */
@@ -1518,7 +1674,7 @@ pcap_activate_bpf(pcap_t *p)
                            pcap_strerror(errno));
                        goto bad;
                }
-               (void)strncpy(ifr.ifr_name, p->opt.source, sizeof(ifr.ifr_name));
+               (void)strncpy(ifrname, p->opt.source, ifnamsiz);
                if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) < 0) {
                        snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSETIF: %s: %s",
                            p->opt.source, pcap_strerror(errno));
@@ -1548,9 +1704,13 @@ pcap_activate_bpf(pcap_t *p)
                        /*
                         * Now bind to the device.
                         */
-                       (void)strncpy(ifr.ifr_name, p->opt.source,
-                           sizeof(ifr.ifr_name));
-                       if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) < 0) {
+                       (void)strncpy(ifrname, p->opt.source, ifnamsiz);
+#ifdef BIOCSETLIF
+                       if (ioctl(fd, BIOCSETLIF, (caddr_t)&ifr) < 0)
+#else
+                       if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) < 0)
+#endif
+                       {
                                status = check_setif_failure(p, errno);
                                goto bad;
                        }
@@ -1558,14 +1718,15 @@ pcap_activate_bpf(pcap_t *p)
                        /*
                         * No buffer size was explicitly specified.
                         *
-                        * Try finding a good size for the buffer; 32768 may
-                        * be too big, so keep cutting it in half until we
-                        * find a size that works, or run out of sizes to try.
+                        * Try finding a good size for the buffer;
+                        * DEFAULT_BUFSIZE may be too big, so keep
+                        * cutting it in half until we find a size
+                        * that works, or run out of sizes to try.
                         * If the default is larger, don't make it smaller.
                         */
                        if ((ioctl(fd, BIOCGBLEN, (caddr_t)&v) < 0) ||
-                           v < 32768)
-                               v = 32768;
+                           v < DEFAULT_BUFSIZE)
+                               v = DEFAULT_BUFSIZE;
                        for ( ; v != 0; v >>= 1) {
                                /*
                                 * Ignore the return value - this is because the
@@ -1576,9 +1737,12 @@ pcap_activate_bpf(pcap_t *p)
                                 */
                                (void) ioctl(fd, BIOCSBLEN, (caddr_t)&v);
 
-                               (void)strncpy(ifr.ifr_name, p->opt.source,
-                                   sizeof(ifr.ifr_name));
+                               (void)strncpy(ifrname, p->opt.source, ifnamsiz);
+#ifdef BIOCSETLIF
+                               if (ioctl(fd, BIOCSETLIF, (caddr_t)&ifr) >= 0)
+#else
                                if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) >= 0)
+#endif
                                        break;  /* that size worked; we're done */
 
                                if (errno != ENOBUFS) {
@@ -1859,16 +2023,45 @@ pcap_activate_bpf(pcap_t *p)
                 * XXX - is this seconds/nanoseconds in AIX?
                 * (Treating it as such doesn't fix the timeout
                 * problem described below.)
+                *
+                * XXX - Mac OS X 10.6 mishandles BIOCSRTIMEOUT in
+                * 64-bit userland - it takes, as an argument, a
+                * "struct BPF_TIMEVAL", which has 32-bit tv_sec
+                * and tv_usec, rather than a "struct timeval".
+                *
+                * If this platform defines "struct BPF_TIMEVAL",
+                * we check whether the structure size in BIOCSRTIMEOUT
+                * is that of a "struct timeval" and, if not, we use
+                * a "struct BPF_TIMEVAL" rather than a "struct timeval".
+                * (That way, if the bug is fixed in a future release,
+                * we will still do the right thing.)
                 */
                struct timeval to;
-               to.tv_sec = p->md.timeout / 1000;
-               to.tv_usec = (p->md.timeout * 1000) % 1000000;
-               if (ioctl(p->fd, BIOCSRTIMEOUT, (caddr_t)&to) < 0) {
-                       snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSRTIMEOUT: %s",
-                           pcap_strerror(errno));
-                       status = PCAP_ERROR;
-                       goto bad;
+#ifdef HAVE_STRUCT_BPF_TIMEVAL
+               struct BPF_TIMEVAL bpf_to;
+
+               if (IOCPARM_LEN(BIOCSRTIMEOUT) != sizeof(struct timeval)) {
+                       bpf_to.tv_sec = p->md.timeout / 1000;
+                       bpf_to.tv_usec = (p->md.timeout * 1000) % 1000000;
+                       if (ioctl(p->fd, BIOCSRTIMEOUT, (caddr_t)&bpf_to) < 0) {
+                               snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+                                   "BIOCSRTIMEOUT: %s", pcap_strerror(errno));
+                               status = PCAP_ERROR;
+                               goto bad;
+                       }
+               } else {
+#endif
+                       to.tv_sec = p->md.timeout / 1000;
+                       to.tv_usec = (p->md.timeout * 1000) % 1000000;
+                       if (ioctl(p->fd, BIOCSRTIMEOUT, (caddr_t)&to) < 0) {
+                               snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+                                   "BIOCSRTIMEOUT: %s", pcap_strerror(errno));
+                               status = PCAP_ERROR;
+                               goto bad;
+                       }
+#ifdef HAVE_STRUCT_BPF_TIMEVAL
                }
+#endif
        }
 
 #ifdef _AIX
@@ -2040,8 +2233,8 @@ pcap_activate_bpf(pcap_t *p)
        p->setfilter_op = pcap_setfilter_bpf;
        p->setdirection_op = pcap_setdirection_bpf;
        p->set_datalink_op = pcap_set_datalink_bpf;
-       p->getnonblock_op = pcap_getnonblock_fd;
-       p->setnonblock_op = pcap_setnonblock_fd;
+       p->getnonblock_op = pcap_getnonblock_bpf;
+       p->setnonblock_op = pcap_setnonblock_bpf;
        p->stats_op = pcap_stats_bpf;
        p->cleanup_op = pcap_cleanup_bpf;
 
@@ -2058,6 +2251,10 @@ pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
        if (dag_platform_finddevs(alldevsp, errbuf) < 0)
                return (-1);
 #endif /* HAVE_DAG_API */
+#ifdef HAVE_SNF_API
+       if (snf_platform_finddevs(alldevsp, errbuf) < 0)
+               return (-1);
+#endif /* HAVE_SNF_API */
 
        return (0);
 }
@@ -2090,17 +2287,28 @@ monitor_mode(pcap_t *p, int set)
                /*
                 * Can't get the media types.
                 */
-               if (errno == EINVAL) {
+               switch (errno) {
+
+               case ENXIO:
+                       /*
+                        * There's no such device.
+                        */
+                       close(sock);
+                       return (PCAP_ERROR_NO_SUCH_DEVICE);
+
+               case EINVAL:
                        /*
                         * Interface doesn't support SIOC{G,S}IFMEDIA.
                         */
                        close(sock);
                        return (PCAP_ERROR_RFMON_NOTSUP);
+
+               default:
+                       snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+                           "SIOCGIFMEDIA 1: %s", pcap_strerror(errno));
+                       close(sock);
+                       return (PCAP_ERROR);
                }
-               snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "SIOCGIFMEDIA 1: %s",
-                   pcap_strerror(errno));
-               close(sock);
-               return (PCAP_ERROR);
        }
        if (req.ifm_count == 0) {
                /*
@@ -2192,7 +2400,7 @@ monitor_mode(pcap_t *p, int set)
                                return (PCAP_ERROR);
                        }
 
-                       p->md.must_clear |= MUST_CLEAR_RFMON;
+                       p->md.must_do_on_close |= MUST_CLEAR_RFMON;
 
                        /*
                         * Add this to the list of pcaps to close when we exit.
@@ -2277,7 +2485,8 @@ find_802_11(struct bpf_dltlist *bdlp)
 
 #if defined(__APPLE__) && defined(BIOCGDLTLIST)
 /*
- * Remove DLT_EN10MB from the list of DLT_ values.
+ * Remove DLT_EN10MB from the list of DLT_ values, as we're in monitor mode,
+ * and DLT_EN10MB isn't supported in monitor mode.
  */
 static void
 remove_en(pcap_t *p)
@@ -2318,10 +2527,9 @@ remove_en(pcap_t *p)
 }
 
 /*
- * Remove DLT_EN10MB from the list of DLT_ values, and look for the
- * best 802.11 link-layer type in that list and return it.
- * Radiotap is better than anything else; 802.11 with any other radio
- * header is better than 802.11 with no radio header.
+ * Remove 802.11 link-layer types from the list of DLT_ values, as
+ * we're not in monitor mode, and those DLT_ values will switch us
+ * to monitor mode.
  */
 static void
 remove_802_11(pcap_t *p)
similarity index 67%
copy from contrib/libpcap/arcnet.h
copy to contrib/libpcap/pcap-bpf.h
index dce7335..7b7e90a 100644 (file)
@@ -1,7 +1,12 @@
-/*
- * Copyright (c) 1982, 1986, 1993
+/*-
+ * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
  *     The Regents of the University of California.  All rights reserved.
  *
+ * This code is derived from the Stanford/CMU enet packet filter,
+ * (net/enet.c) distributed as part of 4.3BSD, and code contributed
+ * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence 
+ * Berkeley Laboratory.
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -12,8 +17,8 @@
  *    documentation and/or other materials provided with the distribution.
  * 3. All advertising materials mentioning features or use of this software
  *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
+ *      This product includes software developed by the University of
+ *      California, Berkeley and its contributors.
  * 4. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * @(#) $Id: arcnet.h,v 1.2 2001/04/24 02:17:52 guy Exp $ (LBL)
- *
- * from: NetBSD: if_arc.h,v 1.13 1999/11/19 20:41:19 thorpej Exp
+ * @(#) $Header: /tcpdump/master/libpcap/pcap-bpf.h,v 1.50 2007-04-01 21:43:55 guy Exp $ (LBL)
  */
 
-/* RFC 1051 */
-#define        ARCTYPE_IP_OLD          240     /* IP protocol */
-#define        ARCTYPE_ARP_OLD         241     /* address resolution protocol */
-
-/* RFC 1201 */
-#define        ARCTYPE_IP              212     /* IP protocol */
-#define        ARCTYPE_ARP             213     /* address resolution protocol */
-#define        ARCTYPE_REVARP          214     /* reverse addr resolution protocol */
-
-#define        ARCTYPE_ATALK           221     /* Appletalk */
-#define        ARCTYPE_BANIAN          247     /* Banyan Vines */
-#define        ARCTYPE_IPX             250     /* Novell IPX */
-
-#define ARCTYPE_INET6          0xc4    /* IPng */
-#define ARCTYPE_DIAGNOSE       0x80    /* as per ANSI/ATA 878.1 */
+/*
+ * For backwards compatibility.
+ *
+ * Note to OS vendors: do NOT get rid of this file!  Some applications
+ * might expect to be able to include <pcap-bpf.h>.
+ */
+#include <pcap/bpf.h>
diff --git a/contrib/libpcap/pcap-common.c b/contrib/libpcap/pcap-common.c
new file mode 100644 (file)
index 0000000..f188eeb
--- /dev/null
@@ -0,0 +1,1110 @@
+/*
+ * Copyright (c) 1993, 1994, 1995, 1996, 1997
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that: (1) source code distributions
+ * retain the above copyright notice and this paragraph in its entirety, (2)
+ * distributions including binary code include the above copyright notice and
+ * this paragraph in its entirety in the documentation or other materials
+ * provided with the distribution, and (3) all advertising materials mentioning
+ * features or use of this software display the following acknowledgement:
+ * ``This product includes software developed by the University of California,
+ * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
+ * the University nor the names of its contributors may be used to endorse
+ * or promote products derived from this software without specific prior
+ * written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * pcap-common.c - common code for pcap and pcap-ng files
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef WIN32
+#include <pcap-stdinc.h>
+#else /* WIN32 */
+#if HAVE_INTTYPES_H
+#include <inttypes.h>
+#elif HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
+#include <sys/types.h>
+#endif /* WIN32 */
+
+#include "pcap-int.h"
+#include "pcap/usb.h"
+
+#include "pcap-common.h"
+
+/*
+ * We don't write DLT_* values to capture files, because they're not the
+ * same on all platforms.
+ *
+ * Unfortunately, the various flavors of BSD have not always used the same
+ * numerical values for the same data types, and various patches to
+ * libpcap for non-BSD OSes have added their own DLT_* codes for link
+ * layer encapsulation types seen on those OSes, and those codes have had,
+ * in some cases, values that were also used, on other platforms, for other
+ * link layer encapsulation types.
+ *
+ * This means that capture files of a type whose numerical DLT_* code
+ * means different things on different BSDs, or with different versions
+ * of libpcap, can't always be read on systems other than those like
+ * the one running on the machine on which the capture was made.
+ *
+ * Instead, we define here a set of LINKTYPE_* codes, and map DLT_* codes
+ * to LINKTYPE_* codes when writing a savefile header, and map LINKTYPE_*
+ * codes to DLT_* codes when reading a savefile header.
+ *
+ * For those DLT_* codes that have, as far as we know, the same values on
+ * all platforms (DLT_NULL through DLT_FDDI), we define LINKTYPE_xxx as
+ * DLT_xxx; that way, captures of those types can still be read by
+ * versions of libpcap that map LINKTYPE_* values to DLT_* values, and
+ * captures of those types written by versions of libpcap that map DLT_
+ * values to LINKTYPE_ values can still be read by older versions
+ * of libpcap.
+ *
+ * The other LINKTYPE_* codes are given values starting at 100, in the
+ * hopes that no DLT_* code will be given one of those values.
+ *
+ * In order to ensure that a given LINKTYPE_* code's value will refer to
+ * the same encapsulation type on all platforms, you should not allocate
+ * a new LINKTYPE_* value without consulting
+ * "tcpdump-workers@lists.tcpdump.org".  The tcpdump developers will
+ * allocate a value for you, and will not subsequently allocate it to
+ * anybody else; that value will be added to the "pcap.h" in the
+ * tcpdump.org Git repository, so that a future libpcap release will
+ * include it.
+ *
+ * You should, if possible, also contribute patches to libpcap and tcpdump
+ * to handle the new encapsulation type, so that they can also be checked
+ * into the tcpdump.org Git repository and so that they will appear in
+ * future libpcap and tcpdump releases.
+ *
+ * Do *NOT* assume that any values after the largest value in this file
+ * are available; you might not have the most up-to-date version of this
+ * file, and new values after that one might have been assigned.  Also,
+ * do *NOT* use any values below 100 - those might already have been
+ * taken by one (or more!) organizations.
+ *
+ * Any platform that defines additional DLT_* codes should:
+ *
+ *     request a LINKTYPE_* code and value from tcpdump.org,
+ *     as per the above;
+ *
+ *     add, in their version of libpcap, an entry to map
+ *     those DLT_* codes to the corresponding LINKTYPE_*
+ *     code;
+ *
+ *     redefine, in their "net/bpf.h", any DLT_* values
+ *     that collide with the values used by their additional
+ *     DLT_* codes, to remove those collisions (but without
+ *     making them collide with any of the LINKTYPE_*
+ *     values equal to 50 or above; they should also avoid
+ *     defining DLT_* values that collide with those
+ *     LINKTYPE_* values, either).
+ */
+#define LINKTYPE_NULL          DLT_NULL
+#define LINKTYPE_ETHERNET      DLT_EN10MB      /* also for 100Mb and up */
+#define LINKTYPE_EXP_ETHERNET  DLT_EN3MB       /* 3Mb experimental Ethernet */
+#define LINKTYPE_AX25          DLT_AX25
+#define LINKTYPE_PRONET                DLT_PRONET
+#define LINKTYPE_CHAOS         DLT_CHAOS
+#define LINKTYPE_TOKEN_RING    DLT_IEEE802     /* DLT_IEEE802 is used for Token Ring */
+#define LINKTYPE_ARCNET_BSD    DLT_ARCNET      /* BSD-style headers */
+#define LINKTYPE_SLIP          DLT_SLIP
+#define LINKTYPE_PPP           DLT_PPP
+#define LINKTYPE_FDDI          DLT_FDDI
+
+/*
+ * LINKTYPE_PPP is for use when there might, or might not, be an RFC 1662
+ * PPP in HDLC-like framing header (with 0xff 0x03 before the PPP protocol
+ * field) at the beginning of the packet.
+ *
+ * This is for use when there is always such a header; the address field
+ * might be 0xff, for regular PPP, or it might be an address field for Cisco
+ * point-to-point with HDLC framing as per section 4.3.1 of RFC 1547 ("Cisco
+ * HDLC").  This is, for example, what you get with NetBSD's DLT_PPP_SERIAL.
+ *
+ * We give it the same value as NetBSD's DLT_PPP_SERIAL, in the hopes that
+ * nobody else will choose a DLT_ value of 50, and so that DLT_PPP_SERIAL
+ * captures will be written out with a link type that NetBSD's tcpdump
+ * can read.
+ */
+#define LINKTYPE_PPP_HDLC      50              /* PPP in HDLC-like framing */
+
+#define LINKTYPE_PPP_ETHER     51              /* NetBSD PPP-over-Ethernet */
+
+#define LINKTYPE_SYMANTEC_FIREWALL 99          /* Symantec Enterprise Firewall */
+
+/*
+ * These correspond to DLT_s that have different values on different
+ * platforms; we map between these values in capture files and
+ * the DLT_ values as returned by pcap_datalink() and passed to
+ * pcap_open_dead().
+ */
+#define LINKTYPE_ATM_RFC1483   100             /* LLC/SNAP-encapsulated ATM */
+#define LINKTYPE_RAW           101             /* raw IP */
+#define LINKTYPE_SLIP_BSDOS    102             /* BSD/OS SLIP BPF header */
+#define LINKTYPE_PPP_BSDOS     103             /* BSD/OS PPP BPF header */
+
+/*
+ * Values starting with 104 are used for newly-assigned link-layer
+ * header type values; for those link-layer header types, the DLT_
+ * value returned by pcap_datalink() and passed to pcap_open_dead(),
+ * and the LINKTYPE_ value that appears in capture files, are the
+ * same.
+ *
+ * LINKTYPE_MATCHING_MIN is the lowest such value; LINKTYPE_MATCHING_MAX
+ * is the highest such value.
+ */
+#define LINKTYPE_MATCHING_MIN  104             /* lowest value in the "matching" range */
+
+#define LINKTYPE_C_HDLC                104             /* Cisco HDLC */
+#define LINKTYPE_IEEE802_11    105             /* IEEE 802.11 (wireless) */
+#define LINKTYPE_ATM_CLIP      106             /* Linux Classical IP over ATM */
+#define LINKTYPE_FRELAY                107             /* Frame Relay */
+#define LINKTYPE_LOOP          108             /* OpenBSD loopback */
+#define LINKTYPE_ENC           109             /* OpenBSD IPSEC enc */
+
+/*
+ * These three types are reserved for future use.
+ */
+#define LINKTYPE_LANE8023      110             /* ATM LANE + 802.3 */
+#define LINKTYPE_HIPPI         111             /* NetBSD HIPPI */
+#define LINKTYPE_HDLC          112             /* NetBSD HDLC framing */
+
+#define LINKTYPE_LINUX_SLL     113             /* Linux cooked socket capture */
+#define LINKTYPE_LTALK         114             /* Apple LocalTalk hardware */
+#define LINKTYPE_ECONET                115             /* Acorn Econet */
+
+/*
+ * Reserved for use with OpenBSD ipfilter.
+ */
+#define LINKTYPE_IPFILTER      116
+
+#define LINKTYPE_PFLOG         117             /* OpenBSD DLT_PFLOG */
+#define LINKTYPE_CISCO_IOS     118             /* For Cisco-internal use */
+#define LINKTYPE_PRISM_HEADER  119             /* 802.11+Prism II monitor mode */
+#define LINKTYPE_AIRONET_HEADER        120             /* FreeBSD Aironet driver stuff */
+
+/*
+ * Reserved for Siemens HiPath HDLC.
+ */
+#define LINKTYPE_HHDLC         121
+
+#define LINKTYPE_IP_OVER_FC    122             /* RFC 2625 IP-over-Fibre Channel */
+#define LINKTYPE_SUNATM                123             /* Solaris+SunATM */
+
+/*
+ * Reserved as per request from Kent Dahlgren <kent@praesum.com>
+ * for private use.
+ */
+#define LINKTYPE_RIO           124             /* RapidIO */
+#define LINKTYPE_PCI_EXP       125             /* PCI Express */
+#define LINKTYPE_AURORA                126             /* Xilinx Aurora link layer */
+
+#define LINKTYPE_IEEE802_11_RADIO 127          /* 802.11 plus BSD radio header */
+
+/*
+ * Reserved for the TZSP encapsulation, as per request from
+ * Chris Waters <chris.waters@networkchemistry.com>
+ * TZSP is a generic encapsulation for any other link type,
+ * which includes a means to include meta-information
+ * with the packet, e.g. signal strength and channel
+ * for 802.11 packets.
+ */
+#define LINKTYPE_TZSP          128             /* Tazmen Sniffer Protocol */
+
+#define LINKTYPE_ARCNET_LINUX  129             /* Linux-style headers */
+
+/*
+ * Juniper-private data link types, as per request from
+ * Hannes Gredler <hannes@juniper.net>.  The corresponding
+ * DLT_s are used for passing on chassis-internal
+ * metainformation such as QOS profiles, etc..
+ */
+#define LINKTYPE_JUNIPER_MLPPP  130
+#define LINKTYPE_JUNIPER_MLFR   131
+#define LINKTYPE_JUNIPER_ES     132
+#define LINKTYPE_JUNIPER_GGSN   133
+#define LINKTYPE_JUNIPER_MFR    134
+#define LINKTYPE_JUNIPER_ATM2   135
+#define LINKTYPE_JUNIPER_SERVICES 136
+#define LINKTYPE_JUNIPER_ATM1   137
+
+#define LINKTYPE_APPLE_IP_OVER_IEEE1394 138    /* Apple IP-over-IEEE 1394 cooked header */
+
+#define LINKTYPE_MTP2_WITH_PHDR        139
+#define LINKTYPE_MTP2          140
+#define LINKTYPE_MTP3          141
+#define LINKTYPE_SCCP          142
+
+#define LINKTYPE_DOCSIS                143             /* DOCSIS MAC frames */
+
+#define LINKTYPE_LINUX_IRDA    144             /* Linux-IrDA */
+
+/*
+ * Reserved for IBM SP switch and IBM Next Federation switch.
+ */
+#define LINKTYPE_IBM_SP                145
+#define LINKTYPE_IBM_SN                146
+
+/*
+ * Reserved for private use.  If you have some link-layer header type
+ * that you want to use within your organization, with the capture files
+ * using that link-layer header type not ever be sent outside your
+ * organization, you can use these values.
+ *
+ * No libpcap release will use these for any purpose, nor will any
+ * tcpdump release use them, either.
+ *
+ * Do *NOT* use these in capture files that you expect anybody not using
+ * your private versions of capture-file-reading tools to read; in
+ * particular, do *NOT* use them in products, otherwise you may find that
+ * people won't be able to use tcpdump, or snort, or Ethereal, or... to
+ * read capture files from your firewall/intrusion detection/traffic
+ * monitoring/etc. appliance, or whatever product uses that LINKTYPE_ value,
+ * and you may also find that the developers of those applications will
+ * not accept patches to let them read those files.
+ *
+ * Also, do not use them if somebody might send you a capture using them
+ * for *their* private type and tools using them for *your* private type
+ * would have to read them.
+ *
+ * Instead, in those cases, ask "tcpdump-workers@lists.tcpdump.org" for a
+ * new DLT_ and LINKTYPE_ value, as per the comment in pcap/bpf.h, and use
+ * the type you're given.
+ */
+#define LINKTYPE_USER0         147
+#define LINKTYPE_USER1         148
+#define LINKTYPE_USER2         149
+#define LINKTYPE_USER3         150
+#define LINKTYPE_USER4         151
+#define LINKTYPE_USER5         152
+#define LINKTYPE_USER6         153
+#define LINKTYPE_USER7         154
+#define LINKTYPE_USER8         155
+#define LINKTYPE_USER9         156
+#define LINKTYPE_USER10                157
+#define LINKTYPE_USER11                158
+#define LINKTYPE_USER12                159
+#define LINKTYPE_USER13                160
+#define LINKTYPE_USER14                161
+#define LINKTYPE_USER15                162
+
+/*
+ * For future use with 802.11 captures - defined by AbsoluteValue
+ * Systems to store a number of bits of link-layer information
+ * including radio information:
+ *
+ *     http://www.shaftnet.org/~pizza/software/capturefrm.txt
+ *
+ * but could and arguably should also be used by non-AVS Linux
+ * 802.11 drivers; that may happen in the future.
+ */
+#define LINKTYPE_IEEE802_11_RADIO_AVS 163      /* 802.11 plus AVS radio header */
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>.  The corresponding
+ * DLT_s are used for passing on chassis-internal
+ * metainformation such as QOS profiles, etc..
+ */
+#define LINKTYPE_JUNIPER_MONITOR 164
+
+/*
+ * Reserved for BACnet MS/TP.
+ */
+#define LINKTYPE_BACNET_MS_TP  165
+
+/*
+ * Another PPP variant as per request from Karsten Keil <kkeil@suse.de>.
+ *
+ * This is used in some OSes to allow a kernel socket filter to distinguish
+ * between incoming and outgoing packets, on a socket intended to
+ * supply pppd with outgoing packets so it can do dial-on-demand and
+ * hangup-on-lack-of-demand; incoming packets are filtered out so they
+ * don't cause pppd to hold the connection up (you don't want random
+ * input packets such as port scans, packets from old lost connections,
+ * etc. to force the connection to stay up).
+ *
+ * The first byte of the PPP header (0xff03) is modified to accomodate
+ * the direction - 0x00 = IN, 0x01 = OUT.
+ */
+#define LINKTYPE_PPP_PPPD      166
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>.  The DLT_s are used
+ * for passing on chassis-internal metainformation such as
+ * QOS profiles, cookies, etc..
+ */
+#define LINKTYPE_JUNIPER_PPPOE     167
+#define LINKTYPE_JUNIPER_PPPOE_ATM 168
+
+#define LINKTYPE_GPRS_LLC      169             /* GPRS LLC */
+#define LINKTYPE_GPF_T         170             /* GPF-T (ITU-T G.7041/Y.1303) */
+#define LINKTYPE_GPF_F         171             /* GPF-T (ITU-T G.7041/Y.1303) */
+
+/*
+ * Requested by Oolan Zimmer <oz@gcom.com> for use in Gcom's T1/E1 line
+ * monitoring equipment.
+ */
+#define LINKTYPE_GCOM_T1E1     172
+#define LINKTYPE_GCOM_SERIAL   173
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>.  The DLT_ is used
+ * for internal communication to Physical Interface Cards (PIC)
+ */
+#define LINKTYPE_JUNIPER_PIC_PEER    174
+
+/*
+ * Link types requested by Gregor Maier <gregor@endace.com> of Endace
+ * Measurement Systems.  They add an ERF header (see
+ * http://www.endace.com/support/EndaceRecordFormat.pdf) in front of
+ * the link-layer header.
+ */
+#define LINKTYPE_ERF_ETH       175     /* Ethernet */
+#define LINKTYPE_ERF_POS       176     /* Packet-over-SONET */
+
+/*
+ * Requested by Daniele Orlandi <daniele@orlandi.com> for raw LAPD
+ * for vISDN (http://www.orlandi.com/visdn/).  Its link-layer header
+ * includes additional information before the LAPD header, so it's
+ * not necessarily a generic LAPD header.
+ */
+#define LINKTYPE_LINUX_LAPD    177
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>. 
+ * The Link Types are used for prepending meta-information
+ * like interface index, interface name
+ * before standard Ethernet, PPP, Frelay & C-HDLC Frames
+ */
+#define LINKTYPE_JUNIPER_ETHER  178
+#define LINKTYPE_JUNIPER_PPP    179
+#define LINKTYPE_JUNIPER_FRELAY 180
+#define LINKTYPE_JUNIPER_CHDLC  181
+
+/*
+ * Multi Link Frame Relay (FRF.16)
+ */
+#define LINKTYPE_MFR            182
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>. 
+ * The DLT_ is used for internal communication with a
+ * voice Adapter Card (PIC)
+ */
+#define LINKTYPE_JUNIPER_VP     183
+
+/*
+ * Arinc 429 frames.
+ * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>.
+ * Every frame contains a 32bit A429 label.
+ * More documentation on Arinc 429 can be found at
+ * http://www.condoreng.com/support/downloads/tutorials/ARINCTutorial.pdf
+ */
+#define LINKTYPE_A429           184
+
+/*
+ * Arinc 653 Interpartition Communication messages.
+ * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>.
+ * Please refer to the A653-1 standard for more information.
+ */
+#define LINKTYPE_A653_ICM       185
+
+/*
+ * USB packets, beginning with a USB setup header; requested by
+ * Paolo Abeni <paolo.abeni@email.it>.
+ */
+#define LINKTYPE_USB           186
+
+/*
+ * Bluetooth HCI UART transport layer (part H:4); requested by
+ * Paolo Abeni.
+ */
+#define LINKTYPE_BLUETOOTH_HCI_H4      187
+
+/*
+ * IEEE 802.16 MAC Common Part Sublayer; requested by Maria Cruz
+ * <cruz_petagay@bah.com>.
+ */
+#define LINKTYPE_IEEE802_16_MAC_CPS    188
+
+/*
+ * USB packets, beginning with a Linux USB header; requested by
+ * Paolo Abeni <paolo.abeni@email.it>.
+ */
+#define LINKTYPE_USB_LINUX             189
+
+/*
+ * Controller Area Network (CAN) v. 2.0B packets.
+ * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>.
+ * Used to dump CAN packets coming from a CAN Vector board.
+ * More documentation on the CAN v2.0B frames can be found at
+ * http://www.can-cia.org/downloads/?269
+ */
+#define LINKTYPE_CAN20B         190
+
+/*
+ * IEEE 802.15.4, with address fields padded, as is done by Linux
+ * drivers; requested by Juergen Schimmer.
+ */
+#define LINKTYPE_IEEE802_15_4_LINUX    191
+
+/*
+ * Per Packet Information encapsulated packets.
+ * LINKTYPE_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>.
+ */
+#define LINKTYPE_PPI                   192
+
+/*
+ * Header for 802.16 MAC Common Part Sublayer plus a radiotap radio header;
+ * requested by Charles Clancy.
+ */
+#define LINKTYPE_IEEE802_16_MAC_CPS_RADIO      193
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>. 
+ * The DLT_ is used for internal communication with a
+ * integrated service module (ISM).
+ */
+#define LINKTYPE_JUNIPER_ISM    194
+
+/*
+ * IEEE 802.15.4, exactly as it appears in the spec (no padding, no
+ * nothing); requested by Mikko Saarnivala <mikko.saarnivala@sensinode.com>.
+ */
+#define LINKTYPE_IEEE802_15_4  195
+
+/*
+ * Various link-layer types, with a pseudo-header, for SITA
+ * (http://www.sita.aero/); requested by Fulko Hew (fulko.hew@gmail.com).
+ */
+#define LINKTYPE_SITA          196
+
+/*
+ * Various link-layer types, with a pseudo-header, for Endace DAG cards;
+ * encapsulates Endace ERF records.  Requested by Stephen Donnelly
+ * <stephen@endace.com>.
+ */
+#define LINKTYPE_ERF           197
+
+/*
+ * Special header prepended to Ethernet packets when capturing from a
+ * u10 Networks board.  Requested by Phil Mulholland
+ * <phil@u10networks.com>.
+ */
+#define LINKTYPE_RAIF1         198
+
+/*
+ * IPMB packet for IPMI, beginning with the I2C slave address, followed
+ * by the netFn and LUN, etc..  Requested by Chanthy Toeung
+ * <chanthy.toeung@ca.kontron.com>.
+ */
+#define LINKTYPE_IPMB          199
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>. 
+ * The DLT_ is used for capturing data on a secure tunnel interface.
+ */
+#define LINKTYPE_JUNIPER_ST     200
+
+/*
+ * Bluetooth HCI UART transport layer (part H:4), with pseudo-header
+ * that includes direction information; requested by Paolo Abeni.
+ */
+#define LINKTYPE_BLUETOOTH_HCI_H4_WITH_PHDR    201
+
+/*
+ * AX.25 packet with a 1-byte KISS header; see
+ *
+ *     http://www.ax25.net/kiss.htm
+ *
+ * as per Richard Stearn <richard@rns-stearn.demon.co.uk>.
+ */
+#define LINKTYPE_AX25_KISS     202
+
+/*
+ * LAPD packets from an ISDN channel, starting with the address field,
+ * with no pseudo-header.
+ * Requested by Varuna De Silva <varunax@gmail.com>.
+ */
+#define LINKTYPE_LAPD          203
+
+/*
+ * Variants of various link-layer headers, with a one-byte direction
+ * pseudo-header prepended - zero means "received by this host",
+ * non-zero (any non-zero value) means "sent by this host" - as per
+ * Will Barker <w.barker@zen.co.uk>.
+ */
+#define LINKTYPE_PPP_WITH_DIR  204     /* PPP */
+#define LINKTYPE_C_HDLC_WITH_DIR 205   /* Cisco HDLC */
+#define LINKTYPE_FRELAY_WITH_DIR 206   /* Frame Relay */
+#define LINKTYPE_LAPB_WITH_DIR 207     /* LAPB */
+
+/*
+ * 208 is reserved for an as-yet-unspecified proprietary link-layer
+ * type, as requested by Will Barker.
+ */
+
+/*
+ * IPMB with a Linux-specific pseudo-header; as requested by Alexey Neyman
+ * <avn@pigeonpoint.com>.
+ */
+#define LINKTYPE_IPMB_LINUX    209
+
+/*
+ * FlexRay automotive bus - http://www.flexray.com/ - as requested
+ * by Hannes Kaelber <hannes.kaelber@x2e.de>.
+ */
+#define LINKTYPE_FLEXRAY       210
+
+/*
+ * Media Oriented Systems Transport (MOST) bus for multimedia
+ * transport - http://www.mostcooperation.com/ - as requested
+ * by Hannes Kaelber <hannes.kaelber@x2e.de>.
+ */
+#define LINKTYPE_MOST          211
+
+/*
+ * Local Interconnect Network (LIN) bus for vehicle networks -
+ * http://www.lin-subbus.org/ - as requested by Hannes Kaelber
+ * <hannes.kaelber@x2e.de>.
+ */
+#define LINKTYPE_LIN           212
+
+/*
+ * X2E-private data link type used for serial line capture,
+ * as requested by Hannes Kaelber <hannes.kaelber@x2e.de>.
+ */
+#define LINKTYPE_X2E_SERIAL    213
+
+/*
+ * X2E-private data link type used for the Xoraya data logger
+ * family, as requested by Hannes Kaelber <hannes.kaelber@x2e.de>.
+ */
+#define LINKTYPE_X2E_XORAYA    214
+
+/*
+ * IEEE 802.15.4, exactly as it appears in the spec (no padding, no
+ * nothing), but with the PHY-level data for non-ASK PHYs (4 octets
+ * of 0 as preamble, one octet of SFD, one octet of frame length+
+ * reserved bit, and then the MAC-layer data, starting with the
+ * frame control field).
+ *
+ * Requested by Max Filippov <jcmvbkbc@gmail.com>.
+ */
+#define LINKTYPE_IEEE802_15_4_NONASK_PHY       215
+
+/* 
+ * David Gibson <david@gibson.dropbear.id.au> requested this for
+ * captures from the Linux kernel /dev/input/eventN devices. This
+ * is used to communicate keystrokes and mouse movements from the
+ * Linux kernel to display systems, such as Xorg. 
+ */
+#define LINKTYPE_LINUX_EVDEV   216
+
+/*
+ * GSM Um and Abis interfaces, preceded by a "gsmtap" header.
+ *
+ * Requested by Harald Welte <laforge@gnumonks.org>.
+ */
+#define LINKTYPE_GSMTAP_UM     217
+#define LINKTYPE_GSMTAP_ABIS   218
+
+/*
+ * MPLS, with an MPLS label as the link-layer header.
+ * Requested by Michele Marchetto <michele@openbsd.org> on behalf
+ * of OpenBSD.
+ */
+#define LINKTYPE_MPLS          219
+
+/*
+ * USB packets, beginning with a Linux USB header, with the USB header
+ * padded to 64 bytes; required for memory-mapped access.
+ */
+#define LINKTYPE_USB_LINUX_MMAPPED             220
+
+/*
+ * DECT packets, with a pseudo-header; requested by
+ * Matthias Wenzel <tcpdump@mazzoo.de>.
+ */
+#define LINKTYPE_DECT          221
+
+/*
+ * From: "Lidwa, Eric (GSFC-582.0)[SGT INC]" <eric.lidwa-1@nasa.gov>
+ * Date: Mon, 11 May 2009 11:18:30 -0500
+ *
+ * DLT_AOS. We need it for AOS Space Data Link Protocol.
+ *   I have already written dissectors for but need an OK from
+ *   legal before I can submit a patch.
+ *
+ */
+#define LINKTYPE_AOS           222
+
+/*
+ * Wireless HART (Highway Addressable Remote Transducer)
+ * From the HART Communication Foundation
+ * IES/PAS 62591
+ *
+ * Requested by Sam Roberts <vieuxtech@gmail.com>.
+ */
+#define LINKTYPE_WIHART                223
+
+/*
+ * Fibre Channel FC-2 frames, beginning with a Frame_Header.
+ * Requested by Kahou Lei <kahou82@gmail.com>.
+ */
+#define LINKTYPE_FC_2          224
+
+/*
+ * Fibre Channel FC-2 frames, beginning with an encoding of the
+ * SOF, and ending with an encoding of the EOF.
+ *
+ * The encodings represent the frame delimiters as 4-byte sequences
+ * representing the corresponding ordered sets, with K28.5
+ * represented as 0xBC, and the D symbols as the corresponding
+ * byte values; for example, SOFi2, which is K28.5 - D21.5 - D1.2 - D21.2,
+ * is represented as 0xBC 0xB5 0x55 0x55.
+ *
+ * Requested by Kahou Lei <kahou82@gmail.com>.
+ */
+#define LINKTYPE_FC_2_WITH_FRAME_DELIMS                225
+
+/*
+ * Solaris ipnet pseudo-header; requested by Darren Reed <Darren.Reed@Sun.COM>.
+ *
+ * The pseudo-header starts with a one-byte version number; for version 2,
+ * the pseudo-header is:
+ *
+ * struct dl_ipnetinfo {
+ *     u_int8_t   dli_version;
+ *     u_int8_t   dli_family;
+ *     u_int16_t  dli_htype;
+ *     u_int32_t  dli_pktlen;
+ *     u_int32_t  dli_ifindex;
+ *     u_int32_t  dli_grifindex;
+ *     u_int32_t  dli_zsrc;
+ *     u_int32_t  dli_zdst;
+ * };
+ *
+ * dli_version is 2 for the current version of the pseudo-header.
+ *
+ * dli_family is a Solaris address family value, so it's 2 for IPv4
+ * and 26 for IPv6.
+ *
+ * dli_htype is a "hook type" - 0 for incoming packets, 1 for outgoing
+ * packets, and 2 for packets arriving from another zone on the same
+ * machine.
+ *
+ * dli_pktlen is the length of the packet data following the pseudo-header
+ * (so the captured length minus dli_pktlen is the length of the
+ * pseudo-header, assuming the entire pseudo-header was captured).
+ *
+ * dli_ifindex is the interface index of the interface on which the
+ * packet arrived.
+ *
+ * dli_grifindex is the group interface index number (for IPMP interfaces).
+ *
+ * dli_zsrc is the zone identifier for the source of the packet.
+ *
+ * dli_zdst is the zone identifier for the destination of the packet.
+ *
+ * A zone number of 0 is the global zone; a zone number of 0xffffffff
+ * means that the packet arrived from another host on the network, not
+ * from another zone on the same machine.
+ *
+ * An IPv4 or IPv6 datagram follows the pseudo-header; dli_family indicates
+ * which of those it is.
+ */
+#define LINKTYPE_IPNET         226
+
+/*
+ * CAN (Controller Area Network) frames, with a pseudo-header as supplied
+ * by Linux SocketCAN.  See Documentation/networking/can.txt in the Linux
+ * source.
+ *
+ * Requested by Felix Obenhuber <felix@obenhuber.de>.
+ */
+#define LINKTYPE_CAN_SOCKETCAN 227
+
+/*
+ * Raw IPv4/IPv6; different from DLT_RAW in that the DLT_ value specifies
+ * whether it's v4 or v6.  Requested by Darren Reed <Darren.Reed@Sun.COM>.
+ */
+#define LINKTYPE_IPV4          228
+#define LINKTYPE_IPV6          229
+
+/*
+ * IEEE 802.15.4, exactly as it appears in the spec (no padding, no
+ * nothing), and with no FCS at the end of the frame; requested by
+ * Jon Smirl <jonsmirl@gmail.com>.
+ */
+#define LINKTYPE_IEEE802_15_4_NOFCS            230
+
+/*
+ * Raw D-Bus:
+ *
+ *     http://www.freedesktop.org/wiki/Software/dbus
+ *
+ * messages:
+ *
+ *     http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-messages
+ *
+ * starting with the endianness flag, followed by the message type, etc.,
+ * but without the authentication handshake before the message sequence:
+ *
+ *     http://dbus.freedesktop.org/doc/dbus-specification.html#auth-protocol
+ *
+ * Requested by Martin Vidner <martin@vidner.net>.
+ */
+#define LINKTYPE_DBUS          231
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>. 
+ */
+#define LINKTYPE_JUNIPER_VS                    232
+#define LINKTYPE_JUNIPER_SRX_E2E               233
+#define LINKTYPE_JUNIPER_FIBRECHANNEL          234
+
+/*
+ * DVB-CI (DVB Common Interface for communication between a PC Card
+ * module and a DVB receiver).  See
+ *
+ *     http://www.kaiser.cx/pcap-dvbci.html
+ *
+ * for the specification.
+ *
+ * Requested by Martin Kaiser <martin@kaiser.cx>.
+ */
+#define LINKTYPE_DVB_CI                235
+
+/*
+ * Variant of 3GPP TS 27.010 multiplexing protocol.  Requested
+ * by Hans-Christoph Schemmel <hans-christoph.schemmel@cinterion.com>.
+ */
+#define LINKTYPE_MUX27010      236
+
+/*
+ * STANAG 5066 D_PDUs.  Requested by M. Baris Demiray
+ * <barisdemiray@gmail.com>.
+ */
+#define LINKTYPE_STANAG_5066_D_PDU             237
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>. 
+ */
+#define LINKTYPE_JUNIPER_ATM_CEMIC             238
+
+/*
+ * NetFilter LOG messages 
+ * (payload of netlink NFNL_SUBSYS_ULOG/NFULNL_MSG_PACKET packets)
+ *
+ * Requested by Jakub Zawadzki <darkjames-ws@darkjames.pl>
+ */
+#define LINKTYPE_NFLOG         239
+
+/*
+ * Hilscher Gesellschaft fuer Systemautomation mbH link-layer type
+ * for Ethernet packets with a 4-byte pseudo-header and always
+ * with the payload including the FCS, as supplied by their
+ * netANALYZER hardware and software.
+ *
+ * Requested by Holger P. Frommer <HPfrommer@hilscher.com>
+ */
+#define LINKTYPE_NETANALYZER   240
+
+/*
+ * Hilscher Gesellschaft fuer Systemautomation mbH link-layer type
+ * for Ethernet packets with a 4-byte pseudo-header and FCS and
+ * 1 byte of SFD, as supplied by their netANALYZER hardware and
+ * software.
+ *
+ * Requested by Holger P. Frommer <HPfrommer@hilscher.com>
+ */
+#define LINKTYPE_NETANALYZER_TRANSPARENT       241
+
+/*
+ * IP-over-Infiniband, as specified by RFC 4391.
+ *
+ * Requested by Petr Sumbera <petr.sumbera@oracle.com>.
+ */
+#define LINKTYPE_IPOIB         242
+
+#define LINKTYPE_MATCHING_MAX  242             /* highest value in the "matching" range */
+
+static struct linktype_map {
+       int     dlt;
+       int     linktype;
+} map[] = {
+       /*
+        * These DLT_* codes have LINKTYPE_* codes with values identical
+        * to the values of the corresponding DLT_* code.
+        */
+       { DLT_NULL,             LINKTYPE_NULL },
+       { DLT_EN10MB,           LINKTYPE_ETHERNET },
+       { DLT_EN3MB,            LINKTYPE_EXP_ETHERNET },
+       { DLT_AX25,             LINKTYPE_AX25 },
+       { DLT_PRONET,           LINKTYPE_PRONET },
+       { DLT_CHAOS,            LINKTYPE_CHAOS },
+       { DLT_IEEE802,          LINKTYPE_TOKEN_RING },
+       { DLT_ARCNET,           LINKTYPE_ARCNET_BSD },
+       { DLT_SLIP,             LINKTYPE_SLIP },
+       { DLT_PPP,              LINKTYPE_PPP },
+       { DLT_FDDI,             LINKTYPE_FDDI },
+
+       /*
+        * These DLT_* codes have different values on different
+        * platforms; we map them to LINKTYPE_* codes that
+        * have values that should never be equal to any DLT_*
+        * code.
+        */
+#ifdef DLT_FR
+       /* BSD/OS Frame Relay */
+       { DLT_FR,               LINKTYPE_FRELAY },
+#endif
+
+       { DLT_SYMANTEC_FIREWALL, LINKTYPE_SYMANTEC_FIREWALL },
+       { DLT_ATM_RFC1483,      LINKTYPE_ATM_RFC1483 },
+       { DLT_RAW,              LINKTYPE_RAW },
+       { DLT_SLIP_BSDOS,       LINKTYPE_SLIP_BSDOS },
+       { DLT_PPP_BSDOS,        LINKTYPE_PPP_BSDOS },
+
+       /* BSD/OS Cisco HDLC */
+       { DLT_C_HDLC,           LINKTYPE_C_HDLC },
+
+       /*
+        * These DLT_* codes are not on all platforms, but, so far,
+        * there don't appear to be any platforms that define
+        * other codes with those values; we map them to
+        * different LINKTYPE_* values anyway, just in case.
+        */
+
+       /* Linux ATM Classical IP */
+       { DLT_ATM_CLIP,         LINKTYPE_ATM_CLIP },
+
+       /* NetBSD sync/async serial PPP (or Cisco HDLC) */
+       { DLT_PPP_SERIAL,       LINKTYPE_PPP_HDLC },
+
+       /* NetBSD PPP over Ethernet */
+       { DLT_PPP_ETHER,        LINKTYPE_PPP_ETHER },
+
+       /*
+        * All LINKTYPE_ values between LINKTYPE_MATCHING_MIN
+        * and LINKTYPE_MATCHING_MAX are mapped to identical
+        * DLT_ values.
+        */
+
+       { -1,                   -1 }
+};
+
+int
+dlt_to_linktype(int dlt)
+{
+       int i;
+
+       /*
+        * Map the values in the matching range.
+        */
+       if (dlt >= DLT_MATCHING_MIN && dlt <= DLT_MATCHING_MAX)
+               return (dlt);
+
+       /*
+        * Map the values outside that range.
+        */
+       for (i = 0; map[i].dlt != -1; i++) {
+               if (map[i].dlt == dlt)
+                       return (map[i].linktype);
+       }
+
+       /*
+        * If we don't have a mapping for this DLT_ code, return an
+        * error; that means that this is a value with no corresponding
+        * LINKTYPE_ code, and we need to assign one.
+        */
+       return (-1);
+}
+
+int
+linktype_to_dlt(int linktype)
+{
+       int i;
+
+       /*
+        * Map the values in the matching range.
+        */
+       if (linktype >= LINKTYPE_MATCHING_MIN &&
+           linktype <= LINKTYPE_MATCHING_MAX)
+               return (linktype);
+
+       /*
+        * Map the values outside that range.
+        */
+       for (i = 0; map[i].linktype != -1; i++) {
+               if (map[i].linktype == linktype)
+                       return (map[i].dlt);
+       }
+
+       /*
+        * If we don't have an entry for this link type, return
+        * the link type value; it may be a DLT_ value from an
+        * older version of libpcap.
+        */
+       return linktype;
+}
+
+/*
+ * The DLT_USB_LINUX and DLT_USB_LINUX_MMAPPED headers are in host
+ * byte order when capturing (it's supplied directly from a
+ * memory-mapped buffer shared by the kernel).
+ *
+ * When reading a DLT_USB_LINUX or DLT_USB_LINUX_MMAPPED capture file,
+ * we need to convert it from the capturing host's byte order to
+ * the reading host's byte order.
+ */
+void
+swap_linux_usb_header(const struct pcap_pkthdr *hdr, u_char *buf,
+    int header_len_64_bytes)
+{
+       pcap_usb_header_mmapped *uhdr = (pcap_usb_header_mmapped *)buf;
+       bpf_u_int32 offset = 0;
+       usb_isodesc *pisodesc;
+       int32_t numdesc, i;
+
+       /*
+        * "offset" is the offset *past* the field we're swapping;
+        * we skip the field *before* checking to make sure
+        * the captured data length includes the entire field.
+        */
+
+       /*
+        * The URB id is a totally opaque value; do we really need to 
+        * convert it to the reading host's byte order???
+        */
+       offset += 8;                    /* skip past id */
+       if (hdr->caplen < offset)
+               return;
+       uhdr->id = SWAPLL(uhdr->id);
+
+       offset += 4;                    /* skip past various 1-byte fields */
+
+       offset += 2;                    /* skip past bus_id */
+       if (hdr->caplen < offset)
+               return;
+       uhdr->bus_id = SWAPSHORT(uhdr->bus_id);
+
+       offset += 2;                    /* skip past various 1-byte fields */
+
+       offset += 8;                    /* skip past ts_sec */
+       if (hdr->caplen < offset)
+               return;
+       uhdr->ts_sec = SWAPLL(uhdr->ts_sec);
+
+       offset += 4;                    /* skip past ts_usec */
+       if (hdr->caplen < offset)
+               return;
+       uhdr->ts_usec = SWAPLONG(uhdr->ts_usec);
+
+       offset += 4;                    /* skip past status */
+       if (hdr->caplen < offset)
+               return;
+       uhdr->status = SWAPLONG(uhdr->status);
+
+       offset += 4;                    /* skip past urb_len */
+       if (hdr->caplen < offset)
+               return;
+       uhdr->urb_len = SWAPLONG(uhdr->urb_len);
+
+       offset += 4;                    /* skip past data_len */
+       if (hdr->caplen < offset)
+               return;
+       uhdr->data_len = SWAPLONG(uhdr->data_len);
+
+       if (uhdr->transfer_type == URB_ISOCHRONOUS) {
+               offset += 4;                    /* skip past s.iso.error_count */
+               if (hdr->caplen < offset)
+                       return;
+               uhdr->s.iso.error_count = SWAPLONG(uhdr->s.iso.error_count);
+
+               offset += 4;                    /* skip past s.iso.numdesc */
+               if (hdr->caplen < offset)
+                       return;
+               uhdr->s.iso.numdesc = SWAPLONG(uhdr->s.iso.numdesc);
+       } else
+               offset += 8;                    /* skip USB setup header */
+
+       if (header_len_64_bytes) {
+               /*
+                * This is either the "version 1" header, with
+                * 16 bytes of additional fields at the end, or
+                * a "version 0" header from a memory-mapped
+                * capture, with 16 bytes of zeroed-out padding
+                * at the end.  Byte swap them as if this were
+                * a "version 1" header.
+                */
+               offset += 4;                    /* skip past interval */
+               if (hdr->caplen < offset)
+                       return;
+               uhdr->interval = SWAPLONG(uhdr->interval);
+
+               offset += 4;                    /* skip past start_frame */
+               if (hdr->caplen < offset)
+                       return;
+               uhdr->start_frame = SWAPLONG(uhdr->start_frame);
+
+               offset += 4;                    /* skip past xfer_flags */
+               if (hdr->caplen < offset)
+                       return;
+               uhdr->xfer_flags = SWAPLONG(uhdr->xfer_flags);
+
+               offset += 4;                    /* skip past ndesc */
+               if (hdr->caplen < offset)
+                       return;
+               uhdr->ndesc = SWAPLONG(uhdr->ndesc);
+       }       
+
+       if (uhdr->transfer_type == URB_ISOCHRONOUS) {
+               /* swap the values in struct linux_usb_isodesc */
+               pisodesc = (usb_isodesc *)(void *)(buf+offset);
+               numdesc = uhdr->s.iso.numdesc;
+               for (i = 0; i < numdesc; i++) {
+                       offset += 4;            /* skip past status */
+                       if (hdr->caplen < offset)
+                               return;
+                       pisodesc->status = SWAPLONG(pisodesc->status);
+
+                       offset += 4;            /* skip past offset */
+                       if (hdr->caplen < offset)
+                               return;
+                       pisodesc->offset = SWAPLONG(pisodesc->offset);
+
+                       offset += 4;            /* skip past len */
+                       if (hdr->caplen < offset)
+                               return;
+                       pisodesc->len = SWAPLONG(pisodesc->len);
+
+                       offset += 4;            /* skip past padding */
+
+                       pisodesc++;
+               }
+       }
+}
diff --git a/contrib/libpcap/pcap-common.h b/contrib/libpcap/pcap-common.h
new file mode 100644 (file)
index 0000000..0c80ba3
--- /dev/null
@@ -0,0 +1,25 @@
+
+/*
+ * We use the "receiver-makes-right" approach to byte order,
+ * because time is at a premium when we are writing the file.
+ * In other words, the pcap_file_header and pcap_pkthdr,
+ * records are written in host byte order.
+ * Note that the bytes of packet data are written out in the order in
+ * which they were received, so multi-byte fields in packets are not
+ * written in host byte order, they're written in whatever order the
+ * sending machine put them in.
+ *
+ * ntoh[ls] aren't sufficient because we might need to swap on a big-endian
+ * machine (if the file was written in little-end order).
+ */
+#define        SWAPLONG(y) \
+((((y)&0xff)<<24) | (((y)&0xff00)<<8) | (((y)&0xff0000)>>8) | (((y)>>24)&0xff))
+#define        SWAPSHORT(y) \
+       ( (((y)&0xff)<<8) | ((u_short)((y)&0xff00)>>8) )
+
+extern int dlt_to_linktype(int dlt);
+
+extern int linktype_to_dlt(int linktype);
+
+extern void swap_linux_usb_header(const struct pcap_pkthdr *hdr, u_char *buf,
+    int header_len_64_bytes);
index 3beec58..d7b4b0a 100644 (file)
@@ -1,4 +1,4 @@
-.\" @(#) $Header: /tcpdump/master/libpcap/pcap-filter.manmisc.in,v 1.1.2.2 2008-10-21 07:44:56 guy Exp $ (LBL)
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap-filter.manmisc.in,v 1.1 2008-10-21 07:33:01 guy Exp $ (LBL)
 .\"
 .\" Copyright (c) 1987, 1988, 1989, 1990, 1991, 1992, 1994, 1995, 1996, 1997
 .\"    The Regents of the University of California.  All rights reserved.
@@ -65,6 +65,8 @@ Possible directions are
 .BR dst ,
 .BR "src or dst" ,
 .BR "src and dst" ,
+.BR ra ,
+.BR ta ,
 .BR addr1 ,
 .BR addr2 ,
 .BR addr3 ,
@@ -76,6 +78,8 @@ there is no dir qualifier,
 .B "src or dst"
 is assumed.
 The
+.BR ra ,
+.BR ta ,
 .BR addr1 ,
 .BR addr2 ,
 .BR addr3 ,
@@ -472,6 +476,15 @@ and
 .B scrub
 (applies only to packets logged by OpenBSD's or FreeBSD's
 .BR pf (4)).
+.IP "\fBwlan ra \fIehost\fR"
+True if the IEEE 802.11 RA is
+.IR ehost .
+The RA field is used in all frames except for management frames.
+.IP "\fBwlan ta \fIehost\fR"
+True if the IEEE 802.11 TA is
+.IR ehost .
+The TA field is used in all frames except for management frames and
+CTS (Clear To Send) and ACK (Acknowledgment) control frames.
 .IP "\fBwlan addr1 \fIehost\fR"
 True if the first IEEE 802.11 address is
 .IR ehost .
@@ -490,7 +503,7 @@ True if the fourth IEEE 802.11 address, if present, is
 .IR ehost .
 The fourth address field is only used for
 WDS (Wireless Distribution System) frames.
-.IP "\fBip\fR, \fBip6\fR, \fBarp\fR, \fBrarp\fR, \fBatalk\fR, \fBaarp\fR, \fBdecnet\fR, \fBiso\fR, \fBstp\fR, \fBipx\fR, \fInetbeui\fP"
+.IP "\fBip\fR, \fBip6\fR, \fBarp\fR, \fBrarp\fR, \fBatalk\fR, \fBaarp\fR, \fBdecnet\fR, \fBiso\fR, \fBstp\fR, \fBipx\fR, \fBnetbeui\fP"
 Abbreviations for:
 .in +.5i
 .nf
index 080470e..8444e62 100644 (file)
@@ -30,7 +30,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/pcap-int.h,v 1.85.2.9 2008-09-16 00:21:08 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/pcap-int.h,v 1.94 2008-09-16 00:20:23 guy Exp $ (LBL)
  */
 
 #ifndef pcap_int_h
@@ -48,6 +48,7 @@ extern "C" {
 
 #ifdef WIN32
 #include <Packet32.h>
+extern CRITICAL_SECTION g_PcapCompileCriticalSection;
 #endif /* WIN32 */
 
 #ifdef MSDOS
@@ -55,6 +56,10 @@ extern "C" {
 #include <io.h>
 #endif
 
+#ifdef HAVE_SNF_API
+#include <snf.h>
+#endif
+
 #if (defined(_MSC_VER) && (_MSC_VER <= 1200)) /* we are compiling with Visual Studio 6, that doesn't support the LL suffix*/
 
 /*
@@ -101,12 +106,16 @@ typedef enum {
  */
 struct pcap_sf {
        FILE *rfile;
+       int (*next_packet_op)(pcap_t *, struct pcap_pkthdr *, u_char **);
        int swapped;
        size_t hdrsize;
        swapped_type_t lengths_swapped;
        int version_major;
        int version_minor;
-       u_char *base;
+       bpf_u_int32 ifcount;    /* number of interfaces seen in this capture */
+       u_int tsresol;          /* time stamp resolution */
+       u_int tsscale;          /* scaling factor for resolution -> microseconds */
+       u_int64_t tsoffset;     /* time stamp offset */
 };
 
 /*
@@ -123,7 +132,7 @@ struct pcap_md {
        long    OrigMissed;     /* missed by i/f before this run */
        char    *device;        /* device name */
        int     timeout;        /* timeout for buffering */
-       int     must_clear;     /* stuff we must clear when we close */
+       int     must_do_on_close; /* stuff we must do when we close */
        struct pcap *next;      /* list of open pcaps that need stuff cleared on close */
 #ifdef linux
        int     sock_packet;    /* using Linux 2.0 compatible interface */
@@ -132,8 +141,13 @@ struct pcap_md {
        int     lo_ifindex;     /* interface index of the loopback device */
        u_int   packets_read;   /* count of packets read with recvfrom() */
        bpf_u_int32 oldmode;    /* mode to restore when turning monitor mode off */
+       char    *mondevice;     /* mac80211 monitor device we created */
+       u_char  *mmapbuf;       /* memory-mapped region pointer */
+       size_t  mmapbuflen;     /* size of region */
        u_int   tp_version;     /* version of tpacket_hdr for mmaped ring */
        u_int   tp_hdrlen;      /* hdrlen of tpacket_hdr for mmaped ring */
+       u_char  *oneshot_buffer; /* buffer for copy of packet */
+       long    proc_dropped; /* packets reported dropped by /proc/net/dev */
 #endif /* linux */
 
 #ifdef HAVE_DAG_API
@@ -152,6 +166,13 @@ struct pcap_md {
                                 * Same as in linux above, introduce
                                 * generally? */
 #endif /* HAVE_DAG_API */
+#ifdef HAVE_SNF_API
+       snf_handle_t snf_handle; /* opaque device handle */
+       snf_ring_t   snf_ring;   /* opaque device ring handle */
+        int          snf_timeout;
+        int          snf_boardnum;
+#endif /*HAVE_SNF_API*/
+
 #ifdef HAVE_ZEROCOPY_BPF
        /*
         * Zero-copy read buffer -- for zero-copy BPF.  'buffer' above will
@@ -177,16 +198,18 @@ struct pcap_md {
 };
 
 /*
- * Stuff to clear when we close.
+ * Stuff to do when we close.
  */
-#define MUST_CLEAR_PROMISC     0x00000001      /* promiscuous mode */
-#define MUST_CLEAR_RFMON       0x00000002      /* rfmon (monitor) mode */
+#define MUST_CLEAR_PROMISC     0x00000001      /* clear promiscuous mode */
+#define MUST_CLEAR_RFMON       0x00000002      /* clear rfmon (monitor) mode */
+#define MUST_DELETE_MONIF      0x00000004      /* delete monitor-mode interface */
 
 struct pcap_opt {
        int     buffer_size;
        char    *source;
        int     promisc;
        int     rfmon;
+       int     tstamp_type;
 };
 
 /*
@@ -285,6 +308,11 @@ struct pcap {
        setnonblock_op_t setnonblock_op;
        stats_op_t stats_op;
 
+       /*
+        * Routine to use as callback for pcap_next()/pcap_next_ex().
+        */
+       pcap_handler oneshot_callback;
+
 #ifdef WIN32
        /*
         * These are, at least currently, specific to the Win32 NPF
@@ -304,6 +332,8 @@ struct pcap {
        char errbuf[PCAP_ERRBUF_SIZE + 1];
        int dlt_count;
        u_int *dlt_list;
+       int tstamp_type_count;
+       u_int *tstamp_type_list;
 
        struct pcap_pkthdr pcap_header; /* This is needed for the pcap_next_ex() to work */
 };
@@ -377,6 +407,16 @@ struct pcap_sf_patched_pkthdr {
     unsigned char pkt_type;
 };
 
+/*
+ * User data structure for the one-shot callback used for pcap_next()
+ * and pcap_next_ex().
+ */
+struct oneshot_userdata {
+       struct pcap_pkthdr *hdr;
+       const u_char **pkt;
+       pcap_t *pd;
+};
+
 int    yylex(void);
 
 #ifndef min
index 7d33b7f..8904387 100644 (file)
@@ -1,4 +1,4 @@
-.\" @(#) $Header: /tcpdump/master/libpcap/pcap-linktype.manmisc.in,v 1.1.2.4 2008-10-27 22:52:05 guy Exp $
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap-linktype.manmisc.in,v 1.3 2008-10-27 22:52:30 guy Exp $
 .\"
 .\" Copyright (c) 1987, 1988, 1989, 1990, 1991, 1992, 1994, 1995, 1996, 1997
 .\"    The Regents of the University of California.  All rights reserved.
@@ -44,239 +44,7 @@ by
 The names for those values begin with
 .BR LINKTYPE_ .
 .PP
-The link-layer header types supported by libpcap are listed here.  The
-value corresponding to
-.B LINKTYPE_
-names are given; the value corresponding to
-.B DLT_
-values are, in some cases, platform dependent, and are not given;
-applications should check for particular
-.B DLT_
-values by name.
-.RS 5
-.TP 5
-.BR DLT_NULL "; " LINKTYPE_NULL = 0
-BSD loopback encapsulation; the link layer header is a 4-byte field, in
-.I host
-byte order, containing a PF_ value from
-.B socket.h
-for the network-layer protocol of the packet.
-.IP
-Note that ``host byte order'' is the byte order of the machine on which
-the packets are captured, and the PF_ values are for the OS of the
-machine on which the packets are captured; if a live capture is being
-done, ``host byte order'' is the byte order of the machine capturing the
-packets, and the PF_ values are those of the OS of the machine capturing
-the packets, but if a ``savefile'' is being read, the byte order and PF_
-values are
-.I not
-necessarily those of the machine reading the capture file.
-.TP 5
-.BR DLT_EN10MB "; " LINKTYPE_ETHERNET = 1
-Ethernet (10Mb, 100Mb, 1000Mb, and up); the
-.B 10MB
-in the
-.B DLT_
-name is historical.
-.TP 5
-.BR DLT_IEEE802 "; " LINKTYPE_TOKEN_RING = 6
-IEEE 802.5 Token Ring; the
-.B IEEE802
-in the
-.B DLT_
-name is historical.
-.TP 5
-.BR DLT_ARCNET "; " LINKTYPE_ARCNET = 7
-ARCNET
-.TP 5
-.BR DLT_SLIP "; " LINKTYPE_SLIP = 8
-SLIP; the link layer header contains, in order:
-.RS 10
-.LP
-a 1-byte flag, which is 0 for packets received by the machine and 1 for
-packets sent by the machine;
-.LP
-a 1-byte field, the upper 4 bits of which indicate the type of packet,
-as per RFC 1144:
-.RS 5
-.TP 5
-0x40
-an unmodified IP datagram (TYPE_IP);
-.TP 5
-0x70
-an uncompressed-TCP IP datagram (UNCOMPRESSED_TCP), with that byte being
-the first byte of the raw IP header on the wire, containing the
-connection number in the protocol field;
-.TP 5
-0x80
-a compressed-TCP IP datagram (COMPRESSED_TCP), with that byte being the
-first byte of the compressed TCP/IP datagram header;
-.RE
-.LP
-for UNCOMPRESSED_TCP, the rest of the modified IP header, and for
-COMPRESSED_TCP, the compressed TCP/IP datagram header;
-.RE
-.RS 5
-.LP
-for a total of 16 bytes; the uncompressed IP datagram follows the header.
-.RE
-.TP 5
-.BR DLT_PPP "; " LINKTYPE_PPP = 9
-PPP; if the first 2 bytes are 0xff and 0x03, it's PPP in HDLC-like
-framing, with the PPP header following those two bytes, otherwise it's
-PPP without framing, and the packet begins with the PPP header.
-.TP 5
-.BR DLT_FDDI "; " LINKTYPE_FDDI = 10
-FDDI
-.TP 5
-.BR DLT_ATM_RFC1483 "; " LINKTYPE_ATM_RFC1483 = 100
-RFC 1483 LLC/SNAP-encapsulated ATM; the packet begins with an IEEE 802.2
-LLC header.
-.TP 5
-.BR DLT_RAW "; " LINKTYPE_RAW = 101
-raw IP; the packet begins with an IP header.
-.TP 5
-.BR DLT_PPP_SERIAL "; " LINKTYPE_PPP_HDLC = 50
-PPP in HDLC-like framing, as per RFC 1662, or Cisco PPP with HDLC
-framing, as per section 4.3.1 of RFC 1547; the first byte will be 0xFF
-for PPP in HDLC-like framing, and will be 0x0F or 0x8F for Cisco PPP
-with HDLC framing.
-.TP 5
-.BR DLT_PPP_ETHER "; " LINKTYPE_PPP_ETHER = 51
-PPPoE; the packet begins with a PPPoE header, as per RFC 2516.
-.TP 5
-.BR DLT_C_HDLC "; " LINKTYPE_C_HDLC = 104
-Cisco PPP with HDLC framing, as per section 4.3.1 of RFC 1547.
-.TP 5
-.BR DLT_IEEE802_11 "; " LINKTYPE_IEEE802_11 = 105
-IEEE 802.11 wireless LAN
-.TP 5
-.BR DLT_FRELAY "; " LINKTYPE_FRELAY = 107
-Frame Relay
-.TP 5
-.BR DLT_LOOP "; " LINKTYPE_LOOP = 108
-OpenBSD loopback encapsulation; the link layer header is a 4-byte field, in
-.I network
-byte order, containing a PF_ value from OpenBSD's
-.B socket.h
-for the network-layer protocol of the packet.
-.IP
-Note that, if a ``savefile'' is being read, those PF_ values are
-.I not
-necessarily those of the machine reading the capture file.
-.TP 5
-.BR DLT_LINUX_SLL "; " LINKTYPE_LINUX_SLL = 113
-Linux "cooked" capture encapsulation; the link layer header contains, in
-order:
-.RS 10
-.LP
-a 2-byte "packet type", in network byte order, which is one of:
-.RS 5
-.TP 5
-0
-packet was sent to us by somebody else
-.TP 5
-1
-packet was broadcast by somebody else
-.TP 5
-2
-packet was multicast, but not broadcast, by somebody else
-.TP 5
-3
-packet was sent by somebody else to somebody else
-.TP 5
-4
-packet was sent by us
-.RE
-.LP
-a 2-byte field, in network byte order, containing a Linux ARPHRD_ value
-for the link layer device type;
-.LP
-a 2-byte field, in network byte order, containing the length of the
-link layer address of the sender of the packet (which could be 0);
-.LP
-an 8-byte field containing that number of bytes of the link layer header
-(if there are more than 8 bytes, only the first 8 are present);
-.LP
-a 2-byte field containing an Ethernet protocol type, in network byte
-order, or containing 1 for Novell 802.3 frames without an 802.2 LLC
-header or 4 for frames beginning with an 802.2 LLC header.
-.RE
-.TP 5
-.BR DLT_LTALK "; " LINKTYPE_LTALK = 104
-Apple LocalTalk; the packet begins with an AppleTalk LLAP header.
-.TP 5
-.BR DLT_PFLOG "; " LINKTYPE_PFLOG = 117
-OpenBSD pflog; the link layer header contains a
-.B "struct pfloghdr"
-structure, as defined by the host on which the file was saved.  (This
-differs from operating system to operating system and release to
-release; there is nothing in the file to indicate what the layout of
-that structure is.)
-.TP 5
-.BR DLT_PRISM_HEADER "; " LINKTYPE_PRISM_HEADER = 119
-Prism monitor mode information followed by an 802.11 header.
-.TP 5
-.BR DLT_IP_OVER_FC "; " LINKTYPE_IP_OVER_FC = 122
-RFC 2625 IP-over-Fibre Channel, with the link-layer header being the
-Network_Header as described in that RFC.
-.TP 5
-.BR DLT_SUNATM "; " LINKTYPE_SUNATM = 123
-SunATM devices; the link layer header contains, in order:
-.RS 10
-.LP
-a 1-byte flag field, containing a direction flag in the uppermost bit,
-which is set for packets transmitted by the machine and clear for
-packets received by the machine, and a 4-byte traffic type in the
-low-order 4 bits, which is one of:
-.RS 5
-.TP 5
-0
-raw traffic
-.TP 5
-1
-LANE traffic
-.TP 5
-2
-LLC-encapsulated traffic
-.TP 5
-3
-MARS traffic
-.TP 5
-4
-IFMP traffic
-.TP 5
-5
-ILMI traffic
-.TP 5
-6
-Q.2931 traffic
-.RE
-.LP
-a 1-byte VPI value;
-.LP
-a 2-byte VCI field, in network byte order.
-.RE
-.TP 5
-.BR DLT_IEEE802_11_RADIO "; " LINKTYPE_IEEE802_11_RADIO = 127
-link-layer information followed by an 802.11 header - see
-http://www.shaftnet.org/~pizza/software/capturefrm.txt for a description
-of the link-layer information.
-.TP 5
-.BR DLT_ARCNET_LINUX "; " LINKTYPE_ARCNET_LINUX = 129
-ARCNET, with no exception frames, reassembled packets rather than raw
-frames, and an extra 16-bit offset field between the destination host
-and type bytes.
-.TP 5
-.BR DLT_LINUX_IRDA "; " LINKTYPE_LINUX_IRDA = 144
-Linux-IrDA packets, with a
-.B DLT_LINUX_SLL
-header followed by the IrLAP header.
-.TP 5
-.BR DLT_LINUX_LAPD "; " LINKTYPE_LINUX_LAPD = 177
-LAPD (Q.921) frames, with a
-.B DLT_LINUX_SLL
-header captured via vISDN.
-.RE
+The link-layer header types supported by libpcap are described at
+http://www.tcpdump.org/linktypes.html.
 .SH SEE ALSO
 pcap_datalink(3PCAP)
index 80a2f00..d0b2231 100644 (file)
@@ -30,7 +30,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/pcap-namedb.h,v 1.13 2006/10/04 18:13:32 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/pcap-namedb.h,v 1.13 2006-10-04 18:13:32 guy Exp $ (LBL)
  */
 
 /*
index 3b9503f..907559c 100644 (file)
@@ -1,5 +1,5 @@
 '\" t
-.\" @(#) $Header: /tcpdump/master/libpcap/pcap-savefile.manfile.in,v 1.1.2.3 2008-10-24 07:34:06 guy Exp $
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap-savefile.manfile.in,v 1.2 2008-10-24 07:33:50 guy Exp $
 .\"
 .\" Copyright (c) 1994, 1996, 1997
 .\"    The Regents of the University of California.  All rights reserved.
diff --git a/contrib/libpcap/pcap-tstamp.manmisc.in b/contrib/libpcap/pcap-tstamp.manmisc.in
new file mode 100644 (file)
index 0000000..2cd32c6
--- /dev/null
@@ -0,0 +1,132 @@
+.\"
+.\" Copyright (c) 1987, 1988, 1989, 1990, 1991, 1992, 1994, 1995, 1996, 1997
+.\"    The Regents of the University of California.  All rights reserved.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that: (1) source code distributions
+.\" retain the above copyright notice and this paragraph in its entirety, (2)
+.\" distributions including binary code include the above copyright notice and
+.\" this paragraph in its entirety in the documentation or other materials
+.\" provided with the distribution, and (3) all advertising materials mentioning
+.\" features or use of this software display the following acknowledgement:
+.\" ``This product includes software developed by the University of California,
+.\" Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
+.\" the University nor the names of its contributors may be used to endorse
+.\" or promote products derived from this software without specific prior
+.\" written permission.
+.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+.\"
+.TH PCAP-TSTAMP @MAN_MISC_INFO@ "22 August 2010"
+.SH NAME
+pcap-tstamp \- packet time stamps in libpcap
+.SH DESCRIPTION
+When capturing traffic, each packet is given a time stamp representing,
+for incoming packets, the arrival time of the packet and, for outgoing
+packets, the transmission time of the packet.  This time is an
+approximation of the arrival or transmission time.  If it is supplied by
+the operating system running on the host on which the capture is being
+done, there are several reasons why it might not precisely represent the
+arrival or transmission time:
+.IP
+if the time stamp is applied to the packet when the networking stack
+receives the packet, the networking stack might not see the packet until
+an interrupt is delivered for the packet or a timer event causes the
+networking device driver to poll for packets, and the time stamp might
+not be applied until the packet has had some processing done by other
+code in the networking stack, so there might be a significant delay
+between the time when the last bit of the packet is received by the
+capture device and when the networking stack time-stamps the packet;
+.IP
+the timer used to generate the time stamps might have low resolution,
+for example, it might be a timer updated once per host operating system
+timer tick, with the host operating system timer ticking once every few
+milliseconds;
+.IP
+a high-resolution timer might use a counter that runs at a rate
+dependent on the processor clock speed, and that clock speed might be
+adjusted upwards or downwards over time and the timer might not be able
+to compensate for all those adjustments;
+.IP
+the host operating system's clock might be adjusted over time to match a
+time standard to which the host is being synchronized, which might be
+done by temporarily slowing down or speeding up the clock or by making a
+single adjustment;
+.IP
+different CPU cores on a multi-core or multi-processor system might be
+running at different speeds, or might not have time counters all
+synchronized, so packets time-stamped by different cores might not have
+consistent time stamps.
+.LP
+In addition, packets time-stamped by different cores might be
+time-stamped in one order and added to the queue of packets for libpcap
+to read in another order, so time stamps might not be monotonically
+increasing.
+.LP
+Some capture devices on some platforms can provide time stamps for
+packets; those time stamps are usually high-resolution time stamps, and
+are usually applied to the packet when the first or last bit of the
+packet arrives, and are thus more accurate than time stamps provided by
+the host operating system.  Those time stamps might not, however, be
+synchronized with the host operating system's clock, so that, for
+example, the time stamp of a packet might not correspond to the time
+stamp of an event on the host triggered by the arrival of that packet.
+.LP
+Depending on the capture device and the software on the host, libpcap
+might allow different types of time stamp to be used.  The
+.BR pcap_list_tstamp_types (3PCAP)
+routine provides, for a packet capture handle created by
+.BR pcap_create (3PCAP)
+but not yet activated by
+.BR pcap_activate (3PCAP),
+a list of time stamp types supported by the capture device for that
+handle.
+The list might be empty, in which case no choice of time stamp type is
+offered for that capture device.  If the list is not empty, the
+.BR pcap_set_tstamp_type (3PCAP)
+routine can be used after a
+.B pcap_create()
+call and before a
+.B pcap_activate()
+call to specify the type of time stamp to be used on the device.
+The time stamp types are listed here; the first value is the #define to
+use in code, the second value is the value returned by
+.B pcap_tstamp_type_val_to_name()
+and accepted by
+.BR pcap_tstamp_name_to_val() .
+.RS 5
+.TP 5
+.BR PCAP_TSTAMP_HOST " - " host
+Time stamp provided by the host on which the capture is being done.  The
+precision of this time stamp is unspecified; it might or might not be
+synchronized with the host operating system's clock.
+.TP 5
+.BR PCAP_TSTAMP_HOST_LOWPREC " - " host_lowprec
+Time stamp provided by the host on which the capture is being done. 
+This is a low-precision time stamp, synchronized with the host operating
+system's clock.
+.TP 5
+.BR PCAP_TSTAMP_HOST_HIPREC " - " host_hiprec
+Time stamp provided by the host on which the capture is being done. 
+This is a high-precision time stamp; it might or might not be
+synchronized with the host operating system's clock.  It might be more
+expensive to fetch than
+.BR PCAP_TSTAMP_HOST_LOWPREC .
+.TP 5
+.BR PCAP_TSTAMP_ADAPTER " - " adapter
+Time stamp provided by the network adapter on which the capture is being
+done.  This is a high-precision time stamp, synchronized with the host
+operating system's clock.
+.TP 5
+.BR PCAP_TSTAMP_ADAPTER_UNSYNCED " - " adapter_unsynced
+Time stamp provided by the network adapter on which the capture is being
+done.  This is a high-precision time stamp; it is not synchronized with
+the host operating system's clock.
+.RE
+.SH SEE ALSO
+pcap_set_tstamp_type(3PCAP),
+pcap_list_tstamp_types(3PCAP),
+pcap_tstamp_type_val_to_name(3PCAP),
+pcap_tstamp_name_to_val(3PCAP)
index 1c66508..6f99cc5 100644 (file)
@@ -1,4 +1,4 @@
-.\" @(#) $Header: /tcpdump/master/libpcap/pcap.3pcap.in,v 1.1.2.2 2008-10-21 07:44:57 guy Exp $
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap.3pcap.in,v 1.1 2008-10-21 07:33:01 guy Exp $
 .\"
 .\" Copyright (c) 1994, 1996, 1997
 .\"    The Regents of the University of California.  All rights reserved.
@@ -37,22 +37,51 @@ on the network, even those destined for other hosts, are accessible
 through this mechanism.
 It also supports saving captured packets to a ``savefile'', and reading
 packets from a ``savefile''.
-.PP
-To open a handle for a live capture, call
-.BR pcap_create() ,
+.SS Opening a capture handle for reading
+To open a handle for a live capture, given the name of the network or
+other interface on which the capture should be done, call
+.BR pcap_create (),
 set the appropriate options on the handle, and then activate it with
-.BR pcap_activate() .
-To open a handle for a ``savefile'' with captured packets, call
-.BR pcap_open_offline() .
-Both
-.B pcap_create()
+.BR pcap_activate ().
+.PP
+To obtain a list of devices that can be opened for a live capture, call
+.BR pcap_findalldevs ();
+to free the list returned by
+.BR pcap_findalldevs (),
+call
+.BR pcap_freealldevs ().
+.BR pcap_lookupdev ()
+will return the first device on that list that is not a ``loopback``
+network interface.
+.PP
+To open a handle for a ``savefile'' from which to read packets, given the
+pathname of the ``savefile'', call
+.BR pcap_open_offline ();
+to set up a handle for a ``savefile'', given a
+.B "FILE\ *"
+referring to a file already opened for reading, call
+.BR pcap_fopen_offline ().
+.PP
+In order to get a ``fake''
+.B pcap_t
+for use in routines that require a
+.B pcap_t
+as an argument, such as routines to open a ``savefile'' for writing and
+to compile a filter expression, call
+.BR pcap_open_dead ().
+.PP
+.BR pcap_create (),
+.BR pcap_open_offline (),
+.BR pcap_fopen_offline (),
 and
-.B pcap_open_offline()
+.BR pcap_open_dead ()
 return a pointer to a
 .BR pcap_t ,
 which is the handle used for reading packets from the capture stream or
 the ``savefile'', and for finding out information about the capture
 stream or ``savefile''.
+To close a handle, use
+.BR pcap_close ().
 .PP
 The options that can be set on a capture handle include
 .IP "snapshot length"
@@ -75,7 +104,7 @@ A snapshot length of 65535 should be sufficient, on most if not all
 networks, to capture all the data available from the packet.
 .IP
 The snapshot length is set with
-.BR pcap_set_snaplen() .
+.BR pcap_set_snaplen ().
 .IP "promiscuous mode"
 On broadcast LANs such as Ethernet, if the network isn't switched, or if
 the adapter is connected to a "mirror port" on a switch to which all
@@ -97,7 +126,7 @@ For now, this doesn't work on the "any" device; if an argument of "any"
 or NULL is supplied, the setting of promiscuous mode is ignored.
 .IP
 Promiscuous mode is set with
-.BR pcap_set_promisc() .
+.BR pcap_set_promisc ().
 .IP "monitor mode"
 On IEEE 802.11 wireless LANs, even if an adapter is in promiscuous mode,
 it will supply to the host only frames for the network with which it's
@@ -118,9 +147,9 @@ if you are capturing in monitor mode and are not connected to another
 network with another adapter.
 .IP
 Monitor mode is set with
-.BR pcap_set_rfmon() ,
+.BR pcap_set_rfmon (),
 and
-.B pcap_can_set_rfmon()
+.BR pcap_can_set_rfmon ()
 can be used to determine whether an adapter can be put into monitor
 mode.
 .IP "read timeout"
@@ -162,7 +191,7 @@ guarantee that a call reading packets will return after the timeout
 expires even if no packets have arrived.
 .IP
 The read timeout is set with
-.BR pcap_set_timeout() .
+.BR pcap_set_timeout ().
 .IP "buffer size"
 Packets that arrive for a capture are stored in a buffer, so that they
 do not have to be read by the application as soon as they arrive.  On
@@ -175,7 +204,17 @@ non-pageable operating system memory than is necessary to prevent
 packets from being dropped.
 .IP
 The buffer size is set with
-.BR pcap_set_buffer_size() .
+.BR pcap_set_buffer_size ().
+.IP "timestamp type"
+On some platforms, the time stamp given to packets on live captures can
+come from different sources that can have different resolutions or that
+can have different relationships to the time values for the current time
+supplied by routines on the native operating system.  See
+.BR pcap-tstamp (@MAN_MISC_INFO@)
+for a list of time stamp types.
+.IP
+The time stamp type is set with
+.BR pcap_set_tstamp_type ().
 .PP
 Reading packets from a network interface may require that you have
 special privileges:
@@ -260,26 +299,193 @@ have to find some other way to make that happen at boot time.
 .PP
 Reading a saved packet file doesn't require special privileges.
 .PP
-To open a ``savefile`` to which to write packets, call
-.BR pcap_dump_open() .
-It returns a pointer to a
-.BR pcap_dumper_t ,
-which is the handle used for writing packets to the ``savefile''.
+The packets read from the handle may include a ``pseudo-header''
+containing various forms of packet meta-data, and probably includes a
+link-layer header whose contents can differ for different network
+interfaces.  To determine the format of the packets supplied by the
+handle, call
+.BR pcap_datalink ();
+.I http://www.tcpdump.org/linktypes.html
+lists the values it returns and describes the packet formats that
+correspond to those values.
 .PP
+To obtain the
+.B "FILE\ *"
+corresponding to a
+.B pcap_t
+opened for a ``savefile'', call
+.BR pcap_file ().
+.TP
+.B Routines
+.RS
+.TP
+.BR pcap_create (3PCAP)
+get a
+.B pcap_t
+for live capture
+.TP
+.BR pcap_activate (3PCAP)
+activate a
+.B pcap_t
+for live capture
+.TP
+.BR pcap_findalldevs (3PCAP)
+get a list of devices that can be opened for a live capture
+.TP
+.BR pcap_freealldevs (3PCAP)
+free list of devices
+.TP
+.BR pcap_lookupdev (3PCAP)
+get first non-loopback device on that list
+.TP
+.BR pcap_open_offline (3PCAP)
+open a
+.B pcap_t
+for a ``savefile'', given a pathname
+.TP
+.BR pcap_fopen_offline (3PCAP)
+open a
+.B pcap_t
+for a ``savefile'', given a
+.B "FILE\ *"
+.TP
+.BR pcap_open_dead (3PCAP)
+create a ``fake''
+.B pcap_t
+.TP
+.BR pcap_close (3PCAP)
+close a
+.B pcap_t
+.TP
+.BR pcap_set_snaplen (3PCAP)
+set the snapshot length for a not-yet-activated
+.B pcap_t
+for live capture
+.TP
+.BR pcap_snapshot (3PCAP)
+get the snapshot length for a
+.B pcap_t
+.TP
+.BR pcap_set_promisc (3PCAP)
+set promiscuous mode for a not-yet-activated
+.B pcap_t
+for live capture
+.TP
+.BR pcap_set_rfmon (3PCAP)
+set monitor mode for a not-yet-activated
+.B pcap_t
+for live capture
+.TP
+.BR pcap_can_set_rfmon (3PCAP)
+determine whether monitor mode can be set for a
+.B pcap_t
+for live capture
+.TP
+.BR pcap_set_timeout (3PCAP)
+set read timeout for a not-yet-activated
+.B pcap_t
+for live capture
+.TP
+.BR pcap_set_buffer_size (3PCAP)
+set buffer size for a not-yet-activated
+.B pcap_t
+for live capture
+.TP
+.BR pcap_set_tstamp_type (3PCAP)
+set time stamp type for a not-yet-activated
+.B pcap_t
+for live capture
+.TP
+.BR pcap_list_tstamp_types (3PCAP)
+get list of available time stamp types for a not-yet-activated
+.B pcap_t
+for live capture
+.TP
+.BR pcap_free_tstamp_types (3PCAP)
+free list of available time stamp types
+.TP
+.BR pcap_tstamp_type_val_to_name (3PCAP)
+get name for a time stamp type
+.TP
+.BR pcap_tstamp_type_val_to_description (3PCAP)
+get description for a time stamp type
+.TP
+.BR pcap_tstamp_name_to_val (3PCAP)
+get time stamp type corresponding to a name
+.TP
+.BR pcap_datalink (3PCAP)
+get link-layer header type for a
+.B pcap_t
+.TP
+.BR pcap_file (3PCAP)
+get the
+.B "FILE\ *"
+for a
+.B pcap_t
+opened for a ``savefile''
+.TP
+.BR pcap_is_swapped (3PCAP)
+determine whether a ``savefile'' being read came from a machine with the
+opposite byte order
+.TP
+.BR pcap_major_version (3PCAP)
+.PD 0
+.TP
+.BR pcap_minor_version (3PCAP)
+get the major and minor version of the file format version for a
+``savefile''
+.PD
+.RE
+.SS Selecting a link-layer header type for a live capture
+Some devices may provide more than one link-layer header type.  To
+obtain a list of all link-layer header types provided by a device, call
+.BR pcap_list_datalinks ()
+on an activated
+.B pcap_t
+for the device.
+To free a list of link-layer header types, call
+.BR pcap_free_datalinks ().
+To set the link-layer header type for a device, call
+.BR pcap_set_datalink ().
+This should be done after the device has been activated but before any
+packets are read and before any filters are compiled or installed.
+.TP
+.B Routines
+.RS
+.TP
+.BR pcap_list_datalinks (3PCAP)
+get a list of link-layer header types for a device
+.TP
+.BR pcap_free_datalinks (3PCAP)
+free list of link-layer header types
+.TP
+.BR pcap_set_datalink (3PCAP)
+set link-layer header type for a device
+.TP
+.BR pcap_datalink_val_to_name (3PCAP)
+get name for a link-layer header type
+.TP
+.BR pcap_datalink_val_to_description (3PCAP)
+get description for a link-layer header type
+.TP
+.BR pcap_datalink_name_to_val (3PCAP)
+get link-layer header type corresponding to a name
+.RE
+.SS Reading packets
 Packets are read with
-.B pcap_dispatch()
+.BR pcap_dispatch ()
 or
-.BR pcap_loop() ,
+.BR pcap_loop (),
 which process one or more packets, calling a callback routine for each
 packet, or with
-.B pcap_next()
+.BR pcap_next ()
 or
-.BR pcap_next_ex() ,
+.BR pcap_next_ex (),
 which return the next packet.
 The callback for
-.B pcap_dispatch()
+.BR pcap_dispatch ()
 and
-.BR pcap_loop()
+.BR pcap_loop ()
 is supplied a pointer to a
 .IR "struct pcap_pkthdr" ,
 which includes the following members:
@@ -304,9 +510,9 @@ number of bytes available from the capture, if the length of the packet
 is larger than the maximum number of bytes to capture).
 .RE
 .PP
-.B pcap_next_ex()
+.BR pcap_next_ex ()
 supplies that pointer through a pointer argument.
-.B pcap_next()
+.BR pcap_next ()
 is passed an argument that points to a
 .I struct pcap_pkthdr
 structure, and fills it in.
@@ -323,15 +529,306 @@ packet; to capture the entire packet, you will have to provide a value
 for
 .I snaplen
 in your call to
-.B pcap_open_live()
+.BR pcap_set_snaplen ()
 that is sufficiently large to get all of the packet's data - a value of
 65535 should be sufficient on most if not all networks).  When reading
 from a ``savefile'', the snapshot length specified when the capture was
 performed will limit the amount of packet data available.
-.B pcap_next()
+.BR pcap_next ()
 returns that pointer;
-.B pcap_next_ex()
+.BR pcap_next_ex ()
 supplies that pointer through a pointer argument.
+.PP
+To force the loop in
+.BR pcap_dispatch ()
+or
+.BR pcap_loop ()
+to terminate, call
+.BR pcap_breakloop ().
+.PP
+By default, when reading packets from an interface opened for a live
+capture,
+.BR pcap_dispatch (),
+.BR pcap_next (),
+and
+.BR pcap_next_ex ()
+will, if no packets are currently available to be read, block waiting
+for packets to become available.  On some, but
+.I not
+all, platforms, if a read timeout was specified, the wait will terminate
+after the read timeout expires; applications should be prepared for
+this, as it happens on some platforms, but should not rely on it, as it
+does not happen on other platforms.
+.PP
+A handle can be put into ``non-blocking mode'', so that those routines
+will, rather than blocking, return an indication that no packets are
+available to read.  Call
+.BR pcap_setnonblock ()
+to put a handle into non-blocking mode or to take it out of non-blocking
+mode; call
+.BR pcap_getnonblock ()
+to determine whether a handle is in non-blocking mode.  Note that
+non-blocking mode does not work correctly in Mac OS X 10.6.
+.PP
+Non-blocking mode is often combined with routines such as
+.BR select (2)
+or
+.BR poll (2)
+or other routines a platform offers to wait for the availability of data
+on any of a set of descriptors.  To obtain, for a handle, a descriptor
+that can be used in those routines, call
+.BR pcap_get_selectable_fd ().
+Not all handles have such a descriptor available;
+.BR pcap_get_selectable_fd ()
+will return \-1 if no such descriptor exists.  In addition, for various
+reasons, one or more of those routines will not work properly with the
+descriptor; the documentation for
+.BR pcap_get_selectable_fd ()
+gives details.
+.TP
+.B Routines
+.RS
+.TP
+.BR pcap_dispatch (3PCAP)
+read a bufferful of packets from a
+.B pcap_t
+open for a live capture or the full set of packets from a
+.B pcap_t
+open for a ``savefile''
+.TP
+.BR pcap_loop (3PCAP)
+read packets from a
+.B pcap_t
+until an interrupt or error occurs
+.TP
+.BR pcap_next (3PCAP)
+read the next packet from a
+.B pcap_t
+without an indication whether an error occurred
+.TP
+.BR pcap_next_ex (3PCAP)
+read the next packet from a
+.B pcap_t
+with an error indication on an error
+.TP
+.BR pcap_breakloop (3PCAP)
+prematurely terminate the loop in
+.BR pcap_dispatch ()
+or
+.BR pcap_loop ()
+.TP
+.BR pcap_setnonblock (3PCAP)
+set or clear non-blocking mode on a
+.B pcap_t
+.TP
+.BR pcap_getnonblock (3PCAP)
+get the state of non-blocking mode for a
+.B pcap_t
+.TP
+.BR pcap_get_selectable_fd (3PCAP)
+attempt to get a descriptor for a
+.B pcap_t
+that can be used in calls such as
+.BR select (2)
+and
+.BR poll (2)
+.RE
+.SS Filters
+In order to cause only certain packets to be returned when reading
+packets, a filter can be set on a handle.  For a live capture, the
+filtering will be performed in kernel mode, if possible, to avoid
+copying ``uninteresting'' packets from the kernel to user mode.
+.PP
+A filter can be specified as a text string; the syntax and semantics of
+the string are as described by
+.BR pcap-filter (@MAN_MISC_INFO@).
+A filter string is compiled into a program in a pseudo-machine-language
+by
+.BR pcap_compile ()
+and the resulting program can be made a filter for a handle with
+.BR pcap_setfilter ().
+The result of
+.BR pcap_compile ()
+can be freed with a call to
+.BR pcap_freecode ().
+.BR pcap_compile ()
+may require a network mask for certain expressions in the filter string;
+.BR pcap_lookupnet ()
+can be used to find the network address and network mask for a given
+capture device.
+.PP
+A compiled filter can also be applied directly to a packet that has been
+read using
+.BR pcap_offline_filter ().
+.TP
+.B Routines
+.RS
+.TP
+.BR pcap_compile (3PCAP)
+compile filter expression to a pseudo-machine-language code program
+.TP
+.BR pcap_freecode (3PCAP)
+free a filter program
+.TP
+.BR pcap_setfilter (3PCAP)
+set filter for a
+.B pcap_t
+.TP
+.BR pcap_lookupnet (3PCAP)
+get network address and network mask for a capture device
+.TP
+.BR pcap_offline_filter (3PCAP)
+apply a filter program to a packet
+.RE
+.SS Incoming and outgoing packets
+By default, libpcap will attempt to capture both packets sent by the
+machine and packets received by the machine.  To limit it to capturing
+only packets received by the machine or, if possible, only packets sent
+by the machine, call
+.BR pcap_setdirection ().
+.TP
+.BR Routines
+.RS
+.TP
+.BR pcap_setdirection (3PCAP)
+specify whether to capture incoming packets, outgoing packets, or both
+.RE
+.SS Capture statistics
+To get statistics about packets received and dropped in a live capture,
+call
+.BR pcap_stats ().
+.TP
+.B Routines
+.RS
+.TP
+.BR pcap_stats (3PCAP)
+get capture statistics
+.RE
+.SS Opening a handle for writing captured packets
+To open a ``savefile`` to which to write packets, given the pathname the
+``savefile'' should have, call
+.BR pcap_dump_open ().
+To open a ``savefile`` to which to write packets, given the pathname the
+``savefile'' should have, call
+.BR pcap_dump_open ();
+to set up a handle for a ``savefile'', given a
+.B "FILE\ *"
+referring to a file already opened for writing, call
+.BR pcap_dump_fopen ().
+They each return pointers to a
+.BR pcap_dumper_t ,
+which is the handle used for writing packets to the ``savefile''.  If it
+succeeds, it will have created the file if it doesn't exist and
+truncated the file if it does exist.
+To close a
+.BR pcap_dumper_t ,
+call
+.BR pcap_dump_close ().
+.TP
+.B Routines
+.RS
+.TP
+.BR pcap_dump_open (3PCAP)
+open a
+.B pcap_dumper_t
+for a ``savefile``, given a pathname
+.TP
+.BR pcap_dump_fopen (3PCAP)
+open a
+.B pcap_dumper_t
+for a ``savefile``, given a
+.B "FILE\ *"
+.TP
+.BR pcap_dump_close (3PCAP)
+close a
+.B pcap_dumper_t
+.TP
+.BR pcap_dump_file (3PCAP)
+get the
+.B "FILE\ *"
+for a
+.B pcap_dumper_t
+opened for a ``savefile''
+.RE
+.SS Writing packets
+To write a packet to a
+.BR pcap_dumper_t ,
+call
+.BR pcap_dump ().
+Packets written with
+.BR pcap_dump ()
+may be buffered, rather than being immediately written to the
+``savefile''.  Closing the
+.B pcap_dumper_t
+will cause all buffered-but-not-yet-written packets to be written to the
+``savefile''.
+To force all packets written to the
+.BR pcap_dumper_t ,
+and not yet written to the ``savefile'' because they're buffered by the
+.BR pcap_dumper_t ,
+to be written to the ``savefile'', without closing the
+.BR pcap_dumper_t ,
+call
+.BR pcap_dump_flush ().
+.TP
+.B Routines
+.RS
+.TP
+.BR pcap_dump (3PCAP)
+write packet to a
+.B pcap_dumper_t
+.TP
+.BR pcap_dump_flush (3PCAP)
+flush buffered packets written to a
+.B pcap_dumper_t
+to the ``savefile''
+.TP
+.BR pcap_dump_ftell (3PCAP)
+get current file position for a
+.B pcap_dumper_t
+.RE
+.SS Injecting packets
+If you have the required privileges, you can inject packets onto a
+network with a
+.B pcap_t
+for a live capture, using
+.BR pcap_inject ()
+or
+.BR pcap_sendpacket ().
+(The two routines exist for compatibility with both OpenBSD and WinPcap;
+they perform the same function, but have different return values.)
+.TP
+.B Routines
+.RS
+.TP
+.BR pcap_inject (3PCAP)
+.PD 0
+.TP
+.BR pcap_sendpacket (3PCAP)
+transmit a packet
+.PD
+.RE
+.SS Reporting errors
+Some routines return error or warning status codes; to convert them to a
+string, use
+.BR pcap_statustostr ().
+.TP
+.B Routines
+.RS
+.TP
+.BR pcap_statustostr (3PCAP)
+get a string for an error or warning status code
+.RE
+.SS Getting library version information
+To get a string giving version information about libpcap, call
+.BR pcap_library_version ().
+.TP
+.B Routines
+.RS
+.TP
+.BR pcap_library_version (3PCAP)
+get library version string
+.RE
 .SH BACKWARDS COMPATIBILITY
 .PP
 In versions of libpcap prior to 1.0, the
@@ -346,18 +843,18 @@ which will include
 for you, rather than including
 .BR <pcap/pcap.h> .
 .PP
-.B pcap_create()
+.BR pcap_create ()
 and
-.B pcap_activate()
+.BR pcap_activate ()
 were not available in versions of libpcap prior to 1.0; if you are
 writing an application that must work on versions of libpcap prior to
 1.0, either use
-.B pcap_open_live()
+.BR pcap_open_live ()
 to get a handle for a live capture or, if you want to be able to use the
 additional capabilities offered by using
-.B pcap_create()
+.BR pcap_create ()
 and
-.BR pcap_activate() ,
+.BR pcap_activate (),
 use an
 .BR autoconf (1)
 script or some other configuration script to check whether the libpcap
index 010ef74..b0146a7 100644 (file)
@@ -33,7 +33,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/pcap.c,v 1.112.2.12 2008-09-22 20:16:01 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/pcap.c,v 1.128 2008-12-23 20:13:29 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -43,13 +43,21 @@ static const char rcsid[] _U_ =
 #ifdef WIN32
 #include <pcap-stdinc.h>
 #else /* WIN32 */
+#if HAVE_INTTYPES_H
+#include <inttypes.h>
+#elif HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
 #include <sys/types.h>
 #endif /* WIN32 */
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#if !defined(_MSC_VER) && !defined(__BORLANDC__)
+#if !defined(_MSC_VER) && !defined(__BORLANDC__) && !defined(__MINGW32__)
 #include <unistd.h>
 #endif
 #include <fcntl.h>
@@ -74,7 +82,7 @@ int
 pcap_not_initialized(pcap_t *pcap)
 {
        /* this means 'not initialized' */
-       return PCAP_ERROR_NOT_ACTIVATED;
+       return (PCAP_ERROR_NOT_ACTIVATED);
 }
 
 /*
@@ -96,6 +104,170 @@ pcap_cant_set_rfmon(pcap_t *p _U_)
        return (0);
 }
 
+/*
+ * Sets *tstamp_typesp to point to an array 1 or more supported time stamp
+ * types; the return value is the number of supported time stamp types.
+ * The list should be freed by a call to pcap_free_tstamp_types() when
+ * you're done with it.
+ *
+ * A return value of 0 means "you don't get a choice of time stamp type",
+ * in which case *tstamp_typesp is set to null.
+ *
+ * PCAP_ERROR is returned on error.
+ */
+int
+pcap_list_tstamp_types(pcap_t *p, int **tstamp_typesp)
+{
+       if (p->tstamp_type_count == 0) {
+               /*
+                * We don't support multiple time stamp types.
+                */
+               *tstamp_typesp = NULL;
+       } else {
+               *tstamp_typesp = (int*)calloc(sizeof(**tstamp_typesp),
+                   p->tstamp_type_count);
+               if (*tstamp_typesp == NULL) {
+                       (void)snprintf(p->errbuf, sizeof(p->errbuf),
+                           "malloc: %s", pcap_strerror(errno));
+                       return (PCAP_ERROR);
+               }
+               (void)memcpy(*tstamp_typesp, p->tstamp_type_list,
+                   sizeof(**tstamp_typesp) * p->tstamp_type_count);
+       }
+       return (p->tstamp_type_count);
+}
+
+/*
+ * In Windows, you might have a library built with one version of the
+ * C runtime library and an application built with another version of
+ * the C runtime library, which means that the library might use one
+ * version of malloc() and free() and the application might use another
+ * version of malloc() and free().  If so, that means something
+ * allocated by the library cannot be freed by the application, so we
+ * need to have a pcap_free_tstamp_types() routine to free up the list
+ * allocated by pcap_list_tstamp_types(), even though it's just a wrapper
+ * around free().
+ */
+void
+pcap_free_tstamp_types(int *tstamp_type_list)
+{
+       free(tstamp_type_list);
+}
+
+/*
+ * Default one-shot callback; overridden for capture types where the
+ * packet data cannot be guaranteed to be available after the callback
+ * returns, so that a copy must be made.
+ */
+static void
+pcap_oneshot(u_char *user, const struct pcap_pkthdr *h, const u_char *pkt)
+{
+       struct oneshot_userdata *sp = (struct oneshot_userdata *)user;
+
+       *sp->hdr = *h;
+       *sp->pkt = pkt;
+}
+
+const u_char *
+pcap_next(pcap_t *p, struct pcap_pkthdr *h)
+{
+       struct oneshot_userdata s;
+       const u_char *pkt;
+
+       s.hdr = h;
+       s.pkt = &pkt;
+       s.pd = p;
+       if (pcap_dispatch(p, 1, p->oneshot_callback, (u_char *)&s) <= 0)
+               return (0);
+       return (pkt);
+}
+
+int 
+pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header,
+    const u_char **pkt_data)
+{
+       struct oneshot_userdata s;
+
+       s.hdr = &p->pcap_header;
+       s.pkt = pkt_data;
+       s.pd = p;
+
+       /* Saves a pointer to the packet headers */
+       *pkt_header= &p->pcap_header;
+
+       if (p->sf.rfile != NULL) {
+               int status;
+
+               /* We are on an offline capture */
+               status = pcap_offline_read(p, 1, p->oneshot_callback,
+                   (u_char *)&s);
+
+               /*
+                * Return codes for pcap_offline_read() are:
+                *   -  0: EOF
+                *   - -1: error
+                *   - >1: OK
+                * The first one ('0') conflicts with the return code of
+                * 0 from pcap_read() meaning "no packets arrived before
+                * the timeout expired", so we map it to -2 so you can
+                * distinguish between an EOF from a savefile and a
+                * "no packets arrived before the timeout expired, try
+                * again" from a live capture.
+                */
+               if (status == 0)
+                       return (-2);
+               else
+                       return (status);
+       }
+
+       /*
+        * Return codes for pcap_read() are:
+        *   -  0: timeout
+        *   - -1: error
+        *   - -2: loop was broken out of with pcap_breakloop()
+        *   - >1: OK
+        * The first one ('0') conflicts with the return code of 0 from
+        * pcap_offline_read() meaning "end of file".
+       */
+       return (p->read_op(p, 1, p->oneshot_callback, (u_char *)&s));
+}
+
+static void
+initialize_ops(pcap_t *p)
+{
+       /*
+        * Set operation pointers for operations that only work on
+        * an activated pcap_t to point to a routine that returns
+        * a "this isn't activated" error.
+        */
+       p->read_op = (read_op_t)pcap_not_initialized;
+       p->inject_op = (inject_op_t)pcap_not_initialized;
+       p->setfilter_op = (setfilter_op_t)pcap_not_initialized;
+       p->setdirection_op = (setdirection_op_t)pcap_not_initialized;
+       p->set_datalink_op = (set_datalink_op_t)pcap_not_initialized;
+       p->getnonblock_op = (getnonblock_op_t)pcap_not_initialized;
+       p->setnonblock_op = (setnonblock_op_t)pcap_not_initialized;
+       p->stats_op = (stats_op_t)pcap_not_initialized;
+#ifdef WIN32
+       p->setbuff_op = (setbuff_op_t)pcap_not_initialized;
+       p->setmode_op = (setmode_op_t)pcap_not_initialized;
+       p->setmintocopy_op = (setmintocopy_op_t)pcap_not_initialized;
+#endif
+
+       /*
+        * Default cleanup operation - implementations can override
+        * this, but should call pcap_cleanup_live_common() after
+        * doing their own additional cleanup.
+        */
+       p->cleanup_op = pcap_cleanup_live_common;
+
+       /*
+        * In most cases, the standard one-short callback can
+        * be used for pcap_next()/pcap_next_ex().
+        */
+       p->oneshot_callback = pcap_oneshot;
+}
+
 pcap_t *
 pcap_create_common(const char *source, char *ebuf)
 {
@@ -110,6 +282,8 @@ pcap_create_common(const char *source, char *ebuf)
        memset(p, 0, sizeof(*p));
 #ifndef WIN32
        p->fd = -1;     /* not opened yet */
+       p->selectable_fd = -1;
+       p->send_fd = -1;
 #endif 
 
        p->opt.source = strdup(source);
@@ -122,36 +296,20 @@ pcap_create_common(const char *source, char *ebuf)
 
        /*
         * Default to "can't set rfmon mode"; if it's supported by
-        * a platform, it can set the op to its routine to check
-        * whether a particular device supports it.
+        * a platform, the create routine that called us can set
+        * the op to its routine to check whether a particular
+        * device supports it.
         */
        p->can_set_rfmon_op = pcap_cant_set_rfmon;
 
-       /*
-        * Some operations can be performed only on activated pcap_t's;
-        * have those operations handled by a "not supported" handler
-        * until the pcap_t is activated.
-        */
-       p->read_op = (read_op_t)pcap_not_initialized;
-       p->inject_op = (inject_op_t)pcap_not_initialized;
-       p->setfilter_op = (setfilter_op_t)pcap_not_initialized;
-       p->setdirection_op = (setdirection_op_t)pcap_not_initialized;
-       p->set_datalink_op = (set_datalink_op_t)pcap_not_initialized;
-       p->getnonblock_op = (getnonblock_op_t)pcap_not_initialized;
-       p->setnonblock_op = (setnonblock_op_t)pcap_not_initialized;
-       p->stats_op = (stats_op_t)pcap_not_initialized;
-#ifdef WIN32
-       p->setbuff_op = (setbuff_op_t)pcap_not_initialized;
-       p->setmode_op = (setmode_op_t)pcap_not_initialized;
-       p->setmintocopy_op = (setmintocopy_op_t)pcap_not_initialized;
-#endif
-       p->cleanup_op = pcap_cleanup_live_common;
+       initialize_ops(p);
 
        /* put in some defaults*/
        pcap_set_timeout(p, 0);
        pcap_set_snaplen(p, 65535);     /* max packet size */
        p->opt.promisc = 0;
        p->opt.buffer_size = 0;
+       p->opt.tstamp_type = -1;        /* default to not setting time stamp type */
        return (p);
 }
 
@@ -161,54 +319,89 @@ pcap_check_activated(pcap_t *p)
        if (p->activated) {
                snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "can't perform "
                        " operation on activated capture");
-               return -1;
+               return (-1);
        }
-       return 0;
+       return (0);
 }
 
 int
 pcap_set_snaplen(pcap_t *p, int snaplen)
 {
        if (pcap_check_activated(p))
-               return PCAP_ERROR_ACTIVATED;
+               return (PCAP_ERROR_ACTIVATED);
        p->snapshot = snaplen;
-       return 0;
+       return (0);
 }
 
 int
 pcap_set_promisc(pcap_t *p, int promisc)
 {
        if (pcap_check_activated(p))
-               return PCAP_ERROR_ACTIVATED;
+               return (PCAP_ERROR_ACTIVATED);
        p->opt.promisc = promisc;
-       return 0;
+       return (0);
 }
 
 int
 pcap_set_rfmon(pcap_t *p, int rfmon)
 {
        if (pcap_check_activated(p))
-               return PCAP_ERROR_ACTIVATED;
+               return (PCAP_ERROR_ACTIVATED);
        p->opt.rfmon = rfmon;
-       return 0;
+       return (0);
 }
 
 int
 pcap_set_timeout(pcap_t *p, int timeout_ms)
 {
        if (pcap_check_activated(p))
-               return PCAP_ERROR_ACTIVATED;
+               return (PCAP_ERROR_ACTIVATED);
        p->md.timeout = timeout_ms;
-       return 0;
+       return (0);
+}
+
+int
+pcap_set_tstamp_type(pcap_t *p, int tstamp_type)
+{
+       int i;
+
+       if (pcap_check_activated(p))
+               return (PCAP_ERROR_ACTIVATED);
+
+       /*
+        * If p->tstamp_type_count is 0, we don't support setting
+        * the time stamp type at all.
+        */
+       if (p->tstamp_type_count == 0)
+               return (PCAP_ERROR_CANTSET_TSTAMP_TYPE);
+
+       /*
+        * Check whether we claim to support this type of time stamp.
+        */
+       for (i = 0; i < p->tstamp_type_count; i++) {
+               if (p->tstamp_type_list[i] == tstamp_type) {
+                       /*
+                        * Yes.
+                        */
+                       p->opt.tstamp_type = tstamp_type;
+                       return (0);
+               }
+       }
+
+       /*
+        * No.  We support setting the time stamp type, but not to this
+        * particular value.
+        */
+       return (PCAP_WARNING_TSTAMP_TYPE_NOTSUP);
 }
 
 int
 pcap_set_buffer_size(pcap_t *p, int buffer_size)
 {
        if (pcap_check_activated(p))
-               return PCAP_ERROR_ACTIVATED;
+               return (PCAP_ERROR_ACTIVATED);
        p->opt.buffer_size = buffer_size;
-       return 0;
+       return (0);
 }
 
 int
@@ -216,9 +409,36 @@ pcap_activate(pcap_t *p)
 {
        int status;
 
+       /*
+        * Catch attempts to re-activate an already-activated
+        * pcap_t; this should, for example, catch code that
+        * calls pcap_open_live() followed by pcap_activate(),
+        * as some code that showed up in a Stack Exchange
+        * question did.
+        */
+       if (pcap_check_activated(p))
+               return (PCAP_ERROR_ACTIVATED);
        status = p->activate_op(p);
        if (status >= 0)
                p->activated = 1;
+       else {
+               if (p->errbuf[0] == '\0') {
+                       /*
+                        * No error message supplied by the activate routine;
+                        * for the benefit of programs that don't specially
+                        * handle errors other than PCAP_ERROR, return the
+                        * error message corresponding to the status.
+                        */
+                       snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "%s",
+                           pcap_statustostr(status));
+               }
+
+               /*
+                * Undo any operation pointer setting, etc. done by
+                * the activate operation.
+                */
+               initialize_ops(p);
+       }
        return (status);
 }
 
@@ -256,9 +476,14 @@ pcap_open_live(const char *source, int snaplen, int promisc, int to_ms, char *er
                goto fail;
        return (p);
 fail:
-       if (status == PCAP_ERROR || status == PCAP_ERROR_NO_SUCH_DEVICE ||
-           status == PCAP_ERROR_PERM_DENIED)
-               strlcpy(errbuf, p->errbuf, PCAP_ERRBUF_SIZE);
+       if (status == PCAP_ERROR)
+               snprintf(errbuf, PCAP_ERRBUF_SIZE, "%s: %s", source,
+                   p->errbuf);
+       else if (status == PCAP_ERROR_NO_SUCH_DEVICE ||
+           status == PCAP_ERROR_PERM_DENIED ||
+           status == PCAP_ERROR_PROMISC_PERM_DENIED)
+               snprintf(errbuf, PCAP_ERRBUF_SIZE, "%s: %s (%s)", source,
+                   pcap_statustostr(status), p->errbuf);
        else
                snprintf(errbuf, PCAP_ERRBUF_SIZE, "%s: %s", source,
                    pcap_statustostr(status));
@@ -269,7 +494,7 @@ fail:
 int
 pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
 {
-       return p->read_op(p, cnt, callback, user);
+       return (p->read_op(p, cnt, callback, user));
 }
 
 /*
@@ -279,7 +504,7 @@ int
 pcap_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
 {
 
-       return p->read_op(p, cnt, callback, user);
+       return (p->read_op(p, cnt, callback, user));
 }
 
 int
@@ -312,95 +537,6 @@ pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
        }
 }
 
-struct singleton {
-       struct pcap_pkthdr *hdr;
-       const u_char *pkt;
-};
-
-
-static void
-pcap_oneshot(u_char *userData, const struct pcap_pkthdr *h, const u_char *pkt)
-{
-       struct singleton *sp = (struct singleton *)userData;
-       *sp->hdr = *h;
-       sp->pkt = pkt;
-}
-
-const u_char *
-pcap_next(pcap_t *p, struct pcap_pkthdr *h)
-{
-       struct singleton s;
-
-       s.hdr = h;
-       if (pcap_dispatch(p, 1, pcap_oneshot, (u_char*)&s) <= 0)
-               return (0);
-       return (s.pkt);
-}
-
-struct pkt_for_fakecallback {
-       struct pcap_pkthdr *hdr;
-       const u_char **pkt;
-};
-
-static void
-pcap_fakecallback(u_char *userData, const struct pcap_pkthdr *h,
-    const u_char *pkt)
-{
-       struct pkt_for_fakecallback *sp = (struct pkt_for_fakecallback *)userData;
-
-       *sp->hdr = *h;
-       *sp->pkt = pkt;
-}
-
-int 
-pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header,
-    const u_char **pkt_data)
-{
-       struct pkt_for_fakecallback s;
-
-       s.hdr = &p->pcap_header;
-       s.pkt = pkt_data;
-
-       /* Saves a pointer to the packet headers */
-       *pkt_header= &p->pcap_header;
-
-       if (p->sf.rfile != NULL) {
-               int status;
-
-               /* We are on an offline capture */
-               status = pcap_offline_read(p, 1, pcap_fakecallback,
-                   (u_char *)&s);
-
-               /*
-                * Return codes for pcap_offline_read() are:
-                *   -  0: EOF
-                *   - -1: error
-                *   - >1: OK
-                * The first one ('0') conflicts with the return code of
-                * 0 from pcap_read() meaning "no packets arrived before
-                * the timeout expired", so we map it to -2 so you can
-                * distinguish between an EOF from a savefile and a
-                * "no packets arrived before the timeout expired, try
-                * again" from a live capture.
-                */
-               if (status == 0)
-                       return (-2);
-               else
-                       return (status);
-       }
-
-       /*
-        * Return codes for pcap_read() are:
-        *   -  0: timeout
-        *   - -1: error
-        *   - -2: loop was broken out of with pcap_breakloop()
-        *   - >1: OK
-        * The first one ('0') conflicts with the return code of 0 from
-        * pcap_offline_read() meaning "end of file".
-       */
-       return (p->read_op(p, 1, pcap_fakecallback, (u_char *)&s));
-}
-
 /*
  * Force the loop in "pcap_read()" or "pcap_read_offline()" to terminate.
  */
@@ -532,6 +668,91 @@ unsupported:
        return (-1);
 }
 
+/*
+ * This array is designed for mapping upper and lower case letter
+ * together for a case independent comparison.  The mappings are
+ * based upon ascii character sequences.
+ */
+static const u_char charmap[] = {
+       (u_char)'\000', (u_char)'\001', (u_char)'\002', (u_char)'\003',
+       (u_char)'\004', (u_char)'\005', (u_char)'\006', (u_char)'\007',
+       (u_char)'\010', (u_char)'\011', (u_char)'\012', (u_char)'\013',
+       (u_char)'\014', (u_char)'\015', (u_char)'\016', (u_char)'\017',
+       (u_char)'\020', (u_char)'\021', (u_char)'\022', (u_char)'\023',
+       (u_char)'\024', (u_char)'\025', (u_char)'\026', (u_char)'\027',
+       (u_char)'\030', (u_char)'\031', (u_char)'\032', (u_char)'\033',
+       (u_char)'\034', (u_char)'\035', (u_char)'\036', (u_char)'\037',
+       (u_char)'\040', (u_char)'\041', (u_char)'\042', (u_char)'\043',
+       (u_char)'\044', (u_char)'\045', (u_char)'\046', (u_char)'\047',
+       (u_char)'\050', (u_char)'\051', (u_char)'\052', (u_char)'\053',
+       (u_char)'\054', (u_char)'\055', (u_char)'\056', (u_char)'\057',
+       (u_char)'\060', (u_char)'\061', (u_char)'\062', (u_char)'\063',
+       (u_char)'\064', (u_char)'\065', (u_char)'\066', (u_char)'\067',
+       (u_char)'\070', (u_char)'\071', (u_char)'\072', (u_char)'\073',
+       (u_char)'\074', (u_char)'\075', (u_char)'\076', (u_char)'\077',
+       (u_char)'\100', (u_char)'\141', (u_char)'\142', (u_char)'\143',
+       (u_char)'\144', (u_char)'\145', (u_char)'\146', (u_char)'\147',
+       (u_char)'\150', (u_char)'\151', (u_char)'\152', (u_char)'\153',
+       (u_char)'\154', (u_char)'\155', (u_char)'\156', (u_char)'\157',
+       (u_char)'\160', (u_char)'\161', (u_char)'\162', (u_char)'\163',
+       (u_char)'\164', (u_char)'\165', (u_char)'\166', (u_char)'\167',
+       (u_char)'\170', (u_char)'\171', (u_char)'\172', (u_char)'\133',
+       (u_char)'\134', (u_char)'\135', (u_char)'\136', (u_char)'\137',
+       (u_char)'\140', (u_char)'\141', (u_char)'\142', (u_char)'\143',
+       (u_char)'\144', (u_char)'\145', (u_char)'\146', (u_char)'\147',
+       (u_char)'\150', (u_char)'\151', (u_char)'\152', (u_char)'\153',
+       (u_char)'\154', (u_char)'\155', (u_char)'\156', (u_char)'\157',
+       (u_char)'\160', (u_char)'\161', (u_char)'\162', (u_char)'\163',
+       (u_char)'\164', (u_char)'\165', (u_char)'\166', (u_char)'\167',
+       (u_char)'\170', (u_char)'\171', (u_char)'\172', (u_char)'\173',
+       (u_char)'\174', (u_char)'\175', (u_char)'\176', (u_char)'\177',
+       (u_char)'\200', (u_char)'\201', (u_char)'\202', (u_char)'\203',
+       (u_char)'\204', (u_char)'\205', (u_char)'\206', (u_char)'\207',
+       (u_char)'\210', (u_char)'\211', (u_char)'\212', (u_char)'\213',
+       (u_char)'\214', (u_char)'\215', (u_char)'\216', (u_char)'\217',
+       (u_char)'\220', (u_char)'\221', (u_char)'\222', (u_char)'\223',
+       (u_char)'\224', (u_char)'\225', (u_char)'\226', (u_char)'\227',
+       (u_char)'\230', (u_char)'\231', (u_char)'\232', (u_char)'\233',
+       (u_char)'\234', (u_char)'\235', (u_char)'\236', (u_char)'\237',
+       (u_char)'\240', (u_char)'\241', (u_char)'\242', (u_char)'\243',
+       (u_char)'\244', (u_char)'\245', (u_char)'\246', (u_char)'\247',
+       (u_char)'\250', (u_char)'\251', (u_char)'\252', (u_char)'\253',
+       (u_char)'\254', (u_char)'\255', (u_char)'\256', (u_char)'\257',
+       (u_char)'\260', (u_char)'\261', (u_char)'\262', (u_char)'\263',
+       (u_char)'\264', (u_char)'\265', (u_char)'\266', (u_char)'\267',
+       (u_char)'\270', (u_char)'\271', (u_char)'\272', (u_char)'\273',
+       (u_char)'\274', (u_char)'\275', (u_char)'\276', (u_char)'\277',
+       (u_char)'\300', (u_char)'\341', (u_char)'\342', (u_char)'\343',
+       (u_char)'\344', (u_char)'\345', (u_char)'\346', (u_char)'\347',
+       (u_char)'\350', (u_char)'\351', (u_char)'\352', (u_char)'\353',
+       (u_char)'\354', (u_char)'\355', (u_char)'\356', (u_char)'\357',
+       (u_char)'\360', (u_char)'\361', (u_char)'\362', (u_char)'\363',
+       (u_char)'\364', (u_char)'\365', (u_char)'\366', (u_char)'\367',
+       (u_char)'\370', (u_char)'\371', (u_char)'\372', (u_char)'\333',
+       (u_char)'\334', (u_char)'\335', (u_char)'\336', (u_char)'\337',
+       (u_char)'\340', (u_char)'\341', (u_char)'\342', (u_char)'\343',
+       (u_char)'\344', (u_char)'\345', (u_char)'\346', (u_char)'\347',
+       (u_char)'\350', (u_char)'\351', (u_char)'\352', (u_char)'\353',
+       (u_char)'\354', (u_char)'\355', (u_char)'\356', (u_char)'\357',
+       (u_char)'\360', (u_char)'\361', (u_char)'\362', (u_char)'\363',
+       (u_char)'\364', (u_char)'\365', (u_char)'\366', (u_char)'\367',
+       (u_char)'\370', (u_char)'\371', (u_char)'\372', (u_char)'\373',
+       (u_char)'\374', (u_char)'\375', (u_char)'\376', (u_char)'\377',
+};
+
+int
+pcap_strcasecmp(const char *s1, const char *s2)
+{
+       register const u_char   *cm = charmap,
+                               *us1 = (const u_char *)s1,
+                               *us2 = (const u_char *)s2;
+
+       while (cm[*us1] == cm[*us2++])
+               if (*us1++ == '\0')
+                       return(0);
+       return (cm[*us1] - cm[*--us2]);
+}
+
 struct dlt_choice {
        const char *name;
        const char *description;
@@ -614,7 +835,7 @@ static struct dlt_choice dlt_choices[] = {
        DLT_CHOICE(DLT_PPI, "Per-Packet Information"),
        DLT_CHOICE(DLT_IEEE802_16_MAC_CPS_RADIO, "IEEE 802.16 MAC Common Part Sublayer plus radiotap header"),
        DLT_CHOICE(DLT_JUNIPER_ISM, "Juniper Integrated Service Module"),
-       DLT_CHOICE(DLT_IEEE802_15_4, "IEEE 802.15.4"),
+       DLT_CHOICE(DLT_IEEE802_15_4, "IEEE 802.15.4 with FCS"),
        DLT_CHOICE(DLT_SITA, "SITA pseudo-header"),
        DLT_CHOICE(DLT_ERF, "Endace ERF header"),
        DLT_CHOICE(DLT_RAIF1, "Ethernet with u10 Networks pseudo-header"),
@@ -623,94 +844,30 @@ static struct dlt_choice dlt_choices[] = {
        DLT_CHOICE(DLT_BLUETOOTH_HCI_H4_WITH_PHDR, "Bluetooth HCI UART transport layer plus pseudo-header"),
        DLT_CHOICE(DLT_AX25_KISS, "AX.25 with KISS header"),
        DLT_CHOICE(DLT_IEEE802_15_4_NONASK_PHY, "IEEE 802.15.4 with non-ASK PHY data"),
+       DLT_CHOICE(DLT_MPLS, "MPLS with label as link-layer header"),
+       DLT_CHOICE(DLT_USB_LINUX_MMAPPED, "USB with padded Linux header"),
+       DLT_CHOICE(DLT_DECT, "DECT"),
+       DLT_CHOICE(DLT_AOS, "AOS Space Data Link protocol"),
+       DLT_CHOICE(DLT_WIHART, "Wireless HART"),
+       DLT_CHOICE(DLT_FC_2, "Fibre Channel FC-2"),
+       DLT_CHOICE(DLT_FC_2_WITH_FRAME_DELIMS, "Fibre Channel FC-2 with frame delimiters"),
+       DLT_CHOICE(DLT_IPNET, "Solaris ipnet"),
+       DLT_CHOICE(DLT_CAN_SOCKETCAN, "CAN-bus with SocketCAN headers"),
+       DLT_CHOICE(DLT_IPV4, "Raw IPv4"),
+       DLT_CHOICE(DLT_IPV6, "Raw IPv6"),
+       DLT_CHOICE(DLT_IEEE802_15_4_NOFCS, "IEEE 802.15.4 without FCS"),
+       DLT_CHOICE(DLT_JUNIPER_VS, "Juniper Virtual Server"),
+       DLT_CHOICE(DLT_JUNIPER_SRX_E2E, "Juniper SRX E2E"),
+       DLT_CHOICE(DLT_JUNIPER_FIBRECHANNEL, "Juniper Fibre Channel"),
+       DLT_CHOICE(DLT_DVB_CI, "DVB-CI"),
+       DLT_CHOICE(DLT_JUNIPER_ATM_CEMIC, "Juniper ATM CEMIC"),
+       DLT_CHOICE(DLT_NFLOG, "Linux netfilter log messages"),
+       DLT_CHOICE(DLT_NETANALYZER, "Ethernet with Hilscher netANALYZER pseudo-header"),
+       DLT_CHOICE(DLT_NETANALYZER_TRANSPARENT, "Ethernet with Hilscher netANALYZER pseudo-header and with preamble and SFD"),
+       DLT_CHOICE(DLT_IPOIB, "RFC 4391 IP-over-Infiniband"),
        DLT_CHOICE_SENTINEL
 };
 
-/*
- * This array is designed for mapping upper and lower case letter
- * together for a case independent comparison.  The mappings are
- * based upon ascii character sequences.
- */
-static const u_char charmap[] = {
-       (u_char)'\000', (u_char)'\001', (u_char)'\002', (u_char)'\003',
-       (u_char)'\004', (u_char)'\005', (u_char)'\006', (u_char)'\007',
-       (u_char)'\010', (u_char)'\011', (u_char)'\012', (u_char)'\013',
-       (u_char)'\014', (u_char)'\015', (u_char)'\016', (u_char)'\017',
-       (u_char)'\020', (u_char)'\021', (u_char)'\022', (u_char)'\023',
-       (u_char)'\024', (u_char)'\025', (u_char)'\026', (u_char)'\027',
-       (u_char)'\030', (u_char)'\031', (u_char)'\032', (u_char)'\033',
-       (u_char)'\034', (u_char)'\035', (u_char)'\036', (u_char)'\037',
-       (u_char)'\040', (u_char)'\041', (u_char)'\042', (u_char)'\043',
-       (u_char)'\044', (u_char)'\045', (u_char)'\046', (u_char)'\047',
-       (u_char)'\050', (u_char)'\051', (u_char)'\052', (u_char)'\053',
-       (u_char)'\054', (u_char)'\055', (u_char)'\056', (u_char)'\057',
-       (u_char)'\060', (u_char)'\061', (u_char)'\062', (u_char)'\063',
-       (u_char)'\064', (u_char)'\065', (u_char)'\066', (u_char)'\067',
-       (u_char)'\070', (u_char)'\071', (u_char)'\072', (u_char)'\073',
-       (u_char)'\074', (u_char)'\075', (u_char)'\076', (u_char)'\077',
-       (u_char)'\100', (u_char)'\141', (u_char)'\142', (u_char)'\143',
-       (u_char)'\144', (u_char)'\145', (u_char)'\146', (u_char)'\147',
-       (u_char)'\150', (u_char)'\151', (u_char)'\152', (u_char)'\153',
-       (u_char)'\154', (u_char)'\155', (u_char)'\156', (u_char)'\157',
-       (u_char)'\160', (u_char)'\161', (u_char)'\162', (u_char)'\163',
-       (u_char)'\164', (u_char)'\165', (u_char)'\166', (u_char)'\167',
-       (u_char)'\170', (u_char)'\171', (u_char)'\172', (u_char)'\133',
-       (u_char)'\134', (u_char)'\135', (u_char)'\136', (u_char)'\137',
-       (u_char)'\140', (u_char)'\141', (u_char)'\142', (u_char)'\143',
-       (u_char)'\144', (u_char)'\145', (u_char)'\146', (u_char)'\147',
-       (u_char)'\150', (u_char)'\151', (u_char)'\152', (u_char)'\153',
-       (u_char)'\154', (u_char)'\155', (u_char)'\156', (u_char)'\157',
-       (u_char)'\160', (u_char)'\161', (u_char)'\162', (u_char)'\163',
-       (u_char)'\164', (u_char)'\165', (u_char)'\166', (u_char)'\167',
-       (u_char)'\170', (u_char)'\171', (u_char)'\172', (u_char)'\173',
-       (u_char)'\174', (u_char)'\175', (u_char)'\176', (u_char)'\177',
-       (u_char)'\200', (u_char)'\201', (u_char)'\202', (u_char)'\203',
-       (u_char)'\204', (u_char)'\205', (u_char)'\206', (u_char)'\207',
-       (u_char)'\210', (u_char)'\211', (u_char)'\212', (u_char)'\213',
-       (u_char)'\214', (u_char)'\215', (u_char)'\216', (u_char)'\217',
-       (u_char)'\220', (u_char)'\221', (u_char)'\222', (u_char)'\223',
-       (u_char)'\224', (u_char)'\225', (u_char)'\226', (u_char)'\227',
-       (u_char)'\230', (u_char)'\231', (u_char)'\232', (u_char)'\233',
-       (u_char)'\234', (u_char)'\235', (u_char)'\236', (u_char)'\237',
-       (u_char)'\240', (u_char)'\241', (u_char)'\242', (u_char)'\243',
-       (u_char)'\244', (u_char)'\245', (u_char)'\246', (u_char)'\247',
-       (u_char)'\250', (u_char)'\251', (u_char)'\252', (u_char)'\253',
-       (u_char)'\254', (u_char)'\255', (u_char)'\256', (u_char)'\257',
-       (u_char)'\260', (u_char)'\261', (u_char)'\262', (u_char)'\263',
-       (u_char)'\264', (u_char)'\265', (u_char)'\266', (u_char)'\267',
-       (u_char)'\270', (u_char)'\271', (u_char)'\272', (u_char)'\273',
-       (u_char)'\274', (u_char)'\275', (u_char)'\276', (u_char)'\277',
-       (u_char)'\300', (u_char)'\341', (u_char)'\342', (u_char)'\343',
-       (u_char)'\344', (u_char)'\345', (u_char)'\346', (u_char)'\347',
-       (u_char)'\350', (u_char)'\351', (u_char)'\352', (u_char)'\353',
-       (u_char)'\354', (u_char)'\355', (u_char)'\356', (u_char)'\357',
-       (u_char)'\360', (u_char)'\361', (u_char)'\362', (u_char)'\363',
-       (u_char)'\364', (u_char)'\365', (u_char)'\366', (u_char)'\367',
-       (u_char)'\370', (u_char)'\371', (u_char)'\372', (u_char)'\333',
-       (u_char)'\334', (u_char)'\335', (u_char)'\336', (u_char)'\337',
-       (u_char)'\340', (u_char)'\341', (u_char)'\342', (u_char)'\343',
-       (u_char)'\344', (u_char)'\345', (u_char)'\346', (u_char)'\347',
-       (u_char)'\350', (u_char)'\351', (u_char)'\352', (u_char)'\353',
-       (u_char)'\354', (u_char)'\355', (u_char)'\356', (u_char)'\357',
-       (u_char)'\360', (u_char)'\361', (u_char)'\362', (u_char)'\363',
-       (u_char)'\364', (u_char)'\365', (u_char)'\366', (u_char)'\367',
-       (u_char)'\370', (u_char)'\371', (u_char)'\372', (u_char)'\373',
-       (u_char)'\374', (u_char)'\375', (u_char)'\376', (u_char)'\377',
-};
-
-int
-pcap_strcasecmp(const char *s1, const char *s2)
-{
-       register const u_char   *cm = charmap,
-                               *us1 = (const u_char *)s1,
-                               *us2 = (const u_char *)s2;
-
-       while (cm[*us1] == cm[*us2++])
-               if (*us1++ == '\0')
-                       return(0);
-       return (cm[*us1] - cm[*--us2]);
-}
-
 int
 pcap_datalink_name_to_val(const char *name)
 {
@@ -748,6 +905,57 @@ pcap_datalink_val_to_description(int dlt)
        return (NULL);
 }
 
+struct tstamp_type_choice {
+       const char *name;
+       const char *description;
+       int     type;
+};
+
+static struct tstamp_type_choice tstamp_type_choices[] = {
+       { "host", "Host", PCAP_TSTAMP_HOST },
+       { "host_lowprec", "Host, low precision", PCAP_TSTAMP_HOST_LOWPREC },
+       { "host_hiprec", "Host, high precision", PCAP_TSTAMP_HOST_HIPREC },
+       { "adapter", "Adapter", PCAP_TSTAMP_ADAPTER },
+       { "adapter_unsynced", "Adapter, not synced with system time", PCAP_TSTAMP_ADAPTER_UNSYNCED },
+       { NULL, NULL, 0 }
+};
+
+int
+pcap_tstamp_type_name_to_val(const char *name)
+{
+       int i;
+
+       for (i = 0; tstamp_type_choices[i].name != NULL; i++) {
+               if (pcap_strcasecmp(tstamp_type_choices[i].name, name) == 0)
+                       return (tstamp_type_choices[i].type);
+       }
+       return (PCAP_ERROR);
+}
+
+const char *
+pcap_tstamp_type_val_to_name(int tstamp_type)
+{
+       int i;
+
+       for (i = 0; tstamp_type_choices[i].name != NULL; i++) {
+               if (tstamp_type_choices[i].type == tstamp_type)
+                       return (tstamp_type_choices[i].name);
+       }
+       return (NULL);
+}
+
+const char *
+pcap_tstamp_type_val_to_description(int tstamp_type)
+{
+       int i;
+
+       for (i = 0; tstamp_type_choices[i].name != NULL; i++) {
+               if (tstamp_type_choices[i].type == tstamp_type)
+                       return (tstamp_type_choices[i].description);
+       }
+       return (NULL);
+}
+
 int
 pcap_snapshot(pcap_t *p)
 {
@@ -814,7 +1022,7 @@ pcap_geterr(pcap_t *p)
 int
 pcap_getnonblock(pcap_t *p, char *errbuf)
 {
-       return p->getnonblock_op(p, errbuf);
+       return (p->getnonblock_op(p, errbuf));
 }
 
 /*
@@ -846,7 +1054,7 @@ pcap_getnonblock_fd(pcap_t *p, char *errbuf)
 int
 pcap_setnonblock(pcap_t *p, int nonblock, char *errbuf)
 {
-       return p->setnonblock_op(p, nonblock, errbuf);
+       return (p->setnonblock_op(p, nonblock, errbuf));
 }
 
 #if !defined(WIN32) && !defined(MSDOS)
@@ -926,6 +1134,9 @@ pcap_statustostr(int errnum)
        case PCAP_WARNING:
                return("Generic warning");
 
+       case PCAP_WARNING_TSTAMP_TYPE_NOTSUP:
+               return ("That type of time stamp is not supported by that device");
+
        case PCAP_WARNING_PROMISC_NOTSUP:
                return ("That device doesn't support promiscuous mode");
 
@@ -955,6 +1166,12 @@ pcap_statustostr(int errnum)
 
        case PCAP_ERROR_IFACE_NOT_UP:
                return ("That device is not up");
+
+       case PCAP_ERROR_CANTSET_TSTAMP_TYPE:
+               return ("That device doesn't support setting the time stamp type");
+
+       case PCAP_ERROR_PROMISC_PERM_DENIED:
+               return ("You don't have permission to capture in promiscuous mode on that device");
        }
        (void)snprintf(ebuf, sizeof ebuf, "Unknown error: %d", errnum);
        return(ebuf);
@@ -983,7 +1200,7 @@ pcap_strerror(int errnum)
 int
 pcap_setfilter(pcap_t *p, struct bpf_program *fp)
 {
-       return p->setfilter_op(p, fp);
+       return (p->setfilter_op(p, fp));
 }
 
 /*
@@ -998,15 +1215,15 @@ pcap_setdirection(pcap_t *p, pcap_direction_t d)
        if (p->setdirection_op == NULL) {
                snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
                    "Setting direction is not implemented on this platform");
-               return -1;
+               return (-1);
        } else
-               return p->setdirection_op(p, d);
+               return (p->setdirection_op(p, d));
 }
 
 int
 pcap_stats(pcap_t *p, struct pcap_stat *ps)
 {
-       return p->stats_op(p, ps);
+       return (p->stats_op(p, ps));
 }
 
 static int
@@ -1021,7 +1238,7 @@ pcap_stats_dead(pcap_t *p, struct pcap_stat *ps _U_)
 int
 pcap_setbuff(pcap_t *p, int dim)
 {
-       return p->setbuff_op(p, dim);
+       return (p->setbuff_op(p, dim));
 }
 
 static int
@@ -1035,7 +1252,7 @@ pcap_setbuff_dead(pcap_t *p, int dim)
 int
 pcap_setmode(pcap_t *p, int mode)
 {
-       return p->setmode_op(p, mode);
+       return (p->setmode_op(p, mode));
 }
 
 static int
@@ -1049,7 +1266,7 @@ pcap_setmode_dead(pcap_t *p, int mode)
 int
 pcap_setmintocopy(pcap_t *p, int size)
 {
-       return p->setmintocopy_op(p, size);
+       return (p->setmintocopy_op(p, size));
 }
 
 static int
@@ -1162,12 +1379,19 @@ pcap_cleanup_live_common(pcap_t *p)
                p->dlt_list = NULL;
                p->dlt_count = 0;
        }
+       if (p->tstamp_type_list != NULL) {
+               free(p->tstamp_type_list);
+               p->tstamp_type_list = NULL;
+               p->tstamp_type_count = 0;
+       }
        pcap_freecode(&p->fcode);
 #if !defined(WIN32) && !defined(MSDOS)
        if (p->fd >= 0) {
                close(p->fd);
                p->fd = -1;
        }
+       p->selectable_fd = -1;
+       p->send_fd = -1;
 #endif
 }
 
@@ -1196,7 +1420,7 @@ pcap_open_dead(int linktype, int snaplen)
 #endif
        p->cleanup_op = pcap_cleanup_dead;
        p->activated = 1;
-       return p;
+       return (p);
 }
 
 /*
@@ -1265,7 +1489,7 @@ pcap_offline_filter(struct bpf_program *fp, const struct pcap_pkthdr *h,
 #ifdef HAVE_VERSION_H
 #include "version.h"
 #else
-static const char pcap_version_string[] = "libpcap version 0.9[.x]";
+static const char pcap_version_string[] = "libpcap version 1.x.y";
 #endif
 
 #ifdef WIN32
index 935f949..490a4bf 100644 (file)
@@ -30,7 +30,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/pcap.h,v 1.59 2006/10/04 18:09:22 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/pcap.h,v 1.59 2006-10-04 18:09:22 guy Exp $ (LBL)
  */
 
 /*
similarity index 54%
copy from contrib/libpcap/pcap/usb.h
copy to contrib/libpcap/pcap/bluetooth.h
index adcd19c..813bea3 100644 (file)
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * Basic USB data struct
+ * bluetooth data struct
  * By Paolo Abeni <paolo.abeni@email.it>
  *
- * @(#) $Header: /tcpdump/master/libpcap/pcap/usb.h,v 1.6 2007/09/22 02:06:08 guy Exp $
+ * @(#) $Header: /tcpdump/master/libpcap/pcap/bluetooth.h,v 1.1 2007-09-22 02:10:17 guy Exp $
  */
  
-#ifndef _PCAP_USB_STRUCTS_H__
-#define _PCAP_USB_STRUCTS_H__
-
-/* 
- * possible transfer mode
- */
-#define URB_TRANSFER_IN   0x80
-#define URB_ISOCHRONOUS   0x0
-#define URB_INTERRUPT     0x1
-#define URB_CONTROL       0x2
-#define URB_BULK          0x3
-
-/*
- * possible event type
- */
-#define URB_SUBMIT        'S'
-#define URB_COMPLETE      'C'
-#define URB_ERROR         'E'
-
-/*
- * USB setup header as defined in USB specification.
- * Appears at the front of each packet in DLT_USB captures.
- */
-typedef struct _usb_setup {
-       u_int8_t bmRequestType;
-       u_int8_t bRequest;
-       u_int16_t wValue;
-       u_int16_t wIndex;
-       u_int16_t wLength;
-} pcap_usb_setup;
-
+#ifndef _PCAP_BLUETOOTH_STRUCTS_H__
+#define _PCAP_BLUETOOTH_STRUCTS_H__
 
 /*
- * Header prepended by linux kernel to each event.
- * Appears at the front of each packet in DLT_USB_LINUX captures.
+ * Header prepended libpcap to each bluetooth h:4 frame.
+ * fields are in network byte order
  */
-typedef struct _usb_header {
-       u_int64_t id;
-       u_int8_t event_type;
-       u_int8_t transfer_type;
-       u_int8_t endpoint_number;
-       u_int8_t device_address;
-       u_int16_t bus_id;
-       char setup_flag;/*if !=0 the urb setup header is not present*/
-       char data_flag; /*if !=0 no urb data is present*/
-       int64_t ts_sec;
-       int32_t ts_usec;
-       int32_t status;
-       u_int32_t urb_len;
-       u_int32_t data_len; /* amount of urb data really present in this event*/
-       pcap_usb_setup setup;
-} pcap_usb_header;
+typedef struct _pcap_bluetooth_h4_header {
+       u_int32_t direction; /* if first bit is set direction is incoming */
+} pcap_bluetooth_h4_header;
 
 
 #endif
diff --git a/contrib/libpcap/pcap/bpf.h b/contrib/libpcap/pcap/bpf.h
new file mode 100644 (file)
index 0000000..17d533c
--- /dev/null
@@ -0,0 +1,1195 @@
+/*-
+ * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from the Stanford/CMU enet packet filter,
+ * (net/enet.c) distributed as part of 4.3BSD, and code contributed
+ * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence 
+ * Berkeley Laboratory.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by the University of
+ *      California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *      @(#)bpf.h       7.1 (Berkeley) 5/7/91
+ *
+ * @(#) $Header: /tcpdump/master/libpcap/pcap/bpf.h,v 1.32 2008-12-23 20:13:29 guy Exp $ (LBL)
+ */
+
+/*
+ * This is libpcap's cut-down version of bpf.h; it includes only
+ * the stuff needed for the code generator and the userland BPF
+ * interpreter, and the libpcap APIs for setting filters, etc..
+ *
+ * "pcap-bpf.c" will include the native OS version, as it deals with
+ * the OS's BPF implementation.
+ *
+ * At least two programs found by Google Code Search explicitly includes
+ * <pcap/bpf.h> (even though <pcap.h>/<pcap/pcap.h> includes it for you),
+ * so moving that stuff to <pcap/pcap.h> would break the build for some
+ * programs.
+ */
+
+/*
+ * If we've already included <net/bpf.h>, don't re-define this stuff.
+ * We assume BSD-style multiple-include protection in <net/bpf.h>,
+ * which is true of all but the oldest versions of FreeBSD and NetBSD,
+ * or Tru64 UNIX-style multiple-include protection (or, at least,
+ * Tru64 UNIX 5.x-style; I don't have earlier versions available to check),
+ * or AIX-style multiple-include protection (or, at least, AIX 5.x-style;
+ * I don't have earlier versions available to check).
+ *
+ * We do not check for BPF_MAJOR_VERSION, as that's defined by
+ * <linux/filter.h>, which is directly or indirectly included in some
+ * programs that also include pcap.h, and <linux/filter.h> doesn't
+ * define stuff we need.
+ *
+ * This also provides our own multiple-include protection.
+ */
+#if !defined(_NET_BPF_H_) && !defined(_BPF_H_) && !defined(_H_BPF) && !defined(lib_pcap_bpf_h)
+#define lib_pcap_bpf_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* BSD style release date */
+#define BPF_RELEASE 199606
+
+#ifdef MSDOS /* must be 32-bit */
+typedef long          bpf_int32;
+typedef unsigned long bpf_u_int32;
+#else
+typedef        int bpf_int32;
+typedef        u_int bpf_u_int32;
+#endif
+
+/*
+ * Alignment macros.  BPF_WORDALIGN rounds up to the next 
+ * even multiple of BPF_ALIGNMENT.
+ *
+ * Tcpdump's print-pflog.c uses this, so we define it here.
+ */
+#ifndef __NetBSD__
+#define BPF_ALIGNMENT sizeof(bpf_int32)
+#else
+#define BPF_ALIGNMENT sizeof(long)
+#endif
+#define BPF_WORDALIGN(x) (((x)+(BPF_ALIGNMENT-1))&~(BPF_ALIGNMENT-1))
+
+/*
+ * Structure for "pcap_compile()", "pcap_setfilter()", etc..
+ */
+struct bpf_program {
+       u_int bf_len;
+       struct bpf_insn *bf_insns;
+};
+/*
+ * Link-layer header type codes.
+ *
+ * Do *NOT* add new values to this list without asking
+ * "tcpdump-workers@lists.tcpdump.org" for a value.  Otherwise, you run
+ * the risk of using a value that's already being used for some other
+ * purpose, and of having tools that read libpcap-format captures not
+ * being able to handle captures with your new DLT_ value, with no hope
+ * that they will ever be changed to do so (as that would destroy their
+ * ability to read captures using that value for that other purpose).
+ *
+ * See
+ *
+ *     http://www.tcpdump.org/linktypes.html
+ *
+ * for detailed descriptions of some of these link-layer header types.
+ */
+
+/*
+ * These are the types that are the same on all platforms, and that
+ * have been defined by <net/bpf.h> for ages.
+ */
+#define DLT_NULL       0       /* BSD loopback encapsulation */
+#define DLT_EN10MB     1       /* Ethernet (10Mb) */
+#define DLT_EN3MB      2       /* Experimental Ethernet (3Mb) */
+#define DLT_AX25       3       /* Amateur Radio AX.25 */
+#define DLT_PRONET     4       /* Proteon ProNET Token Ring */
+#define DLT_CHAOS      5       /* Chaos */
+#define DLT_IEEE802    6       /* 802.5 Token Ring */
+#define DLT_ARCNET     7       /* ARCNET, with BSD-style header */
+#define DLT_SLIP       8       /* Serial Line IP */
+#define DLT_PPP                9       /* Point-to-point Protocol */
+#define DLT_FDDI       10      /* FDDI */
+
+/*
+ * These are types that are different on some platforms, and that
+ * have been defined by <net/bpf.h> for ages.  We use #ifdefs to
+ * detect the BSDs that define them differently from the traditional
+ * libpcap <net/bpf.h>
+ *
+ * XXX - DLT_ATM_RFC1483 is 13 in BSD/OS, and DLT_RAW is 14 in BSD/OS,
+ * but I don't know what the right #define is for BSD/OS.
+ */
+#define DLT_ATM_RFC1483        11      /* LLC-encapsulated ATM */
+
+#ifdef __OpenBSD__
+#define DLT_RAW                14      /* raw IP */
+#else
+#define DLT_RAW                12      /* raw IP */
+#endif
+
+/*
+ * Given that the only OS that currently generates BSD/OS SLIP or PPP
+ * is, well, BSD/OS, arguably everybody should have chosen its values
+ * for DLT_SLIP_BSDOS and DLT_PPP_BSDOS, which are 15 and 16, but they
+ * didn't.  So it goes.
+ */
+#if defined(__NetBSD__) || defined(__FreeBSD__)
+#ifndef DLT_SLIP_BSDOS
+#define DLT_SLIP_BSDOS 13      /* BSD/OS Serial Line IP */
+#define DLT_PPP_BSDOS  14      /* BSD/OS Point-to-point Protocol */
+#endif
+#else
+#define DLT_SLIP_BSDOS 15      /* BSD/OS Serial Line IP */
+#define DLT_PPP_BSDOS  16      /* BSD/OS Point-to-point Protocol */
+#endif
+
+/*
+ * 17 is used for DLT_OLD_PFLOG in OpenBSD;
+ *     OBSOLETE: DLT_PFLOG is 117 in OpenBSD now as well. See below.
+ * 18 is used for DLT_PFSYNC in OpenBSD; don't use it for anything else.
+ */
+
+#define DLT_ATM_CLIP   19      /* Linux Classical-IP over ATM */
+
+/*
+ * Apparently Redback uses this for its SmartEdge 400/800.  I hope
+ * nobody else decided to use it, too.
+ */
+#define DLT_REDBACK_SMARTEDGE  32
+
+/*
+ * These values are defined by NetBSD; other platforms should refrain from
+ * using them for other purposes, so that NetBSD savefiles with link
+ * types of 50 or 51 can be read as this type on all platforms.
+ */
+#define DLT_PPP_SERIAL 50      /* PPP over serial with HDLC encapsulation */
+#define DLT_PPP_ETHER  51      /* PPP over Ethernet */
+
+/*
+ * The Axent Raptor firewall - now the Symantec Enterprise Firewall - uses
+ * a link-layer type of 99 for the tcpdump it supplies.  The link-layer
+ * header has 6 bytes of unknown data, something that appears to be an
+ * Ethernet type, and 36 bytes that appear to be 0 in at least one capture
+ * I've seen.
+ */
+#define DLT_SYMANTEC_FIREWALL  99
+
+/*
+ * Values between 100 and 103 are used in capture file headers as
+ * link-layer header type LINKTYPE_ values corresponding to DLT_ types
+ * that differ between platforms; don't use those values for new DLT_
+ * new types.
+ */
+
+/*
+ * Values starting with 104 are used for newly-assigned link-layer
+ * header type values; for those link-layer header types, the DLT_
+ * value returned by pcap_datalink() and passed to pcap_open_dead(),
+ * and the LINKTYPE_ value that appears in capture files, are the
+ * same.
+ *
+ * DLT_MATCHING_MIN is the lowest such value; DLT_MATCHING_MAX is
+ * the highest such value.
+ */
+#define DLT_MATCHING_MIN       104
+
+/*
+ * This value was defined by libpcap 0.5; platforms that have defined
+ * it with a different value should define it here with that value -
+ * a link type of 104 in a save file will be mapped to DLT_C_HDLC,
+ * whatever value that happens to be, so programs will correctly
+ * handle files with that link type regardless of the value of
+ * DLT_C_HDLC.
+ *
+ * The name DLT_C_HDLC was used by BSD/OS; we use that name for source
+ * compatibility with programs written for BSD/OS.
+ *
+ * libpcap 0.5 defined it as DLT_CHDLC; we define DLT_CHDLC as well,
+ * for source compatibility with programs written for libpcap 0.5.
+ */
+#define DLT_C_HDLC     104     /* Cisco HDLC */
+#define DLT_CHDLC      DLT_C_HDLC
+
+#define DLT_IEEE802_11 105     /* IEEE 802.11 wireless */
+
+/*
+ * 106 is reserved for Linux Classical IP over ATM; it's like DLT_RAW,
+ * except when it isn't.  (I.e., sometimes it's just raw IP, and
+ * sometimes it isn't.)  We currently handle it as DLT_LINUX_SLL,
+ * so that we don't have to worry about the link-layer header.)
+ */
+
+/*
+ * Frame Relay; BSD/OS has a DLT_FR with a value of 11, but that collides
+ * with other values.
+ * DLT_FR and DLT_FRELAY packets start with the Q.922 Frame Relay header
+ * (DLCI, etc.).
+ */
+#define DLT_FRELAY     107
+
+/*
+ * OpenBSD DLT_LOOP, for loopback devices; it's like DLT_NULL, except
+ * that the AF_ type in the link-layer header is in network byte order.
+ *
+ * DLT_LOOP is 12 in OpenBSD, but that's DLT_RAW in other OSes, so
+ * we don't use 12 for it in OSes other than OpenBSD.
+ */
+#ifdef __OpenBSD__
+#define DLT_LOOP       12
+#else
+#define DLT_LOOP       108
+#endif
+
+/*
+ * Encapsulated packets for IPsec; DLT_ENC is 13 in OpenBSD, but that's
+ * DLT_SLIP_BSDOS in NetBSD, so we don't use 13 for it in OSes other
+ * than OpenBSD.
+ */
+#ifdef __OpenBSD__
+#define DLT_ENC                13
+#else
+#define DLT_ENC                109
+#endif
+
+/*
+ * Values between 110 and 112 are reserved for use in capture file headers
+ * as link-layer types corresponding to DLT_ types that might differ
+ * between platforms; don't use those values for new DLT_ types
+ * other than the corresponding DLT_ types.
+ */
+
+/*
+ * This is for Linux cooked sockets.
+ */
+#define DLT_LINUX_SLL  113
+
+/*
+ * Apple LocalTalk hardware.
+ */
+#define DLT_LTALK      114
+
+/*
+ * Acorn Econet.
+ */
+#define DLT_ECONET     115
+
+/*
+ * Reserved for use with OpenBSD ipfilter.
+ */
+#define DLT_IPFILTER   116
+
+/*
+ * OpenBSD DLT_PFLOG; DLT_PFLOG is 17 in OpenBSD, but that's DLT_LANE8023
+ * in SuSE 6.3, so we can't use 17 for it in capture-file headers.
+ *
+ * XXX: is there a conflict with DLT_PFSYNC 18 as well?
+ */
+#ifdef __OpenBSD__
+#define DLT_OLD_PFLOG  17
+#define DLT_PFSYNC     18
+#endif
+#define DLT_PFLOG      117
+
+/*
+ * Registered for Cisco-internal use.
+ */
+#define DLT_CISCO_IOS  118
+
+/*
+ * For 802.11 cards using the Prism II chips, with a link-layer
+ * header including Prism monitor mode information plus an 802.11
+ * header.
+ */
+#define DLT_PRISM_HEADER       119
+
+/*
+ * Reserved for Aironet 802.11 cards, with an Aironet link-layer header
+ * (see Doug Ambrisko's FreeBSD patches).
+ */
+#define DLT_AIRONET_HEADER     120
+
+/*
+ * Reserved for Siemens HiPath HDLC.
+ */
+#define DLT_HHDLC              121
+
+/*
+ * This is for RFC 2625 IP-over-Fibre Channel.
+ *
+ * This is not for use with raw Fibre Channel, where the link-layer
+ * header starts with a Fibre Channel frame header; it's for IP-over-FC,
+ * where the link-layer header starts with an RFC 2625 Network_Header
+ * field.
+ */
+#define DLT_IP_OVER_FC         122
+
+/*
+ * This is for Full Frontal ATM on Solaris with SunATM, with a
+ * pseudo-header followed by an AALn PDU.
+ *
+ * There may be other forms of Full Frontal ATM on other OSes,
+ * with different pseudo-headers.
+ *
+ * If ATM software returns a pseudo-header with VPI/VCI information
+ * (and, ideally, packet type information, e.g. signalling, ILMI,
+ * LANE, LLC-multiplexed traffic, etc.), it should not use
+ * DLT_ATM_RFC1483, but should get a new DLT_ value, so tcpdump
+ * and the like don't have to infer the presence or absence of a
+ * pseudo-header and the form of the pseudo-header.
+ */
+#define DLT_SUNATM             123     /* Solaris+SunATM */
+
+/* 
+ * Reserved as per request from Kent Dahlgren <kent@praesum.com>
+ * for private use.
+ */
+#define DLT_RIO                 124     /* RapidIO */
+#define DLT_PCI_EXP             125     /* PCI Express */
+#define DLT_AURORA              126     /* Xilinx Aurora link layer */
+
+/*
+ * Header for 802.11 plus a number of bits of link-layer information
+ * including radio information, used by some recent BSD drivers as
+ * well as the madwifi Atheros driver for Linux.
+ */
+#define DLT_IEEE802_11_RADIO   127     /* 802.11 plus radiotap radio header */
+
+/*
+ * Reserved for the TZSP encapsulation, as per request from
+ * Chris Waters <chris.waters@networkchemistry.com>
+ * TZSP is a generic encapsulation for any other link type,
+ * which includes a means to include meta-information
+ * with the packet, e.g. signal strength and channel
+ * for 802.11 packets.
+ */
+#define DLT_TZSP                128     /* Tazmen Sniffer Protocol */
+
+/*
+ * BSD's ARCNET headers have the source host, destination host,
+ * and type at the beginning of the packet; that's what's handed
+ * up to userland via BPF.
+ *
+ * Linux's ARCNET headers, however, have a 2-byte offset field
+ * between the host IDs and the type; that's what's handed up
+ * to userland via PF_PACKET sockets.
+ *
+ * We therefore have to have separate DLT_ values for them.
+ */
+#define DLT_ARCNET_LINUX       129     /* ARCNET */
+
+/*
+ * Juniper-private data link types, as per request from
+ * Hannes Gredler <hannes@juniper.net>.  The DLT_s are used
+ * for passing on chassis-internal metainformation such as
+ * QOS profiles, etc..
+ */
+#define DLT_JUNIPER_MLPPP       130
+#define DLT_JUNIPER_MLFR        131
+#define DLT_JUNIPER_ES          132
+#define DLT_JUNIPER_GGSN        133
+#define DLT_JUNIPER_MFR         134
+#define DLT_JUNIPER_ATM2        135
+#define DLT_JUNIPER_SERVICES    136
+#define DLT_JUNIPER_ATM1        137
+
+/*
+ * Apple IP-over-IEEE 1394, as per a request from Dieter Siegmund
+ * <dieter@apple.com>.  The header that's presented is an Ethernet-like
+ * header:
+ *
+ *     #define FIREWIRE_EUI64_LEN      8
+ *     struct firewire_header {
+ *             u_char  firewire_dhost[FIREWIRE_EUI64_LEN];
+ *             u_char  firewire_shost[FIREWIRE_EUI64_LEN];
+ *             u_short firewire_type;
+ *     };
+ *
+ * with "firewire_type" being an Ethernet type value, rather than,
+ * for example, raw GASP frames being handed up.
+ */
+#define DLT_APPLE_IP_OVER_IEEE1394     138
+
+/*
+ * Various SS7 encapsulations, as per a request from Jeff Morriss
+ * <jeff.morriss[AT]ulticom.com> and subsequent discussions.
+ */
+#define DLT_MTP2_WITH_PHDR     139     /* pseudo-header with various info, followed by MTP2 */
+#define DLT_MTP2               140     /* MTP2, without pseudo-header */
+#define DLT_MTP3               141     /* MTP3, without pseudo-header or MTP2 */
+#define DLT_SCCP               142     /* SCCP, without pseudo-header or MTP2 or MTP3 */
+
+/*
+ * DOCSIS MAC frames.
+ */
+#define DLT_DOCSIS             143
+
+/*
+ * Linux-IrDA packets. Protocol defined at http://www.irda.org.
+ * Those packets include IrLAP headers and above (IrLMP...), but
+ * don't include Phy framing (SOF/EOF/CRC & byte stuffing), because Phy
+ * framing can be handled by the hardware and depend on the bitrate.
+ * This is exactly the format you would get capturing on a Linux-IrDA
+ * interface (irdaX), but not on a raw serial port.
+ * Note the capture is done in "Linux-cooked" mode, so each packet include
+ * a fake packet header (struct sll_header). This is because IrDA packet
+ * decoding is dependant on the direction of the packet (incomming or
+ * outgoing).
+ * When/if other platform implement IrDA capture, we may revisit the
+ * issue and define a real DLT_IRDA...
+ * Jean II
+ */
+#define DLT_LINUX_IRDA         144
+
+/*
+ * Reserved for IBM SP switch and IBM Next Federation switch.
+ */
+#define DLT_IBM_SP             145
+#define DLT_IBM_SN             146
+
+/*
+ * Reserved for private use.  If you have some link-layer header type
+ * that you want to use within your organization, with the capture files
+ * using that link-layer header type not ever be sent outside your
+ * organization, you can use these values.
+ *
+ * No libpcap release will use these for any purpose, nor will any
+ * tcpdump release use them, either.
+ *
+ * Do *NOT* use these in capture files that you expect anybody not using
+ * your private versions of capture-file-reading tools to read; in
+ * particular, do *NOT* use them in products, otherwise you may find that
+ * people won't be able to use tcpdump, or snort, or Ethereal, or... to
+ * read capture files from your firewall/intrusion detection/traffic
+ * monitoring/etc. appliance, or whatever product uses that DLT_ value,
+ * and you may also find that the developers of those applications will
+ * not accept patches to let them read those files.
+ *
+ * Also, do not use them if somebody might send you a capture using them
+ * for *their* private type and tools using them for *your* private type
+ * would have to read them.
+ *
+ * Instead, ask "tcpdump-workers@lists.tcpdump.org" for a new DLT_ value,
+ * as per the comment above, and use the type you're given.
+ */
+#define DLT_USER0              147
+#define DLT_USER1              148
+#define DLT_USER2              149
+#define DLT_USER3              150
+#define DLT_USER4              151
+#define DLT_USER5              152
+#define DLT_USER6              153
+#define DLT_USER7              154
+#define DLT_USER8              155
+#define DLT_USER9              156
+#define DLT_USER10             157
+#define DLT_USER11             158
+#define DLT_USER12             159
+#define DLT_USER13             160
+#define DLT_USER14             161
+#define DLT_USER15             162
+
+/*
+ * For future use with 802.11 captures - defined by AbsoluteValue
+ * Systems to store a number of bits of link-layer information
+ * including radio information:
+ *
+ *     http://www.shaftnet.org/~pizza/software/capturefrm.txt
+ *
+ * but it might be used by some non-AVS drivers now or in the
+ * future.
+ */
+#define DLT_IEEE802_11_RADIO_AVS 163   /* 802.11 plus AVS radio header */
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>.  The DLT_s are used
+ * for passing on chassis-internal metainformation such as
+ * QOS profiles, etc..
+ */
+#define DLT_JUNIPER_MONITOR     164
+
+/*
+ * Reserved for BACnet MS/TP.
+ */
+#define DLT_BACNET_MS_TP       165
+
+/*
+ * Another PPP variant as per request from Karsten Keil <kkeil@suse.de>.
+ *
+ * This is used in some OSes to allow a kernel socket filter to distinguish
+ * between incoming and outgoing packets, on a socket intended to
+ * supply pppd with outgoing packets so it can do dial-on-demand and
+ * hangup-on-lack-of-demand; incoming packets are filtered out so they
+ * don't cause pppd to hold the connection up (you don't want random
+ * input packets such as port scans, packets from old lost connections,
+ * etc. to force the connection to stay up).
+ *
+ * The first byte of the PPP header (0xff03) is modified to accomodate
+ * the direction - 0x00 = IN, 0x01 = OUT.
+ */
+#define DLT_PPP_PPPD           166
+
+/*
+ * Names for backwards compatibility with older versions of some PPP
+ * software; new software should use DLT_PPP_PPPD.
+ */
+#define DLT_PPP_WITH_DIRECTION DLT_PPP_PPPD
+#define DLT_LINUX_PPP_WITHDIRECTION    DLT_PPP_PPPD
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>.  The DLT_s are used
+ * for passing on chassis-internal metainformation such as
+ * QOS profiles, cookies, etc..
+ */
+#define DLT_JUNIPER_PPPOE       167
+#define DLT_JUNIPER_PPPOE_ATM   168
+
+#define DLT_GPRS_LLC           169     /* GPRS LLC */
+#define DLT_GPF_T              170     /* GPF-T (ITU-T G.7041/Y.1303) */
+#define DLT_GPF_F              171     /* GPF-F (ITU-T G.7041/Y.1303) */
+
+/*
+ * Requested by Oolan Zimmer <oz@gcom.com> for use in Gcom's T1/E1 line
+ * monitoring equipment.
+ */
+#define DLT_GCOM_T1E1          172
+#define DLT_GCOM_SERIAL                173
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>.  The DLT_ is used
+ * for internal communication to Physical Interface Cards (PIC)
+ */
+#define DLT_JUNIPER_PIC_PEER    174
+
+/*
+ * Link types requested by Gregor Maier <gregor@endace.com> of Endace
+ * Measurement Systems.  They add an ERF header (see
+ * http://www.endace.com/support/EndaceRecordFormat.pdf) in front of
+ * the link-layer header.
+ */
+#define DLT_ERF_ETH            175     /* Ethernet */
+#define DLT_ERF_POS            176     /* Packet-over-SONET */
+
+/*
+ * Requested by Daniele Orlandi <daniele@orlandi.com> for raw LAPD
+ * for vISDN (http://www.orlandi.com/visdn/).  Its link-layer header
+ * includes additional information before the LAPD header, so it's
+ * not necessarily a generic LAPD header.
+ */
+#define DLT_LINUX_LAPD         177
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>. 
+ * The DLT_ are used for prepending meta-information
+ * like interface index, interface name
+ * before standard Ethernet, PPP, Frelay & C-HDLC Frames
+ */
+#define DLT_JUNIPER_ETHER       178
+#define DLT_JUNIPER_PPP         179
+#define DLT_JUNIPER_FRELAY      180
+#define DLT_JUNIPER_CHDLC       181
+
+/*
+ * Multi Link Frame Relay (FRF.16)
+ */
+#define DLT_MFR                 182
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>. 
+ * The DLT_ is used for internal communication with a
+ * voice Adapter Card (PIC)
+ */
+#define DLT_JUNIPER_VP          183
+
+/*
+ * Arinc 429 frames.
+ * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>.
+ * Every frame contains a 32bit A429 label.
+ * More documentation on Arinc 429 can be found at
+ * http://www.condoreng.com/support/downloads/tutorials/ARINCTutorial.pdf
+ */
+#define DLT_A429                184
+
+/*
+ * Arinc 653 Interpartition Communication messages.
+ * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>.
+ * Please refer to the A653-1 standard for more information.
+ */
+#define DLT_A653_ICM            185
+
+/*
+ * USB packets, beginning with a USB setup header; requested by
+ * Paolo Abeni <paolo.abeni@email.it>.
+ */
+#define DLT_USB                        186
+
+/*
+ * Bluetooth HCI UART transport layer (part H:4); requested by
+ * Paolo Abeni.
+ */
+#define DLT_BLUETOOTH_HCI_H4   187
+
+/*
+ * IEEE 802.16 MAC Common Part Sublayer; requested by Maria Cruz
+ * <cruz_petagay@bah.com>.
+ */
+#define DLT_IEEE802_16_MAC_CPS 188
+
+/*
+ * USB packets, beginning with a Linux USB header; requested by
+ * Paolo Abeni <paolo.abeni@email.it>.
+ */
+#define DLT_USB_LINUX          189
+
+/*
+ * Controller Area Network (CAN) v. 2.0B packets.
+ * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>.
+ * Used to dump CAN packets coming from a CAN Vector board.
+ * More documentation on the CAN v2.0B frames can be found at
+ * http://www.can-cia.org/downloads/?269
+ */
+#define DLT_CAN20B              190
+
+/*
+ * IEEE 802.15.4, with address fields padded, as is done by Linux
+ * drivers; requested by Juergen Schimmer.
+ */
+#define DLT_IEEE802_15_4_LINUX 191
+
+/*
+ * Per Packet Information encapsulated packets.
+ * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>.
+ */
+#define DLT_PPI                        192
+
+/*
+ * Header for 802.16 MAC Common Part Sublayer plus a radiotap radio header;
+ * requested by Charles Clancy.
+ */
+#define DLT_IEEE802_16_MAC_CPS_RADIO   193
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>. 
+ * The DLT_ is used for internal communication with a
+ * integrated service module (ISM).
+ */
+#define DLT_JUNIPER_ISM         194
+
+/*
+ * IEEE 802.15.4, exactly as it appears in the spec (no padding, no
+ * nothing); requested by Mikko Saarnivala <mikko.saarnivala@sensinode.com>.
+ * For this one, we expect the FCS to be present at the end of the frame;
+ * if the frame has no FCS, DLT_IEEE802_15_4_NOFCS should be used.
+ */
+#define DLT_IEEE802_15_4       195
+
+/*
+ * Various link-layer types, with a pseudo-header, for SITA
+ * (http://www.sita.aero/); requested by Fulko Hew (fulko.hew@gmail.com).
+ */
+#define DLT_SITA               196
+
+/*
+ * Various link-layer types, with a pseudo-header, for Endace DAG cards;
+ * encapsulates Endace ERF records.  Requested by Stephen Donnelly
+ * <stephen@endace.com>.
+ */
+#define DLT_ERF                        197
+
+/*
+ * Special header prepended to Ethernet packets when capturing from a
+ * u10 Networks board.  Requested by Phil Mulholland
+ * <phil@u10networks.com>.
+ */
+#define DLT_RAIF1              198
+
+/*
+ * IPMB packet for IPMI, beginning with the I2C slave address, followed
+ * by the netFn and LUN, etc..  Requested by Chanthy Toeung
+ * <chanthy.toeung@ca.kontron.com>.
+ */
+#define DLT_IPMB               199
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>. 
+ * The DLT_ is used for capturing data on a secure tunnel interface.
+ */
+#define DLT_JUNIPER_ST          200
+
+/*
+ * Bluetooth HCI UART transport layer (part H:4), with pseudo-header
+ * that includes direction information; requested by Paolo Abeni.
+ */
+#define DLT_BLUETOOTH_HCI_H4_WITH_PHDR 201
+
+/*
+ * AX.25 packet with a 1-byte KISS header; see
+ *
+ *     http://www.ax25.net/kiss.htm
+ *
+ * as per Richard Stearn <richard@rns-stearn.demon.co.uk>.
+ */
+#define DLT_AX25_KISS          202
+
+/*
+ * LAPD packets from an ISDN channel, starting with the address field,
+ * with no pseudo-header.
+ * Requested by Varuna De Silva <varunax@gmail.com>.
+ */
+#define DLT_LAPD               203
+
+/*
+ * Variants of various link-layer headers, with a one-byte direction
+ * pseudo-header prepended - zero means "received by this host",
+ * non-zero (any non-zero value) means "sent by this host" - as per
+ * Will Barker <w.barker@zen.co.uk>.
+ */
+#define DLT_PPP_WITH_DIR       204     /* PPP - don't confuse with DLT_PPP_WITH_DIRECTION */
+#define DLT_C_HDLC_WITH_DIR    205     /* Cisco HDLC */
+#define DLT_FRELAY_WITH_DIR    206     /* Frame Relay */
+#define DLT_LAPB_WITH_DIR      207     /* LAPB */
+
+/*
+ * 208 is reserved for an as-yet-unspecified proprietary link-layer
+ * type, as requested by Will Barker.
+ */
+
+/*
+ * IPMB with a Linux-specific pseudo-header; as requested by Alexey Neyman
+ * <avn@pigeonpoint.com>.
+ */
+#define DLT_IPMB_LINUX         209
+
+/*
+ * FlexRay automotive bus - http://www.flexray.com/ - as requested
+ * by Hannes Kaelber <hannes.kaelber@x2e.de>.
+ */
+#define DLT_FLEXRAY            210
+
+/*
+ * Media Oriented Systems Transport (MOST) bus for multimedia
+ * transport - http://www.mostcooperation.com/ - as requested
+ * by Hannes Kaelber <hannes.kaelber@x2e.de>.
+ */
+#define DLT_MOST               211
+
+/*
+ * Local Interconnect Network (LIN) bus for vehicle networks -
+ * http://www.lin-subbus.org/ - as requested by Hannes Kaelber
+ * <hannes.kaelber@x2e.de>.
+ */
+#define DLT_LIN                        212
+
+/*
+ * X2E-private data link type used for serial line capture,
+ * as requested by Hannes Kaelber <hannes.kaelber@x2e.de>.
+ */
+#define DLT_X2E_SERIAL         213
+
+/*
+ * X2E-private data link type used for the Xoraya data logger
+ * family, as requested by Hannes Kaelber <hannes.kaelber@x2e.de>.
+ */
+#define DLT_X2E_XORAYA         214
+
+/*
+ * IEEE 802.15.4, exactly as it appears in the spec (no padding, no
+ * nothing), but with the PHY-level data for non-ASK PHYs (4 octets
+ * of 0 as preamble, one octet of SFD, one octet of frame length+
+ * reserved bit, and then the MAC-layer data, starting with the
+ * frame control field).
+ *
+ * Requested by Max Filippov <jcmvbkbc@gmail.com>.
+ */
+#define DLT_IEEE802_15_4_NONASK_PHY    215
+
+/* 
+ * David Gibson <david@gibson.dropbear.id.au> requested this for
+ * captures from the Linux kernel /dev/input/eventN devices. This
+ * is used to communicate keystrokes and mouse movements from the
+ * Linux kernel to display systems, such as Xorg. 
+ */
+#define DLT_LINUX_EVDEV                216
+
+/*
+ * GSM Um and Abis interfaces, preceded by a "gsmtap" header.
+ *
+ * Requested by Harald Welte <laforge@gnumonks.org>.
+ */
+#define DLT_GSMTAP_UM          217
+#define DLT_GSMTAP_ABIS                218
+
+/*
+ * MPLS, with an MPLS label as the link-layer header.
+ * Requested by Michele Marchetto <michele@openbsd.org> on behalf
+ * of OpenBSD.
+ */
+#define DLT_MPLS               219
+
+/*
+ * USB packets, beginning with a Linux USB header, with the USB header
+ * padded to 64 bytes; required for memory-mapped access.
+ */
+#define DLT_USB_LINUX_MMAPPED  220
+
+/*
+ * DECT packets, with a pseudo-header; requested by
+ * Matthias Wenzel <tcpdump@mazzoo.de>.
+ */
+#define DLT_DECT               221
+
+/*
+ * From: "Lidwa, Eric (GSFC-582.0)[SGT INC]" <eric.lidwa-1@nasa.gov>
+ * Date: Mon, 11 May 2009 11:18:30 -0500
+ *
+ * DLT_AOS. We need it for AOS Space Data Link Protocol.
+ *   I have already written dissectors for but need an OK from
+ *   legal before I can submit a patch.
+ *
+ */
+#define DLT_AOS                 222
+
+/*
+ * Wireless HART (Highway Addressable Remote Transducer)
+ * From the HART Communication Foundation
+ * IES/PAS 62591
+ *
+ * Requested by Sam Roberts <vieuxtech@gmail.com>.
+ */
+#define DLT_WIHART             223
+
+/*
+ * Fibre Channel FC-2 frames, beginning with a Frame_Header.
+ * Requested by Kahou Lei <kahou82@gmail.com>.
+ */
+#define DLT_FC_2               224
+
+/*
+ * Fibre Channel FC-2 frames, beginning with an encoding of the
+ * SOF, and ending with an encoding of the EOF.
+ *
+ * The encodings represent the frame delimiters as 4-byte sequences
+ * representing the corresponding ordered sets, with K28.5
+ * represented as 0xBC, and the D symbols as the corresponding
+ * byte values; for example, SOFi2, which is K28.5 - D21.5 - D1.2 - D21.2,
+ * is represented as 0xBC 0xB5 0x55 0x55.
+ *
+ * Requested by Kahou Lei <kahou82@gmail.com>.
+ */
+#define DLT_FC_2_WITH_FRAME_DELIMS     225
+
+/*
+ * Solaris ipnet pseudo-header; requested by Darren Reed <Darren.Reed@Sun.COM>.
+ *
+ * The pseudo-header starts with a one-byte version number; for version 2,
+ * the pseudo-header is:
+ *
+ * struct dl_ipnetinfo {
+ *     u_int8_t   dli_version;
+ *     u_int8_t   dli_family;
+ *     u_int16_t  dli_htype;
+ *     u_int32_t  dli_pktlen;
+ *     u_int32_t  dli_ifindex;
+ *     u_int32_t  dli_grifindex;
+ *     u_int32_t  dli_zsrc;
+ *     u_int32_t  dli_zdst;
+ * };
+ *
+ * dli_version is 2 for the current version of the pseudo-header.
+ *
+ * dli_family is a Solaris address family value, so it's 2 for IPv4
+ * and 26 for IPv6.
+ *
+ * dli_htype is a "hook type" - 0 for incoming packets, 1 for outgoing
+ * packets, and 2 for packets arriving from another zone on the same
+ * machine.
+ *
+ * dli_pktlen is the length of the packet data following the pseudo-header
+ * (so the captured length minus dli_pktlen is the length of the
+ * pseudo-header, assuming the entire pseudo-header was captured).
+ *
+ * dli_ifindex is the interface index of the interface on which the
+ * packet arrived.
+ *
+ * dli_grifindex is the group interface index number (for IPMP interfaces).
+ *
+ * dli_zsrc is the zone identifier for the source of the packet.
+ *
+ * dli_zdst is the zone identifier for the destination of the packet.
+ *
+ * A zone number of 0 is the global zone; a zone number of 0xffffffff
+ * means that the packet arrived from another host on the network, not
+ * from another zone on the same machine.
+ *
+ * An IPv4 or IPv6 datagram follows the pseudo-header; dli_family indicates
+ * which of those it is.
+ */
+#define DLT_IPNET              226
+
+/*
+ * CAN (Controller Area Network) frames, with a pseudo-header as supplied
+ * by Linux SocketCAN.  See Documentation/networking/can.txt in the Linux
+ * source.
+ *
+ * Requested by Felix Obenhuber <felix@obenhuber.de>.
+ */
+#define DLT_CAN_SOCKETCAN      227
+
+/*
+ * Raw IPv4/IPv6; different from DLT_RAW in that the DLT_ value specifies
+ * whether it's v4 or v6.  Requested by Darren Reed <Darren.Reed@Sun.COM>.
+ */
+#define DLT_IPV4               228
+#define DLT_IPV6               229
+
+/*
+ * IEEE 802.15.4, exactly as it appears in the spec (no padding, no
+ * nothing), and with no FCS at the end of the frame; requested by
+ * Jon Smirl <jonsmirl@gmail.com>.
+ */
+#define DLT_IEEE802_15_4_NOFCS 230
+
+/*
+ * Raw D-Bus:
+ *
+ *     http://www.freedesktop.org/wiki/Software/dbus
+ *
+ * messages:
+ *
+ *     http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-messages
+ *
+ * starting with the endianness flag, followed by the message type, etc.,
+ * but without the authentication handshake before the message sequence:
+ *
+ *     http://dbus.freedesktop.org/doc/dbus-specification.html#auth-protocol
+ *
+ * Requested by Martin Vidner <martin@vidner.net>.
+ */
+#define DLT_DBUS               231
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>.
+ */
+#define DLT_JUNIPER_VS                 232
+#define DLT_JUNIPER_SRX_E2E            233
+#define DLT_JUNIPER_FIBRECHANNEL       234
+
+/*
+ * DVB-CI (DVB Common Interface for communication between a PC Card
+ * module and a DVB receiver).  See
+ *
+ *     http://www.kaiser.cx/pcap-dvbci.html
+ *
+ * for the specification.
+ *
+ * Requested by Martin Kaiser <martin@kaiser.cx>.
+ */
+#define DLT_DVB_CI             235
+
+/*
+ * Variant of 3GPP TS 27.010 multiplexing protocol (similar to, but
+ * *not* the same as, 27.010).  Requested by Hans-Christoph Schemmel
+ * <hans-christoph.schemmel@cinterion.com>.
+ */
+#define DLT_MUX27010           236
+
+/*
+ * STANAG 5066 D_PDUs.  Requested by M. Baris Demiray
+ * <barisdemiray@gmail.com>.
+ */
+#define DLT_STANAG_5066_D_PDU  237
+
+/*
+ * Juniper-private data link type, as per request from
+ * Hannes Gredler <hannes@juniper.net>.
+ */
+#define DLT_JUNIPER_ATM_CEMIC  238
+
+/*
+ * NetFilter LOG messages 
+ * (payload of netlink NFNL_SUBSYS_ULOG/NFULNL_MSG_PACKET packets)
+ *
+ * Requested by Jakub Zawadzki <darkjames-ws@darkjames.pl>
+ */
+#define DLT_NFLOG              239
+
+/*
+ * Hilscher Gesellschaft fuer Systemautomation mbH link-layer type
+ * for Ethernet packets with a 4-byte pseudo-header and always
+ * with the payload including the FCS, as supplied by their
+ * netANALYZER hardware and software.
+ *
+ * Requested by Holger P. Frommer <HPfrommer@hilscher.com>
+ */
+#define DLT_NETANALYZER                240
+
+/*
+ * Hilscher Gesellschaft fuer Systemautomation mbH link-layer type
+ * for Ethernet packets with a 4-byte pseudo-header and FCS and
+ * with the Ethernet header preceded by 7 bytes of preamble and
+ * 1 byte of SFD, as supplied by their netANALYZER hardware and
+ * software.
+ *
+ * Requested by Holger P. Frommer <HPfrommer@hilscher.com>
+ */
+#define DLT_NETANALYZER_TRANSPARENT    241
+
+/*
+ * IP-over-Infiniband, as specified by RFC 4391.
+ *
+ * Requested by Petr Sumbera <petr.sumbera@oracle.com>.
+ */
+#define DLT_IPOIB              242
+
+#define DLT_MATCHING_MAX       242     /* highest value in the "matching" range */
+
+/*
+ * DLT and savefile link type values are split into a class and
+ * a member of that class.  A class value of 0 indicates a regular
+ * DLT_/LINKTYPE_ value.
+ */
+#define DLT_CLASS(x)           ((x) & 0x03ff0000)
+
+/*
+ * NetBSD-specific generic "raw" link type.  The class value indicates
+ * that this is the generic raw type, and the lower 16 bits are the
+ * address family we're dealing with.  Those values are NetBSD-specific;
+ * do not assume that they correspond to AF_ values for your operating
+ * system.
+ */
+#define        DLT_CLASS_NETBSD_RAWAF  0x02240000
+#define        DLT_NETBSD_RAWAF(af)    (DLT_CLASS_NETBSD_RAWAF | (af))
+#define        DLT_NETBSD_RAWAF_AF(x)  ((x) & 0x0000ffff)
+#define        DLT_IS_NETBSD_RAWAF(x)  (DLT_CLASS(x) == DLT_CLASS_NETBSD_RAWAF)
+
+
+/*
+ * The instruction encodings.
+ */
+/* instruction classes */
+#define BPF_CLASS(code) ((code) & 0x07)
+#define