Merge remote-tracking branch 'goog/master' into update_tcpdump

* goog/master:
  Get libpcap 1.5.2+ to compile on Android.
  Merge remote-tracking branch 'goog/tcpdump'
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d6d58ac
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,44 @@
+Makefile
+*~
+*.o
+bpf_filter.c
+config.h
+config.log
+config.cache
+config.status
+stamp-h
+stamp-h.in
+autom4te.cache/
+.devel
+filtertest
+findalldevstest
+grammar.c
+libpcap.a
+libpcap.*.dylib
+libpcap.sl
+libpcap.so.*
+libpcap-*.tar.gz
+net
+os-proto.h
+pcap-config
+pcap-filter.manmisc
+pcap-linktype.manmisc
+pcap-savefile.manfile
+pcap-tstamp.manmisc
+pcap.3pcap
+pcap_compile.3pcap
+pcap_datalink.3pcap
+pcap_dump_open.3pcap
+pcap_get_tstamp_precision.3pcap
+pcap_list_datalinks.3pcap
+pcap_list_tstamp_types.3pcap
+pcap_open_dead.3pcap
+pcap_open_offline.3pcap
+pcap_set_tstamp_precision.3pcap
+pcap_set_tstamp_type.3pcap
+scanner.c
+scanner.h
+selpolltest
+tokdefs.h
+version.c
+version.h
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..3a7fac1
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,5 @@
+language: c
+
+script:
+  - ./configure
+  - make
diff --git a/Android.mk b/Android.mk
index 1335d75..2d82baf 100644
--- a/Android.mk
+++ b/Android.mk
@@ -1,22 +1,18 @@
 LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
 
+libpcap_PSRC =	pcap-linux.c pcap-usb-linux.c  pcap-can-linux.c pcap-netfilter-linux.c  
+libpcap_FSRC =  fad-gifc.c
+libpcap_CSRC =	pcap.c inet.c gencode.c optimize.c nametoaddr.c etherent.c \
+	savefile.c sf-pcap.c sf-pcap-ng.c pcap-common.c \
+	bpf_image.c bpf_dump.c
+libpcap_GENSRC = scanner.c grammar.c bpf_filter.c version.c
+
+libpcap_SRC =	$(libpcap_PSRC) $(libpcap_FSRC) $(libpcap_CSRC) $(libpcap_GENSRC)
+
+
 LOCAL_SRC_FILES:=\
-	bpf_dump.c\
-	bpf/net/bpf_filter.c\
-	bpf_image.c\
-	etherent.c\
-	fad-gifc.c\
-	gencode.c\
-	grammar.c\
-	inet.c\
-	nametoaddr.c\
-	optimize.c\
-	pcap.c\
-	pcap-linux.c\
-	savefile.c\
-	scanner.c\
-	version.c
+	$(libpcap_SRC)
 
 LOCAL_CFLAGS:=-O2 -g
 LOCAL_CFLAGS+=-DHAVE_CONFIG_H -D_U_="__attribute__((unused))" -Dlinux -D__GLIBC__ -D_GNU_SOURCE
diff --git a/CHANGES b/CHANGES
index 536e1a2..64734b5 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,28 +1,278 @@
-@(#) $Header: /tcpdump/master/libpcap/CHANGES,v 1.59.2.13 2007/09/12 22:40:04 ken Exp $ (LBL)
+Wednesday December 18, 2013 guy@alum.mit.edu
+Summary for 1.5.3 libpcap release
+	Don't let packets that don't match the current filter get to the
+	    application when TPACKET_V3 is used. (GitHub issue #331)
+	Fix handling of pcap_loop()/pcap_dispatch() with a packet count
+	    of 0 on some platforms (including Linux with TPACKET_V3).
+	    (GitHub issue #333)
+	Work around TPACKET_V3 deficiency that causes packets to be lost
+	    when a timeout of 0 is specified. (GitHub issue #335)
+	Man page formatting fixes.
 
-Mon.	September 10, 2007.  ken@xelerance.com.  Summary for 0.9.8 libpcap release
-	Change build process to put public libpcap headers into pcap subir
-	DLT: Add value for IPMI IPMB packets
-	DLT: Add value for u10 Networks boards
-	Require <net/pfvar.h> for pf definitions - allows reading of pflog formatted 
-	 libpcap files on an OS other than where the file was generated
+Wednesday December 4, 2013 guy@alum.mit.edu
+Summary for 1.5.2 libpcap release
+	Fix libpcap to work when compiled with TPACKET_V3 support and
+	    running on a kernel without TPACKET_V3 support. (GitHub
+	    issue #329)
 
-Wed.	July 23, 2007.  mcr@xelerance.com.  Summary for 0.9.7 libpcap release
+Wednesday November 20, 2013 guy@alum.mit.edu
+Summary for 1.5.1 libpcap release
+	Report an error, rather than crashing, if an IPv6 address is
+	    used for link-layer filtering.  (Wireshark bug 9376)
 
-	FIXED version file to be 0.9.7 instead of 0.9.5.
-	added flags/configuration for cloning bpf device.
-	added DLT_MTP2_WITH_PHDR support (PPI)
-        "fix" the "memory leak" in icode_to_fcode() -- documentation bug
-        Various link-layer types, with a pseudo-header, for SITA http://www.sita.aero/
-	introduces support for the DAG ERF type TYPE_COLOR_MC_HDLC_POS.
-	Basic BPF filtering support for DLT_MTP2_WITH_PHDR is also added.
-        check for IPv4 and IPv6, even for DLT_RAW 
-	add support for DLT_JUNIPER_ISM
-  	Pick up changes from NetBSD: many from tron, christos, drochner
-	Allocate DLT_ for 802.15.4 without any header munging, for Mikko Saarnivala.
-	Header for 802.16 MAC Common Part Sublayer plus a radiotap radio header
+Wednesday October 30, 2013 guy@alum.mit.edu
+Summary for 1.5.0 libpcap release
+	TPACKET_V3 support added for Linux
+	Point users to the the-tcpdump-group repository on GitHub rather
+	    than the mcr repository
+	Checks added for malloc()/realloc()/etc. failures
+	Fixed build on Solaris 11
+	Support filtering filtering E1 SS7 traffic on MTP2 layer Annex A
+	Use "ln -s" to link man pages by default
+        Add support for getting nanosecond-resolution time stamps when
+	    capturing and reading capture files
+        Many changes to autoconf to deal better with non-GCC compilers
+        added many new DLT types
 
-Wed.	April 25, 2007. ken@xelerance.com.  Summary for 0.9.6 libpcap release
+Saturday April 6, 2013 guy@alum.mit.edu
+Summary for 1.4.0 libpcap release
+	Add netfilter/nfqueue interface.
+	If we don't have support for IPv6 address resolution, support,
+	    in filter expressions, what IPv6 stuff we can.
+	Fix pcap-config to include -lpthread if canusb support is
+	    present
+	Try to fix "pcap_parse not defined" problems when --without-flex
+	    and --without-bison are used when you have Flex and Bison
+	Fix some issues with the pcap_loop man page.
+	Fix pcap_getnonblock() and pcap_setnonblock() to fill in the
+	    supplied error message buffer
+	Fix typo that, it appeared, would cause pcap-libdlpi.c not to
+	    compile (perhaps systems with libdlpi also have BPF and use
+	    that instead)
+	Catch attempts to call pcap_compile() on a non-activated pcap_t
+	Fix crash on Linux with CAN-USB support without usbfs
+	Fix addition of VLAN tags for Linux cooked captures
+	Check for both EOPNOTSUPP and EINVAL after SIOCETHTOOL ioctl, so
+	    that the driver can report either one if it doesn't support
+	    SIOCETHTOOL
+	Add DLT_INFINIBAND and DLT_SCTP
+	Describe "proto XXX" and "protochain XXX" in the pcap-filter man
+	    page
+	Handle either directories, or symlinks to directories, that
+	    correspond to interfaces in /sys/class/net
+	Fix handling of VLAN tag insertion to check, on Linux 3.x
+	    kernels, for VLAN tag valid flag
+	Clean up some man pages
+	Support libnl3 as well as libnl1 and libnl2 on Linux
+	Fix handling of Bluetooth devices on 3.x Linux kernels
+
+Friday  March 30, 2012.  mcr@sandelman.ca
+Summary for 1.3.0 libpcap release
+        Handle DLT_PFSYNC in {FreeBSD, other *BSD+Mac OS X, other}.
+        Linux: Don't fail if netfilter isn't enabled in the kernel.
+        Add new link-layer type for NFC Forum LLCP.
+        Put the CANUSB stuff into EXTRA_DIST, so it shows up in the release tarball.
+        Add LINKTYPE_NG40/DLT_NG40.
+        Add DLT_MPEG_2_TS/LINKTYPE_MPEG_2_TS for MPEG-2 transport streams.
+        [PATCH] Fix AIX-3.5 crash with read failure during stress
+        AIX fixes.
+        Introduce --disable-shared configure option.
+        Added initial support for canusb devices.
+        Include the pcap(3PCAP) additions as 1.2.1 changes.
+        many updates to documentation: pcap.3pcap.in
+        Improve 'inbound'/'outbound' capture filters under Linux.
+        Note the cleanup of handling of new DLT_/LINKTYPE_ values.
+        On Lion, don't build for PPC.
+        For mac80211 devices we need to clean up monitor mode on exit.
+
+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
+	Compile with large file support on by default
+	Add pcap-config script, which deals with -I/-L flags for compiling
+	DLT: Add IPMB
+	DLT: Add LAPD
+	DLT: Add AX25 (AX.25 w/KISS header)
+	DLT: Add JUNIPER_ST
+	802.15.4 support
+	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
+	 can print better diagnostic information
+	Return PCAP_ERROR_PERM_DENIED if we don't have permission to open a device, so
+	 applications can tell the user they need to go play with permissions
+	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/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
+	Autogenerate VERSION numbers better
+
+Mon.    September 10, 2007.  ken@xelerance.com.  Summary for 0.9.8 libpcap release
+        Change build process to put public libpcap headers into pcap subir
+        DLT: Add value for IPMI IPMB packets
+        DLT: Add value for u10 Networks boards
+        Require <net/pfvar.h> for pf definitions - allows reading of pflog formatted 
+         libpcap files on an OS other than where the file was generated
+
+Wed.	April 25, 2007.  ken@xelerance.com.  Summary for 0.9.6 libpcap release
 
 	Put the public libpcap headers into a pcap subdirectory in both the
 	 source directory and the target include directory, and have include
diff --git a/CREDITS b/CREDITS
index 2e54aab..69cbbf0 100644
--- a/CREDITS
+++ b/CREDITS
@@ -1,108 +1,177 @@
 This file lists people who have contributed to libpcap:
 
 The current maintainers:
-	Bill Fenner			<fenner@research.att.com>
-	Fulvio Risso			<risso@polito.it>
-	Guy Harris	 		<guy@alum.mit.edu>
-	Hannes Gredler			<hannes@juniper.net>
-	Jun-ichiro itojun Hagino	<itojun@iijlab.net>
-	Michael Richardson	 	<mcr@sandelman.ottawa.on.ca>
+    Bill Fenner                   <fenner at research dot att dot com>
+    Denis Ovsienko                <infrastation at yandex dot ru>
+    Fulvio Risso                  <risso at polito dot it>
+    Guy Harris                    <guy at alum dot mit dot edu>
+    Hannes Gredler                <hannes at juniper dot net>
+    Michael Richardson            <mcr at sandelman dot ottawa dot on dot ca>
 
 Additional people who have contributed patches:
 
-	Alan Bawden			<Alan@LCS.MIT.EDU>
-	Alexey Kuznetsov		<kuznet@ms2.inr.ac.ru>
-	Albert Chin			<china@thewrittenword.com>
-	Andrew Brown			<atatat@atatdot.net>
-	Antti Kantee			<pooka@netbsd.org>
-	Arkadiusz Miskiewicz		<misiek@pld.org.pl>
-	Armando L. Caro Jr.		<acaro@mail.eecis.udel.edu>
-	Assar Westerlund	 	<assar@sics.se>
-	Brian Ginsbach			<ginsbach@cray.com>
-	Charles M. Hannum		<mycroft@netbsd.org>
-	Chris G. Demetriou		<cgd@netbsd.org>
-	Chris Lightfoot			<cwrl@users.sourceforge.net>
-	Chris Pepper			<pepper@mail.reppep.com>
-	Daniele Orlandi			<daniele@orlandi.com>
-	Darren Reed			<darrenr@reed.wattle.id.au>
-	David Kaelbling			<drk@sgi.com>
-	David Young			<dyoung@ojctech.com>
-	Dean Gaudet			<dean@arctic.org>
-	Don Ebright			<Don.Ebright@compuware.com> 
-	Dug Song			<dugsong@monkey.org>
-	Eric Anderson			<anderse@hpl.hp.com>
-        Erik de Castro Lopo             <erik.de.castro.lopo@sensorynetworks.com>
-	Florent Drouin			<Florent.Drouin@alcatel-lucent.fr>
-	Franz Schaefer			<schaefer@mond.at>
-	Gianluca Varenni		<varenni@netgroup-serv.polito.it>
-	Gilbert Hoyek			<gil_hoyek@hotmail.com>
-	Gisle Vanem			<giva@bgnett.no>
-	Graeme Hewson			<ghewson@cix.compulink.co.uk>
-	Greg Stark			<gsstark@mit.edu>
-	Greg Troxel			<gdt@ir.bbn.com>
-	Guillaume Pelat			<endymion_@users.sourceforge.net>
-	Hyung Sik Yoon			<hsyn@kr.ibm.com>
-	Igor Khristophorov		<igor@atdot.org>
-	Jan-Philip Velders		<jpv@veldersjes.net>
-	Jason R. Thorpe			<thorpej@netbsd.org>
-	Javier Achirica			<achirica@ttd.net>
-	Jean Tourrilhes			<jt@hpl.hp.com>
-	Jefferson Ogata			<jogata@nodc.noaa.gov>
-	Jesper Peterson			<jesper@endace.com>
-	John Bankier			<jbankier@rainfinity.com>
-	Jon Lindgren			<jonl@yubyub.net>
-	Juergen Schoenwaelder		<schoenw@ibr.cs.tu-bs.de>
-	Jung-uk Kim			<jkim@FreeBSD.org>
-	Kazushi Sugyo			<sugyo@pb.jp.nec.com>
-	Klaus Klein			<kleink@netbsd.org>
-	Koryn Grant			<koryn@endace.com>
-	Krzysztof Halasa		<khc@pm.waw.pl>
-	Lorenzo Cavallaro		<sullivan@sikurezza.org>
-	Loris Degioanni			<loris@netgroup-serv.polito.it>
-	Love Hörnquist-Åstrand		<lha@stacken.kth.se>
-	Maciej W. Rozycki		<macro@ds2.pg.gda.pl>
-	Marcus Felipe Pereira		<marcus@task.com.br>
-	Mark C. Brown			<mbrown@hp.com>
-	Mark Pizzolato			<List-tcpdump-workers@subscriptions.pizzolato.net>
-	Martin Husemann			<martin@netbsd.org>
-	Matthew Luckie			<mjl@luckie.org.nz>
-	Max Laier			<max@love2party.net>
-	Mike Kershaw			<dragorn@kismetwireless.net>
-	Mike Wiacek			<mike@iroot.net>
-	Monroe Williams			<monroe@pobox.com>
-	Nicolas Dade			<ndade@nsd.dyndns.org>
-	Octavian Cerna			<tavy@ylabs.com>
-	Olaf Kirch			<okir@caldera.de>
-	Ollie Wild			<aaw@users.sourceforge.net>
-	Onno van der Linden		<onno@simplex.nl>
-	Patrick Marie			<mycroft@virgaria.org>
-	Paul Mundt			<lethal@linux-sh.org>
-	Pavel Kankovsky			<kan@dcit.cz>
-	Pawel Pokrywka			<publicpp@gmail.com>
-	Peter Fales			<peter@fales-lorenz.net>
-	Peter Jeremy			<peter.jeremy@alcatel.com.au>
-	Phil Wood			<cpw@lanl.gov>
-	Rafal Maszkowski		<rzm@icm.edu.pl>
-					<rcb-isis@users.sourceforge.net>
-	Rick Jones			<raj@cup.hp.com>
-	Scott Barron			<sb125499@ohiou.edu>
-	Scott Gifford			<sgifford@tir.com>
-	Sebastian Krahmer		<krahmer@cs.uni-potsdam.de>
-	Shaun Clowes			<delius@progsoc.uts.edu.au>
-	Solomon Peachy			<pizza@shaftnet.org>
-	Stefan Hudson			<hudson@mbay.net>
-	Stephen Donnelly		<stephen@endace.com>
-	Takashi Yamamoto		<yamt@mwd.biglobe.ne.jp>
-        Tanaka Shin-ya                  <zstanaka@archer.livedoor.com>
-	Tony Li				<tli@procket.com>
-	Torsten Landschoff	 	<torsten@debian.org>
-	Uns Lider			<unslider@miranda.org>
-	Uwe Girlich			<Uwe.Girlich@philosys.de>
-	Xianjie Zhang			<xzhang@cup.hp.com>
-	Yen Yen Lim
-	Yoann Vandoorselaere		<yoann@prelude-ids.org>
+    Akos Vandra                   <axos88 at gmail dot com>
+    Alan Bawden                   <Alan at LCS dot MIT dot EDU>
+    Albert Chin                   <china at thewrittenword dot com>
+    Alexander 'Leo' Bergolth      <Leo dot Bergolth at wu-wien dot ac dot at>
+    Alexey Kuznetsov              <kuznet at ms2 dot inr dot ac dot ru>
+    Alon Bar-Lev                  <alonbl at sourceforge dot net>
+    Andres Perera                 <andres dot p at zoho dot com>
+    Andrew Brown                  <atatat at atatdot dot net>
+                                  <andy-1 at sourceforge dot net>
+    Ani Sinha                     <ani at aristanetworks dot com>
+    Antti Kantee                  <pooka at netbsd dot org>
+    Arien Vijn                    <arienvijn at sourceforge dot net>
+    Arkadiusz Miskiewicz          <misiek at pld dot org dot pl>
+    Armando L. Caro Jr.           <acaro at mail dot eecis dot udel dot edu>
+    Assar Westerlund              <assar at sics dot se>
+    Bill Parker                   <wp02855 at gmail dot com>
+    Brent Cook                    <brent at boundary dot com>
+    Brian Ginsbach                <ginsbach at cray dot com>
+    Charles M. Hannum             <mycroft at netbsd dot org>
+    Chris G. Demetriou            <cgd at netbsd dot org>
+    Chris Lightfoot               <cwrl at users dot sourceforge dot net>
+    Chris Maynard                 <Chris dot Maynard at gtech dot com>
+    Chris Pepper                  <pepper at mail dot reppep dot com>
+    Christian Bell                <csbell at myri dot com>
+    Christian Peron               <csjp at freebsd dot org>
+    Christian Svensson            <blue at cmd dot nu>
+    Daniele Orlandi               <daniele at orlandi dot com>
+    Darren Lim                    <darren dot lim at endace dot com>
+    Darren Reed                   <darrenr at sun dot com>
+    David Clark                   <david dot clark at datasoft dot com>
+    David Kaelbling               <drk at sgi dot com>
+    David Ward                    <david dot ward at ll dot mit dot edu>
+    David Young                   <dyoung at ojctech dot com>
+    Dean Gaudet                   <dean at arctic dot org>
+    dhruv                         <rsrivat at sourceforge dot net>
+    Don Ebright                   <Don dot Ebright at compuware dot com> 
+    Dug Song                      <dugsong at monkey dot org>
+    Dustin Spicuzza               <dustin at virtualroadside dot com>
+    dzejarczech                   <dzejarczech at sourceforge dot net>
+    Edward Sheldrake              <ejs1920 at sourceforge dot net>
+    Eric Anderson                 <anderse at hpl dot hp dot com>
+    Erik de Castro Lopo           <erik dot de dot castro dot lopo at sensorynetworks dot com>
+    Felix Obenhuber               <felix at obenhuber dot de>
+    Florent Drouin                <Florent dot Drouin at alcatel-lucent dot fr>
+    Franz Schaefer                <schaefer at mond dot at>
+    frederich                     <frederich at sourceforge dot net>
+    Fulko Hew                     <fulko dot hew at gmail dot com>
+    Fumiyuki Shimizu              <fumifumi at abacustech dot jp>
+    Gabor Tatarka                 <gabor dot tatarka at ericsson dot com>
+    Garrett Cooper                <yaberauneya at sourceforge dot net>
+    George Neville-Neil           <gnn at freebsd dot org>
+    Gianluca Varenni              <gianluca dot varenni at gmail dot com>
+    Gilbert Hoyek                 <gil_hoyek at hotmail dot com>
+    Gisle Vanem                   <gvanem at broadpark dot no>
+    Graeme Hewson                 <ghewson at cix dot compulink dot co dot uk>
+    Gregor Maier                  <gregor at net dot in dot tum dot de>
+    Greg Stark                    <gsstark at mit dot edu>
+    Greg Troxel                   <gdt at ir dot bbn dot com>
+    Guillaume Pelat               <endymion_ at users dot sourceforge dot net>
+    Gustavo Zacarias              <gustavo at zacarias dot com dot ar>
+    Hagen Paul Pfeifer            <hagen at jauu dot net>
+    Henri Doreau                  <hdoreau at sourceforge dot net>
+    Hyung Sik Yoon                <hsyn at kr dot ibm dot com>
+    Igor Khristophorov            <igor at atdot dot org>
+    Jakub Zawadzki                <darkjames at darkjames dot pl>
+    Jan-Philip Velders            <jpv at veldersjes dot net>
+    Jason R. Thorpe               <thorpej at netbsd dot org>
+    Javier Achirica               <achirica at ttd dot net>
+    Jean-Louis Charton            <Jean-Louis dot CHARTON at oikialog dot com>
+    Jean Tourrilhes               <jt at hpl dot hp dot com>
+    Jefferson Ogata               <jogata at nodc dot noaa dot gov>
+    Jesper Dangaard Brouer        <hawk at comx dot dk>
+    Jesper Peterson               <jesper at endace dot com>
+    Jiri Slaby                    <jirislaby at gmail dot com>
+    Joerg Mayer                   <jmayer at loplof dot de>
+    John Bankier                  <jbankier at rainfinity dot com>
+    Jon Lindgren                  <jonl at yubyub dot net>
+    Jon Smirl                     <jonsmirl at gmail dot com>
+    Jorge Boncompte [DTI2]        <jorge at dti2 dot net>
+    Juergen Schoenwaelder         <schoenw at ibr dot cs dot tu-bs dot de>
+    Julien Moutinho               <julm at savines dot alpes dot fr dot eu dot org>
+    Jung-uk Kim                   <jkim at FreeBSD dot org>
+    Kazushi Sugyo                 <sugyo at pb dot jp dot nec dot com>
+    Klaus Klein                   <kleink at netbsd dot org>
+    Koryn Grant                   <koryn at endace dot com>
+    Kris Katterjohn               <katterjohn at gmail dot com>
+    Krzysztof Halasa              <khc at pm dot waw dot pl>
+    Lorenzo Cavallaro             <sullivan at sikurezza dot org>
+    Loris Degioanni               <loris at netgroup-serv dot polito dot it>
+    Love Hörnquist-Åstrand        <lha at stacken dot kth dot se>
+    Luis MartinGarcia             <luis dot mgarc at gmail dot com>
+    Maciej W. Rozycki             <macro at ds2 dot pg dot gda dot pl>
+    Mansour Behabadi              <mansour at oxplot dot com>
+    Marcus Felipe Pereira         <marcus at task dot com dot br>
+    Mark C. Brown                 <mbrown at hp dot com>
+    Mark Pizzolato                <List-tcpdump-workers at subscriptions dot pizzolato dot net>
+    Markus Mayer                  <markus_mayer at sourceforge dot net>
+    Martin Husemann               <martin at netbsd dot org>
+    Márton Németh                 <nm127 at freemail dot hu>
+    Matthew Luckie                <mjl at luckie dot org dot nz>
+    Max Laier                     <max at love2party dot net>
+    Michal Labedzki               
+    Michal Sekletar               <msekleta at redhat dot com>
+    Mike Frysinger                <vapier at gmail dot com>
+    Mike Kershaw                  <dragorn at kismetwireless dot net>
+    Mike Wiacek                   <mike at iroot dot net>
+    Miroslav Lichvar              <mlichvar at redhat dot com>
+    Monroe Williams               <monroe at pobox dot com>
+    Nicolas Dade                  <ndade at nsd dot dyndns dot org>
+    Niko Delarich                 <niko dot delarich at gmail dot com>
+    N. Leiten                     <nleiten at sourceforge dot net>
+                                  <nvercamm at sourceforge dot net>
+    Octavian Cerna                <tavy at ylabs dot com>
+    Olaf Kirch                    <okir at caldera dot de>
+    Ollie Wild                    <aaw at users dot sourceforge dot net>
+    Onno van der Linden           <onno at simplex dot nl>
+    Paolo Abeni                   <paolo dot abeni at email dot it>
+    Patrick Marie                 <mycroft at virgaria dot org>
+    Patrick McHardy               <kaber at trash not net>
+    Paul Mundt                    <lethal at linux-sh dot org>
+    Pavel Kankovsky               <kan at dcit dot cz>
+    Pawel Pokrywka                <publicpp at gmail dot com>
+    Peter Fales                   <peter at fales-lorenz dot net>
+    Peter Jeremy                  <peter dot jeremy at alcatel dot com dot au>
+    Peter Volkov                  <pva at gentoo dot org>
+    Phil Wood                     <cpw at lanl dot gov>
+    Rafal Maszkowski              <rzm at icm dot edu dot pl>
+                                  <rcb-isis at users dot sourceforge dot net>
+    Richard Stearn                <richard at rns-stearn dot demon dot co dot uk>
+    Rick Jones                    <raj at cup dot hp dot com>
+    Robert Edmonds                <stu-42 at sourceforge dot net>
+    Roberto Mariani               <jelot-tcpdump at jelot dot it>
+    Romain Francoise              <rfrancoise at debian dot org>
+    Sagun Shakya                  <sagun dot shakya at sun dot com>
+    Scott Barron                  <sb125499 at ohiou dot edu>
+    Scott Gifford                 <sgifford at tir dot com>
+    Scott Mcmillan                <scott dot a dot mcmillan at intel dot com>
+    Sebastian Krahmer             <krahmer at cs dot uni-potsdam dot de>
+    Sebastien Roy                 <Sebastien dot Roy at Sun dot COM>
+    Sepherosa Ziehau              <sepherosa at gmail dot com>
+    Shaun Clowes                  <delius at progsoc dot uts dot edu dot au>
+    Solomon Peachy                <pizza at shaftnet dot org>
+    Stefan Hudson                 <hudson at mbay dot net>
+    Stephen Donnelly              <stephen at endace dot com>
+    Takashi Yamamoto              <yamt at mwd dot biglobe dot ne dot jp>
+    Tanaka Shin-ya                <zstanaka at archer dot livedoor dot com>
+    Tobias Poschwatta             <posch at sourceforge dot net>
+    Tony Li                       <tli at procket dot com>
+    Torsten Landschoff            <torsten at debian dot org>
+    Uns Lider                     <unslider at miranda dot org>
+    Uwe Girlich                   <Uwe dot Girlich at philosys dot de>
+    Wesley Shields                <wxs at FreeBSD dot org>
+    Xianjie Zhang                 <xzhang at cup dot hp dot com>
+    Xin Li                        <delphij at FreeBSD dot org>
+    Yen Yen Lim
+    Yoann Vandoorselaere          <yoann at prelude-ids dot org>
+    Yvan Vanhullebus              <vanhu at sourceforge dot net>
 
 The original LBL crew:
-	Steve McCanne
-	Craig Leres
-	Van Jacobson
+    Steve McCanne
+    Craig Leres
+    Van Jacobson
+
+Past maintainers:
+    Jun-ichiro itojun Hagino         <itojun at iijlab dot net>		Also see: http://www.wide.ad.jp/itojun-award/
diff --git a/ChmodBPF/StartupParameters.plist b/ChmodBPF/StartupParameters.plist
index 545e2a6..cba2166 100644
--- a/ChmodBPF/StartupParameters.plist
+++ b/ChmodBPF/StartupParameters.plist
@@ -1,4 +1,4 @@
 {
   Description     = "Change BPF permissions";
-  Provides        = ("Non-root permission to capture or send raw packets");
+  Provides        = ("ChmodBPF");
 }
diff --git a/FILES b/FILES
deleted file mode 100644
index 68c204a..0000000
--- a/FILES
+++ /dev/null
@@ -1,124 +0,0 @@
-CHANGES
-ChmodBPF/ChmodBPF
-ChmodBPF/StartupParameters.plist
-CREDITS
-FILES
-INSTALL.txt
-LICENSE
-Makefile.in
-README
-README.aix
-README.dag
-README.hpux
-README.linux
-README.macosx
-README.septel
-README.tru64
-README.Win32
-SUNOS4/nit_if.o.sparc
-SUNOS4/nit_if.o.sun3
-SUNOS4/nit_if.o.sun4c.4.0.3c
-TODO
-VERSION
-acconfig.h
-aclocal.m4
-arcnet.h
-atmuni31.h
-bpf/net/bpf_filter.c
-bpf_dump.c
-bpf_image.c
-config.guess
-config.h.in
-config.sub
-configure
-configure.in
-etherent.c
-ethertype.h
-fad-getad.c
-fad-gifc.c
-fad-glifc.c
-fad-null.c
-fad-win32.c
-gencode.c
-gencode.h
-grammar.y
-inet.c
-install-sh
-lbl/os-aix4.h
-lbl/os-hpux11.h
-lbl/os-osf4.h
-lbl/os-osf5.h
-lbl/os-solaris2.h
-lbl/os-sunos4.h
-lbl/os-ultrix4.h
-llc.h
-missing/snprintf.c
-mkdep
-msdos/bin2c.c
-msdos/common.dj
-msdos/makefile
-msdos/makefile.dj
-msdos/makefile.wc
-msdos/ndis2.c
-msdos/ndis2.h
-msdos/ndis_0.asm
-msdos/pkt_rx0.asm
-msdos/pkt_rx1.s
-msdos/pktdrvr.c
-msdos/pktdrvr.h
-msdos/readme.dos
-nametoaddr.c
-nlpid.h
-optimize.c
-packaging/pcap.spec
-packaging/pcap.spec.in
-pcap-bpf.c
-pcap-bpf.h
-pcap-dag.c
-pcap-dag.h
-pcap-dlpi.c
-pcap-dos.c
-pcap-dos.h
-pcap-enet.c
-pcap-int.h
-pcap-linux.c
-pcap-namedb.h
-pcap-nit.c
-pcap-nit.h
-pcap-null.c
-pcap-pf.c
-pcap-pf.h
-pcap-septel.c
-pcap-septel.h
-pcap-stdinc.h
-pcap-snit.c
-pcap-snoop.c
-pcap-win32.c
-pcap.3
-pcap.c
-pcap.h
-ppp.h
-savefile.c
-scanner.l
-sll.h
-sunatmpos.h
-Win32/Include/Gnuc.h
-Win32/Include/addrinfo.h
-Win32/Include/bittypes.h
-Win32/Include/cdecl_ext.h
-Win32/Include/inetprivate.h
-Win32/Include/ip6_misc.h
-Win32/Include/sockstorage.h
-Win32/Include/arpa/nameser.h
-Win32/Include/net/if.h
-Win32/Include/net/netdb.h
-Win32/Include/net/paths.h
-Win32/Src/ffs.c
-Win32/Src/getaddrinfo.c
-Win32/Src/getnetbynm.c
-Win32/Src/getnetent.c
-Win32/Src/getopt.c
-Win32/Src/getservent.c
-Win32/Src/inet_aton.c
-Win32/Src/inet_net.c
-Win32/Src/inet_pton.c
diff --git a/INSTALL.txt b/INSTALL.txt
index 76445a7..58d8e3c 100644
--- a/INSTALL.txt
+++ b/INSTALL.txt
@@ -1,4 +1,4 @@
-@(#) $Header: /tcpdump/master/libpcap/INSTALL.txt,v 1.12.2.2 2007/09/12 19:17:24 guy Exp $ (LBL)
+@(#) $Header: /tcpdump/master/libpcap/INSTALL.txt,v 1.29 2008-06-12 20:21:51 guy Exp $ (LBL)
 
 To build libpcap, run "./configure" (a shell script). The configure
 script will determine your system attributes and generate an
@@ -211,8 +211,7 @@
 configuring your system to be able to support libpcap.
 
 If you use NeXTSTEP, you will not be able to build libpcap from this
-release. We hope to support this operating system in some future
-release of libpcap.
+release.
 
 If you use SINIX, you should be able to build libpcap from this
 release. It is known to compile and run on SINIX-Y/N 5.42 with the C-DS
@@ -229,22 +228,22 @@
 
 If you use SCO, you might have trouble building libpcap from this
 release. We do not have a machine running SCO and have not had reports
-of anyone successfully building on it. Since SCO apparently supports
-DLPI, it's possible the current version works. Meanwhile, SCO provides
-a tcpdump binary as part of their "Network/Security Tools" package:
+of anyone successfully building on it; the current release of libpcap
+does not compile on SCO OpenServer 5.  Although SCO apparently supports
+DLPI to some extent, the DLPI in OpenServer 5 is very non-standard, and
+it appears that completely new code would need to be written to capture
+network traffic.  SCO do not appear to provide tcpdump binaries for
+OpenServer 5 or OpenServer 6 as part of SCO Skunkware:
 
-    http://www.sco.com/technology/internet/goodies/#SECURITY
+	http://www.sco.com/skunkware/
 
-There is also a README that explains how to enable packet capture.
-
-If you use UnixWare, you will not be able to build libpcap from this
-release. We hope to support this operating system in some future
-release of libpcap. Meanwhile, there appears to be an UnixWare port of
-libpcap 0.0 (and tcpdump 3.0) in:
-
-    ftp://ftp1.freebird.org/pub/mirror/freebird/internet/systools/
-
-UnixWare appears to use a hacked version of DLPI.
+If you use UnixWare, you might be able to build libpcap from this
+release, or you might not.  We do not have a machine running UnixWare,
+so we have not tested it; however, SCO provide packages for libpcap
+0.6.2 and tcpdump 3.7.1 in the UnixWare 7/Open UNIX 8 part of SCO
+Skunkware, and the source package for libpcap 0.6.2 is not changed from
+the libpcap 0.6.2 source release, so this release of libpcap might also
+build without changes on UnixWare 7.
 
 If linking tcpdump fails with "Undefined: _alloca" when using bison on
 a Sun4, your version of bison is broken. In any case version 1.16 or
@@ -298,7 +297,6 @@
 ChmodBPF/*	- Mac OS X startup item to set ownership and permissions
 		  on /dev/bpf*
 CREDITS		- people that have helped libpcap along
-FILES		- list of files exported as part of the distribution
 INSTALL.txt	- this file
 LICENSE		- the license under which tcpdump is distributed
 Makefile.in	- compilation rules (input to the configure script)
@@ -309,6 +307,7 @@
 README.linux	- notes on using libpcap on Linux
 README.macosx	- notes on using libpcap on Mac OS X
 README.septel   - notes on using libpcap to capture on Intel/Septel devices
+README.sita	- notes on using libpcap to capture on SITA devices
 README.tru64	- notes on using libpcap on Digital/Tru64 UNIX
 README.Win32	- notes on using libpcap on Win32 systems (with WinPcap)
 SUNOS4		- pre-SunOS 4.1 replacement kernel nit modules
@@ -326,16 +325,22 @@
 config.sub	- autoconf support
 configure	- configure script (run this first)
 configure.in	- configure script source
+dlpisubs.c	- DLPI-related functions for pcap-dlpi.c and pcap-libdlpi.c
+dlpisubs.h	- DLPI-related function declarations
 etherent.c	- /etc/ethers support routines
 ethertype.h	- Ethernet protocol types and names definitions
 fad-getad.c	- pcap_findalldevs() for systems with getifaddrs()
 fad-gifc.c	- pcap_findalldevs() for systems with only SIOCGIFLIST
 fad-glifc.c	- pcap_findalldevs() for systems with SIOCGLIFCONF
 fad-null.c	- pcap_findalldevs() for systems without capture support
+fad-sita.c	- pcap_findalldevs() for systems with SITA support
 fad-win32.c	- pcap_findalldevs() for WinPcap
+filtertest.c	- test program for BPF compiler
+findalldevstest.c - test program for pcap_findalldevs()
 gencode.c	- BPF code generation routines
 gencode.h	- BPF code generation definitions
 grammar.y	- filter string grammar
+ieee80211.h	- 802.11 definitions
 inet.c		- network routines
 install-sh	- BSD style install script
 lbl/os-*.h	- OS-dependent defines and prototypes
@@ -348,8 +353,16 @@
 net		- symlink to bpf/net
 optimize.c	- BPF optimization routines
 packaging	- packaging information for building libpcap RPMs
+pcap/bluetooth.h - public definition of DLT_BLUETOOTH_HCI_H4_WITH_PHDR header
+pcap/bpf.h	- BPF definitions
+pcap/namedb.h	- public libpcap name database definitions
+pcap/pcap.h	- public libpcap definitions
+pcap/sll.h	- public definition of DLT_LINUX_SLL header
+pcap/usb.h	- public definition of DLT_USB header
 pcap-bpf.c	- BSD Packet Filter support
-pcap-bpf.h	- BPF definitions
+pcap-bpf.h	- header for backwards compatibility
+pcap-bt-linux.c	- Bluetooth capture support for Linux
+pcap-bt-linux.h	- Bluetooth capture support for Linux
 pcap-dag.c	- Endace DAG device capture support
 pcap-dag.h	- Endace DAG device capture support
 pcap-dlpi.c	- Data Link Provider Interface support
@@ -357,26 +370,34 @@
 pcap-dos.h	- headers for MS-DOS capture support
 pcap-enet.c	- enet support
 pcap-int.h	- internal libpcap definitions
+pcap-libdlpi.c	- Data Link Provider Interface support for systems with libdlpi
 pcap-linux.c	- Linux packet socket support
-pcap-namedb.h	- public libpcap name database definitions
+pcap-namedb.h	- header for backwards compatibility
 pcap-nit.c	- SunOS Network Interface Tap support
 pcap-nit.h	- SunOS Network Interface Tap definitions
 pcap-null.c	- dummy monitor support (allows offline use of libpcap)
 pcap-pf.c	- Ultrix and Digital/Tru64 UNIX Packet Filter support
 pcap-pf.h	- Ultrix and Digital/Tru64 UNIX Packet Filter definitions
-pcap-septel.c   - INTEL/Septel device capture support
-pcap-septel.h   - INTEL/Septel device capture support
+pcap-septel.c   - Intel/Septel device capture support
+pcap-septel.h   - Intel/Septel device capture support
+pcap-sita.c	- SITA device capture support
+pcap-sita.h	- SITA device capture support
+pcap-sita.html	- SITA device capture documentation
 pcap-stdinc.h	- includes and #defines for compiling on Win32 systems
 pcap-snit.c	- SunOS 4.x STREAMS-based Network Interface Tap support
 pcap-snoop.c	- IRIX Snoop network monitoring support
+pcap-usb-linux.c - USB capture support for Linux
+pcap-usb-linux.h - USB capture support for Linux
 pcap-win32.c	- WinPcap capture support
-pcap.3		- manual entry
+pcap.3pcap	- manual entry for the library
 pcap.c		- pcap utility routines
-pcap.h		- public libpcap definitions
+pcap.h		- header for backwards compatibility
+pcap_*.3pcap	- manual entries for library functions
+pcap-filter.4	- manual entry for filter syntax
+pcap-linktype.4	- manual entry for link-layer header types
 ppp.h		- Point to Point Protocol definitions
-rawss7.h	- information on DLT_ types for SS7
+runlex.sh	- wrapper for Lex/Flex
 savefile.c	- offline support
 scanner.l	- filter string scanner
-sll.h		- definitions for Linux cooked mode fake link-layer header
 sunatmpos.h	- definitions for SunATM capturing
 Win32		- headers and routines for building on Win32 systems
diff --git a/MODULE_LICENSE_BSD b/MODULE_LICENSE_BSD
deleted file mode 100644
index e69de29..0000000
--- a/MODULE_LICENSE_BSD
+++ /dev/null
diff --git a/Makefile-devel-adds b/Makefile-devel-adds
new file mode 100644
index 0000000..7bf6420
--- /dev/null
+++ b/Makefile-devel-adds
@@ -0,0 +1,22 @@
+#
+# Auto-regenerate configure script or Makefile when things change.
+# From autoconf.info .  Works best with GNU Make.
+#
+${srcdir}/configure: configure.in aclocal.m4
+	cd ${srcdir} && autoconf
+
+# autoheader might not change config.h.in, so touch a stamp file.
+${srcdir}/config.h.in: ${srcdir}/stamp-h.in
+${srcdir}/stamp-h.in: configure.in aclocal.m4
+	cd ${srcdir} && autoheader
+	echo timestamp > ${srcdir}/stamp-h.in
+
+config.h: stamp-h
+stamp-h: ${srcdir}/config.h.in config.status
+	./config.status
+
+Makefile: Makefile.in config.status
+	./config.status
+
+config.status: ${srcdir}/configure
+	./config.status --recheck
diff --git a/Makefile.in b/Makefile.in
index 98396ec..f6f26e5 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -17,7 +17,7 @@
 #  WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
 #  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 #
-# @(#) $Header: /tcpdump/master/libpcap/Makefile.in,v 1.99.2.2 2007/07/24 02:35:15 mcr Exp $ (LBL)
+# @(#) $Header: /tcpdump/master/libpcap/Makefile.in,v 1.142 2008-11-22 17:30:24 guy Exp $ (LBL)
 
 #
 # Various configurable paths (remember to edit Makefile.in, not Makefile)
@@ -26,11 +26,14 @@
 # Top level hierarchy
 prefix = @prefix@
 exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+# Pathname of directory to install the configure program
+bindir = @bindir@
 # Pathname of directory to install the include files
 includedir = @includedir@
 # Pathname of directory to install the library
 libdir =  @libdir@
-# Pathname of directory to install the man page
+# Pathname of directory to install the man pages
 mandir = @mandir@
 
 # VPATH
@@ -41,17 +44,26 @@
 # You shouldn't need to edit anything below.
 #
 
+LD = /usr/bin/ld
 CC = @CC@
+AR = @AR@
+LN_S = @LN_S@
+MKDEP = @MKDEP@
 CCOPT = @V_CCOPT@
 INCLS = -I. @V_INCLS@
 DEFS = @DEFS@ @V_DEFS@
-LIBS = @V_LIBS@
-DAGLIBS = @DAGLIBS@
+ADDLOBJS = @ADDLOBJS@
+ADDLARCHIVEOBJS = @ADDLARCHIVEOBJS@
+LIBS = @LIBS@
+CFLAGS = @CFLAGS@
+LDFLAGS = @LDFLAGS@
 DYEXT = @DYEXT@
+V_RPATH_OPT = @V_RPATH_OPT@
+DEPENDENCY_CFLAG = @DEPENDENCY_CFLAG@
 PROG=libpcap
 
 # Standard CFLAGS
-CFLAGS = $(CCOPT) $(INCLS) $(DEFS)
+FULL_CFLAGS = $(CCOPT) $(INCLS) $(DEFS) $(CFLAGS)
 
 INSTALL = @INSTALL@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -71,14 +83,15 @@
 # problem if you don't own the file but can write to the directory.
 .c.o:
 	@rm -f $@
-	$(CC) $(CFLAGS) -c $(srcdir)/$*.c
+	$(CC) $(FULL_CFLAGS) -c $(srcdir)/$*.c
 
-PSRC =	pcap-@V_PCAP@.c
+PSRC =	pcap-@V_PCAP@.c @USB_SRC@ @BT_SRC@ @CAN_SRC@ @NETFILTER_SRC@ @CANUSB_SRC@ @DBUS_SRC@
 FSRC =  fad-@V_FINDALLDEVS@.c
 SSRC =  @SSRC@
-CSRC =	pcap.c inet.c gencode.c optimize.c nametoaddr.c \
-	etherent.c savefile.c bpf_filter.c bpf_image.c bpf_dump.c
-GENSRC = scanner.c grammar.c version.c
+CSRC =	pcap.c inet.c gencode.c optimize.c nametoaddr.c etherent.c \
+	savefile.c sf-pcap.c sf-pcap-ng.c pcap-common.c \
+	bpf_image.c bpf_dump.c
+GENSRC = scanner.c grammar.c bpf_filter.c version.c
 LIBOBJS = @LIBOBJS@
 
 SRC =	$(PSRC) $(FSRC) $(CSRC) $(SSRC) $(GENSRC)
@@ -86,50 +99,355 @@
 # We would like to say "OBJ = $(SRC:.c=.o)" but Ultrix's make cannot
 # hack the extra indirection
 OBJ =	$(PSRC:.c=.o) $(FSRC:.c=.o) $(CSRC:.c=.o) $(SSRC:.c=.o) $(GENSRC:.c=.o) $(LIBOBJS)
-HDR =	pcap.h pcap-int.h pcap-namedb.h pcap-nit.h pcap-pf.h \
-	ethertype.h gencode.h gnuc.h
-GENHDR = \
-	tokdefs.h version.h
+PUBHDR = \
+	pcap.h \
+	pcap-bpf.h \
+	pcap-namedb.h \
+	pcap/bpf.h \
+	pcap/bluetooth.h \
+	pcap/ipnet.h \
+	pcap/namedb.h \
+	pcap/nflog.h \
+	pcap/pcap.h \
+	pcap/sll.h \
+	pcap/vlan.h \
+	pcap/usb.h
 
-TAGHDR = \
-	pcap-bpf.h
+HDR = $(PUBHDR) \
+	arcnet.h \
+	atmuni31.h \
+	ethertype.h \
+	gencode.h \
+	ieee80211.h \
+	llc.h \
+	nlpid.h \
+	pcap-common.h \
+	pcap-int.h \
+	pcap-stdinc.h \
+	ppp.h \
+	sf-pcap.h \
+	sf-pcap-ng.h \
+	sunatmpos.h
+
+TESTS = \
+	filtertest \
+	findalldevstest \
+	nonblocktest \
+	opentest \
+	selpolltest \
+	valgrindtest
+
+TESTS_SRC = \
+	tests/filtertest.c \
+	tests/findalldevstest.c \
+	tests/nonblocktest.c \
+	tests/opentest.c \
+	tests/reactivatetest.c \
+	tests/selpolltest.c \
+	tests/valgrindtest.c
+
+GENHDR = \
+	scanner.h tokdefs.h version.h
 
 TAGFILES = \
-	$(SRC) $(HDR) $(TAGHDR)
+	$(SRC) $(HDR)
 
-CLEANFILES = $(OBJ) libpcap.a $(GENSRC) $(GENHDR) lex.yy.c
+CLEANFILES = $(OBJ) libpcap.* $(TESTS) \
+	$(PROG)-`cat $(srcdir)/VERSION`.tar.gz $(GENSRC) $(GENHDR) \
+	lex.yy.c pcap-config
 
-all: libpcap.a
+MAN1 = pcap-config.1
+
+MAN3PCAP_EXPAND = \
+	pcap.3pcap.in \
+	pcap_compile.3pcap.in \
+	pcap_datalink.3pcap.in \
+	pcap_dump_open.3pcap.in \
+	pcap_get_tstamp_precision.3pcap.in \
+	pcap_list_datalinks.3pcap.in \
+	pcap_list_tstamp_types.3pcap.in \
+	pcap_open_dead.3pcap.in \
+	pcap_open_offline.3pcap.in \
+	pcap_set_tstamp_precision.3pcap.in \
+	pcap_set_tstamp_type.3pcap.in
+
+MAN3PCAP_NOEXPAND = \
+	pcap_activate.3pcap \
+	pcap_breakloop.3pcap \
+	pcap_can_set_rfmon.3pcap \
+	pcap_close.3pcap \
+	pcap_create.3pcap \
+	pcap_datalink_name_to_val.3pcap \
+	pcap_datalink_val_to_name.3pcap \
+	pcap_dump.3pcap \
+	pcap_dump_close.3pcap \
+	pcap_dump_file.3pcap \
+	pcap_dump_flush.3pcap \
+	pcap_dump_ftell.3pcap \
+	pcap_file.3pcap \
+	pcap_fileno.3pcap \
+	pcap_findalldevs.3pcap \
+	pcap_freecode.3pcap \
+	pcap_get_selectable_fd.3pcap \
+	pcap_geterr.3pcap \
+	pcap_inject.3pcap \
+	pcap_is_swapped.3pcap \
+	pcap_lib_version.3pcap \
+	pcap_lookupdev.3pcap \
+	pcap_lookupnet.3pcap \
+	pcap_loop.3pcap \
+	pcap_major_version.3pcap \
+	pcap_next_ex.3pcap \
+	pcap_offline_filter.3pcap \
+	pcap_open_live.3pcap \
+	pcap_set_buffer_size.3pcap \
+	pcap_set_datalink.3pcap \
+	pcap_set_immediate_mode.3pcap \
+	pcap_set_promisc.3pcap \
+	pcap_set_rfmon.3pcap \
+	pcap_set_snaplen.3pcap \
+	pcap_set_timeout.3pcap \
+	pcap_setdirection.3pcap \
+	pcap_setfilter.3pcap \
+	pcap_setnonblock.3pcap \
+	pcap_snapshot.3pcap \
+	pcap_stats.3pcap \
+	pcap_statustostr.3pcap \
+	pcap_strerror.3pcap \
+	pcap_tstamp_type_name_to_val.3pcap \
+	pcap_tstamp_type_val_to_name.3pcap
+
+MAN3PCAP = $(MAN3PCAP_NOEXPAND) $(MAN3PCAP_EXPAND:.in=)
+
+MANFILE = \
+	pcap-savefile.manfile.in
+
+MANMISC = \
+	pcap-filter.manmisc.in \
+	pcap-linktype.manmisc.in \
+	pcap-tstamp.manmisc.in
+
+EXTRA_DIST = \
+	$(TESTS_SRC) \
+	CHANGES \
+	ChmodBPF/ChmodBPF \
+	ChmodBPF/StartupParameters.plist \
+	CREDITS \
+	INSTALL.txt \
+	LICENSE \
+	Makefile.in \
+	Makefile-devel-adds \
+	README \
+	README.aix \
+	README.dag \
+	README.hpux \
+	README.linux \
+	README.macosx \
+	README.septel \
+	README.sita \
+	README.tru64 \
+	README.Win32 \
+	SUNOS4/nit_if.o.sparc \
+	SUNOS4/nit_if.o.sun3 \
+	SUNOS4/nit_if.o.sun4c.4.0.3c \
+	TODO \
+	VERSION \
+	aclocal.m4 \
+	bpf/net/bpf_filter.c \
+	chmod_bpf \
+	config.guess \
+	config.h.in \
+	config.sub \
+	configure \
+	configure.in \
+	dlpisubs.c \
+	dlpisubs.h \
+	fad-getad.c \
+	fad-gifc.c \
+	fad-glifc.c \
+	fad-null.c \
+	fad-sita.c \
+	fad-win32.c \
+	grammar.y \
+	install-sh \
+	lbl/os-aix4.h \
+	lbl/os-hpux11.h \
+	lbl/os-osf4.h \
+	lbl/os-osf5.h \
+	lbl/os-solaris2.h \
+	lbl/os-sunos4.h \
+	lbl/os-ultrix4.h \
+	missing/snprintf.c \
+	mkdep \
+	msdos/bin2c.c \
+	msdos/common.dj \
+	msdos/makefile \
+	msdos/makefile.dj \
+	msdos/makefile.wc \
+	msdos/ndis2.c \
+	msdos/ndis2.h \
+	msdos/ndis_0.asm \
+	msdos/pkt_rx0.asm \
+	msdos/pkt_rx1.s \
+	msdos/pktdrvr.c \
+	msdos/pktdrvr.h \
+	msdos/readme.dos \
+	org.tcpdump.chmod_bpf.plist \
+	packaging/pcap.spec.in \
+	pcap-bpf.c \
+	pcap-bt-linux.c \
+	pcap-bt-linux.h \
+	pcap-can-linux.c \
+	pcap-can-linux.h \
+	pcap-canusb-linux.c \
+	pcap-canusb-linux.h \
+	pcap-config.in \
+	pcap-dag.c \
+	pcap-dag.h \
+	pcap-dbus.c \
+	pcap-dbus.h \
+	pcap-dlpi.c \
+	pcap-dos.c \
+	pcap-dos.h \
+	pcap-enet.c \
+	pcap-int.h \
+	pcap-libdlpi.c \
+	pcap-linux.c \
+	pcap-namedb.h \
+	pcap-netfilter-linux.c \
+	pcap-netfilter-linux.h \
+	pcap-nit.c \
+	pcap-null.c \
+	pcap-pf.c \
+	pcap-septel.c \
+	pcap-septel.h \
+	pcap-sita.h \
+	pcap-sita.c \
+	pcap-sita.html \
+	pcap-snf.c \
+	pcap-snf.h \
+	pcap-snit.c \
+	pcap-snoop.c \
+	pcap-usb-linux.c \
+	pcap-usb-linux.h \
+	pcap-win32.c \
+	runlex.sh \
+	scanner.l \
+	Win32/Include/Gnuc.h \
+	Win32/Include/addrinfo.h \
+	Win32/Include/bittypes.h \
+	Win32/Include/cdecl_ext.h \
+	Win32/Include/inetprivate.h \
+	Win32/Include/ip6_misc.h \
+	Win32/Include/sockstorage.h \
+	Win32/Include/arpa/nameser.h \
+	Win32/Include/net/if.h \
+	Win32/Include/net/netdb.h \
+	Win32/Include/net/paths.h \
+	Win32/Prj/libpcap.dsp \
+	Win32/Prj/libpcap.dsw \
+	Win32/Src/ffs.c \
+	Win32/Src/gai_strerror.c \
+	Win32/Src/getaddrinfo.c \
+	Win32/Src/getnetbynm.c \
+	Win32/Src/getnetent.c \
+	Win32/Src/getopt.c \
+	Win32/Src/getservent.c \
+	Win32/Src/inet_aton.c \
+	Win32/Src/inet_net.c \
+	Win32/Src/inet_pton.c
+
+all: libpcap.a shared pcap-config
 
 libpcap.a: $(OBJ)
 	@rm -f $@
-	ar rc $@ $(OBJ) $(LIBS)
+	$(AR) rc $@ $(OBJ) $(ADDLARCHIVEOBJS)
 	$(RANLIB) $@
 
 shared: libpcap.$(DYEXT)
 
-#
-# XXX - this works with GNU ld, but won't necessarily work with native
-# ld on, for example, various SVR4-flavored platforms, or Digital UNIX.
-#
 libpcap.so: $(OBJ)
 	@rm -f $@
-	$(CC) -shared -o $@.`cat VERSION` $(OBJ) $(DAGLIBS)
+	VER=`cat $(srcdir)/VERSION`; \
+	MAJOR_VER=`sed 's/\([0-9][0-9]*\)\..*/\1/' $(srcdir)/VERSION`; \
+	@V_SHLIB_CMD@ @V_SHLIB_OPT@ @V_SONAME_OPT@$@.$$MAJOR_VER $(LDFLAGS) \
+	    -o $@.$$VER $(OBJ) $(ADDLOBJS) $(LIBS)
 
-# the following rule succeeds, but the result is untested.
+#
+# The following rule succeeds, but the result is untested.
+#
+# In Mac OS X, the libpcap dylib has the name "libpcap.A.dylib", with
+# its full path as the install_name, and with the compatibility and
+# current version both set to 1.  The compatibility version is set to
+# 1 so that programs built with a newer version of the library will run
+# against older versions; multi-platform software probably will fail if
+# it uses APIs added in the newer version, but Mac OS X-specific software
+# will use weak linking and check at run time whether those APIs are
+# available.
+#
+# We also use "A" as the major version, and 1 as the compatibility version,
+# but set the current version to the value in VERSION, with any non-numeric
+# stuff stripped off (the compatibility and current version must be of the
+# form X[.Y[.Z]], with Y and Z possibly absent, and with all components
+# numeric).
+#
 libpcap.dylib: $(OBJ)
 	rm -f libpcap*.dylib
-	$(CC) -dynamiclib -undefined error -o libpcap.`cat VERSION`.dylib $(OBJ) \
-		-install_name $(libdir)/libpcap.0.dylib -compatibility_version `cat VERSION` \
-		-current_version `cat VERSION`
+	VER=`cat $(srcdir)/VERSION`; \
+	MAJOR_VER=A; \
+	COMPAT_VER=1; \
+	CURRENT_VER=`sed 's/[^0-9.].*$$//' $(srcdir)/VERSION`; \
+	$(CC) -dynamiclib -undefined error $(LDFLAGS) \
+	    -o libpcap.$$VER.dylib $(OBJ) $(ADDLOBJS) $(LIBS) \
+	    -install_name $(libdir)/libpcap.$$MAJOR_VER.dylib \
+	    -compatibility_version $$COMPAT_VER \
+	    -current_version $$CURRENT_VER
 
+#
+# The HP-UX linker manual says that the convention for a versioned library
+# is libXXX.{number}, not libXXX.sl.{number}.  That appears to be the case
+# on at least one HP-UX 11.00 system; libXXX.sl is a symlink to
+# libXXX.{number}.
+#
+# The manual also says "library-level versioning" (think "sonames") was
+# added in HP-UX 10.0.
+#
+# XXX - this assumes we're using the HP linker, rather than the GNU
+# linker, even with GCC.
+#
+libpcap.sl: $(OBJ)
+	@MAJOR_VER=`sed 's/\([0-9][0-9]*\)\..*/\1/' $(srcdir)/VERSION`; \
+	rm -f libpcap.$$MAJOR_VER
+	MAJOR_VER=`sed 's/\([0-9][0-9]*\)\..*/\1/' $(srcdir)/VERSION`; \
+	ld -b $(LDFLAGS) -o libpcap.$$MAJOR_VER +h libpcap.$$MAJOR_VER \
+	    $(OBJ) $(ADDLOBJS) $(LIBS)
+
+#
+# AIX is different from everybody else.  A shared library is an archive
+# library with one or more shared-object components.  We still build a
+# normal static archive library on AIX, for the benefit of the traditional
+# scheme of building libpcap and tcpdump in subdirectories of the
+# same directory, with tcpdump statically linked with the libpcap
+# in question, but we also build a shared library as "libpcap.shareda"
+# and install *it*, rather than the static library, as "libpcap.a".
+#
+libpcap.shareda: $(OBJ)
+	@rm -f $@ shr.o
+	$(CC) @V_SHLIB_OPT@ -o shr.o $(OBJ) $(ADDLOBJS) $(LDFLAGS) $(LIBS)
+	$(AR) rc $@ shr.o
+
+#
+# For platforms that don't support shared libraries (or on which we
+# don't support shared libraries).
+#
+libpcap.none:
 
 scanner.c: $(srcdir)/scanner.l
 	@rm -f $@
-	$(LEX) -t $< > $$$$.$@; mv $$$$.$@ $@
+	$(srcdir)/runlex.sh $(LEX) -o$@ $<
 
 scanner.o: scanner.c tokdefs.h
-	$(CC) $(CFLAGS) -c scanner.c
+	$(CC) $(FULL_CFLAGS) -c scanner.c
 
 pcap.o: version.h
 
@@ -142,17 +460,23 @@
 
 grammar.o: grammar.c
 	@rm -f $@
-	$(CC) $(CFLAGS) -Dyylval=pcap_lval -c grammar.c
+	$(CC) $(FULL_CFLAGS) -Dyylval=pcap_lval -c grammar.c
 
 version.o: version.c
-	$(CC) $(CFLAGS) -c version.c
+	$(CC) $(FULL_CFLAGS) -c version.c
 
 snprintf.o: $(srcdir)/missing/snprintf.c
-	$(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/snprintf.c
+	$(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/snprintf.c
 
 version.c: $(srcdir)/VERSION
 	@rm -f $@
-	sed -e 's/.*/char pcap_version[] = "&";/' $(srcdir)/VERSION > $@
+	if grep GIT ${srcdir}/VERSION >/dev/null; then \
+		read ver <${srcdir}/VERSION; \
+		echo $$ver | tr -d '\012'; \
+		date +_%Y_%m_%d; \
+	else \
+		cat ${srcdir}/VERSION; \
+	fi | sed -e 's/.*/char pcap_version[] = "&";/' > $@
 
 #
 # NOTE: this really is supposed to be static; importing a string
@@ -163,52 +487,242 @@
 #
 version.h: $(srcdir)/VERSION
 	@rm -f $@
-	sed -e 's/.*/static const char pcap_version_string[] = "libpcap version &";/' $(srcdir)/VERSION > $@
+	if grep GIT ${srcdir}/VERSION >/dev/null; then \
+		read ver <${srcdir}/VERSION; \
+		echo $$ver | tr -d '\012'; \
+		date +_%Y_%m_%d; \
+	else \
+		cat ${srcdir}/VERSION; \
+	fi | sed -e 's/.*/static const char pcap_version_string[] = "libpcap version &";/' > $@
 
 bpf_filter.c: $(srcdir)/bpf/net/bpf_filter.c
 	rm -f bpf_filter.c
 	ln -s $(srcdir)/bpf/net/bpf_filter.c bpf_filter.c
 
 bpf_filter.o: bpf_filter.c
-	$(CC) $(CFLAGS) -c bpf_filter.c
+	$(CC) $(FULL_CFLAGS) -c bpf_filter.c
 
-install: libpcap.a 
+#
+# Generate the pcap-config script.
+#
+# Some Makes, e.g. AIX Make and Solaris Make, can't handle "--file=$@.tmp:$<";
+# for example, the Solaris 9 make man page says
+#
+#	Because make assigns $< and $* as it would for implicit rules
+#	(according to the suffixes list and the directory contents),
+#	they may be unreliable when used within explicit target entries.
+#
+# and this is an explicit target entry.
+#
+# Therefore, instead of using $<, we explicitly put in $(srcdir)/pcap-config.in.
+#
+pcap-config: $(srcdir)/pcap-config.in ./config.status
+	@rm -f $@ $@.tmp
+	./config.status --file=$@.tmp:$(srcdir)/pcap-config.in
+	mv $@.tmp $@
+	chmod a+x $@
+
+#
+# Test programs - not built by default, and not installed.
+#
+tests: $(TESTS)
+
+filtertest: tests/filtertest.c libpcap.a
+	$(CC) $(FULL_CFLAGS) -I. -L. -o filtertest $(srcdir)/tests/filtertest.c libpcap.a $(LIBS)
+
+findalldevstest: tests/findalldevstest.c libpcap.a
+	$(CC) $(FULL_CFLAGS) -I. -L. -o findalldevstest $(srcdir)/tests/findalldevstest.c libpcap.a $(LIBS)
+
+nonblocktest: tests/nonblocktest.c libpcap.a
+	$(CC) $(FULL_CFLAGS) -I. -L. -o nonblocktest $(srcdir)/tests/nonblocktest.c libpcap.a $(LIBS)
+
+opentest: tests/opentest.c libpcap.a
+	$(CC) $(FULL_CFLAGS) -I. -L. -o opentest $(srcdir)/tests/opentest.c libpcap.a $(LIBS)
+
+selpolltest: tests/selpolltest.c libpcap.a
+	$(CC) $(FULL_CFLAGS) -I. -L. -o selpolltest $(srcdir)/tests/selpolltest.c libpcap.a $(LIBS)
+
+valgrindtest: tests/valgrindtest.c libpcap.a
+	$(CC) $(FULL_CFLAGS) -I. -L. -o valgrindtest $(srcdir)/tests/valgrindtest.c libpcap.a $(LIBS)
+
+install: install-shared install-archive pcap-config
+	[ -d $(DESTDIR)$(libdir) ] || \
+	    (mkdir -p $(DESTDIR)$(libdir); chmod 755 $(DESTDIR)$(libdir))
+	[ -d $(DESTDIR)$(includedir) ] || \
+	    (mkdir -p $(DESTDIR)$(includedir); chmod 755 $(DESTDIR)$(includedir))
+	[ -d $(DESTDIR)$(includedir)/pcap ] || \
+	    (mkdir -p $(DESTDIR)$(includedir)/pcap; chmod 755 $(DESTDIR)$(includedir)/pcap)
+	[ -d $(DESTDIR)$(mandir)/man1 ] || \
+	    (mkdir -p $(DESTDIR)$(mandir)/man1; chmod 755 $(DESTDIR)$(mandir)/man1)
+	[ -d $(DESTDIR)$(mandir)/man3 ] || \
+	    (mkdir -p $(DESTDIR)$(mandir)/man3; chmod 755 $(DESTDIR)$(mandir)/man3)
+	[ -d $(DESTDIR)$(mandir)/man@MAN_FILE_FORMATS@ ] || \
+	    (mkdir -p $(DESTDIR)$(mandir)/man@MAN_FILE_FORMATS@; chmod 755 $(DESTDIR)$(mandir)/man@MAN_FILE_FORMATS@)
+	[ -d $(DESTDIR)$(mandir)/man@MAN_MISC_INFO@ ] || \
+	    (mkdir -p $(DESTDIR)$(mandir)/man@MAN_MISC_INFO@; chmod 755 $(DESTDIR)$(mandir)/man@MAN_MISC_INFO@)
+	for i in $(PUBHDR); do \
+		$(INSTALL_DATA) $(srcdir)/$$i \
+		    $(DESTDIR)$(includedir)/$$i; done
+	[ -d $(DESTDIR)$(bindir) ] || \
+	    (mkdir -p $(DESTDIR)$(bindir); chmod 755 $(DESTDIR)$(bindir))
+	$(INSTALL_PROGRAM) pcap-config $(DESTDIR)$(bindir)/pcap-config
+	for i in $(MAN1); do \
+		$(INSTALL_DATA) $(srcdir)/$$i \
+		    $(DESTDIR)$(mandir)/man1/$$i; done
+	for i in $(MAN3PCAP_NOEXPAND); do \
+		$(INSTALL_DATA) $(srcdir)/$$i \
+		    $(DESTDIR)$(mandir)/man3/$$i; done
+	for i in $(MAN3PCAP_EXPAND:.in=); do \
+		$(INSTALL_DATA) $$i \
+		    $(DESTDIR)$(mandir)/man3/$$i; done
+	(cd $(DESTDIR)$(mandir)/man3 && \
+	rm -f pcap_datalink_val_to_description.3pcap && \
+	$(LN_S) pcap_datalink_val_to_name.3pcap \
+		 pcap_datalink_val_to_description.3pcap && \
+	rm -f pcap_dump_fopen.3pcap && \
+	$(LN_S) pcap_dump_open.3pcap pcap_dump_fopen.3pcap && \
+	rm -f pcap_freealldevs.3pcap && \
+	$(LN_S) pcap_findalldevs.3pcap pcap_freealldevs.3pcap && \
+	rm -f pcap_perror.3pcap && \
+	$(LN_S) pcap_geterr.3pcap pcap_perror.3pcap && \
+	rm -f pcap_sendpacket.3pcap && \
+	$(LN_S) pcap_inject.3pcap pcap_sendpacket.3pcap && \
+	rm -f pcap_free_datalinks.3pcap && \
+	$(LN_S) pcap_list_datalinks.3pcap pcap_free_datalinks.3pcap && \
+	rm -f pcap_free_tstamp_types.3pcap && \
+	$(LN_S) pcap_list_tstamp_types.3pcap pcap_free_tstamp_types.3pcap && \
+	rm -f pcap_dispatch.3pcap && \
+	$(LN_S) pcap_loop.3pcap pcap_dispatch.3pcap && \
+	rm -f pcap_minor_version.3pcap && \
+	$(LN_S) pcap_major_version.3pcap pcap_minor_version.3pcap && \
+	rm -f pcap_next.3pcap && \
+	$(LN_S) pcap_next_ex.3pcap pcap_next.3pcap && \
+	rm -f pcap_open_dead_with_tstamp_precision.3pcap && \
+	$(LN_S) pcap_open_dead.3pcap \
+		 pcap_open_dead_with_tstamp_precision.3pcap && \
+	rm -f pcap_open_offline_with_tstamp_precision.3pcap && \
+	$(LN_S) pcap_open_offline.3pcap pcap_open_offline_with_tstamp_precision.3pcap && \
+	rm -f pcap_fopen_offline.3pcap && \
+	$(LN_S) pcap_open_offline.3pcap pcap_fopen_offline.3pcap && \
+	rm -f pcap_fopen_offline_with_tstamp_precision.3pcap && \
+	$(LN_S) pcap_open_offline.3pcap pcap_fopen_offline_with_tstamp_precision.3pcap && \
+	rm -f pcap_getnonblock.3pcap && \
+	$(LN_S) pcap_setnonblock.3pcap pcap_getnonblock.3pcap)
+	for i in $(MANFILE); do \
+		$(INSTALL_DATA) `echo $$i | sed 's/.manfile.in/.manfile/'` \
+		    $(DESTDIR)$(mandir)/man@MAN_FILE_FORMATS@/`echo $$i | sed 's/.manfile.in/.@MAN_FILE_FORMATS@/'`; done
+	for i in $(MANMISC); do \
+		$(INSTALL_DATA) `echo $$i | sed 's/.manmisc.in/.manmisc/'` \
+		    $(DESTDIR)$(mandir)/man@MAN_MISC_INFO@/`echo $$i | sed 's/.manmisc.in/.@MAN_MISC_INFO@/'`; done
+
+install-shared: install-shared-$(DYEXT)
+install-shared-so: libpcap.so
+	[ -d $(DESTDIR)$(libdir) ] || \
+	    (mkdir -p $(DESTDIR)$(libdir); chmod 755 $(DESTDIR)$(libdir))
+	VER=`cat $(srcdir)/VERSION`; \
+	MAJOR_VER=`sed 's/\([0-9][0-9]*\)\..*/\1/' $(srcdir)/VERSION`; \
+	$(INSTALL_PROGRAM) libpcap.so.$$VER $(DESTDIR)$(libdir)/libpcap.so.$$VER; \
+	ln -sf libpcap.so.$$VER $(DESTDIR)$(libdir)/libpcap.so.$$MAJOR_VER; \
+	ln -sf libpcap.so.$$MAJOR_VER $(DESTDIR)$(libdir)/libpcap.so
+install-shared-dylib: libpcap.dylib
+	[ -d $(DESTDIR)$(libdir) ] || \
+	    (mkdir -p $(DESTDIR)$(libdir); chmod 755 $(DESTDIR)$(libdir))
+	VER=`cat $(srcdir)/VERSION`; \
+	MAJOR_VER=A; \
+	$(INSTALL_PROGRAM) libpcap.$$VER.dylib $(DESTDIR)$(libdir)/libpcap.$$VER.dylib; \
+	ln -sf libpcap.$$VER.dylib $(DESTDIR)$(libdir)/libpcap.$$MAJOR_VER.dylib; \
+	ln -sf libpcap.$$MAJOR_VER.dylib $(DESTDIR)$(libdir)/libpcap.dylib
+install-shared-sl: libpcap.sl
+	[ -d $(DESTDIR)$(libdir) ] || \
+	    (mkdir -p $(DESTDIR)$(libdir); chmod 755 $(DESTDIR)$(libdir))
+	MAJOR_VER=`sed 's/\([0-9][0-9]*\)\..*/\1/' $(srcdir)/VERSION`; \
+	$(INSTALL_PROGRAM) libpcap.$$MAJOR_VER $(DESTDIR)$(libdir)
+	ln -sf libpcap.$$MAJOR_VER $(DESTDIR)$(libdir)/libpcap.sl
+install-shared-shareda: libpcap.shareda
+	#
+	# AIX shared libraries are weird.  They're archive libraries
+	# with one or more shared object components.
+	#
+	[ -d $(DESTDIR)$(libdir) ] || \
+	    (mkdir -p $(DESTDIR)$(libdir); chmod 755 $(DESTDIR)$(libdir))
+	$(INSTALL_PROGRAM) libpcap.shareda $(DESTDIR)$(libdir)/libpcap.a
+install-shared-none:
+
+install-archive: install-archive-$(DYEXT)
+install-archive-so install-archive-dylib install-archive-sl install-archive-none: libpcap.a
+	#
+	# Most platforms have separate suffixes for shared and
+	# archive libraries, so we install both.
+	#
 	[ -d $(DESTDIR)$(libdir) ] || \
 	    (mkdir -p $(DESTDIR)$(libdir); chmod 755 $(DESTDIR)$(libdir))
 	$(INSTALL_DATA) libpcap.a $(DESTDIR)$(libdir)/libpcap.a
 	$(RANLIB) $(DESTDIR)$(libdir)/libpcap.a
-	[ -d $(DESTDIR)$(includedir) ] || \
-	    (mkdir -p $(DESTDIR)$(includedir); chmod 755 $(DESTDIR)$(includedir))
-	$(INSTALL_DATA) $(srcdir)/pcap.h $(DESTDIR)$(includedir)/pcap.h
-	$(INSTALL_DATA) $(srcdir)/pcap-bpf.h \
-	    $(DESTDIR)$(includedir)/pcap-bpf.h
-	$(INSTALL_DATA) $(srcdir)/pcap-namedb.h \
-	    $(DESTDIR)$(includedir)/pcap-namedb.h
-	[ -d $(DESTDIR)$(mandir)/man3 ] || \
-		(mkdir -p $(DESTDIR)$(mandir)/man3; chmod 755 $(DESTDIR)$(mandir)/man3)
-	$(INSTALL_DATA) $(srcdir)/pcap.3 \
-	    $(DESTDIR)$(mandir)/man3/pcap.3
+install-archive-shareda:
+	#
+	# AIX, however, doesn't, so we don't install the archive
+	# library on AIX.
+	#
 
-install-shared: install-shared-$(DYEXT)
-install-shared-so: libpcap.so
-	$(INSTALL_PROGRAM) libpcap.so.`cat VERSION` $(DESTDIR)$(libdir)/libpcap.so.`cat VERSION`
-install-shared-dylib: libpcap.dylib
-	$(INSTALL_PROGRAM) libpcap.`cat VERSION`.dylib $(DESTDIR)$(libdir)/libpcap.`cat VERSION`.dylib
-	VER=`cat VERSION`; cd $(DESTDIR)$(libdir) && ln -sf libpcap.$$VER.dylib libpcap.0.dylib;  ln -sf libpcap.0.dylib libpcap.dylib
-
-uninstall:
+uninstall: uninstall-shared
 	rm -f $(DESTDIR)$(libdir)/libpcap.a
-	rm -f $(DESTDIR)$(includedir)/pcap.h
-	rm -f $(DESTDIR)$(includedir)/pcap-bpf.h
-	rm -f $(DESTDIR)$(includedir)/pcap-namedb.h
-	rm -f $(DESTDIR)$(mandir)/man3/pcap.3
+	for i in $(PUBHDR); do \
+		rm -f $(DESTDIR)$(includedir)/$$i; done
+	-rmdir $(DESTDIR)$(includedir)/pcap
+	rm -f $(DESTDIR)/$(bindir)/pcap-config
+	for i in $(MAN1); do \
+		rm -f $(DESTDIR)$(mandir)/man1/$$i; done
+	for i in $(MAN3PCAP); do \
+		rm -f $(DESTDIR)$(mandir)/man3/$$i; done
+	rm -f $(DESTDIR)$(mandir)/man3/pcap_datalink_val_to_description.3pcap
+	rm -f $(DESTDIR)$(mandir)/man3/pcap_dump_fopen.3pcap
+	rm -f $(DESTDIR)$(mandir)/man3/pcap_freealldevs.3pcap
+	rm -f $(DESTDIR)$(mandir)/man3/pcap_perror.3pcap
+	rm -f $(DESTDIR)$(mandir)/man3/pcap_sendpacket.3pcap
+	rm -f $(DESTDIR)$(mandir)/man3/pcap_free_datalinks.3pcap
+	rm -f $(DESTDIR)$(mandir)/man3/pcap_free_tstamp_types.3pcap
+	rm -f $(DESTDIR)$(mandir)/man3/pcap_dispatch.3pcap
+	rm -f $(DESTDIR)$(mandir)/man3/pcap_minor_version.3pcap
+	rm -f $(DESTDIR)$(mandir)/man3/pcap_next.3pcap
+	rm -f $(DESTDIR)$(mandir)/man3/pcap_open_dead_with_tstamp_precision.3pcap
+	rm -f $(DESTDIR)$(mandir)/man3/pcap_open_offline_with_tstamp_precision.3pcap
+	rm -f $(DESTDIR)$(mandir)/man3/pcap_fopen_offline.3pcap
+	rm -f $(DESTDIR)$(mandir)/man3/pcap_fopen_offline_with_tstamp_precision.3pcap
+	rm -f $(DESTDIR)$(mandir)/man3/pcap_getnonblock.3pcap
+	for i in $(MANFILE); do \
+		rm -f $(DESTDIR)$(mandir)/man@MAN_FILE_FORMATS@/`echo $$i | sed 's/.manfile.in/.@MAN_FILE_FORMATS@/'`; done
+	for i in $(MANMISC); do \
+		rm -f $(DESTDIR)$(mandir)/man@MAN_MISC_INFO@/`echo $$i | sed 's/.manmisc.in/.@MAN_MISC_INFO@/'`; done
+
+uninstall-shared: uninstall-shared-$(DYEXT)
+uninstall-shared-so:
+	VER=`cat $(srcdir)/VERSION`; \
+	MAJOR_VER=`sed 's/\([0-9][0-9]*\)\..*/\1/' $(srcdir)/VERSION`; \
+	rm -f $(DESTDIR)$(libdir)/libpcap.so.$$VER; \
+	rm -f $(DESTDIR)$(libdir)/libpcap.so.$$MAJOR_VER; \
+	rm -f $(DESTDIR)$(libdir)/libpcap.so
+uninstall-shared-dylib:
+	VER=`cat $(srcdir)/VERSION`; \
+	MAJOR_VER=A; \
+	rm -f $(DESTDIR)$(libdir)/libpcap.$$VER.dylib; \
+	rm -f $(DESTDIR)$(libdir)/libpcap.$$MAJOR_VER.dylib; \
+	rm -f $(DESTDIR)$(libdir)/libpcap.dylib
+uninstall-shared-sl:
+	MAJOR_VER=`sed 's/\([0-9][0-9]*\)\..*/\1/' $(srcdir)/VERSION`; \
+	rm -f $(DESTDIR)$(libdir)/libpcap.$$MAJOR_VER; \
+	rm -f $(DESTDIR)$(libdir)/libpcap.sl
+uninstall-shared-shareda:
+	rm -f $(DESTDIR)$(libdir)/libpcap.a
+uninstall-shared-none:
 
 clean:
-	rm -f $(CLEANFILES) libpcap*.dylib libpcap.so*
+	rm -f $(CLEANFILES)
 
 distclean: clean
 	rm -f Makefile config.cache config.log config.status \
-	    config.h gnuc.h os-proto.h bpf_filter.c stamp-h stamp-h.in
+	    config.h gnuc.h net os-proto.h bpf_filter.c pcap-config \
+	    stamp-h stamp-h.in
+	rm -f $(MAN3PCAP_EXPAND:.in=) $(MANFILE:.in=) $(MANMISC:.in=)
 	rm -rf autom4te.cache
 
 tags: $(TAGFILES)
@@ -220,13 +734,12 @@
 
 releasetar:
 	@cwd=`pwd` ; dir=`basename $$cwd` ; name=$(PROG)-`cat VERSION` ; \
-	   list="" ; make distclean; cd ..; mkdir -p n; cd n; ln -s ../$$dir $$name; \
-	   tar -c -z -f $$name.tar.gz $$name/. ;
+	   mkdir $$name; \
+	   tar cf - $(CSRC) $(HDR) $(MAN1) $(MAN3PCAP_EXPAND) \
+	      $(MAN3PCAP_NOEXPAND) $(MANFILE) $(MANMISC) $(EXTRA_DIST) | \
+	      (cd $$name; tar xf -); \
+	   tar -c -z -f $$name.tar.gz $$name; \
+	   rm -rf $$name
 
 depend:	$(GENSRC) $(GENHDR) bpf_filter.c
-	./mkdep -c $(CC) $(DEFS) $(INCLS) $(SRC)
-
-Makefile: Makefile.in config.status
-	./config.status
-	@echo your Makefile was out of date, now run $(MAKE) again
-	exit 1
+	$(MKDEP) -c $(CC) -m $(DEPENDENCY_CFLAG) $(DEFS) $(INCLS) $(SRC)
diff --git a/NOTICE b/NOTICE
deleted file mode 100644
index dea5f7d..0000000
--- a/NOTICE
+++ /dev/null
@@ -1,19 +0,0 @@
-License: BSD
- 
-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 names of the authors may not 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.
diff --git a/README b/README
index 90571a1..2f14aac 100644
--- a/README
+++ b/README
@@ -1,24 +1,24 @@
-@(#) $Header: /tcpdump/master/libpcap/README,v 1.30 2004/10/12 02:02:28 guy Exp $ (LBL)
+@(#) $Header: /tcpdump/master/libpcap/README,v 1.34 2008-12-14 19:44:14 guy Exp $ (LBL)
 
-LIBPCAP 0.9
-Now maintained by "The Tcpdump Group"
-See 		www.tcpdump.org
+LIBPCAP 1.x.y
 
-Please send inquiries/comments/reports to 	tcpdump-workers@tcpdump.org
+www.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
+Please send inquiries/comments/reports to:
+	tcpdump-workers@lists.tcpdump.org
 
-Version 0.9 of LIBPCAP can be retrieved with the CVS tag "libpcap_0_9rel1":
-	cvs -d :pserver:tcpdump@cvs.tcpdump.org:/tcpdump/master checkout -r libpcap_0_9rel1 libpcap
+Anonymous Git is available via:
+	git clone git://bpf.tcpdump.org/libpcap
 
-Please send patches against the master copy to patches@tcpdump.org.
+Please submit patches by forking the branch on GitHub at
+
+	http://github.com/the-tcpdump-group/libpcap/tree/master
+
+and issuing a pull request.
 
 formerly from 	Lawrence Berkeley National Laboratory
 		Network Research Group <libpcap@ee.lbl.gov>
-		ftp://ftp.ee.lbl.gov/libpcap.tar.Z (0.4)
+		ftp://ftp.ee.lbl.gov/old/libpcap-0.4a7.tar.Z
 
 This directory contains source code for libpcap, a system-independent
 interface for user-level packet capture.  libpcap provides a portable
@@ -30,8 +30,6 @@
 to ease in porting and to alleviate the need for several
 system-dependent packet capture modules in each application.
 
-Note well: this interface is new and is likely to change.
-
 For some platforms there are README.{system} files that discuss issues
 with the OS's interface for packet capture on those platforms, such as
 how to enable support for that interface in the OS, if it's not built in
@@ -65,30 +63,46 @@
 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
 information on configuring that option.
 
-Problems, bugs, questions, desirable enhancements, etc. should be sent
-to the address "tcpdump-workers@tcpdump.org".  Bugs, support requests,
-and feature requests may also be submitted on the SourceForge site for
-libpcap at
+Note to Linux distributions and *BSD systems that include libpcap:
 
-	http://sourceforge.net/projects/libpcap/
+There's now a rule to make a shared library, which should work on Linux 
+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.x or libpcap.so.1.x.y or something such as 
+that.
+
+We've been maintaining binary compatibility between libpcap releases for 
+quite a while; there's no reason to tie a binary linked with libpcap to 
+a particular release of libpcap.
+
+Problems, bugs, questions, desirable enhancements, etc. should be sent
+to the address "tcpdump-workers@lists.tcpdump.org".  Bugs, support
+requests, and feature requests may also be submitted on the GitHub issue
+tracker for libpcap at
+
+	https://github.com/the-tcpdump-group/libpcap/issues
 
 Source code contributions, etc. should be sent to the email address
-"patches@tcpdump.org", or submitted as patches on the SourceForge site
-for libpcap.
+above or submitted by forking the branch on GitHub at
 
-Current versions can be found at www.tcpdump.org, or the SourceForge
-site for libpcap.
+	http://github.com/the-tcpdump-group/libpcap/tree/master
+
+and issuing a pull request.
+
+Current versions can be found at www.tcpdump.org.
 
  - The TCPdump team
diff --git a/README.Win32 b/README.Win32
new file mode 100644
index 0000000..503836e
--- /dev/null
+++ b/README.Win32
@@ -0,0 +1,46 @@
+Under Win32, libpcap is integrated in the WinPcap packet capture system. 
+WinPcap provides a framework that allows libpcap to capture the packets 
+under Windows 95, Windows 98, Windows ME, Windows NT 4, Windows 2000 
+and Windows XP.
+WinPcap binaries and source code can be found at http://winpcap.polito.it: 
+they include also a developer's pack with all the necessary to compile 
+libpcap-based applications under Windows.
+
+How to compile libpcap with Visual Studio
+-----------------------------------------
+
+In order to compile libpcap you will need:
+
+- version 6 (or higher) of Microsoft Visual Studio
+- The November 2001 (or later) edition of Microsoft Platform 
+Software Development Kit (SDK), that contains some necessary includes 
+for IPv6 support. You can download it from http://www.microsoft.com/sdk
+- the latest WinPcap sources from http://winpcap.polito.it/install 
+
+The WinPcap source code already contains a recent (usually the latest 
+stable) version of libpcap. If you need to compile a different one, 
+simply download it from www.tcpdump.org and copy the sources in the 
+winpcap\wpcap\libpcap folder of the WinPcap distribution. If you want to
+compile a libpcap source retrieved from the tcpdump.org Git, you will 
+have to create the scanner and the grammar by hand (with lex and yacc) 
+or with the cygnus makefile, since The Visual Studio project is not able
+to build them.
+
+Open the project file winpcap\wpcap\prj\wpcap.dsw with Visual Studio and 
+build wpcap.dll. wpcap.lib, the library file to link with the applications, 
+will be generated in winpcap\wpcap\lib\. wpcap.dll will be generated in 
+winpcap\wpcap\prj\release or winpcap\wpcap\prj\debug depending on the type 
+of binary that is being created.
+
+How to compile libpcap with Cygnus
+----------------------------------
+
+To build wpcap.dll, cd to the directory WPCAP/PRJ of the WinPcap source code 
+distribution and type "make". libwpcap.a, the library file to link with the 
+applications, will be generated in winpcap\wpcap\lib\. wpcap.dll will be 
+generated in winpcap\wpcap\prj.
+
+Remember, you CANNOT use the MSVC-generated .lib files with gcc, use 
+libwpcap.a instead.
+
+"make install" installs wpcap.dll in the Windows system folder.
diff --git a/README.aix b/README.aix
new file mode 100644
index 0000000..74cd9af
--- /dev/null
+++ b/README.aix
@@ -0,0 +1,83 @@
+Using BPF:
+
+(1) AIX 4.x's version of BPF is undocumented and somewhat unstandard; the
+    current BPF support code includes changes that should work around
+    that; it appears to compile and work on at least one AIX 4.3.3
+    machine.
+
+    Note that the BPF driver and the "/dev/bpf" devices might not exist
+    on your machine; AIX's tcpdump loads the driver and creates the
+    devices if they don't already exist.  Our libpcap should do the
+    same, and the configure script should detect that it's on an AIX
+    system and choose BPF even if the devices aren't there.
+
+(2) If libpcap doesn't compile on your machine when configured to use
+    BPF, or if the workarounds fail to make it work correctly, you
+    should send to tcpdump-workers@lists.tcpdump.org a detailed bug
+    report (if the compile fails, send us the compile error messages;
+    if it compiles but fails to work correctly, send us as detailed as
+    possible a description of the symptoms, including indications of the
+    network link-layer type being wrong or time stamps being wrong).
+
+    If you fix the problems yourself, please submit a patch by forking
+    the branch at
+
+	https://github.com/the-tcpdump-group/libpcap/issues
+
+    and issuing a pull request, so we can incorporate the fixes into the
+    next release.
+
+    If you don't fix the problems yourself, you can, as a workaround,
+    make libpcap use DLPI instead of BPF.
+
+    This can be done by specifying the flag:
+
+       --with-pcap=dlpi
+
+    to the "configure" script for libpcap.
+
+If you use DLPI:
+
+(1) It is a good idea to have the latest version of the DLPI driver on
+    your system, since certain versions may be buggy and cause your AIX
+    system to crash.  DLPI is included in the fileset bos.rte.tty.  I
+    found that the DLPI driver that came with AIX 4.3.2 was buggy, and
+    had to upgrade to bos.rte.tty 4.3.2.4:
+
+	    lslpp -l bos.rte.tty
+
+	    bos.rte.tty     4.3.2.4  COMMITTED  Base TTY Support and Commands
+
+    Updates for AIX filesets can be obtained from:
+    ftp://service.software.ibm.com/aix/fixes/
+
+    These updates can be installed with the smit program.
+
+(2) After compiling libpcap, you need to make sure that the DLPI driver
+    is loaded.  Type:
+
+	    strload -q -d dlpi
+
+    If the result is:
+
+	    dlpi: yes
+
+    then the DLPI driver is loaded correctly.
+
+    If it is:
+
+	    dlpi: no
+
+    Then you need to type:
+
+	    strload -f /etc/dlpi.conf
+ 
+    Check again with strload -q -d dlpi that the dlpi driver is loaded.  
+
+    Alternatively, you can uncomment the lines for DLPI in
+    /etc/pse.conf and reboot the machine; this way DLPI will always
+    be loaded when you boot your system.
+
+(3) There appears to be a problem in the DLPI code in some versions of
+    AIX, causing a warning about DL_PROMISC_MULTI failing; this might
+    be responsible for DLPI not being able to capture outgoing packets.
diff --git a/README.dag b/README.dag
new file mode 100644
index 0000000..accae7c
--- /dev/null
+++ b/README.dag
@@ -0,0 +1,122 @@
+
+The following instructions apply if you have a Linux or FreeBSD platform and
+want libpcap to support the DAG range of passive network monitoring cards from
+Endace (http://www.endace.com, see below for further contact details).
+
+1) Install and build the DAG software distribution by following the
+instructions supplied with that package. Current Endace customers can download
+the DAG software distibution from https://www.endace.com
+
+2) Configure libcap. To allow the 'configure' script to locate the DAG
+software distribution use the '--with-dag' option:
+
+        ./configure --with-dag=DIR
+
+Where DIR is the root of the DAG software distribution, for example
+/var/src/dag. If the DAG software is correctly detected 'configure' will
+report:
+
+        checking whether we have DAG API... yes
+
+If 'configure' reports that there is no DAG API, the directory may have been
+incorrectly specified or the DAG software was not built before configuring
+libpcap.
+
+See also the libpcap INSTALL.txt file for further libpcap configuration
+options.
+
+Building libpcap at this stage will include support for both the native packet
+capture stream (linux or bpf) and for capturing from DAG cards. To build
+libpcap with only DAG support specify the capture type as 'dag' when
+configuring libpcap:
+
+        ./configure --with-dag=DIR --with-pcap=dag
+
+Applications built with libpcap configured in this way will only detect DAG
+cards and will not capture from the native OS packet stream.
+
+----------------------------------------------------------------------
+
+Libpcap when built for DAG cards against dag-2.5.1 or later releases:
+
+Timeouts are supported. pcap_dispatch() will return after to_ms milliseconds
+regardless of how many packets are received. If to_ms is zero pcap_dispatch()
+will block waiting for data indefinitely.
+
+pcap_dispatch() will block on and process a minimum of 64kB of data (before
+filtering) for efficiency. This can introduce high latencies on quiet
+interfaces unless a timeout value is set. The timeout expiring will override
+the 64kB minimum causing pcap_dispatch() to process any available data and
+return.
+
+pcap_setnonblock is supported. When nonblock is set, pcap_dispatch() will
+check once for available data, process any data available up to count, then
+return immediately.
+
+pcap_findalldevs() is supported, e.g. dag0, dag1...
+
+Some DAG cards can provide more than one 'stream' of received data.
+This can be data from different physical ports, or separated by filtering
+or load balancing mechanisms. Receive streams have even numbers, e.g.
+dag0:0, dag0:2 etc. Specifying transmit streams for capture is not supported.
+
+pcap_setfilter() is supported, BPF programs run in userspace.
+
+pcap_setdirection() is not supported. Only received traffic is captured.
+DAG cards normally do not have IP or link layer addresses assigned as
+they are used to passively monitor links.
+
+pcap_breakloop() is supported.
+
+pcap_datalink() and pcap_list_datalinks() are supported. The DAG card does
+not attempt to set the correct datalink type automatically where more than
+one type is possible.
+
+pcap_stats() is supported. ps_drop is the number of packets dropped due to
+RX stream buffer overflow, this count is before filters are applied (it will
+include packets that would have been dropped by the filter). The RX stream
+buffer size is user configurable outside libpcap, typically 16-512MB.
+
+pcap_get_selectable_fd() is not supported, as DAG cards do not support
+poll/select methods.
+
+pcap_inject() and pcap_sendpacket() are not supported.
+
+Some DAG cards now support capturing to multiple virtual interfaces, called
+streams. Capture streams have even numbers. These are available via libpcap
+as separate interfaces, e.g. dag0:0, dag0:2, dag0:4 etc. dag0:0 is the same
+as dag0. These are visible via pcap_findalldevs().
+
+libpcap now does NOT set the card's hardware snaplen (slen). This must now be
+set using the appropriate DAG coniguration program, e.g. dagthree, dagfour,
+dagsix, dagconfig. This is because the snaplen is currently shared between
+all of the streams. In future this may change if per-stream slen is
+implemented.
+
+DAG cards by default capture entire packets including the L2
+CRC/FCS. If the card is not configured to discard the CRC/FCS, this
+can confuse applications that use libpcap if they're not prepared for
+packets to have an FCS.
+
+Libpcap now reads the environment variable ERF_FCS_BITS to determine
+how many bits of CRC/FCS to strip from the end of the captured
+frame. This defaults to 32 for use with Ethernet. If the card is
+configured to strip the CRC/FCS, then set ERF_FCS_BITS=0. If used with
+a HDLC/PoS/PPP/Frame Relay link with 16 bit CRC/FCS, then set
+ERF_FCS_BITS=16.
+
+If you wish to create a pcap file that DOES contain the Ethernet FCS,
+specify the environment variable ERF_DONT_STRIP_FCS. This will cause
+the existing FCS to be captured into the pcap file. Note some
+applications may incorrectly report capture errors or oversize packets
+when reading these files.
+
+----------------------------------------------------------------------
+
+Please submit bug reports via <support@endace.com>.
+
+Please also visit our Web site at:
+
+        http://www.endace.com/
+
+For more information about Endace DAG cards contact <sales@endace.com>.
diff --git a/README.hpux b/README.hpux
new file mode 100644
index 0000000..88c27f8
--- /dev/null
+++ b/README.hpux
@@ -0,0 +1,254 @@
+For HP-UX 11i (11.11) and later, there are no known issues with
+promiscuous mode under HP-UX.  If you are using a earlier version of
+HP-UX and cannot upgrade, please continue reading.
+
+HP-UX patches to fix packet capture problems
+
+Note that packet-capture programs such as tcpdump may, on HP-UX, not be
+able to see packets sent from the machine on which they're running. 
+Some articles on groups.google.com discussing this are:
+
+	http://groups.google.com/groups?selm=82ld3v%2480i%241%40mamenchi.zrz.TU-Berlin.DE
+
+which says:
+
+  Newsgroups: comp.sys.hp.hpux 
+  Subject:  Re: Did someone made tcpdump working on 10.20 ?
+  Date: 12/08/1999
+  From: Lutz Jaenicke <jaenicke@emserv1.ee.TU-Berlin.DE>
+
+  In article <82ks5i$5vc$1@news1.dti.ne.jp>, mtsat <mtsat@iris.dti.ne.jp>
+  wrote:
+   >Hello,
+   >
+   >I downloaded and compiled tcpdump3.4 a couple of week ago. I tried to use
+   >it, but I can only see incoming data, never outgoing.
+   >Someone (raj) explained me that a patch was missing, and that this patch
+   >must me "patched" (poked) in order to see outbound data in promiscuous mode.
+   >Many things to do .... So the question is : did someone has already this
+   >"ready to use" PHNE_**** patch ?
+  
+   Two things:
+   1. You do need a late "LAN products cumulative patch" (e.g.  PHNE_18173
+  for   s700/10.20).
+   2. You must use
+echo 'lanc_outbound_promisc_flag/W1' | /usr/bin/adb -w /stand/vmunix /dev/kmem
+     You can insert this e.g. into /sbin/init.d/lan
+  
+   Best regards,
+   Lutz
+
+and
+
+	http://groups.google.com/groups?selm=88cf4t%24p03%241%40web1.cup.hp.com
+
+which says:
+
+  Newsgroups: comp.sys.hp.hpux 
+  Subject: Re: tcpdump only shows incoming packets
+  Date: 02/15/2000
+  From: Rick Jones <foo@bar.baz.invalid>
+
+  Harald Skotnes <harald@cc.uit.no> wrote:
+  > I am running HPUX 11.0 on a C200 hanging on a 100Mb switch. I have
+  > compiled libpcap-0.4 an tcpdump-3.4 and it seems to work. But at a
+  > closer look I only get to see the incoming packets not the
+  > outgoing. I have tried tcpflow-0.12 which also uses libpcap and the
+  > same thing happens.  Could someone please give me a hint on how to
+  > get this right?
+  
+  Search/Read the archives ?-)
+  
+  What you are seeing is expected, un-patched, behaviour for an HP-UX
+  system.  On 11.00, you need to install the latest lancommon/DLPI
+  patches, and then the latest driver patch for the interface(s) in use. 
+  At that point, a miracle happens and you should start seeing outbound
+  traffic.
+
+[That article also mentions the patch that appears below.]
+
+and
+
+	http://groups.google.com/groups?selm=38AA973E.96BE7DF7%40cc.uit.no
+
+which says:
+
+  Newsgroups: comp.sys.hp.hpux
+  Subject: Re: tcpdump only shows incoming packets
+  Date: 02/16/2000
+  From: Harald Skotnes <harald@cc.uit.no>
+
+  Rick Jones wrote:
+  
+	...
+
+  > What you are seeing is expected, un-patched, behaviour for an HP-UX
+  > system. On 11.00, you need to install the latest lancommon/DLPI
+  > patches, and then the latest driver patch for the interface(s) in
+  > use. At that point, a miracle happens and you should start seeing
+  > outbound traffic.
+  
+  Thanks a lot.  I have this problem on several machines running HPUX
+  10.20 and 11.00.  The machines where patched up before y2k so did not
+  know what to think.  Anyway I have now installed PHNE_19766,
+  PHNE_19826, PHNE_20008, PHNE_20735 on the C200 and now I can see the
+  outbound traffic too.  Thanks again.
+
+(although those patches may not be the ones to install - there may be
+later patches).
+
+And another message to tcpdump-workers@tcpdump.org, from Rick Jones:
+
+  Date: Mon, 29 Apr 2002 15:59:55 -0700
+  From: Rick Jones
+  To: tcpdump-workers@tcpdump.org 
+  Subject: Re: [tcpdump-workers] I Can't Capture the Outbound Traffic
+
+	...
+
+  http://itrc.hp.com/ would be one place to start in a search for the most
+  up-to-date patches for DLPI and the lan driver(s) used on your system (I
+  cannot guess because 9000/800 is too generic - one hs to use the "model"
+  command these days and/or an ioscan command (see manpage) to guess what
+  the drivers (btlan[3456], gelan, etc) might be involved in addition to
+  DLPI.
+
+  Another option is to upgrade to 11i as outbound promiscuous mode support
+  is there in the base OS, no patches required.
+
+Another posting:
+
+	http://groups.google.com/groups?selm=7d6gvn%24b3%241%40ocean.cup.hp.com
+
+indicates that you need to install the optional STREAMS product to do
+captures on HP-UX 9.x:
+
+  Newsgroups: comp.sys.hp.hpux
+  Subject:  Re: tcpdump HP/UX 9.x
+  Date: 03/22/1999
+  From: Rick Jones <foo@bar.baz>
+
+  Dave Barr (barr@cis.ohio-state.edu) wrote:
+  : Has anyone ported tcpdump (or something similar) to HP/UX 9.x?
+  
+  I'm reasonably confident that any port of tcpdump to 9.X would require
+  the (then optional) STREAMS product.  This would bring DLPI, which is
+  what one uses to access interfaces in promiscuous mode.
+  
+  I'm not sure that HP even sells the 9.X STREAMS product any longer,
+  since HP-UX 9.X is off the pricelist (well, maybe 9.10 for the old 68K
+  devices). 
+  
+  Your best bet is to be up on 10.20 or better if that is at all
+  possible.  If your hardware is supported by it, I'd go with HP-UX 11. 
+  If you want to see the system's own outbound traffic, you'll never get
+  that functionality on 9.X, but it might happen at some point for 10.20
+  and 11.X. 
+  
+  rick jones
+
+(as per other messages cited here, the ability to see the system's own
+outbound traffic did happen).
+
+Rick Jones reports that HP-UX 11i needs no patches for outbound
+promiscuous mode support.
+
+An additional note, from Jost Martin, for HP-UX 10.20:
+
+	Q: How do I get ethereral on HPUX to capture the _outgoing_ packets
+	   of an interface
+	A: You need to get PHNE_20892,PHNE_20725 and PHCO_10947 (or
+	   newer, this is as of 4.4.00) and its dependencies.  Then you can
+	   enable the feature as descibed below:
+
+	Patch Name: PHNE_20892
+	Patch Description: s700 10.20 PCI 100Base-T cumulative patch
+		To trace the outbound packets, please do the following
+		to turn on a global promiscuous switch before running
+		the promiscuous applications like snoop or tcpdump:
+
+		adb -w /stand/vmunix /dev/mem
+		lanc_outbound_promisc_flag/W 1
+		(adb will echo the result showing that the flag has
+		been changed)
+		$quit
+	(Thanks for this part to HP-support, Ratingen)
+
+		The attached hack does this and some security-related stuff
+	(thanks to hildeb@www.stahl.bau.tu-bs.de (Ralf Hildebrandt) who
+	posted the security-part some time ago)
+
+		 <<hack_ip_stack>> 
+
+		(Don't switch IP-forwarding off, if you need it !)
+		Install the hack as /sbin/init.d/hacl_ip_stack (adjust
+	permissions !) and make a sequencing-symlink
+	/sbin/rc2.d/S350hack_ip_stack pointing to this script. 
+		Now all this is done on every reboot.
+
+According to Rick Jones, the global promiscuous switch also has to be
+turned on for HP-UX 11.00, but not for 11i - and, in fact, the switch
+doesn't even exist on 11i.
+
+Here's the "hack_ip_stack" script:
+
+-----------------------------------Cut Here-------------------------------------
+#!/sbin/sh
+#
+# nettune:  hack kernel parms for safety
+
+OKAY=0
+ERROR=-1
+
+# /usr/contrib/bin fuer nettune auf Pfad
+PATH=/sbin:/usr/sbin:/usr/bin:/usr/contrib/bin
+export PATH
+
+
+##########
+#  main  #
+##########
+
+case $1 in
+   start_msg)
+      print "Tune IP-Stack for security"
+      exit $OKAY
+      ;;
+
+   stop_msg)
+      print "This action is not applicable"
+      exit $OKAY
+      ;;
+
+   stop)
+      exit $OKAY
+      ;;
+
+   start)
+      ;;  # fall through
+
+   *)
+      print "USAGE: $0 {start_msg | stop_msg | start | stop}" >&2
+      exit $ERROR
+      ;;
+   esac
+
+###########
+#  start  #
+###########
+
+#
+# tcp-Sequence-Numbers nicht mehr inkrementieren sondern random
+# Syn-Flood-Protection an
+# ip_forwarding aus
+# Source-Routing aus
+# Ausgehende Packets an ethereal/tcpdump etc.
+
+/usr/contrib/bin/nettune -s tcp_random_seq 2 || exit $ERROR
+/usr/contrib/bin/nettune -s hp_syn_protect 1 || exit $ERROR
+/usr/contrib/bin/nettune -s ip_forwarding 0 || exit $ERROR
+echo 'ip_block_source_routed/W1' | /usr/bin/adb -w /stand/vmunix /dev/kmem || exit $ERROR
+echo 'lanc_outbound_promisc_flag/W 1' | adb -w /stand/vmunix /dev/mem  || exit $ERROR
+
+exit $OKAY
+-----------------------------------Cut Here-------------------------------------
diff --git a/README.linux b/README.linux
index dd95913..f92cd22 100644
--- a/README.linux
+++ b/README.linux
@@ -69,6 +69,26 @@
 	  file linux/Documentation/networking/filter.txt for more information.
 	  If unsure, say N.
 
+Note that, by default, libpcap will, if libnl is present, build with it;
+it uses libnl to support monitor mode on mac80211 devices.  There is a
+configuration option to disable building with libnl, but, if that option
+is chosen, the monitor-mode APIs (as used by tcpdump's "-I" flag, and as
+will probably be used by other applications in the future) won't work
+properly on mac80211 devices.
+
+Linux's run-time linker allows shared libraries to be linked with other
+shared libraries, which means that if an older version of a shared
+library doesn't require routines from some other shared library, and a
+later version of the shared library does require those routines, the
+later version of the shared library can be linked with that other shared
+library and, if it's otherwise binary-compatible with the older version,
+can replace that older version without breaking applications built with
+the older version, and without breaking configure scripts or the build
+procedure for applications whose configure script doesn't use the
+pcap-config script if they build with the shared library.  (The build
+procedure for applications whose configure scripts use the pcap-config
+script if present will not break even if they build with the static
+library.)
 
 Statistics:
 Statistics reported by pcap are platform specific.  The statistics
@@ -77,12 +97,12 @@
 2.2.x
 =====
 ps_recv   Number of packets that were accepted by the pcap filter
-ps_drops  Always 0, this statistic is not gatherd on this platform
+ps_drop   Always 0, this statistic is not gatherd on this platform
 
 2.4.x
 =====
-ps_rec    Number of packets that were accepted by the pcap filter
-ps_drops  Number of packets that had passed filtering but were not
+ps_recv   Number of packets that were accepted by the pcap filter
+ps_drop   Number of packets that had passed filtering but were not
           passed on to pcap due to things like buffer shortage, etc.
-			 This is useful because these are packets you are interested in
-			 but won't be reported by, for example, tcpdump output.
+          This is useful because these are packets you are interested in
+          but won't be reported by, for example, tcpdump output.
diff --git a/README.macosx b/README.macosx
new file mode 100644
index 0000000..3dc9211
--- /dev/null
+++ b/README.macosx
@@ -0,0 +1,74 @@
+As with other systems using BPF, Mac OS X allows users with read access
+to the BPF devices to capture packets with libpcap and allows users with
+write access to the BPF devices to send packets with libpcap.
+
+On some systems that use BPF, the BPF devices live on the root file
+system, and the permissions and/or ownership on those devices can be
+changed to give users other than root permission to read or write those
+devices.
+
+On newer versions of FreeBSD, the BPF devices live on devfs, and devfs
+can be configured to set the permissions and/or ownership of those
+devices to give users other than root permission to read or write those
+devices.
+
+On Mac OS X, the BPF devices live on devfs, but the OS X version of
+devfs is based on an older (non-default) FreeBSD devfs, and that version
+of devfs cannot be configured to set the permissions and/or ownership of
+those devices.
+
+Therefore, we supply:
+
+	a "startup item" for older versions of Mac OS X;
+
+	a launchd daemon for Tiger and later versions of Mac OS X;
+
+Both of them will change the ownership of the BPF devices so that the
+"admin" group owns them, and will change the permission of the BPF
+devices to rw-rw----, so that all users in the "admin" group - i.e., all
+users with "Allow user to administer this computer" turned on - have
+both read and write access to them.
+
+The startup item is in the ChmodBPF directory in the source tree.  A
+/Library/StartupItems directory should be created if it doesn't already
+exist, and the ChmodBPF directory should be copied to the
+/Library/StartupItems directory (copy the entire directory, so that
+there's a /Library/StartupItems/ChmodBPF directory, containing all the
+files in the source tree's ChmodBPF directory; don't copy the individual
+items in that directory to /Library/StartupItems).  The ChmodBPF
+directory, and all files under it, must be owned by root.  Installing
+the files won't immediately cause the startup item to be executed; it
+will be executed on the next reboot.  To change the permissions before
+the reboot, run
+
+	sudo SystemStarter start ChmodBPF
+
+The launchd daemon is the chmod_bpf script, plus the
+org.tcpdump.chmod_bpf.plist launchd plist file.  chmod_bpf should be
+installed in /usr/local/bin/chmod_bpf, and org.tcpdump.chmod_bpf.plist
+should be installed in /Library/LaunchDaemons.  chmod_bpf, and
+org.tcpdump.chmod_bpf.plist, must be owned by root.  Installing the
+script and plist file won't immediately cause the script to be executed;
+it will be executed on the next reboot.  To change the permissions
+before the reboot, run
+
+	sudo /usr/local/bin/chmod_bpf
+
+or
+
+	sudo launchctl load /Library/LaunchDaemons/org.tcpdump.chmod_bpf.plist
+
+If you want to give a particular user permission to access the BPF
+devices, rather than giving all administrative users permission to
+access them, you can have the ChmodBPF/ChmodBPF script change the
+ownership of /dev/bpf* without changing the permissions.  If you want to
+give a particular user permission to read and write the BPF devices and
+give the administrative users permission to read but not write the BPF
+devices, you can have the script change the owner to that user, the
+group to "admin", and the permissions to rw-r-----.  Other possibilities
+are left as an exercise for the reader.
+
+(NOTE: due to a bug in Snow Leopard, if you change the permissions not
+to grant write permission to everybody who should be allowed to capture
+traffic, non-root users who cannot open the BPF devices for writing will
+not be able to capture outgoing packets.)
diff --git a/README.septel b/README.septel
new file mode 100644
index 0000000..fbc88df
--- /dev/null
+++ b/README.septel
@@ -0,0 +1,50 @@
+The following instructions apply if you have a Linux platform and want
+libpcap to support the Septel range of passive network monitoring cards
+from Intel (http://www.intel.com)
+
+1) Install and build the Septel software distribution by following the
+instructions supplied with that package.
+
+2) Configure libcap. To allow the 'configure' script to locate the Septel
+software distribution use the '--with-septel' option:
+
+        ./configure --with-septel=DIR
+
+where DIR is the root of the Septel software distribution, for example
+/var/src/septel.
+
+By default (if you write only ./configure --with-septel) it takes
+./../septel as argument for DIR. 
+
+If the Septel software is correctly detected 'configure' will
+report:
+
+        checking whether we have Septel API... yes
+
+If 'configure' reports that there is no Septel API, the directory may have been
+incorrectly specified or the Septel software was not built before configuring
+libpcap.
+
+See also the libpcap INSTALL.txt file for further libpcap configuration
+options.
+
+Building libpcap at this stage will include support for both the native
+packet capture stream and for capturing from Septel cards.  To build
+libpcap with only Septel support specify the capture type as 'septel'
+when configuring libpcap:
+
+        ./configure --with-septel=DIR --with-pcap=septel
+
+Applications built with libpcap configured in this way will only detect Septel
+cards and will not capture from the native OS packet stream.
+
+Note: As mentioned in pcap-septel.c we should first edit the system.txt
+file to change the user part example (UPE) module id to 0xdd instead of
+0x2d for technical reason.  So this change in system.txt is crutial and
+things will go wrong if it's not done.  System.txt along with config.txt
+are configuration files that are edited by the user before running the
+gctload program that uses these files for initialising modules and
+configuring parameters.
+
+----------------------------------------------------------------------
+for more information please contact me : gil_hoyek@hotmail.com
diff --git a/README.sita b/README.sita
new file mode 100644
index 0000000..ee7a426
--- /dev/null
+++ b/README.sita
@@ -0,0 +1,64 @@
+The following instructions apply if you have a Linux platform and want
+libpcap to support the 'ACN' WAN/LAN router product from from SITA
+(http://www.sita.aero)
+
+This might also work on non-Linux Unix-compatible platforms, but that
+has not been tested.
+
+See also the libpcap INSTALL.txt file for further libpcap configuration
+options.
+
+These additions/extensions have been made to PCAP to allow it to
+capture packets from a SITA ACN device (and potentially others).
+
+To enable its support you need to ensure that the distribution has
+a correct configure.in file; that can be created if neccessay by
+using the normal autoconf procedure of:
+
+aclocal
+autoconf
+autoheader
+automake
+
+Then run configure with the 'sita' option:
+
+./configure --with-sita
+
+Applications built with libpcap configured in this way will only detect SITA
+ACN interfaces and will not capture from the native OS packet stream.
+
+The SITA extension provides a remote datascope operation for capturing
+both WAN and LAN protocols.  It effectively splits the operation of
+PCAP into two halves.  The top layer performs the majority of the
+work, but interfaces via a TCP session to remote agents that
+provide the lower layer functionality of actual sniffing and
+filtering. More detailed information regarding the functions and
+inter-device protocol and naming conventions are described in detail
+in 'pcap-sita.html'.
+
+pcap_findalldevs() reads the local system's /etc/hosts file looking
+for host names that match the format of IOP type devices.  ie.  aaa_I_x_y
+and then queries each associated IP address for a list of its WAN and
+LAN devices.  The local system the aggregates the lists obtained from
+each IOP, sorts it, and provides it (to Wireshark et.al) as the
+list of monitorable interfaces.
+
+Once a valid interface has been selected, pcap_open() is called
+which opens a TCP session (to a well known port) on the target IOP
+and tells it to start monitoring.
+
+All captured packets are then forwarded across that TCP session
+back to the local 'top layer' for forwarding to the actual
+sniffing program (wireshark...)
+
+Note that the DLT_SITA link-layer type includes a proprietary header
+that is documented as part of the SITA dissector of Wireshark and is
+also described in 'pcap-sita.html' for posterity sake.
+
+That header provides:
+- Packet direction (in/out) (1 octet)
+- Link layer hardware signal status (1 octet)
+- Transmit/Receive error status (2 octets)
+- Encapsulated WAN protocol ID (1 octet)
+
+
diff --git a/README.tru64 b/README.tru64
new file mode 100644
index 0000000..7fe1ef0
--- /dev/null
+++ b/README.tru64
@@ -0,0 +1,49 @@
+The following instructions are applicable to Tru64 UNIX 
+(formerly Digital UNIX (formerly DEC OSF/1)) version 4.0, and
+probably to later versions as well; at least some options apply to
+Digital UNIX 3.2 - perhaps all do.
+
+In order to use kernel packet filtering on this system, you have
+to configure it in such a way:
+
+Kernel configuration
+--------------------
+
+The packet filtering kernel option must be enabled at kernel
+installation.  If it was not the case, you can rebuild the kernel with
+"doconfig -c" after adding the following line in the kernel
+configuration file (/sys/conf/<HOSTNAME>):
+
+	option PACKETFILTER
+
+or use "doconfig" without any arguments to add the packet filter driver
+option via the kernel option menu (see the system administration
+documentation for information on how to do this).
+
+Device configuration
+--------------------
+
+Devices used for packet filtering must be created thanks to
+the following command (executed in the /dev directory):
+
+	./MAKEDEV pfilt
+
+Interface configuration
+-----------------------
+
+In order to capture all packets on a network, you may want to allow
+applications to put the interface on that network into "local copy"
+mode, so that tcpdump can see packets sent by the host on which it's
+running as well as packets received by that host, and to put the
+interface into "promiscuous" mode, so that tcpdump can see packets on
+the network segment not sent to the host on which it's running, by using
+the pfconfig(1) command:
+
+	pfconfig +c +p <network_device>
+
+or allow application to put any interface into "local copy" or
+"promiscuous" mode by using the command:
+
+	pfconfig +c +p -a
+
+Note: all instructions given require root privileges.
diff --git a/SUNOS4/nit_if.o.sparc b/SUNOS4/nit_if.o.sparc
new file mode 100644
index 0000000..d05073e
--- /dev/null
+++ b/SUNOS4/nit_if.o.sparc
Binary files differ
diff --git a/SUNOS4/nit_if.o.sun3 b/SUNOS4/nit_if.o.sun3
new file mode 100644
index 0000000..c393fc6
--- /dev/null
+++ b/SUNOS4/nit_if.o.sun3
Binary files differ
diff --git a/SUNOS4/nit_if.o.sun4c.4.0.3c b/SUNOS4/nit_if.o.sun4c.4.0.3c
new file mode 100644
index 0000000..ef01039
--- /dev/null
+++ b/SUNOS4/nit_if.o.sun4c.4.0.3c
Binary files differ
diff --git a/TODO b/TODO
index 3de4530..73325e1 100644
--- a/TODO
+++ b/TODO
@@ -6,7 +6,7 @@
 
 General
 
-- configure should not be in the CVS. Most open source projects have an 
+- configure should not be in Git. Most open source projects have an 
   autogen.sh script to run autoconf etc. after checkout. I think we 
   should stick to the standard. 
 
diff --git a/VERSION b/VERSION
index e3e1807..4cda8f1 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.9.8
+1.5.2
diff --git a/Win32/Include/Gnuc.h b/Win32/Include/Gnuc.h
new file mode 100644
index 0000000..0bf4b73
--- /dev/null
+++ b/Win32/Include/Gnuc.h
@@ -0,0 +1,46 @@
+/* @(#) $Header: /tcpdump/master/libpcap/Win32/Include/Gnuc.h,v 1.1 2002-08-01 08:33:05 risso Exp $ (LBL) */
+
+/* Define __P() macro, if necessary */
+
+#ifndef __P
+#if __STDC__
+#define __P(protos) protos
+#else
+#define __P(protos) ()
+#endif
+#endif
+
+/* inline foo */
+#ifndef __cplusplus
+#ifdef __GNUC__
+#define inline __inline
+#else
+#define inline
+#endif
+#endif
+
+/*
+ * Handle new and old "dead" routine prototypes
+ *
+ * For example:
+ *
+ *	__dead void foo(void) __attribute__((volatile));
+ *
+ */
+#ifdef __GNUC__
+#ifndef __dead
+#define __dead volatile
+#endif
+#if __GNUC__ < 2  || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
+#ifndef __attribute__
+#define __attribute__(args)
+#endif
+#endif
+#else
+#ifndef __dead
+#define __dead
+#endif
+#ifndef __attribute__
+#define __attribute__(args)
+#endif
+#endif
diff --git a/Win32/Include/addrinfo.h b/Win32/Include/addrinfo.h
new file mode 100644
index 0000000..8cb2e65
--- /dev/null
+++ b/Win32/Include/addrinfo.h
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
+ * 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. Neither the name of the project 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 PROJECT 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 PROJECT 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.
+ */
+
+/* $Id: addrinfo.h,v 1.1 2002-08-01 08:33:05 risso Exp $ */
+
+#ifndef HAVE_ADDRINFO
+
+/*
+ * Error return codes from getaddrinfo()
+ */
+#define	EAI_ADDRFAMILY	 1	/* address family for hostname not supported */
+#define	EAI_AGAIN	 2	/* temporary failure in name resolution */
+#define	EAI_BADFLAGS	 3	/* invalid value for ai_flags */
+#define	EAI_FAIL	 4	/* non-recoverable failure in name resolution */
+#define	EAI_FAMILY	 5	/* ai_family not supported */
+#define	EAI_MEMORY	 6	/* memory allocation failure */
+#define	EAI_NODATA	 7	/* no address associated with hostname */
+#define	EAI_NONAME	 8	/* hostname nor servname provided, or not known */
+#define	EAI_SERVICE	 9	/* servname not supported for ai_socktype */
+#define	EAI_SOCKTYPE	10	/* ai_socktype not supported */
+#define	EAI_SYSTEM	11	/* system error returned in errno */
+#define EAI_BADHINTS	12
+#define EAI_PROTOCOL	13
+#define EAI_MAX		14
+
+/* internal error */
+#define	NETDB_INTERNAL	-1	/* see errno */
+
+/*
+ * Flag values for getaddrinfo()
+ */
+#define	AI_PASSIVE	0x00000001 /* get address to use bind() */
+#define	AI_CANONNAME	0x00000002 /* fill ai_canonname */
+#define	AI_NUMERICHOST	0x00000004 /* prevent name resolution */
+/* valid flags for addrinfo */
+#define	AI_MASK		(AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST)
+
+#define	AI_ALL		0x00000100 /* IPv6 and IPv4-mapped (with AI_V4MAPPED) */
+#define	AI_V4MAPPED_CFG	0x00000200 /* accept IPv4-mapped if kernel supports */
+#define	AI_ADDRCONFIG	0x00000400 /* only if any address is assigned */
+#define	AI_V4MAPPED	0x00000800 /* accept IPv4-mapped IPv6 address */
+/* special recommended flags for getipnodebyname */
+#define	AI_DEFAULT	(AI_V4MAPPED_CFG | AI_ADDRCONFIG)
+
+struct addrinfo {
+	int	ai_flags;	/* AI_PASSIVE, AI_CANONNAME */
+	int	ai_family;	/* PF_xxx */
+	int	ai_socktype;	/* SOCK_xxx */
+	int	ai_protocol;	/* 0 or IPPROTO_xxx for IPv4 and IPv6 */
+	size_t	ai_addrlen;	/* length of ai_addr */
+	char	*ai_canonname;	/* canonical name for hostname */
+	struct sockaddr *ai_addr;	/* binary address */
+	struct addrinfo *ai_next;	/* next structure in linked list */
+};
+
+extern void freeaddrinfo (struct addrinfo *);
+extern void freehostent (struct hostent *);
+extern char *gai_strerror (int);
+extern int getaddrinfo (const char *, const char *,
+			    const struct addrinfo *, struct addrinfo **);
+extern int getnameinfo (const struct sockaddr *, size_t, char *,
+			    size_t, char *, size_t, int);
+extern struct hostent *getipnodebyaddr (const void *, size_t, int, int *);
+extern struct hostent *getipnodebyname (const char *, int, int, int *);
+extern int inet_pton (int, const char *, void *);
+extern const char *inet_ntop (int, const void *, char *, size_t);
+#else
+
+#ifndef EAI_BADHINTS
+#define EAI_BADHINTS	12
+#endif 
+
+#ifndef EAI_PROTOCOL	
+#define EAI_PROTOCOL	13
+#endif
+
+#ifndef EAI_MAX	
+#define EAI_MAX		14
+#endif
+
+#ifndef NETDB_INTERNAL
+#define	NETDB_INTERNAL	-1	/* see errno */
+#endif
+
+#ifndef AI_MASK
+/* valid flags for addrinfo */
+#define	AI_MASK		(AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST)
+#endif
+
+#endif /* HAVE_ADDRINFO */
+
+/*
+ * Constants for getnameinfo()
+ */
+#ifndef NI_MAXHOST
+#define	NI_MAXHOST	1025
+#endif
+#ifndef NI_MAXSERV
+#define	NI_MAXSERV	32
+#endif
+
+/*
+ * Flag values for getnameinfo()
+ */
+#ifndef NI_NOFQDN
+#define	NI_NOFQDN	0x00000001
+#endif
+#ifndef NI_NUMERICHOST
+#define	NI_NUMERICHOST	0x00000002
+#endif
+#ifndef NI_NAMEREQD
+#define	NI_NAMEREQD	0x00000004
+#endif
+#ifndef NI_NUMERICSERV
+#define	NI_NUMERICSERV	0x00000008
+#endif
+#ifndef NI_DGRAM
+#define	NI_DGRAM	0x00000010
+#endif
+
diff --git a/Win32/Include/arpa/nameser.h b/Win32/Include/arpa/nameser.h
new file mode 100644
index 0000000..18f185c
--- /dev/null
+++ b/Win32/Include/arpa/nameser.h
@@ -0,0 +1,349 @@
+/*
+ * ++Copyright++ 1983, 1989, 1993
+ * -
+ * Copyright (c) 1983, 1989, 1993
+ *    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 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.
+ * -
+ * Portions Copyright (c) 1993 by Digital Equipment Corporation.
+ * 
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies, and that
+ * the name of Digital Equipment Corporation not be used in advertising or
+ * publicity pertaining to distribution of the document or software without
+ * specific, written prior permission.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
+ * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ * -
+ * --Copyright--
+ */
+
+/*
+ *      @(#)nameser.h	8.1 (Berkeley) 6/2/93
+ *	nameser.h,v 1.2 1995/05/06 14:23:54 hjl Exp
+ */
+
+#ifndef _NAMESER_H_
+#define	_NAMESER_H_
+
+#ifndef WIN32
+#include <sys/param.h>
+#if (!defined(BSD)) || (BSD < 199306)
+# include <sys/bitypes.h>
+#else
+# include <sys/types.h>
+#endif
+#include <sys/cdefs.h>
+#else 
+#include <pcap-stdinc.h>
+#define __LITTLE_ENDIAN 1
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+/*
+ * revision information.  this is the release date in YYYYMMDD format.
+ * it can change every day so the right thing to do with it is use it
+ * in preprocessor commands such as "#if (__BIND > 19931104)".  do not
+ * compare for equality; rather, use it to determine whether your resolver
+ * is new enough to contain a certain feature.
+ */
+
+#define	__BIND		19940417	/* interface version stamp */
+
+/*
+ * Define constants based on rfc883
+ */
+#define PACKETSZ	512		/* maximum packet size */
+#define MAXDNAME	256		/* maximum domain name */
+#define MAXCDNAME	255		/* maximum compressed domain name */
+#define MAXLABEL	63		/* maximum length of domain label */
+#define	HFIXEDSZ	12		/* #/bytes of fixed data in header */
+#define QFIXEDSZ	4		/* #/bytes of fixed data in query */
+#define RRFIXEDSZ	10		/* #/bytes of fixed data in r record */
+#define	INT32SZ		4		/* for systems without 32-bit ints */
+#define	INT16SZ		2		/* for systems without 16-bit ints */
+#define	INADDRSZ	4		/* for sizeof(struct inaddr) != 4 */
+
+/*
+ * Internet nameserver port number
+ */
+#define NAMESERVER_PORT	53
+
+/*
+ * Currently defined opcodes
+ */
+#define QUERY		0x0		/* standard query */
+#define IQUERY		0x1		/* inverse query */
+#define STATUS		0x2		/* nameserver status query */
+/*#define xxx		0x3		*//* 0x3 reserved */
+#define	NS_NOTIFY_OP	0x4		/* notify secondary of SOA change */
+#ifdef ALLOW_UPDATES
+	/* non standard - supports ALLOW_UPDATES stuff from Mike Schwartz */
+# define UPDATEA	0x9		/* add resource record */
+# define UPDATED	0xa		/* delete a specific resource record */
+# define UPDATEDA	0xb		/* delete all named resource record */
+# define UPDATEM	0xc		/* modify a specific resource record */
+# define UPDATEMA	0xd		/* modify all named resource record */
+# define ZONEINIT	0xe		/* initial zone transfer */
+# define ZONEREF	0xf		/* incremental zone referesh */
+#endif
+
+/*
+ * Currently defined response codes
+ */
+#ifdef HAVE_ADDRINFO
+#define NOERROR		0		/* no error */
+#endif /* HAVE_ADDRINFO */
+#define FORMERR		1		/* format error */
+#define SERVFAIL	2		/* server failure */
+#define NXDOMAIN	3		/* non existent domain */
+#define NOTIMP		4		/* not implemented */
+#define REFUSED		5		/* query refused */
+#ifdef ALLOW_UPDATES
+	/* non standard */
+# define NOCHANGE	0xf		/* update failed to change db */
+#endif
+
+/*
+ * Type values for resources and queries
+ */
+#define T_A		1		/* host address */
+#define T_NS		2		/* authoritative server */
+#define T_MD		3		/* mail destination */
+#define T_MF		4		/* mail forwarder */
+#define T_CNAME		5		/* canonical name */
+#define T_SOA		6		/* start of authority zone */
+#define T_MB		7		/* mailbox domain name */
+#define T_MG		8		/* mail group member */
+#define T_MR		9		/* mail rename name */
+#define T_NULL		10		/* null resource record */
+#define T_WKS		11		/* well known service */
+#define T_PTR		12		/* domain name pointer */
+#define T_HINFO		13		/* host information */
+#define T_MINFO		14		/* mailbox information */
+#define T_MX		15		/* mail routing information */
+#define T_TXT		16		/* text strings */
+#define	T_RP		17		/* responsible person */
+#define T_AFSDB		18		/* AFS cell database */
+#define T_X25		19		/* X_25 calling address */
+#define T_ISDN		20		/* ISDN calling address */
+#define T_RT		21		/* router */
+#define T_NSAP		22		/* NSAP address */
+#define T_NSAP_PTR	23		/* reverse NSAP lookup (deprecated) */
+#define	T_SIG		24		/* security signature */
+#define	T_KEY		25		/* security key */
+#define	T_PX		26		/* X.400 mail mapping */
+#define	T_GPOS		27		/* geographical position (withdrawn) */
+#define	T_AAAA		28		/* IP6 Address */
+#define	T_LOC		29		/* Location Information */
+	/* non standard */
+#define T_UINFO		100		/* user (finger) information */
+#define T_UID		101		/* user ID */
+#define T_GID		102		/* group ID */
+#define T_UNSPEC	103		/* Unspecified format (binary data) */
+	/* Query type values which do not appear in resource records */
+#define T_AXFR		252		/* transfer zone of authority */
+#define T_MAILB		253		/* transfer mailbox records */
+#define T_MAILA		254		/* transfer mail agent records */
+#define T_ANY		255		/* wildcard match */
+
+/*
+ * Values for class field
+ */
+
+#define C_IN		1		/* the arpa internet */
+#define C_CHAOS		3		/* for chaos net (MIT) */
+#define C_HS		4		/* for Hesiod name server (MIT) (XXX) */
+	/* Query class values which do not appear in resource records */
+#define C_ANY		255		/* wildcard match */
+
+/*
+ * Status return codes for T_UNSPEC conversion routines
+ */
+#define CONV_SUCCESS	0
+#define CONV_OVERFLOW	(-1)
+#define CONV_BADFMT	(-2)
+#define CONV_BADCKSUM	(-3)
+#define CONV_BADBUFLEN	(-4)
+
+#ifndef __BYTE_ORDER
+#if (BSD >= 199103)
+# include <machine/endian.h>
+#else
+#ifdef linux
+# include <endian.h>
+#else
+#define	__LITTLE_ENDIAN	1234	/* least-significant byte first (vax, pc) */
+#define	__BIG_ENDIAN	4321	/* most-significant byte first (IBM, net) */
+#define	__PDP_ENDIAN	3412	/* LSB first in word, MSW first in long (pdp)*/
+
+#if defined(vax) || defined(ns32000) || defined(sun386) || defined(i386) || \
+    defined(MIPSEL) || defined(_MIPSEL) || defined(BIT_ZERO_ON_RIGHT) || \
+    defined(__alpha__) || defined(__alpha)
+#define __BYTE_ORDER	__LITTLE_ENDIAN
+#endif
+
+#if defined(sel) || defined(pyr) || defined(mc68000) || defined(sparc) || \
+    defined(is68k) || defined(tahoe) || defined(ibm032) || defined(ibm370) || \
+    defined(MIPSEB) || defined(_MIPSEB) || defined(_IBMR2) || defined(DGUX) ||\
+    defined(apollo) || defined(__convex__) || defined(_CRAY) || \
+    defined(__hppa) || defined(__hp9000) || \
+    defined(__hp9000s300) || defined(__hp9000s700) || \
+    defined (BIT_ZERO_ON_LEFT) || defined(m68k)
+#define __BYTE_ORDER	__BIG_ENDIAN
+#endif
+#endif /* linux */
+#endif /* BSD */
+#endif /* __BYTE_ORDER */
+
+#if !defined(__BYTE_ORDER) || \
+    (__BYTE_ORDER != __BIG_ENDIAN && __BYTE_ORDER != __LITTLE_ENDIAN && \
+    __BYTE_ORDER != __PDP_ENDIAN)
+	/* you must determine what the correct bit order is for
+	 * your compiler - the next line is an intentional error
+	 * which will force your compiles to bomb until you fix
+	 * the above macros.
+	 */
+  error "Undefined or invalid __BYTE_ORDER";
+#endif
+
+/*
+ * Structure for query header.  The order of the fields is machine- and
+ * compiler-dependent, depending on the byte/bit order and the layout
+ * of bit fields.  We use bit fields only in int variables, as this
+ * is all ANSI requires.  This requires a somewhat confusing rearrangement.
+ */
+
+typedef struct {
+	unsigned	id :16;		/* query identification number */
+#if __BYTE_ORDER == __BIG_ENDIAN
+			/* fields in third byte */
+	unsigned	qr: 1;		/* response flag */
+	unsigned	opcode: 4;	/* purpose of message */
+	unsigned	aa: 1;		/* authoritive answer */
+	unsigned	tc: 1;		/* truncated message */
+	unsigned	rd: 1;		/* recursion desired */
+			/* fields in fourth byte */
+	unsigned	ra: 1;		/* recursion available */
+	unsigned	pr: 1;		/* primary server req'd (!standard) */
+	unsigned	unused :2;	/* unused bits (MBZ as of 4.9.3a3) */
+	unsigned	rcode :4;	/* response code */
+#endif
+#if __BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __PDP_ENDIAN
+			/* fields in third byte */
+	unsigned	rd :1;		/* recursion desired */
+	unsigned	tc :1;		/* truncated message */
+	unsigned	aa :1;		/* authoritive answer */
+	unsigned	opcode :4;	/* purpose of message */
+	unsigned	qr :1;		/* response flag */
+			/* fields in fourth byte */
+	unsigned	rcode :4;	/* response code */
+	unsigned	unused :2;	/* unused bits (MBZ as of 4.9.3a3) */
+	unsigned	pr :1;		/* primary server req'd (!standard) */
+	unsigned	ra :1;		/* recursion available */
+#endif
+			/* remaining bytes */
+	unsigned	qdcount :16;	/* number of question entries */
+	unsigned	ancount :16;	/* number of answer entries */
+	unsigned	nscount :16;	/* number of authority entries */
+	unsigned	arcount :16;	/* number of resource entries */
+} HEADER;
+
+/*
+ * Defines for handling compressed domain names
+ */
+#define INDIR_MASK	0xc0
+
+/*
+ * Structure for passing resource records around.
+ */
+struct rrec {
+	int16_t		r_zone;			/* zone number */
+	int16_t		r_class;		/* class number */
+	int16_t		r_type;			/* type number */
+	u_int32_t	r_ttl;			/* time to live */
+	int		r_size;			/* size of data area */
+	char		*r_data;		/* pointer to data */
+};
+
+//extern	u_int16_t	_getshort __P((const u_char *));
+//extern	u_int32_t	_getlong __P((const u_char *));
+
+/*
+ * Inline versions of get/put short/long.  Pointer is advanced.
+ *
+ * These macros demonstrate the property of C whereby it can be
+ * portable or it can be elegant but rarely both.
+ */
+#define GETSHORT(s, cp) { \
+	register u_char *t_cp = (u_char *)(cp); \
+	(s) = ((u_int16_t)t_cp[0] << 8) \
+	    | ((u_int16_t)t_cp[1]) \
+	    ; \
+	(cp) += INT16SZ; \
+}
+
+#define GETLONG(l, cp) { \
+	register u_char *t_cp = (u_char *)(cp); \
+	(l) = ((u_int32_t)t_cp[0] << 24) \
+	    | ((u_int32_t)t_cp[1] << 16) \
+	    | ((u_int32_t)t_cp[2] << 8) \
+	    | ((u_int32_t)t_cp[3]) \
+	    ; \
+	(cp) += INT32SZ; \
+}
+
+#define PUTSHORT(s, cp) { \
+	register u_int16_t t_s = (u_int16_t)(s); \
+	register u_char *t_cp = (u_char *)(cp); \
+	*t_cp++ = t_s >> 8; \
+	*t_cp   = t_s; \
+	(cp) += INT16SZ; \
+}
+
+#define PUTLONG(l, cp) { \
+	register u_int32_t t_l = (u_int32_t)(l); \
+	register u_char *t_cp = (u_char *)(cp); \
+	*t_cp++ = t_l >> 24; \
+	*t_cp++ = t_l >> 16; \
+	*t_cp++ = t_l >> 8; \
+	*t_cp   = t_l; \
+	(cp) += INT32SZ; \
+}
+
+#endif /* !_NAMESER_H_ */
diff --git a/Win32/Include/bittypes.h b/Win32/Include/bittypes.h
new file mode 100644
index 0000000..7c0cbde
--- /dev/null
+++ b/Win32/Include/bittypes.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 1999 WIDE Project.
+ * 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. Neither the name of the project 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 PROJECT 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 PROJECT 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.
+ */
+#ifndef _BITTYPES_H
+#define _BITTYPES_H
+
+#ifndef HAVE_U_INT8_T
+typedef unsigned char u_int8_t;
+typedef signed char int8_t;
+#endif /* HAVE_U_INT8_T */
+
+#ifndef HAVE_U_INT16_T 
+typedef unsigned short u_int16_t;
+typedef signed short int16_t;
+#endif /* HAVE_U_INT16_T */
+
+#ifndef HAVE_U_INT32_T
+typedef unsigned int u_int32_t;
+typedef signed int int32_t;
+#endif /* HAVE_U_INT32_T */
+
+#ifndef HAVE_U_INT64_T
+#ifdef _MSC_EXTENSIONS
+typedef unsigned _int64 u_int64_t;
+typedef _int64 int64_t;
+#else /* _MSC_EXTENSIONS */
+typedef unsigned long long u_int64_t;
+typedef long long int64_t;
+#endif /* _MSC_EXTENSIONS */
+#endif /* HAVE_U_INT64_T */
+
+#ifndef PRId64
+#ifdef _MSC_EXTENSIONS
+#define PRId64	"I64d"
+#else /* _MSC_EXTENSIONS */
+#define PRId64	"lld"
+#endif /* _MSC_EXTENSIONS */
+#endif /* PRId64 */
+
+#ifndef PRIo64
+#ifdef _MSC_EXTENSIONS
+#define PRIo64	"I64o"
+#else /* _MSC_EXTENSIONS */
+#define PRIo64	"llo"
+#endif /* _MSC_EXTENSIONS */
+#endif /* PRIo64 */
+
+#ifndef PRIx64
+#ifdef _MSC_EXTENSIONS
+#define PRIx64	"I64x"
+#else /* _MSC_EXTENSIONS */
+#define PRIx64	"llx"
+#endif /* _MSC_EXTENSIONS */
+#endif /* PRIx64 */
+
+#ifndef PRIu64
+#ifdef _MSC_EXTENSIONS
+#define PRIu64	"I64u"
+#else /* _MSC_EXTENSIONS */
+#define PRIu64	"llu"
+#endif /* _MSC_EXTENSIONS */
+#endif /* PRIu64 */
+
+#endif /* _BITTYPES_H */
diff --git a/Win32/Include/cdecl_ext.h b/Win32/Include/cdecl_ext.h
new file mode 100644
index 0000000..9591db2
--- /dev/null
+++ b/Win32/Include/cdecl_ext.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 1999 WIDE Project.
+ * 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. Neither the name of the project 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 PROJECT 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 PROJECT 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.
+ */
+#ifndef HAVE_PORTABLE_PROTOTYPE
+
+#if defined(__STDC__) || defined(__cplusplus)
+#define	__P(protos)	protos		/* full-blown ANSI C */
+#else
+#define	__P(protos)	()		/* traditional C preprocessor */
+#endif
+
+#endif /* !HAVE_PORTABLE_PROTOTYPE */
diff --git a/Win32/Include/inetprivate.h b/Win32/Include/inetprivate.h
new file mode 100644
index 0000000..e25ed3d
--- /dev/null
+++ b/Win32/Include/inetprivate.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 1999 - 2003
+ * NetGroup, Politecnico di Torino (Italy)
+ * 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. Neither the name of the Politecnico di Torino 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 COPYRIGHT HOLDERS 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 COPYRIGHT
+ * OWNER 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.
+ *
+ */
+
+#include <sys/types.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <net/netdb.h>
+#include <stdio.h>
+#include <errno.h>
+#include <arpa/nameser.h>
+
+extern void _sethtent(int f);
+extern void _endhtent(void);
+extern struct hostent *_gethtent(void);
+extern struct hostent *_gethtbyname(const char *name);
+extern struct hostent *_gethtbyaddr(const char *addr, int len,
+		 int type);
+extern int _validuser(FILE *hostf, const char *rhost,
+		 const char *luser, const char *ruser, int baselen);
+extern int _checkhost(const char *rhost, const char *lhost, int len);
+#if 0
+extern void putlong(u_long l, u_char *msgp);
+extern void putshort(u_short l, u_char *msgp);
+extern u_int32_t _getlong(register const u_char *msgp);
+extern u_int16_t _getshort(register const u_char *msgp);
+extern void p_query(char *msg);
+extern void fp_query(char *msg, FILE *file);
+extern char *p_cdname(char *cp, char *msg, FILE *file);
+extern char *p_rr(char *cp, char *msg, FILE *file);
+extern char *p_type(int type);
+extern char * p_class(int class);
+extern char *p_time(u_long value);
+#endif
+extern char * hostalias(const char *name);
+extern void sethostfile(char *name);
+extern void _res_close (void);
+extern void ruserpass(const char *host, char **aname, char **apass);
diff --git a/Win32/Include/ip6_misc.h b/Win32/Include/ip6_misc.h
new file mode 100644
index 0000000..562fa61
--- /dev/null
+++ b/Win32/Include/ip6_misc.h
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 1993, 1994, 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.
+ *
+ * @(#) $Header: /tcpdump/master/libpcap/Win32/Include/ip6_misc.h,v 1.5 2006-01-22 18:02:18 gianluca Exp $ (LBL)
+ */
+
+/*
+ * This file contains a collage of declarations for IPv6 from FreeBSD not present in Windows
+ */
+
+#include <winsock2.h>
+
+#include <ws2tcpip.h>
+
+#ifndef __MINGW32__
+#define	IN_MULTICAST(a)		IN_CLASSD(a)
+#endif
+
+#define	IN_EXPERIMENTAL(a)	((((u_int32_t) (a)) & 0xf0000000) == 0xf0000000)
+
+#define	IN_LOOPBACKNET		127
+
+#if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF)
+/* IPv6 address */
+struct in6_addr
+  {
+    union
+      {
+	u_int8_t		u6_addr8[16];
+	u_int16_t	u6_addr16[8];
+	u_int32_t	u6_addr32[4];
+      } in6_u;
+#define s6_addr			in6_u.u6_addr8
+#define s6_addr16		in6_u.u6_addr16
+#define s6_addr32		in6_u.u6_addr32
+#define s6_addr64		in6_u.u6_addr64
+  };
+
+#define IN6ADDR_ANY_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+#define IN6ADDR_LOOPBACK_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }
+#endif /* __MINGW32__ */
+
+
+#if (defined _MSC_VER) || (defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF))
+typedef unsigned short	sa_family_t;
+#endif
+
+
+#if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF)
+
+#define	__SOCKADDR_COMMON(sa_prefix) \
+  sa_family_t sa_prefix##family
+
+/* Ditto, for IPv6.  */
+struct sockaddr_in6
+  {
+    __SOCKADDR_COMMON (sin6_);
+    u_int16_t sin6_port;		/* Transport layer port # */
+    u_int32_t sin6_flowinfo;	/* IPv6 flow information */
+    struct in6_addr sin6_addr;	/* IPv6 address */
+  };
+
+#define IN6_IS_ADDR_V4MAPPED(a) \
+	((((u_int32_t *) (a))[0] == 0) && (((u_int32_t *) (a))[1] == 0) && \
+	 (((u_int32_t *) (a))[2] == htonl (0xffff)))
+
+#define IN6_IS_ADDR_MULTICAST(a) (((u_int8_t *) (a))[0] == 0xff)
+
+#define IN6_IS_ADDR_LINKLOCAL(a) \
+	((((u_int32_t *) (a))[0] & htonl (0xffc00000)) == htonl (0xfe800000))
+
+#define IN6_IS_ADDR_LOOPBACK(a) \
+	(((u_int32_t *) (a))[0] == 0 && ((u_int32_t *) (a))[1] == 0 && \
+	 ((u_int32_t *) (a))[2] == 0 && ((u_int32_t *) (a))[3] == htonl (1))
+#endif /* __MINGW32__ */
+
+#define ip6_vfc   ip6_ctlun.ip6_un2_vfc
+#define ip6_flow  ip6_ctlun.ip6_un1.ip6_un1_flow
+#define ip6_plen  ip6_ctlun.ip6_un1.ip6_un1_plen
+#define ip6_nxt   ip6_ctlun.ip6_un1.ip6_un1_nxt
+#define ip6_hlim  ip6_ctlun.ip6_un1.ip6_un1_hlim
+#define ip6_hops  ip6_ctlun.ip6_un1.ip6_un1_hlim
+
+#define nd_rd_type               nd_rd_hdr.icmp6_type
+#define nd_rd_code               nd_rd_hdr.icmp6_code
+#define nd_rd_cksum              nd_rd_hdr.icmp6_cksum
+#define nd_rd_reserved           nd_rd_hdr.icmp6_data32[0]
+
+/*
+ *	IPV6 extension headers
+ */
+#define IPPROTO_HOPOPTS		0	/* IPv6 hop-by-hop options	*/
+#define IPPROTO_IPV6		41  /* IPv6 header.  */
+#define IPPROTO_ROUTING		43	/* IPv6 routing header		*/
+#define IPPROTO_FRAGMENT	44	/* IPv6 fragmentation header	*/
+#define IPPROTO_ESP		50	/* encapsulating security payload */
+#define IPPROTO_AH		51	/* authentication header	*/
+#define IPPROTO_ICMPV6		58	/* ICMPv6			*/
+#define IPPROTO_NONE		59	/* IPv6 no next header		*/
+#define IPPROTO_DSTOPTS		60	/* IPv6 destination options	*/
+#define IPPROTO_PIM			103 /* Protocol Independent Multicast.  */
+
+#define	 IPV6_RTHDR_TYPE_0 0
+
+/* Option types and related macros */
+#define IP6OPT_PAD1		0x00	/* 00 0 00000 */
+#define IP6OPT_PADN		0x01	/* 00 0 00001 */
+#define IP6OPT_JUMBO		0xC2	/* 11 0 00010 = 194 */
+#define IP6OPT_JUMBO_LEN	6
+#define IP6OPT_ROUTER_ALERT	0x05	/* 00 0 00101 */
+
+#define IP6OPT_RTALERT_LEN	4
+#define IP6OPT_RTALERT_MLD	0	/* Datagram contains an MLD message */
+#define IP6OPT_RTALERT_RSVP	1	/* Datagram contains an RSVP message */
+#define IP6OPT_RTALERT_ACTNET	2 	/* contains an Active Networks msg */
+#define IP6OPT_MINLEN		2
+
+#define IP6OPT_BINDING_UPDATE	0xc6	/* 11 0 00110 */
+#define IP6OPT_BINDING_ACK	0x07	/* 00 0 00111 */
+#define IP6OPT_BINDING_REQ	0x08	/* 00 0 01000 */
+#define IP6OPT_HOME_ADDRESS	0xc9	/* 11 0 01001 */
+#define IP6OPT_EID		0x8a	/* 10 0 01010 */
+
+#define IP6OPT_TYPE(o)		((o) & 0xC0)
+#define IP6OPT_TYPE_SKIP	0x00
+#define IP6OPT_TYPE_DISCARD	0x40
+#define IP6OPT_TYPE_FORCEICMP	0x80
+#define IP6OPT_TYPE_ICMP	0xC0
+
+#define IP6OPT_MUTABLE		0x20
+
+
+#if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF)
+#ifndef EAI_ADDRFAMILY
+struct addrinfo {
+	int	ai_flags;	/* AI_PASSIVE, AI_CANONNAME */
+	int	ai_family;	/* PF_xxx */
+	int	ai_socktype;	/* SOCK_xxx */
+	int	ai_protocol;	/* 0 or IPPROTO_xxx for IPv4 and IPv6 */
+	size_t	ai_addrlen;	/* length of ai_addr */
+	char	*ai_canonname;	/* canonical name for hostname */
+	struct sockaddr *ai_addr;	/* binary address */
+	struct addrinfo *ai_next;	/* next structure in linked list */
+};
+#endif
+#endif /* __MINGW32__ */
diff --git a/Win32/Include/net/if.h b/Win32/Include/net/if.h
new file mode 100644
index 0000000..bf926b6
--- /dev/null
+++ b/Win32/Include/net/if.h
@@ -0,0 +1,230 @@
+/*
+ * Copyright (c) 1982, 1986, 1989, 1993
+ *	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 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.
+ *
+ *	@(#)if.h	8.1 (Berkeley) 6/10/93
+ * $FreeBSD: src/sys/net/if.h,v 1.49.2.1 1999/08/29 16:28:15 peter Exp $
+ */
+
+#ifndef _NET_IF_H_
+#define	_NET_IF_H_
+ 
+/*
+ * <net/if.h> does not depend on <sys/time.h> on most other systems.  This
+ * helps userland compatability.  (struct timeval ifi_lastchange)
+ */
+#ifndef KERNEL
+#include <pcap-stdinc.h>
+#endif
+
+/*
+ * Structure describing information about an interface
+ * which may be of interest to management entities.
+ */
+struct if_data {
+	/* generic interface information */
+	u_char	ifi_type;		/* ethernet, tokenring, etc */
+	u_char	ifi_physical;		/* e.g., AUI, Thinnet, 10base-T, etc */
+	u_char	ifi_addrlen;		/* media address length */
+	u_char	ifi_hdrlen;		/* media header length */
+	u_char	ifi_recvquota;		/* polling quota for receive intrs */
+	u_char	ifi_xmitquota;		/* polling quota for xmit intrs */
+	u_long	ifi_mtu;		/* maximum transmission unit */
+	u_long	ifi_metric;		/* routing metric (external only) */
+	u_long	ifi_baudrate;		/* linespeed */
+	/* volatile statistics */
+	u_long	ifi_ipackets;		/* packets received on interface */
+	u_long	ifi_ierrors;		/* input errors on interface */
+	u_long	ifi_opackets;		/* packets sent on interface */
+	u_long	ifi_oerrors;		/* output errors on interface */
+	u_long	ifi_collisions;		/* collisions on csma interfaces */
+	u_long	ifi_ibytes;		/* total number of octets received */
+	u_long	ifi_obytes;		/* total number of octets sent */
+	u_long	ifi_imcasts;		/* packets received via multicast */
+	u_long	ifi_omcasts;		/* packets sent via multicast */
+	u_long	ifi_iqdrops;		/* dropped on input, this interface */
+	u_long	ifi_noproto;		/* destined for unsupported protocol */
+	u_long	ifi_recvtiming;		/* usec spent receiving when timing */
+	u_long	ifi_xmittiming;		/* usec spent xmitting when timing */
+	struct	timeval ifi_lastchange;	/* time of last administrative change */
+};
+
+/* ws2tcpip.h has interface flags: IFF_* */
+#if 0
+#define	IFF_UP		0x1		/* interface is up */
+#define	IFF_BROADCAST	0x2		/* broadcast address valid */
+#define	IFF_DEBUG	0x4		/* turn on debugging */
+#define	IFF_LOOPBACK	0x8		/* is a loopback net */
+#define	IFF_POINTOPOINT	0x10		/* interface is point-to-point link */
+/*#define IFF_NOTRAILERS 0x20		 * obsolete: avoid use of trailers */
+#define	IFF_RUNNING	0x40		/* resources allocated */
+#define	IFF_NOARP	0x80		/* no address resolution protocol */
+#define	IFF_PROMISC	0x100		/* receive all packets */
+#define	IFF_ALLMULTI	0x200		/* receive all multicast packets */
+#define	IFF_OACTIVE	0x400		/* transmission in progress */
+#define	IFF_SIMPLEX	0x800		/* can't hear own transmissions */
+#define	IFF_LINK0	0x1000		/* per link layer defined bit */
+#define	IFF_LINK1	0x2000		/* per link layer defined bit */
+#define	IFF_LINK2	0x4000		/* per link layer defined bit */
+#define	IFF_ALTPHYS	IFF_LINK2	/* use alternate physical connection */
+#define	IFF_MULTICAST	0x8000		/* supports multicast */
+#endif /* 0 */
+
+/* flags set internally only: */
+#define	IFF_CANTCHANGE \
+	(IFF_BROADCAST|IFF_POINTOPOINT|IFF_RUNNING|IFF_OACTIVE|\
+	    IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI)
+
+#define	IFQ_MAXLEN	50
+#define	IFNET_SLOWHZ	1		/* granularity is 1 second */
+
+/*
+ * Message format for use in obtaining information about interfaces
+ * from getkerninfo and the routing socket
+ */
+struct if_msghdr {
+	u_short	ifm_msglen;	/* to skip over non-understood messages */
+	u_char	ifm_version;	/* future binary compatability */
+	u_char	ifm_type;	/* message type */
+	int	ifm_addrs;	/* like rtm_addrs */
+	int	ifm_flags;	/* value of if_flags */
+	u_short	ifm_index;	/* index for associated ifp */
+	struct	if_data ifm_data;/* statistics and other data about if */
+};
+
+/*
+ * Message format for use in obtaining information about interface addresses
+ * from getkerninfo and the routing socket
+ */
+struct ifa_msghdr {
+	u_short	ifam_msglen;	/* to skip over non-understood messages */
+	u_char	ifam_version;	/* future binary compatability */
+	u_char	ifam_type;	/* message type */
+	int	ifam_addrs;	/* like rtm_addrs */
+	int	ifam_flags;	/* value of ifa_flags */
+	u_short	ifam_index;	/* index for associated ifp */
+	int	ifam_metric;	/* value of ifa_metric */
+};
+
+/*
+ * Message format for use in obtaining information about multicast addresses
+ * from the routing socket
+ */
+struct ifma_msghdr {
+	u_short	ifmam_msglen;	/* to skip over non-understood messages */
+	u_char	ifmam_version;	/* future binary compatability */
+	u_char	ifmam_type;	/* message type */
+	int	ifmam_addrs;	/* like rtm_addrs */
+	int	ifmam_flags;	/* value of ifa_flags */
+	u_short	ifmam_index;	/* index for associated ifp */
+};
+
+/*
+ * Interface request structure used for socket
+ * ioctl's.  All interface ioctl's must have parameter
+ * definitions which begin with ifr_name.  The
+ * remainder may be interface specific.
+ */
+struct	ifreq {
+#define	IFNAMSIZ	16
+	char	ifr_name[IFNAMSIZ];		/* if name, e.g. "en0" */
+	union {
+		struct	sockaddr ifru_addr;
+		struct	sockaddr ifru_dstaddr;
+		struct	sockaddr ifru_broadaddr;
+		short	ifru_flags;
+		int	ifru_metric;
+		int	ifru_mtu;
+		int	ifru_phys;
+		int	ifru_media;
+		caddr_t	ifru_data;
+	} ifr_ifru;
+#define	ifr_addr	ifr_ifru.ifru_addr	/* address */
+#define	ifr_dstaddr	ifr_ifru.ifru_dstaddr	/* other end of p-to-p link */
+#define	ifr_broadaddr	ifr_ifru.ifru_broadaddr	/* broadcast address */
+#define	ifr_flags	ifr_ifru.ifru_flags	/* flags */
+#define	ifr_metric	ifr_ifru.ifru_metric	/* metric */
+#define	ifr_mtu		ifr_ifru.ifru_mtu	/* mtu */
+#define ifr_phys	ifr_ifru.ifru_phys	/* physical wire */
+#define ifr_media	ifr_ifru.ifru_media	/* physical media */
+#define	ifr_data	ifr_ifru.ifru_data	/* for use by interface */
+};
+
+#define	_SIZEOF_ADDR_IFREQ(ifr) \
+	((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \
+	 (sizeof(struct ifreq) - sizeof(struct sockaddr) + \
+	  (ifr).ifr_addr.sa_len) : sizeof(struct ifreq))
+
+struct ifaliasreq {
+	char	ifra_name[IFNAMSIZ];		/* if name, e.g. "en0" */
+	struct	sockaddr ifra_addr;
+	struct	sockaddr ifra_broadaddr;
+	struct	sockaddr ifra_mask;
+};
+
+struct ifmediareq {
+	char	ifm_name[IFNAMSIZ];	/* if name, e.g. "en0" */
+	int	ifm_current;		/* current media options */
+	int	ifm_mask;		/* don't care mask */
+	int	ifm_status;		/* media status */
+	int	ifm_active;		/* active options */
+	int	ifm_count;		/* # entries in ifm_ulist array */
+	int	*ifm_ulist;		/* media words */
+};
+/*
+ * Structure used in SIOCGIFCONF request.
+ * Used to retrieve interface configuration
+ * for machine (useful for programs which
+ * must know all networks accessible).
+ */
+struct	ifconf {
+	int	ifc_len;		/* size of associated buffer */
+	union {
+		caddr_t	ifcu_buf;
+		struct	ifreq *ifcu_req;
+	} ifc_ifcu;
+#define	ifc_buf	ifc_ifcu.ifcu_buf	/* buffer address */
+#define	ifc_req	ifc_ifcu.ifcu_req	/* array of structures returned */
+};
+
+#ifdef KERNEL
+#ifdef MALLOC_DECLARE
+MALLOC_DECLARE(M_IFADDR);
+MALLOC_DECLARE(M_IFMADDR);
+#endif
+#endif
+
+/* XXX - this should go away soon */
+#ifdef KERNEL
+#include <net/if_var.h>
+#endif
+
+#endif /* !_NET_IF_H_ */
diff --git a/Win32/Include/net/netdb.h b/Win32/Include/net/netdb.h
new file mode 100644
index 0000000..b9d45ac
--- /dev/null
+++ b/Win32/Include/net/netdb.h
@@ -0,0 +1,164 @@
+/*-
+ * Copyright (c) 1980, 1983, 1988, 1993
+ *     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 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.
+ *
+ *	@(#)netdb.h	8.1 (Berkeley) 6/2/93
+ *      netdb.h,v 1.4 1995/08/14 04:05:04 hjl Exp
+ * -
+ * Portions Copyright (c) 1993 by Digital Equipment Corporation.
+ *
+ * Permission to use, copy, modify and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies, and that
+ * the name of Digital Equipment Corporation not be used in advertising or
+ * publicity pertaining to distribution of the document or software without
+ * specific, written prior permission.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
+ * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ * -
+ * --Copyright--
+ */
+
+#ifndef _NETDB_H_
+#define _NETDB_H_
+
+#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) || defined(_REENTRANT)
+#include <stdio.h>
+#include <netinet/in.h>
+#endif
+
+#include <winsock2.h>
+#include <net/paths.h>
+
+#define _PATH_HEQUIV	__PATH_ETC_INET"/hosts.equiv"
+#define _PATH_HOSTS	__PATH_ETC_INET"/hosts"
+#define _PATH_NETWORKS	__PATH_ETC_INET"/networks"
+#define _PATH_PROTOCOLS	__PATH_ETC_INET"/protocols"
+#define _PATH_SERVICES	__PATH_ETC_INET"/services"
+#define _PATH_RESCONF	__PATH_ETC_INET"/resolv.conf"
+#define _PATH_RPC	__PATH_ETC_INET"/rpc"
+
+struct rpcent {
+	char	*r_name;	/* name of server for this rpc program */
+	char	**r_aliases;	/* alias list */
+	int	r_number;	/* rpc program number */
+};
+
+#ifndef WIN32
+#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) || defined(_REENTRANT)
+
+#define __NETDB_MAXALIASES	35
+#define __NETDB_MAXADDRS	35
+
+/*
+ * Error return codes from gethostbyname() and gethostbyaddr()
+ * (left in extern int h_errno).
+ */
+#define h_errno		(*__h_errno_location ())
+#else
+extern int h_errno;
+#endif
+#endif
+
+#define	NETDB_INTERNAL -1 /* see errno */
+#define	NETDB_SUCCESS   0 /* no problem */
+
+//#include <features.h>
+
+void		endhostent (void);
+void		endnetent (void);
+void		endprotoent (void);
+void		endservent (void);
+void		endrpcent (void);
+struct hostent	*gethostent (void);
+struct netent	*getnetbyaddr (long, int); /* u_long? */
+struct netent	*getnetbyname (const char *);
+struct netent	*getnetent (void);
+struct protoent	*getprotoent (void);
+struct servent	*getservent (void);
+struct rpcent	*getrpcent (void);
+struct rpcent	*getrpcbyname (const char *);
+struct rpcent	*getrpcbynumber (int);
+void		herror (const char *);
+void		sethostent (int);
+/* void		sethostfile (const char *); */
+void		setnetent (int);
+void		setprotoent (int);
+void		setservent (int);
+void		setrpcent (int);
+
+#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) || defined(_REENTRANT)
+struct hostent	*gethostbyaddr_r (const char *__addr,
+			int __length, int __type,
+			struct hostent *__result,
+			char *__buffer, int __buflen, int *__h_errnop);
+struct hostent	*gethostbyname_r (const char * __name,
+			struct hostent *__result, char *__buffer,
+			int __buflen, int *__h_errnop);
+struct hostent	*gethostent_r (struct hostent *__result,
+			char *__buffer, int __buflen, int *__h_errnop);
+struct netent	*getnetbyaddr_r (long __net, int __type,
+			struct netent *__result, char *__buffer,
+			int __buflen);
+struct netent	*getnetbyname_r (const char * __name,
+			struct netent *__result, char *__buffer,
+			int __buflen);
+struct netent	*getnetent_r (struct netent *__result,
+			char *__buffer, int __buflen);
+struct protoent	*getprotobyname_r (const char * __name,
+			struct protoent *__result, char *__buffer,
+			int __buflen);
+struct protoent	*getprotobynumber_r (int __proto,
+			struct protoent *__result, char *__buffer,
+			int __buflen);
+struct protoent	*getprotoent_r (struct protoent *__result,
+			char *__buffer, int __buflen);
+struct servent	*getservbyname_r (const char * __name,
+			const char *__proto, struct servent *__result,
+			char *__buffer, int __buflen);
+struct servent	*getservbyport_r (int __port,
+			const char *__proto, struct servent *__result,
+			char *__buffer, int __buflen);
+struct servent	*getservent_r (struct servent *__result,
+			char *__buffer, int __buflen);
+
+int *__h_errno_location (void);
+
+#endif
+
+#endif /* !_NETDB_H_ */
diff --git a/Win32/Include/net/paths.h b/Win32/Include/net/paths.h
new file mode 100644
index 0000000..987de4f
--- /dev/null
+++ b/Win32/Include/net/paths.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 1989 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 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.
+ *
+ *	@(#)paths.h	5.15 (Berkeley) 5/29/91
+ */
+
+#ifndef _PATHS_H_
+#define	_PATHS_H_
+
+#if 0
+#define	__PATH_ETC_INET	"/usr/etc/inet"
+#else
+#define	__PATH_ETC_INET	"/etc"
+#endif
+
+/* Default search path. */
+#define	_PATH_DEFPATH		"/usr/local/bin:/usr/bin:/bin:."
+#define _PATH_DEFPATH_ROOT	"/sbin:/bin:/usr/sbin:/usr/bin"
+
+#define	_PATH_BSHELL	"/bin/sh"
+#define	_PATH_CONSOLE	"/dev/console"
+#define	_PATH_CSHELL	"/bin/csh"
+#define	_PATH_DEVDB	"/var/run/dev.db"
+#define	_PATH_DEVNULL	"/dev/null"
+#define	_PATH_DRUM	"/dev/drum"
+#define	_PATH_HEQUIV	__PATH_ETC_INET"/hosts.equiv"
+#define	_PATH_KMEM	"/dev/kmem"
+#define	_PATH_MAILDIR	"/var/spool/mail"
+#define	_PATH_MAN	"/usr/man"
+#define	_PATH_MEM	"/dev/mem"
+#define	_PATH_LOGIN	"/bin/login"
+#define	_PATH_NOLOGIN	"/etc/nologin"
+#define	_PATH_SENDMAIL	"/usr/sbin/sendmail"
+#define	_PATH_SHELLS	"/etc/shells"
+#define	_PATH_TTY	"/dev/tty"
+#define	_PATH_UNIX	"/vmlinux"
+#define	_PATH_VI	"/usr/bin/vi"
+
+/* Provide trailing slash, since mostly used for building pathnames. */
+#define	_PATH_DEV	"/dev/"
+#define	_PATH_TMP	"/tmp/"
+#define	_PATH_VARRUN	"/var/run/"
+#define	_PATH_VARTMP	"/var/tmp/"
+
+#define _PATH_KLOG	"/proc/kmsg"
+#define _PATH_LOGCONF	__PATH_ETC_INET"/syslog.conf"
+#if 0
+#define _PATH_LOGPID	__PATH_ETC_INET"/syslog.pid"
+#else
+#define _PATH_LOGPID	"/var/run/syslog.pid"
+#endif
+#define _PATH_LOG	"/dev/log"
+#define _PATH_CONSOLE	"/dev/console"
+
+#if 0
+#define _PATH_UTMP	"/var/adm/utmp"
+#define _PATH_WTMP	"/var/adm/wtmp"
+#define _PATH_LASTLOG	"/var/adm/lastlog"
+#else
+#define _PATH_UTMP	"/var/run/utmp"
+#define _PATH_WTMP	"/var/log/wtmp"
+#define _PATH_LASTLOG	"/var/log/lastlog"
+#endif
+
+#define _PATH_LOCALE	"/usr/lib/locale"
+
+#define _PATH_RWHODIR	"/var/spool/rwho"
+
+#if _MIT_POSIX_THREADS
+/* For the MIT pthreads */
+#define _PATH_PTY	"/dev/"
+#define _PATH_TZDIR	"/usr/lib/zoneinfo"
+#define _PATH_TZFILE	"/usr/lib/zoneinfo/localtime"
+#endif
+
+#endif /* !_PATHS_H_ */
diff --git a/Win32/Include/sockstorage.h b/Win32/Include/sockstorage.h
new file mode 100644
index 0000000..557eb4d
--- /dev/null
+++ b/Win32/Include/sockstorage.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 1999 WIDE Project.
+ * 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. Neither the name of the project 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 PROJECT 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 PROJECT 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.
+ */
+struct sockaddr_storage {
+#ifdef HAVE_SOCKADDR_SA_LEN
+	u_int8_t __ss_len;
+	u_int8_t __ss_family;
+	u_int8_t fill[126];
+#else
+	u_int8_t __ss_family;
+	u_int8_t fill[127];
+#endif /* HAVE_SOCKADDR_SA_LEN */
+};
diff --git a/Win32/Prj/libpcap.dsp b/Win32/Prj/libpcap.dsp
new file mode 100644
index 0000000..17e5a70
--- /dev/null
+++ b/Win32/Prj/libpcap.dsp
@@ -0,0 +1,168 @@
+# Microsoft Developer Studio Project File - Name="libpcap" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Static Library" 0x0104
+
+CFG=libpcap - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "libpcap.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "libpcap.mak" CFG="libpcap - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "libpcap - Win32 Release" (based on "Win32 (x86) Static Library")
+!MESSAGE "libpcap - Win32 Debug" (based on "Win32 (x86) Static Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "libpcap - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../" /I "../../lbl/" /I "../../bpf/" /I "../include/" /I "../../../../common" /I "../../../../dag/include" /I "../../../../dag/drv/windows" /D "NDEBUG" /D "YY_NEVER_INTERACTIVE" /D yylval=pcap_lval /D "_USRDLL" /D "LIBPCAP_EXPORTS" /D "HAVE_STRERROR" /D "__STDC__" /D "INET6" /D "_WINDOWS" /D "_MBCS" /D "HAVE_ADDRINFO" /D "WIN32" /D _U_= /D "HAVE_SNPRINTF" /D "HAVE_VSNPRINTF" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+
+!ELSEIF  "$(CFG)" == "libpcap - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../" /I "../../lbl/" /I "../../bpf/" /I "../include/" /I "../../../../common" /I "../../../../dag/include" /I "../../../../dag/drv/windows" /D "_DEBUG" /D "YY_NEVER_INTERACTIVE" /D yylval=pcap_lval /D "_USRDLL" /D "LIBPCAP_EXPORTS" /D "HAVE_STRERROR" /D "__STDC__" /D "INET6" /D "_WINDOWS" /D "_MBCS" /D "HAVE_ADDRINFO" /D "WIN32" /D _U_= /D "HAVE_SNPRINTF" /D "HAVE_VSNPRINTF" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+
+!ENDIF 
+
+# Begin Target
+
+# Name "libpcap - Win32 Release"
+# Name "libpcap - Win32 Debug"
+# Begin Source File
+
+SOURCE=..\..\bpf_dump.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\bpf\net\bpf_filter.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\bpf_image.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\etherent.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\fad-win32.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\Src\ffs.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gencode.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\Src\getnetbynm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\Src\getnetent.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\Src\getservent.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\grammar.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\inet.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\Src\inet_aton.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\Src\inet_net.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\Src\inet_pton.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\nametoaddr.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\optimize.c
+# End Source File
+# Begin Source File
+
+SOURCE="..\..\Pcap-win32.c"
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\pcap.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\savefile.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\scanner.c
+# End Source File
+# End Target
+# End Project
diff --git a/Win32/Prj/libpcap.dsw b/Win32/Prj/libpcap.dsw
new file mode 100644
index 0000000..8cdff2d
--- /dev/null
+++ b/Win32/Prj/libpcap.dsw
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "libpcap"=".\libpcap.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/Win32/Src/ffs.c b/Win32/Src/ffs.c
new file mode 100644
index 0000000..099ff8e
--- /dev/null
+++ b/Win32/Src/ffs.c
@@ -0,0 +1,54 @@
+/*-
+ * Copyright (c) 1990, 1993
+ *	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 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)ffs.c	8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <string.h>
+
+/*
+ * ffs -- vax ffs instruction
+ */
+int
+ffs(mask)
+	register int mask;
+{
+	register int bit;
+
+	if (mask == 0)
+		return(0);
+	for (bit = 1; !(mask & 1); bit++)
+		mask >>= 1;
+	return(bit);
+}
diff --git a/Win32/Src/gai_strerror.c b/Win32/Src/gai_strerror.c
new file mode 100644
index 0000000..edd970b
--- /dev/null
+++ b/Win32/Src/gai_strerror.c
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
+ * 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. Neither the name of the project 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 PROJECT 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 PROJECT 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.
+ */
+
+/*
+#include <sys/cdefs.h>
+
+__FBSDID("$FreeBSD: /repoman/r/ncvs/src/lib/libc/net/gai_strerror.c,v 1.1 2005/04/06 12:45:51 ume Exp $");
+
+*/
+
+#ifdef WIN32
+
+#include <ws2tcpip.h>
+
+#else
+
+#include <netdb.h>
+
+#endif
+
+/* Entries EAI_ADDRFAMILY (1) and EAI_NODATA (7) are obsoleted, but left */
+/* for backward compatibility with userland code prior to 2553bis-02 */
+static char *ai_errlist[] = {
+	"Success",					/* 0 */
+	"Address family for hostname not supported",	/* 1 */
+	"Temporary failure in name resolution",		/* EAI_AGAIN */
+	"Invalid value for ai_flags",			/* EAI_BADFLAGS */
+	"Non-recoverable failure in name resolution",	/* EAI_FAIL */
+	"ai_family not supported",			/* EAI_FAMILY */
+	"Memory allocation failure", 			/* EAI_MEMORY */
+	"No address associated with hostname",		/* 7 */
+	"hostname nor servname provided, or not known",	/* EAI_NONAME */
+	"servname not supported for ai_socktype",	/* EAI_SERVICE */
+	"ai_socktype not supported", 			/* EAI_SOCKTYPE */
+	"System error returned in errno", 		/* EAI_SYSTEM */
+	"Invalid value for hints",			/* EAI_BADHINTS */
+	"Resolved protocol is unknown"			/* EAI_PROTOCOL */
+};
+
+#ifndef EAI_MAX
+#define EAI_MAX (sizeof(ai_errlist)/sizeof(ai_errlist[0]))
+#endif
+
+/* on MingW, gai_strerror is available. 
+   We need to compile gai_strerrorA only for Cygwin
+ */
+#ifndef gai_strerror
+
+char *
+WSAAPI gai_strerrorA(int ecode)
+{
+	if (ecode >= 0 && ecode < EAI_MAX)
+		return ai_errlist[ecode];
+	return "Unknown error";
+}
+
+#endif /* gai_strerror */
\ No newline at end of file
diff --git a/Win32/Src/getaddrinfo.c b/Win32/Src/getaddrinfo.c
new file mode 100644
index 0000000..ebfe8c2
--- /dev/null
+++ b/Win32/Src/getaddrinfo.c
@@ -0,0 +1,1129 @@
+/*
+ * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
+ * 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. Neither the name of the project 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 PROJECT 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 PROJECT 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.
+ */
+
+/*
+ * "#ifdef FAITH" part is local hack for supporting IPv4-v6 translator.
+ *
+ * Issues to be discussed:
+ * - Thread safe-ness must be checked.
+ * - Return values.  There are nonstandard return values defined and used
+ *   in the source code.  This is because RFC2553 is silent about which error
+ *   code must be returned for which situation.
+ * Note:
+ * - We use getipnodebyname() just for thread-safeness.  There's no intent
+ *   to let it do PF_UNSPEC (actually we never pass PF_UNSPEC to
+ *   getipnodebyname().
+ * - The code filters out AFs that are not supported by the kernel,
+ *   when globbing NULL hostname (to loopback, or wildcard).  Is it the right
+ *   thing to do?  What is the relationship with post-RFC2553 AI_ADDRCONFIG
+ *   in ai_flags?
+ */
+
+/*
+ * Mingw64 has its own implementation of getaddrinfo, mingw32 no
+ */
+#ifndef __MINGW64__
+ 
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif 
+
+#ifndef lint
+static const char rcsid[] _U_ =
+     "@(#) $Header: /tcpdump/master/libpcap/Win32/Src/getaddrinfo.c,v 1.3 2008-09-15 23:37:51 guy Exp $";
+#endif
+
+#include <pcap-stdinc.h>
+#if 0
+#include <sys/sysctl.h>
+#endif
+#ifndef __MINGW32__
+#include <arpa/nameser.h>
+#endif
+#include <string.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <errno.h>
+
+#ifndef HAVE_PORTABLE_PROTOTYPE
+#include "cdecl_ext.h"
+#endif 
+
+#ifndef HAVE_U_INT32_T
+#include "bittypes.h"
+#endif 
+
+#ifndef HAVE_SOCKADDR_STORAGE
+#ifndef __MINGW32__
+#include "sockstorage.h"
+#endif
+#endif 
+
+#ifdef NEED_ADDRINFO_H
+#include "addrinfo.h"
+#ifdef WIN32
+#include "ip6_misc.h"
+#endif
+#endif
+
+
+#if defined(__KAME__) && defined(INET6)
+# define FAITH
+#endif
+
+#define SUCCESS 0
+#define ANY 0
+#define YES 1
+#define NO  0
+
+#ifdef FAITH
+static int translate = NO;
+static struct in6_addr faith_prefix = IN6ADDR_ANY_INIT;
+#endif
+
+static const char in_addrany[] = { 0, 0, 0, 0 };
+static const char in6_addrany[] = {
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+static const char in_loopback[] = { 127, 0, 0, 1 }; 
+static const char in6_loopback[] = {
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
+};
+
+struct sockinet {
+	u_char	si_len;
+	u_char	si_family;
+	u_short	si_port;
+	u_int32_t si_scope_id;
+};
+
+static const struct afd {
+	int a_af;
+	int a_addrlen;
+	int a_socklen;
+	int a_off;
+	const char *a_addrany;
+	const char *a_loopback;	
+	int a_scoped;
+} afdl [] = {
+#ifdef INET6
+	{PF_INET6, sizeof(struct in6_addr),
+	 sizeof(struct sockaddr_in6),
+	 offsetof(struct sockaddr_in6, sin6_addr),
+	 in6_addrany, in6_loopback, 1},
+#endif
+	{PF_INET, sizeof(struct in_addr),
+	 sizeof(struct sockaddr_in),
+	 offsetof(struct sockaddr_in, sin_addr),
+	 in_addrany, in_loopback, 0},
+	{0, 0, 0, 0, NULL, NULL, 0},
+};
+
+struct explore {
+	int e_af;
+	int e_socktype;
+	int e_protocol;
+	const char *e_protostr;
+	int e_wild;
+#define WILD_AF(ex)		((ex)->e_wild & 0x01)
+#define WILD_SOCKTYPE(ex)	((ex)->e_wild & 0x02)
+#define WILD_PROTOCOL(ex)	((ex)->e_wild & 0x04)
+};
+
+static const struct explore explore[] = {
+#if 0
+	{ PF_LOCAL, 0, ANY, ANY, NULL, 0x01 },
+#endif
+#ifdef INET6
+	{ PF_INET6, SOCK_DGRAM, IPPROTO_UDP, "udp", 0x07 },
+	{ PF_INET6, SOCK_STREAM, IPPROTO_TCP, "tcp", 0x07 },
+	{ PF_INET6, SOCK_RAW, ANY, NULL, 0x05 },
+#endif
+	{ PF_INET, SOCK_DGRAM, IPPROTO_UDP, "udp", 0x07 },
+	{ PF_INET, SOCK_STREAM, IPPROTO_TCP, "tcp", 0x07 },
+	{ PF_INET, SOCK_RAW, ANY, NULL, 0x05 },
+	{ -1, 0, 0, NULL, 0 },
+};
+
+#ifdef INET6
+#define PTON_MAX	16
+#else
+#define PTON_MAX	4
+#endif
+
+
+static int str_isnumber __P((const char *));
+static int explore_fqdn __P((const struct addrinfo *, const char *,
+	const char *, struct addrinfo **));
+static int explore_null __P((const struct addrinfo *, const char *,
+	const char *, struct addrinfo **));
+static int explore_numeric __P((const struct addrinfo *, const char *,
+	const char *, struct addrinfo **));
+static int explore_numeric_scope __P((const struct addrinfo *, const char *,
+	const char *, struct addrinfo **));
+static int get_name __P((const char *, const struct afd *, struct addrinfo **,
+	char *, const struct addrinfo *, const char *));
+static int get_canonname __P((const struct addrinfo *,
+	struct addrinfo *, const char *));
+static struct addrinfo *get_ai __P((const struct addrinfo *,
+	const struct afd *, const char *));
+static int get_portmatch __P((const struct addrinfo *, const char *));
+static int get_port __P((struct addrinfo *, const char *, int));
+static const struct afd *find_afd __P((int));
+
+static char *ai_errlist[] = {
+	"Success",
+	"Address family for hostname not supported",	/* EAI_ADDRFAMILY */
+	"Temporary failure in name resolution",		/* EAI_AGAIN      */
+	"Invalid value for ai_flags",		       	/* EAI_BADFLAGS   */
+	"Non-recoverable failure in name resolution", 	/* EAI_FAIL       */
+	"ai_family not supported",			/* EAI_FAMILY     */
+	"Memory allocation failure", 			/* EAI_MEMORY     */
+	"No address associated with hostname", 		/* EAI_NODATA     */
+	"hostname nor servname provided, or not known",	/* EAI_NONAME     */
+	"servname not supported for ai_socktype",	/* EAI_SERVICE    */
+	"ai_socktype not supported", 			/* EAI_SOCKTYPE   */
+	"System error returned in errno", 		/* EAI_SYSTEM     */
+	"Invalid value for hints",			/* EAI_BADHINTS	  */
+	"Resolved protocol is unknown",			/* EAI_PROTOCOL   */
+	"Unknown error", 				/* EAI_MAX        */
+};
+
+/* XXX macros that make external reference is BAD. */
+
+#define GET_AI(ai, afd, addr) \
+do { \
+	/* external reference: pai, error, and label free */ \
+	(ai) = get_ai(pai, (afd), (addr)); \
+	if ((ai) == NULL) { \
+		error = EAI_MEMORY; \
+		goto free; \
+	} \
+} while (0)
+
+#define GET_PORT(ai, serv) \
+do { \
+	/* external reference: error and label free */ \
+	error = get_port((ai), (serv), 0); \
+	if (error != 0) \
+		goto free; \
+} while (0)
+
+#define GET_CANONNAME(ai, str) \
+do { \
+	/* external reference: pai, error and label free */ \
+	error = get_canonname(pai, (ai), (str)); \
+	if (error != 0) \
+		goto free; \
+} while (0)
+
+#define ERR(err) \
+do { \
+	/* external reference: error, and label bad */ \
+	error = (err); \
+	goto bad; \
+} while (0)
+
+#define MATCH_FAMILY(x, y, w) \
+	((x) == (y) || ((w) && ((x) == PF_UNSPEC || (y) == PF_UNSPEC)))
+#define MATCH(x, y, w) \
+	((x) == (y) || ((w) && ((x) == ANY || (y) == ANY)))
+
+#if  defined(DEFINE_ADDITIONAL_IPV6_STUFF)
+char *
+gai_strerror(ecode)
+	int ecode;
+{
+	if (ecode < 0 || ecode > EAI_MAX)
+		ecode = EAI_MAX;
+	return ai_errlist[ecode];
+}
+#endif
+
+void
+freeaddrinfo(ai)
+	struct addrinfo *ai;
+{
+	struct addrinfo *next;
+
+	do {
+		next = ai->ai_next;
+		if (ai->ai_canonname)
+			free(ai->ai_canonname);
+		/* no need to free(ai->ai_addr) */
+		free(ai);
+	} while ((ai = next) != NULL);
+}
+
+static int
+str_isnumber(p)
+	const char *p;
+{
+	char *q = (char *)p;
+	while (*q) {
+		if (! isdigit(*q))
+			return NO;
+		q++;
+	}
+	return YES;
+}
+
+int
+getaddrinfo(hostname, servname, hints, res)
+	const char *hostname, *servname;
+	const struct addrinfo *hints;
+	struct addrinfo **res;
+{
+	struct addrinfo sentinel;
+	struct addrinfo *cur;
+	int error = 0;
+	struct addrinfo ai;
+	struct addrinfo ai0;
+	struct addrinfo *pai;
+	const struct afd *afd;
+	const struct explore *ex;
+
+#ifdef FAITH
+	static int firsttime = 1;
+
+	if (firsttime) {
+		/* translator hack */
+		char *q = getenv("GAI");
+		if (q && inet_pton(AF_INET6, q, &faith_prefix) == 1)
+			translate = YES;
+		firsttime = 0;
+	}
+#endif
+
+	sentinel.ai_next = NULL;
+	cur = &sentinel;
+	pai = &ai;
+	pai->ai_flags = 0;
+	pai->ai_family = PF_UNSPEC;
+	pai->ai_socktype = ANY;
+	pai->ai_protocol = ANY;
+	pai->ai_addrlen = 0;
+	pai->ai_canonname = NULL;
+	pai->ai_addr = NULL;
+	pai->ai_next = NULL;
+	
+	if (hostname == NULL && servname == NULL)
+		return EAI_NONAME;
+	if (hints) {
+		/* error check for hints */
+		if (hints->ai_addrlen || hints->ai_canonname ||
+		    hints->ai_addr || hints->ai_next)
+			ERR(EAI_BADHINTS); /* xxx */
+		if (hints->ai_flags & ~AI_MASK)
+			ERR(EAI_BADFLAGS);
+		switch (hints->ai_family) {
+		case PF_UNSPEC:
+		case PF_INET:
+#ifdef INET6
+		case PF_INET6:
+#endif
+			break;
+		default:
+			ERR(EAI_FAMILY);
+		}
+		memcpy(pai, hints, sizeof(*pai));
+
+		/*
+		 * if both socktype/protocol are specified, check if they
+		 * are meaningful combination.
+		 */
+		if (pai->ai_socktype != ANY && pai->ai_protocol != ANY) {
+			for (ex = explore; ex->e_af >= 0; ex++) {
+				if (pai->ai_family != ex->e_af)
+					continue;
+				if (ex->e_socktype == ANY)
+					continue;
+				if (ex->e_protocol == ANY)
+					continue;
+				if (pai->ai_socktype == ex->e_socktype
+				 && pai->ai_protocol != ex->e_protocol) {
+					ERR(EAI_BADHINTS);
+				}
+			}
+		}
+	}
+
+	/*
+	 * check for special cases.  (1) numeric servname is disallowed if
+	 * socktype/protocol are left unspecified. (2) servname is disallowed
+	 * for raw and other inet{,6} sockets.
+	 */
+	if (MATCH_FAMILY(pai->ai_family, PF_INET, 1)
+#ifdef PF_INET6
+	 || MATCH_FAMILY(pai->ai_family, PF_INET6, 1)
+#endif
+	    ) {
+		ai0 = *pai;
+
+		if (pai->ai_family == PF_UNSPEC) {
+#ifdef PF_INET6
+			pai->ai_family = PF_INET6;
+#else
+			pai->ai_family = PF_INET;
+#endif
+		}
+		error = get_portmatch(pai, servname);
+		if (error)
+			ERR(error);
+
+		*pai = ai0;
+	}
+
+	ai0 = *pai;
+
+	/* NULL hostname, or numeric hostname */
+	for (ex = explore; ex->e_af >= 0; ex++) {
+		*pai = ai0;
+
+		if (!MATCH_FAMILY(pai->ai_family, ex->e_af, WILD_AF(ex)))
+			continue;
+		if (!MATCH(pai->ai_socktype, ex->e_socktype, WILD_SOCKTYPE(ex)))
+			continue;
+		if (!MATCH(pai->ai_protocol, ex->e_protocol, WILD_PROTOCOL(ex)))
+			continue;
+
+		if (pai->ai_family == PF_UNSPEC)
+			pai->ai_family = ex->e_af;
+		if (pai->ai_socktype == ANY && ex->e_socktype != ANY)
+			pai->ai_socktype = ex->e_socktype;
+		if (pai->ai_protocol == ANY && ex->e_protocol != ANY)
+			pai->ai_protocol = ex->e_protocol;
+
+		if (hostname == NULL)
+			error = explore_null(pai, hostname, servname, &cur->ai_next);
+		else
+			error = explore_numeric_scope(pai, hostname, servname, &cur->ai_next);
+
+		if (error)
+			goto free;
+
+		while (cur && cur->ai_next)
+			cur = cur->ai_next;
+	}
+
+	/*
+	 * XXX
+	 * If numreic representation of AF1 can be interpreted as FQDN
+	 * representation of AF2, we need to think again about the code below.
+	 */
+	if (sentinel.ai_next)
+		goto good;
+
+	if (pai->ai_flags & AI_NUMERICHOST)
+		ERR(EAI_NONAME);
+	if (hostname == NULL)
+		ERR(EAI_NONAME);
+
+	/*
+	 * hostname as alphabetical name.
+	 * we would like to prefer AF_INET6 than AF_INET, so we'll make a
+	 * outer loop by AFs.
+	 */
+	for (afd = afdl; afd->a_af; afd++) {
+		*pai = ai0;
+
+		if (!MATCH_FAMILY(pai->ai_family, afd->a_af, 1))
+			continue;
+
+		for (ex = explore; ex->e_af >= 0; ex++) {
+			*pai = ai0;
+
+			if (pai->ai_family == PF_UNSPEC)
+				pai->ai_family = afd->a_af;
+
+			if (!MATCH_FAMILY(pai->ai_family, ex->e_af, WILD_AF(ex)))
+				continue;
+			if (!MATCH(pai->ai_socktype, ex->e_socktype,
+					WILD_SOCKTYPE(ex))) {
+				continue;
+			}
+			if (!MATCH(pai->ai_protocol, ex->e_protocol,
+					WILD_PROTOCOL(ex))) {
+				continue;
+			}
+
+			if (pai->ai_family == PF_UNSPEC)
+				pai->ai_family = ex->e_af;
+			if (pai->ai_socktype == ANY && ex->e_socktype != ANY)
+				pai->ai_socktype = ex->e_socktype;
+			if (pai->ai_protocol == ANY && ex->e_protocol != ANY)
+				pai->ai_protocol = ex->e_protocol;
+
+			error = explore_fqdn(pai, hostname, servname,
+				&cur->ai_next);
+
+			while (cur && cur->ai_next)
+				cur = cur->ai_next;
+		}
+	}
+
+	/* XXX */
+	if (sentinel.ai_next)
+		error = 0;
+
+	if (error)
+		goto free;
+	if (error == 0) {
+		if (sentinel.ai_next) {
+ good:
+			*res = sentinel.ai_next;
+			return SUCCESS;
+		} else
+			error = EAI_FAIL;
+	}
+ free:
+ bad:
+	if (sentinel.ai_next)
+		freeaddrinfo(sentinel.ai_next);
+	*res = NULL;
+	return error;
+}
+
+/*
+ * FQDN hostname, DNS lookup
+ */
+static int
+explore_fqdn(pai, hostname, servname, res)
+	const struct addrinfo *pai;
+	const char *hostname;
+	const char *servname;
+	struct addrinfo **res;
+{
+	struct hostent *hp;
+	int h_error;
+	int af;
+	char **aplist = NULL, *apbuf = NULL;
+	char *ap;
+	struct addrinfo sentinel, *cur;
+	int i;
+#ifndef USE_GETIPNODEBY
+	int naddrs;
+#endif
+	const struct afd *afd;
+	int error;
+
+	*res = NULL;
+	sentinel.ai_next = NULL;
+	cur = &sentinel;
+
+	/*
+	 * Do not filter unsupported AFs here.  We need to honor content of
+	 * databases (/etc/hosts, DNS and others).  Otherwise we cannot
+	 * replace gethostbyname() by getaddrinfo().
+	 */
+
+	/*
+	 * if the servname does not match socktype/protocol, ignore it.
+	 */
+	if (get_portmatch(pai, servname) != 0)
+		return 0;
+
+	afd = find_afd(pai->ai_family);
+
+	/*
+	 * post-RFC2553: should look at (pai->ai_flags & AI_ADDRCONFIG)
+	 * rather than hardcoding it.  we may need to add AI_ADDRCONFIG
+	 * handling code by ourselves in case we don't have getipnodebyname().
+	 */
+#ifdef USE_GETIPNODEBY
+	hp = getipnodebyname(hostname, pai->ai_family, AI_ADDRCONFIG, &h_error);
+#else
+#ifdef HAVE_GETHOSTBYNAME2
+	hp = gethostbyname2(hostname, pai->ai_family);
+#else
+	if (pai->ai_family != AF_INET)
+		return 0;
+	hp = gethostbyname(hostname);
+#ifdef HAVE_H_ERRNO
+	h_error = h_errno;
+#else
+	h_error = EINVAL;
+#endif
+#endif /*HAVE_GETHOSTBYNAME2*/
+#endif /*USE_GETIPNODEBY*/
+
+	if (hp == NULL) {
+		switch (h_error) {
+		case HOST_NOT_FOUND:
+		case NO_DATA:
+			error = EAI_NODATA;
+			break;
+		case TRY_AGAIN:
+			error = EAI_AGAIN;
+			break;
+		case NO_RECOVERY:
+		case NETDB_INTERNAL:
+		default:
+			error = EAI_FAIL;
+			break;
+		}
+	} else if ((hp->h_name == NULL) || (hp->h_name[0] == 0)
+			|| (hp->h_addr_list[0] == NULL)) {
+#ifdef USE_GETIPNODEBY
+		freehostent(hp);
+#endif
+		hp = NULL;
+		error = EAI_FAIL;
+	}
+
+	if (hp == NULL)
+		goto free;
+
+#ifdef USE_GETIPNODEBY
+	aplist = hp->h_addr_list;
+#else
+	/*
+	 * hp will be overwritten if we use gethostbyname2().
+	 * always deep copy for simplification.
+	 */
+	for (naddrs = 0; hp->h_addr_list[naddrs] != NULL; naddrs++)
+		;
+	naddrs++;
+	aplist = (char **)malloc(sizeof(aplist[0]) * naddrs);
+	apbuf = (char *)malloc(hp->h_length * naddrs);
+	if (aplist == NULL || apbuf == NULL) {
+		error = EAI_MEMORY;
+		goto free;
+	}
+	memset(aplist, 0, sizeof(aplist[0]) * naddrs);
+	for (i = 0; i < naddrs; i++) {
+		if (hp->h_addr_list[i] == NULL) {
+			aplist[i] = NULL;
+			continue;
+		}
+		memcpy(&apbuf[i * hp->h_length], hp->h_addr_list[i],
+			hp->h_length);
+		aplist[i] = &apbuf[i * hp->h_length];
+	}
+#endif
+
+	for (i = 0; aplist[i] != NULL; i++) {
+		af = hp->h_addrtype;
+		ap = aplist[i];
+#ifdef AF_INET6
+		if (af == AF_INET6
+		 && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)ap)) {
+			af = AF_INET;
+			ap = ap + sizeof(struct in6_addr)
+				- sizeof(struct in_addr);
+		}
+#endif
+
+		if (af != pai->ai_family)
+			continue;
+
+		if ((pai->ai_flags & AI_CANONNAME) == 0) {
+			GET_AI(cur->ai_next, afd, ap);
+			GET_PORT(cur->ai_next, servname);
+		} else {
+			/*
+			 * if AI_CANONNAME and if reverse lookup
+			 * fail, return ai anyway to pacify
+			 * calling application.
+			 *
+			 * XXX getaddrinfo() is a name->address
+			 * translation function, and it looks
+			 * strange that we do addr->name
+			 * translation here.
+			 */
+			get_name(ap, afd, &cur->ai_next,
+				ap, pai, servname);
+		}
+
+		while (cur && cur->ai_next)
+			cur = cur->ai_next;
+	}
+
+	*res = sentinel.ai_next;
+	return 0;
+
+free:
+#ifdef USE_GETIPNODEBY
+	if (hp)
+		freehostent(hp);
+#endif
+	if (aplist)
+		free(aplist);
+	if (apbuf)
+		free(apbuf);
+	if (sentinel.ai_next)
+		freeaddrinfo(sentinel.ai_next);
+	return error;
+}
+
+/*
+ * hostname == NULL.
+ * passive socket -> anyaddr (0.0.0.0 or ::)
+ * non-passive socket -> localhost (127.0.0.1 or ::1)
+ */
+static int
+explore_null(pai, hostname, servname, res)
+	const struct addrinfo *pai;
+	const char *hostname;
+	const char *servname;
+	struct addrinfo **res;
+{
+	int s;
+	const struct afd *afd;
+	struct addrinfo *cur;
+	struct addrinfo sentinel;
+	int error;
+
+	*res = NULL;
+	sentinel.ai_next = NULL;
+	cur = &sentinel;
+
+	/*
+	 * filter out AFs that are not supported by the kernel
+	 * XXX errno?
+	 */
+	s = socket(pai->ai_family, SOCK_DGRAM, 0);
+	if (s < 0) {
+		if (errno != EMFILE)
+			return 0;
+	} else
+		close(s);
+
+	/*
+	 * if the servname does not match socktype/protocol, ignore it.
+	 */
+	if (get_portmatch(pai, servname) != 0)
+		return 0;
+
+	afd = find_afd(pai->ai_family);
+
+	if (pai->ai_flags & AI_PASSIVE) {
+		GET_AI(cur->ai_next, afd, afd->a_addrany);
+		/* xxx meaningless?
+		 * GET_CANONNAME(cur->ai_next, "anyaddr");
+		 */
+		GET_PORT(cur->ai_next, servname);
+	} else {
+		GET_AI(cur->ai_next, afd, afd->a_loopback);
+		/* xxx meaningless?
+		 * GET_CANONNAME(cur->ai_next, "localhost");
+		 */
+		GET_PORT(cur->ai_next, servname);
+	}
+	cur = cur->ai_next;
+
+	*res = sentinel.ai_next;
+	return 0;
+
+free:
+	if (sentinel.ai_next)
+		freeaddrinfo(sentinel.ai_next);
+	return error;
+}
+
+/*
+ * numeric hostname
+ */
+static int
+explore_numeric(pai, hostname, servname, res)
+	const struct addrinfo *pai;
+	const char *hostname;
+	const char *servname;
+	struct addrinfo **res;
+{
+	const struct afd *afd;
+	struct addrinfo *cur;
+	struct addrinfo sentinel;
+	int error;
+	char pton[PTON_MAX];
+	int flags;
+
+	*res = NULL;
+	sentinel.ai_next = NULL;
+	cur = &sentinel;
+
+	/*
+	 * if the servname does not match socktype/protocol, ignore it.
+	 */
+	if (get_portmatch(pai, servname) != 0)
+		return 0;
+
+	afd = find_afd(pai->ai_family);
+	flags = pai->ai_flags;
+
+	if (inet_pton(afd->a_af, hostname, pton) == 1) {
+		u_int32_t v4a;
+#ifdef INET6
+		u_char pfx;
+#endif
+
+		switch (afd->a_af) {
+		case AF_INET:
+			v4a = (u_int32_t)ntohl(((struct in_addr *)pton)->s_addr);
+			if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a))
+				flags &= ~AI_CANONNAME;
+			v4a >>= IN_CLASSA_NSHIFT;
+			if (v4a == 0 || v4a == IN_LOOPBACKNET)
+				flags &= ~AI_CANONNAME;
+			break;
+#ifdef INET6
+		case AF_INET6:
+			pfx = ((struct in6_addr *)pton)->s6_addr[0];
+			if (pfx == 0 || pfx == 0xfe || pfx == 0xff)
+				flags &= ~AI_CANONNAME;
+			break;
+#endif
+		}
+
+		if (pai->ai_family == afd->a_af ||
+		    pai->ai_family == PF_UNSPEC /*?*/) {
+			if ((flags & AI_CANONNAME) == 0) {
+				GET_AI(cur->ai_next, afd, pton);
+				GET_PORT(cur->ai_next, servname);
+			} else {
+				/*
+				 * if AI_CANONNAME and if reverse lookup
+				 * fail, return ai anyway to pacify
+				 * calling application.
+				 *
+				 * XXX getaddrinfo() is a name->address
+				 * translation function, and it looks
+				 * strange that we do addr->name
+				 * translation here.
+				 */
+				get_name(pton, afd, &cur->ai_next,
+					pton, pai, servname);
+			}
+			while (cur && cur->ai_next)
+				cur = cur->ai_next;
+		} else 
+			ERR(EAI_FAMILY);	/*xxx*/
+	}
+
+	*res = sentinel.ai_next;
+	return 0;
+
+free:
+bad:
+	if (sentinel.ai_next)
+		freeaddrinfo(sentinel.ai_next);
+	return error;
+}
+
+/*
+ * numeric hostname with scope
+ */
+static int
+explore_numeric_scope(pai, hostname, servname, res)
+	const struct addrinfo *pai;
+	const char *hostname;
+	const char *servname;
+	struct addrinfo **res;
+{
+#ifndef SCOPE_DELIMITER
+	return explore_numeric(pai, hostname, servname, res);
+#else
+	const struct afd *afd;
+	struct addrinfo *cur;
+	int error;
+	char *cp, *hostname2 = NULL;
+	int scope;
+	struct sockaddr_in6 *sin6;
+
+	/*
+	 * if the servname does not match socktype/protocol, ignore it.
+	 */
+	if (get_portmatch(pai, servname) != 0)
+		return 0;
+
+	afd = find_afd(pai->ai_family);
+	if (!afd->a_scoped)
+		return explore_numeric(pai, hostname, servname, res);
+
+	cp = strchr(hostname, SCOPE_DELIMITER);
+	if (cp == NULL)
+		return explore_numeric(pai, hostname, servname, res);
+
+	/*
+	 * Handle special case of <scoped_address><delimiter><scope id>
+	 */
+	hostname2 = strdup(hostname);
+	if (hostname2 == NULL)
+		return EAI_MEMORY;
+	/* terminate at the delimiter */
+	hostname2[cp - hostname] = '\0';
+
+	cp++;
+	switch (pai->ai_family) {
+#ifdef INET6
+	case AF_INET6:
+		scope = if_nametoindex(cp);
+		if (scope == 0) {
+			free(hostname2);
+			return (EAI_NONAME);
+		}
+		break;
+#endif
+	}
+
+	error = explore_numeric(pai, hostname2, servname, res);
+	if (error == 0) {
+		for (cur = *res; cur; cur = cur->ai_next) {
+			if (cur->ai_family != AF_INET6)
+				continue;
+			sin6 = (struct sockaddr_in6 *)cur->ai_addr;
+			if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr) ||
+			    IN6_IS_ADDR_MC_LINKLOCAL(&sin6->sin6_addr))
+				sin6->sin6_scope_id = scope;
+		}
+	}
+
+	free(hostname2);
+
+	return error;
+#endif
+}
+
+static int
+get_name(addr, afd, res, numaddr, pai, servname)
+	const char *addr;
+	const struct afd *afd;
+	struct addrinfo **res;
+	char *numaddr;
+	const struct addrinfo *pai;
+	const char *servname;
+{
+	struct hostent *hp = NULL;
+	struct addrinfo *cur = NULL;
+	int error = 0;
+	char *ap = NULL, *cn = NULL;
+#ifdef USE_GETIPNODEBY
+	int h_error;
+
+	hp = getipnodebyaddr(addr, afd->a_addrlen, afd->a_af, &h_error);
+#else
+	hp = gethostbyaddr(addr, afd->a_addrlen, afd->a_af);
+#endif
+	if (hp && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) {
+#ifdef USE_GETIPNODEBY
+		GET_AI(cur, afd, hp->h_addr_list[0]);
+		GET_PORT(cur, servname);
+		GET_CANONNAME(cur, hp->h_name);
+#else
+		/* hp will be damaged if we use gethostbyaddr() */
+		if ((ap = (char *)malloc(hp->h_length)) == NULL) {
+			error = EAI_MEMORY;
+			goto free;
+		}
+		memcpy(ap, hp->h_addr_list[0], hp->h_length);
+		if ((cn = strdup(hp->h_name)) == NULL) {
+			error = EAI_MEMORY;
+			goto free;
+		}
+
+		GET_AI(cur, afd, ap);
+		GET_PORT(cur, servname);
+		GET_CANONNAME(cur, cn);
+		free(ap); ap = NULL;
+		free(cn); cn = NULL;
+#endif
+	} else {
+		GET_AI(cur, afd, numaddr);
+		GET_PORT(cur, servname);
+	}
+	
+#ifdef USE_GETIPNODEBY
+	if (hp)
+		freehostent(hp);
+#endif
+	*res = cur;
+	return SUCCESS;
+ free:
+	if (cur)
+		freeaddrinfo(cur);
+	if (ap)
+		free(ap);
+	if (cn)
+		free(cn);
+#ifdef USE_GETIPNODEBY
+	if (hp)
+		freehostent(hp);
+#endif
+	*res = NULL;
+	return error;
+}
+
+static int
+get_canonname(pai, ai, str)
+	const struct addrinfo *pai;
+	struct addrinfo *ai;
+	const char *str;
+{
+	if ((pai->ai_flags & AI_CANONNAME) != 0) {
+		ai->ai_canonname = strdup(str);
+		if (ai->ai_canonname == NULL)
+			return EAI_MEMORY;
+	}
+	return 0;
+}
+
+static struct addrinfo *
+get_ai(pai, afd, addr)
+	const struct addrinfo *pai;
+	const struct afd *afd;
+	const char *addr;
+{
+	char *p;
+	struct addrinfo *ai;
+
+	ai = (struct addrinfo *)malloc(sizeof(struct addrinfo)
+		+ (afd->a_socklen));
+	if (ai == NULL)
+		return NULL;
+
+	memcpy(ai, pai, sizeof(struct addrinfo));
+	ai->ai_addr = (struct sockaddr *)(ai + 1);
+	memset(ai->ai_addr, 0, afd->a_socklen);
+#ifdef HAVE_SOCKADDR_SA_LEN
+	ai->ai_addr->sa_len = afd->a_socklen;
+#endif
+	ai->ai_addrlen = afd->a_socklen;
+	ai->ai_addr->sa_family = ai->ai_family = afd->a_af;
+	p = (char *)(ai->ai_addr);
+	memcpy(p + afd->a_off, addr, afd->a_addrlen);
+	return ai;
+}
+
+static int
+get_portmatch(ai, servname)
+	const struct addrinfo *ai;
+	const char *servname;
+{
+
+	/* get_port does not touch first argument. when matchonly == 1. */
+	return get_port((struct addrinfo *)ai, servname, 1);
+}
+
+static int
+get_port(ai, servname, matchonly)
+	struct addrinfo *ai;
+	const char *servname;
+	int matchonly;
+{
+	const char *proto;
+	struct servent *sp;
+	int port;
+	int allownumeric;
+
+	if (servname == NULL)
+		return 0;
+	switch (ai->ai_family) {
+	case AF_INET:
+#ifdef AF_INET6
+	case AF_INET6:
+#endif
+		break;
+	default:
+		return 0;
+	}
+
+	switch (ai->ai_socktype) {
+	case SOCK_RAW:
+		return EAI_SERVICE;
+	case SOCK_DGRAM:
+	case SOCK_STREAM:
+		allownumeric = 1;
+		break;
+	case ANY:
+		allownumeric = 0;
+		break;
+	default:
+		return EAI_SOCKTYPE;
+	}
+
+	if (str_isnumber(servname)) {
+		if (!allownumeric)
+			return EAI_SERVICE;
+		port = htons(atoi(servname));
+		if (port < 0 || port > 65535)
+			return EAI_SERVICE;
+	} else {
+		switch (ai->ai_socktype) {
+		case SOCK_DGRAM:
+			proto = "udp";
+			break;
+		case SOCK_STREAM:
+			proto = "tcp";
+			break;
+		default:
+			proto = NULL;
+			break;
+		}
+
+		if ((sp = getservbyname(servname, proto)) == NULL)
+			return EAI_SERVICE;
+		port = sp->s_port;
+	}
+
+	if (!matchonly) {
+		switch (ai->ai_family) {
+		case AF_INET:
+			((struct sockaddr_in *)ai->ai_addr)->sin_port = port;
+			break;
+#ifdef INET6
+		case AF_INET6:
+			((struct sockaddr_in6 *)ai->ai_addr)->sin6_port = port;
+			break;
+#endif
+		}
+	}
+
+	return 0;
+}
+
+static const struct afd *
+find_afd(af)
+	int af;
+{
+	const struct afd *afd;
+
+	if (af == PF_UNSPEC)
+		return NULL;
+	for (afd = afdl; afd->a_af; afd++) {
+		if (afd->a_af == af)
+			return afd;
+	}
+	return NULL;
+}
+
+
+#endif /*__MING64__*/
diff --git a/Win32/Src/getnetbynm.c b/Win32/Src/getnetbynm.c
new file mode 100644
index 0000000..fa4d398
--- /dev/null
+++ b/Win32/Src/getnetbynm.c
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not 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 MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)getnetbyname.c	5.5 (Berkeley) 6/27/88";
+#endif /* LIBC_SCCS and not lint */
+
+#include "inetprivate.h"
+
+extern int _net_stayopen;
+
+struct netent *
+getnetbyname(const char *name)
+{
+	register struct netent *p;
+	register char **cp;
+
+	setnetent(_net_stayopen);
+	while (p = getnetent()) {
+		if (strcmp(p->n_name, name) == 0)
+			break;
+		for (cp = p->n_aliases; *cp != 0; cp++)
+			if (strcmp(*cp, name) == 0)
+				goto found;
+	}
+found:
+	if (!_net_stayopen)
+		endnetent();
+	return (p);
+}
diff --git a/Win32/Src/getnetent.c b/Win32/Src/getnetent.c
new file mode 100644
index 0000000..d4cceb3
--- /dev/null
+++ b/Win32/Src/getnetent.c
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not 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 MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)getnetent.c	5.5 (Berkeley) 6/27/88";
+#endif /* LIBC_SCCS and not lint */
+
+#include "inetprivate.h"
+
+#define	MAXALIASES	35
+
+static char NETDB[] = _PATH_NETWORKS;
+static FILE *netf = NULL;
+static char line[BUFSIZ+1];
+static struct netent net;
+static char *net_aliases[MAXALIASES];
+static char *any(char *, char *);
+
+int _net_stayopen;
+extern u_int32_t inet_network(const char *cp);
+
+void
+setnetent(f)
+	int f;
+{
+	if (netf == NULL)
+		netf = fopen(NETDB, "r" );
+	else
+		rewind(netf);
+	_net_stayopen |= f;
+}
+
+void
+endnetent()
+{
+	if (netf) {
+		fclose(netf);
+		netf = NULL;
+	}
+	_net_stayopen = 0;
+}
+
+struct netent *
+getnetent()
+{
+	char *p;
+	register char *cp, **q;
+
+	if (netf == NULL && (netf = fopen(NETDB, "r" )) == NULL)
+		return (NULL);
+again:
+	p = fgets(line, BUFSIZ, netf);
+	if (p == NULL)
+		return (NULL);
+	if (*p == '#')
+		goto again;
+	cp = any(p, "#\n");
+	if (cp == NULL)
+		goto again;
+	*cp = '\0';
+	net.n_name = p;
+	cp = any(p, " \t");
+	if (cp == NULL)
+		goto again;
+	*cp++ = '\0';
+	while (*cp == ' ' || *cp == '\t')
+		cp++;
+	p = any(cp, " \t");
+	if (p != NULL)
+		*p++ = '\0';
+	net.n_net = inet_network(cp);
+	net.n_addrtype = AF_INET;
+	q = net.n_aliases = net_aliases;
+	if (p != NULL) 
+		cp = p;
+	while (cp && *cp) {
+		if (*cp == ' ' || *cp == '\t') {
+			cp++;
+			continue;
+		}
+		if (q < &net_aliases[MAXALIASES - 1])
+			*q++ = cp;
+		cp = any(cp, " \t");
+		if (cp != NULL)
+			*cp++ = '\0';
+	}
+	*q = NULL;
+	return (&net);
+}
+
+static char *
+any(cp, match)
+	register char *cp;
+	char *match;
+{
+	register char *mp, c;
+
+	while (c = *cp) {
+		for (mp = match; *mp; mp++)
+			if (*mp == c)
+				return (cp);
+		cp++;
+	}
+	return ((char *)0);
+}
diff --git a/Win32/Src/getopt.c b/Win32/Src/getopt.c
new file mode 100644
index 0000000..03c2086
--- /dev/null
+++ b/Win32/Src/getopt.c
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 1987, 1993, 1994
+ *	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 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)getopt.c	8.3 (Berkeley) 4/27/95";
+#endif /* LIBC_SCCS and not lint */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int	opterr = 1,		/* if error message should be printed */
+	optind = 1,		/* index into parent argv vector */
+	optopt,			/* character checked for validity */
+	optreset;		/* reset getopt */
+char	*optarg;		/* argument associated with option */
+
+#define	BADCH	(int)'?'
+#define	BADARG	(int)':'
+#define	EMSG	""
+
+/*
+ * getopt --
+ *	Parse argc/argv argument vector.
+ */
+int
+getopt(nargc, nargv, ostr)
+	int nargc;
+	char * const *nargv;
+	const char *ostr;
+{
+#ifdef WIN32
+	char *__progname="windump";
+#else
+	extern char *__progname;
+#endif
+	static char *place = EMSG;		/* option letter processing */
+	char *oli;				/* option letter list index */
+
+	if (optreset || !*place) {		/* update scanning pointer */
+		optreset = 0;
+		if (optind >= nargc || *(place = nargv[optind]) != '-') {
+			place = EMSG;
+			return (-1);
+		}
+		if (place[1] && *++place == '-') {	/* found "--" */
+			++optind;
+			place = EMSG;
+			return (-1);
+		}
+	}					/* option letter okay? */
+	if ((optopt = (int)*place++) == (int)':' ||
+	    !(oli = strchr(ostr, optopt))) {
+		/*
+		 * if the user didn't specify '-' as an option,
+		 * assume it means -1.
+		 */
+		if (optopt == (int)'-')
+			return (-1);
+		if (!*place)
+			++optind;
+		if (opterr && *ostr != ':')
+			(void)fprintf(stderr,
+			    "%s: illegal option -- %c\n", __progname, optopt);
+		return (BADCH);
+	}
+	if (*++oli != ':') {			/* don't need argument */
+		optarg = NULL;
+		if (!*place)
+			++optind;
+	}
+	else {					/* need an argument */
+		if (*place)			/* no white space */
+			optarg = place;
+		else if (nargc <= ++optind) {	/* no arg */
+			place = EMSG;
+			if (*ostr == ':')
+				return (BADARG);
+			if (opterr)
+				(void)fprintf(stderr,
+				    "%s: option requires an argument -- %c\n",
+				    __progname, optopt);
+			return (BADCH);
+		}
+	 	else				/* white space */
+			optarg = nargv[optind];
+		place = EMSG;
+		++optind;
+	}
+	return (optopt);			/* dump back option letter */
+}
diff --git a/Win32/Src/getservent.c b/Win32/Src/getservent.c
new file mode 100644
index 0000000..61b8cb0
--- /dev/null
+++ b/Win32/Src/getservent.c
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 1983, 1993
+ *	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 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)getservent.c	8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/types.h>
+#include <string.h>
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <net/netdb.h>
+#include <stdio.h>
+#include <errno.h>
+#include <arpa/nameser.h>
+
+#define	MAXALIASES	35
+
+static char SERVDB[] = _PATH_SERVICES;
+static FILE *servf = NULL;
+static char line[BUFSIZ+1];
+static struct servent serv;
+static char *serv_aliases[MAXALIASES];
+int _serv_stayopen;
+
+void
+setservent(f)
+	int f;
+{
+	if (servf == NULL)
+		servf = fopen(SERVDB, "r" );
+	else
+		rewind(servf);
+	_serv_stayopen |= f;
+}
+
+void
+endservent()
+{
+	if (servf) {
+		fclose(servf);
+		servf = NULL;
+	}
+	_serv_stayopen = 0;
+}
+
+struct servent *
+getservent()
+{
+	char *p;
+	register char *cp, **q;
+
+	if (servf == NULL && (servf = fopen(SERVDB, "r" )) == NULL)
+		return (NULL);
+again:
+	if ((p = fgets(line, BUFSIZ, servf)) == NULL)
+		return (NULL);
+	if (*p == '#')
+		goto again;
+	cp = strpbrk(p, "#\n");
+	if (cp == NULL)
+		goto again;
+	*cp = '\0';
+	serv.s_name = p;
+	p = strpbrk(p, " \t");
+	if (p == NULL)
+		goto again;
+	*p++ = '\0';
+	while (*p == ' ' || *p == '\t')
+		p++;
+	cp = strpbrk(p, ",/");
+	if (cp == NULL)
+		goto again;
+	*cp++ = '\0';
+	serv.s_port = htons((u_short)atoi(p));
+	serv.s_proto = cp;
+	q = serv.s_aliases = serv_aliases;
+	cp = strpbrk(cp, " \t");
+	if (cp != NULL)
+		*cp++ = '\0';
+	while (cp && *cp) {
+		if (*cp == ' ' || *cp == '\t') {
+			cp++;
+			continue;
+		}
+		if (q < &serv_aliases[MAXALIASES - 1])
+			*q++ = cp;
+		cp = strpbrk(cp, " \t");
+		if (cp != NULL)
+			*cp++ = '\0';
+	}
+	*q = NULL;
+	return (&serv);
+}
diff --git a/Win32/Src/inet_aton.c b/Win32/Src/inet_aton.c
new file mode 100644
index 0000000..3da6667
--- /dev/null
+++ b/Win32/Src/inet_aton.c
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan
+ * (Royal Institute of Technology, Stockholm, Sweden).
+ * 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. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by the Kungliga Tekniska
+ *      Högskolan and its contributors.
+ * 
+ * 4. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
+ */
+
+/* $Id: inet_aton.c,v 1.2 2003-11-15 23:24:06 guy Exp $ */
+
+#ifndef lint
+static const char rcsid[] _U_ =
+     "@(#) $Header: /tcpdump/master/libpcap/Win32/Src/inet_aton.c,v 1.2 2003-11-15 23:24:06 guy Exp $";
+#endif
+
+#include <sys/types.h>
+#include <pcap-stdinc.h>
+
+/* Minimal implementation of inet_aton.
+ * Cannot distinguish between failure and a local broadcast address. */
+
+#ifndef INADDR_NONE
+#define INADDR_NONE 0xffffffff
+#endif
+
+int
+inet_aton(const char *cp, struct in_addr *addr)
+{
+  addr->s_addr = inet_addr(cp);
+  return (addr->s_addr == INADDR_NONE) ? 0 : 1;
+}
diff --git a/Win32/Src/inet_net.c b/Win32/Src/inet_net.c
new file mode 100644
index 0000000..5bbe391
--- /dev/null
+++ b/Win32/Src/inet_net.c
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 1983, 1993
+ *	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 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)inet_network.c	8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include "inetprivate.h"
+
+/*
+ * Internet network address interpretation routine.
+ * The library routines call this routine to interpret
+ * network numbers.
+ */
+u_int32_t
+inet_network(const char *cp)
+{
+	register u_long val, base, n;
+	register char c;
+	u_long parts[4], *pp = parts;
+	register int i;
+
+again:
+	/*
+	 * Collect number up to ``.''.
+	 * Values are specified as for C:
+	 * 0x=hex, 0=octal, other=decimal.
+	 */
+	val = 0; base = 10;
+	/*
+	 * The 4.4BSD version of this file also accepts 'x__' as a hexa
+	 * number.  I don't think this is correct.  -- Uli
+	 */
+	if (*cp == '0') {
+		if (*++cp == 'x' || *cp == 'X')
+			base = 16, cp++;
+		else
+			base = 8;
+	}
+	while ((c = *cp)) {
+		if (isdigit(c)) {
+			val = (val * base) + (c - '0');
+			cp++;
+			continue;
+		}
+		if (base == 16 && isxdigit(c)) {
+			val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A'));
+			cp++;
+			continue;
+		}
+		break;
+	}
+	if (*cp == '.') {
+		if (pp >= parts + 4)
+			return (INADDR_NONE);
+		*pp++ = val, cp++;
+		goto again;
+	}
+	if (*cp && !isspace(*cp))
+		return (INADDR_NONE);
+	*pp++ = val;
+	n = pp - parts;
+	if (n > 4)
+		return (INADDR_NONE);
+	for (val = 0, i = 0; i < (int)n; i++) {
+		val <<= 8;
+		val |= parts[i] & 0xff;
+	}
+	return (val);
+}
diff --git a/Win32/Src/inet_pton.c b/Win32/Src/inet_pton.c
new file mode 100644
index 0000000..7933a4e
--- /dev/null
+++ b/Win32/Src/inet_pton.c
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 1999 Kungliga Tekniska Högskolan
+ * (Royal Institute of Technology, Stockholm, Sweden).
+ * 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. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by the Kungliga Tekniska
+ *      Högskolan and its contributors.
+ * 
+ * 4. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE 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.
+ */
+
+/* $Id: inet_pton.c,v 1.3 2007-09-27 18:02:20 gianluca Exp $ */
+
+#ifndef lint
+static const char rcsid[] _U_ =
+     "@(#) $Header: /tcpdump/master/libpcap/Win32/Src/inet_pton.c,v 1.3 2007-09-27 18:02:20 gianluca Exp $";
+#endif
+
+#include <errno.h>
+
+#ifdef WIN32
+#ifndef EAFNOSUPPORT
+#define	EAFNOSUPPORT	97	/* not present in errno.h provided with VC */
+#endif
+#endif
+
+#ifdef __MINGW32__
+int* _errno();
+#define errno (*_errno())
+#endif /* __MINGW32__ */
+
+#include <pcap-stdinc.h>
+
+int inet_aton(const char *cp, struct in_addr *addr);
+
+int
+inet_pton(int af, const char *src, void *dst)
+{
+    if (af != AF_INET) {
+	errno = EAFNOSUPPORT;
+	return -1;
+    }
+    return inet_aton (src, dst);
+}
diff --git a/acconfig.h b/acconfig.h
deleted file mode 100644
index a23f320..0000000
--- a/acconfig.h
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Long story short: aclocal.m4 depends on autoconf 2.13
- * implementation details wrt "const"; newer versions
- * have different implementation details so for now we
- * put "const" here.  This may cause duplicate definitions
- * in config.h but that should be OK since they're the same.
- */
-#undef const
diff --git a/aclocal.m4 b/aclocal.m4
index 1efb474..4b643ef 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,4 +1,4 @@
-dnl @(#) $Header: /tcpdump/master/libpcap/aclocal.m4,v 1.85.2.1 2005/04/21 03:42:09 guy Exp $ (LBL)
+dnl @(#) $Header: /tcpdump/master/libpcap/aclocal.m4,v 1.93 2008-11-18 07:29:48 guy Exp $ (LBL)
 dnl
 dnl Copyright (c) 1995, 1996, 1997, 1998
 dnl	The Regents of the University of California.  All rights reserved.
@@ -23,41 +23,36 @@
 dnl
 
 dnl
-dnl Determine which compiler we're using (cc or gcc)
-dnl If using gcc, determine the version number
-dnl If using cc, require that it support ansi prototypes
-dnl If using gcc, use -O2 (otherwise use -O)
-dnl If using cc, explicitly specify /usr/local/include
+dnl Do whatever AC_LBL_C_INIT work is necessary before using AC_PROG_CC.
 dnl
-dnl usage:
+dnl It appears that newer versions of autoconf (2.64 and later) will,
+dnl if you use AC_TRY_COMPILE in a macro, stick AC_PROG_CC at the
+dnl beginning of the macro, even if the macro itself calls AC_PROG_CC.
+dnl See the "Prerequisite Macros" and "Expanded Before Required" sections
+dnl in the Autoconf documentation.
 dnl
-dnl	AC_LBL_C_INIT(copt, incls)
+dnl This causes a steaming heap of fail in our case, as we were, in
+dnl AC_LBL_C_INIT, doing the tests we now do in AC_LBL_C_INIT_BEFORE_CC,
+dnl calling AC_PROG_CC, and then doing the tests we now do in
+dnl AC_LBL_C_INIT.  Now, we run AC_LBL_C_INIT_BEFORE_CC, AC_PROG_CC,
+dnl and AC_LBL_C_INIT at the top level.
 dnl
-dnl results:
-dnl
-dnl	$1 (copt set)
-dnl	$2 (incls set)
-dnl	CC
-dnl	LDFLAGS
-dnl	ac_cv_lbl_gcc_vers
-dnl	LBL_CFLAGS
-dnl
-AC_DEFUN(AC_LBL_C_INIT,
-    [AC_PREREQ(2.12)
+AC_DEFUN(AC_LBL_C_INIT_BEFORE_CC,
+[
+    AC_BEFORE([$0], [AC_LBL_C_INIT])
     AC_BEFORE([$0], [AC_PROG_CC])
     AC_BEFORE([$0], [AC_LBL_FIXINCLUDES])
     AC_BEFORE([$0], [AC_LBL_DEVEL])
     AC_ARG_WITH(gcc, [  --without-gcc           don't use gcc])
-    $1="-O"
-    $2=""
+    $1=""
     if test "${srcdir}" != "." ; then
-	    $2="-I\$(srcdir)"
+	    $1="-I\$(srcdir)"
     fi
     if test "${CFLAGS+set}" = set; then
 	    LBL_CFLAGS="$CFLAGS"
     fi
     if test -z "$CC" ; then
-	    case "$target_os" in
+	    case "$host_os" in
 
 	    bsdi*)
 		    AC_CHECK_PROG(SHLICC2, shlicc2, yes, no)
@@ -72,71 +67,129 @@
 	    CC=cc
 	    export CC
     fi
-    AC_PROG_CC
+])
+
+dnl
+dnl Determine which compiler we're using (cc or gcc)
+dnl If using gcc, determine the version number
+dnl If using cc:
+dnl     require that it support ansi prototypes
+dnl     use -O (AC_PROG_CC will use -g -O2 on gcc, so we don't need to
+dnl     do that ourselves for gcc)
+dnl     add -g flags, as appropriate
+dnl     explicitly specify /usr/local/include
+dnl
+dnl NOTE WELL: with newer versions of autoconf, "gcc" means any compiler
+dnl that defines __GNUC__, which means clang, for example, counts as "gcc".
+dnl
+dnl usage:
+dnl
+dnl	AC_LBL_C_INIT(copt, incls)
+dnl
+dnl results:
+dnl
+dnl	$1 (copt set)
+dnl	$2 (incls set)
+dnl	CC
+dnl	LDFLAGS
+dnl	LBL_CFLAGS
+dnl
+AC_DEFUN(AC_LBL_C_INIT,
+[
+    AC_BEFORE([$0], [AC_LBL_FIXINCLUDES])
+    AC_BEFORE([$0], [AC_LBL_DEVEL])
+    AC_BEFORE([$0], [AC_LBL_SHLIBS_INIT])
     if test "$GCC" = yes ; then
-	    if test "$SHLICC2" = yes ; then
-		    ac_cv_lbl_gcc_vers=2
-		    $1="-O2"
-	    else
-		    AC_MSG_CHECKING(gcc version)
-		    AC_CACHE_VAL(ac_cv_lbl_gcc_vers,
-			ac_cv_lbl_gcc_vers=`$CC -v 2>&1 | \
-			    sed -e '/^gcc version /!d' \
-				-e 's/^gcc version //' \
-				-e 's/ .*//' -e 's/^[[[^0-9]]]*//' \
-				-e 's/\..*//'`)
-		    AC_MSG_RESULT($ac_cv_lbl_gcc_vers)
-		    if test $ac_cv_lbl_gcc_vers -gt 1 ; then
-			    $1="-O2"
-		    fi
-	    fi
+	    #
+	    # -Werror forces warnings to be errors.
+	    #
+	    ac_lbl_cc_force_warning_errors=-Werror
     else
-	    AC_MSG_CHECKING(that $CC handles ansi prototypes)
-	    AC_CACHE_VAL(ac_cv_lbl_cc_ansi_prototypes,
-		AC_TRY_COMPILE(
-		    [#include <sys/types.h>],
-		    [int frob(int, char *)],
-		    ac_cv_lbl_cc_ansi_prototypes=yes,
-		    ac_cv_lbl_cc_ansi_prototypes=no))
-	    AC_MSG_RESULT($ac_cv_lbl_cc_ansi_prototypes)
-	    if test $ac_cv_lbl_cc_ansi_prototypes = no ; then
-		    case "$target_os" in
-
-		    hpux*)
-			    AC_MSG_CHECKING(for HP-UX ansi compiler ($CC -Aa -D_HPUX_SOURCE))
-			    savedcflags="$CFLAGS"
-			    CFLAGS="-Aa -D_HPUX_SOURCE $CFLAGS"
-			    AC_CACHE_VAL(ac_cv_lbl_cc_hpux_cc_aa,
-				AC_TRY_COMPILE(
-				    [#include <sys/types.h>],
-				    [int frob(int, char *)],
-				    ac_cv_lbl_cc_hpux_cc_aa=yes,
-				    ac_cv_lbl_cc_hpux_cc_aa=no))
-			    AC_MSG_RESULT($ac_cv_lbl_cc_hpux_cc_aa)
-			    if test $ac_cv_lbl_cc_hpux_cc_aa = no ; then
-				    AC_MSG_ERROR(see the INSTALL doc for more info)
-			    fi
-			    CFLAGS="$savedcflags"
-			    V_CCOPT="-Aa $V_CCOPT"
-			    AC_DEFINE(_HPUX_SOURCE,1,[needed on HP-UX])
-			    ;;
-
-		    *)
-			    AC_MSG_ERROR(see the INSTALL doc for more info)
-			    ;;
-		    esac
-	    fi
 	    $2="$$2 -I/usr/local/include"
 	    LDFLAGS="$LDFLAGS -L/usr/local/lib"
 
-	    case "$target_os" in
+	    case "$host_os" in
+
+	    darwin*)
+		    #
+		    # This is assumed either to be GCC or clang, both
+		    # of which use -Werror to force warnings to be errors.
+		    #
+		    ac_lbl_cc_force_warning_errors=-Werror
+		    ;;
+
+	    hpux*)
+		    #
+		    # HP C, which is what we presume we're using, doesn't
+		    # exit with a non-zero exit status if we hand it an
+		    # invalid -W flag, can't be forced to do so even with
+		    # +We, and doesn't handle GCC-style -W flags, so we
+		    # don't want to try using GCC-style -W flags.
+		    #
+		    ac_lbl_cc_dont_try_gcc_dashW=yes
+		    ;;
 
 	    irix*)
-		    V_CCOPT="$V_CCOPT -xansi -signed -g3"
+		    #
+		    # MIPS C, which is what we presume we're using, doesn't
+		    # necessarily exit with a non-zero exit status if we
+		    # hand it an invalid -W flag, can't be forced to do
+		    # so, and doesn't handle GCC-style -W flags, so we
+		    # don't want to try using GCC-style -W flags.
+		    #
+		    ac_lbl_cc_dont_try_gcc_dashW=yes
+		    #
+		    # It also, apparently, defaults to "char" being
+		    # unsigned, unlike most other C implementations;
+		    # I suppose we could say "signed char" whenever
+		    # we want to guarantee a signed "char", but let's
+		    # just force signed chars.
+		    #
+		    # -xansi is normally the default, but the
+		    # configure script was setting it; perhaps -cckr
+		    # was the default in the Old Days.  (Then again,
+		    # that would probably be for backwards compatibility
+		    # in the days when ANSI C was Shiny and New, i.e.
+		    # 1989 and the early '90's, so maybe we can just
+		    # drop support for those compilers.)
+		    #
+		    # -g is equivalent to -g2, which turns off
+		    # optimization; we choose -g3, which generates
+		    # debugging information but doesn't turn off
+		    # optimization (even if the optimization would
+		    # cause inaccuracies in debugging).
+		    #
+		    $1="$$1 -xansi -signed -g3"
 		    ;;
 
 	    osf*)
-		    V_CCOPT="$V_CCOPT -std1 -g3"
+		    #
+		    # Presumed to be DEC OSF/1, Digital UNIX, or
+		    # Tru64 UNIX.
+		    #
+		    # The DEC C compiler, which is what we presume we're
+		    # using, doesn't exit with a non-zero exit status if we
+		    # hand it an invalid -W flag, can't be forced to do
+		    # so, and doesn't handle GCC-style -W flags, so we
+		    # don't want to try using GCC-style -W flags.
+		    #
+		    ac_lbl_cc_dont_try_gcc_dashW=yes
+		    #
+		    # -g is equivalent to -g2, which turns off
+		    # optimization; we choose -g3, which generates
+		    # debugging information but doesn't turn off
+		    # optimization (even if the optimization would
+		    # cause inaccuracies in debugging).
+		    #
+		    $1="$$1 -g3"
+		    ;;
+
+	    solaris*)
+		    #
+		    # Assumed to be Sun C, which requires -errwarn to force
+		    # warnings to be treated as errors.
+		    #
+		    ac_lbl_cc_force_warning_errors=-errwarn
 		    ;;
 
 	    ultrix*)
@@ -150,10 +203,344 @@
 			    ac_cv_lbl_cc_const_proto=no))
 		    AC_MSG_RESULT($ac_cv_lbl_cc_const_proto)
 		    if test $ac_cv_lbl_cc_const_proto = no ; then
-			    AC_DEFINE(const,)
+			    AC_DEFINE(const,[],
+			        [to handle Ultrix compilers that don't support const in prototypes])
 		    fi
 		    ;;
 	    esac
+	    $1="$$1 -O"
+    fi
+])
+
+dnl
+dnl Check whether, if you pass an unknown warning option to the
+dnl compiler, it fails or just prints a warning message and succeeds.
+dnl Set ac_lbl_unknown_warning_option_error to the appropriate flag
+dnl to force an error if it would otherwise just print a warning message
+dnl and succeed.
+dnl
+AC_DEFUN(AC_LBL_CHECK_UNKNOWN_WARNING_OPTION_ERROR,
+    [
+	AC_MSG_CHECKING([whether the compiler fails when given an unknown warning option])
+	save_CFLAGS="$CFLAGS"
+	CFLAGS="$CFLAGS -Wxyzzy-this-will-never-succeed-xyzzy"
+	AC_TRY_COMPILE(
+	    [],
+	    [return 0],
+	    [
+		AC_MSG_RESULT([no])
+		#
+		# We're assuming this is clang, where
+		# -Werror=unknown-warning-option is the appropriate
+		# option to force the compiler to fail.
+		# 
+		ac_lbl_unknown_warning_option_error="-Werror=unknown-warning-option"
+	    ],
+	    [
+		AC_MSG_RESULT([yes])
+	    ])
+	CFLAGS="$save_CFLAGS"
+    ])
+
+dnl
+dnl Check whether the compiler option specified as the second argument
+dnl is supported by the compiler and, if so, add it to the macro
+dnl specified as the first argument
+dnl
+AC_DEFUN(AC_LBL_CHECK_COMPILER_OPT,
+    [
+	AC_MSG_CHECKING([whether the compiler supports the $2 option])
+	save_CFLAGS="$CFLAGS"
+	CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error $2"
+	AC_TRY_COMPILE(
+	    [],
+	    [return 0],
+	    [
+		AC_MSG_RESULT([yes])
+		CFLAGS="$save_CFLAGS"
+		$1="$$1 $2"
+	    ],
+	    [
+		AC_MSG_RESULT([no])
+		CFLAGS="$save_CFLAGS"
+	    ])
+    ])
+
+dnl
+dnl Check whether the compiler supports an option to generate
+dnl Makefile-style dependency lines
+dnl
+dnl GCC uses -M for this.  Non-GCC compilers that support this
+dnl use a variety of flags, including but not limited to -M.
+dnl
+dnl We test whether the flag in question is supported, as older
+dnl versions of compilers might not support it.
+dnl
+dnl We don't try all the possible flags, just in case some flag means
+dnl "generate dependencies" on one compiler but means something else
+dnl on another compiler.
+dnl
+dnl Most compilers that support this send the output to the standard
+dnl output by default.  IBM's XLC, however, supports -M but sends
+dnl the output to {sourcefile-basename}.u, and AIX has no /dev/stdout
+dnl to work around that, so we don't bother with XLC.
+dnl
+AC_DEFUN(AC_LBL_CHECK_DEPENDENCY_GENERATION_OPT,
+    [
+	AC_MSG_CHECKING([whether the compiler supports generating dependencies])
+	if test "$GCC" = yes ; then
+		#
+		# GCC, or a compiler deemed to be GCC by AC_PROG_CC (even
+		# though it's not); we assume that, in this case, the flag
+		# would be -M.
+		#
+		ac_lbl_dependency_flag="-M"
+	else
+		#
+		# Not GCC or a compiler deemed to be GCC; what platform is
+		# this?  (We're assuming that if the compiler isn't GCC
+		# it's the compiler from the vendor of the OS; that won't
+		# necessarily be true for x86 platforms, where it might be
+		# the Intel C compiler.)
+		#
+		case "$host_os" in
+
+		irix*|osf*|darwin*)
+			#
+			# MIPS C for IRIX, DEC C, and clang all use -M.
+			#
+			ac_lbl_dependency_flag="-M"
+			;;
+
+		solaris*)
+			#
+			# Sun C uses -xM.
+			#
+			ac_lbl_dependency_flag="-xM"
+			;;
+
+		hpux*)
+			#
+			# HP's older C compilers don't support this.
+			# HP's newer C compilers support this with
+			# either +M or +Make; the older compilers
+			# interpret +M as something completely
+			# different, so we use +Make so we don't
+			# think it works with the older compilers.
+			#
+			ac_lbl_dependency_flag="+Make"
+			;;
+
+		*)
+			#
+			# Not one of the above; assume no support for
+			# generating dependencies.
+			#
+			ac_lbl_dependency_flag=""
+			;;
+		esac
+	fi
+
+	#
+	# Is ac_lbl_dependency_flag defined and, if so, does the compiler
+	# complain about it?
+	#
+	# Note: clang doesn't seem to exit with an error status when handed
+	# an unknown non-warning error, even if you pass it
+	# -Werror=unknown-warning-option.  However, it always supports
+	# -M, so the fact that this test always succeeds with clang
+	# isn't an issue.
+	#
+	if test ! -z "$ac_lbl_dependency_flag"; then
+		AC_LANG_CONFTEST(
+		    [AC_LANG_SOURCE([[int main(void) { return 0; }]])])
+		echo "$CC" $ac_lbl_dependency_flag conftest.c >&5
+		if "$CC" $ac_lbl_dependency_flag conftest.c >/dev/null 2>&1; then
+			AC_MSG_RESULT([yes, with $ac_lbl_dependency_flag])
+			DEPENDENCY_CFLAG="$ac_lbl_dependency_flag"
+			MKDEP='${srcdir}/mkdep'
+		else
+			AC_MSG_RESULT([no])
+			#
+			# We can't run mkdep, so have "make depend" do
+			# nothing.
+			#
+			MKDEP=:
+		fi
+		rm -rf conftest*
+	else
+		AC_MSG_RESULT([no])
+		#
+		# We can't run mkdep, so have "make depend" do
+		# nothing.
+		#
+		MKDEP=:
+	fi
+	AC_SUBST(DEPENDENCY_CFLAG)
+	AC_SUBST(MKDEP)
+    ])
+
+dnl
+dnl Determine what options are needed to build a shared library
+dnl
+dnl usage:
+dnl
+dnl	AC_LBL_SHLIBS_INIT
+dnl
+dnl results:
+dnl
+dnl	V_CCOPT (modified to build position-independent code)
+dnl	V_SHLIB_CMD
+dnl	V_SHLIB_OPT
+dnl	V_SONAME_OPT
+dnl	V_RPATH_OPT
+dnl
+AC_DEFUN(AC_LBL_SHLIBS_INIT,
+    [AC_PREREQ(2.50)
+    if test "$GCC" = yes ; then
+	    #
+	    # On platforms where we build a shared library:
+	    #
+	    #	add options to generate position-independent code,
+	    #	if necessary (it's the default in AIX and Darwin/OS X);
+	    #
+	    #	define option to set the soname of the shared library,
+	    #	if the OS supports that;
+	    #
+	    #	add options to specify, at link time, a directory to
+	    #	add to the run-time search path, if that's necessary.
+	    #
+	    V_SHLIB_CMD="\$(CC)"
+	    V_SHLIB_OPT="-shared"
+	    case "$host_os" in
+
+	    aix*)
+		    ;;
+
+	    freebsd*|netbsd*|openbsd*|dragonfly*|linux*|osf*)
+	    	    #
+		    # Platforms where the linker is the GNU linker
+		    # or accepts command-line arguments like
+		    # those the GNU linker accepts.
+		    #
+		    # Some instruction sets require -fPIC on some
+		    # operating systems.  Check for them.  If you
+		    # have a combination that requires it, add it
+		    # here.
+		    #
+		    PIC_OPT=-fpic
+		    case "$host_cpu" in
+
+		    sparc64*)
+			case "$host_os" in
+
+			freebsd*|openbsd*)
+			    PIC_OPT=-fPIC
+			    ;;
+			esac
+			;;
+		    esac
+		    V_CCOPT="$V_CCOPT $PIC_OPT"
+		    V_SONAME_OPT="-Wl,-soname,"
+		    V_RPATH_OPT="-Wl,-rpath,"
+		    ;;
+
+	    hpux*)
+		    V_CCOPT="$V_CCOPT -fpic"
+	    	    #
+		    # XXX - this assumes GCC is using the HP linker,
+		    # rather than the GNU linker, and that the "+h"
+		    # option is used on all HP-UX platforms, both .sl
+		    # and .so.
+		    #
+		    V_SONAME_OPT="-Wl,+h,"
+		    #
+		    # By default, directories specifed with -L
+		    # are added to the run-time search path, so
+		    # we don't add them in pcap-config.
+		    #
+		    ;;
+
+	    solaris*)
+		    V_CCOPT="$V_CCOPT -fpic"
+		    #
+		    # XXX - this assumes GCC is using the Sun linker,
+		    # rather than the GNU linker.
+		    #
+		    V_SONAME_OPT="-Wl,-h,"
+		    V_RPATH_OPT="-Wl,-R,"
+		    ;;
+	    esac
+    else
+	    #
+	    # Set the appropriate compiler flags and, on platforms
+	    # where we build a shared library:
+	    #
+	    #	add options to generate position-independent code,
+	    #	if necessary (it's the default in Darwin/OS X);
+	    #
+	    #	if we generate ".so" shared libraries, define the
+	    #	appropriate options for building the shared library;
+	    #
+	    #	add options to specify, at link time, a directory to
+	    #	add to the run-time search path, if that's necessary.
+	    #
+	    # Note: spaces after V_SONAME_OPT are significant; on
+	    # some platforms the soname is passed with a GCC-like
+	    # "-Wl,-soname,{soname}" option, with the soname part
+	    # of the option, while on other platforms the C compiler
+	    # driver takes it as a regular option with the soname
+	    # following the option.  The same applies to V_RPATH_OPT.
+	    #
+	    case "$host_os" in
+
+	    aix*)
+		    V_SHLIB_CMD="\$(CC)"
+		    V_SHLIB_OPT="-G -bnoentry -bexpall"
+		    ;;
+
+	    freebsd*|netbsd*|openbsd*|dragonfly*|linux*)
+		    #
+		    # "cc" is GCC.
+		    #
+		    V_CCOPT="$V_CCOPT -fpic"
+		    V_SHLIB_CMD="\$(CC)"
+		    V_SHLIB_OPT="-shared"
+		    V_SONAME_OPT="-Wl,-soname,"
+		    V_RPATH_OPT="-Wl,-rpath,"
+		    ;;
+
+	    hpux*)
+		    V_CCOPT="$V_CCOPT +z"
+		    V_SHLIB_CMD="\$(LD)"
+		    V_SHLIB_OPT="-b"
+		    V_SONAME_OPT="+h "
+		    #
+		    # By default, directories specifed with -L
+		    # are added to the run-time search path, so
+		    # we don't add them in pcap-config.
+		    #
+		    ;;
+
+	    osf*)
+	    	    #
+		    # Presumed to be DEC OSF/1, Digital UNIX, or
+		    # Tru64 UNIX.
+		    #
+		    V_SHLIB_CMD="\$(CC)"
+		    V_SHLIB_OPT="-shared"
+		    V_SONAME_OPT="-soname "
+		    V_RPATH_OPT="-rpath "
+		    ;;
+
+	    solaris*)
+		    V_CCOPT="$V_CCOPT -Kpic"
+		    V_SHLIB_CMD="\$(CC)"
+		    V_SHLIB_OPT="-G"
+		    V_SONAME_OPT="-h "
+		    V_RPATH_OPT="-R"
+		    ;;
+	    esac
     fi
 ])
 
@@ -209,114 +596,6 @@
     AC_DEFINE_UNQUOTED(inline, $ac_cv_lbl_inline, [Define as token for inline if inlining supported])])
 
 dnl
-dnl Use pfopen.c if available and pfopen() not in standard libraries
-dnl Require libpcap
-dnl Look for libpcap in ..
-dnl Use the installed libpcap if there is no local version
-dnl
-dnl usage:
-dnl
-dnl	AC_LBL_LIBPCAP(pcapdep, incls)
-dnl
-dnl results:
-dnl
-dnl	$1 (pcapdep set)
-dnl	$2 (incls appended)
-dnl	LIBS
-dnl	LBL_LIBS
-dnl
-AC_DEFUN(AC_LBL_LIBPCAP,
-    [AC_REQUIRE([AC_LBL_LIBRARY_NET])
-    dnl
-    dnl save a copy before locating libpcap.a
-    dnl
-    LBL_LIBS="$LIBS"
-    pfopen=/usr/examples/packetfilter/pfopen.c
-    if test -f $pfopen ; then
-	    AC_CHECK_FUNCS(pfopen)
-	    if test $ac_cv_func_pfopen = "no" ; then
-		    AC_MSG_RESULT(Using $pfopen)
-		    LIBS="$LIBS $pfopen"
-	    fi
-    fi
-    AC_MSG_CHECKING(for local pcap library)
-    libpcap=FAIL
-    lastdir=FAIL
-    places=`ls .. | sed -e 's,/$,,' -e 's,^,../,' | \
-	egrep '/libpcap-[[0-9]]*\.[[0-9]]*(\.[[0-9]]*)?([[ab]][[0-9]]*)?$'`
-    for dir in $places ../libpcap libpcap ; do
-	    basedir=`echo $dir | sed -e 's/[[ab]][[0-9]]*$//'`
-	    if test $lastdir = $basedir ; then
-		    dnl skip alphas when an actual release is present
-		    continue;
-	    fi
-	    lastdir=$dir
-	    if test -r $dir/pcap.c ; then
-		    libpcap=$dir/libpcap.a
-		    d=$dir
-		    dnl continue and select the last one that exists
-	    fi
-    done
-    if test $libpcap = FAIL ; then
-	    AC_MSG_RESULT(not found)
-	    AC_CHECK_LIB(pcap, main, libpcap="-lpcap")
-	    if test $libpcap = FAIL ; then
-		    AC_MSG_ERROR(see the INSTALL doc for more info)
-	    fi
-    else
-	    $1=$libpcap
-	    $2="-I$d $$2"
-	    AC_MSG_RESULT($libpcap)
-    fi
-    LIBS="$libpcap $LIBS"
-    case "$target_os" in
-
-    aix*)
-	    pseexe="/lib/pse.exp"
-	    AC_MSG_CHECKING(for $pseexe)
-	    if test -f $pseexe ; then
-		    AC_MSG_RESULT(yes)
-		    LIBS="$LIBS -I:$pseexe"
-	    fi
-	    ;;
-    esac])
-
-dnl
-dnl Define RETSIGTYPE and RETSIGVAL
-dnl
-dnl usage:
-dnl
-dnl	AC_LBL_TYPE_SIGNAL
-dnl
-dnl results:
-dnl
-dnl	RETSIGTYPE (defined)
-dnl	RETSIGVAL (defined)
-dnl
-AC_DEFUN(AC_LBL_TYPE_SIGNAL,
-    [AC_BEFORE([$0], [AC_LBL_LIBPCAP])
-    AC_TYPE_SIGNAL
-    if test "$ac_cv_type_signal" = void ; then
-	    AC_DEFINE(RETSIGVAL,[],[return value of signal handlers])
-    else
-	    AC_DEFINE(RETSIGVAL,(0),[return value of signal handlers])
-    fi
-    case "$target_os" in
-
-    irix*)
-	    AC_DEFINE(_BSD_SIGNALS,1,[get BSD semantics on Irix])
-	    ;;
-
-    *)
-	    dnl prefer sigset() to sigaction()
-	    AC_CHECK_FUNCS(sigset)
-	    if test $ac_cv_func_sigset = no ; then
-		    AC_CHECK_FUNCS(sigaction)
-	    fi
-	    ;;
-    esac])
-
-dnl
 dnl If using gcc, make sure we have ANSI ioctl definitions
 dnl
 dnl usage:
@@ -357,7 +636,22 @@
 dnl Require flex 2.4 or higher
 dnl Check for bison, default to yacc
 dnl Default to lex/yacc if both flex and bison are not available
-dnl Define the yy prefix string if using flex and bison
+dnl
+dnl If we're using flex and bison, pass -P to flex and -p to bison
+dnl to define a prefix string for the lexer and parser
+dnl
+dnl If we're not using flex and bison, don't pass those options
+dnl (as they might not work - although if "lex" is a wrapper for
+dnl Flex and "yacc" is a wrapper for Bison, they will work), and
+dnl define NEED_YYPARSE_WRAPPER (we *CANNOT* use YYBISON to check
+dnl whether the wrapper is needed, as some people apparently, for
+dnl some unknown reason, choose to use --without-flex and
+dnl --without-bison on systems that have Flex and Bison, which
+dnl means that the "yacc" they end up using is a wrapper that
+dnl runs "bison -y", and at least some versions of Bison define
+dnl YYBISON even if run with "-y", so we end up not compiling
+dnl the yyparse wrapper and end up with a libpcap that doesn't
+dnl define pcap_parse())
 dnl
 dnl usage:
 dnl
@@ -409,6 +703,8 @@
     if test "$$1" = flex -a -n "$3" ; then
 	    $1="$$1 -P$3"
 	    $2="$$2 -p $3"
+    else
+	    AC_DEFINE(NEED_YYPARSE_WRAPPER,1,[if we need a pcap_parse wrapper around yyparse])
     fi])
 
 dnl
@@ -452,7 +748,7 @@
 dnl	HAVE_SOCKADDR_SA_LEN (defined)
 dnl
 AC_DEFUN(AC_LBL_SOCKADDR_SA_LEN,
-    [AC_MSG_CHECKING(if sockaddr struct has sa_len member)
+    [AC_MSG_CHECKING(if sockaddr struct has the sa_len member)
     AC_CACHE_VAL(ac_cv_lbl_sockaddr_has_sa_len,
 	AC_TRY_COMPILE([
 #	include <sys/types.h>
@@ -462,7 +758,7 @@
 	ac_cv_lbl_sockaddr_has_sa_len=no))
     AC_MSG_RESULT($ac_cv_lbl_sockaddr_has_sa_len)
     if test $ac_cv_lbl_sockaddr_has_sa_len = yes ; then
-	    AC_DEFINE(HAVE_SOCKADDR_SA_LEN,1,[if struct sockaddr has sa_len])
+	    AC_DEFINE(HAVE_SOCKADDR_SA_LEN,1,[if struct sockaddr has the sa_len member])
     fi])
 
 dnl
@@ -545,41 +841,11 @@
 	else
 		ac_cv_lbl_have_run_path=no
 	fi
-	rm -f conftest*])
+	rm -f -r conftest*])
     AC_MSG_RESULT($ac_cv_lbl_have_run_path)
     ])
 
 dnl
-dnl Due to the stupid way it's implemented, AC_CHECK_TYPE is nearly useless.
-dnl
-dnl usage:
-dnl
-dnl	AC_LBL_CHECK_TYPE
-dnl
-dnl results:
-dnl
-dnl	int32_t (defined)
-dnl	u_int32_t (defined)
-dnl
-AC_DEFUN(AC_LBL_CHECK_TYPE,
-    [AC_MSG_CHECKING(for $1 using $CC)
-    AC_CACHE_VAL(ac_cv_lbl_have_$1,
-	AC_TRY_COMPILE([
-#	include "confdefs.h"
-#	include <sys/types.h>
-#	if STDC_HEADERS
-#	include <stdlib.h>
-#	include <stddef.h>
-#	endif],
-	[$1 i],
-	ac_cv_lbl_have_$1=yes,
-	ac_cv_lbl_have_$1=no))
-    AC_MSG_RESULT($ac_cv_lbl_have_$1)
-    if test $ac_cv_lbl_have_$1 = no ; then
-	    AC_DEFINE($1, $2, [if we have $1])
-    fi])
-
-dnl
 dnl Checks to see if unaligned memory accesses fail
 dnl
 dnl usage:
@@ -627,7 +893,7 @@
 	# know it does work, and have the script just fail on other
 	# cpu types and update it when such a failure occurs.
 	#
-	alpha*|arm*|hp*|mips*|sh*|sparc*|ia64|nv1)
+	alpha*|arm*|bfin*|hp*|mips*|sh*|sparc*|ia64|nv1)
 		ac_cv_lbl_unaligned_fail=yes
 		;;
 
@@ -671,7 +937,7 @@
 				ac_cv_lbl_unaligned_fail=no
 			fi
 		fi
-		rm -f conftest* core core.conftest
+		rm -f -r conftest* core core.conftest
 		;;
 	esac])
     AC_MSG_RESULT($ac_cv_lbl_unaligned_fail)
@@ -680,9 +946,8 @@
     fi])
 
 dnl
-dnl If using gcc and the file .devel exists:
-dnl	Compile with -g (if supported) and -Wall
-dnl	If using gcc 2, do extra prototype checking
+dnl If the file .devel exists:
+dnl	Add some warning flags if the compiler supports them
 dnl	If an os prototype include exists, symlink os-proto.h to it
 dnl
 dnl usage:
@@ -701,32 +966,30 @@
 	    $1="$$1 ${LBL_CFLAGS}"
     fi
     if test -f .devel ; then
-	    if test "$GCC" = yes ; then
-		    if test "${LBL_CFLAGS+set}" != set; then
-			    if test "$ac_cv_prog_cc_g" = yes ; then
-				    $1="-g $$1"
-			    fi
-			    $1="$$1 -Wall"
-			    if test $ac_cv_lbl_gcc_vers -gt 1 ; then
-				    $1="$$1 -Wmissing-prototypes -Wstrict-prototypes"
-			    fi
-		    fi
-	    else
-		    case "$target_os" in
-
-		    irix6*)
-			    V_CCOPT="$V_CCOPT -n32"
-			    ;;
-
-		    *)
-			    ;;
-		    esac
+	    #
+	    # Skip all the warning option stuff on some compilers.
+	    #
+	    if test "$ac_lbl_cc_dont_try_gcc_dashW" != yes; then
+		    AC_LBL_CHECK_UNKNOWN_WARNING_OPTION_ERROR()
+		    AC_LBL_CHECK_COMPILER_OPT($1, -Wall)
+		    AC_LBL_CHECK_COMPILER_OPT($1, -Wmissing-prototypes)
+		    AC_LBL_CHECK_COMPILER_OPT($1, -Wstrict-prototypes)
 	    fi
-	    os=`echo $target_os | sed -e 's/\([[0-9]][[0-9]]*\)[[^0-9]].*$/\1/'`
+	    AC_LBL_CHECK_DEPENDENCY_GENERATION_OPT()
+	    #
+	    # We used to set -n32 for IRIX 6 when not using GCC (presumed
+	    # to mean that we're using MIPS C or MIPSpro C); it specified
+	    # the "new" faster 32-bit ABI, introduced in IRIX 6.2.  I'm
+	    # not sure why that would be something to do *only* with a
+	    # .devel file; why should the ABI for which we produce code
+	    # depend on .devel?
+	    #
+	    os=`echo $host_os | sed -e 's/\([[0-9]][[0-9]]*\)[[^0-9]].*$/\1/'`
 	    name="lbl/os-$os.h"
 	    if test -f $name ; then
 		    ln -s $name os-proto.h
-		    AC_DEFINE(HAVE_OS_PROTO_H,1,[if there's an os_proto.h])
+		    AC_DEFINE(HAVE_OS_PROTO_H, 1,
+			[if there's an os_proto.h for this platform, to use additional prototypes])
 	    else
 		    AC_MSG_WARN(can't find $name)
 	    fi
@@ -746,13 +1009,19 @@
 dnl
 dnl	LIBS
 dnl
+dnl XXX - "AC_LBL_LIBRARY_NET" was redone to use "AC_SEARCH_LIBS"
+dnl rather than "AC_LBL_CHECK_LIB", so this isn't used any more.
+dnl We keep it around for reference purposes in case it's ever
+dnl useful in the future.
+dnl
 
 define(AC_LBL_CHECK_LIB,
 [AC_MSG_CHECKING([for $2 in -l$1])
-dnl Use a cache variable name containing both the library and function name,
-dnl because the test really is for library $1 defining function $2, not
-dnl just for library $1.  Separate tests with the same $1 and different $2's
-dnl may have different results.
+dnl Use a cache variable name containing the library, function
+dnl name, and extra libraries to link with, because the test really is
+dnl for library $1 defining function $2, when linked with potinal
+dnl library $5, not just for library $1.  Separate tests with the same
+dnl $1 and different $2's or $5's may have different results.
 ac_lib_var=`echo $1['_']$2['_']$5 | sed 'y%./+- %__p__%'`
 AC_CACHE_VAL(ac_cv_lbl_lib_$ac_lib_var,
 [ac_save_LIBS="$LIBS"
@@ -851,7 +1120,7 @@
 AC_DEFUN(AC_C___ATTRIBUTE__, [
 AC_MSG_CHECKING(for __attribute__)
 AC_CACHE_VAL(ac_cv___attribute__, [
-AC_COMPILE_IFELSE(
+AC_COMPILE_IFELSE([
   AC_LANG_SOURCE([[
 #include <stdlib.h>
 
@@ -868,16 +1137,83 @@
 {
   foo();
 }
-  ]]),
+  ]])],
 ac_cv___attribute__=yes,
 ac_cv___attribute__=no)])
 if test "$ac_cv___attribute__" = "yes"; then
   AC_DEFINE(HAVE___ATTRIBUTE__, 1, [define if your compiler has __attribute__])
+else
+  #
+  # We can't use __attribute__, so we can't use __attribute__((unused)),
+  # so we define _U_ to an empty string.
+  #
+  V_DEFS="$V_DEFS -D_U_=\"\""
+fi
+AC_MSG_RESULT($ac_cv___attribute__)
+])
+
+dnl
+dnl Test whether __attribute__((unused)) can be used without warnings
+dnl
+
+AC_DEFUN(AC_C___ATTRIBUTE___UNUSED, [
+AC_MSG_CHECKING([whether __attribute__((unused)) can be used without warnings])
+AC_CACHE_VAL(ac_cv___attribute___unused, [
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors"
+AC_COMPILE_IFELSE([
+  AC_LANG_SOURCE([[
+#include <stdlib.h>
+#include <stdio.h>
+
+int
+main(int argc  __attribute((unused)), char **argv __attribute((unused)))
+{
+  printf("Hello, world!\n");
+  return 0;
+}
+  ]])],
+ac_cv___attribute___unused=yes,
+ac_cv___attribute___unused=no)])
+CFLAGS="$save_CFLAGS"
+if test "$ac_cv___attribute___unused" = "yes"; then
   V_DEFS="$V_DEFS -D_U_=\"__attribute__((unused))\""
 else
   V_DEFS="$V_DEFS -D_U_=\"\""
 fi
-AC_MSG_RESULT($ac_cv___attribute__)
+AC_MSG_RESULT($ac_cv___attribute___unused)
+])
+
+dnl
+dnl Test whether __attribute__((format)) can be used without warnings
+dnl
+
+AC_DEFUN(AC_C___ATTRIBUTE___FORMAT, [
+AC_MSG_CHECKING([whether __attribute__((format)) can be used without warnings])
+AC_CACHE_VAL(ac_cv___attribute___format, [
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors"
+AC_COMPILE_IFELSE([
+  AC_LANG_SOURCE([[
+#include <stdlib.h>
+
+extern int foo(const char *fmt, ...)
+		  __attribute__ ((format (printf, 1, 2)));
+
+int
+main(int argc, char **argv)
+{
+  foo("%s", "test");
+}
+  ]])],
+ac_cv___attribute___format=yes,
+ac_cv___attribute___format=no)])
+CFLAGS="$save_CFLAGS"
+if test "$ac_cv___attribute___format" = "yes"; then
+  AC_DEFINE(__ATTRIBUTE___FORMAT_OK, 1,
+    [define if your compiler allows __attribute__((format)) without a warning])
+fi
+AC_MSG_RESULT($ac_cv___attribute___format)
 ])
 
 dnl
@@ -898,3 +1234,62 @@
    if test $ac_cv_lbl_tpacket_stats = yes; then
        AC_DEFINE(HAVE_TPACKET_STATS,1,[if if_packet.h has tpacket_stats defined])
    fi])
+
+dnl
+dnl Checks to see if the tpacket_auxdata struct has a tp_vlan_tci member.
+dnl
+dnl usage:
+dnl
+dnl	AC_LBL_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI
+dnl
+dnl results:
+dnl
+dnl	HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI (defined)
+dnl
+dnl NOTE: any compile failure means we conclude that it doesn't have
+dnl that member, so if we don't have tpacket_auxdata, we conclude it
+dnl doesn't have that member (which is OK, as either we won't be using
+dnl code that would use that member, or we wouldn't compile in any case).
+dnl
+AC_DEFUN(AC_LBL_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI,
+    [AC_MSG_CHECKING(if tpacket_auxdata struct has tp_vlan_tci member)
+    AC_CACHE_VAL(ac_cv_lbl_linux_tpacket_auxdata_tp_vlan_tci,
+	AC_TRY_COMPILE([
+#	include <sys/types.h>
+#	include <linux/if_packet.h>],
+	[u_int i = sizeof(((struct tpacket_auxdata *)0)->tp_vlan_tci)],
+	ac_cv_lbl_linux_tpacket_auxdata_tp_vlan_tci=yes,
+	ac_cv_lbl_linux_tpacket_auxdata_tp_vlan_tci=no))
+    AC_MSG_RESULT($ac_cv_lbl_linux_tpacket_auxdata_tp_vlan_tci)
+    if test $ac_cv_lbl_linux_tpacket_auxdata_tp_vlan_tci = yes ; then
+	    HAVE_LINUX_TPACKET_AUXDATA=tp_vlan_tci
+	    AC_SUBST(HAVE_LINUX_TPACKET_AUXDATA)
+	    AC_DEFINE(HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI,1,[if tp_vlan_tci exists])
+    fi])
+
+dnl
+dnl Checks to see if Solaris has the dl_passive_req_t struct defined
+dnl in <sys/dlpi.h>.
+dnl
+dnl usage:
+dnl
+dnl	AC_LBL_DL_PASSIVE_REQ_T
+dnl
+dnl results:
+dnl 
+dnl 	HAVE_DLPI_PASSIVE (defined)
+dnl
+AC_DEFUN(AC_LBL_DL_PASSIVE_REQ_T,
+        [AC_MSG_CHECKING(if dl_passive_req_t struct exists)
+       AC_CACHE_VAL(ac_cv_lbl_has_dl_passive_req_t,
+                AC_TRY_COMPILE([
+#       include <sys/types.h>
+#       include <sys/dlpi.h>],
+        [u_int i = sizeof(dl_passive_req_t)],
+        ac_cv_lbl_has_dl_passive_req_t=yes,
+        ac_cv_lbl_has_dl_passive_req_t=no))
+    AC_MSG_RESULT($ac_cv_lbl_has_dl_passive_req_t)
+    if test $ac_cv_lbl_has_dl_passive_req_t = yes ; then
+            AC_DEFINE(HAVE_DLPI_PASSIVE,1,[if passive_req_t primitive
+		exists])
+    fi])
diff --git a/arcnet.h b/arcnet.h
index dce7335..4f86043 100644
--- a/arcnet.h
+++ b/arcnet.h
@@ -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
  */
diff --git a/atmuni31.h b/atmuni31.h
index 877ed68..880cc1a 100644
--- a/atmuni31.h
+++ b/atmuni31.h
@@ -29,18 +29,18 @@
  * 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 2002/07/11 09:06:32 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 */
 
 /* ATM traffic types based on VPI=0 and (the following VCI */
-#define PPC			0x05	/* Point-to-point signal msg */
-#define BCC			0x02	/* Broadcast signal msg */
-#define OAMF4SC			0x03	/* Segment OAM F4 flow cell */
-#define OAMF4EC			0x04	/* End-to-end OAM F4 flow cell */
-#define METAC			0x01	/* Meta signal msg */
-#define ILMIC			0x10	/* ILMI msg */
+#define VCI_PPC			0x05	/* Point-to-point signal msg */
+#define VCI_BCC			0x02	/* Broadcast signal msg */
+#define VCI_OAMF4SC		0x03	/* Segment OAM F4 flow cell */
+#define VCI_OAMF4EC		0x04	/* End-to-end OAM F4 flow cell */
+#define VCI_METAC		0x01	/* Meta signal msg */
+#define VCI_ILMIC		0x10	/* ILMI msg */
 
 /* Q.2931 signalling messages */
 #define CALL_PROCEED		0x02	/* call proceeding */
diff --git a/bpf/net/bpf_filter.c b/bpf/net/bpf_filter.c
index 40df32a..0c4fb00 100644
--- a/bpf/net/bpf_filter.c
+++ b/bpf/net/bpf_filter.c
@@ -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.44 2003/11/15 23:24:07 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 @@
 
 #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,13 +74,13 @@
 # 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 */
 
-#include <pcap-bpf.h>
+#include <pcap/bpf.h>
 
 #if !defined(KERNEL) && !defined(_KERNEL)
 #include <stdlib.h>
@@ -200,8 +209,8 @@
  */
 u_int
 bpf_filter(pc, p, wirelen, buflen)
-	register struct bpf_insn *pc;
-	register u_char *p;
+	register const struct bpf_insn *pc;
+	register const u_char *p;
 	u_int wirelen;
 	register u_int buflen;
 {
@@ -396,7 +405,18 @@
 			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:
@@ -512,54 +532,155 @@
 	}
 }
 
-
 /*
  * Return true if the 'fcode' is a valid filter program.
  * The constraints are that each jump be forward and to a valid
- * code.  The code must terminate with either an accept or reject.
- * 'valid' is an array for use by the routine (it must be at least
- * 'len' bytes long).
+ * code, that memory accesses are within valid ranges (to the
+ * extent that this can be checked statically; loads of packet
+ * data have to be, and are, also checked at run time), and that
+ * the code terminates with either an accept or reject.
  *
  * The kernel needs to be able to verify an application's filter code.
  * Otherwise, a bogus program could easily crash the system.
  */
 int
 bpf_validate(f, len)
-	struct bpf_insn *f;
+	const struct bpf_insn *f;
 	int len;
 {
-	register int i;
-	register struct bpf_insn *p;
+	u_int i, from;
+	const struct bpf_insn *p;
+
+	if (len < 1)
+		return 0;
+	/*
+	 * There's no maximum program length in userland.
+	 */
+#if defined(KERNEL) || defined(_KERNEL)
+	if (len > BPF_MAXINSNS)
+		return 0;
+#endif
 
 	for (i = 0; i < len; ++i) {
-		/*
-		 * Check that that jumps are forward, and within
-		 * the code block.
-		 */
 		p = &f[i];
-		if (BPF_CLASS(p->code) == BPF_JMP) {
-			register int from = i + 1;
-
-			if (BPF_OP(p->code) == BPF_JA) {
-				if (from + p->k >= (unsigned)len)
-					return 0;
-			}
-			else if (from + p->jt >= len || from + p->jf >= len)
-				return 0;
-		}
+		switch (BPF_CLASS(p->code)) {
 		/*
 		 * Check that memory operations use valid addresses.
 		 */
-		if ((BPF_CLASS(p->code) == BPF_ST ||
-		     (BPF_CLASS(p->code) == BPF_LD &&
-		      (p->code & 0xe0) == BPF_MEM)) &&
-		    (p->k >= BPF_MEMWORDS || p->k < 0))
+		case BPF_LD:
+		case BPF_LDX:
+			switch (BPF_MODE(p->code)) {
+			case BPF_IMM:
+				break;
+			case BPF_ABS:
+			case BPF_IND:
+			case BPF_MSH:
+				/*
+				 * There's no maximum packet data size
+				 * in userland.  The runtime packet length
+				 * check suffices.
+				 */
+#if defined(KERNEL) || defined(_KERNEL)
+				/*
+				 * More strict check with actual packet length
+				 * is done runtime.
+				 */
+				if (p->k >= bpf_maxbufsize)
+					return 0;
+#endif
+				break;
+			case BPF_MEM:
+				if (p->k >= BPF_MEMWORDS)
+					return 0;
+				break;
+			case BPF_LEN:
+				break;
+			default:
+				return 0;
+			}
+			break;
+		case BPF_ST:
+		case BPF_STX:
+			if (p->k >= BPF_MEMWORDS)
+				return 0;
+			break;
+		case BPF_ALU:
+			switch (BPF_OP(p->code)) {
+			case BPF_ADD:
+			case BPF_SUB:
+			case BPF_MUL:
+			case BPF_OR:
+			case BPF_AND:
+			case BPF_LSH:
+			case BPF_RSH:
+			case BPF_NEG:
+				break;
+			case BPF_DIV:
+				/*
+				 * Check for constant division by 0.
+				 */
+				if (BPF_SRC(p->code) == BPF_K && p->k == 0)
+					return 0;
+				break;
+			default:
+				return 0;
+			}
+			break;
+		case BPF_JMP:
+			/*
+			 * Check that jumps are within the code block,
+			 * and that unconditional branches don't go
+			 * backwards as a result of an overflow.
+			 * Unconditional branches have a 32-bit offset,
+			 * so they could overflow; we check to make
+			 * sure they don't.  Conditional branches have
+			 * an 8-bit offset, and the from address is <=
+			 * BPF_MAXINSNS, and we assume that BPF_MAXINSNS
+			 * is sufficiently small that adding 255 to it
+			 * won't overflow.
+			 *
+			 * We know that len is <= BPF_MAXINSNS, and we
+			 * assume that BPF_MAXINSNS is < the maximum size
+			 * of a u_int, so that i + 1 doesn't overflow.
+			 *
+			 * For userland, we don't know that the from
+			 * or len are <= BPF_MAXINSNS, but we know that
+			 * from <= len, and, except on a 64-bit system,
+			 * it's unlikely that len, if it truly reflects
+			 * the size of the program we've been handed,
+			 * will be anywhere near the maximum size of
+			 * a u_int.  We also don't check for backward
+			 * branches, as we currently support them in
+			 * userland for the protochain operation.
+			 */
+			from = i + 1;
+			switch (BPF_OP(p->code)) {
+			case BPF_JA:
+#if defined(KERNEL) || defined(_KERNEL)
+				if (from + p->k < from || from + p->k >= len)
+#else
+				if (from + p->k >= len)
+#endif
+					return 0;
+				break;
+			case BPF_JEQ:
+			case BPF_JGT:
+			case BPF_JGE:
+			case BPF_JSET:
+				if (from + p->jt >= len || from + p->jf >= len)
+					return 0;
+				break;
+			default:
+				return 0;
+			}
+			break;
+		case BPF_RET:
+			break;
+		case BPF_MISC:
+			break;
+		default:
 			return 0;
-		/*
-		 * Check for constant division by 0.
-		 */
-		if (p->code == (BPF_ALU|BPF_DIV|BPF_K) && p->k == 0)
-			return 0;
+		}
 	}
 	return BPF_CLASS(f[len - 1].code) == BPF_RET;
 }
diff --git a/bpf_dump.c b/bpf_dump.c
index 303602e..e4ff4a2 100644
--- a/bpf_dump.c
+++ b/bpf_dump.c
@@ -20,7 +20,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/bpf_dump.c,v 1.14 2003/11/15 23:23:57 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
@@ -31,9 +31,9 @@
 #include <stdio.h>
 
 void
-bpf_dump(struct bpf_program *p, int option)
+bpf_dump(const struct bpf_program *p, int option)
 {
-	struct bpf_insn *insn;
+	const struct bpf_insn *insn;
 	int i;
 	int n = p->bf_len;
 
diff --git a/bpf_filter.c b/bpf_filter.c
new file mode 120000
index 0000000..0605488
--- /dev/null
+++ b/bpf_filter.c
@@ -0,0 +1 @@
+./bpf/net/bpf_filter.c
\ No newline at end of file
diff --git a/bpf_image.c b/bpf_image.c
index 2e76128..e6c0f62 100644
--- a/bpf_image.c
+++ b/bpf_image.c
@@ -21,13 +21,27 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/bpf_image.c,v 1.26.2.1 2007/06/11 09:52:04 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>
 
@@ -39,7 +53,7 @@
 
 char *
 bpf_image(p, n)
-	struct bpf_insn *p;
+	const struct bpf_insn *p;
 	int n;
 {
 	int v;
@@ -278,11 +292,14 @@
 		break;
 	}
 	(void)snprintf(operand, sizeof operand, fmt, v);
-	(void)snprintf(image, sizeof image,
-		      (BPF_CLASS(p->code) == BPF_JMP &&
-		       BPF_OP(p->code) != BPF_JA) ?
-		      "(%03d) %-8s %-16s jt %d\tjf %d"
-		      : "(%03d) %-8s %s",
-		      n, op, operand, n + 1 + p->jt, n + 1 + p->jf);
+	if (BPF_CLASS(p->code) == BPF_JMP && BPF_OP(p->code) != BPF_JA) {
+		(void)snprintf(image, sizeof image,
+			      "(%03d) %-8s %-16s jt %d\tjf %d",
+			      n, op, operand, n + 1 + p->jt, n + 1 + p->jf);
+	} else {
+		(void)snprintf(image, sizeof image,
+			      "(%03d) %-8s %s",
+			      n, op, operand);
+	}
 	return image;
 }
diff --git a/chmod_bpf b/chmod_bpf
new file mode 100755
index 0000000..0a30d99
--- /dev/null
+++ b/chmod_bpf
@@ -0,0 +1,19 @@
+#! /bin/sh
+
+#
+# Unfortunately, Mac OS X's devfs is based on the old FreeBSD
+# one, not the current one, so there's no way to configure it
+# to create BPF devices with particular owners or groups.
+# This startup item will make it owned by the admin group,
+# with permissions rw-rw----, so that anybody in the admin
+# group can use programs that capture or send raw packets.
+#
+# Change this as appropriate for your site, e.g. to make
+# it owned by a particular user without changing the permissions,
+# so only that user and the super-user can capture or send raw
+# packets, or give it the permissions rw-r-----, so that
+# only the super-user can send raw packets but anybody in the
+# admin group can capture packets.
+#
+chgrp admin /dev/bpf*
+chmod g+rw /dev/bpf*
diff --git a/config.guess b/config.guess
index 4c5bde8..c2246a4 100755
--- a/config.guess
+++ b/config.guess
@@ -1,9 +1,10 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+#   Free Software Foundation, Inc.
 
-timestamp='2003-10-16'
+timestamp='2009-12-30'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -17,23 +18,25 @@
 #
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
 # the same distribution terms that you use for the rest of that program.
 
-# Originally written by Per Bothner <per@bothner.com>.
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted ChangeLog entry.
+
+# Originally written by Per Bothner.  Please send patches (context
+# diff format) to <config-patches@gnu.org> and include a ChangeLog
+# entry.
 #
 # This script attempts to guess a canonical system name similar to
 # config.sub.  If it succeeds, it prints the system name on stdout, and
 # exits with 0.  Otherwise, it exits with 1.
 #
-# The plan is that this can be called by configure scripts if you
-# don't specify an explicit build system type.
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
 
 me=`echo "$0" | sed -e 's,.*/,,'`
 
@@ -53,8 +56,9 @@
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
+Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -66,11 +70,11 @@
 while test $# -gt 0 ; do
   case $1 in
     --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit 0 ;;
+       echo "$timestamp" ; exit ;;
     --version | -v )
-       echo "$version" ; exit 0 ;;
+       echo "$version" ; exit ;;
     --help | --h* | -h )
-       echo "$usage"; exit 0 ;;
+       echo "$usage"; exit ;;
     -- )     # Stop option processing
        shift; break ;;
     - )	# Use stdin as input.
@@ -104,7 +108,7 @@
 trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
 trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
 : ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
  { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
  { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
  { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
@@ -123,7 +127,7 @@
 	;;
  ,,*)   CC_FOR_BUILD=$CC ;;
  ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ;'
+esac ; set_cc_for_build= ;'
 
 # This is needed to find uname on a Pyramid OSx when run in the BSD universe.
 # (ghazi@noc.rutgers.edu 1994-08-24)
@@ -158,6 +162,7 @@
 	    arm*) machine=arm-unknown ;;
 	    sh3el) machine=shl-unknown ;;
 	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
 	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 	esac
 	# The Operating System including object format, if it has switched
@@ -166,7 +171,7 @@
 	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
 		eval $set_cc_for_build
 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-			| grep __ELF__ >/dev/null
+			| grep -q __ELF__
 		then
 		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
 		    # Return netbsd for either.  FIX?
@@ -196,53 +201,32 @@
 	# contains redundant information, the shorter form:
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
 	echo "${machine}-${os}${release}"
-	exit 0 ;;
-    amiga:OpenBSD:*:*)
-	echo m68k-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    arc:OpenBSD:*:*)
-	echo mipsel-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    hp300:OpenBSD:*:*)
-	echo m68k-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    mac68k:OpenBSD:*:*)
-	echo m68k-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    macppc:OpenBSD:*:*)
-	echo powerpc-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    mvme68k:OpenBSD:*:*)
-	echo m68k-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    mvme88k:OpenBSD:*:*)
-	echo m88k-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    mvmeppc:OpenBSD:*:*)
-	echo powerpc-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    pegasos:OpenBSD:*:*)
-	echo powerpc-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    pmax:OpenBSD:*:*)
-	echo mipsel-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    sgi:OpenBSD:*:*)
-	echo mipseb-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    sun3:OpenBSD:*:*)
-	echo m68k-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
-    wgrisc:OpenBSD:*:*)
-	echo mipsel-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:OpenBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
-	exit 0 ;;
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
     alpha:OSF1:*:*)
-	if test $UNAME_RELEASE = "V4.0"; then
+	case $UNAME_RELEASE in
+	*4.0)
 		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-	fi
+		;;
+	*5.*)
+	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
 	# According to Compaq, /usr/sbin/psrinfo has been available on
 	# OSF/1 and Tru64 systems produced since 1995.  I hope that
 	# covers most systems running today.  This code pipes the CPU
@@ -280,45 +264,49 @@
 	    "EV7.9 (21364A)")
 		UNAME_MACHINE="alphaev79" ;;
 	esac
+	# A Pn.n version is a patched version.
 	# A Vn.n version is a released version.
 	# A Tn.n version is a released field test version.
 	# A Xn.n version is an unreleased experimental baselevel.
 	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	exit 0 ;;
-    Alpha*:OpenVMS:*:*)
-	echo alpha-hp-vms
-	exit 0 ;;
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit ;;
     Alpha\ *:Windows_NT*:*)
 	# How do we know it's Interix rather than the generic POSIX subsystem?
 	# Should we change UNAME_MACHINE based on the output of uname instead
 	# of the specific Alpha model?
 	echo alpha-pc-interix
-	exit 0 ;;
+	exit ;;
     21064:Windows_NT:50:3)
 	echo alpha-dec-winnt3.5
-	exit 0 ;;
+	exit ;;
     Amiga*:UNIX_System_V:4.0:*)
 	echo m68k-unknown-sysv4
-	exit 0;;
+	exit ;;
     *:[Aa]miga[Oo][Ss]:*:*)
 	echo ${UNAME_MACHINE}-unknown-amigaos
-	exit 0 ;;
+	exit ;;
     *:[Mm]orph[Oo][Ss]:*:*)
 	echo ${UNAME_MACHINE}-unknown-morphos
-	exit 0 ;;
+	exit ;;
     *:OS/390:*:*)
 	echo i370-ibm-openedition
-	exit 0 ;;
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
     *:OS400:*:*)
         echo powerpc-ibm-os400
-	exit 0 ;;
+	exit ;;
     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
 	echo arm-acorn-riscix${UNAME_RELEASE}
-	exit 0;;
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
     SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
 	echo hppa1.1-hitachi-hiuxmpp
-	exit 0;;
+	exit ;;
     Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
 	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
 	if test "`(/bin/universe) 2>/dev/null`" = att ; then
@@ -326,32 +314,51 @@
 	else
 		echo pyramid-pyramid-bsd
 	fi
-	exit 0 ;;
+	exit ;;
     NILE*:*:*:dcosx)
 	echo pyramid-pyramid-svr4
-	exit 0 ;;
+	exit ;;
     DRS?6000:unix:4.0:6*)
 	echo sparc-icl-nx6
-	exit 0 ;;
-    DRS?6000:UNIX_SV:4.2*:7*)
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
 	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7 && exit 0 ;;
+	    sparc) echo sparc-icl-nx7; exit ;;
 	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
     sun4H:SunOS:5.*:*)
 	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit 0 ;;
+	exit ;;
     sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
 	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit 0 ;;
-    i86pc:SunOS:5.*:*)
-	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit 0 ;;
+	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux${UNAME_RELEASE}
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
     sun4*:SunOS:6*:*)
 	# According to config.sub, this is the proper way to canonicalize
 	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
 	# it's likely to be more like Solaris than SunOS4.
 	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit 0 ;;
+	exit ;;
     sun4*:SunOS:*:*)
 	case "`/usr/bin/arch -k`" in
 	    Series*|S4*)
@@ -360,10 +367,10 @@
 	esac
 	# Japanese Language versions have a version number like `4.1.3-JL'.
 	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-	exit 0 ;;
+	exit ;;
     sun3*:SunOS:*:*)
 	echo m68k-sun-sunos${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     sun*:*:4.2BSD:*)
 	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
 	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
@@ -375,10 +382,10 @@
 		echo sparc-sun-sunos${UNAME_RELEASE}
 		;;
 	esac
-	exit 0 ;;
+	exit ;;
     aushp:SunOS:*:*)
 	echo sparc-auspex-sunos${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     # The situation for MiNT is a little confusing.  The machine name
     # can be virtually everything (everything which is not
     # "atarist" or "atariste" at least should have a processor
@@ -389,37 +396,40 @@
     # be no problem.
     atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
         echo m68k-atari-mint${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
 	echo m68k-atari-mint${UNAME_RELEASE}
-        exit 0 ;;
+        exit ;;
     *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
         echo m68k-atari-mint${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
         echo m68k-milan-mint${UNAME_RELEASE}
-        exit 0 ;;
+        exit ;;
     hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
         echo m68k-hades-mint${UNAME_RELEASE}
-        exit 0 ;;
+        exit ;;
     *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
         echo m68k-unknown-mint${UNAME_RELEASE}
-        exit 0 ;;
+        exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
     powerpc:machten:*:*)
 	echo powerpc-apple-machten${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     RISC*:Mach:*:*)
 	echo mips-dec-mach_bsd4.3
-	exit 0 ;;
+	exit ;;
     RISC*:ULTRIX:*:*)
 	echo mips-dec-ultrix${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     VAX*:ULTRIX*:*:*)
 	echo vax-dec-ultrix${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     2020:CLIX:*:* | 2430:CLIX:*:*)
 	echo clipper-intergraph-clix${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     mips:*:*:UMIPS | mips:*:*:RISCos)
 	eval $set_cc_for_build
 	sed 's/^	//' << EOF >$dummy.c
@@ -443,32 +453,33 @@
 	  exit (-1);
 	}
 EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c \
-	  && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
-	  && exit 0
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
 	echo mips-mips-riscos${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     Motorola:PowerMAX_OS:*:*)
 	echo powerpc-motorola-powermax
-	exit 0 ;;
+	exit ;;
     Motorola:*:4.3:PL8-*)
 	echo powerpc-harris-powermax
-	exit 0 ;;
+	exit ;;
     Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
 	echo powerpc-harris-powermax
-	exit 0 ;;
+	exit ;;
     Night_Hawk:Power_UNIX:*:*)
 	echo powerpc-harris-powerunix
-	exit 0 ;;
+	exit ;;
     m88k:CX/UX:7*:*)
 	echo m88k-harris-cxux7
-	exit 0 ;;
+	exit ;;
     m88k:*:4*:R4*)
 	echo m88k-motorola-sysv4
-	exit 0 ;;
+	exit ;;
     m88k:*:3*:R3*)
 	echo m88k-motorola-sysv3
-	exit 0 ;;
+	exit ;;
     AViiON:dgux:*:*)
         # DG/UX returns AViiON for all architectures
         UNAME_PROCESSOR=`/usr/bin/uname -p`
@@ -484,29 +495,29 @@
 	else
 	    echo i586-dg-dgux${UNAME_RELEASE}
 	fi
- 	exit 0 ;;
+ 	exit ;;
     M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
 	echo m88k-dolphin-sysv3
-	exit 0 ;;
+	exit ;;
     M88*:*:R3*:*)
 	# Delta 88k system running SVR3
 	echo m88k-motorola-sysv3
-	exit 0 ;;
+	exit ;;
     XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
 	echo m88k-tektronix-sysv3
-	exit 0 ;;
+	exit ;;
     Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
 	echo m68k-tektronix-bsd
-	exit 0 ;;
+	exit ;;
     *:IRIX*:*:*)
 	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-	exit 0 ;;
+	exit ;;
     ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
-	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
     i*86:AIX:*:*)
 	echo i386-ibm-aix
-	exit 0 ;;
+	exit ;;
     ia64:AIX:*:*)
 	if [ -x /usr/bin/oslevel ] ; then
 		IBM_REV=`/usr/bin/oslevel`
@@ -514,7 +525,7 @@
 		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
 	fi
 	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-	exit 0 ;;
+	exit ;;
     *:AIX:2:3)
 	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
 		eval $set_cc_for_build
@@ -529,15 +540,19 @@
 			exit(0);
 			}
 EOF
-		$CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
-		echo rs6000-ibm-aix3.2.5
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
 	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
 		echo rs6000-ibm-aix3.2.4
 	else
 		echo rs6000-ibm-aix3.2
 	fi
-	exit 0 ;;
-    *:AIX:*:[45])
+	exit ;;
+    *:AIX:*:[456])
 	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
 	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
 		IBM_ARCH=rs6000
@@ -550,28 +565,28 @@
 		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
 	fi
 	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-	exit 0 ;;
+	exit ;;
     *:AIX:*:*)
 	echo rs6000-ibm-aix
-	exit 0 ;;
+	exit ;;
     ibmrt:4.4BSD:*|romp-ibm:BSD:*)
 	echo romp-ibm-bsd4.4
-	exit 0 ;;
+	exit ;;
     ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
 	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-	exit 0 ;;                           # report: romp-ibm BSD 4.3
+	exit ;;                             # report: romp-ibm BSD 4.3
     *:BOSX:*:*)
 	echo rs6000-bull-bosx
-	exit 0 ;;
+	exit ;;
     DPX/2?00:B.O.S.:*:*)
 	echo m68k-bull-sysv3
-	exit 0 ;;
+	exit ;;
     9000/[34]??:4.3bsd:1.*:*)
 	echo m68k-hp-bsd
-	exit 0 ;;
+	exit ;;
     hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
 	echo m68k-hp-bsd4.4
-	exit 0 ;;
+	exit ;;
     9000/[34678]??:HP-UX:*:*)
 	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
 	case "${UNAME_MACHINE}" in
@@ -633,9 +648,19 @@
 	esac
 	if [ ${HP_ARCH} = "hppa2.0w" ]
 	then
-	    # avoid double evaluation of $set_cc_for_build
-	    test -n "$CC_FOR_BUILD" || eval $set_cc_for_build
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
 	    then
 		HP_ARCH="hppa2.0w"
 	    else
@@ -643,11 +668,11 @@
 	    fi
 	fi
 	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-	exit 0 ;;
+	exit ;;
     ia64:HP-UX:*:*)
 	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
 	echo ia64-hp-hpux${HPUX_REV}
-	exit 0 ;;
+	exit ;;
     3050*:HI-UX:*:*)
 	eval $set_cc_for_build
 	sed 's/^	//' << EOF >$dummy.c
@@ -675,207 +700,164 @@
 	  exit (0);
 	}
 EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
 	echo unknown-hitachi-hiuxwe2
-	exit 0 ;;
+	exit ;;
     9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
 	echo hppa1.1-hp-bsd
-	exit 0 ;;
+	exit ;;
     9000/8??:4.3bsd:*:*)
 	echo hppa1.0-hp-bsd
-	exit 0 ;;
+	exit ;;
     *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
 	echo hppa1.0-hp-mpeix
-	exit 0 ;;
+	exit ;;
     hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
 	echo hppa1.1-hp-osf
-	exit 0 ;;
+	exit ;;
     hp8??:OSF1:*:*)
 	echo hppa1.0-hp-osf
-	exit 0 ;;
+	exit ;;
     i*86:OSF1:*:*)
 	if [ -x /usr/sbin/sysversion ] ; then
 	    echo ${UNAME_MACHINE}-unknown-osf1mk
 	else
 	    echo ${UNAME_MACHINE}-unknown-osf1
 	fi
-	exit 0 ;;
+	exit ;;
     parisc*:Lites*:*:*)
 	echo hppa1.1-hp-lites
-	exit 0 ;;
+	exit ;;
     C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
 	echo c1-convex-bsd
-        exit 0 ;;
+        exit ;;
     C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
 	if getsysinfo -f scalar_acc
 	then echo c32-convex-bsd
 	else echo c2-convex-bsd
 	fi
-        exit 0 ;;
+        exit ;;
     C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
 	echo c34-convex-bsd
-        exit 0 ;;
+        exit ;;
     C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
 	echo c38-convex-bsd
-        exit 0 ;;
+        exit ;;
     C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
 	echo c4-convex-bsd
-        exit 0 ;;
+        exit ;;
     CRAY*Y-MP:*:*:*)
 	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit 0 ;;
+	exit ;;
     CRAY*[A-Z]90:*:*:*)
 	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
 	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
 	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
 	      -e 's/\.[^.]*$/.X/'
-	exit 0 ;;
+	exit ;;
     CRAY*TS:*:*:*)
 	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit 0 ;;
+	exit ;;
     CRAY*T3E:*:*:*)
 	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit 0 ;;
+	exit ;;
     CRAY*SV1:*:*:*)
 	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit 0 ;;
+	exit ;;
     *:UNICOS/mp:*:*)
-	echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit 0 ;;
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
 	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
         FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
         FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
         echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-        exit 0 ;;
+        exit ;;
     5000:UNIX_System_V:4.*:*)
         FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
         FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
         echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit 0 ;;
+	exit ;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
 	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     sparc*:BSD/OS:*:*)
 	echo sparc-unknown-bsdi${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:BSD/OS:*:*)
 	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:FreeBSD:*:*)
-	# Determine whether the default compiler uses glibc.
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <features.h>
-	#if __GLIBC__ >= 2
-	LIBC=gnu
-	#else
-	LIBC=
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
-	# GNU/KFreeBSD systems have a "k" prefix to indicate we are using
-	# FreeBSD's kernel, but not the complete OS.
-	case ${LIBC} in gnu) kernel_only='k' ;; esac
-	echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC}
-	exit 0 ;;
+	case ${UNAME_MACHINE} in
+	    pc98)
+		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
     i*:CYGWIN*:*)
 	echo ${UNAME_MACHINE}-pc-cygwin
-	exit 0 ;;
-    i*:MINGW*:*)
+	exit ;;
+    *:MINGW*:*)
 	echo ${UNAME_MACHINE}-pc-mingw32
-	exit 0 ;;
+	exit ;;
+    i*:windows32*:*)
+    	# uname -m includes "-pc" on this system.
+    	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
     i*:PW*:*)
 	echo ${UNAME_MACHINE}-pc-pw32
-	exit 0 ;;
-    x86:Interix*:[34]*)
-	echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//'
-	exit 0 ;;
+	exit ;;
+    *:Interix*:*)
+    	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    authenticamd | genuineintel | EM64T)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
     [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
 	echo i${UNAME_MACHINE}-pc-mks
-	exit 0 ;;
+	exit ;;
+    8664:Windows_NT:*)
+	echo x86_64-pc-mks
+	exit ;;
     i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
 	# How do we know it's Interix rather than the generic POSIX subsystem?
 	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
 	# UNAME_MACHINE based on the output of uname instead of i386?
 	echo i586-pc-interix
-	exit 0 ;;
+	exit ;;
     i*:UWIN*:*)
 	echo ${UNAME_MACHINE}-pc-uwin
-	exit 0 ;;
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
     p*:CYGWIN*:*)
 	echo powerpcle-unknown-cygwin
-	exit 0 ;;
+	exit ;;
     prep*:SunOS:5.*:*)
 	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit 0 ;;
+	exit ;;
     *:GNU:*:*)
 	# the GNU system
 	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-	exit 0 ;;
+	exit ;;
     *:GNU/*:*:*)
 	# other systems with GNU libc and userland
 	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
-	exit 0 ;;
+	exit ;;
     i*86:Minix:*:*)
 	echo ${UNAME_MACHINE}-pc-minix
-	exit 0 ;;
-    arm*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit 0 ;;
-    cris:Linux:*:*)
-	echo cris-axis-linux-gnu
-	exit 0 ;;
-    ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit 0 ;;
-    m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit 0 ;;
-    mips:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef mips
-	#undef mipsel
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=mipsel
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=mips
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
-	test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
-	;;
-    mips64:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef mips64
-	#undef mips64el
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=mips64el
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=mips64
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
-	test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
-	;;
-    ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
-	exit 0 ;;
-    ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
-	exit 0 ;;
+	exit ;;
     alpha:Linux:*:*)
 	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
 	  EV5)   UNAME_MACHINE=alphaev5 ;;
@@ -886,10 +868,80 @@
 	  EV67)  UNAME_MACHINE=alphaev67 ;;
 	  EV68*) UNAME_MACHINE=alphaev68 ;;
         esac
-	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	objdump --private-headers /bin/sh | grep -q ld.so.1
 	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
 	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
-	exit 0 ;;
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+    	echo frv-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	LIBC=gnu
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=${UNAME_MACHINE}el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=${UNAME_MACHINE}
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo or32-unknown-linux-gnu
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-gnu
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
     parisc:Linux:*:* | hppa:Linux:*:*)
 	# Look for CPU level
 	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
@@ -897,87 +949,40 @@
 	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
 	  *)    echo hppa-unknown-linux-gnu ;;
 	esac
-	exit 0 ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
-	exit 0 ;;
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
 	echo ${UNAME_MACHINE}-ibm-linux
-	exit 0 ;;
+	exit ;;
     sh64*:Linux:*:*)
     	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit 0 ;;
+	exit ;;
     sh*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit 0 ;;
+	exit ;;
     sparc:Linux:*:* | sparc64:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit 0 ;;
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
     x86_64:Linux:*:*)
 	echo x86_64-unknown-linux-gnu
-	exit 0 ;;
-    i*86:Linux:*:*)
-	# The BFD linker knows what the default object file format is, so
-	# first see if it will tell us. cd to the root directory to prevent
-	# problems with other programs or directories called `ld' in the path.
-	# Set LC_ALL=C to ensure ld outputs messages in English.
-	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
-			 | sed -ne '/supported targets:/!d
-				    s/[ 	][ 	]*/ /g
-				    s/.*supported targets: *//
-				    s/ .*//
-				    p'`
-        case "$ld_supported_targets" in
-	  elf32-i386)
-		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
-		;;
-	  a.out-i386-linux)
-		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
-		exit 0 ;;
-	  coff-i386)
-		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
-		exit 0 ;;
-	  "")
-		# Either a pre-BFD a.out linker (linux-gnuoldld) or
-		# one that does not give us useful --help.
-		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
-		exit 0 ;;
-	esac
-	# Determine whether the default compiler is a.out or elf
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <features.h>
-	#ifdef __ELF__
-	# ifdef __GLIBC__
-	#  if __GLIBC__ >= 2
-	LIBC=gnu
-	#  else
-	LIBC=gnulibc1
-	#  endif
-	# else
-	LIBC=gnulibc1
-	# endif
-	#else
-	#ifdef __INTEL_COMPILER
-	LIBC=gnu
-	#else
-	LIBC=gnuaout
-	#endif
-	#endif
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
-	test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
-	test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
-	;;
+	exit ;;
+    xtensa*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
     i*86:DYNIX/ptx:4*:*)
 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
 	# earlier versions are messed up and put the nodename in both
 	# sysname and nodename.
 	echo i386-sequent-sysv4
-	exit 0 ;;
+	exit ;;
     i*86:UNIX_SV:4.2MP:2.*)
         # Unixware is an offshoot of SVR4, but it has its own version
         # number series starting with 2...
@@ -985,24 +990,27 @@
 	# I just have to hope.  -- rms.
         # Use sysv4.2uw... so that sysv4* matches it.
 	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-	exit 0 ;;
+	exit ;;
     i*86:OS/2:*:*)
 	# If we were able to find `uname', then EMX Unix compatibility
 	# is probably installed.
 	echo ${UNAME_MACHINE}-pc-os2-emx
-	exit 0 ;;
+	exit ;;
     i*86:XTS-300:*:STOP)
 	echo ${UNAME_MACHINE}-unknown-stop
-	exit 0 ;;
+	exit ;;
     i*86:atheos:*:*)
 	echo ${UNAME_MACHINE}-unknown-atheos
-	exit 0 ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
 	echo i386-unknown-lynxos${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     i*86:*DOS:*:*)
 	echo ${UNAME_MACHINE}-pc-msdosdjgpp
-	exit 0 ;;
+	exit ;;
     i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
 	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
 	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
@@ -1010,15 +1018,16 @@
 	else
 		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
 	fi
-	exit 0 ;;
-    i*86:*:5:[78]*)
+	exit ;;
+    i*86:*:5:[678]*)
+    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
 	case `/bin/uname -X | grep "^Machine"` in
 	    *486*)	     UNAME_MACHINE=i486 ;;
 	    *Pentium)	     UNAME_MACHINE=i586 ;;
 	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
 	esac
 	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-	exit 0 ;;
+	exit ;;
     i*86:*:3.2:*)
 	if test -f /usr/options/cb.name; then
 		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
@@ -1036,73 +1045,86 @@
 	else
 		echo ${UNAME_MACHINE}-pc-sysv32
 	fi
-	exit 0 ;;
+	exit ;;
     pc:*:*:*)
 	# Left here for compatibility:
         # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i386.
-	echo i386-pc-msdosdjgpp
-        exit 0 ;;
+        # the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+        exit ;;
     Intel:Mach:3*:*)
 	echo i386-pc-mach3
-	exit 0 ;;
+	exit ;;
     paragon:*:*:*)
 	echo i860-intel-osf1
-	exit 0 ;;
+	exit ;;
     i860:*:4.*:*) # i860-SVR4
 	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
 	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
 	else # Add other i860-SVR4 vendors below as they are discovered.
 	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
 	fi
-	exit 0 ;;
+	exit ;;
     mini*:CTIX:SYS*5:*)
 	# "miniframe"
 	echo m68010-convergent-sysv
-	exit 0 ;;
+	exit ;;
     mc68k:UNIX:SYSTEM5:3.51m)
 	echo m68k-convergent-sysv
-	exit 0 ;;
+	exit ;;
     M680?0:D-NIX:5.3:*)
 	echo m68k-diab-dnix
-	exit 0 ;;
-    M68*:*:R3V[567]*:*)
-	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0)
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
 	OS_REL=''
 	test -r /etc/.relid \
 	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
 	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
 	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	  && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
     3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
         /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && echo i486-ncr-sysv4 && exit 0 ;;
+          && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
     m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
 	echo m68k-unknown-lynxos${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     mc68030:UNIX_System_V:4.*:*)
 	echo m68k-atari-sysv4
-	exit 0 ;;
+	exit ;;
     TSUNAMI:LynxOS:2.*:*)
 	echo sparc-unknown-lynxos${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     rs6000:LynxOS:2.*:*)
 	echo rs6000-unknown-lynxos${UNAME_RELEASE}
-	exit 0 ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
 	echo powerpc-unknown-lynxos${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     SM[BE]S:UNIX_SV:*:*)
 	echo mips-dde-sysv${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     RM*:ReliantUNIX-*:*:*)
 	echo mips-sni-sysv4
-	exit 0 ;;
+	exit ;;
     RM*:SINIX-*:*:*)
 	echo mips-sni-sysv4
-	exit 0 ;;
+	exit ;;
     *:SINIX-*:*:*)
 	if uname -p 2>/dev/null >/dev/null ; then
 		UNAME_MACHINE=`(uname -p) 2>/dev/null`
@@ -1110,68 +1132,94 @@
 	else
 		echo ns32k-sni-sysv
 	fi
-	exit 0 ;;
+	exit ;;
     PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
                       # says <Richard.M.Bartel@ccMail.Census.GOV>
         echo i586-unisys-sysv4
-        exit 0 ;;
+        exit ;;
     *:UNIX_System_V:4*:FTX*)
 	# From Gerald Hewes <hewes@openmarket.com>.
 	# How about differentiating between stratus architectures? -djm
 	echo hppa1.1-stratus-sysv4
-	exit 0 ;;
+	exit ;;
     *:*:*:FTX*)
 	# From seanf@swdc.stratus.com.
 	echo i860-stratus-sysv4
-	exit 0 ;;
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
     *:VOS:*:*)
 	# From Paul.Green@stratus.com.
 	echo hppa1.1-stratus-vos
-	exit 0 ;;
+	exit ;;
     mc68*:A/UX:*:*)
 	echo m68k-apple-aux${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     news*:NEWS-OS:6*:*)
 	echo mips-sony-newsos6
-	exit 0 ;;
+	exit ;;
     R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
 	if [ -d /usr/nec ]; then
 	        echo mips-nec-sysv${UNAME_RELEASE}
 	else
 	        echo mips-unknown-sysv${UNAME_RELEASE}
 	fi
-        exit 0 ;;
+        exit ;;
     BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
 	echo powerpc-be-beos
-	exit 0 ;;
+	exit ;;
     BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
 	echo powerpc-apple-beos
-	exit 0 ;;
+	exit ;;
     BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
 	echo i586-pc-beos
-	exit 0 ;;
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
     SX-4:SUPER-UX:*:*)
 	echo sx4-nec-superux${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     SX-5:SUPER-UX:*:*)
 	echo sx5-nec-superux${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     SX-6:SUPER-UX:*:*)
 	echo sx6-nec-superux${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
     Power*:Rhapsody:*:*)
 	echo powerpc-apple-rhapsody${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:Rhapsody:*:*)
 	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:Darwin:*:*)
-	case `uname -p` in
-	    *86) UNAME_PROCESSOR=i686 ;;
-	    powerpc) UNAME_PROCESSOR=powerpc ;;
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    i386)
+		eval $set_cc_for_build
+		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		      grep IS_64BIT_ARCH >/dev/null
+		  then
+		      UNAME_PROCESSOR="x86_64"
+		  fi
+		fi ;;
+	    unknown) UNAME_PROCESSOR=powerpc ;;
 	esac
 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
 	UNAME_PROCESSOR=`uname -p`
 	if test "$UNAME_PROCESSOR" = "x86"; then
@@ -1179,22 +1227,25 @@
 		UNAME_MACHINE=pc
 	fi
 	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:QNX:*:4*)
 	echo i386-pc-qnx
-	exit 0 ;;
-    NSR-[DGKLNPTVWY]:NONSTOP_KERNEL:*:*)
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
 	echo nsr-tandem-nsk${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:NonStop-UX:*:*)
 	echo mips-compaq-nonstopux
-	exit 0 ;;
+	exit ;;
     BS2000:POSIX*:*:*)
 	echo bs2000-siemens-sysv
-	exit 0 ;;
+	exit ;;
     DS/*:UNIX_System_V:*:*)
 	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
     *:Plan9:*:*)
 	# "uname -m" is not consistent, so use $cputype instead. 386
 	# is converted to i386 for consistency with other x86
@@ -1205,31 +1256,50 @@
 	    UNAME_MACHINE="$cputype"
 	fi
 	echo ${UNAME_MACHINE}-unknown-plan9
-	exit 0 ;;
+	exit ;;
     *:TOPS-10:*:*)
 	echo pdp10-unknown-tops10
-	exit 0 ;;
+	exit ;;
     *:TENEX:*:*)
 	echo pdp10-unknown-tenex
-	exit 0 ;;
+	exit ;;
     KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
 	echo pdp10-dec-tops20
-	exit 0 ;;
+	exit ;;
     XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
 	echo pdp10-xkl-tops20
-	exit 0 ;;
+	exit ;;
     *:TOPS-20:*:*)
 	echo pdp10-unknown-tops20
-	exit 0 ;;
+	exit ;;
     *:ITS:*:*)
 	echo pdp10-unknown-its
-	exit 0 ;;
+	exit ;;
     SEI:*:*:SEIUX)
         echo mips-sei-seiux${UNAME_RELEASE}
-	exit 0 ;;
-    *:DRAGONFLY:*:*)
-	echo ${UNAME_MACHINE}-unknown-dragonfly${UNAME_RELEASE}
-	exit 0 ;;
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
 esac
 
 #echo '(No uname command or uname output not recognized.)' 1>&2
@@ -1261,7 +1331,7 @@
 #endif
 
 #if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix"); exit (0);
+  printf ("arm-acorn-riscix\n"); exit (0);
 #endif
 
 #if defined (hp300) && !defined (hpux)
@@ -1350,11 +1420,12 @@
 }
 EOF
 
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
 
 # Apollos put the system type in the environment.
 
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
 
 # Convex versions that predate uname can use getsysinfo(1)
 
@@ -1363,22 +1434,22 @@
     case `getsysinfo -f cpu_type` in
     c1*)
 	echo c1-convex-bsd
-	exit 0 ;;
+	exit ;;
     c2*)
 	if getsysinfo -f scalar_acc
 	then echo c32-convex-bsd
 	else echo c2-convex-bsd
 	fi
-	exit 0 ;;
+	exit ;;
     c34*)
 	echo c34-convex-bsd
-	exit 0 ;;
+	exit ;;
     c38*)
 	echo c38-convex-bsd
-	exit 0 ;;
+	exit ;;
     c4*)
 	echo c4-convex-bsd
-	exit 0 ;;
+	exit ;;
     esac
 fi
 
@@ -1389,7 +1460,9 @@
 the operating system you are using. It is advised that you
 download the most up to date version of the config scripts from
 
-    ftp://ftp.gnu.org/pub/gnu/config/
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
 
 If the version you run ($0) is already up to date, please
 send the following data and any information you think might be
diff --git a/config.h b/config.h
index 16eba1f..fe9b8f8 100644
--- a/config.h
+++ b/config.h
@@ -1,12 +1,5 @@
 /* config.h.  Generated from config.h.in by configure.  */
 /* config.h.in.  Generated from configure.in by autoheader.  */
-/* Long story short: aclocal.m4 depends on autoconf 2.13
- * implementation details wrt "const"; newer versions
- * have different implementation details so for now we
- * put "const" here.  This may cause duplicate definitions
- * in config.h but that should be OK since they're the same.
- */
-/* #undef const */
 
 /* Enable optimizer debugging */
 /* #undef BDEBUG */
@@ -20,19 +13,31 @@
 /* define if you have dag_get_erf_types() */
 /* #undef HAVE_DAG_GET_ERF_TYPES */
 
+/* define if you have dag_get_stream_erf_types() */
+/* #undef HAVE_DAG_GET_STREAM_ERF_TYPES */
+
 /* define if you have streams capable DAG API */
 /* #undef HAVE_DAG_STREAMS_API */
 
+/* define if you have vdag_set_device_info() */
+/* #undef HAVE_DAG_VDAG */
+
 /* Define to 1 if you have the declaration of `ether_hostton', and to 0 if you
    don't. */
-#define HAVE_DECL_ETHER_HOSTTON 0
+/* #undef HAVE_DECL_ETHER_HOSTTON */
 
 /* define if you have a /dev/dlpi */
 /* #undef HAVE_DEV_DLPI */
 
+/* if passive_req_t primitive exists */
+/* #undef HAVE_DLPI_PASSIVE */
+
 /* Define to 1 if you have the `ether_hostton' function. */
 /* #undef HAVE_ETHER_HOSTTON */
 
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+#define HAVE_FSEEKO 1
+
 /* on HP-UX 10.20 or later */
 /* #undef HAVE_HPUX10_20_OR_LATER */
 
@@ -45,9 +50,51 @@
 /* Define to 1 if you have the <inttypes.h> header file. */
 #define HAVE_INTTYPES_H 1
 
+/* if libdlpi exists */
+/* #undef HAVE_LIBDLPI */
+
+/* if libnl exists */
+/* #undef HAVE_LIBNL */
+
+/* if libnl exists and is version 2.x */
+/* #undef HAVE_LIBNL_2_x */
+
+/* if libnl exists and is version 3.x */
+/* #undef HAVE_LIBNL_3_x */
+
+/* libnl has NLE_FAILURE */
+/* #undef HAVE_LIBNL_NLE */
+
+/* libnl has new-style socket api */
+/* #undef HAVE_LIBNL_SOCKETS */
+
 /* Define to 1 if you have the <limits.h> header file. */
 #define HAVE_LIMITS_H 1
 
+/* Define to 1 if you have the <linux/compiler.h> header file. */
+/* #undef HAVE_LINUX_COMPILER_H */
+
+/* Define to 1 if you have the <linux/ethtool.h> header file. */
+#define HAVE_LINUX_ETHTOOL_H 1
+
+/* Define to 1 if you have the <linux/if_packet.h> header file. */
+#define HAVE_LINUX_IF_PACKET_H 1
+
+/* Define to 1 if you have the <linux/net_tstamp.h> header file. */
+#define HAVE_LINUX_NET_TSTAMP_H 1
+
+/* if tp_vlan_tci exists */
+#define HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI 1
+
+/* Define to 1 if you have the <linux/types.h> header file. */
+#define HAVE_LINUX_TYPES_H 1
+
+/* Define to 1 if you have the <linux/usbdevice_fs.h> header file. */
+#define HAVE_LINUX_USBDEVICE_FS_H 1
+
+/* Define to 1 if you have the <linux/wireless.h> header file. */
+#define HAVE_LINUX_WIRELESS_H 1
+
 /* Define to 1 if you have the <memory.h> header file. */
 #define HAVE_MEMORY_H 1
 
@@ -57,30 +104,45 @@
 /* Define to 1 if you have the <netinet/if_ether.h> header file. */
 #define HAVE_NETINET_IF_ETHER_H 1
 
+/* Define to 1 if you have the <netpacket/if_packet.h> header file. */
+/* #undef HAVE_NETPACKET_IF_PACKET_H */
+
+/* Define to 1 if you have the <netpacket/packet.h> header file. */
+#define HAVE_NETPACKET_PACKET_H 1
+
+/* Define to 1 if you have the <net/if_media.h> header file. */
+/* #undef HAVE_NET_IF_MEDIA_H */
+
 /* Define to 1 if you have the <net/pfvar.h> header file. */
 /* #undef HAVE_NET_PFVAR_H */
 
-/* if there's an os_proto.h */
+/* if there's an os_proto.h for this platform, to use additional prototypes */
 /* #undef HAVE_OS_PROTO_H */
 
 /* Define to 1 if you have the <paths.h> header file. */
 #define HAVE_PATHS_H 1
 
-/* define if you have a /proc/net/dev */
-#define HAVE_PROC_NET_DEV 1
+/* define if net/pfvar.h defines PF_NAT through PF_NORDR */
+/* #undef HAVE_PF_NAT_THROUGH_PF_NORDR */
 
 /* define if you have a Septel API */
 /* #undef HAVE_SEPTEL_API */
 
+/* define if you have Myricom SNF API */
+/* #undef HAVE_SNF_API */
+
 /* Define to 1 if you have the `snprintf' function. */
 #define HAVE_SNPRINTF 1
 
-/* if struct sockaddr has sa_len */
+/* if struct sockaddr has the sa_len member */
 /* #undef HAVE_SOCKADDR_SA_LEN */
 
 /* if struct sockaddr_storage exists */
 #define HAVE_SOCKADDR_STORAGE 1
 
+/* define if socklen_t is defined */
+#define HAVE_SOCKLEN_T 1
+
 /* On solaris */
 /* #undef HAVE_SOLARIS */
 
@@ -102,9 +164,15 @@
 /* Define to 1 if you have the `strlcpy' function. */
 /* #undef HAVE_STRLCPY */
 
+/* Define to 1 if the system has the type `struct BPF_TIMEVAL'. */
+/* #undef HAVE_STRUCT_BPF_TIMEVAL */
+
 /* Define to 1 if the system has the type `struct ether_addr'. */
 /* #undef HAVE_STRUCT_ETHER_ADDR */
 
+/* Define to 1 if you have the <sys/bitypes.h> header file. */
+/* #undef HAVE_SYS_BITYPES_H */
+
 /* Define to 1 if you have the <sys/bufmod.h> header file. */
 /* #undef HAVE_SYS_BUFMOD_H */
 
@@ -129,27 +197,38 @@
 /* Define to 1 if you have the <unistd.h> header file. */
 #define HAVE_UNISTD_H 1
 
+/* if struct usbdevfs_ctrltransfer has bRequestType */
+#define HAVE_USBDEVFS_CTRLTRANSFER_BREQUESTTYPE 1
+
 /* define if version.h is generated in the build procedure */
 #define HAVE_VERSION_H 1
 
 /* Define to 1 if you have the `vsnprintf' function. */
 #define HAVE_VSNPRINTF 1
 
+/* define if the system supports zerocopy BPF */
+/* #undef HAVE_ZEROCOPY_BPF */
+
 /* define if your compiler has __attribute__ */
 #define HAVE___ATTRIBUTE__ 1
 
 /* IPv6 */
-#define INET6
+#define INET6 1
 
 /* if unaligned access fails */
 /* #undef LBL_ALIGN */
 
+/* path for device for USB sniffing */
+#define LINUX_USB_MON_DEV "/dev/usbmon"
+
+/* if we need a pcap_parse wrapper around yyparse */
+/* #undef NEED_YYPARSE_WRAPPER */
+
 /* Define to 1 if netinet/ether.h declares `ether_hostton' */
 /* #undef NETINET_ETHER_H_DECLARES_ETHER_HOSTTON */
 
 /* Define to 1 if netinet/if_ether.h declares `ether_hostton' */
 /* #undef NETINET_IF_ETHER_H_DECLARES_ETHER_HOSTTON */
-#define NETINET_IF_ETHER_H_DECLARES_ETHER_HOSTTON 1
 
 /* do not use protochain */
 /* #undef NO_PROTOCHAIN */
@@ -166,35 +245,94 @@
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME ""
 
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
 /* Define to the version of this package. */
 #define PACKAGE_VERSION ""
 
 /* /dev/dlpi directory */
 /* #undef PCAP_DEV_PREFIX */
 
+/* target host supports Bluetooth sniffing */
+/* #undef PCAP_SUPPORT_BT */
+
+/* target host supports CAN sniffing */
+#define PCAP_SUPPORT_CAN 1
+
+/* target host supports canusb */
+/* #undef PCAP_SUPPORT_CANUSB */
+
+/* support D-Bus sniffing */
+/* #undef PCAP_SUPPORT_DBUS */
+
+/* target host supports netfilter sniffing */
+#define PCAP_SUPPORT_NETFILTER 1
+
+/* target host supports USB sniffing */
+#define PCAP_SUPPORT_USB 1
+
+/* include ACN support */
+/* #undef SITA */
+
+/* if struct sockaddr_hci has hci_channel member */
+/* #undef SOCKADDR_HCI_HAS_HCI_CHANNEL */
+
 /* Define to 1 if you have the ANSI C header files. */
 #define STDC_HEADERS 1
 
 /* Enable parser debugging */
 /* #undef YYDEBUG */
 
-/* needed on HP-UX */
-/* #undef _HPUX_SOURCE */
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+/* #undef _LARGEFILE_SOURCE */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
 
 /* define on AIX to get certain functions */
 /* #undef _SUN */
 
+/* define if your compiler allows __attribute__((format)) without a warning */
+#define __ATTRIBUTE___FORMAT_OK 1
+
+/* to handle Ultrix compilers that don't support const in prototypes */
+/* #undef const */
+
 /* Define as token for inline if inlining supported */
 #define inline inline
 
+/* Define to `short' if int16_t not defined. */
+/* #undef int16_t */
+
+/* Define to `int' if int32_t not defined. */
+/* #undef int32_t */
+
+/* Define to `long long' if int64_t not defined. */
+/* #undef int64_t */
+
+/* Define to `signed char' if int8_t not defined. */
+/* #undef int8_t */
+
 /* on sinix */
 /* #undef sinix */
 
-/* if we have u_int16_t */
+/* Define to `unsigned short' if u_int16_t not defined. */
 /* #undef u_int16_t */
 
-/* if we have u_int32_t */
+/* Define to `unsigned int' if u_int32_t not defined. */
 /* #undef u_int32_t */
 
-/* if we have u_int8_t */
+/* Define to `unsigned long long' if u_int64_t not defined. */
+/* #undef u_int64_t */
+
+/* Define to `unsigned char' if u_int8_t not defined. */
 /* #undef u_int8_t */
diff --git a/config.h.in b/config.h.in
index 8aa879c..c6bc68e 100644
--- a/config.h.in
+++ b/config.h.in
@@ -1,11 +1,4 @@
 /* config.h.in.  Generated from configure.in by autoheader.  */
-/* Long story short: aclocal.m4 depends on autoconf 2.13
- * implementation details wrt "const"; newer versions
- * have different implementation details so for now we
- * put "const" here.  This may cause duplicate definitions
- * in config.h but that should be OK since they're the same.
- */
-#undef const
 
 /* Enable optimizer debugging */
 #undef BDEBUG
@@ -19,9 +12,15 @@
 /* define if you have dag_get_erf_types() */
 #undef HAVE_DAG_GET_ERF_TYPES
 
+/* define if you have dag_get_stream_erf_types() */
+#undef HAVE_DAG_GET_STREAM_ERF_TYPES
+
 /* define if you have streams capable DAG API */
 #undef HAVE_DAG_STREAMS_API
 
+/* define if you have vdag_set_device_info() */
+#undef HAVE_DAG_VDAG
+
 /* Define to 1 if you have the declaration of `ether_hostton', and to 0 if you
    don't. */
 #undef HAVE_DECL_ETHER_HOSTTON
@@ -29,9 +28,15 @@
 /* define if you have a /dev/dlpi */
 #undef HAVE_DEV_DLPI
 
+/* if passive_req_t primitive exists */
+#undef HAVE_DLPI_PASSIVE
+
 /* Define to 1 if you have the `ether_hostton' function. */
 #undef HAVE_ETHER_HOSTTON
 
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+#undef HAVE_FSEEKO
+
 /* on HP-UX 10.20 or later */
 #undef HAVE_HPUX10_20_OR_LATER
 
@@ -44,9 +49,51 @@
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
+/* if libdlpi exists */
+#undef HAVE_LIBDLPI
+
+/* if libnl exists */
+#undef HAVE_LIBNL
+
+/* if libnl exists and is version 2.x */
+#undef HAVE_LIBNL_2_x
+
+/* if libnl exists and is version 3.x */
+#undef HAVE_LIBNL_3_x
+
+/* libnl has NLE_FAILURE */
+#undef HAVE_LIBNL_NLE
+
+/* libnl has new-style socket api */
+#undef HAVE_LIBNL_SOCKETS
+
 /* Define to 1 if you have the <limits.h> header file. */
 #undef HAVE_LIMITS_H
 
+/* Define to 1 if you have the <linux/compiler.h> header file. */
+#undef HAVE_LINUX_COMPILER_H
+
+/* Define to 1 if you have the <linux/ethtool.h> header file. */
+#undef HAVE_LINUX_ETHTOOL_H
+
+/* Define to 1 if you have the <linux/if_packet.h> header file. */
+#undef HAVE_LINUX_IF_PACKET_H
+
+/* Define to 1 if you have the <linux/net_tstamp.h> header file. */
+#undef HAVE_LINUX_NET_TSTAMP_H
+
+/* if tp_vlan_tci exists */
+#undef HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI
+
+/* Define to 1 if you have the <linux/types.h> header file. */
+#undef HAVE_LINUX_TYPES_H
+
+/* Define to 1 if you have the <linux/usbdevice_fs.h> header file. */
+#undef HAVE_LINUX_USBDEVICE_FS_H
+
+/* Define to 1 if you have the <linux/wireless.h> header file. */
+#undef HAVE_LINUX_WIRELESS_H
+
 /* Define to 1 if you have the <memory.h> header file. */
 #undef HAVE_MEMORY_H
 
@@ -56,30 +103,45 @@
 /* Define to 1 if you have the <netinet/if_ether.h> header file. */
 #undef HAVE_NETINET_IF_ETHER_H
 
+/* Define to 1 if you have the <netpacket/if_packet.h> header file. */
+#undef HAVE_NETPACKET_IF_PACKET_H
+
+/* Define to 1 if you have the <netpacket/packet.h> header file. */
+#undef HAVE_NETPACKET_PACKET_H
+
+/* Define to 1 if you have the <net/if_media.h> header file. */
+#undef HAVE_NET_IF_MEDIA_H
+
 /* Define to 1 if you have the <net/pfvar.h> header file. */
 #undef HAVE_NET_PFVAR_H
 
-/* if there's an os_proto.h */
+/* if there's an os_proto.h for this platform, to use additional prototypes */
 #undef HAVE_OS_PROTO_H
 
 /* Define to 1 if you have the <paths.h> header file. */
 #undef HAVE_PATHS_H
 
-/* define if you have a /proc/net/dev */
-#undef HAVE_PROC_NET_DEV
+/* define if net/pfvar.h defines PF_NAT through PF_NORDR */
+#undef HAVE_PF_NAT_THROUGH_PF_NORDR
 
 /* define if you have a Septel API */
 #undef HAVE_SEPTEL_API
 
+/* define if you have Myricom SNF API */
+#undef HAVE_SNF_API
+
 /* Define to 1 if you have the `snprintf' function. */
 #undef HAVE_SNPRINTF
 
-/* if struct sockaddr has sa_len */
+/* if struct sockaddr has the sa_len member */
 #undef HAVE_SOCKADDR_SA_LEN
 
 /* if struct sockaddr_storage exists */
 #undef HAVE_SOCKADDR_STORAGE
 
+/* define if socklen_t is defined */
+#undef HAVE_SOCKLEN_T
+
 /* On solaris */
 #undef HAVE_SOLARIS
 
@@ -101,9 +163,15 @@
 /* Define to 1 if you have the `strlcpy' function. */
 #undef HAVE_STRLCPY
 
+/* Define to 1 if the system has the type `struct BPF_TIMEVAL'. */
+#undef HAVE_STRUCT_BPF_TIMEVAL
+
 /* Define to 1 if the system has the type `struct ether_addr'. */
 #undef HAVE_STRUCT_ETHER_ADDR
 
+/* Define to 1 if you have the <sys/bitypes.h> header file. */
+#undef HAVE_SYS_BITYPES_H
+
 /* Define to 1 if you have the <sys/bufmod.h> header file. */
 #undef HAVE_SYS_BUFMOD_H
 
@@ -128,12 +196,18 @@
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
+/* if struct usbdevfs_ctrltransfer has bRequestType */
+#undef HAVE_USBDEVFS_CTRLTRANSFER_BREQUESTTYPE
+
 /* define if version.h is generated in the build procedure */
 #undef HAVE_VERSION_H
 
 /* Define to 1 if you have the `vsnprintf' function. */
 #undef HAVE_VSNPRINTF
 
+/* define if the system supports zerocopy BPF */
+#undef HAVE_ZEROCOPY_BPF
+
 /* define if your compiler has __attribute__ */
 #undef HAVE___ATTRIBUTE__
 
@@ -143,6 +217,12 @@
 /* if unaligned access fails */
 #undef LBL_ALIGN
 
+/* path for device for USB sniffing */
+#undef LINUX_USB_MON_DEV
+
+/* if we need a pcap_parse wrapper around yyparse */
+#undef NEED_YYPARSE_WRAPPER
+
 /* Define to 1 if netinet/ether.h declares `ether_hostton' */
 #undef NETINET_ETHER_H_DECLARES_ETHER_HOSTTON
 
@@ -164,35 +244,94 @@
 /* Define to the one symbol short name of this package. */
 #undef PACKAGE_TARNAME
 
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
 
 /* /dev/dlpi directory */
 #undef PCAP_DEV_PREFIX
 
+/* target host supports Bluetooth sniffing */
+#undef PCAP_SUPPORT_BT
+
+/* target host supports CAN sniffing */
+#undef PCAP_SUPPORT_CAN
+
+/* target host supports canusb */
+#undef PCAP_SUPPORT_CANUSB
+
+/* support D-Bus sniffing */
+#undef PCAP_SUPPORT_DBUS
+
+/* target host supports netfilter sniffing */
+#undef PCAP_SUPPORT_NETFILTER
+
+/* target host supports USB sniffing */
+#undef PCAP_SUPPORT_USB
+
+/* include ACN support */
+#undef SITA
+
+/* if struct sockaddr_hci has hci_channel member */
+#undef SOCKADDR_HCI_HAS_HCI_CHANNEL
+
 /* Define to 1 if you have the ANSI C header files. */
 #undef STDC_HEADERS
 
 /* Enable parser debugging */
 #undef YYDEBUG
 
-/* needed on HP-UX */
-#undef _HPUX_SOURCE
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+#undef _LARGEFILE_SOURCE
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
 
 /* define on AIX to get certain functions */
 #undef _SUN
 
+/* define if your compiler allows __attribute__((format)) without a warning */
+#undef __ATTRIBUTE___FORMAT_OK
+
+/* to handle Ultrix compilers that don't support const in prototypes */
+#undef const
+
 /* Define as token for inline if inlining supported */
 #undef inline
 
+/* Define to `short' if int16_t not defined. */
+#undef int16_t
+
+/* Define to `int' if int32_t not defined. */
+#undef int32_t
+
+/* Define to `long long' if int64_t not defined. */
+#undef int64_t
+
+/* Define to `signed char' if int8_t not defined. */
+#undef int8_t
+
 /* on sinix */
 #undef sinix
 
-/* if we have u_int16_t */
+/* Define to `unsigned short' if u_int16_t not defined. */
 #undef u_int16_t
 
-/* if we have u_int32_t */
+/* Define to `unsigned int' if u_int32_t not defined. */
 #undef u_int32_t
 
-/* if we have u_int8_t */
+/* Define to `unsigned long long' if u_int64_t not defined. */
+#undef u_int64_t
+
+/* Define to `unsigned char' if u_int8_t not defined. */
 #undef u_int8_t
diff --git a/config.sub b/config.sub
index 5698174..8518609 100755
--- a/config.sub
+++ b/config.sub
@@ -1,9 +1,10 @@
 #! /bin/sh
 # Configuration validation subroutine script.
 #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+#   Free Software Foundation, Inc.
 
-timestamp='2003-11-03'
+timestamp='2009-12-31'
 
 # This file is (in principle) common to ALL GNU software.
 # The presence of a machine in this file suggests that SOME GNU software
@@ -21,22 +22,26 @@
 #
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
 # the same distribution terms that you use for the rest of that program.
 
+
 # Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted ChangeLog entry.
+# diff and a properly formatted GNU ChangeLog entry.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
 # If it is invalid, we print an error message on stderr and exit with code 1.
 # Otherwise, we print the canonical config type on stdout and succeed.
 
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
 # This file is supposed to be the same for all GNU packages
 # and recognize all the CPU types, system types and aliases
 # that are meaningful with *any* GNU software.
@@ -70,8 +75,9 @@
 version="\
 GNU config.sub ($timestamp)
 
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-Free Software Foundation, Inc.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
+Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -83,11 +89,11 @@
 while test $# -gt 0 ; do
   case $1 in
     --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit 0 ;;
+       echo "$timestamp" ; exit ;;
     --version | -v )
-       echo "$version" ; exit 0 ;;
+       echo "$version" ; exit ;;
     --help | --h* | -h )
-       echo "$usage"; exit 0 ;;
+       echo "$usage"; exit ;;
     -- )     # Stop option processing
        shift; break ;;
     - )	# Use stdin as input.
@@ -99,7 +105,7 @@
     *local*)
        # First pass through any local machine types.
        echo $1
-       exit 0;;
+       exit ;;
 
     * )
        break ;;
@@ -118,8 +124,10 @@
 # Here we must recognize all the valid KERNEL-OS combinations.
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \
-  kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
     ;;
@@ -145,10 +153,13 @@
 	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
 	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis)
+	-apple | -axis | -knuth | -cray | -microblaze)
 		os=
 		basic_machine=$1
 		;;
+        -bluegene*)
+	        os=-cnk
+		;;
 	-sim | -cisco | -oki | -wec | -winbond)
 		os=
 		basic_machine=$1
@@ -170,6 +181,10 @@
 	-hiux*)
 		os=-hiuxwe2
 		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
 	-sco5)
 		os=-sco3.2v5
 		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
@@ -186,6 +201,10 @@
 		# Don't forget version if it is 3.2v4 or newer.
 		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
 	-sco*)
 		os=-sco3.2v2
 		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
@@ -230,22 +249,28 @@
 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
 	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+	| bfin \
 	| c4x | clipper \
 	| d10v | d30v | dlx | dsp16xx \
-	| fr30 | frv \
+	| fido | fr30 | frv \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 	| i370 | i860 | i960 | ia64 \
 	| ip2k | iq2000 \
-	| m32r | m68000 | m68k | m88k | mcore \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep | metag \
 	| mips | mipsbe | mipseb | mipsel | mipsle \
 	| mips16 \
 	| mips64 | mips64el \
-	| mips64vr | mips64vrel \
+	| mips64octeon | mips64octeonel \
 	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
 	| mips64vr4100 | mips64vr4100el \
 	| mips64vr4300 | mips64vr4300el \
 	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
 	| mipsisa32 | mipsisa32el \
 	| mipsisa32r2 | mipsisa32r2el \
 	| mipsisa64 | mipsisa64el \
@@ -254,30 +279,40 @@
 	| mipsisa64sr71k | mipsisa64sr71kel \
 	| mipstx39 | mipstx39el \
 	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
 	| msp430 \
+	| nios | nios2 \
 	| ns16k | ns32k \
-	| openrisc | or32 \
+	| or32 \
 	| pdp10 | pdp11 | pj | pjl \
 	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
 	| pyramid \
-	| sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+	| rx \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
-	| sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \
-	| strongarm \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu | strongarm \
 	| tahoe | thumb | tic4x | tic80 | tron \
+	| ubicom32 \
 	| v850 | v850e \
 	| we32k \
-	| x86 | xscale | xstormy16 | xtensa \
-	| z8k)
+	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k | z80)
 		basic_machine=$basic_machine-unknown
 		;;
-	m6811 | m68hc11 | m6812 | m68hc12)
+	m6811 | m68hc11 | m6812 | m68hc12 | picochip)
 		# Motorola 68HC11/12.
 		basic_machine=$basic_machine-unknown
 		os=-none
 		;;
 	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
 		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
 
 	# We use `pc' rather than `unknown'
 	# because (1) that's what they normally are, and
@@ -297,28 +332,32 @@
 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
 	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* \
-	| bs2000-* \
+	| avr-* | avr32-* \
+	| bfin-* | bs2000-* \
 	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
-	| clipper-* | cydra-* \
+	| clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
 	| elxsi-* \
-	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
 	| ip2k-* | iq2000-* \
-	| m32r-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | mcore-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
 	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
 	| mips16-* \
 	| mips64-* | mips64el-* \
-	| mips64vr-* | mips64vrel-* \
+	| mips64octeon-* | mips64octeonel-* \
 	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
 	| mips64vr4100-* | mips64vr4100el-* \
 	| mips64vr4300-* | mips64vr4300el-* \
 	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
 	| mipsisa32-* | mipsisa32el-* \
 	| mipsisa32r2-* | mipsisa32r2el-* \
 	| mipsisa64-* | mipsisa64el-* \
@@ -326,26 +365,35 @@
 	| mipsisa64sb1-* | mipsisa64sb1el-* \
 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
 	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
 	| msp430-* \
-	| none-* | np1-* | nv1-* | ns16k-* | ns32k-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
 	| orion-* \
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
 	| pyramid-* \
-	| romp-* | rs6000-* \
-	| sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+	| romp-* | rs6000-* | rx-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
-	| sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
 	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
 	| tron-* \
+	| ubicom32-* \
 	| v850-* | v850e-* | vax-* \
 	| we32k-* \
-	| x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
-	| xtensa-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa*-* \
 	| ymp-* \
-	| z8k-*)
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
 		;;
 	# Recognize the various machine names and aliases which stand
 	# for a CPU type and a company and sometimes even an OS.
@@ -363,6 +411,9 @@
 		basic_machine=a29k-amd
 		os=-udi
 		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
 	adobe68k)
 		basic_machine=m68010-adobe
 		os=-scout
@@ -380,6 +431,9 @@
 	amd64)
 		basic_machine=x86_64-pc
 		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
 	amdahl)
 		basic_machine=580-amdahl
 		os=-sysv
@@ -403,6 +457,10 @@
 		basic_machine=m68k-apollo
 		os=-bsd
 		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
 	aux)
 		basic_machine=m68k-apple
 		os=-aux
@@ -411,10 +469,26 @@
 		basic_machine=ns32k-sequent
 		os=-dynix
 		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	bluegene*)
+		basic_machine=powerpc-ibm
+		os=-cnk
+		;;
 	c90)
 		basic_machine=c90-cray
 		os=-unicos
 		;;
+        cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
 	convex-c1)
 		basic_machine=c1-convex
 		os=-bsd
@@ -439,12 +513,27 @@
 		basic_machine=j90-cray
 		os=-unicos
 		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
 	crds | unos)
 		basic_machine=m68k-crds
 		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
 	cris | cris-* | etrax*)
 		basic_machine=cris-axis
 		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
 	da30 | da30-*)
 		basic_machine=m68k-da30
 		;;
@@ -467,6 +556,14 @@
 		basic_machine=m88k-motorola
 		os=-sysv3
 		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
 	dpx20 | dpx20-*)
 		basic_machine=rs6000-bull
 		os=-bosx
@@ -617,6 +714,14 @@
 		basic_machine=m68k-isi
 		os=-sysv
 		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
 	m88k-omron*)
 		basic_machine=m88k-omron
 		;;
@@ -628,10 +733,17 @@
 		basic_machine=ns32k-utek
 		os=-sysv
 		;;
+        microblaze)
+		basic_machine=microblaze-xilinx
+		;;
 	mingw32)
 		basic_machine=i386-pc
 		os=-mingw32
 		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
 	miniframe)
 		basic_machine=m68000-convergent
 		;;
@@ -645,10 +757,6 @@
 	mips3*)
 		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
 		;;
-	mmix*)
-		basic_machine=mmix-knuth
-		os=-mmixware
-		;;
 	monitor)
 		basic_machine=m68k-rom68k
 		os=-coff
@@ -661,6 +769,9 @@
 		basic_machine=i386-pc
 		os=-msdos
 		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
 	mvs)
 		basic_machine=i370-ibm
 		os=-mvs
@@ -729,10 +840,6 @@
 	np1)
 		basic_machine=np1-gould
 		;;
-	nv1)
-		basic_machine=nv1-cray
-		os=-unicosmp
-		;;
 	nsr-tandem)
 		basic_machine=nsr-tandem
 		;;
@@ -740,9 +847,8 @@
 		basic_machine=hppa1.1-oki
 		os=-proelf
 		;;
-	or32 | or32-*)
+	openrisc | openrisc-*)
 		basic_machine=or32-unknown
-		os=-coff
 		;;
 	os400)
 		basic_machine=powerpc-ibm
@@ -764,6 +870,14 @@
 		basic_machine=i860-intel
 		os=-osf
 		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
 	pbd)
 		basic_machine=sparc-tti
 		;;
@@ -773,6 +887,12 @@
 	pc532 | pc532-*)
 		basic_machine=ns32k-pc532
 		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
 	pentium | p5 | k5 | k6 | nexgen | viac3)
 		basic_machine=i586-pc
 		;;
@@ -829,6 +949,10 @@
 		basic_machine=i586-unknown
 		os=-pw32
 		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
 	rom68k)
 		basic_machine=m68k-rom68k
 		os=-coff
@@ -855,6 +979,10 @@
 	sb1el)
 		basic_machine=mipsisa64sb1el-unknown
 		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
 	sei)
 		basic_machine=mips-sei
 		os=-seiux
@@ -866,6 +994,9 @@
 		basic_machine=sh-hitachi
 		os=-hms
 		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
 	sh64)
 		basic_machine=sh64-unknown
 		;;
@@ -955,6 +1086,10 @@
 		basic_machine=tic6x-unknown
 		os=-coff
 		;;
+	tile*)
+		basic_machine=tile-unknown
+		os=-linux-gnu
+		;;
 	tx39)
 		basic_machine=mipstx39-unknown
 		;;
@@ -1015,6 +1150,10 @@
 		basic_machine=hppa1.1-winbond
 		os=-proelf
 		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
 	xps | xps100)
 		basic_machine=xps100-honeywell
 		;;
@@ -1026,6 +1165,10 @@
 		basic_machine=z8k-unknown
 		os=-sim
 		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
 	none)
 		basic_machine=none-none
 		os=-none
@@ -1045,6 +1188,9 @@
 	romp)
 		basic_machine=romp-ibm
 		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
 	rs6000)
 		basic_machine=rs6000-ibm
 		;;
@@ -1061,13 +1207,10 @@
 	we32k)
 		basic_machine=we32k-att
 		;;
-	sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
 		basic_machine=sh-unknown
 		;;
-	sh64)
-		basic_machine=sh64-unknown
-		;;
-	sparc | sparcv9 | sparcv9b)
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
 		basic_machine=sparc-sun
 		;;
 	cydra)
@@ -1114,6 +1257,9 @@
         # First match some system type aliases
         # that might get confused with valid system types.
 	# -solaris* is a basic system type, with this one exception.
+        -auroraux)
+	        os=-auroraux
+		;;
 	-solaris1 | -solaris1.*)
 		os=`echo $os | sed -e 's|solaris1|sunos4|'`
 		;;
@@ -1134,25 +1280,30 @@
 	# Each alternative MUST END IN A *, to match a version number.
 	# -sysv* is not here because it comes later, after sysvr4.
 	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+	      | -sym* | -kopensolaris* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* \
+	      | -aos* | -aros* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -knetbsd* | -netbsd* | -openbsd* | -kfreebsd* | -freebsd* | -riscix* \
-	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*)
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1170,7 +1321,7 @@
 		os=`echo $os | sed -e 's|nto|nto-qnx|'`
 		;;
 	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
 	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
 		;;
 	-mac*)
@@ -1215,6 +1366,9 @@
 	-atheos*)
 		os=-atheos
 		;;
+	-syllable*)
+		os=-syllable
+		;;
 	-386bsd)
 		os=-bsd
 		;;
@@ -1276,6 +1430,14 @@
 	-kaos*)
 		os=-kaos
 		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+        -nacl*)
+	        ;;
 	-none)
 		;;
 	*)
@@ -1298,6 +1460,12 @@
 # system, and we'll never get to this point.
 
 case $basic_machine in
+        score-*)
+		os=-elf
+		;;
+        spu-*)
+		os=-elf
+		;;
 	*-acorn)
 		os=-riscix1.2
 		;;
@@ -1307,9 +1475,9 @@
 	arm*-semi)
 		os=-aout
 		;;
-    c4x-* | tic4x-*)
-        os=-coff
-        ;;
+        c4x-* | tic4x-*)
+        	os=-coff
+		;;
 	# This must come before the *-dec entry.
 	pdp10-*)
 		os=-tops20
@@ -1335,6 +1503,9 @@
 	m68*-cisco)
 		os=-aout
 		;;
+        mep-*)
+		os=-elf
+		;;
 	mips*-cisco)
 		os=-elf
 		;;
@@ -1353,9 +1524,15 @@
 	*-be)
 		os=-beos
 		;;
+	*-haiku)
+		os=-haiku
+		;;
 	*-ibm)
 		os=-aix
 		;;
+    	*-knuth)
+		os=-mmixware
+		;;
 	*-wec)
 		os=-proelf
 		;;
@@ -1458,7 +1635,7 @@
 			-sunos*)
 				vendor=sun
 				;;
-			-aix*)
+			-cnk*|-aix*)
 				vendor=ibm
 				;;
 			-beos*)
@@ -1521,7 +1698,7 @@
 esac
 
 echo $basic_machine$os
-exit 0
+exit
 
 # Local variables:
 # eval: (add-hook 'write-file-hooks 'time-stamp)
diff --git a/configure b/configure
index 38e035e..07c2d33 100755
--- a/configure
+++ b/configure
@@ -1,61 +1,81 @@
 #! /bin/sh
-# From configure.in Revision: 1.120.2.13 .
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61.
+# Generated by GNU Autoconf 2.69.
 #
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
 
 # Be more Bourne compatible
 DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
   NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
 else
-  case `(set -o) 2>/dev/null` in
-  *posix*) set -o posix ;;
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
 esac
-
 fi
 
 
-
-
-# PATH needs CR
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
 
 # The user is always right.
 if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
-fi
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
 fi
 
 
@@ -64,20 +84,19 @@
 # there to prevent editors from complaining about space-tab.
 # (If _AS_PATH_WALK were called with IFS unset, it would disable word
 # splitting by setting IFS to empty value.)
-as_nl='
-'
 IFS=" ""	$as_nl"
 
 # Find who we are.  Look in the path if we contain no directory separator.
-case $0 in
+as_myself=
+case $0 in #((
   *[\\/]* ) as_myself=$0 ;;
   *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
 IFS=$as_save_IFS
 
      ;;
@@ -88,32 +107,315 @@
   as_myself=$0
 fi
 if test ! -f "$as_myself"; then
-  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  { (exit 1); exit 1; }
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
 fi
 
-# Work around bugs in pre-3.0 UWIN ksh.
-for as_var in ENV MAIL MAILPATH
-do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
 done
 PS1='$ '
 PS2='> '
 PS4='+ '
 
 # NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
-  fi
-done
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
 
-# Required to use basename.
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
 if expr a : '\(a\)' >/dev/null 2>&1 &&
    test "X`expr 00001 : '.*\(...\)'`" = X001; then
   as_expr=expr
@@ -127,13 +429,17 @@
   as_basename=false
 fi
 
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
 
-# Name of the executable.
 as_me=`$as_basename -- "$0" ||
 $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
 	 X"$0" : 'X\(//\)$' \| \
 	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-echo X/"$0" |
+$as_echo X/"$0" |
     sed '/^.*\/\([^/][^/]*\)\/*$/{
 	    s//\1/
 	    q
@@ -148,294 +454,19 @@
 	  }
 	  s/.*/./; q'`
 
-# CDPATH.
-$as_unset CDPATH
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
 
 
-if test "x$CONFIG_SHELL" = x; then
-  if (eval ":") 2>/dev/null; then
-  as_have_required=yes
-else
-  as_have_required=no
-fi
-
-  if test $as_have_required = yes && 	 (eval ":
-(as_func_return () {
-  (exit \$1)
-}
-as_func_success () {
-  as_func_return 0
-}
-as_func_failure () {
-  as_func_return 1
-}
-as_func_ret_success () {
-  return 0
-}
-as_func_ret_failure () {
-  return 1
-}
-
-exitcode=0
-if as_func_success; then
-  :
-else
-  exitcode=1
-  echo as_func_success failed.
-fi
-
-if as_func_failure; then
-  exitcode=1
-  echo as_func_failure succeeded.
-fi
-
-if as_func_ret_success; then
-  :
-else
-  exitcode=1
-  echo as_func_ret_success failed.
-fi
-
-if as_func_ret_failure; then
-  exitcode=1
-  echo as_func_ret_failure succeeded.
-fi
-
-if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
-  :
-else
-  exitcode=1
-  echo positional parameters were not saved.
-fi
-
-test \$exitcode = 0) || { (exit 1); exit 1; }
-
-(
-  as_lineno_1=\$LINENO
-  as_lineno_2=\$LINENO
-  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
-  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
-") 2> /dev/null; then
-  :
-else
-  as_candidate_shells=
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  case $as_dir in
-	 /*)
-	   for as_base in sh bash ksh sh5; do
-	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
-	   done;;
-       esac
-done
-IFS=$as_save_IFS
-
-
-      for as_shell in $as_candidate_shells $SHELL; do
-	 # Try only shells that exist, to save several forks.
-	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
-		{ ("$as_shell") 2> /dev/null <<\_ASEOF
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in
-  *posix*) set -o posix ;;
-esac
-
-fi
-
-
-:
-_ASEOF
-}; then
-  CONFIG_SHELL=$as_shell
-	       as_have_required=yes
-	       if { "$as_shell" 2> /dev/null <<\_ASEOF
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in
-  *posix*) set -o posix ;;
-esac
-
-fi
-
-
-:
-(as_func_return () {
-  (exit $1)
-}
-as_func_success () {
-  as_func_return 0
-}
-as_func_failure () {
-  as_func_return 1
-}
-as_func_ret_success () {
-  return 0
-}
-as_func_ret_failure () {
-  return 1
-}
-
-exitcode=0
-if as_func_success; then
-  :
-else
-  exitcode=1
-  echo as_func_success failed.
-fi
-
-if as_func_failure; then
-  exitcode=1
-  echo as_func_failure succeeded.
-fi
-
-if as_func_ret_success; then
-  :
-else
-  exitcode=1
-  echo as_func_ret_success failed.
-fi
-
-if as_func_ret_failure; then
-  exitcode=1
-  echo as_func_ret_failure succeeded.
-fi
-
-if ( set x; as_func_ret_success y && test x = "$1" ); then
-  :
-else
-  exitcode=1
-  echo positional parameters were not saved.
-fi
-
-test $exitcode = 0) || { (exit 1); exit 1; }
-
-(
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
-
-_ASEOF
-}; then
-  break
-fi
-
-fi
-
-      done
-
-      if test "x$CONFIG_SHELL" != x; then
-  for as_var in BASH_ENV ENV
-        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
-        done
-        export CONFIG_SHELL
-        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
-fi
-
-
-    if test $as_have_required = no; then
-  echo This script requires a shell more modern than all the
-      echo shells that I found on your system.  Please install a
-      echo modern shell, or manually run the script under such a
-      echo shell if you do have one.
-      { (exit 1); exit 1; }
-fi
-
-
-fi
-
-fi
-
-
-
-(eval "as_func_return () {
-  (exit \$1)
-}
-as_func_success () {
-  as_func_return 0
-}
-as_func_failure () {
-  as_func_return 1
-}
-as_func_ret_success () {
-  return 0
-}
-as_func_ret_failure () {
-  return 1
-}
-
-exitcode=0
-if as_func_success; then
-  :
-else
-  exitcode=1
-  echo as_func_success failed.
-fi
-
-if as_func_failure; then
-  exitcode=1
-  echo as_func_failure succeeded.
-fi
-
-if as_func_ret_success; then
-  :
-else
-  exitcode=1
-  echo as_func_ret_success failed.
-fi
-
-if as_func_ret_failure; then
-  exitcode=1
-  echo as_func_ret_failure succeeded.
-fi
-
-if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
-  :
-else
-  exitcode=1
-  echo positional parameters were not saved.
-fi
-
-test \$exitcode = 0") || {
-  echo No shell found that supports shell functions.
-  echo Please tell autoconf@gnu.org about your system,
-  echo including any error possibly output before this
-  echo message
-}
-
-
-
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
-
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line after each line using $LINENO; the second 'sed'
-  # does the real work.  The second script uses 'N' to pair each
-  # line-number line with the line containing $LINENO, and appends
-  # trailing '-' during substitution so that $LINENO is not a special
-  # case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # scripts with optimization help from Paolo Bonzini.  Blame Lee
-  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
   sed -n '
     p
     /[$]LINENO/=
@@ -452,9 +483,12 @@
       s/-\n.*//
     ' >$as_me.lineno &&
   chmod +x "$as_me.lineno" ||
-    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
-   { (exit 1); exit 1; }; }
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
 
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
   # original and so on.  Autoconf is especially sensitive to this).
@@ -463,84 +497,55 @@
   exit
 }
 
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
 ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in
+case `echo -n x` in #(((((
 -n*)
-  case `echo 'x\c'` in
+  case `echo 'xy\c'` in
   *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  *)   ECHO_C='\c';;
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
   esac;;
 *)
   ECHO_N='-n';;
 esac
 
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
 rm -f conf$$ conf$$.exe conf$$.file
 if test -d conf$$.dir; then
   rm -f conf$$.dir/conf$$.file
 else
   rm -f conf$$.dir
-  mkdir conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
 fi
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s='ln -s'
-  # ... but there are two gotchas:
-  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-  # In both cases, we have to default to `cp -p'.
-  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-    as_ln_s='cp -p'
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
 else
-  as_ln_s='cp -p'
+  as_ln_s='cp -pR'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
 
 if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
+  as_mkdir_p='mkdir -p "$as_dir"'
 else
   test -d ./-p && rmdir ./-p
   as_mkdir_p=false
 fi
 
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-        test -d "$1/.";
-      else
-	case $1 in
-        -*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -549,11 +554,11 @@
 as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 
-
-exec 7<&0 </dev/null 6>&1
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
 
 # Name of the host.
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
 # so uname gets run too.
 ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
 
@@ -568,7 +573,6 @@
 subdirs=
 MFLAGS=
 MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
 
 # Identity of this package.
 PACKAGE_NAME=
@@ -576,6 +580,7 @@
 PACKAGE_VERSION=
 PACKAGE_STRING=
 PACKAGE_BUGREPORT=
+PACKAGE_URL=
 
 ac_unique_file="pcap.c"
 # Factoring default headers for most tests.
@@ -614,85 +619,136 @@
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL
-PATH_SEPARATOR
-PACKAGE_NAME
-PACKAGE_TARNAME
-PACKAGE_VERSION
-PACKAGE_STRING
-PACKAGE_BUGREPORT
-exec_prefix
-prefix
-program_transform_name
-bindir
-sbindir
-libexecdir
-datarootdir
-datadir
-sysconfdir
-sharedstatedir
-localstatedir
-includedir
-oldincludedir
-docdir
-infodir
-htmldir
-dvidir
-pdfdir
-psdir
-libdir
-localedir
-mandir
-DEFS
-ECHO_C
-ECHO_N
-ECHO_T
-LIBS
-build_alias
-host_alias
-target_alias
-build
-build_cpu
-build_vendor
-build_os
-host
-host_cpu
-host_vendor
-host_os
-target
-target_cpu
-target_vendor
-target_os
-SHLICC2
-CC
-CFLAGS
-LDFLAGS
-CPPFLAGS
-ac_ct_CC
-EXEEXT
-OBJEXT
-CPP
-GREP
-EGREP
-LIBOBJS
-V_LEX
-V_YACC
-RANLIB
-V_CCOPT
-V_DEFS
-V_INCLS
-V_LIBS
-V_PCAP
-V_FINDALLDEVS
-V_RANLIB
-SSRC
-DYEXT
-DAGLIBS
-INSTALL_PROGRAM
-INSTALL_SCRIPT
+ac_subst_vars='LTLIBOBJS
 INSTALL_DATA
-LTLIBOBJS'
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+DBUS_SRC
+PCAP_SUPPORT_DBUS
+PKGCONFIG
+CAN_SRC
+PCAP_SUPPORT_CAN
+CANUSB_SRC
+PCAP_SUPPORT_CANUSB
+BT_SRC
+PCAP_SUPPORT_BT
+NETFILTER_SRC
+PCAP_SUPPORT_NETFILTER
+USB_SRC
+PCAP_SUPPORT_USB
+MAN_MISC_INFO
+MAN_FILE_FORMATS
+DYEXT
+SSRC
+ADDLARCHIVEOBJS
+ADDLOBJS
+V_RPATH_OPT
+V_SONAME_OPT
+V_SHLIB_OPT
+V_SHLIB_CMD
+V_PCAP
+V_INCLS
+V_FINDALLDEVS
+V_DEFS
+V_CCOPT
+MKDEP
+DEPENDENCY_CFLAG
+LN_S
+AR
+RANLIB
+V_YACC
+V_LEX
+HAVE_LINUX_TPACKET_AUXDATA
+LIBOBJS
+EGREP
+GREP
+CPP
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+SHLICC2
+target_os
+target_vendor
+target_cpu
+target
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
 ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+with_gcc
+enable_largefile
+enable_protochain
+with_sita
+with_pcap
+with_libnl
+enable_ipv6
+enable_optimizer_dbg
+enable_yydebug
+with_dag
+with_dag_includes
+with_dag_libraries
+with_septel
+with_snf
+with_snf_includes
+with_snf_libraries
+with_flex
+with_bison
+enable_universal
+enable_shared
+enable_bluetooth
+enable_canusb
+enable_can
+enable_dbus
+'
       ac_precious_vars='build_alias
 host_alias
 target_alias
@@ -707,6 +763,8 @@
 # Initialize some variables set by options.
 ac_init_help=
 ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
 # The variables have the same names as the options, with
 # dashes changed to underlines.
 cache_file=/dev/null
@@ -762,8 +820,9 @@
   fi
 
   case $ac_option in
-  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-  *)	ac_optarg=yes ;;
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
   esac
 
   # Accept the important Cygnus configure options, so we can diagnose typos.
@@ -805,13 +864,20 @@
     datarootdir=$ac_optarg ;;
 
   -disable-* | --disable-*)
-    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
-   { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
-    eval enable_$ac_feature=no ;;
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
 
   -docdir | --docdir | --docdi | --doc | --do)
     ac_prev=docdir ;;
@@ -824,13 +890,20 @@
     dvidir=$ac_optarg ;;
 
   -enable-* | --enable-*)
-    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
-   { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
-    eval enable_$ac_feature=\$ac_optarg ;;
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
 
   -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
   | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
@@ -1021,22 +1094,36 @@
     ac_init_version=: ;;
 
   -with-* | --with-*)
-    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid package name: $ac_package" >&2
-   { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
-    eval with_$ac_package=\$ac_optarg ;;
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
 
   -without-* | --without-*)
-    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid package name: $ac_package" >&2
-   { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
-    eval with_$ac_package=no ;;
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
 
   --x)
     # Obsolete; use --with-x.
@@ -1056,26 +1143,26 @@
   | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
     x_libraries=$ac_optarg ;;
 
-  -*) { echo "$as_me: error: unrecognized option: $ac_option
-Try \`$0 --help' for more information." >&2
-   { (exit 1); exit 1; }; }
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
     ;;
 
   *=*)
     ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
-   { (exit 1); exit 1; }; }
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
     eval $ac_envvar=\$ac_optarg
     export $ac_envvar ;;
 
   *)
     # FIXME: should be removed in autoconf 3.0.
-    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
     expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
     ;;
 
   esac
@@ -1083,23 +1170,36 @@
 
 if test -n "$ac_prev"; then
   ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  { echo "$as_me: error: missing argument to $ac_option" >&2
-   { (exit 1); exit 1; }; }
+  as_fn_error $? "missing argument to $ac_option"
 fi
 
-# Be sure to have absolute directory names.
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
 for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
 		datadir sysconfdir sharedstatedir localstatedir includedir \
 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
 		libdir localedir mandir
 do
   eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
   case $ac_val in
     [\\/$]* | ?:[\\/]* )  continue;;
     NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
   esac
-  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; }
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
 done
 
 # There might be people who depend on the old broken behavior: `$host'
@@ -1113,8 +1213,6 @@
 if test "x$host_alias" != x; then
   if test "x$build_alias" = x; then
     cross_compiling=maybe
-    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used." >&2
   elif test "x$build_alias" != "x$host_alias"; then
     cross_compiling=yes
   fi
@@ -1129,23 +1227,21 @@
 ac_pwd=`pwd` && test -n "$ac_pwd" &&
 ac_ls_di=`ls -di .` &&
 ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-  { echo "$as_me: error: Working directory cannot be determined" >&2
-   { (exit 1); exit 1; }; }
+  as_fn_error $? "working directory cannot be determined"
 test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-  { echo "$as_me: error: pwd does not report name of working directory" >&2
-   { (exit 1); exit 1; }; }
+  as_fn_error $? "pwd does not report name of working directory"
 
 
 # Find the source files, if location was not specified.
 if test -z "$srcdir"; then
   ac_srcdir_defaulted=yes
   # Try the directory containing this script, then the parent directory.
-  ac_confdir=`$as_dirname -- "$0" ||
-$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$0" : 'X\(//\)[^/]' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$0" |
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -1172,13 +1268,11 @@
 fi
 if test ! -r "$srcdir/$ac_unique_file"; then
   test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
-  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
-   { (exit 1); exit 1; }; }
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
 fi
 ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
 ac_abs_confdir=`(
-	cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
-   { (exit 1); exit 1; }; }
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
 	pwd)`
 # When building in place, set srcdir=.
 if test "$ac_abs_confdir" = "$ac_pwd"; then
@@ -1218,7 +1312,7 @@
       --help=short        display options specific to this package
       --help=recursive    display the short help of all the included packages
   -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking...' messages
+  -q, --quiet, --silent   do not print \`checking ...' messages
       --cache-file=FILE   cache test results in FILE [disabled]
   -C, --config-cache      alias for \`--cache-file=config.cache'
   -n, --no-create         do not create output files
@@ -1226,9 +1320,9 @@
 
 Installation directories:
   --prefix=PREFIX         install architecture-independent files in PREFIX
-			  [$ac_default_prefix]
+                          [$ac_default_prefix]
   --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-			  [PREFIX]
+                          [PREFIX]
 
 By default, \`make install' will install all the files in
 \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
@@ -1238,25 +1332,25 @@
 For better control, use the options below.
 
 Fine tuning of the installation directories:
-  --bindir=DIR           user executables [EPREFIX/bin]
-  --sbindir=DIR          system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR       program executables [EPREFIX/libexec]
-  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
-  --libdir=DIR           object code libraries [EPREFIX/lib]
-  --includedir=DIR       C header files [PREFIX/include]
-  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
-  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
-  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
-  --infodir=DIR          info documentation [DATAROOTDIR/info]
-  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
-  --mandir=DIR           man documentation [DATAROOTDIR/man]
-  --docdir=DIR           documentation root [DATAROOTDIR/doc/PACKAGE]
-  --htmldir=DIR          html documentation [DOCDIR]
-  --dvidir=DIR           dvi documentation [DOCDIR]
-  --pdfdir=DIR           pdf documentation [DOCDIR]
-  --psdir=DIR            ps documentation [DOCDIR]
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/PACKAGE]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
 _ACEOF
 
   cat <<\_ACEOF
@@ -1273,22 +1367,47 @@
   cat <<\_ACEOF
 
 Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-largefile     omit support for large files
   --disable-protochain    disable \"protochain\" insn
-  --enable-ipv6           build IPv6-capable version
+  --enable-ipv6           build IPv6-capable version [default=yes, if
+                          getaddrinfo available]
   --enable-optimizer-dbg  build optimizer debugging code
   --enable-yydebug        build parser debugging code
+  --disable-universal     don't build universal on OS X
+  --enable-shared         build shared libraries [default=yes, if support
+                          available]
+  --enable-bluetooth      enable Bluetooth support [default=yes, if support
+                          available]
+  --enable-canusb         enable canusb support [default=yes, if support
+                          available]
+  --enable-can            enable CAN support [default=yes, if support
+                          available]
+  --enable-dbus           enable D-Bus capture support [default=yes, if
+                          support available]
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
   --without-gcc           don't use gcc
+  --with-sita             include SITA support
   --with-pcap=TYPE        use packet capture TYPE
-  --with-dag[=DIR]        include Endace DAG support ("yes", "no" or DIR; default="yes" on BSD and Linux if present)
-  --with-dag-includes=DIR   Endace DAG include directory
-  --with-dag-libraries=DIR  Endace DAG library directory
-  --with-septel[=DIR]     include Septel support (located in directory DIR, if supplied).  default=yes, on Linux, if present
+  --without-libnl         disable libnl support [default=yes, on Linux, if
+                          present]
+  --with-dag[=DIR]        include Endace DAG support ["yes", "no" or DIR;
+                          default="yes" on BSD and Linux if present]
+  --with-dag-includes=DIR Endace DAG include directory
+  --with-dag-libraries=DIR
+                          Endace DAG library directory
+  --with-septel[=DIR]     include Septel support (located in directory DIR, if
+                          supplied). [default=yes, on Linux, if present]
+  --with-snf[=DIR]        include Myricom SNF support ["yes", "no" or DIR;
+                          default="yes" on BSD and Linux if present]
+  --with-snf-includes=DIR Myricom SNF include directory
+  --with-snf-libraries=DIR
+                          Myricom SNF library directory
   --without-flex          don't use flex
   --without-bison         don't use bison
 
@@ -1298,13 +1417,14 @@
   LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
               nonstandard directory <lib dir>
   LIBS        libraries to pass to the linker, e.g. -l<library>
-  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
               you have headers in a nonstandard directory <include dir>
   CPP         C preprocessor
 
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
 
+Report bugs to the package provider.
 _ACEOF
 ac_status=$?
 fi
@@ -1312,15 +1432,17 @@
 if test "$ac_init_help" = "recursive"; then
   # If there are subdirs, report their specific --help.
   for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d "$ac_dir" || continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
     ac_builddir=.
 
 case "$ac_dir" in
 .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
 *)
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
   # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
   case $ac_top_builddir_sub in
   "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
   *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -1356,7 +1478,7 @@
       echo &&
       $SHELL "$ac_srcdir/configure" --help=recursive
     else
-      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
     fi || ac_status=$?
     cd "$ac_pwd" || { ac_status=$?; break; }
   done
@@ -1366,21 +1488,472 @@
 if $ac_init_version; then
   cat <<\_ACEOF
 configure
-generated by GNU Autoconf 2.61
+generated by GNU Autoconf 2.69
 
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
   exit
 fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=no"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+	 return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+	    return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  as_decl_name=`echo $2|sed 's/ *(.*//'`
+  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+  (void) $as_decl_use;
+#else
+  (void) $as_decl_name;
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
 cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
 It was created by $as_me, which was
-generated by GNU Autoconf 2.61.  Invocation command line was
+generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
 
@@ -1416,8 +1989,8 @@
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  echo "PATH: $as_dir"
-done
+    $as_echo "PATH: $as_dir"
+  done
 IFS=$as_save_IFS
 
 } >&5
@@ -1451,12 +2024,12 @@
     | -silent | --silent | --silen | --sile | --sil)
       continue ;;
     *\'*)
-      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
     esac
     case $ac_pass in
-    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
     2)
-      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      as_fn_append ac_configure_args1 " '$ac_arg'"
       if test $ac_must_keep_next = true; then
 	ac_must_keep_next=false # Got value, back to normal.
       else
@@ -1472,13 +2045,13 @@
 	  -* ) ac_must_keep_next=true ;;
 	esac
       fi
-      ac_configure_args="$ac_configure_args '$ac_arg'"
+      as_fn_append ac_configure_args " '$ac_arg'"
       ;;
     esac
   done
 done
-$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
-$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
 
 # When interrupted or exit'd, cleanup temporary files, and complete
 # config.log.  We remove comments because anyway the quotes in there
@@ -1490,11 +2063,9 @@
   {
     echo
 
-    cat <<\_ASBOX
-## ---------------- ##
+    $as_echo "## ---------------- ##
 ## Cache variables. ##
-## ---------------- ##
-_ASBOX
+## ---------------- ##"
     echo
     # The following way of writing the cache mishandles newlines in values,
 (
@@ -1503,12 +2074,13 @@
     case $ac_val in #(
     *${as_nl}*)
       case $ac_var in #(
-      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
-echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
       esac
       case $ac_var in #(
       _ | IFS | as_nl) ;; #(
-      *) $as_unset $ac_var ;;
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
       esac ;;
     esac
   done
@@ -1527,128 +2099,136 @@
 )
     echo
 
-    cat <<\_ASBOX
-## ----------------- ##
+    $as_echo "## ----------------- ##
 ## Output variables. ##
-## ----------------- ##
-_ASBOX
+## ----------------- ##"
     echo
     for ac_var in $ac_subst_vars
     do
       eval ac_val=\$$ac_var
       case $ac_val in
-      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
       esac
-      echo "$ac_var='\''$ac_val'\''"
+      $as_echo "$ac_var='\''$ac_val'\''"
     done | sort
     echo
 
     if test -n "$ac_subst_files"; then
-      cat <<\_ASBOX
-## ------------------- ##
+      $as_echo "## ------------------- ##
 ## File substitutions. ##
-## ------------------- ##
-_ASBOX
+## ------------------- ##"
       echo
       for ac_var in $ac_subst_files
       do
 	eval ac_val=\$$ac_var
 	case $ac_val in
-	*\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
 	esac
-	echo "$ac_var='\''$ac_val'\''"
+	$as_echo "$ac_var='\''$ac_val'\''"
       done | sort
       echo
     fi
 
     if test -s confdefs.h; then
-      cat <<\_ASBOX
-## ----------- ##
+      $as_echo "## ----------- ##
 ## confdefs.h. ##
-## ----------- ##
-_ASBOX
+## ----------- ##"
       echo
       cat confdefs.h
       echo
     fi
     test "$ac_signal" != 0 &&
-      echo "$as_me: caught signal $ac_signal"
-    echo "$as_me: exit $exit_status"
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
   } >&5
   rm -f core *.core core.conftest.* &&
     rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
     exit $exit_status
 ' 0
 for ac_signal in 1 2 13 15; do
-  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
 done
 ac_signal=0
 
 # confdefs.h avoids OS command line length limits that DEFS can exceed.
 rm -f -r conftest* confdefs.h
 
+$as_echo "/* confdefs.h */" > confdefs.h
+
 # Predefined preprocessor variables.
 
 cat >>confdefs.h <<_ACEOF
 #define PACKAGE_NAME "$PACKAGE_NAME"
 _ACEOF
 
-
 cat >>confdefs.h <<_ACEOF
 #define PACKAGE_TARNAME "$PACKAGE_TARNAME"
 _ACEOF
 
-
 cat >>confdefs.h <<_ACEOF
 #define PACKAGE_VERSION "$PACKAGE_VERSION"
 _ACEOF
 
-
 cat >>confdefs.h <<_ACEOF
 #define PACKAGE_STRING "$PACKAGE_STRING"
 _ACEOF
 
-
 cat >>confdefs.h <<_ACEOF
 #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
 _ACEOF
 
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
 
 # Let the site file select an alternate cache file if it wants to.
-# Prefer explicitly selected file to automatically selected ones.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
 if test -n "$CONFIG_SITE"; then
-  set x "$CONFIG_SITE"
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
 elif test "x$prefix" != xNONE; then
-  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
 else
-  set x "$ac_default_prefix/share/config.site" \
-	"$ac_default_prefix/etc/config.site"
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
 fi
-shift
-for ac_site_file
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
 do
-  if test -r "$ac_site_file"; then
-    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
-echo "$as_me: loading site script $ac_site_file" >&6;}
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
     sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file"
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
   fi
 done
 
 if test -r "$cache_file"; then
-  # Some versions of bash will fail to source /dev/null (special
-  # files actually), so we avoid doing that.
-  if test -f "$cache_file"; then
-    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
-echo "$as_me: loading cache $cache_file" >&6;}
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
     case $cache_file in
       [\\/]* | ?:[\\/]* ) . "$cache_file";;
       *)                      . "./$cache_file";;
     esac
   fi
 else
-  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
-echo "$as_me: creating cache $cache_file" >&6;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
   >$cache_file
 fi
 
@@ -1662,60 +2242,56 @@
   eval ac_new_val=\$ac_env_${ac_var}_value
   case $ac_old_set,$ac_new_set in
     set,)
-      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
       ac_cache_corrupted=: ;;
     ,set)
-      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
       ac_cache_corrupted=: ;;
     ,);;
     *)
       if test "x$ac_old_val" != "x$ac_new_val"; then
-	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
-echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
-echo "$as_me:   former value:  $ac_old_val" >&2;}
-	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
-echo "$as_me:   current value: $ac_new_val" >&2;}
-	ac_cache_corrupted=:
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
       fi;;
   esac
   # Pass precious variables to config.status.
   if test "$ac_new_set" = set; then
     case $ac_new_val in
-    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
     *) ac_arg=$ac_var=$ac_new_val ;;
     esac
     case " $ac_configure_args " in
       *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
     esac
   fi
 done
 if $ac_cache_corrupted; then
-  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
-echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
-echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
-   { (exit 1); exit 1; }; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
 fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -1742,9 +2318,7 @@
   fi
 done
 if test -z "$ac_aux_dir"; then
-  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
-echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
-   { (exit 1); exit 1; }; }
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
 fi
 
 # These three variables are undocumented and unsupported,
@@ -1758,35 +2332,27 @@
 
 # Make sure we can run config.sub.
 $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
-echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
-   { (exit 1); exit 1; }; }
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
 
-{ echo "$as_me:$LINENO: checking build system type" >&5
-echo $ECHO_N "checking build system type... $ECHO_C" >&6; }
-if test "${ac_cv_build+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   ac_build_alias=$build_alias
 test "x$ac_build_alias" = x &&
   ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
 test "x$ac_build_alias" = x &&
-  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
-echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
-   { (exit 1); exit 1; }; }
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
-echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
-   { (exit 1); exit 1; }; }
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
 
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5
-echo "${ECHO_T}$ac_cv_build" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
 case $ac_cv_build in
 *-*-*) ;;
-*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
-echo "$as_me: error: invalid value of canonical build" >&2;}
-   { (exit 1); exit 1; }; };;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
 esac
 build=$ac_cv_build
 ac_save_IFS=$IFS; IFS='-'
@@ -1802,28 +2368,24 @@
 case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
 
 
-{ echo "$as_me:$LINENO: checking host system type" >&5
-echo $ECHO_N "checking host system type... $ECHO_C" >&6; }
-if test "${ac_cv_host+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   if test "x$host_alias" = x; then
   ac_cv_host=$ac_cv_build
 else
   ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
-echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
-   { (exit 1); exit 1; }; }
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
 fi
 
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5
-echo "${ECHO_T}$ac_cv_host" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
 case $ac_cv_host in
 *-*-*) ;;
-*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
-echo "$as_me: error: invalid value of canonical host" >&2;}
-   { (exit 1); exit 1; }; };;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
 esac
 host=$ac_cv_host
 ac_save_IFS=$IFS; IFS='-'
@@ -1839,28 +2401,24 @@
 case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
 
 
-{ echo "$as_me:$LINENO: checking target system type" >&5
-echo $ECHO_N "checking target system type... $ECHO_C" >&6; }
-if test "${ac_cv_target+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+$as_echo_n "checking target system type... " >&6; }
+if ${ac_cv_target+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   if test "x$target_alias" = x; then
   ac_cv_target=$ac_cv_host
 else
   ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
-    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5
-echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;}
-   { (exit 1); exit 1; }; }
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
 fi
 
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_target" >&5
-echo "${ECHO_T}$ac_cv_target" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+$as_echo "$ac_cv_target" >&6; }
 case $ac_cv_target in
 *-*-*) ;;
-*) { { echo "$as_me:$LINENO: error: invalid value of canonical target" >&5
-echo "$as_me: error: invalid value of canonical target" >&2;}
-   { (exit 1); exit 1; }; };;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
 esac
 target=$ac_cv_target
 ac_save_IFS=$IFS; IFS='-'
@@ -1888,29 +2446,30 @@
 
 
 
+
+
 # Check whether --with-gcc was given.
-if test "${with_gcc+set}" = set; then
+if test "${with_gcc+set}" = set; then :
   withval=$with_gcc;
 fi
 
-    V_CCOPT="-O"
-    V_INCLS=""
+    V_CCOPT=""
     if test "${srcdir}" != "." ; then
-	    V_INCLS="-I\$(srcdir)"
+	    V_CCOPT="-I\$(srcdir)"
     fi
     if test "${CFLAGS+set}" = set; then
 	    LBL_CFLAGS="$CFLAGS"
     fi
     if test -z "$CC" ; then
-	    case "$target_os" in
+	    case "$host_os" in
 
 	    bsdi*)
 		    # Extract the first word of "shlicc2", so it can be a program name with args.
 set dummy shlicc2; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_SHLICC2+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_SHLICC2+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$SHLICC2"; then
   ac_cv_prog_SHLICC2="$SHLICC2" # Let the user override the test.
@@ -1920,14 +2479,14 @@
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_SHLICC2="yes"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
-done
+  done
 IFS=$as_save_IFS
 
   test -z "$ac_cv_prog_SHLICC2" && ac_cv_prog_SHLICC2="no"
@@ -1935,11 +2494,11 @@
 fi
 SHLICC2=$ac_cv_prog_SHLICC2
 if test -n "$SHLICC2"; then
-  { echo "$as_me:$LINENO: result: $SHLICC2" >&5
-echo "${ECHO_T}$SHLICC2" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SHLICC2" >&5
+$as_echo "$SHLICC2" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -1954,7 +2513,8 @@
 	    CC=cc
 	    export CC
     fi
-    ac_ext=c
+
+ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
@@ -1962,10 +2522,10 @@
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -1975,25 +2535,25 @@
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
-done
+  done
 IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -2002,10 +2562,10 @@
   ac_ct_CC=$CC
   # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_CC"; then
   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
@@ -2015,25 +2575,25 @@
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CC="gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
-done
+  done
 IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_CC" = x; then
@@ -2041,12 +2601,8 @@
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     CC=$ac_ct_CC
@@ -2059,10 +2615,10 @@
           if test -n "$ac_tool_prefix"; then
     # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -2072,25 +2628,25 @@
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
-done
+  done
 IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -2099,10 +2655,10 @@
 if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -2113,18 +2669,18 @@
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
        continue
      fi
     ac_cv_prog_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
-done
+  done
 IFS=$as_save_IFS
 
 if test $ac_prog_rejected = yes; then
@@ -2143,11 +2699,11 @@
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -2158,10 +2714,10 @@
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -2171,25 +2727,25 @@
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
-done
+  done
 IFS=$as_save_IFS
 
 fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -2202,10 +2758,10 @@
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_CC"; then
   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
@@ -2215,25 +2771,25 @@
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
-done
+  done
 IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -2245,12 +2801,8 @@
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     CC=$ac_ct_CC
@@ -2260,51 +2812,37 @@
 fi
 
 
-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
 
 # Provide some information about the compiler.
-echo "$as_me:$LINENO: checking for C compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (ac_try="$ac_compiler --version >&5"
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compiler --version >&5") 2>&5
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (ac_try="$ac_compiler -v >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compiler -v >&5") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (ac_try="$ac_compiler -V >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compiler -V >&5") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
 
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
@@ -2316,42 +2854,38 @@
 }
 _ACEOF
 ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.exe b.out"
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
 # Try to create an executable without -o first, disregard a.out.
 # It will help us diagnose broken compilers, and finding out an intuition
 # of exeext.
-{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
-echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
-ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-#
-# List of possible output files, starting from the most likely.
-# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
-# only as a last resort.  b.out is created by i960 compilers.
-ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
-#
-# The IRIX 6 linker writes into existing files which may not be
-# executable, retaining their permissions.  Remove them first so a
-# subsequent execution test works.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
 ac_rmfiles=
 for ac_file in $ac_files
 do
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
     * ) ac_rmfiles="$ac_rmfiles $ac_file";;
   esac
 done
 rm -f $ac_rmfiles
 
-if { (ac_try="$ac_link_default"
+if { { ac_try="$ac_link_default"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
   (eval "$ac_link_default") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
   # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
 # So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
 # in a Makefile.  We should not override ac_cv_exeext if it was cached,
@@ -2361,14 +2895,14 @@
 do
   test -f "$ac_file" || continue
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
 	;;
     [ab].out )
 	# We found the default executable, but exeext='' is most
 	# certainly right.
 	break;;
     *.* )
-        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
 	then :; else
 	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
 	fi
@@ -2387,78 +2921,41 @@
 else
   ac_file=''
 fi
-
-{ echo "$as_me:$LINENO: result: $ac_file" >&5
-echo "${ECHO_T}$ac_file" >&6; }
-if test -z "$ac_file"; then
-  echo "$as_me: failed program was:" >&5
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
-See \`config.log' for more details." >&5
-echo "$as_me: error: C compiler cannot create executables
-See \`config.log' for more details." >&2;}
-   { (exit 77); exit 77; }; }
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
 fi
-
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
 ac_exeext=$ac_cv_exeext
 
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
-# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
-# If not cross compiling, check that we can run a simple program.
-if test "$cross_compiling" != yes; then
-  if { ac_try='./$ac_file'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-    fi
-  fi
-fi
-{ echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
-
-rm -f a.out a.exe conftest$ac_cv_exeext b.out
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
 ac_clean_files=$ac_clean_files_save
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
-{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
-echo "${ECHO_T}$cross_compiling" >&6; }
-
-{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
-if { (ac_try="$ac_link"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
   (eval "$ac_link") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
   # If both `conftest.exe' and `conftest' are `present' (well, observable)
 # catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
 # work properly (i.e., refer to `conftest.exe'), while it won't with
@@ -2466,37 +2963,90 @@
 for ac_file in conftest.exe conftest conftest.*; do
   test -f "$ac_file" || continue
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
     *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
 	  break;;
     * ) break;;
   esac
 done
 else
-  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
 fi
-
-rm -f conftest$ac_cv_exeext
-{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
-echo "${ECHO_T}$ac_cv_exeext" >&6; }
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
 
 rm -f conftest.$ac_ext
 EXEEXT=$ac_cv_exeext
 ac_exeext=$EXEEXT
-{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
-if test "${ac_cv_objext+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
 _ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
@@ -2508,51 +3058,46 @@
 }
 _ACEOF
 rm -f conftest.o conftest.obj
-if { (ac_try="$ac_compile"
+if { { ac_try="$ac_compile"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
   (eval "$ac_compile") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
   for ac_file in conftest.o conftest.obj conftest.*; do
   test -f "$ac_file" || continue;
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
     *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
        break;;
   esac
 done
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
 fi
-
 rm -f conftest.$ac_cv_objext conftest.$ac_ext
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-echo "${ECHO_T}$ac_cv_objext" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
 OBJEXT=$ac_cv_objext
 ac_objext=$OBJEXT
-{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
@@ -2566,54 +3111,34 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
   ac_compiler_gnu=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_compiler_gnu=no
+  ac_compiler_gnu=no
 fi
-
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_cv_c_compiler_gnu=$ac_compiler_gnu
 
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
-GCC=`test $ac_compiler_gnu = yes && echo yes`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
 ac_test_CFLAGS=${CFLAGS+set}
 ac_save_CFLAGS=$CFLAGS
-{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   ac_save_c_werror_flag=$ac_c_werror_flag
    ac_c_werror_flag=yes
    ac_cv_prog_cc_g=no
    CFLAGS="-g"
-   cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
@@ -2624,34 +3149,11 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
   ac_cv_prog_cc_g=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	CFLAGS=""
-      cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
@@ -2662,35 +3164,12 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+if ac_fn_c_try_compile "$LINENO"; then :
 
-	ac_c_werror_flag=$ac_save_c_werror_flag
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
 	 CFLAGS="-g"
-	 cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
@@ -2701,42 +3180,18 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
   ac_cv_prog_cc_g=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
 fi
-
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_c_werror_flag=$ac_save_c_werror_flag
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
 if test "$ac_test_CFLAGS" = set; then
   CFLAGS=$ac_save_CFLAGS
 elif test $ac_cv_prog_cc_g = yes; then
@@ -2752,23 +3207,18 @@
     CFLAGS=
   fi
 fi
-{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
-echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   ac_cv_prog_cc_c89=no
 ac_save_CC=$CC
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <stdarg.h>
 #include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
+struct stat;
 /* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
 struct buf { int x; };
 FILE * (*rcsopen) (struct buf *, struct stat *, int);
@@ -2820,31 +3270,9 @@
 	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
 do
   CC="$ac_save_CC $ac_arg"
-  rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
+  if ac_fn_c_try_compile "$LINENO"; then :
   ac_cv_prog_cc_c89=$ac_arg
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
 fi
-
 rm -f core conftest.err conftest.$ac_objext
   test "x$ac_cv_prog_cc_c89" != "xno" && break
 done
@@ -2855,17 +3283,19 @@
 # AC_CACHE_VAL
 case "x$ac_cv_prog_cc_c89" in
   x)
-    { echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6; } ;;
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
   xno)
-    { echo "$as_me:$LINENO: result: unsupported" >&5
-echo "${ECHO_T}unsupported" >&6; } ;;
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
   *)
     CC="$CC $ac_cv_prog_cc_c89"
-    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
 esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
 
+fi
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -2873,182 +3303,111 @@
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
+
+
+
+
     if test "$GCC" = yes ; then
-	    if test "$SHLICC2" = yes ; then
-		    ac_cv_lbl_gcc_vers=2
-		    V_CCOPT="-O2"
-	    else
-		    { echo "$as_me:$LINENO: checking gcc version" >&5
-echo $ECHO_N "checking gcc version... $ECHO_C" >&6; }
-		    if test "${ac_cv_lbl_gcc_vers+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_lbl_gcc_vers=`$CC -v 2>&1 | \
-			    sed -e '/^gcc version /!d' \
-				-e 's/^gcc version //' \
-				-e 's/ .*//' -e 's/^[^0-9]*//' \
-				-e 's/\..*//'`
-fi
-
-		    { echo "$as_me:$LINENO: result: $ac_cv_lbl_gcc_vers" >&5
-echo "${ECHO_T}$ac_cv_lbl_gcc_vers" >&6; }
-		    if test $ac_cv_lbl_gcc_vers -gt 1 ; then
-			    V_CCOPT="-O2"
-		    fi
-	    fi
+	    #
+	    # -Werror forces warnings to be errors.
+	    #
+	    ac_lbl_cc_force_warning_errors=-Werror
     else
-	    { echo "$as_me:$LINENO: checking that $CC handles ansi prototypes" >&5
-echo $ECHO_N "checking that $CC handles ansi prototypes... $ECHO_C" >&6; }
-	    if test "${ac_cv_lbl_cc_ansi_prototypes+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <sys/types.h>
-int
-main ()
-{
-int frob(int, char *)
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_lbl_cc_ansi_prototypes=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lbl_cc_ansi_prototypes=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-
-	    { echo "$as_me:$LINENO: result: $ac_cv_lbl_cc_ansi_prototypes" >&5
-echo "${ECHO_T}$ac_cv_lbl_cc_ansi_prototypes" >&6; }
-	    if test $ac_cv_lbl_cc_ansi_prototypes = no ; then
-		    case "$target_os" in
-
-		    hpux*)
-			    { echo "$as_me:$LINENO: checking for HP-UX ansi compiler ($CC -Aa -D_HPUX_SOURCE)" >&5
-echo $ECHO_N "checking for HP-UX ansi compiler ($CC -Aa -D_HPUX_SOURCE)... $ECHO_C" >&6; }
-			    savedcflags="$CFLAGS"
-			    CFLAGS="-Aa -D_HPUX_SOURCE $CFLAGS"
-			    if test "${ac_cv_lbl_cc_hpux_cc_aa+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <sys/types.h>
-int
-main ()
-{
-int frob(int, char *)
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_lbl_cc_hpux_cc_aa=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lbl_cc_hpux_cc_aa=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-
-			    { echo "$as_me:$LINENO: result: $ac_cv_lbl_cc_hpux_cc_aa" >&5
-echo "${ECHO_T}$ac_cv_lbl_cc_hpux_cc_aa" >&6; }
-			    if test $ac_cv_lbl_cc_hpux_cc_aa = no ; then
-				    { { echo "$as_me:$LINENO: error: see the INSTALL doc for more info" >&5
-echo "$as_me: error: see the INSTALL doc for more info" >&2;}
-   { (exit 1); exit 1; }; }
-			    fi
-			    CFLAGS="$savedcflags"
-			    V_CCOPT="-Aa $V_CCOPT"
-
-cat >>confdefs.h <<\_ACEOF
-#define _HPUX_SOURCE 1
-_ACEOF
-
-			    ;;
-
-		    *)
-			    { { echo "$as_me:$LINENO: error: see the INSTALL doc for more info" >&5
-echo "$as_me: error: see the INSTALL doc for more info" >&2;}
-   { (exit 1); exit 1; }; }
-			    ;;
-		    esac
-	    fi
 	    V_INCLS="$V_INCLS -I/usr/local/include"
 	    LDFLAGS="$LDFLAGS -L/usr/local/lib"
 
-	    case "$target_os" in
+	    case "$host_os" in
+
+	    darwin*)
+		    #
+		    # This is assumed either to be GCC or clang, both
+		    # of which use -Werror to force warnings to be errors.
+		    #
+		    ac_lbl_cc_force_warning_errors=-Werror
+		    ;;
+
+	    hpux*)
+		    #
+		    # HP C, which is what we presume we're using, doesn't
+		    # exit with a non-zero exit status if we hand it an
+		    # invalid -W flag, can't be forced to do so even with
+		    # +We, and doesn't handle GCC-style -W flags, so we
+		    # don't want to try using GCC-style -W flags.
+		    #
+		    ac_lbl_cc_dont_try_gcc_dashW=yes
+		    ;;
 
 	    irix*)
+		    #
+		    # MIPS C, which is what we presume we're using, doesn't
+		    # necessarily exit with a non-zero exit status if we
+		    # hand it an invalid -W flag, can't be forced to do
+		    # so, and doesn't handle GCC-style -W flags, so we
+		    # don't want to try using GCC-style -W flags.
+		    #
+		    ac_lbl_cc_dont_try_gcc_dashW=yes
+		    #
+		    # It also, apparently, defaults to "char" being
+		    # unsigned, unlike most other C implementations;
+		    # I suppose we could say "signed char" whenever
+		    # we want to guarantee a signed "char", but let's
+		    # just force signed chars.
+		    #
+		    # -xansi is normally the default, but the
+		    # configure script was setting it; perhaps -cckr
+		    # was the default in the Old Days.  (Then again,
+		    # that would probably be for backwards compatibility
+		    # in the days when ANSI C was Shiny and New, i.e.
+		    # 1989 and the early '90's, so maybe we can just
+		    # drop support for those compilers.)
+		    #
+		    # -g is equivalent to -g2, which turns off
+		    # optimization; we choose -g3, which generates
+		    # debugging information but doesn't turn off
+		    # optimization (even if the optimization would
+		    # cause inaccuracies in debugging).
+		    #
 		    V_CCOPT="$V_CCOPT -xansi -signed -g3"
 		    ;;
 
 	    osf*)
-		    V_CCOPT="$V_CCOPT -std1 -g3"
+		    #
+		    # Presumed to be DEC OSF/1, Digital UNIX, or
+		    # Tru64 UNIX.
+		    #
+		    # The DEC C compiler, which is what we presume we're
+		    # using, doesn't exit with a non-zero exit status if we
+		    # hand it an invalid -W flag, can't be forced to do
+		    # so, and doesn't handle GCC-style -W flags, so we
+		    # don't want to try using GCC-style -W flags.
+		    #
+		    ac_lbl_cc_dont_try_gcc_dashW=yes
+		    #
+		    # -g is equivalent to -g2, which turns off
+		    # optimization; we choose -g3, which generates
+		    # debugging information but doesn't turn off
+		    # optimization (even if the optimization would
+		    # cause inaccuracies in debugging).
+		    #
+		    V_CCOPT="$V_CCOPT -g3"
+		    ;;
+
+	    solaris*)
+		    #
+		    # Assumed to be Sun C, which requires -errwarn to force
+		    # warnings to be treated as errors.
+		    #
+		    ac_lbl_cc_force_warning_errors=-errwarn
 		    ;;
 
 	    ultrix*)
-		    { echo "$as_me:$LINENO: checking that Ultrix $CC hacks const in prototypes" >&5
-echo $ECHO_N "checking that Ultrix $CC hacks const in prototypes... $ECHO_C" >&6; }
-		    if test "${ac_cv_lbl_cc_const_proto+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+		    { $as_echo "$as_me:${as_lineno-$LINENO}: checking that Ultrix $CC hacks const in prototypes" >&5
+$as_echo_n "checking that Ultrix $CC hacks const in prototypes... " >&6; }
+		    if ${ac_cv_lbl_cc_const_proto+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <sys/types.h>
 int
@@ -3060,63 +3419,186 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
   ac_cv_lbl_cc_const_proto=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lbl_cc_const_proto=no
+  ac_cv_lbl_cc_const_proto=no
 fi
-
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
-		    { echo "$as_me:$LINENO: result: $ac_cv_lbl_cc_const_proto" >&5
-echo "${ECHO_T}$ac_cv_lbl_cc_const_proto" >&6; }
+		    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_cc_const_proto" >&5
+$as_echo "$ac_cv_lbl_cc_const_proto" >&6; }
 		    if test $ac_cv_lbl_cc_const_proto = no ; then
-			    cat >>confdefs.h <<\_ACEOF
-#define const
-_ACEOF
+
+$as_echo "#define const /**/" >>confdefs.h
 
 		    fi
 		    ;;
 	    esac
+	    V_CCOPT="$V_CCOPT -O"
     fi
 
-{ echo "$as_me:$LINENO: checking for inline" >&5
-echo $ECHO_N "checking for inline... $ECHO_C" >&6; }
+
+    if test "$GCC" = yes ; then
+	    #
+	    # On platforms where we build a shared library:
+	    #
+	    #	add options to generate position-independent code,
+	    #	if necessary (it's the default in AIX and Darwin/OS X);
+	    #
+	    #	define option to set the soname of the shared library,
+	    #	if the OS supports that;
+	    #
+	    #	add options to specify, at link time, a directory to
+	    #	add to the run-time search path, if that's necessary.
+	    #
+	    V_SHLIB_CMD="\$(CC)"
+	    V_SHLIB_OPT="-shared"
+	    case "$host_os" in
+
+	    aix*)
+		    ;;
+
+	    freebsd*|netbsd*|openbsd*|dragonfly*|linux*|osf*)
+	    	    #
+		    # Platforms where the linker is the GNU linker
+		    # or accepts command-line arguments like
+		    # those the GNU linker accepts.
+		    #
+		    # Some instruction sets require -fPIC on some
+		    # operating systems.  Check for them.  If you
+		    # have a combination that requires it, add it
+		    # here.
+		    #
+		    PIC_OPT=-fpic
+		    case "$host_cpu" in
+
+		    sparc64*)
+			case "$host_os" in
+
+			freebsd*|openbsd*)
+			    PIC_OPT=-fPIC
+			    ;;
+			esac
+			;;
+		    esac
+		    V_CCOPT="$V_CCOPT $PIC_OPT"
+		    V_SONAME_OPT="-Wl,-soname,"
+		    V_RPATH_OPT="-Wl,-rpath,"
+		    ;;
+
+	    hpux*)
+		    V_CCOPT="$V_CCOPT -fpic"
+	    	    #
+		    # XXX - this assumes GCC is using the HP linker,
+		    # rather than the GNU linker, and that the "+h"
+		    # option is used on all HP-UX platforms, both .sl
+		    # and .so.
+		    #
+		    V_SONAME_OPT="-Wl,+h,"
+		    #
+		    # By default, directories specifed with -L
+		    # are added to the run-time search path, so
+		    # we don't add them in pcap-config.
+		    #
+		    ;;
+
+	    solaris*)
+		    V_CCOPT="$V_CCOPT -fpic"
+		    #
+		    # XXX - this assumes GCC is using the Sun linker,
+		    # rather than the GNU linker.
+		    #
+		    V_SONAME_OPT="-Wl,-h,"
+		    V_RPATH_OPT="-Wl,-R,"
+		    ;;
+	    esac
+    else
+	    #
+	    # Set the appropriate compiler flags and, on platforms
+	    # where we build a shared library:
+	    #
+	    #	add options to generate position-independent code,
+	    #	if necessary (it's the default in Darwin/OS X);
+	    #
+	    #	if we generate ".so" shared libraries, define the
+	    #	appropriate options for building the shared library;
+	    #
+	    #	add options to specify, at link time, a directory to
+	    #	add to the run-time search path, if that's necessary.
+	    #
+	    # Note: spaces after V_SONAME_OPT are significant; on
+	    # some platforms the soname is passed with a GCC-like
+	    # "-Wl,-soname,{soname}" option, with the soname part
+	    # of the option, while on other platforms the C compiler
+	    # driver takes it as a regular option with the soname
+	    # following the option.  The same applies to V_RPATH_OPT.
+	    #
+	    case "$host_os" in
+
+	    aix*)
+		    V_SHLIB_CMD="\$(CC)"
+		    V_SHLIB_OPT="-G -bnoentry -bexpall"
+		    ;;
+
+	    freebsd*|netbsd*|openbsd*|dragonfly*|linux*)
+		    #
+		    # "cc" is GCC.
+		    #
+		    V_CCOPT="$V_CCOPT -fpic"
+		    V_SHLIB_CMD="\$(CC)"
+		    V_SHLIB_OPT="-shared"
+		    V_SONAME_OPT="-Wl,-soname,"
+		    V_RPATH_OPT="-Wl,-rpath,"
+		    ;;
+
+	    hpux*)
+		    V_CCOPT="$V_CCOPT +z"
+		    V_SHLIB_CMD="\$(LD)"
+		    V_SHLIB_OPT="-b"
+		    V_SONAME_OPT="+h "
+		    #
+		    # By default, directories specifed with -L
+		    # are added to the run-time search path, so
+		    # we don't add them in pcap-config.
+		    #
+		    ;;
+
+	    osf*)
+	    	    #
+		    # Presumed to be DEC OSF/1, Digital UNIX, or
+		    # Tru64 UNIX.
+		    #
+		    V_SHLIB_CMD="\$(CC)"
+		    V_SHLIB_OPT="-shared"
+		    V_SONAME_OPT="-soname "
+		    V_RPATH_OPT="-rpath "
+		    ;;
+
+	    solaris*)
+		    V_CCOPT="$V_CCOPT -Kpic"
+		    V_SHLIB_CMD="\$(CC)"
+		    V_SHLIB_OPT="-G"
+		    V_SONAME_OPT="-h "
+		    V_RPATH_OPT="-R"
+		    ;;
+	    esac
+    fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+$as_echo_n "checking for inline... " >&6; }
     save_CFLAGS="$CFLAGS"
     CFLAGS="$V_CCOPT"
-    if test "${ac_cv_lbl_inline+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+    if ${ac_cv_lbl_inline+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
 
 	ac_cv_lbl_inline=""
 	ac_lbl_cc_inline=no
 	for ac_lbl_inline in inline __inline__ __inline
 	do
-	    cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+	    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #define inline $ac_lbl_inline
 		static inline struct iltest *foo(void);
@@ -3140,31 +3622,9 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
   ac_lbl_cc_inline=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
 fi
-
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 	    if test "$ac_lbl_cc_inline" = yes ; then
 		break;
@@ -3177,11 +3637,11 @@
 
     CFLAGS="$save_CFLAGS"
     if test ! -z "$ac_cv_lbl_inline" ; then
-	{ echo "$as_me:$LINENO: result: $ac_cv_lbl_inline" >&5
-echo "${ECHO_T}$ac_cv_lbl_inline" >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_inline" >&5
+$as_echo "$ac_cv_lbl_inline" >&6; }
     else
-	{ echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
     fi
 
 cat >>confdefs.h <<_ACEOF
@@ -3189,19 +3649,16 @@
 _ACEOF
 
 
-{ echo "$as_me:$LINENO: checking for __attribute__" >&5
-echo $ECHO_N "checking for __attribute__... $ECHO_C" >&6; }
-if test "${ac_cv___attribute__+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__" >&5
+$as_echo_n "checking for __attribute__... " >&6; }
+if ${ac_cv___attribute__+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
 
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
+
 #include <stdlib.h>
 
 static void foo(void) __attribute__ ((noreturn));
@@ -3219,252 +3676,128 @@
 }
 
 _ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
   ac_cv___attribute__=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv___attribute__=no
+  ac_cv___attribute__=no
 fi
-
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
 if test "$ac_cv___attribute__" = "yes"; then
 
-cat >>confdefs.h <<\_ACEOF
-#define HAVE___ATTRIBUTE__ 1
-_ACEOF
+$as_echo "#define HAVE___ATTRIBUTE__ 1" >>confdefs.h
 
+else
+  #
+  # We can't use __attribute__, so we can't use __attribute__((unused)),
+  # so we define _U_ to an empty string.
+  #
+  V_DEFS="$V_DEFS -D_U_=\"\""
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv___attribute__" >&5
+$as_echo "$ac_cv___attribute__" >&6; }
+
+if test "$ac_cv___attribute__" = "yes"; then
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __attribute__((unused)) can be used without warnings" >&5
+$as_echo_n "checking whether __attribute__((unused)) can be used without warnings... " >&6; }
+if ${ac_cv___attribute___unused+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+
+int
+main(int argc  __attribute((unused)), char **argv __attribute((unused)))
+{
+  printf("Hello, world!\n");
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv___attribute___unused=yes
+else
+  ac_cv___attribute___unused=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+CFLAGS="$save_CFLAGS"
+if test "$ac_cv___attribute___unused" = "yes"; then
   V_DEFS="$V_DEFS -D_U_=\"__attribute__((unused))\""
 else
   V_DEFS="$V_DEFS -D_U_=\"\""
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv___attribute__" >&5
-echo "${ECHO_T}$ac_cv___attribute__" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv___attribute___unused" >&5
+$as_echo "$ac_cv___attribute___unused" >&6; }
 
 
-{ echo "$as_me:$LINENO: checking for u_int8_t using $CC" >&5
-echo $ECHO_N "checking for u_int8_t using $CC... $ECHO_C" >&6; }
-    if test "${ac_cv_lbl_have_u_int8_t+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __attribute__((format)) can be used without warnings" >&5
+$as_echo_n "checking whether __attribute__((format)) can be used without warnings... " >&6; }
+if ${ac_cv___attribute___format+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $ac_lbl_cc_force_warning_errors"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-#	include "confdefs.h"
-#	include <sys/types.h>
-#	if STDC_HEADERS
-#	include <stdlib.h>
-#	include <stddef.h>
-#	endif
+
+#include <stdlib.h>
+
+extern int foo(const char *fmt, ...)
+		  __attribute__ ((format (printf, 1, 2)));
+
 int
-main ()
+main(int argc, char **argv)
 {
-u_int8_t i
-  ;
-  return 0;
+  foo("%s", "test");
 }
+
 _ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_lbl_have_u_int8_t=yes
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv___attribute___format=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lbl_have_u_int8_t=no
+  ac_cv___attribute___format=no
 fi
-
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
-    { echo "$as_me:$LINENO: result: $ac_cv_lbl_have_u_int8_t" >&5
-echo "${ECHO_T}$ac_cv_lbl_have_u_int8_t" >&6; }
-    if test $ac_cv_lbl_have_u_int8_t = no ; then
+CFLAGS="$save_CFLAGS"
+if test "$ac_cv___attribute___format" = "yes"; then
 
-cat >>confdefs.h <<\_ACEOF
-#define u_int8_t u_char
-_ACEOF
+$as_echo "#define __ATTRIBUTE___FORMAT_OK 1" >>confdefs.h
 
-    fi
-{ echo "$as_me:$LINENO: checking for u_int16_t using $CC" >&5
-echo $ECHO_N "checking for u_int16_t using $CC... $ECHO_C" >&6; }
-    if test "${ac_cv_lbl_have_u_int16_t+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-#	include "confdefs.h"
-#	include <sys/types.h>
-#	if STDC_HEADERS
-#	include <stdlib.h>
-#	include <stddef.h>
-#	endif
-int
-main ()
-{
-u_int16_t i
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_lbl_have_u_int16_t=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lbl_have_u_int16_t=no
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv___attribute___format" >&5
+$as_echo "$ac_cv___attribute___format" >&6; }
 
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
-    { echo "$as_me:$LINENO: result: $ac_cv_lbl_have_u_int16_t" >&5
-echo "${ECHO_T}$ac_cv_lbl_have_u_int16_t" >&6; }
-    if test $ac_cv_lbl_have_u_int16_t = no ; then
-
-cat >>confdefs.h <<\_ACEOF
-#define u_int16_t u_short
-_ACEOF
-
-    fi
-{ echo "$as_me:$LINENO: checking for u_int32_t using $CC" >&5
-echo $ECHO_N "checking for u_int32_t using $CC... $ECHO_C" >&6; }
-    if test "${ac_cv_lbl_have_u_int32_t+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-#	include "confdefs.h"
-#	include <sys/types.h>
-#	if STDC_HEADERS
-#	include <stdlib.h>
-#	include <stddef.h>
-#	endif
-int
-main ()
-{
-u_int32_t i
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_lbl_have_u_int32_t=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lbl_have_u_int32_t=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-
-    { echo "$as_me:$LINENO: result: $ac_cv_lbl_have_u_int32_t" >&5
-echo "${ECHO_T}$ac_cv_lbl_have_u_int32_t" >&6; }
-    if test $ac_cv_lbl_have_u_int32_t = no ; then
-
-cat >>confdefs.h <<\_ACEOF
-#define u_int32_t u_int
-_ACEOF
-
-    fi
-
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
-echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
 fi
 if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
       # Double quotes because CPP needs to be expanded
     for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
@@ -3478,11 +3811,7 @@
   # <limits.h> exists even on freestanding compilers.
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #ifdef __STDC__
 # include <limits.h>
@@ -3491,76 +3820,34 @@
 #endif
 		     Syntax error
 _ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+if ac_fn_c_try_cpp "$LINENO"; then :
 
+else
   # Broken: fails on valid input.
 continue
 fi
-
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.err conftest.i conftest.$ac_ext
 
   # OK, works on sane cases.  Now check whether nonexistent headers
   # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
+if ac_fn_c_try_cpp "$LINENO"; then :
   # Broken: success on invalid input.
 continue
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
   # Passes both tests.
 ac_preproc_ok=:
 break
 fi
-
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.err conftest.i conftest.$ac_ext
 
 done
 # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
   break
 fi
 
@@ -3572,8 +3859,8 @@
 else
   ac_cv_prog_CPP=$CPP
 fi
-{ echo "$as_me:$LINENO: result: $CPP" >&5
-echo "${ECHO_T}$CPP" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
 ac_preproc_ok=false
 for ac_c_preproc_warn_flag in '' yes
 do
@@ -3583,11 +3870,7 @@
   # <limits.h> exists even on freestanding compilers.
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #ifdef __STDC__
 # include <limits.h>
@@ -3596,83 +3879,40 @@
 #endif
 		     Syntax error
 _ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
+if ac_fn_c_try_cpp "$LINENO"; then :
 
+else
   # Broken: fails on valid input.
 continue
 fi
-
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.err conftest.i conftest.$ac_ext
 
   # OK, works on sane cases.  Now check whether nonexistent headers
   # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
+if ac_fn_c_try_cpp "$LINENO"; then :
   # Broken: success on invalid input.
 continue
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
   # Passes both tests.
 ac_preproc_ok=:
 break
 fi
-
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.err conftest.i conftest.$ac_ext
 
 done
 # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
-  :
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
 else
-  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." >&5
-echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
 fi
 
 ac_ext=c
@@ -3682,45 +3922,40 @@
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
-echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
-if test "${ac_cv_path_GREP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  # Extract the first word of "grep ggrep" to use in msg output
-if test -z "$GREP"; then
-set dummy grep ggrep; ac_prog_name=$2
-if test "${ac_cv_path_GREP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
+  if test -z "$GREP"; then
   ac_path_GREP_found=false
-# Loop through the user's path and test for each of PROGNAME-LIST
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for ac_prog in grep ggrep; do
-  for ac_exec_ext in '' $ac_executable_extensions; do
-    ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-    { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-    # Check for GNU ac_path_GREP and select it if it is found.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
   # Check for GNU $ac_path_GREP
 case `"$ac_path_GREP" --version 2>&1` in
 *GNU*)
   ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
 *)
   ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  $as_echo_n 0123456789 >"conftest.in"
   while :
   do
     cat "conftest.in" "conftest.in" >"conftest.tmp"
     mv "conftest.tmp" "conftest.in"
     cp "conftest.in" "conftest.nl"
-    echo 'GREP' >> "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
     "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
     diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    ac_count=`expr $ac_count + 1`
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
     if test $ac_count -gt ${ac_path_GREP_max-0}; then
       # Best one so far, save it but keep looking for a better one
       ac_cv_path_GREP="$ac_path_GREP"
@@ -3732,77 +3967,61 @@
   rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
 esac
 
-
-    $ac_path_GREP_found && break 3
+      $ac_path_GREP_found && break 3
+    done
   done
-done
-
-done
+  done
 IFS=$as_save_IFS
-
-
-fi
-
-GREP="$ac_cv_path_GREP"
-if test -z "$GREP"; then
-  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
-echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
 else
   ac_cv_path_GREP=$GREP
 fi
 
-
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
-echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
  GREP="$ac_cv_path_GREP"
 
 
-{ echo "$as_me:$LINENO: checking for egrep" >&5
-echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
-if test "${ac_cv_path_EGREP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
    then ac_cv_path_EGREP="$GREP -E"
    else
-     # Extract the first word of "egrep" to use in msg output
-if test -z "$EGREP"; then
-set dummy egrep; ac_prog_name=$2
-if test "${ac_cv_path_EGREP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
+     if test -z "$EGREP"; then
   ac_path_EGREP_found=false
-# Loop through the user's path and test for each of PROGNAME-LIST
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for ac_prog in egrep; do
-  for ac_exec_ext in '' $ac_executable_extensions; do
-    ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-    { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-    # Check for GNU ac_path_EGREP and select it if it is found.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
   # Check for GNU $ac_path_EGREP
 case `"$ac_path_EGREP" --version 2>&1` in
 *GNU*)
   ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
 *)
   ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  $as_echo_n 0123456789 >"conftest.in"
   while :
   do
     cat "conftest.in" "conftest.in" >"conftest.tmp"
     mv "conftest.tmp" "conftest.in"
     cp "conftest.in" "conftest.nl"
-    echo 'EGREP' >> "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
     "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
     diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    ac_count=`expr $ac_count + 1`
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
     if test $ac_count -gt ${ac_path_EGREP_max-0}; then
       # Best one so far, save it but keep looking for a better one
       ac_cv_path_EGREP="$ac_path_EGREP"
@@ -3814,46 +4033,31 @@
   rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
 esac
 
-
-    $ac_path_EGREP_found && break 3
+      $ac_path_EGREP_found && break 3
+    done
   done
-done
-
-done
+  done
 IFS=$as_save_IFS
-
-
-fi
-
-EGREP="$ac_cv_path_EGREP"
-if test -z "$EGREP"; then
-  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
-echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
 else
   ac_cv_path_EGREP=$EGREP
 fi
 
-
    fi
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
-echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
  EGREP="$ac_cv_path_EGREP"
 
 
-{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <stdlib.h>
 #include <stdarg.h>
@@ -3868,47 +4072,23 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
   ac_cv_header_stdc=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_header_stdc=no
+  ac_cv_header_stdc=no
 fi
-
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <string.h>
 
 _ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then
-  :
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
 else
   ac_cv_header_stdc=no
 fi
@@ -3918,18 +4098,14 @@
 
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <stdlib.h>
 
 _ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then
-  :
+  $EGREP "free" >/dev/null 2>&1; then :
+
 else
   ac_cv_header_stdc=no
 fi
@@ -3939,14 +4115,10 @@
 
 if test $ac_cv_header_stdc = yes; then
   # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then
+  if test "$cross_compiling" = yes; then :
   :
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <ctype.h>
 #include <stdlib.h>
@@ -3973,113 +4145,35 @@
   return 0;
 }
 _ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
+if ac_fn_c_try_run "$LINENO"; then :
+
 else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-ac_cv_header_stdc=no
+  ac_cv_header_stdc=no
 fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
-
 fi
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
 if test $ac_cv_header_stdc = yes; then
 
-cat >>confdefs.h <<\_ACEOF
-#define STDC_HEADERS 1
-_ACEOF
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
 
 fi
 
 # On IRIX 5.3, sys/types and inttypes.h are conflicting.
-
-
-
-
-
-
-
-
-
 for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
 		  inttypes.h stdint.h unistd.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-{ echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  eval "$as_ac_Header=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	eval "$as_ac_Header=no"
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
   cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
 _ACEOF
 
 fi
@@ -4087,262 +4181,491 @@
 done
 
 
+for ac_header in sys/bitypes.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "sys/bitypes.h" "ac_cv_header_sys_bitypes_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_bitypes_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_BITYPES_H 1
+_ACEOF
+
+fi
+
+done
 
 
+ac_fn_c_check_type "$LINENO" "int8_t" "ac_cv_type_int8_t" "$ac_includes_default
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
+"
+if test "x$ac_cv_type_int8_t" = xyes; then :
+
+else
+
+$as_echo "#define int8_t signed char" >>confdefs.h
+
+fi
+
+ac_fn_c_check_type "$LINENO" "u_int8_t" "ac_cv_type_u_int8_t" "$ac_includes_default
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
+"
+if test "x$ac_cv_type_u_int8_t" = xyes; then :
+
+else
+
+$as_echo "#define u_int8_t unsigned char" >>confdefs.h
+
+fi
+
+ac_fn_c_check_type "$LINENO" "int16_t" "ac_cv_type_int16_t" "$ac_includes_default"
+if test "x$ac_cv_type_int16_t" = xyes; then :
+
+else
+
+$as_echo "#define int16_t short" >>confdefs.h
+
+	$ac_includes_default
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
+fi
+
+ac_fn_c_check_type "$LINENO" "u_int16_t" "ac_cv_type_u_int16_t" "$ac_includes_default
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
+"
+if test "x$ac_cv_type_u_int16_t" = xyes; then :
+
+else
+
+$as_echo "#define u_int16_t unsigned short" >>confdefs.h
+
+fi
+
+ac_fn_c_check_type "$LINENO" "int32_t" "ac_cv_type_int32_t" "$ac_includes_default
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
+"
+if test "x$ac_cv_type_int32_t" = xyes; then :
+
+else
+
+$as_echo "#define int32_t int" >>confdefs.h
+
+fi
+
+ac_fn_c_check_type "$LINENO" "u_int32_t" "ac_cv_type_u_int32_t" "$ac_includes_default
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
+"
+if test "x$ac_cv_type_u_int32_t" = xyes; then :
+
+else
+
+$as_echo "#define u_int32_t unsigned int" >>confdefs.h
+
+fi
+
+ac_fn_c_check_type "$LINENO" "int64_t" "ac_cv_type_int64_t" "$ac_includes_default
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
+"
+if test "x$ac_cv_type_int64_t" = xyes; then :
+
+else
+
+$as_echo "#define int64_t long long" >>confdefs.h
+
+fi
+
+ac_fn_c_check_type "$LINENO" "u_int64_t" "ac_cv_type_u_int64_t" "$ac_includes_default
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
+"
+if test "x$ac_cv_type_u_int64_t" = xyes; then :
+
+else
+
+$as_echo "#define u_int64_t unsigned long long" >>confdefs.h
+
+fi
+
+
+#
+# Try to arrange for large file support.
+#
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+  enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+	 # IRIX 6.2 and later do not support large files by default,
+	 # so use the C compiler's -n32 option if that helps.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 CC="$CC -n32"
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 break
+       done
+       CC=$ac_save_CC
+       rm -f conftest.$ac_ext
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_file_offset_bits=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  if test $ac_cv_sys_file_offset_bits = unknown; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_large_files=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  fi
+
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5
+$as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_source+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h> /* for off_t */
+     #include <stdio.h>
+int
+main ()
+{
+int (*fp) (FILE *, off_t, int) = fseeko;
+     return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_sys_largefile_source=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _LARGEFILE_SOURCE 1
+#include <sys/types.h> /* for off_t */
+     #include <stdio.h>
+int
+main ()
+{
+int (*fp) (FILE *, off_t, int) = fseeko;
+     return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_sys_largefile_source=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  ac_cv_sys_largefile_source=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5
+$as_echo "$ac_cv_sys_largefile_source" >&6; }
+case $ac_cv_sys_largefile_source in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source
+_ACEOF
+;;
+esac
+rm -rf conftest*
+
+# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
+# in glibc 2.1.3, but that breaks too many other things.
+# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
+if test $ac_cv_sys_largefile_source != unknown; then
+
+$as_echo "#define HAVE_FSEEKO 1" >>confdefs.h
+
+fi
 
 
 for ac_header in sys/ioccom.h sys/sockio.h limits.h paths.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  { echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_header_compiler=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-
-rm -f conftest.err conftest.$ac_ext
-{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-
-    ;;
-esac
-{ echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
   cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
 _ACEOF
 
 fi
 
 done
 
+for ac_header in linux/types.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "linux/types.h" "ac_cv_header_linux_types_h" "$ac_includes_default"
+if test "x$ac_cv_header_linux_types_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LINUX_TYPES_H 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in linux/if_packet.h netpacket/packet.h netpacket/if_packet.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
 
 for ac_header in net/pfvar.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-{ echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <sys/types.h>
+do :
+  ac_fn_c_check_header_compile "$LINENO" "net/pfvar.h" "ac_cv_header_net_pfvar_h" "#include <sys/types.h>
 #include <sys/socket.h>
 #include <net/if.h>
-
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  eval "$as_ac_Header=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	eval "$as_ac_Header=no"
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
+"
+if test "x$ac_cv_header_net_pfvar_h" = xyes; then :
   cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+#define HAVE_NET_PFVAR_H 1
 _ACEOF
 
 fi
 
 done
 
-
-for ac_header in netinet/if_ether.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-{ echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+if test "$ac_cv_header_net_pfvar_h" = yes; then
+	#
+	# Check for various PF actions.
+	#
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether net/pfvar.h defines PF_NAT through PF_NORDR" >&5
+$as_echo_n "checking whether net/pfvar.h defines PF_NAT through PF_NORDR... " >&6; }
+	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <sys/types.h>
-#include <sys/socket.h>
-
-#include <$ac_header>
+	    #include <sys/socket.h>
+	    #include <net/if.h>
+	    #include <net/pfvar.h>
+int
+main ()
+{
+return PF_NAT+PF_NONAT+PF_BINAT+PF_NOBINAT+PF_RDR+PF_NORDR;
+  ;
+  return 0;
+}
 _ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  eval "$as_ac_Header=yes"
+if ac_fn_c_try_compile "$LINENO"; then :
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_PF_NAT_THROUGH_PF_NORDR 1" >>confdefs.h
+
+
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	eval "$as_ac_Header=no"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
-
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
+for ac_header in netinet/if_ether.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "netinet/if_ether.h" "ac_cv_header_netinet_if_ether_h" "#include <sys/types.h>
+#include <sys/socket.h>
+"
+if test "x$ac_cv_header_netinet_if_ether_h" = xyes; then :
   cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+#define HAVE_NETINET_IF_ETHER_H 1
 _ACEOF
 
 fi
@@ -4357,66 +4680,21 @@
 	# treat the previous failure as a cached value and
 	# suppress the next test.
 	#
-	{ echo "$as_me:$LINENO: Rechecking with some additional includes" >&5
-echo "$as_me: Rechecking with some additional includes" >&6;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: Rechecking with some additional includes" >&5
+$as_echo "$as_me: Rechecking with some additional includes" >&6;}
 	unset ac_cv_header_netinet_if_ether_h
-
-for ac_header in netinet/if_ether.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-{ echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <sys/types.h>
+	for ac_header in netinet/if_ether.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "netinet/if_ether.h" "ac_cv_header_netinet_if_ether_h" "#include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 struct mbuf;
 struct rtentry;
 #include <net/if.h>
-
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  eval "$as_ac_Header=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	eval "$as_ac_Header=no"
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
+"
+if test "x$ac_cv_header_netinet_if_ether_h" = xyes; then :
   cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+#define HAVE_NETINET_IF_ETHER_H 1
 _ACEOF
 
 fi
@@ -4426,16 +4704,12 @@
 fi
 
 if test "$GCC" = yes ; then
-	    { echo "$as_me:$LINENO: checking for ANSI ioctl definitions" >&5
-echo $ECHO_N "checking for ANSI ioctl definitions... $ECHO_C" >&6; }
-	    if test "${ac_cv_lbl_gcc_fixincludes+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+	    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI ioctl definitions" >&5
+$as_echo_n "checking for ANSI ioctl definitions... " >&6; }
+	    if ${ac_cv_lbl_gcc_fixincludes+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 /*
 		     * This generates a "duplicate case value" when fixincludes
@@ -4458,135 +4732,30 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
   ac_cv_lbl_gcc_fixincludes=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lbl_gcc_fixincludes=no
+  ac_cv_lbl_gcc_fixincludes=no
 fi
-
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
-	    { echo "$as_me:$LINENO: result: $ac_cv_lbl_gcc_fixincludes" >&5
-echo "${ECHO_T}$ac_cv_lbl_gcc_fixincludes" >&6; }
+	    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_gcc_fixincludes" >&5
+$as_echo "$ac_cv_lbl_gcc_fixincludes" >&6; }
 	    if test $ac_cv_lbl_gcc_fixincludes = no ; then
 		    # Don't cache failure
 		    unset ac_cv_lbl_gcc_fixincludes
-		    { { echo "$as_me:$LINENO: error: see the INSTALL for more info" >&5
-echo "$as_me: error: see the INSTALL for more info" >&2;}
-   { (exit 1); exit 1; }; }
+		    as_fn_error $? "see the INSTALL for more info" "$LINENO" 5
 	    fi
     fi
 
-
-
 for ac_func in strerror strlcpy
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-{ echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
-if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_$ac_func || defined __stub___$ac_func
-choke me
-#endif
-
-int
-main ()
-{
-return $ac_func ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	eval "$as_ac_var=no"
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-ac_res=`eval echo '${'$as_ac_var'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-if test `eval echo '${'$as_ac_var'}'` = yes; then
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
   cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
 _ACEOF
 
 fi
@@ -4594,96 +4763,13 @@
 
 
 needsnprintf=no
-
-
 for ac_func in vsnprintf snprintf
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-{ echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
-if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_$ac_func || defined __stub___$ac_func
-choke me
-#endif
-
-int
-main ()
-{
-return $ac_func ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	eval "$as_ac_var=no"
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-ac_res=`eval echo '${'$as_ac_var'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-if test `eval echo '${'$as_ac_var'}'` = yes; then
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
   cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
 _ACEOF
 
 else
@@ -4709,17 +4795,13 @@
     # libraries (i.e. libc):
     # Some OSes (eg. Solaris) place it in libnsl
     # Some strange OSes (SINIX) have it in libsocket:
-    { echo "$as_me:$LINENO: checking for library containing gethostbyname" >&5
-echo $ECHO_N "checking for library containing gethostbyname... $ECHO_C" >&6; }
-if test "${ac_cv_search_gethostbyname+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5
+$as_echo_n "checking for library containing gethostbyname... " >&6; }
+if ${ac_cv_search_gethostbyname+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   ac_func_search_save_LIBS=$LIBS
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 /* Override any GCC internal prototype to avoid an error.
@@ -4744,50 +4826,27 @@
     ac_res=-l$ac_lib
     LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
   fi
-  rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+  if ac_fn_c_try_link "$LINENO"; then :
   ac_cv_search_gethostbyname=$ac_res
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
 fi
-
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext
-  if test "${ac_cv_search_gethostbyname+set}" = set; then
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_gethostbyname+:} false; then :
   break
 fi
 done
-if test "${ac_cv_search_gethostbyname+set}" = set; then
-  :
+if ${ac_cv_search_gethostbyname+:} false; then :
+
 else
   ac_cv_search_gethostbyname=no
 fi
 rm conftest.$ac_ext
 LIBS=$ac_func_search_save_LIBS
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_search_gethostbyname" >&5
-echo "${ECHO_T}$ac_cv_search_gethostbyname" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5
+$as_echo "$ac_cv_search_gethostbyname" >&6; }
 ac_res=$ac_cv_search_gethostbyname
-if test "$ac_res" != no; then
+if test "$ac_res" != no; then :
   test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
 
 fi
@@ -4796,18 +4855,14 @@
     # AC_SEARCH_LIBS isn't up to the task of handling dependencies like this.
     if test "$ac_cv_search_gethostbyname" = "no"
     then
-	{ echo "$as_me:$LINENO: checking for gethostbyname in -lsocket" >&5
-echo $ECHO_N "checking for gethostbyname in -lsocket... $ECHO_C" >&6; }
-if test "${ac_cv_lib_socket_gethostbyname+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lsocket" >&5
+$as_echo_n "checking for gethostbyname in -lsocket... " >&6; }
+if ${ac_cv_lib_socket_gethostbyname+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lsocket -lnsl $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 /* Override any GCC internal prototype to avoid an error.
@@ -4825,54 +4880,29 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+if ac_fn_c_try_link "$LINENO"; then :
   ac_cv_lib_socket_gethostbyname=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lib_socket_gethostbyname=no
+  ac_cv_lib_socket_gethostbyname=no
 fi
-
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_lib_socket_gethostbyname" >&5
-echo "${ECHO_T}$ac_cv_lib_socket_gethostbyname" >&6; }
-if test $ac_cv_lib_socket_gethostbyname = yes; then
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_gethostbyname" >&5
+$as_echo "$ac_cv_lib_socket_gethostbyname" >&6; }
+if test "x$ac_cv_lib_socket_gethostbyname" = xyes; then :
   LIBS="-lsocket -lnsl $LIBS"
 fi
 
     fi
-    { echo "$as_me:$LINENO: checking for library containing socket" >&5
-echo $ECHO_N "checking for library containing socket... $ECHO_C" >&6; }
-if test "${ac_cv_search_socket+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5
+$as_echo_n "checking for library containing socket... " >&6; }
+if ${ac_cv_search_socket+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   ac_func_search_save_LIBS=$LIBS
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 /* Override any GCC internal prototype to avoid an error.
@@ -4897,65 +4927,38 @@
     ac_res=-l$ac_lib
     LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
   fi
-  rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+  if ac_fn_c_try_link "$LINENO"; then :
   ac_cv_search_socket=$ac_res
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
 fi
-
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext
-  if test "${ac_cv_search_socket+set}" = set; then
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_socket+:} false; then :
   break
 fi
 done
-if test "${ac_cv_search_socket+set}" = set; then
-  :
+if ${ac_cv_search_socket+:} false; then :
+
 else
   ac_cv_search_socket=no
 fi
 rm conftest.$ac_ext
 LIBS=$ac_func_search_save_LIBS
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_search_socket" >&5
-echo "${ECHO_T}$ac_cv_search_socket" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5
+$as_echo "$ac_cv_search_socket" >&6; }
 ac_res=$ac_cv_search_socket
-if test "$ac_res" != no; then
+if test "$ac_res" != no; then :
   test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
 
 else
-  { echo "$as_me:$LINENO: checking for socket in -lsocket" >&5
-echo $ECHO_N "checking for socket in -lsocket... $ECHO_C" >&6; }
-if test "${ac_cv_lib_socket_socket+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5
+$as_echo_n "checking for socket in -lsocket... " >&6; }
+if ${ac_cv_lib_socket_socket+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lsocket -lnsl $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 /* Override any GCC internal prototype to avoid an error.
@@ -4973,56 +4976,31 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+if ac_fn_c_try_link "$LINENO"; then :
   ac_cv_lib_socket_socket=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lib_socket_socket=no
+  ac_cv_lib_socket_socket=no
 fi
-
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_lib_socket_socket" >&5
-echo "${ECHO_T}$ac_cv_lib_socket_socket" >&6; }
-if test $ac_cv_lib_socket_socket = yes; then
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5
+$as_echo "$ac_cv_lib_socket_socket" >&6; }
+if test "x$ac_cv_lib_socket_socket" = xyes; then :
   LIBS="-lsocket -lnsl $LIBS"
 fi
 
 fi
 
     # DLPI needs putmsg under HPUX so test for -lstr while we're at it
-    { echo "$as_me:$LINENO: checking for library containing putmsg" >&5
-echo $ECHO_N "checking for library containing putmsg... $ECHO_C" >&6; }
-if test "${ac_cv_search_putmsg+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing putmsg" >&5
+$as_echo_n "checking for library containing putmsg... " >&6; }
+if ${ac_cv_search_putmsg+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   ac_func_search_save_LIBS=$LIBS
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 /* Override any GCC internal prototype to avoid an error.
@@ -5047,50 +5025,27 @@
     ac_res=-l$ac_lib
     LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
   fi
-  rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+  if ac_fn_c_try_link "$LINENO"; then :
   ac_cv_search_putmsg=$ac_res
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
 fi
-
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext
-  if test "${ac_cv_search_putmsg+set}" = set; then
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_putmsg+:} false; then :
   break
 fi
 done
-if test "${ac_cv_search_putmsg+set}" = set; then
-  :
+if ${ac_cv_search_putmsg+:} false; then :
+
 else
   ac_cv_search_putmsg=no
 fi
 rm conftest.$ac_ext
 LIBS=$ac_func_search_save_LIBS
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_search_putmsg" >&5
-echo "${ECHO_T}$ac_cv_search_putmsg" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_putmsg" >&5
+$as_echo "$ac_cv_search_putmsg" >&6; }
 ac_res=$ac_cv_search_putmsg
-if test "$ac_res" != no; then
+if test "$ac_res" != no; then :
   test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
 
 fi
@@ -5108,95 +5063,12 @@
 #
 # Before you is a C compiler.
 #
-
 for ac_func in ether_hostton
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-{ echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
-if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_$ac_func || defined __stub___$ac_func
-choke me
-#endif
-
-int
-main ()
-{
-return $ac_func ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	eval "$as_ac_var=no"
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-ac_res=`eval echo '${'$as_ac_var'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-if test `eval echo '${'$as_ac_var'}'` = yes; then
+do :
+  ac_fn_c_check_func "$LINENO" "ether_hostton" "ac_cv_func_ether_hostton"
+if test "x$ac_cv_func_ether_hostton" = xyes; then :
   cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+#define HAVE_ETHER_HOSTTON 1
 _ACEOF
 
 fi
@@ -5210,18 +5082,7 @@
 		#
 		# Yes.  Does it declare ether_hostton()?
 		#
-		{ echo "$as_me:$LINENO: checking whether ether_hostton is declared" >&5
-echo $ECHO_N "checking whether ether_hostton is declared... $ECHO_C" >&6; }
-if test "${ac_cv_have_decl_ether_hostton+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
+		ac_fn_c_check_decl "$LINENO" "ether_hostton" "ac_cv_have_decl_ether_hostton" "
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
@@ -5231,53 +5092,11 @@
 #include <net/if.h>
 #include <netinet/if_ether.h>
 
-
-int
-main ()
-{
-#ifndef ether_hostton
-  (void) ether_hostton;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_have_decl_ether_hostton=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_have_decl_ether_hostton=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_ether_hostton" >&5
-echo "${ECHO_T}$ac_cv_have_decl_ether_hostton" >&6; }
-if test $ac_cv_have_decl_ether_hostton = yes; then
+"
+if test "x$ac_cv_have_decl_ether_hostton" = xyes; then :
 
 
-cat >>confdefs.h <<\_ACEOF
-#define NETINET_IF_ETHER_H_DECLARES_ETHER_HOSTTON
-_ACEOF
+$as_echo "#define NETINET_IF_ETHER_H_DECLARES_ETHER_HOSTTON /**/" >>confdefs.h
 
 
 fi
@@ -5290,140 +5109,12 @@
 		#
 		# No, how about <netinet/ether.h>, as on Linux?
 		#
-
-for ac_header in netinet/ether.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  { echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_header_compiler=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-
-rm -f conftest.err conftest.$ac_ext
-{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-
-    ;;
-esac
-{ echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
+		for ac_header in netinet/ether.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "netinet/ether.h" "ac_cv_header_netinet_ether_h" "$ac_includes_default"
+if test "x$ac_cv_header_netinet_ether_h" = xyes; then :
   cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+#define HAVE_NETINET_ETHER_H 1
 _ACEOF
 
 fi
@@ -5438,67 +5129,14 @@
 			# suppress the next test.
 			#
 			unset ac_cv_have_decl_ether_hostton
-			{ echo "$as_me:$LINENO: checking whether ether_hostton is declared" >&5
-echo $ECHO_N "checking whether ether_hostton is declared... $ECHO_C" >&6; }
-if test "${ac_cv_have_decl_ether_hostton+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
+			ac_fn_c_check_decl "$LINENO" "ether_hostton" "ac_cv_have_decl_ether_hostton" "
 #include <netinet/ether.h>
 
-
-int
-main ()
-{
-#ifndef ether_hostton
-  (void) ether_hostton;
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_have_decl_ether_hostton=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_have_decl_ether_hostton=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_ether_hostton" >&5
-echo "${ECHO_T}$ac_cv_have_decl_ether_hostton" >&6; }
-if test $ac_cv_have_decl_ether_hostton = yes; then
+"
+if test "x$ac_cv_have_decl_ether_hostton" = xyes; then :
 
 
-cat >>confdefs.h <<\_ACEOF
-#define NETINET_ETHER_H_DECLARES_ETHER_HOSTTON
-_ACEOF
+$as_echo "#define NETINET_ETHER_H_DECLARES_ETHER_HOSTTON /**/" >>confdefs.h
 
 
 fi
@@ -5513,18 +5151,7 @@
 		# No, we'll have to declare it ourselves.
 		# Do we have "struct ether_addr"?
 		#
-		{ echo "$as_me:$LINENO: checking for struct ether_addr" >&5
-echo $ECHO_N "checking for struct ether_addr... $ECHO_C" >&6; }
-if test "${ac_cv_type_struct_ether_addr+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
+		ac_fn_c_check_type "$LINENO" "struct ether_addr" "ac_cv_type_struct_ether_addr" "
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
@@ -5534,49 +5161,8 @@
 #include <net/if.h>
 #include <netinet/if_ether.h>
 
-
-typedef struct ether_addr ac__type_new_;
-int
-main ()
-{
-if ((ac__type_new_ *) 0)
-  return 0;
-if (sizeof (ac__type_new_))
-  return 0;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_type_struct_ether_addr=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_type_struct_ether_addr=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_type_struct_ether_addr" >&5
-echo "${ECHO_T}$ac_cv_type_struct_ether_addr" >&6; }
-if test $ac_cv_type_struct_ether_addr = yes; then
+"
+if test "x$ac_cv_type_struct_ether_addr" = xyes; then :
 
 cat >>confdefs.h <<_ACEOF
 #define HAVE_STRUCT_ETHER_ADDR 1
@@ -5586,23 +5172,19 @@
 fi
 
 
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_DECL_ETHER_HOSTTON 0
-_ACEOF
+$as_echo "#define HAVE_DECL_ETHER_HOSTTON 0" >>confdefs.h
 
 	else
 
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_DECL_ETHER_HOSTTON 1
-_ACEOF
+$as_echo "#define HAVE_DECL_ETHER_HOSTTON 1" >>confdefs.h
 
 	fi
 fi
 
-{ echo "$as_me:$LINENO: checking if --disable-protochain option is specified" >&5
-echo $ECHO_N "checking if --disable-protochain option is specified... $ECHO_C" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if --disable-protochain option is specified" >&5
+$as_echo_n "checking if --disable-protochain option is specified... " >&6; }
 # Check whether --enable-protochain was given.
-if test "${enable_protochain+set}" = set; then
+if test "${enable_protochain+set}" = set; then :
   enableval=$enable_protochain;
 fi
 
@@ -5614,38 +5196,52 @@
 
 if test "$enable_protochain" = "disabled"; then
 
-cat >>confdefs.h <<\_ACEOF
-#define NO_PROTOCHAIN 1
-_ACEOF
+$as_echo "#define NO_PROTOCHAIN 1" >>confdefs.h
 
 fi
-{ echo "$as_me:$LINENO: result: ${enable_protochain}" >&5
-echo "${ECHO_T}${enable_protochain}" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${enable_protochain}" >&5
+$as_echo "${enable_protochain}" >&6; }
+
+#
+# SITA support is mutually exclusive with native capture support;
+# "--with-sita" selects SITA support.
+#
+
+# Check whether --with-sita was given.
+if test "${with_sita+set}" = set; then :
+  withval=$with_sita;
+	if test ! "x$withval" = "xno" ; then
+
+$as_echo "#define SITA 1" >>confdefs.h
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: Enabling SITA ACN support" >&5
+$as_echo "$as_me: Enabling SITA ACN support" >&6;}
+		V_PCAP=sita
+		V_FINDALLDEVS=sita
+	fi
+
+else
 
 if test -z "$with_pcap" && test "$cross_compiling" = yes; then
-	{ { echo "$as_me:$LINENO: error: pcap type not determined when cross-compiling; use --with-pcap=..." >&5
-echo "$as_me: error: pcap type not determined when cross-compiling; use --with-pcap=..." >&2;}
-   { (exit 1); exit 1; }; }
+	as_fn_error $? "pcap type not determined when cross-compiling; use --with-pcap=..." "$LINENO" 5
 fi
 
 # Check whether --with-pcap was given.
-if test "${with_pcap+set}" = set; then
+if test "${with_pcap+set}" = set; then :
   withval=$with_pcap;
 fi
 
-{ echo "$as_me:$LINENO: checking packet capture type" >&5
-echo $ECHO_N "checking packet capture type... $ECHO_C" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking packet capture type" >&5
+$as_echo_n "checking packet capture type... " >&6; }
 if test ! -z "$with_pcap" ; then
 	V_PCAP="$withval"
-elif test -r /dev/bpf ; then
+elif test -r /dev/bpf -o -h /dev/bpf ; then
 	#
 	# Cloning BPF device.
 	#
 	V_PCAP=bpf
 
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_CLONING_BPF 1
-_ACEOF
+$as_echo "#define HAVE_CLONING_BPF 1" >>confdefs.h
 
 elif test -r /dev/bpf0 ; then
 	V_PCAP=bpf
@@ -5668,10 +5264,10 @@
 	# We check for odmi.h instead.
 	#
 	V_PCAP=bpf
-elif test -r /usr/include/sys/dlpi.h ; then
-	V_PCAP=dlpi
 elif test -c /dev/bpf0 ; then		# check again in case not readable
 	V_PCAP=bpf
+elif test -r /usr/include/sys/dlpi.h ; then
+	V_PCAP=dlpi
 elif test -c /dev/enet ; then		# check again in case not readable
 	V_PCAP=enet
 elif test -c /dev/nit ; then		# check again in case not readable
@@ -5679,8 +5275,608 @@
 else
 	V_PCAP=null
 fi
-{ echo "$as_me:$LINENO: result: $V_PCAP" >&5
-echo "${ECHO_T}$V_PCAP" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $V_PCAP" >&5
+$as_echo "$V_PCAP" >&6; }
+
+#
+# Do capture-mechanism-dependent tests.
+#
+case "$V_PCAP" in
+dlpi)
+	#
+	# Needed for common functions used by pcap-[dlpi,libdlpi].c
+	#
+ 	SSRC="dlpisubs.c"
+
+	#
+	# Checks for some header files.
+	#
+	for ac_header in sys/bufmod.h sys/dlpi_ext.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+	#
+	# Checks to see if Solaris has the public libdlpi(3LIB) library.
+	# Note: The existence of /usr/include/libdlpi.h does not mean it is the
+	# public libdlpi(3LIB) version. Before libdlpi was made public, a
+	# private version also existed, which did not have the same APIs.
+	# Due to a gcc bug, the default search path for 32-bit libraries does
+	# not include /lib, we add it explicitly here.
+	# [http://bugs.opensolaris.org/view_bug.do?bug_id=6619485].
+	# Also, due to the bug above applications that link to libpcap with
+	# libdlpi will have to add "-L/lib" option to "configure".
+	#
+	saved_ldflags=$LDFLAGS
+	LDFLAGS="$LIBS -L/lib"
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlpi_walk in -ldlpi" >&5
+$as_echo_n "checking for dlpi_walk in -ldlpi... " >&6; }
+if ${ac_cv_lib_dlpi_dlpi_walk+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldlpi  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlpi_walk ();
+int
+main ()
+{
+return dlpi_walk ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dlpi_dlpi_walk=yes
+else
+  ac_cv_lib_dlpi_dlpi_walk=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dlpi_dlpi_walk" >&5
+$as_echo "$ac_cv_lib_dlpi_dlpi_walk" >&6; }
+if test "x$ac_cv_lib_dlpi_dlpi_walk" = xyes; then :
+
+			LIBS="-ldlpi $LIBS"
+			V_PCAP=libdlpi
+
+$as_echo "#define HAVE_LIBDLPI 1" >>confdefs.h
+
+
+else
+  V_PCAP=dlpi
+fi
+
+	LDFLAGS=$saved_ldflags
+
+	#
+	# Checks whether <sys/dlpi.h> is usable, to catch weird SCO
+	# versions of DLPI.
+	#
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether <sys/dlpi.h> is usable" >&5
+$as_echo_n "checking whether <sys/dlpi.h> is usable... " >&6; }
+	if ${ac_cv_sys_dlpi_usable+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+			#include <sys/types.h>
+			#include <sys/time.h>
+			#include <sys/dlpi.h>
+
+int
+main ()
+{
+int i = DL_PROMISC_PHYS;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_dlpi_usable=yes
+else
+  ac_cv_sys_dlpi_usable=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_dlpi_usable" >&5
+$as_echo "$ac_cv_sys_dlpi_usable" >&6; }
+	if test $ac_cv_sys_dlpi_usable = no ; then
+		as_fn_error $? "<sys/dlpi.h> is not usable on this system; it probably has a non-standard DLPI" "$LINENO" 5
+	fi
+
+	#
+	# Check whether we have a /dev/dlpi device or have multiple devices.
+	#
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for /dev/dlpi device" >&5
+$as_echo_n "checking for /dev/dlpi device... " >&6; }
+	if test -c /dev/dlpi ; then
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_DEV_DLPI 1" >>confdefs.h
+
+	else
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		dir="/dev/dlpi"
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $dir directory" >&5
+$as_echo_n "checking for $dir directory... " >&6; }
+		if test -d $dir ; then
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define PCAP_DEV_PREFIX "$dir"
+_ACEOF
+
+		else
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		fi
+	fi
+
+	#
+	# This check is for Solaris with DLPI support for passive modes.
+	# See dlpi(7P) for more details.
+	#
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if dl_passive_req_t struct exists" >&5
+$as_echo_n "checking if dl_passive_req_t struct exists... " >&6; }
+       if ${ac_cv_lbl_has_dl_passive_req_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#       include <sys/types.h>
+#       include <sys/dlpi.h>
+int
+main ()
+{
+u_int i = sizeof(dl_passive_req_t)
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_lbl_has_dl_passive_req_t=yes
+else
+  ac_cv_lbl_has_dl_passive_req_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_has_dl_passive_req_t" >&5
+$as_echo "$ac_cv_lbl_has_dl_passive_req_t" >&6; }
+    if test $ac_cv_lbl_has_dl_passive_req_t = yes ; then
+
+$as_echo "#define HAVE_DLPI_PASSIVE 1" >>confdefs.h
+
+    fi
+	;;
+
+linux)
+	#
+	# Do we have the wireless extensions?
+	#
+	for ac_header in linux/wireless.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "linux/wireless.h" "ac_cv_header_linux_wireless_h" "
+#include <sys/socket.h>
+#include <linux/if.h>
+#include <linux/types.h>
+
+"
+if test "x$ac_cv_header_linux_wireless_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LINUX_WIRELESS_H 1
+_ACEOF
+
+fi
+
+done
+
+
+	#
+	# Do we have libnl?
+	#
+
+# Check whether --with-libnl was given.
+if test "${with_libnl+set}" = set; then :
+  withval=$with_libnl; with_libnl=$withval
+fi
+
+
+	if test x$with_libnl != xno ; then
+		have_any_nl="no"
+
+		#
+		# Try libnl 3.x first.
+		#
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_socket_alloc in -lnl-3" >&5
+$as_echo_n "checking for nl_socket_alloc in -lnl-3... " >&6; }
+if ${ac_cv_lib_nl_3_nl_socket_alloc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnl-3  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char nl_socket_alloc ();
+int
+main ()
+{
+return nl_socket_alloc ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_nl_3_nl_socket_alloc=yes
+else
+  ac_cv_lib_nl_3_nl_socket_alloc=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nl_3_nl_socket_alloc" >&5
+$as_echo "$ac_cv_lib_nl_3_nl_socket_alloc" >&6; }
+if test "x$ac_cv_lib_nl_3_nl_socket_alloc" = xyes; then :
+
+			#
+			# Yes, we have libnl 3.x.
+			#
+			LIBS="-lnl-genl-3 -lnl-3 $LIBS"
+
+$as_echo "#define HAVE_LIBNL 1" >>confdefs.h
+
+
+$as_echo "#define HAVE_LIBNL_3_x 1" >>confdefs.h
+
+
+$as_echo "#define HAVE_LIBNL_NLE 1" >>confdefs.h
+
+
+$as_echo "#define HAVE_LIBNL_SOCKETS 1" >>confdefs.h
+
+			V_INCLS="$V_INCLS -I/usr/include/libnl3"
+			have_any_nl="yes"
+
+fi
+
+
+		if test x$have_any_nl = xno ; then
+			#
+			# Try libnl 2.x
+			#
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_socket_alloc in -lnl" >&5
+$as_echo_n "checking for nl_socket_alloc in -lnl... " >&6; }
+if ${ac_cv_lib_nl_nl_socket_alloc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char nl_socket_alloc ();
+int
+main ()
+{
+return nl_socket_alloc ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_nl_nl_socket_alloc=yes
+else
+  ac_cv_lib_nl_nl_socket_alloc=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nl_nl_socket_alloc" >&5
+$as_echo "$ac_cv_lib_nl_nl_socket_alloc" >&6; }
+if test "x$ac_cv_lib_nl_nl_socket_alloc" = xyes; then :
+
+				#
+				# Yes, we have libnl 2.x.
+				#
+				LIBS="-lnl-genl -lnl $LIBS"
+
+$as_echo "#define HAVE_LIBNL 1" >>confdefs.h
+
+
+$as_echo "#define HAVE_LIBNL_2_x 1" >>confdefs.h
+
+
+$as_echo "#define HAVE_LIBNL_NLE 1" >>confdefs.h
+
+
+$as_echo "#define HAVE_LIBNL_SOCKETS 1" >>confdefs.h
+
+				have_any_nl="yes"
+
+fi
+
+		fi
+
+		if test x$have_any_nl = xno ; then
+			#
+			# No, we don't; do we have libnl 1.x?
+			#
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_handle_alloc in -lnl" >&5
+$as_echo_n "checking for nl_handle_alloc in -lnl... " >&6; }
+if ${ac_cv_lib_nl_nl_handle_alloc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char nl_handle_alloc ();
+int
+main ()
+{
+return nl_handle_alloc ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_nl_nl_handle_alloc=yes
+else
+  ac_cv_lib_nl_nl_handle_alloc=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nl_nl_handle_alloc" >&5
+$as_echo "$ac_cv_lib_nl_nl_handle_alloc" >&6; }
+if test "x$ac_cv_lib_nl_nl_handle_alloc" = xyes; then :
+
+				#
+				# Yes.
+				#
+				LIBS="-lnl $LIBS"
+
+$as_echo "#define HAVE_LIBNL 1" >>confdefs.h
+
+				have_any_nl="yes"
+
+fi
+
+		fi
+
+		if test x$have_any_nl = xno ; then
+			#
+			# No, we don't have libnl at all.
+			#
+			if test x$with_libnl = xyes ; then
+				as_fn_error $? "libnl support requested but libnl not found" "$LINENO" 5
+			fi
+		fi
+	fi
+
+	for ac_header in linux/ethtool.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "linux/ethtool.h" "ac_cv_header_linux_ethtool_h" "
+$ac_includes_default
+#include <linux/types.h>
+
+"
+if test "x$ac_cv_header_linux_ethtool_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LINUX_ETHTOOL_H 1
+_ACEOF
+
+fi
+
+done
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if if_packet.h has tpacket_stats defined" >&5
+$as_echo_n "checking if if_packet.h has tpacket_stats defined... " >&6; }
+   if ${ac_cv_lbl_tpacket_stats+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#  include <linux/if_packet.h>
+int
+main ()
+{
+struct tpacket_stats stats
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_lbl_tpacket_stats=yes
+else
+  ac_cv_lbl_tpacket_stats=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_tpacket_stats" >&5
+$as_echo "$ac_cv_lbl_tpacket_stats" >&6; }
+   if test $ac_cv_lbl_tpacket_stats = yes; then
+
+$as_echo "#define HAVE_TPACKET_STATS 1" >>confdefs.h
+
+   fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if tpacket_auxdata struct has tp_vlan_tci member" >&5
+$as_echo_n "checking if tpacket_auxdata struct has tp_vlan_tci member... " >&6; }
+    if ${ac_cv_lbl_linux_tpacket_auxdata_tp_vlan_tci+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#	include <sys/types.h>
+#	include <linux/if_packet.h>
+int
+main ()
+{
+u_int i = sizeof(((struct tpacket_auxdata *)0)->tp_vlan_tci)
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_lbl_linux_tpacket_auxdata_tp_vlan_tci=yes
+else
+  ac_cv_lbl_linux_tpacket_auxdata_tp_vlan_tci=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_linux_tpacket_auxdata_tp_vlan_tci" >&5
+$as_echo "$ac_cv_lbl_linux_tpacket_auxdata_tp_vlan_tci" >&6; }
+    if test $ac_cv_lbl_linux_tpacket_auxdata_tp_vlan_tci = yes ; then
+	    HAVE_LINUX_TPACKET_AUXDATA=tp_vlan_tci
+
+
+$as_echo "#define HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI 1" >>confdefs.h
+
+    fi
+	;;
+
+bpf)
+	#
+	# Check whether we have the *BSD-style ioctls.
+	#
+	for ac_header in net/if_media.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "net/if_media.h" "ac_cv_header_net_if_media_h" "$ac_includes_default"
+if test "x$ac_cv_header_net_if_media_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_NET_IF_MEDIA_H 1
+_ACEOF
+
+fi
+
+done
+
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the system supports zerocopy BPF" >&5
+$as_echo_n "checking whether the system supports zerocopy BPF... " >&6; }
+	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/socket.h>
+	    #include <sys/ioctl.h>
+	    #include <net/if.h>
+	    #include <net/bpf.h>
+int
+main ()
+{
+return (BIOCROTZBUF + BPF_BUFMODE_ZBUF);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_ZEROCOPY_BPF 1" >>confdefs.h
+
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+	    #
+	    # Check whether we have struct BPF_TIMEVAL.
+	    #
+	    ac_fn_c_check_type "$LINENO" "struct BPF_TIMEVAL" "ac_cv_type_struct_BPF_TIMEVAL" "
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#ifdef HAVE_SYS_IOCCOM_H
+#include <sys/ioccom.h>
+#endif
+#include <net/bpf.h>
+
+"
+if test "x$ac_cv_type_struct_BPF_TIMEVAL" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_BPF_TIMEVAL 1
+_ACEOF
+
+
+fi
+
+	;;
+
+dag)
+	V_DEFS="$V_DEFS -DDAG_ONLY"
+	;;
+
+septel)
+	V_DEFS="$V_DEFS -DSEPTEL_ONLY"
+	;;
+
+snf)
+	V_DEFS="$V_DEFS -DSNF_ONLY"
+	;;
+
+null)
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine packet capture interface" >&5
+$as_echo "$as_me: WARNING: cannot determine packet capture interface" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: (see the INSTALL doc for more info)" >&5
+$as_echo "$as_me: WARNING: (see the INSTALL doc for more info)" >&2;}
+	;;
+esac
 
 if test "$V_PCAP" = null
 then
@@ -5690,219 +5886,15 @@
 	#
 	V_FINDALLDEVS=null
 else
-	{ echo "$as_me:$LINENO: checking for getifaddrs" >&5
-echo $ECHO_N "checking for getifaddrs... $ECHO_C" >&6; }
-if test "${ac_cv_func_getifaddrs+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define getifaddrs to an innocuous variant, in case <limits.h> declares getifaddrs.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define getifaddrs innocuous_getifaddrs
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char getifaddrs (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef getifaddrs
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char getifaddrs ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_getifaddrs || defined __stub___getifaddrs
-choke me
-#endif
-
-int
-main ()
-{
-return getifaddrs ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
-  ac_cv_func_getifaddrs=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_func_getifaddrs=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_func_getifaddrs" >&5
-echo "${ECHO_T}$ac_cv_func_getifaddrs" >&6; }
-if test $ac_cv_func_getifaddrs = yes; then
+	ac_fn_c_check_func "$LINENO" "getifaddrs" "ac_cv_func_getifaddrs"
+if test "x$ac_cv_func_getifaddrs" = xyes; then :
 
 		#
 		# We have "getifaddrs()"; make sure we have <ifaddrs.h>
 		# as well, just in case some platform is really weird.
 		#
-		if test "${ac_cv_header_ifaddrs_h+set}" = set; then
-  { echo "$as_me:$LINENO: checking for ifaddrs.h" >&5
-echo $ECHO_N "checking for ifaddrs.h... $ECHO_C" >&6; }
-if test "${ac_cv_header_ifaddrs_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_header_ifaddrs_h" >&5
-echo "${ECHO_T}$ac_cv_header_ifaddrs_h" >&6; }
-else
-  # Is the header compilable?
-{ echo "$as_me:$LINENO: checking ifaddrs.h usability" >&5
-echo $ECHO_N "checking ifaddrs.h usability... $ECHO_C" >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <ifaddrs.h>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_header_compiler=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ echo "$as_me:$LINENO: checking ifaddrs.h presence" >&5
-echo $ECHO_N "checking ifaddrs.h presence... $ECHO_C" >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ifaddrs.h>
-_ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-
-rm -f conftest.err conftest.$ac_ext
-{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: ifaddrs.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: ifaddrs.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: ifaddrs.h: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: ifaddrs.h: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: ifaddrs.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: ifaddrs.h: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: ifaddrs.h:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: ifaddrs.h:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: ifaddrs.h: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: ifaddrs.h: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: ifaddrs.h:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: ifaddrs.h:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: ifaddrs.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: ifaddrs.h: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: ifaddrs.h: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: ifaddrs.h: in the future, the compiler will take precedence" >&2;}
-
-    ;;
-esac
-{ echo "$as_me:$LINENO: checking for ifaddrs.h" >&5
-echo $ECHO_N "checking for ifaddrs.h... $ECHO_C" >&6; }
-if test "${ac_cv_header_ifaddrs_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_header_ifaddrs_h=$ac_header_preproc
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_header_ifaddrs_h" >&5
-echo "${ECHO_T}$ac_cv_header_ifaddrs_h" >&6; }
-
-fi
-if test $ac_cv_header_ifaddrs_h = yes; then
+		ac_fn_c_check_header_mongrel "$LINENO" "ifaddrs.h" "ac_cv_header_ifaddrs_h" "$ac_includes_default"
+if test "x$ac_cv_header_ifaddrs_h" = xyes; then :
 
 		    #
 		    # We have the header, so we use "getifaddrs()" to
@@ -5921,9 +5913,7 @@
 		    # but without "ifaddrs.h", if there is something
 		    # we can do on those systems.
 		    #
-		    { { echo "$as_me:$LINENO: error: Your system has getifaddrs() but doesn't have a usable <ifaddrs.h>." >&5
-echo "$as_me: error: Your system has getifaddrs() but doesn't have a usable <ifaddrs.h>." >&2;}
-   { (exit 1); exit 1; }; }
+		    as_fn_error $? "Your system has getifaddrs() but doesn't have a usable <ifaddrs.h>." "$LINENO" 5
 
 fi
 
@@ -5940,23 +5930,19 @@
 		#
 		case "$V_PCAP" in
 
-		dlpi)
+		dlpi|libdlpi)
 			#
 			# This might be Solaris 8 or later, with
 			# SIOCGLIFCONF, or it might be some other OS
 			# or some older version of Solaris, with
 			# just SIOCGIFCONF.
 			#
-			{ echo "$as_me:$LINENO: checking whether we have SIOCGLIFCONF" >&5
-echo $ECHO_N "checking whether we have SIOCGLIFCONF... $ECHO_C" >&6; }
-			if test "${ac_cv_lbl_have_siocglifconf+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have SIOCGLIFCONF" >&5
+$as_echo_n "checking whether we have SIOCGLIFCONF... " >&6; }
+			if ${ac_cv_lbl_have_siocglifconf+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <sys/param.h>
 				#include <sys/file.h>
@@ -5971,36 +5957,16 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
   ac_cv_lbl_have_siocglifconf=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lbl_have_siocglifconf=no
+  ac_cv_lbl_have_siocglifconf=no
 fi
-
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
-			{ echo "$as_me:$LINENO: result: $ac_cv_lbl_have_siocglifconf" >&5
-echo "${ECHO_T}$ac_cv_lbl_have_siocglifconf" >&6; }
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_have_siocglifconf" >&5
+$as_echo "$ac_cv_lbl_have_siocglifconf" >&6; }
 			if test $ac_cv_lbl_have_siocglifconf = yes ; then
 				V_FINDALLDEVS=glifc
 			else
@@ -6022,361 +5988,101 @@
 
 fi
 
-{ echo "$as_me:$LINENO: checking if --enable-ipv6 option is specified" >&5
-echo $ECHO_N "checking if --enable-ipv6 option is specified... $ECHO_C" >&6; }
-# Check whether --enable-ipv6 was given.
-if test "${enable_ipv6+set}" = set; then
-  enableval=$enable_ipv6;
 fi
 
-if test "$enable_ipv6" = "yes"; then
 
-cat >>confdefs.h <<\_ACEOF
-#define INET6 1
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t" >&5
+$as_echo_n "checking for socklen_t... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+	#include <sys/types.h>
+	#include <sys/socket.h>
+
+int
+main ()
+{
+ socklen_t x;
+  ;
+  return 0;
+}
 _ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  have_socklen_t=yes
+else
+  have_socklen_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+if test "x$have_socklen_t" = "xyes"; then
+
+$as_echo "#define HAVE_SOCKLEN_T 1" >>confdefs.h
 
 fi
-{ echo "$as_me:$LINENO: result: ${enable_ipv6-no}" >&5
-echo "${ECHO_T}${enable_ipv6-no}" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_socklen_t" >&5
+$as_echo "$have_socklen_t" >&6; }
 
-{ echo "$as_me:$LINENO: checking whether to build optimizer debugging code" >&5
-echo $ECHO_N "checking whether to build optimizer debugging code... $ECHO_C" >&6; }
+# Check whether --enable-ipv6 was given.
+if test "${enable_ipv6+set}" = set; then :
+  enableval=$enable_ipv6;
+else
+  enable_ipv6=ifavailable
+fi
+
+if test "$enable_ipv6" != "no"; then
+	ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo"
+if test "x$ac_cv_func_getaddrinfo" = xyes; then :
+
+
+$as_echo "#define INET6 1" >>confdefs.h
+
+
+else
+
+		if test "$enable_ipv6" != "ifavailable"; then
+			{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "--enable-ipv6 was given, but getaddrinfo isn't available
+See \`config.log' for more details" "$LINENO" 5; }
+		fi
+
+fi
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build optimizer debugging code" >&5
+$as_echo_n "checking whether to build optimizer debugging code... " >&6; }
 # Check whether --enable-optimizer-dbg was given.
-if test "${enable_optimizer_dbg+set}" = set; then
+if test "${enable_optimizer_dbg+set}" = set; then :
   enableval=$enable_optimizer_dbg;
 fi
 
 if test "$enable_optimizer_dbg" = "yes"; then
 
-cat >>confdefs.h <<\_ACEOF
-#define BDEBUG 1
-_ACEOF
+$as_echo "#define BDEBUG 1" >>confdefs.h
 
 fi
-{ echo "$as_me:$LINENO: result: ${enable_optimizer_dbg-no}" >&5
-echo "${ECHO_T}${enable_optimizer_dbg-no}" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${enable_optimizer_dbg-no}" >&5
+$as_echo "${enable_optimizer_dbg-no}" >&6; }
 
-{ echo "$as_me:$LINENO: checking whether to build parser debugging code" >&5
-echo $ECHO_N "checking whether to build parser debugging code... $ECHO_C" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build parser debugging code" >&5
+$as_echo_n "checking whether to build parser debugging code... " >&6; }
 # Check whether --enable-yydebug was given.
-if test "${enable_yydebug+set}" = set; then
+if test "${enable_yydebug+set}" = set; then :
   enableval=$enable_yydebug;
 fi
 
 if test "$enable_yydebug" = "yes"; then
 
-cat >>confdefs.h <<\_ACEOF
-#define YYDEBUG 1
-_ACEOF
+$as_echo "#define YYDEBUG 1" >>confdefs.h
 
 fi
-{ echo "$as_me:$LINENO: result: ${enable_yydebug-no}" >&5
-echo "${ECHO_T}${enable_yydebug-no}" >&6; }
-
-case "$V_PCAP" in
-
-dlpi)
-
-
-for ac_header in sys/bufmod.h sys/dlpi_ext.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  { echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_header_compiler=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-
-rm -f conftest.err conftest.$ac_ext
-{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-
-    ;;
-esac
-{ echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-	{ echo "$as_me:$LINENO: checking for /dev/dlpi device" >&5
-echo $ECHO_N "checking for /dev/dlpi device... $ECHO_C" >&6; }
-	if test -c /dev/dlpi ; then
-		{ echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_DEV_DLPI 1
-_ACEOF
-
-	else
-		{ echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-		dir="/dev/dlpi"
-		{ echo "$as_me:$LINENO: checking for $dir directory" >&5
-echo $ECHO_N "checking for $dir directory... $ECHO_C" >&6; }
-		if test -d $dir ; then
-			{ echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define PCAP_DEV_PREFIX "$dir"
-_ACEOF
-
-		else
-			{ echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-		fi
-	fi
-	;;
-
-linux)
-	{ echo "$as_me:$LINENO: checking Linux kernel version" >&5
-echo $ECHO_N "checking Linux kernel version... $ECHO_C" >&6; }
- 	if test "$cross_compiling" = yes; then
- 		if test "${ac_cv_linux_vers+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_linux_vers=unknown
-fi
-
- 	else
- 		if test "${ac_cv_linux_vers+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_linux_vers=`uname -r 2>&1 | \
- 			sed -n -e '$s/.* //' -e '$s/\..*//p'`
-fi
-
- 	fi
-	{ echo "$as_me:$LINENO: result: $ac_cv_linux_vers" >&5
-echo "${ECHO_T}$ac_cv_linux_vers" >&6; }
- 	if test $ac_cv_linux_vers = unknown ; then
- 		{ { echo "$as_me:$LINENO: error: cannot determine linux version when cross-compiling" >&5
-echo "$as_me: error: cannot determine linux version when cross-compiling" >&2;}
-   { (exit 1); exit 1; }; }
- 	fi
-	if test $ac_cv_linux_vers -lt 2 ; then
-		{ { echo "$as_me:$LINENO: error: version 2 or higher required; see the INSTALL doc for more info" >&5
-echo "$as_me: error: version 2 or higher required; see the INSTALL doc for more info" >&2;}
-   { (exit 1); exit 1; }; }
-	fi
-	{ echo "$as_me:$LINENO: checking if if_packet.h has tpacket_stats defined" >&5
-echo $ECHO_N "checking if if_packet.h has tpacket_stats defined... $ECHO_C" >&6; }
-   if test "${ac_cv_lbl_tpacket_stats+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-#  include <linux/if_packet.h>
-int
-main ()
-{
-struct tpacket_stats stats
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_lbl_tpacket_stats=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lbl_tpacket_stats=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-
-   { echo "$as_me:$LINENO: result: $ac_cv_lbl_tpacket_stats" >&5
-echo "${ECHO_T}$ac_cv_lbl_tpacket_stats" >&6; }
-   if test $ac_cv_lbl_tpacket_stats = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_TPACKET_STATS 1
-_ACEOF
-
-   fi
-	;;
-
-dag)
-	V_DEFS="$V_DEFS -DDAG_ONLY"
-	;;
-
-septel)
-	V_DEFS="$V_DEFS -DSEPTEL_ONLY"
-	;;
-
-null)
-	{ echo "$as_me:$LINENO: WARNING: cannot determine packet capture interface" >&5
-echo "$as_me: WARNING: cannot determine packet capture interface" >&2;}
-	{ echo "$as_me:$LINENO: WARNING: (see the INSTALL doc for more info)" >&5
-echo "$as_me: WARNING: (see the INSTALL doc for more info)" >&2;}
-	;;
-
-esac
-
-{ echo "$as_me:$LINENO: checking whether we have /proc/net/dev" >&5
-echo $ECHO_N "checking whether we have /proc/net/dev... $ECHO_C" >&6; }
-if test -r /proc/net/dev ; then
-	ac_cv_lbl_proc_net_dev=yes
-else
-	ac_cv_lbl_proc_net_dev=no
-fi
-if test $ac_cv_lbl_proc_net_dev = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_PROC_NET_DEV 1
-_ACEOF
-
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_lbl_proc_net_dev" >&5
-echo "${ECHO_T}$ac_cv_lbl_proc_net_dev" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${enable_yydebug-no}" >&5
+$as_echo "${enable_yydebug-no}" >&6; }
 
 # Check for Endace DAG card support.
 
 # Check whether --with-dag was given.
-if test "${with_dag+set}" = set; then
+if test "${with_dag+set}" = set; then :
   withval=$with_dag;
 	if test "$withval" = no
 	then
@@ -6404,7 +6110,7 @@
 
 
 # Check whether --with-dag-includes was given.
-if test "${with_dag_includes+set}" = set; then
+if test "${with_dag_includes+set}" = set; then :
   withval=$with_dag_includes;
 	# User wants DAG support and has specified a header directory, so use the provided value.
 	want_dag=yes
@@ -6415,7 +6121,7 @@
 
 
 # Check whether --with-dag-libraries was given.
-if test "${with_dag_libraries+set}" = set; then
+if test "${with_dag_libraries+set}" = set; then :
   withval=$with_dag_libraries;
 	# User wants DAG support and has specified a library directory, so use the provided value.
 	want_dag=yes
@@ -6439,9 +6145,7 @@
 	# If they expressed no preference, don't include it.
 	#
 	if test $want_dag = yes; then
-		{ { echo "$as_me:$LINENO: error: DAG support is only available with 'linux' 'bpf' and 'dag' packet capture types" >&5
-echo "$as_me: error: DAG support is only available with 'linux' 'bpf' and 'dag' packet capture types" >&2;}
-   { (exit 1); exit 1; }; }
+		as_fn_error $? "DAG support is only available with 'linux' 'bpf' and 'dag' packet capture types" "$LINENO" 5
 	elif test $want_dag = yes; then
 		want_dag=no
 	fi
@@ -6451,8 +6155,8 @@
 ac_cv_lbl_dag_api=no
 if test "$want_dag" != no; then
 
-	{ echo "$as_me:$LINENO: checking whether we have DAG API headers" >&5
-echo $ECHO_N "checking whether we have DAG API headers... $ECHO_C" >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have DAG API headers" >&5
+$as_echo_n "checking whether we have DAG API headers... " >&6; }
 
 	# If necessary, set default paths for DAG API headers and libraries.
 	if test -z "$dag_root"; then
@@ -6469,119 +6173,18 @@
 
 	if test -z "$dag_tools_dir"; then
 	    dag_tools_dir="$dag_root/tools"
-		fi
+	fi
 
 	if test -r $dag_include_dir/dagapi.h; then
 		ac_cv_lbl_dag_api=yes
 	fi
-	{ echo "$as_me:$LINENO: result: $ac_cv_lbl_dag_api ($dag_include_dir)" >&5
-echo "${ECHO_T}$ac_cv_lbl_dag_api ($dag_include_dir)" >&6; }
-fi
-
-if test $ac_cv_lbl_dag_api = yes; then
-
-	{ echo "$as_me:$LINENO: checking dagapi.o" >&5
-echo $ECHO_N "checking dagapi.o... $ECHO_C" >&6; }
-	dagapi_obj=no
-	if test -r $dag_tools_dir/dagapi.o; then
-		# 2.4.x.
-		dagapi_obj=$dag_tools_dir/dagapi.o
-	elif test -r $dag_lib_dir/dagapi.o; then
-		# 2.5.x.
-		dagapi_obj=$dag_lib_dir/dagapi.o
-	elif test -r $dag_lib_dir/libdag.a; then
-		# 2.5.x.
-		ar x $dag_lib_dir/libdag.a dagapi.o
-		if test -r ./dagapi.o; then
-		    dagapi_obj=./dagapi.o
-		else
-		    ar x $dag_lib_dir/libdag.a libdag_la-dagapi.o
-		    if test -r ./libdag_la-dagapi.o; then
-		       dagapi_obj=./libdag_la-dagapi.o
-		    fi
-		fi
-	fi
-
-	if test $dagapi_obj = no; then
-		{ echo "$as_me:$LINENO: result: no (checked $dag_lib_dir  $dag_tools_dir  $dag_lib_dir/libdag.a)" >&5
-echo "${ECHO_T}no (checked $dag_lib_dir  $dag_tools_dir  $dag_lib_dir/libdag.a)" >&6; }
-			ac_cv_lbl_dag_api=no
-	else
-		{ echo "$as_me:$LINENO: result: yes ($dagapi_obj)" >&5
-echo "${ECHO_T}yes ($dagapi_obj)" >&6; }
-	fi
-fi
-
-if test $ac_cv_lbl_dag_api = yes; then
-
-	{ echo "$as_me:$LINENO: checking dagopts.o" >&5
-echo $ECHO_N "checking dagopts.o... $ECHO_C" >&6; }
-	dagopts_obj=no
-	if test -r $dag_tools_dir/dagopts.o; then
-		# 2.4.x.
-		dagopts_obj=$dag_tools_dir/dagopts.o
-	elif test -r $dag_lib_dir/dagopts.o; then
-		# 2.5.x.
-		dagopts_obj=$dag_lib_dir/dagopts.o
-	elif test -r $dag_lib_dir/libdag.a; then
-		# 2.5.x.
-		ar x $dag_lib_dir/libdag.a dagopts.o
-		if test -r ./dagopts.o; then
-		    dagopts_obj=./dagopts.o
-		else
-		    ar x $dag_lib_dir/libdag.a libdag_la-dagopts.o
-		    if test -r ./libdag_la-dagopts.o; then
-		       dagopts_obj=./libdag_la-dagopts.o
-		    fi
-		fi
-	fi
-
-	if test $dagopts_obj = no; then
-		{ echo "$as_me:$LINENO: result: no (checked $dag_lib_dir  $dag_tools_dir  $dag_lib_dir/libdag.a)" >&5
-echo "${ECHO_T}no (checked $dag_lib_dir  $dag_tools_dir  $dag_lib_dir/libdag.a)" >&6; }
-		ac_cv_lbl_dag_api=no
-	else
-		{ echo "$as_me:$LINENO: result: yes ($dagopts_obj)" >&5
-echo "${ECHO_T}yes ($dagopts_obj)" >&6; }
-	fi
-fi
-
-if test $ac_cv_lbl_dag_api = yes; then
-	# Under 2.5.x only we need to add dagreg.o.
-	if test -r $dag_include_dir/dagreg.h; then
-		{ echo "$as_me:$LINENO: checking dagreg.o" >&5
-echo $ECHO_N "checking dagreg.o... $ECHO_C" >&6; }
-		dagreg_obj=no
-		if test -r $dag_lib_dir/dagreg.o; then
-			# Object file is ready and waiting.
-			dagreg_obj=$dag_lib_dir/dagreg.o
-		elif test -r $dag_lib_dir/libdag.a; then
-			# Extract from libdag.a.
-			ar x $dag_lib_dir/libdag.a dagreg.o
-			if test -r ./dagreg.o; then
-				dagreg_obj=./dagreg.o
-			else
-				ar x $dag_lib_dir/libdag.a libdag_la-dagreg.o
-				if test -r ./libdag_la-dagreg.o; then
-				   dagreg_obj=./libdag_la-dagreg.o
-				fi
-			fi
-		fi
-
-		if test $dagreg_obj = no; then
-			{ echo "$as_me:$LINENO: result: no (checked $dag_lib_dir  $dag_lib_dir/libdag.a)" >&5
-echo "${ECHO_T}no (checked $dag_lib_dir  $dag_lib_dir/libdag.a)" >&6; }
-			ac_cv_lbl_dag_api=no
-		else
-			{ echo "$as_me:$LINENO: result: yes ($dagreg_obj)" >&5
-echo "${ECHO_T}yes ($dagreg_obj)" >&6; }
-		fi
-	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_dag_api ($dag_include_dir)" >&5
+$as_echo "$ac_cv_lbl_dag_api ($dag_include_dir)" >&6; }
 fi
 
 if test $ac_cv_lbl_dag_api = yes; then
 	V_INCLS="$V_INCLS -I$dag_include_dir"
-	V_LIBS="$V_LIBS $dagapi_obj $dagopts_obj $dagreg_obj"
+
 	if test $V_PCAP != dag ; then
 		 SSRC="pcap-dag.c"
 	fi
@@ -6591,18 +6194,14 @@
 	# included if there's a found-action (arg 3).
 	saved_ldflags=$LDFLAGS
 	LDFLAGS="-L$dag_lib_dir"
-	{ echo "$as_me:$LINENO: checking for dag_attach_stream in -ldag" >&5
-echo $ECHO_N "checking for dag_attach_stream in -ldag... $ECHO_C" >&6; }
-if test "${ac_cv_lib_dag_dag_attach_stream+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dag_attach_stream in -ldag" >&5
+$as_echo_n "checking for dag_attach_stream in -ldag... " >&6; }
+if ${ac_cv_lib_dag_dag_attach_stream+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-ldag  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 /* Override any GCC internal prototype to avoid an error.
@@ -6620,56 +6219,31 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+if ac_fn_c_try_link "$LINENO"; then :
   ac_cv_lib_dag_dag_attach_stream=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lib_dag_dag_attach_stream=no
+  ac_cv_lib_dag_dag_attach_stream=no
 fi
-
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_lib_dag_dag_attach_stream" >&5
-echo "${ECHO_T}$ac_cv_lib_dag_dag_attach_stream" >&6; }
-if test $ac_cv_lib_dag_dag_attach_stream = yes; then
-  dag_version="2.5.x"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dag_dag_attach_stream" >&5
+$as_echo "$ac_cv_lib_dag_dag_attach_stream" >&6; }
+if test "x$ac_cv_lib_dag_dag_attach_stream" = xyes; then :
+  dag_streams="1"
 else
-  dag_version="2.4.x"
+  dag_streams="0"
 fi
 
-	{ echo "$as_me:$LINENO: checking for dag_get_erf_types in -ldag" >&5
-echo $ECHO_N "checking for dag_get_erf_types in -ldag... $ECHO_C" >&6; }
-if test "${ac_cv_lib_dag_dag_get_erf_types+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dag_get_erf_types in -ldag" >&5
+$as_echo_n "checking for dag_get_erf_types in -ldag... " >&6; }
+if ${ac_cv_lib_dag_dag_get_erf_types+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-ldag  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 /* Override any GCC internal prototype to avoid an error.
@@ -6687,94 +6261,156 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+if ac_fn_c_try_link "$LINENO"; then :
   ac_cv_lib_dag_dag_get_erf_types=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lib_dag_dag_get_erf_types=no
+  ac_cv_lib_dag_dag_get_erf_types=no
 fi
-
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_lib_dag_dag_get_erf_types" >&5
-echo "${ECHO_T}$ac_cv_lib_dag_dag_get_erf_types" >&6; }
-if test $ac_cv_lib_dag_dag_get_erf_types = yes; then
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dag_dag_get_erf_types" >&5
+$as_echo "$ac_cv_lib_dag_dag_get_erf_types" >&6; }
+if test "x$ac_cv_lib_dag_dag_get_erf_types" = xyes; then :
 
 
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_DAG_GET_ERF_TYPES 1
-_ACEOF
-
+$as_echo "#define HAVE_DAG_GET_ERF_TYPES 1" >>confdefs.h
 
 fi
 
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dag_get_stream_erf_types in -ldag" >&5
+$as_echo_n "checking for dag_get_stream_erf_types in -ldag... " >&6; }
+if ${ac_cv_lib_dag_dag_get_stream_erf_types+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldag  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dag_get_stream_erf_types ();
+int
+main ()
+{
+return dag_get_stream_erf_types ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dag_dag_get_stream_erf_types=yes
+else
+  ac_cv_lib_dag_dag_get_stream_erf_types=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dag_dag_get_stream_erf_types" >&5
+$as_echo "$ac_cv_lib_dag_dag_get_stream_erf_types" >&6; }
+if test "x$ac_cv_lib_dag_dag_get_stream_erf_types" = xyes; then :
+
+
+$as_echo "#define HAVE_DAG_GET_STREAM_ERF_TYPES 1" >>confdefs.h
+
+fi
+
+
 	LDFLAGS=$saved_ldflags
 
-	if test "$dag_version" = 2.5.x; then
+	if test "$dag_streams" = 1; then
 
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_DAG_STREAMS_API 1
+$as_echo "#define HAVE_DAG_STREAMS_API 1" >>confdefs.h
+
+		LIBS="$LIBS -ldag"
+		LDFLAGS="$LDFLAGS -L$dag_lib_dir"
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for vdag_set_device_info in -lvdag" >&5
+$as_echo_n "checking for vdag_set_device_info in -lvdag... " >&6; }
+if ${ac_cv_lib_vdag_vdag_set_device_info+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lvdag  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char vdag_set_device_info ();
+int
+main ()
+{
+return vdag_set_device_info ();
+  ;
+  return 0;
+}
 _ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_vdag_vdag_set_device_info=yes
+else
+  ac_cv_lib_vdag_vdag_set_device_info=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_vdag_vdag_set_device_info" >&5
+$as_echo "$ac_cv_lib_vdag_vdag_set_device_info" >&6; }
+if test "x$ac_cv_lib_vdag_vdag_set_device_info" = xyes; then :
+  ac_dag_have_vdag="1"
+else
+  ac_dag_have_vdag="0"
+fi
 
-		DAGLIBS="-ldag"
+		if test "$ac_dag_have_vdag" = 1; then
+
+$as_echo "#define HAVE_DAG_VDAG 1" >>confdefs.h
+
+			LIBS="$LIBS -lpthread"
+		fi
 	fi
 
-	# See if we can find a specific version string.
-	{ echo "$as_me:$LINENO: checking the DAG API version" >&5
-echo $ECHO_N "checking the DAG API version... $ECHO_C" >&6; }
-	if test -r "$dag_root/VERSION"; then
-		dag_version="`cat $dag_root/VERSION`"
-	fi
-	{ echo "$as_me:$LINENO: result: $dag_version" >&5
-echo "${ECHO_T}$dag_version" >&6; }
 
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_DAG_API 1
-_ACEOF
+$as_echo "#define HAVE_DAG_API 1" >>confdefs.h
 
 fi
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have the DAG API" >&5
+$as_echo_n "checking whether we have the DAG API... " >&6; }
+
 if test $ac_cv_lbl_dag_api = no; then
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 	if test "$want_dag" = yes; then
         	# User wanted DAG support but we couldn't find it.
-		{ { echo "$as_me:$LINENO: error: DAG API requested, but not found at $dag_root: use --without-dag" >&5
-echo "$as_me: error: DAG API requested, but not found at $dag_root: use --without-dag" >&2;}
-   { (exit 1); exit 1; }; }
+		as_fn_error $? "DAG API requested, but not found at $dag_root: use --without-dag" "$LINENO" 5
 	fi
 
 	if test "$V_PCAP" = dag; then
 		# User requested "dag" capture type but the DAG API wasn't
 		# found.
-		{ { echo "$as_me:$LINENO: error: Specifying the capture type as \"dag\" requires the DAG API to be present; use the --with-dag options to specify the location. (Try \"./configure --help\" for more information.)" >&5
-echo "$as_me: error: Specifying the capture type as \"dag\" requires the DAG API to be present; use the --with-dag options to specify the location. (Try \"./configure --help\" for more information.)" >&2;}
-   { (exit 1); exit 1; }; }
+		as_fn_error $? "Specifying the capture type as \"dag\" requires the DAG API to be present; use the --with-dag options to specify the location. (Try \"./configure --help\" for more information.)" "$LINENO" 5
 	fi
+else
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
 fi
 
 
 # Check whether --with-septel was given.
-if test "${with_septel+set}" = set; then
+if test "${with_septel+set}" = set; then :
   withval=$with_septel;
 	if test "$withval" = no
 	then
@@ -6814,9 +6450,7 @@
 	# If they expressed no preference, don't include it.
 	#
 	if test $want_septel = yes; then
-		{ { echo "$as_me:$LINENO: error: Septel support only available with 'linux' and 'septel' packet capture types" >&5
-echo "$as_me: error: Septel support only available with 'linux' and 'septel' packet capture types" >&2;}
-   { (exit 1); exit 1; }; }
+		as_fn_error $? "Septel support only available with 'linux' and 'septel' packet capture types" "$LINENO" 5
 	elif test $want_septel = yes; then
 		want_septel=no
 	fi
@@ -6824,64 +6458,224 @@
 esac
 
 if test "$with_septel" != no; then
-	{ echo "$as_me:$LINENO: checking whether we have Septel API" >&5
-echo $ECHO_N "checking whether we have Septel API... $ECHO_C" >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have Septel API" >&5
+$as_echo_n "checking whether we have Septel API... " >&6; }
 
 	if test -z "$septel_root"; then
 		septel_root=$srcdir/../septel
-
 	fi
 
 	septel_tools_dir="$septel_root"
 	septel_include_dir="$septel_root/INC"
-	DEF="-DHAVE_SEPTEL_API"
 
 	ac_cv_lbl_septel_api=no
 	if test -r "$septel_include_dir/msg.h"; then
 		V_INCLS="$V_INCLS -I$septel_include_dir"
-		V_DEFS="$V_DEFS $DEF"
-		V_LIBS="$V_LIBS $septel_tools_dir/asciibin.o $septel_tools_dir/bit2byte.o $septel_tools_dir/confirm.o $septel_tools_dir/fmtmsg.o $septel_tools_dir/gct_unix.o $septel_tools_dir/hqueue.o $septel_tools_dir/ident.o $septel_tools_dir/mem.o $septel_tools_dir/pack.o $septel_tools_dir/parse.o $septel_tools_dir/pool.o $septel_tools_dir/sdlsig.o $septel_tools_dir/strtonum.o $septel_tools_dir/timer.o $septel_tools_dir/trace.o "
+		ADDLOBJS="$ADDLOBJS $septel_tools_dir/asciibin.o $septel_tools_dir/bit2byte.o $septel_tools_dir/confirm.o $septel_tools_dir/fmtmsg.o $septel_tools_dir/gct_unix.o $septel_tools_dir/hqueue.o $septel_tools_dir/ident.o $septel_tools_dir/mem.o $septel_tools_dir/pack.o $septel_tools_dir/parse.o $septel_tools_dir/pool.o $septel_tools_dir/sdlsig.o $septel_tools_dir/strtonum.o $septel_tools_dir/timer.o $septel_tools_dir/trace.o"
+		ADDLARCHIVEOBJS="$ADDLARCHIVEOBJS $septel_tools_dir/asciibin.o $septel_tools_dir/bit2byte.o $septel_tools_dir/confirm.o $septel_tools_dir/fmtmsg.o $septel_tools_dir/gct_unix.o $septel_tools_dir/hqueue.o $septel_tools_dir/ident.o $septel_tools_dir/mem.o $septel_tools_dir/pack.o $septel_tools_dir/parse.o $septel_tools_dir/pool.o $septel_tools_dir/sdlsig.o $septel_tools_dir/strtonum.o $septel_tools_dir/timer.o $septel_tools_dir/trace.o"
 
 		if test "$V_PCAP" != septel ; then
 			 SSRC="pcap-septel.c"
-
 		fi
 		ac_cv_lbl_septel_api=yes
 	fi
 
-	{ echo "$as_me:$LINENO: result: $ac_cv_lbl_septel_api" >&5
-echo "${ECHO_T}$ac_cv_lbl_septel_api" >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_septel_api" >&5
+$as_echo "$ac_cv_lbl_septel_api" >&6; }
 	if test $ac_cv_lbl_septel_api = no; then
 		if test "$want_septel" = yes; then
-			{ { echo "$as_me:$LINENO: error: Septel API not found under directory $septel_root; use --without-septel" >&5
-echo "$as_me: error: Septel API not found under directory $septel_root; use --without-septel" >&2;}
-   { (exit 1); exit 1; }; }
+			as_fn_error $? "Septel API not found under directory $septel_root; use --without-septel" "$LINENO" 5
 		fi
 	else
 
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_SEPTEL_API 1
-_ACEOF
+$as_echo "#define HAVE_SEPTEL_API 1" >>confdefs.h
 
 	fi
 fi
 
 if test "$V_PCAP" = septel -a "$ac_cv_lbl_septel_api" = no; then
-	{ { echo "$as_me:$LINENO: error: Specifying the capture type as 'septel' requires the Septel API to be present; use --with-septel=DIR" >&5
-echo "$as_me: error: Specifying the capture type as 'septel' requires the Septel API to be present; use --with-septel=DIR" >&2;}
-   { (exit 1); exit 1; }; }
+	as_fn_error $? "Specifying the capture type as 'septel' requires the Septel API to be present; use --with-septel=DIR" "$LINENO" 5
+fi
+
+# Check for Myricom SNF support.
+
+# Check whether --with-snf was given.
+if test "${with_snf+set}" = set; then :
+  withval=$with_snf;
+	if test "$withval" = no
+	then
+		# User explicitly doesn't want SNF
+		want_snf=no
+	elif test "$withval" = yes
+	then
+		# User wants SNF support but hasn't specific a directory.
+		want_snf=yes
+	else
+		# User wants SNF support with a specified directory.
+		want_snf=yes
+		snf_root=$withval
+	fi
+
+else
+
+	#
+	# Use Sniffer API if present, otherwise don't
+	#
+	want_snf=ifpresent
+
 fi
 
 
 
+# Check whether --with-snf-includes was given.
+if test "${with_snf_includes+set}" = set; then :
+  withval=$with_snf_includes;
+	# User wants SNF with specific header directory
+	want_snf=yes
+	snf_include_dir=$withval
+
+fi
+
+
+
+# Check whether --with-snf-libraries was given.
+if test "${with_snf_libraries+set}" = set; then :
+  withval=$with_snf_libraries;
+	# User wants SNF with specific lib directory
+	want_snf=yes
+	snf_lib_dir=$withval
+
+fi
+
+
+case "$V_PCAP" in
+bpf|linux|snf)
+	#
+	# We support the Sniffer API if we're on BSD, Linux, or if we're
+	# building a Sniffer-only libpcap.
+	#
+	;;
+*)
+	#
+	# If the user explicitly requested Sniffer, tell them it's not
+	# supported.
+	#
+	# If they expressed no preference, don't include it.
+	#
+	if test $want_snf = yes; then
+		as_fn_error $? "Myricom SNF support only available with 'bpf' 'linux' and 'snf' packet capture types" "$LINENO" 5
+	elif test $want_snf = yes; then
+		want_snf=no
+	fi
+	;;
+esac
+
+ac_cv_lbl_snf_api=no
+if test "$with_snf" != no; then
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have Myricom Sniffer API" >&5
+$as_echo_n "checking whether we have Myricom Sniffer API... " >&6; }
+
+	if test -z "$snf_root"; then
+		snf_root=/opt/snf
+	fi
+
+	if test -z "$snf_include_dir"; then
+		snf_include_dir="$snf_root/include"
+	fi
+
+	if test -z "$snf_lib_dir"; then
+		snf_lib_dir="$snf_root/lib"
+	fi
+
+	if test -f "$snf_include_dir/snf.h"; then
+		ac_cv_lbl_snf_api=yes
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_snf_api ($snf_root)" >&5
+$as_echo "$ac_cv_lbl_snf_api ($snf_root)" >&6; }
+
+	if test $ac_cv_lbl_snf_api = no; then
+		if test "$want_snf" = yes; then
+			as_fn_error $? "SNF API headers not found under $snf_include_dir; use --without-snf" "$LINENO" 5
+		fi
+	else
+		saved_ldflags=$LDFLAGS
+		LDFLAGS="$LDFLAGS -L$snf_lib_dir"
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for snf_init in -lsnf" >&5
+$as_echo_n "checking for snf_init in -lsnf... " >&6; }
+if ${ac_cv_lib_snf_snf_init+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsnf  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char snf_init ();
+int
+main ()
+{
+return snf_init ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_snf_snf_init=yes
+else
+  ac_cv_lib_snf_snf_init=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_snf_snf_init" >&5
+$as_echo "$ac_cv_lib_snf_snf_init" >&6; }
+if test "x$ac_cv_lib_snf_snf_init" = xyes; then :
+  ac_cv_lbl_snf_api="yes"
+else
+  ac_cv_lbl_snf_api="no"
+fi
+
+		LDFLAGS="$saved_ldflags"
+
+		if test $ac_cv_lbl_snf_api = no; then
+			if test "$want_snf" = yes; then
+				as_fn_error $? "SNF API cannot correctly be linked check config.log; use --without-snf" "$LINENO" 5
+			fi
+		else
+			V_INCLS="$V_INCLS -I$snf_include_dir"
+			LIBS="$LIBS -lsnf"
+			LDFLAGS="$LDFLAGS -L$snf_lib_dir"
+			if test "$V_PCAP" != snf ; then
+				SSRC="pcap-snf.c"
+			fi
+
+$as_echo "#define HAVE_SNF_API 1" >>confdefs.h
+
+		fi
+	fi
+fi
+
+if test "$V_PCAP" = snf -a "$ac_cv_lbl_snf_api" = no; then
+	as_fn_error $? "Specifying the capture type as 'snf' requires the Myricom Sniffer API to be present; use --with-snf=DIR" "$LINENO" 5
+fi
+
+
 # Check whether --with-flex was given.
-if test "${with_flex+set}" = set; then
+if test "${with_flex+set}" = set; then :
   withval=$with_flex;
 fi
 
 
 # Check whether --with-bison was given.
-if test "${with_bison+set}" = set; then
+if test "${with_bison+set}" = set; then :
   withval=$with_bison;
 fi
 
@@ -6892,10 +6686,10 @@
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_V_LEX+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_V_LEX+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$V_LEX"; then
   ac_cv_prog_V_LEX="$V_LEX" # Let the user override the test.
@@ -6905,25 +6699,25 @@
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_V_LEX="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
-done
+  done
 IFS=$as_save_IFS
 
 fi
 fi
 V_LEX=$ac_cv_prog_V_LEX
 if test -n "$V_LEX"; then
-  { echo "$as_me:$LINENO: result: $V_LEX" >&5
-echo "${ECHO_T}$V_LEX" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $V_LEX" >&5
+$as_echo "$V_LEX" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -6934,10 +6728,10 @@
     fi
     if test "$V_LEX" = flex ; then
 	    # The -V flag was added in 2.4
-	    { echo "$as_me:$LINENO: checking for flex 2.4 or higher" >&5
-echo $ECHO_N "checking for flex 2.4 or higher... $ECHO_C" >&6; }
-	    if test "${ac_cv_lbl_flex_v24+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+	    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flex 2.4 or higher" >&5
+$as_echo_n "checking for flex 2.4 or higher... " >&6; }
+	    if ${ac_cv_lbl_flex_v24+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   if flex -V >/dev/null 2>&1; then
 			ac_cv_lbl_flex_v24=yes
@@ -6946,12 +6740,12 @@
 		fi
 fi
 
-	    { echo "$as_me:$LINENO: result: $ac_cv_lbl_flex_v24" >&5
-echo "${ECHO_T}$ac_cv_lbl_flex_v24" >&6; }
+	    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_flex_v24" >&5
+$as_echo "$ac_cv_lbl_flex_v24" >&6; }
 	    if test $ac_cv_lbl_flex_v24 = no ; then
 		    s="2.4 or higher required"
-		    { echo "$as_me:$LINENO: WARNING: ignoring obsolete flex executable ($s)" >&5
-echo "$as_me: WARNING: ignoring obsolete flex executable ($s)" >&2;}
+		    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ignoring obsolete flex executable ($s)" >&5
+$as_echo "$as_me: WARNING: ignoring obsolete flex executable ($s)" >&2;}
 		    V_LEX=lex
 	    fi
     fi
@@ -6962,10 +6756,10 @@
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_V_YACC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_V_YACC+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$V_YACC"; then
   ac_cv_prog_V_YACC="$V_YACC" # Let the user override the test.
@@ -6975,25 +6769,25 @@
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_V_YACC="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
-done
+  done
 IFS=$as_save_IFS
 
 fi
 fi
 V_YACC=$ac_cv_prog_V_YACC
 if test -n "$V_YACC"; then
-  { echo "$as_me:$LINENO: result: $V_YACC" >&5
-echo "${ECHO_T}$V_YACC" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $V_YACC" >&5
+$as_echo "$V_YACC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -7006,22 +6800,26 @@
 	    V_YACC="$V_YACC -y"
     fi
     if test "$V_LEX" != lex -a "$V_YACC" = yacc -o "$V_LEX" = lex -a "$V_YACC" != yacc ; then
-	    { echo "$as_me:$LINENO: WARNING: don't have both flex and bison; reverting to lex/yacc" >&5
-echo "$as_me: WARNING: don't have both flex and bison; reverting to lex/yacc" >&2;}
+	    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: don't have both flex and bison; reverting to lex/yacc" >&5
+$as_echo "$as_me: WARNING: don't have both flex and bison; reverting to lex/yacc" >&2;}
 	    V_LEX=lex
 	    V_YACC=yacc
     fi
     if test "$V_LEX" = flex -a -n "pcap_" ; then
 	    V_LEX="$V_LEX -Ppcap_"
 	    V_YACC="$V_YACC -p pcap_"
+    else
+
+$as_echo "#define NEED_YYPARSE_WRAPPER 1" >>confdefs.h
+
     fi
 if test "$V_LEX" = lex ; then
 # Some versions of lex can't handle the definitions section of scanner.l .
 # Try lexing it and complain if it can't deal.
-	{ echo "$as_me:$LINENO: checking for capable lex" >&5
-echo $ECHO_N "checking for capable lex... $ECHO_C" >&6; }
-if test "${tcpdump_cv_capable_lex+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for capable lex" >&5
+$as_echo_n "checking for capable lex... " >&6; }
+if ${tcpdump_cv_capable_lex+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   if lex -t scanner.l > /dev/null 2>&1; then
 			tcpdump_cv_capable_lex=yes
@@ -7029,65 +6827,250 @@
 			tcpdump_cv_capable_lex=insufficient
 		fi
 fi
-{ echo "$as_me:$LINENO: result: $tcpdump_cv_capable_lex" >&5
-echo "${ECHO_T}$tcpdump_cv_capable_lex" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcpdump_cv_capable_lex" >&5
+$as_echo "$tcpdump_cv_capable_lex" >&6; }
 	if test $tcpdump_cv_capable_lex = insufficient ; then
-		{ { echo "$as_me:$LINENO: error: Your operating system's lex is insufficient to compile
+		as_fn_error $? "Your operating system's lex is insufficient to compile
  libpcap.  flex is a lex replacement that has many advantages, including
  being able to compile libpcap.  For more information, see
- http://www.gnu.org/software/flex/flex.html ." >&5
-echo "$as_me: error: Your operating system's lex is insufficient to compile
- libpcap.  flex is a lex replacement that has many advantages, including
- being able to compile libpcap.  For more information, see
- http://www.gnu.org/software/flex/flex.html ." >&2;}
-   { (exit 1); exit 1; }; }
+ http://www.gnu.org/software/flex/flex.html ." "$LINENO" 5
 	fi
 fi
 
-DYEXT="so"
+#
+# Assume, by default, no support for shared libraries and V7/BSD convention
+# for man pages (file formats in section 5, miscellaneous info in section 7).
+# Individual cases can override this.
+#
+DYEXT="none"
+MAN_FILE_FORMATS=5
+MAN_MISC_INFO=7
 case "$host_os" in
 
 aix*)
 
-cat >>confdefs.h <<\_ACEOF
-#define _SUN 1
-_ACEOF
+$as_echo "#define _SUN 1" >>confdefs.h
 
+
+	#
+	# AIX makes it fun to build shared and static libraries,
+	# because they're *both* ".a" archive libraries.  We
+	# build the static library for the benefit of the traditional
+	# scheme of building libpcap and tcpdump in subdirectories of
+	# the same directory, with tcpdump statically linked with the
+	# libpcap in question, but we also build a shared library as
+	# "libpcap.shareda" and install *it*, rather than the static
+	# library, as "libpcap.a".
+	#
+	DYEXT="shareda"
+
+	case "$V_PCAP" in
+
+	dlpi)
+		#
+		# If we're using DLPI, applications will need to
+		# use /lib/pse.exp if present, as we use the
+		# STREAMS routines.
+		#
+		pseexe="/lib/pse.exp"
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $pseexe" >&5
+$as_echo_n "checking for $pseexe... " >&6; }
+		if test -f $pseexe ; then
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+			LIBS="-I:$pseexe"
+		fi
+		;;
+
+	bpf)
+		#
+		# If we're using BPF, we need "-lodm" and "-lcfg", as
+		# we use them to load the BPF module.
+		#
+		LIBS="-lodm -lcfg"
+		;;
+	esac
+	;;
+
+darwin*)
+	DYEXT="dylib"
+	V_CCOPT="$V_CCOPT -fno-common"
+	# Check whether --enable-universal was given.
+if test "${enable_universal+set}" = set; then :
+  enableval=$enable_universal;
+fi
+
+	if test "$enable_universal" != "no"; then
+		case "$host_os" in
+
+		darwin0-7.*)
+			#
+			# Pre-Tiger.  Build only for 32-bit PowerPC; no
+			# need for any special compiler or linker flags.
+			#
+			;;
+
+		darwin8.0123*)
+			#
+			# Tiger, prior to Intel support.  Build for 32-bit
+			# PowerPC and 64-bit PowerPC, with 32-bit PowerPC
+			# first.  (I'm guessing that's what Apple does.)
+			#
+			V_CCOPT="$V_CCOPT -arch ppc -arch ppc64"
+			LDFLAGS="$LDFLAGS -arch ppc -arch ppc64"
+			;;
+
+		darwin8.456*)
+			#
+			# Tiger, subsequent to Intel support but prior to
+			# x86-64 support.  Build for 32-bit PowerPC, 64-bit
+			# PowerPC, and x86, with 32-bit PowerPC first.
+			# (I'm guessing that's what Apple does.)
+			#
+			V_CCOPT="$V_CCOPT -arch ppc -arch ppc64 -arch i386"
+			LDFLAGS="$LDFLAGS -arch ppc -arch ppc64 -arch i386"
+			;;
+
+		darwin8.*)
+			#
+			# All other Tiger, so subsequent to x86-64
+			# support. Build for 32-bit PowerPC, 64-bit
+			# PowerPC, x86, and x86-64, and with 32-bit PowerPC
+			# first.  (I'm guessing that's what Apple does.)
+			#
+			V_CCOPT="$V_CCOPT -arch ppc -arch ppc64 -arch i386 -arch x86_64"
+			LDFLAGS="$LDFLAGS -arch ppc -arch ppc64 -arch i386 -arch x86_64"
+			;;
+
+		darwin9.*)
+			#
+			# Leopard.  Build for 32-bit PowerPC, 64-bit
+			# PowerPC, x86, and x86-64, with 32-bit PowerPC
+			# first.  (That's what Apple does.)
+			#
+			V_CCOPT="$V_CCOPT -arch ppc -arch ppc64 -arch i386 -arch x86_64"
+			LDFLAGS="$LDFLAGS -arch ppc -arch ppc64 -arch i386 -arch x86_64"
+			;;
+
+		darwin10.*)
+			#
+			# Snow Leopard.  Build for x86-64, x86, and
+			# 32-bit PowerPC, with x86-64 first.  (That's
+			# what Apple does, even though Snow Leopard
+			# doesn't run on PPC, so PPC libpcap runs under
+			# Rosetta, and Rosetta doesn't support BPF
+			# ioctls, so PPC programs can't do live
+			# captures.)
+			#
+			V_CCOPT="$V_CCOPT -arch x86_64 -arch i386 -arch ppc"
+			LDFLAGS="$LDFLAGS -arch x86_64 -arch i386 -arch ppc"
+			;;
+
+		darwin*)
+			#
+			# Post-Snow Leopard.  Build for x86-64 and
+			# x86, with x86-64 first.  (That's probably what
+			# Apple does, given that Rosetta is gone.)
+			# XXX - update if and when Apple drops support
+			# for 32-bit x86 code.
+			#
+			V_CCOPT="$V_CCOPT -arch x86_64 -arch i386"
+			LDFLAGS="$LDFLAGS -arch x86_64 -arch i386"
+			;;
+		esac
+	fi
 	;;
 
 hpux9*)
 
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_HPUX9 1
-_ACEOF
+$as_echo "#define HAVE_HPUX9 1" >>confdefs.h
 
+
+	#
+	# Use System V conventions for man pages.
+	#
+	MAN_FILE_FORMATS=4
+	MAN_MISC_INFO=5
 	;;
 
 hpux10.0*)
+
+	#
+	# Use System V conventions for man pages.
+	#
+	MAN_FILE_FORMATS=4
+	MAN_MISC_INFO=5
 	;;
 
 hpux10.1*)
+
+	#
+	# Use System V conventions for man pages.
+	#
+	MAN_FILE_FORMATS=4
+	MAN_MISC_INFO=5
 	;;
 
 hpux*)
 
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_HPUX10_20_OR_LATER 1
-_ACEOF
+$as_echo "#define HAVE_HPUX10_20_OR_LATER 1" >>confdefs.h
 
+	if test "`uname -m`" = "ia64"; then
+		DYEXT="so"
+	else
+		DYEXT="sl"
+	fi
+
+	#
+	# "-b" builds a shared library; "+h" sets the soname.
+	#
+	SHLIB_OPT="-b"
+	SONAME_OPT="+h"
+
+	#
+	# Use System V conventions for man pages.
+	#
+	MAN_FILE_FORMATS=4
+	MAN_MISC_INFO=5
+	;;
+
+irix*)
+	#
+	# Use System V conventions for man pages.
+	#
+	MAN_FILE_FORMATS=4
+	MAN_MISC_INFO=5
+	;;
+
+linux*|freebsd*|netbsd*|openbsd*|dragonfly*|kfreebsd*|gnu*)
+	DYEXT="so"
+
+	#
+	# Compiler assumed to be GCC; run-time linker may require a -R
+	# flag.
+	#
+	if test "$libdir" != "/usr/lib"; then
+		V_RFLAGS=-Wl,-R$libdir
+	fi
+	;;
+
+osf*)
+	DYEXT="so"
+
+	#
+	# Use System V conventions for man pages.
+	#
+	MAN_FILE_FORMATS=4
+	MAN_MISC_INFO=5
 	;;
 
 sinix*)
-	{ echo "$as_me:$LINENO: checking if SINIX compiler defines sinix" >&5
-echo $ECHO_N "checking if SINIX compiler defines sinix... $ECHO_C" >&6; }
-	if test "${ac_cv_cc_sinix_defined+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if SINIX compiler defines sinix" >&5
+$as_echo_n "checking if SINIX compiler defines sinix... " >&6; }
+	if ${ac_cv_cc_sinix_defined+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 int
@@ -7098,71 +7081,51 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
   ac_cv_cc_sinix_defined=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_cc_sinix_defined=no
+  ac_cv_cc_sinix_defined=no
 fi
-
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
-	    { echo "$as_me:$LINENO: result: $ac_cv_cc_sinix_defined" >&5
-echo "${ECHO_T}$ac_cv_cc_sinix_defined" >&6; }
+	    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cc_sinix_defined" >&5
+$as_echo "$ac_cv_cc_sinix_defined" >&6; }
 	    if test $ac_cv_cc_sinix_defined = no ; then
 
-cat >>confdefs.h <<\_ACEOF
-#define sinix 1
-_ACEOF
+$as_echo "#define sinix 1" >>confdefs.h
 
 	    fi
 	;;
 
 solaris*)
 
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_SOLARIS 1
-_ACEOF
+$as_echo "#define HAVE_SOLARIS 1" >>confdefs.h
 
+
+	DYEXT="so"
+	#
+	# Use System V conventions for man pages.
+	#
+	MAN_FILE_FORMATS=4
+	MAN_MISC_INFO=5
 	;;
-
-darwin*)
-	DYEXT="dylib"
-	V_CCOPT="$V_CCOPT -fno-common"
-	;;
-
-linux*)
-	V_CCOPT="$V_CCOPT -fPIC"
-	;;
-
 esac
 
+# Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared;
+fi
+
+test "x$enable_shared" = "xno" && DYEXT="none"
+
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_RANLIB+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$RANLIB"; then
   ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
@@ -7172,25 +7135,25 @@
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
-done
+  done
 IFS=$as_save_IFS
 
 fi
 fi
 RANLIB=$ac_cv_prog_RANLIB
 if test -n "$RANLIB"; then
-  { echo "$as_me:$LINENO: result: $RANLIB" >&5
-echo "${ECHO_T}$RANLIB" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -7199,10 +7162,10 @@
   ac_ct_RANLIB=$RANLIB
   # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_RANLIB"; then
   ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
@@ -7212,25 +7175,25 @@
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_RANLIB="ranlib"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
-done
+  done
 IFS=$as_save_IFS
 
 fi
 fi
 ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
 if test -n "$ac_ct_RANLIB"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
-echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_RANLIB" = x; then
@@ -7238,12 +7201,8 @@
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     RANLIB=$ac_ct_RANLIB
@@ -7252,58 +7211,380 @@
   RANLIB="$ac_cv_prog_RANLIB"
 fi
 
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="${ac_tool_prefix}ar"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+  ac_ct_AR=$AR
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="ar"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_AR" = x; then
+    AR=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+else
+  AR="$ac_cv_prog_AR"
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+
 
 rm -f os-proto.h
     if test "${LBL_CFLAGS+set}" = set; then
 	    V_CCOPT="$V_CCOPT ${LBL_CFLAGS}"
     fi
     if test -f .devel ; then
-	    if test "$GCC" = yes ; then
-		    if test "${LBL_CFLAGS+set}" != set; then
-			    if test "$ac_cv_prog_cc_g" = yes ; then
-				    V_CCOPT="-g $V_CCOPT"
-			    fi
-			    V_CCOPT="$V_CCOPT -Wall"
-			    if test $ac_cv_lbl_gcc_vers -gt 1 ; then
-				    V_CCOPT="$V_CCOPT -Wmissing-prototypes -Wstrict-prototypes"
-			    fi
-		    fi
-	    else
-		    case "$target_os" in
+	    #
+	    # Skip all the warning option stuff on some compilers.
+	    #
+	    if test "$ac_lbl_cc_dont_try_gcc_dashW" != yes; then
 
-		    irix6*)
-			    V_CCOPT="$V_CCOPT -n32"
-			    ;;
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler fails when given an unknown warning option" >&5
+$as_echo_n "checking whether the compiler fails when given an unknown warning option... " >&6; }
+	save_CFLAGS="$CFLAGS"
+	CFLAGS="$CFLAGS -Wxyzzy-this-will-never-succeed-xyzzy"
+	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-		    *)
-			    ;;
-		    esac
+int
+main ()
+{
+return 0
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		#
+		# We're assuming this is clang, where
+		# -Werror=unknown-warning-option is the appropriate
+		# option to force the compiler to fail.
+		#
+		ac_lbl_unknown_warning_option_error="-Werror=unknown-warning-option"
+
+else
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+	CFLAGS="$save_CFLAGS"
+
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -Wall option" >&5
+$as_echo_n "checking whether the compiler supports the -Wall option... " >&6; }
+	save_CFLAGS="$CFLAGS"
+	CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error -Wall"
+	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+return 0
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		CFLAGS="$save_CFLAGS"
+		V_CCOPT="$V_CCOPT -Wall"
+
+else
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		CFLAGS="$save_CFLAGS"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -Wmissing-prototypes option" >&5
+$as_echo_n "checking whether the compiler supports the -Wmissing-prototypes option... " >&6; }
+	save_CFLAGS="$CFLAGS"
+	CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error -Wmissing-prototypes"
+	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+return 0
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		CFLAGS="$save_CFLAGS"
+		V_CCOPT="$V_CCOPT -Wmissing-prototypes"
+
+else
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		CFLAGS="$save_CFLAGS"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the -Wstrict-prototypes option" >&5
+$as_echo_n "checking whether the compiler supports the -Wstrict-prototypes option... " >&6; }
+	save_CFLAGS="$CFLAGS"
+	CFLAGS="$CFLAGS $ac_lbl_unknown_warning_option_error -Wstrict-prototypes"
+	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+return 0
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		CFLAGS="$save_CFLAGS"
+		V_CCOPT="$V_CCOPT -Wstrict-prototypes"
+
+else
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		CFLAGS="$save_CFLAGS"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
 	    fi
-	    os=`echo $target_os | sed -e 's/\([0-9][0-9]*\)[^0-9].*$/\1/'`
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports generating dependencies" >&5
+$as_echo_n "checking whether the compiler supports generating dependencies... " >&6; }
+	if test "$GCC" = yes ; then
+		#
+		# GCC, or a compiler deemed to be GCC by AC_PROG_CC (even
+		# though it's not); we assume that, in this case, the flag
+		# would be -M.
+		#
+		ac_lbl_dependency_flag="-M"
+	else
+		#
+		# Not GCC or a compiler deemed to be GCC; what platform is
+		# this?  (We're assuming that if the compiler isn't GCC
+		# it's the compiler from the vendor of the OS; that won't
+		# necessarily be true for x86 platforms, where it might be
+		# the Intel C compiler.)
+		#
+		case "$host_os" in
+
+		irix*|osf*|darwin*)
+			#
+			# MIPS C for IRIX, DEC C, and clang all use -M.
+			#
+			ac_lbl_dependency_flag="-M"
+			;;
+
+		solaris*)
+			#
+			# Sun C uses -xM.
+			#
+			ac_lbl_dependency_flag="-xM"
+			;;
+
+		hpux*)
+			#
+			# HP's older C compilers don't support this.
+			# HP's newer C compilers support this with
+			# either +M or +Make; the older compilers
+			# interpret +M as something completely
+			# different, so we use +Make so we don't
+			# think it works with the older compilers.
+			#
+			ac_lbl_dependency_flag="+Make"
+			;;
+
+		*)
+			#
+			# Not one of the above; assume no support for
+			# generating dependencies.
+			#
+			ac_lbl_dependency_flag=""
+			;;
+		esac
+	fi
+
+	#
+	# Is ac_lbl_dependency_flag defined and, if so, does the compiler
+	# complain about it?
+	#
+	# Note: clang doesn't seem to exit with an error status when handed
+	# an unknown non-warning error, even if you pass it
+	# -Werror=unknown-warning-option.  However, it always supports
+	# -M, so the fact that this test always succeeds with clang
+	# isn't an issue.
+	#
+	if test ! -z "$ac_lbl_dependency_flag"; then
+		cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int main(void) { return 0; }
+_ACEOF
+		echo "$CC" $ac_lbl_dependency_flag conftest.c >&5
+		if "$CC" $ac_lbl_dependency_flag conftest.c >/dev/null 2>&1; then
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, with $ac_lbl_dependency_flag" >&5
+$as_echo "yes, with $ac_lbl_dependency_flag" >&6; }
+			DEPENDENCY_CFLAG="$ac_lbl_dependency_flag"
+			MKDEP='${srcdir}/mkdep'
+		else
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+			#
+			# We can't run mkdep, so have "make depend" do
+			# nothing.
+			#
+			MKDEP=:
+		fi
+		rm -rf conftest*
+	else
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		#
+		# We can't run mkdep, so have "make depend" do
+		# nothing.
+		#
+		MKDEP=:
+	fi
+
+
+
+	    #
+	    # We used to set -n32 for IRIX 6 when not using GCC (presumed
+	    # to mean that we're using MIPS C or MIPSpro C); it specified
+	    # the "new" faster 32-bit ABI, introduced in IRIX 6.2.  I'm
+	    # not sure why that would be something to do *only* with a
+	    # .devel file; why should the ABI for which we produce code
+	    # depend on .devel?
+	    #
+	    os=`echo $host_os | sed -e 's/\([0-9][0-9]*\)[^0-9].*$/\1/'`
 	    name="lbl/os-$os.h"
 	    if test -f $name ; then
 		    ln -s $name os-proto.h
 
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_OS_PROTO_H 1
-_ACEOF
+$as_echo "#define HAVE_OS_PROTO_H 1" >>confdefs.h
 
 	    else
-		    { echo "$as_me:$LINENO: WARNING: can't find $name" >&5
-echo "$as_me: WARNING: can't find $name" >&2;}
+		    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find $name" >&5
+$as_echo "$as_me: WARNING: can't find $name" >&2;}
 	    fi
     fi
 
-{ echo "$as_me:$LINENO: checking if sockaddr struct has sa_len member" >&5
-echo $ECHO_N "checking if sockaddr struct has sa_len member... $ECHO_C" >&6; }
-    if test "${ac_cv_lbl_sockaddr_has_sa_len+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if sockaddr struct has the sa_len member" >&5
+$as_echo_n "checking if sockaddr struct has the sa_len member... " >&6; }
+    if ${ac_cv_lbl_sockaddr_has_sa_len+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 #	include <sys/types.h>
@@ -7316,54 +7597,28 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
   ac_cv_lbl_sockaddr_has_sa_len=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lbl_sockaddr_has_sa_len=no
+  ac_cv_lbl_sockaddr_has_sa_len=no
 fi
-
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
-    { echo "$as_me:$LINENO: result: $ac_cv_lbl_sockaddr_has_sa_len" >&5
-echo "${ECHO_T}$ac_cv_lbl_sockaddr_has_sa_len" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_sockaddr_has_sa_len" >&5
+$as_echo "$ac_cv_lbl_sockaddr_has_sa_len" >&6; }
     if test $ac_cv_lbl_sockaddr_has_sa_len = yes ; then
 
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_SOCKADDR_SA_LEN 1
-_ACEOF
+$as_echo "#define HAVE_SOCKADDR_SA_LEN 1" >>confdefs.h
 
     fi
 
-{ echo "$as_me:$LINENO: checking if sockaddr_storage struct exists" >&5
-echo $ECHO_N "checking if sockaddr_storage struct exists... $ECHO_C" >&6; }
-    if test "${ac_cv_lbl_has_sockaddr_storage+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if sockaddr_storage struct exists" >&5
+$as_echo_n "checking if sockaddr_storage struct exists... " >&6; }
+    if ${ac_cv_lbl_has_sockaddr_storage+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 #	include <sys/types.h>
@@ -7376,54 +7631,28 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
   ac_cv_lbl_has_sockaddr_storage=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lbl_has_sockaddr_storage=no
+  ac_cv_lbl_has_sockaddr_storage=no
 fi
-
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
-    { echo "$as_me:$LINENO: result: $ac_cv_lbl_has_sockaddr_storage" >&5
-echo "${ECHO_T}$ac_cv_lbl_has_sockaddr_storage" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_has_sockaddr_storage" >&5
+$as_echo "$ac_cv_lbl_has_sockaddr_storage" >&6; }
     if test $ac_cv_lbl_has_sockaddr_storage = yes ; then
 
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_SOCKADDR_STORAGE 1
-_ACEOF
+$as_echo "#define HAVE_SOCKADDR_STORAGE 1" >>confdefs.h
 
     fi
 
-{ echo "$as_me:$LINENO: checking if dl_hp_ppa_info_t struct has dl_module_id_1 member" >&5
-echo $ECHO_N "checking if dl_hp_ppa_info_t struct has dl_module_id_1 member... $ECHO_C" >&6; }
-    if test "${ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if dl_hp_ppa_info_t struct has dl_module_id_1 member" >&5
+$as_echo_n "checking if dl_hp_ppa_info_t struct has dl_module_id_1 member... " >&6; }
+    if ${ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
 #	include <sys/types.h>
@@ -7437,48 +7666,26 @@
   return 0;
 }
 _ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
+if ac_fn_c_try_compile "$LINENO"; then :
   ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1=yes
 else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1=no
+  ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1=no
 fi
-
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
-    { echo "$as_me:$LINENO: result: $ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1" >&5
-echo "${ECHO_T}$ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1" >&5
+$as_echo "$ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1" >&6; }
     if test $ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1 = yes ; then
 
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_HP_PPA_INFO_T_DL_MODULE_ID_1 1
-_ACEOF
+$as_echo "#define HAVE_HP_PPA_INFO_T_DL_MODULE_ID_1 1" >>confdefs.h
 
     fi
 
-{ echo "$as_me:$LINENO: checking if unaligned accesses fail" >&5
-echo $ECHO_N "checking if unaligned accesses fail... $ECHO_C" >&6; }
-    if test "${ac_cv_lbl_unaligned_fail+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if unaligned accesses fail" >&5
+$as_echo_n "checking if unaligned accesses fail... " >&6; }
+    if ${ac_cv_lbl_unaligned_fail+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   case "$host_cpu" in
 
@@ -7514,7 +7721,7 @@
 	# know it does work, and have the script just fail on other
 	# cpu types and update it when such a failure occurs.
 	#
-	alpha*|arm*|hp*|mips*|sh*|sparc*|ia64|nv1)
+	alpha*|arm*|bfin*|hp*|mips*|sh*|sparc*|ia64|nv1)
 		ac_cv_lbl_unaligned_fail=yes
 		;;
 
@@ -7557,18 +7764,16 @@
 				ac_cv_lbl_unaligned_fail=no
 			fi
 		fi
-		rm -f conftest* core core.conftest
+		rm -f -r conftest* core core.conftest
 		;;
 	esac
 fi
 
-    { echo "$as_me:$LINENO: result: $ac_cv_lbl_unaligned_fail" >&5
-echo "${ECHO_T}$ac_cv_lbl_unaligned_fail" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_unaligned_fail" >&5
+$as_echo "$ac_cv_lbl_unaligned_fail" >&6; }
     if test $ac_cv_lbl_unaligned_fail = yes ; then
 
-cat >>confdefs.h <<\_ACEOF
-#define LBL_ALIGN 1
-_ACEOF
+$as_echo "#define LBL_ALIGN 1" >>confdefs.h
 
     fi
 
@@ -7577,9 +7782,7 @@
 # that it will be generated if autoconf is used.
 #
 
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_VERSION_H 1
-_ACEOF
+$as_echo "#define HAVE_VERSION_H 1" >>confdefs.h
 
 
 rm -f net
@@ -7598,6 +7801,509 @@
 
 
 
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for USB sniffing support" >&5
+$as_echo_n "checking for USB sniffing support... " >&6; }
+case "$host_os" in
+linux*)
+
+$as_echo "#define PCAP_SUPPORT_USB 1" >>confdefs.h
+
+	USB_SRC=pcap-usb-linux.c
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	ac_usb_dev_name=`udevinfo -q name -p /sys/class/usb_device/usbmon 2>/dev/null`
+	if test $? -ne 0 ; then
+	  ac_usb_dev_name="usbmon"
+	fi
+
+cat >>confdefs.h <<_ACEOF
+#define LINUX_USB_MON_DEV "/dev/$ac_usb_dev_name"
+_ACEOF
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: Device for USB sniffing is /dev/$ac_usb_dev_name" >&5
+$as_echo "$as_me: Device for USB sniffing is /dev/$ac_usb_dev_name" >&6;}
+	#
+	# Do we have a version of <linux/compiler.h> available?
+	# If so, we might need it for <linux/usbdevice_fs.h>.
+	#
+	for ac_header in linux/compiler.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "linux/compiler.h" "ac_cv_header_linux_compiler_h" "$ac_includes_default"
+if test "x$ac_cv_header_linux_compiler_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LINUX_COMPILER_H 1
+_ACEOF
+
+fi
+
+done
+
+	if test "$ac_cv_header_linux_compiler_h" = yes; then
+	  #
+	  # Yes - include it when testing for <linux/usbdevice_fs.h>.
+	  #
+	  for ac_header in linux/usbdevice_fs.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "linux/usbdevice_fs.h" "ac_cv_header_linux_usbdevice_fs_h" "#include <linux/compiler.h>
+"
+if test "x$ac_cv_header_linux_usbdevice_fs_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LINUX_USBDEVICE_FS_H 1
+_ACEOF
+
+fi
+
+done
+
+	else
+	  for ac_header in linux/usbdevice_fs.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "linux/usbdevice_fs.h" "ac_cv_header_linux_usbdevice_fs_h" "$ac_includes_default"
+if test "x$ac_cv_header_linux_usbdevice_fs_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LINUX_USBDEVICE_FS_H 1
+_ACEOF
+
+fi
+
+done
+
+	fi
+	if test "$ac_cv_header_linux_usbdevice_fs_h" = yes; then
+	  #
+	  # OK, does it define bRequestType?  Older versions of the kernel
+	  # define fields with names like "requesttype, "request", and
+	  # "value", rather than "bRequestType", "bRequest", and
+	  # "wValue".
+	  #
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if usbdevfs_ctrltransfer struct has bRequestType member" >&5
+$as_echo_n "checking if usbdevfs_ctrltransfer struct has bRequestType member... " >&6; }
+	  if ${ac_cv_usbdevfs_ctrltransfer_has_bRequestType+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+$ac_includes_default
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
+#ifdef HAVE_LINUX_COMPILER_H
+#include <linux/compiler.h>
+#endif
+#include <linux/usbdevice_fs.h>
+int
+main ()
+{
+u_int i = sizeof(((struct usbdevfs_ctrltransfer *)0)->bRequestType)
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_usbdevfs_ctrltransfer_has_bRequestType=yes
+else
+  ac_cv_usbdevfs_ctrltransfer_has_bRequestType=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+	    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_usbdevfs_ctrltransfer_has_bRequestType" >&5
+$as_echo "$ac_cv_usbdevfs_ctrltransfer_has_bRequestType" >&6; }
+	    if test $ac_cv_usbdevfs_ctrltransfer_has_bRequestType = yes ; then
+
+$as_echo "#define HAVE_USBDEVFS_CTRLTRANSFER_BREQUESTTYPE 1" >>confdefs.h
+
+	    fi
+	fi
+	;;
+*)
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	;;
+esac
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the platform could support netfilter sniffing" >&5
+$as_echo_n "checking whether the platform could support netfilter sniffing... " >&6; }
+case "$host_os" in
+linux*)
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	#
+	# Life's too short to deal with trying to get this to compile
+	# if you don't get the right types defined with
+	# __KERNEL_STRICT_NAMES getting defined by some other include.
+	#
+	# Check whether the includes Just Work.  If not, don't turn on
+	# netfilter support.
+	#
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can compile the netfilter support" >&5
+$as_echo_n "checking whether we can compile the netfilter support... " >&6; }
+	if ${ac_cv_netfilter_can_compile+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+$ac_includes_default
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <linux/types.h>
+
+#include <linux/netlink.h>
+#include <linux/netfilter.h>
+#include <linux/netfilter/nfnetlink.h>
+#include <linux/netfilter/nfnetlink_log.h>
+#include <linux/netfilter/nfnetlink_queue.h>
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_netfilter_can_compile=yes
+else
+  ac_cv_netfilter_can_compile=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_netfilter_can_compile" >&5
+$as_echo "$ac_cv_netfilter_can_compile" >&6; }
+	if test $ac_cv_netfilter_can_compile = yes ; then
+
+$as_echo "#define PCAP_SUPPORT_NETFILTER 1" >>confdefs.h
+
+	  NETFILTER_SRC=pcap-netfilter-linux.c
+	fi
+	;;
+*)
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	;;
+esac
+
+
+
+# Check whether --enable-bluetooth was given.
+if test "${enable_bluetooth+set}" = set; then :
+  enableval=$enable_bluetooth;
+else
+  enable_bluetooth=yes
+fi
+
+
+if test "x$enable_bluetooth" != "xno" ; then
+		case "$host_os" in
+	linux*)
+		ac_fn_c_check_header_mongrel "$LINENO" "bluetooth/bluetooth.h" "ac_cv_header_bluetooth_bluetooth_h" "$ac_includes_default"
+if test "x$ac_cv_header_bluetooth_bluetooth_h" = xyes; then :
+
+
+$as_echo "#define PCAP_SUPPORT_BT 1" >>confdefs.h
+
+		  BT_SRC=pcap-bt-linux.c
+		  { $as_echo "$as_me:${as_lineno-$LINENO}: Bluetooth sniffing is supported" >&5
+$as_echo "$as_me: Bluetooth sniffing is supported" >&6;}
+
+		  #
+		  # OK, does struct sockaddr_hci have an hci_channel
+		  # member?
+		  #
+		  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if struct sockaddr_hci has hci_channel member" >&5
+$as_echo_n "checking if struct sockaddr_hci has hci_channel member... " >&6; }
+		  if ${ac_cv_lbl_sockaddr_hci_has_hci_channel+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/hci.h>
+
+int
+main ()
+{
+u_int i = sizeof(((struct sockaddr_hci *)0)->hci_channel)
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_lbl_sockaddr_hci_has_hci_channel=yes
+else
+  ac_cv_lbl_sockaddr_hci_has_hci_channel=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+		    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lbl_sockaddr_hci_has_hci_channel" >&5
+$as_echo "$ac_cv_lbl_sockaddr_hci_has_hci_channel" >&6; }
+		    if test $ac_cv_lbl_sockaddr_hci_has_hci_channel = yes ; then
+
+$as_echo "#define SOCKADDR_HCI_HAS_HCI_CHANNEL /**/" >>confdefs.h
+
+		    fi
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: Bluetooth sniffing is not supported; install bluez-lib devel to enable it" >&5
+$as_echo "$as_me: Bluetooth sniffing is not supported; install bluez-lib devel to enable it" >&6;}
+
+fi
+
+
+		;;
+	*)
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: no Bluetooth sniffing support implemented for $host_os" >&5
+$as_echo "$as_me: no Bluetooth sniffing support implemented for $host_os" >&6;}
+		;;
+	esac
+
+
+fi
+
+# Check whether --enable-canusb was given.
+if test "${enable_canusb+set}" = set; then :
+  enableval=$enable_canusb;
+else
+  enable_canusb=yes
+fi
+
+
+if test "x$enable_canusb" != "xno" ; then
+		case "$host_os" in
+	linux*)
+		ac_fn_c_check_header_mongrel "$LINENO" "libusb-1.0/libusb.h" "ac_cv_header_libusb_1_0_libusb_h" "$ac_includes_default"
+if test "x$ac_cv_header_libusb_1_0_libusb_h" = xyes; then :
+
+
+$as_echo "#define PCAP_SUPPORT_CANUSB 1" >>confdefs.h
+
+		    CANUSB_SRC=pcap-canusb-linux.c
+		    LIBS="-lusb-1.0 -lpthread $LIBS"
+		    { $as_echo "$as_me:${as_lineno-$LINENO}: canusb sniffing is supported" >&5
+$as_echo "$as_me: canusb sniffing is supported" >&6;}
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: canusb sniffing is not supported; install libusb1.0 lib devel to enable it" >&5
+$as_echo "$as_me: canusb sniffing is not supported; install libusb1.0 lib devel to enable it" >&6;}
+
+fi
+
+
+		;;
+	*)
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: no canusb support implemented for $host_os" >&5
+$as_echo "$as_me: no canusb support implemented for $host_os" >&6;}
+		;;
+	esac
+
+
+fi
+
+# Check whether --enable-can was given.
+if test "${enable_can+set}" = set; then :
+  enableval=$enable_can;
+else
+  enable_can=yes
+fi
+
+
+if test "x$enable_can" != "xno" ; then
+		case "$host_os" in
+	linux*)
+		ac_fn_c_check_header_compile "$LINENO" "linux/can.h" "ac_cv_header_linux_can_h" "#include <sys/socket.h>
+
+"
+if test "x$ac_cv_header_linux_can_h" = xyes; then :
+
+$as_echo "#define PCAP_SUPPORT_CAN 1" >>confdefs.h
+
+			CAN_SRC=pcap-can-linux.c
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: CAN sniffing is supported" >&5
+$as_echo "$as_me: CAN sniffing is supported" >&6;}
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: CAN sniffing is not supported" >&5
+$as_echo "$as_me: CAN sniffing is not supported" >&6;}
+fi
+
+
+		;;
+	*)
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: no CAN sniffing support implemented for $host_os" >&5
+$as_echo "$as_me: no CAN sniffing support implemented for $host_os" >&6;}
+		;;
+	esac
+
+
+fi
+
+# Check whether --enable-dbus was given.
+if test "${enable_dbus+set}" = set; then :
+  enableval=$enable_dbus;
+else
+  enable_dbus=ifavailable
+fi
+
+
+if test "x$enable_dbus" != "xno"; then
+	if test "x$enable_dbus" = "xyes"; then
+		case "$host_os" in
+
+		darwin*)
+			#
+			# https://bugs.freedesktop.org/show_bug.cgi?id=74029
+			#
+			as_fn_error $? "Due to freedesktop.org bug 74029, D-Bus capture support is not available on OS X" "$LINENO" 5
+			;;
+		esac
+	else
+		case "$host_os" in
+
+		darwin*)
+			#
+			# https://bugs.freedesktop.org/show_bug.cgi?id=74029
+			#
+			;;
+
+		*)
+			# Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PKGCONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$PKGCONFIG"; then
+  ac_cv_prog_PKGCONFIG="$PKGCONFIG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_PKGCONFIG="pkg-config"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_prog_PKGCONFIG" && ac_cv_prog_PKGCONFIG="no"
+fi
+fi
+PKGCONFIG=$ac_cv_prog_PKGCONFIG
+if test -n "$PKGCONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
+$as_echo "$PKGCONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+			if test "x$PKGCONFIG" != "xno"; then
+				{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for D-Bus" >&5
+$as_echo_n "checking for D-Bus... " >&6; }
+				if "$PKGCONFIG" dbus-1; then
+					{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+					DBUS_CFLAGS=`"$PKGCONFIG" --cflags dbus-1`
+					DBUS_LIBS=`"$PKGCONFIG" --libs dbus-1`
+					save_CFLAGS="$CFLAGS"
+					save_LIBS="$LIBS"
+					CFLAGS="$CFLAGS $DBUS_CFLAGS"
+					LIBS="$LIBS $DBUS_LIBS"
+					{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the D-Bus library defines dbus_connection_read_write" >&5
+$as_echo_n "checking whether the D-Bus library defines dbus_connection_read_write... " >&6; }
+					cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+					     #include <time.h>
+					     #include <sys/time.h>
+
+					     #include <dbus/dbus.h>
+int
+main ()
+{
+return dbus_connection_read_write(NULL, 0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+						{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define PCAP_SUPPORT_DBUS 1" >>confdefs.h
+
+						DBUS_SRC=pcap-dbus.c
+						V_INCLS="$V_INCLS $DBUS_CFLAGS"
+
+else
+
+						{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+						if test "x$enable_dbus" = "xyes"; then
+						    as_fn_error $? "--enable-dbus was given, but the D-Bus library doesn't define dbus_connection_read_write()" "$LINENO" 5
+						fi
+						LIBS="$save_LIBS"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+					CFLAGS="$save_CFLAGS"
+				else
+					{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+					if test "x$enable_dbus" = "xyes"; then
+						as_fn_error $? "--enable-dbus was given, but the dbus-1 package is not installed" "$LINENO" 5
+					fi
+				fi
+			fi
+			;;
+		esac
+	fi
+
+
+fi
+
+case "$host_os" in
+linux*)
+	for ac_header in linux/net_tstamp.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "linux/net_tstamp.h" "ac_cv_header_linux_net_tstamp_h" "$ac_includes_default"
+if test "x$ac_cv_header_linux_net_tstamp_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LINUX_NET_TSTAMP_H 1
+_ACEOF
+
+fi
+
+done
+
+	;;
+*)
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: no hardware timestamp support implemented for $host_os" >&5
+$as_echo "$as_me: no hardware timestamp support implemented for $host_os" >&6;}
+	;;
+esac
+
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
 # incompatible versions:
@@ -7611,22 +8317,23 @@
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # OS/2's system install, which has a completely different semantic
 # ./install, which can be erroneously created by make from ./install.sh.
-{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
 if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in
-  ./ | .// | /cC/* | \
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
   /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
-  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
   /usr/ucb/* ) ;;
   *)
     # OSF1 and SCO ODT 3.0 have their own names for install.
@@ -7634,7 +8341,7 @@
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
 	  if test $ac_prog = install &&
 	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
 	    # AIX install.  It has an incompatible calling convention.
@@ -7644,17 +8351,29 @@
 	    # program-specific install script used by HP pwplus--don't use.
 	    :
 	  else
-	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	    break 3
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
 	  fi
 	fi
       done
     done
     ;;
 esac
-done
+
+  done
 IFS=$as_save_IFS
 
+rm -rf conftest.one conftest.two conftest.dir
 
 fi
   if test "${ac_cv_path_install+set}" = set; then
@@ -7667,8 +8386,8 @@
     INSTALL=$ac_install_sh
   fi
 fi
-{ echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
 
 # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
 # It thinks the first close brace ends the variable substitution.
@@ -7682,7 +8401,9 @@
 ac_config_headers="$ac_config_headers config.h"
 
 
-ac_config_files="$ac_config_files Makefile"
+ac_config_commands="$ac_config_commands default-1"
+
+ac_config_files="$ac_config_files Makefile pcap-filter.manmisc pcap-linktype.manmisc pcap-tstamp.manmisc pcap-savefile.manfile pcap.3pcap pcap_compile.3pcap pcap_datalink.3pcap pcap_dump_open.3pcap pcap_get_tstamp_precision.3pcap pcap_list_datalinks.3pcap pcap_list_tstamp_types.3pcap pcap_open_dead.3pcap pcap_open_offline.3pcap pcap_set_tstamp_precision.3pcap pcap_set_tstamp_type.3pcap"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -7711,12 +8432,13 @@
     case $ac_val in #(
     *${as_nl}*)
       case $ac_var in #(
-      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
-echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
       esac
       case $ac_var in #(
       _ | IFS | as_nl) ;; #(
-      *) $as_unset $ac_var ;;
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
       esac ;;
     esac
   done
@@ -7724,8 +8446,8 @@
   (set) 2>&1 |
     case $as_nl`(ac_space=' '; set) 2>&1` in #(
     *${as_nl}ac_space=\ *)
-      # `set' does not quote correctly, so add quotes (double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
       sed -n \
 	"s/'/'\\\\''/g;
 	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
@@ -7747,13 +8469,24 @@
      :end' >>confcache
 if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
   if test -w "$cache_file"; then
-    test "x$cache_file" != "x/dev/null" &&
-      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
-echo "$as_me: updating cache $cache_file" >&6;}
-    cat confcache >$cache_file
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
   else
-    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
-echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
   fi
 fi
 rm -f confcache
@@ -7766,14 +8499,15 @@
 
 ac_libobjs=
 ac_ltlibobjs=
+U=
 for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
   # 1. Remove the extension, and $U if already installed.
   ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
   # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
   #    will be set to the directory where LIBOBJS objects are built.
-  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
-  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
 done
 LIBOBJS=$ac_libobjs
 
@@ -7781,12 +8515,14 @@
 
 
 
-: ${CONFIG_STATUS=./config.status}
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
 ac_clean_files_save=$ac_clean_files
 ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
-echo "$as_me: creating $CONFIG_STATUS" >&6;}
-cat >$CONFIG_STATUS <<_ACEOF
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
 #! $SHELL
 # Generated by $as_me.
 # Run this file to recreate the current configuration.
@@ -7796,59 +8532,79 @@
 debug=false
 ac_cs_recheck=false
 ac_cs_silent=false
-SHELL=\${CONFIG_SHELL-$SHELL}
-_ACEOF
 
-cat >>$CONFIG_STATUS <<\_ACEOF
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
 
 # Be more Bourne compatible
 DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
   NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
 else
-  case `(set -o) 2>/dev/null` in
-  *posix*) set -o posix ;;
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
 esac
-
 fi
 
 
-
-
-# PATH needs CR
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
 
 # The user is always right.
 if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
-fi
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
 fi
 
 
@@ -7857,20 +8613,19 @@
 # there to prevent editors from complaining about space-tab.
 # (If _AS_PATH_WALK were called with IFS unset, it would disable word
 # splitting by setting IFS to empty value.)
-as_nl='
-'
 IFS=" ""	$as_nl"
 
 # Find who we are.  Look in the path if we contain no directory separator.
-case $0 in
+as_myself=
+case $0 in #((
   *[\\/]* ) as_myself=$0 ;;
   *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
 IFS=$as_save_IFS
 
      ;;
@@ -7881,32 +8636,111 @@
   as_myself=$0
 fi
 if test ! -f "$as_myself"; then
-  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  { (exit 1); exit 1; }
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
 fi
 
-# Work around bugs in pre-3.0 UWIN ksh.
-for as_var in ENV MAIL MAILPATH
-do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
 done
 PS1='$ '
 PS2='> '
 PS4='+ '
 
 # NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
-  fi
-done
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
 
-# Required to use basename.
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
 if expr a : '\(a\)' >/dev/null 2>&1 &&
    test "X`expr 00001 : '.*\(...\)'`" = X001; then
   as_expr=expr
@@ -7920,13 +8754,17 @@
   as_basename=false
 fi
 
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
 
-# Name of the executable.
 as_me=`$as_basename -- "$0" ||
 $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
 	 X"$0" : 'X\(//\)$' \| \
 	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-echo X/"$0" |
+$as_echo X/"$0" |
     sed '/^.*\/\([^/][^/]*\)\/*$/{
 	    s//\1/
 	    q
@@ -7941,595 +8779,68 @@
 	  }
 	  s/.*/./; q'`
 
-# CDPATH.
-$as_unset CDPATH
-
-
-
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
-
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line after each line using $LINENO; the second 'sed'
-  # does the real work.  The second script uses 'N' to pair each
-  # line-number line with the line containing $LINENO, and appends
-  # trailing '-' during substitution so that $LINENO is not a special
-  # case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # scripts with optimization help from Paolo Bonzini.  Blame Lee
-  # E. McMahon (1931-1989) for sed's syntax.  :-)
-  sed -n '
-    p
-    /[$]LINENO/=
-  ' <$as_myself |
-    sed '
-      s/[$]LINENO.*/&-/
-      t lineno
-      b
-      :lineno
-      N
-      :loop
-      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
-      t loop
-      s/-\n.*//
-    ' >$as_me.lineno &&
-  chmod +x "$as_me.lineno" ||
-    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
-   { (exit 1); exit 1; }; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensitive to this).
-  . "./$as_me.lineno"
-  # Exit status is that of the last command.
-  exit
-}
-
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
 
 ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in
+case `echo -n x` in #(((((
 -n*)
-  case `echo 'x\c'` in
+  case `echo 'xy\c'` in
   *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  *)   ECHO_C='\c';;
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
   esac;;
 *)
   ECHO_N='-n';;
 esac
 
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
 rm -f conf$$ conf$$.exe conf$$.file
 if test -d conf$$.dir; then
   rm -f conf$$.dir/conf$$.file
 else
   rm -f conf$$.dir
-  mkdir conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
 fi
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s='ln -s'
-  # ... but there are two gotchas:
-  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-  # In both cases, we have to default to `cp -p'.
-  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-    as_ln_s='cp -p'
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
 else
-  as_ln_s='cp -p'
+  as_ln_s='cp -pR'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
 
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
 
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-        test -d "$1/.";
-      else
-	case $1 in
-        -*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-exec 6>&1
-
-# Save the log message, to keep $[0] and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.
-ac_log="
-This file was extended by $as_me, which was
-generated by GNU Autoconf 2.61.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-on `(hostname || uname -n) 2>/dev/null | sed 1q`
-"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-# Files that config.status was made for.
-config_files="$ac_config_files"
-config_headers="$ac_config_headers"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-ac_cs_usage="\
-\`$as_me' instantiates files from templates according to the
-current configuration.
-
-Usage: $0 [OPTIONS] [FILE]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number and configuration settings, then exit
-  -q, --quiet      do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-  --file=FILE[:TEMPLATE]
-		   instantiate the configuration file FILE
-  --header=FILE[:TEMPLATE]
-		   instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Report bugs to <bug-autoconf@gnu.org>."
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-ac_cs_version="\\
-config.status
-configured by $0, generated by GNU Autoconf 2.61,
-  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
-
-Copyright (C) 2006 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-
-ac_pwd='$ac_pwd'
-srcdir='$srcdir'
-INSTALL='$INSTALL'
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-# If no file are specified by the user, then we need to provide default
-# value.  By we need to know if files were specified by the user.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=*)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  *)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
-    echo "$ac_cs_version"; exit ;;
-  --debug | --debu | --deb | --de | --d | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
-    ac_need_defaults=false;;
-  --header | --heade | --head | --hea )
-    $ac_shift
-    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
-    ac_need_defaults=false;;
-  --he | --h)
-    # Conflict between --help and --header
-    { echo "$as_me: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&2
-   { (exit 1); exit 1; }; };;
-  --help | --hel | -h )
-    echo "$ac_cs_usage"; exit ;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) { echo "$as_me: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&2
-   { (exit 1); exit 1; }; } ;;
-
-  *) ac_config_targets="$ac_config_targets $1"
-     ac_need_defaults=false ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-if \$ac_cs_recheck; then
-  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
-  CONFIG_SHELL=$SHELL
-  export CONFIG_SHELL
-  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-exec 5>>config.log
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
 {
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-  echo "$ac_log"
-} >&5
 
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-# Handling of arguments.
-for ac_config_target in $ac_config_targets
-do
-  case $ac_config_target in
-    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
-    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-
-  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
-echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
-   { (exit 1); exit 1; }; };;
-  esac
-done
-
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason against having it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Hook for its removal unless debugging.
-# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
-$debug ||
-{
-  tmp=
-  trap 'exit_status=$?
-  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
-' 0
-  trap '{ (exit 1); exit 1; }' 1 2 13 15
-}
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./conf$$-$RANDOM
-  (umask 077 && mkdir "$tmp")
-} ||
-{
-   echo "$me: cannot create a temporary directory in ." >&2
-   { (exit 1); exit 1; }
-}
-
-#
-# Set up the sed scripts for CONFIG_FILES section.
-#
-
-# No need to generate the scripts if there are no CONFIG_FILES.
-# This happens for instance when ./config.status config.h
-if test -n "$CONFIG_FILES"; then
-
-_ACEOF
-
-
-
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
-  cat >conf$$subs.sed <<_ACEOF
-SHELL!$SHELL$ac_delim
-PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
-PACKAGE_NAME!$PACKAGE_NAME$ac_delim
-PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
-PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
-PACKAGE_STRING!$PACKAGE_STRING$ac_delim
-PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
-exec_prefix!$exec_prefix$ac_delim
-prefix!$prefix$ac_delim
-program_transform_name!$program_transform_name$ac_delim
-bindir!$bindir$ac_delim
-sbindir!$sbindir$ac_delim
-libexecdir!$libexecdir$ac_delim
-datarootdir!$datarootdir$ac_delim
-datadir!$datadir$ac_delim
-sysconfdir!$sysconfdir$ac_delim
-sharedstatedir!$sharedstatedir$ac_delim
-localstatedir!$localstatedir$ac_delim
-includedir!$includedir$ac_delim
-oldincludedir!$oldincludedir$ac_delim
-docdir!$docdir$ac_delim
-infodir!$infodir$ac_delim
-htmldir!$htmldir$ac_delim
-dvidir!$dvidir$ac_delim
-pdfdir!$pdfdir$ac_delim
-psdir!$psdir$ac_delim
-libdir!$libdir$ac_delim
-localedir!$localedir$ac_delim
-mandir!$mandir$ac_delim
-DEFS!$DEFS$ac_delim
-ECHO_C!$ECHO_C$ac_delim
-ECHO_N!$ECHO_N$ac_delim
-ECHO_T!$ECHO_T$ac_delim
-LIBS!$LIBS$ac_delim
-build_alias!$build_alias$ac_delim
-host_alias!$host_alias$ac_delim
-target_alias!$target_alias$ac_delim
-build!$build$ac_delim
-build_cpu!$build_cpu$ac_delim
-build_vendor!$build_vendor$ac_delim
-build_os!$build_os$ac_delim
-host!$host$ac_delim
-host_cpu!$host_cpu$ac_delim
-host_vendor!$host_vendor$ac_delim
-host_os!$host_os$ac_delim
-target!$target$ac_delim
-target_cpu!$target_cpu$ac_delim
-target_vendor!$target_vendor$ac_delim
-target_os!$target_os$ac_delim
-SHLICC2!$SHLICC2$ac_delim
-CC!$CC$ac_delim
-CFLAGS!$CFLAGS$ac_delim
-LDFLAGS!$LDFLAGS$ac_delim
-CPPFLAGS!$CPPFLAGS$ac_delim
-ac_ct_CC!$ac_ct_CC$ac_delim
-EXEEXT!$EXEEXT$ac_delim
-OBJEXT!$OBJEXT$ac_delim
-CPP!$CPP$ac_delim
-GREP!$GREP$ac_delim
-EGREP!$EGREP$ac_delim
-LIBOBJS!$LIBOBJS$ac_delim
-V_LEX!$V_LEX$ac_delim
-V_YACC!$V_YACC$ac_delim
-RANLIB!$RANLIB$ac_delim
-V_CCOPT!$V_CCOPT$ac_delim
-V_DEFS!$V_DEFS$ac_delim
-V_INCLS!$V_INCLS$ac_delim
-V_LIBS!$V_LIBS$ac_delim
-V_PCAP!$V_PCAP$ac_delim
-V_FINDALLDEVS!$V_FINDALLDEVS$ac_delim
-V_RANLIB!$V_RANLIB$ac_delim
-SSRC!$SSRC$ac_delim
-DYEXT!$DYEXT$ac_delim
-DAGLIBS!$DAGLIBS$ac_delim
-INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
-INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
-INSTALL_DATA!$INSTALL_DATA$ac_delim
-LTLIBOBJS!$LTLIBOBJS$ac_delim
-_ACEOF
-
-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 78; then
-    break
-  elif $ac_last_try; then
-    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
-echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
-   { (exit 1); exit 1; }; }
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-
-ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
-if test -n "$ac_eof"; then
-  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
-  ac_eof=`expr $ac_eof + 1`
-fi
-
-cat >>$CONFIG_STATUS <<_ACEOF
-cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
-_ACEOF
-sed '
-s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
-s/^/s,@/; s/!/@,|#_!!_#|/
-:n
-t n
-s/'"$ac_delim"'$/,g/; t
-s/$/\\/; p
-N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
-' >>$CONFIG_STATUS <conf$$subs.sed
-rm -f conf$$subs.sed
-cat >>$CONFIG_STATUS <<_ACEOF
-:end
-s/|#_!!_#|//g
-CEOF$ac_eof
-_ACEOF
-
-
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/
-s/:*\${srcdir}:*/:/
-s/:*@srcdir@:*/:/
-s/^\([^=]*=[	 ]*\):*/\1/
-s/:*$//
-s/^[^=]*=[	 ]*$//
-}'
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-fi # test -n "$CONFIG_FILES"
-
-
-for ac_tag in  :F $CONFIG_FILES  :H $CONFIG_HEADERS
-do
-  case $ac_tag in
-  :[FHLC]) ac_mode=$ac_tag; continue;;
-  esac
-  case $ac_mode$ac_tag in
-  :[FHL]*:*);;
-  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
-echo "$as_me: error: Invalid tag $ac_tag." >&2;}
-   { (exit 1); exit 1; }; };;
-  :[FH]-) ac_tag=-:-;;
-  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
-  esac
-  ac_save_IFS=$IFS
-  IFS=:
-  set x $ac_tag
-  IFS=$ac_save_IFS
-  shift
-  ac_file=$1
-  shift
-
-  case $ac_mode in
-  :L) ac_source=$1;;
-  :[FH])
-    ac_file_inputs=
-    for ac_f
-    do
-      case $ac_f in
-      -) ac_f="$tmp/stdin";;
-      *) # Look for the file first in the build tree, then in the source tree
-	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
-	 # because $ac_f cannot contain `:'.
-	 test -f "$ac_f" ||
-	   case $ac_f in
-	   [\\/$]*) false;;
-	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
-	   esac ||
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
-echo "$as_me: error: cannot find input file: $ac_f" >&2;}
-   { (exit 1); exit 1; }; };;
-      esac
-      ac_file_inputs="$ac_file_inputs $ac_f"
-    done
-
-    # Let's still pretend it is `configure' which instantiates (i.e., don't
-    # use $as_me), people would be surprised to read:
-    #    /* config.h.  Generated by config.status.  */
-    configure_input="Generated from "`IFS=:
-	  echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
-    if test x"$ac_file" != x-; then
-      configure_input="$ac_file.  $configure_input"
-      { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-    fi
-
-    case $ac_tag in
-    *:-:* | *:-) cat >"$tmp/stdin";;
-    esac
-    ;;
-  esac
-
-  ac_dir=`$as_dirname -- "$ac_file" ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  { as_dir="$ac_dir"
   case $as_dir in #(
   -*) as_dir=./$as_dir;;
   esac
-  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+  test -d "$as_dir" || eval $as_mkdir_p || {
     as_dirs=
     while :; do
       case $as_dir in #(
-      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
       *) as_qdir=$as_dir;;
       esac
       as_dirs="'$as_qdir' $as_dirs"
@@ -8538,7 +8849,7 @@
 	 X"$as_dir" : 'X\(//\)[^/]' \| \
 	 X"$as_dir" : 'X\(//\)$' \| \
 	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$as_dir" |
+$as_echo X"$as_dir" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -8559,17 +8870,669 @@
       test -d "$as_dir" && break
     done
     test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
-echo "$as_me: error: cannot create directory $as_dir" >&2;}
-   { (exit 1); exit 1; }; }; }
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to the package provider."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.69,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "pcap-filter.manmisc") CONFIG_FILES="$CONFIG_FILES pcap-filter.manmisc" ;;
+    "pcap-linktype.manmisc") CONFIG_FILES="$CONFIG_FILES pcap-linktype.manmisc" ;;
+    "pcap-tstamp.manmisc") CONFIG_FILES="$CONFIG_FILES pcap-tstamp.manmisc" ;;
+    "pcap-savefile.manfile") CONFIG_FILES="$CONFIG_FILES pcap-savefile.manfile" ;;
+    "pcap.3pcap") CONFIG_FILES="$CONFIG_FILES pcap.3pcap" ;;
+    "pcap_compile.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_compile.3pcap" ;;
+    "pcap_datalink.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_datalink.3pcap" ;;
+    "pcap_dump_open.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_dump_open.3pcap" ;;
+    "pcap_get_tstamp_precision.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_get_tstamp_precision.3pcap" ;;
+    "pcap_list_datalinks.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_list_datalinks.3pcap" ;;
+    "pcap_list_tstamp_types.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_list_tstamp_types.3pcap" ;;
+    "pcap_open_dead.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_open_dead.3pcap" ;;
+    "pcap_open_offline.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_open_offline.3pcap" ;;
+    "pcap_set_tstamp_precision.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_set_tstamp_precision.3pcap" ;;
+    "pcap_set_tstamp_type.3pcap") CONFIG_FILES="$CONFIG_FILES pcap_set_tstamp_type.3pcap" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
   ac_builddir=.
 
 case "$ac_dir" in
 .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
 *)
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
   # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
   case $ac_top_builddir_sub in
   "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
   *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -8609,12 +9572,12 @@
   esac
 _ACEOF
 
-cat >>$CONFIG_STATUS <<\_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # If the template does not know about datarootdir, expand it.
 # FIXME: This hack should be removed a few years after 2.60.
 ac_datarootdir_hack=; ac_datarootdir_seen=
-
-case `sed -n '/datarootdir/ {
+ac_sed_dataroot='
+/datarootdir/ {
   p
   q
 }
@@ -8622,36 +9585,37 @@
 /@docdir@/p
 /@infodir@/p
 /@localedir@/p
-/@mandir@/p
-' $ac_file_inputs` in
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
 *datarootdir*) ac_datarootdir_seen=yes;;
 *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
-  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
 _ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
   ac_datarootdir_hack='
   s&@datadir@&$datadir&g
   s&@docdir@&$docdir&g
   s&@infodir@&$infodir&g
   s&@localedir@&$localedir&g
   s&@mandir@&$mandir&g
-    s&\\\${datarootdir}&$datarootdir&g' ;;
+  s&\\\${datarootdir}&$datarootdir&g' ;;
 esac
 _ACEOF
 
 # Neutralize VPATH when `$srcdir' = `.'.
 # Shell code in configure.ac might set extrasub.
 # FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF
-  sed "$ac_vpsub
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
 $extrasub
 _ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 :t
 /@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s&@configure_input@&$configure_input&;t t
+s|@configure_input@|$ac_sed_conf_input|;t t
 s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
 s&@srcdir@&$ac_srcdir&;t t
 s&@abs_srcdir@&$ac_abs_srcdir&;t t
 s&@top_srcdir@&$ac_top_srcdir&;t t
@@ -8661,132 +9625,75 @@
 s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
 s&@INSTALL@&$ac_INSTALL&;t t
 $ac_datarootdir_hack
-" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
 
 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
-  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
-  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&5
-echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&2;}
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
 
-  rm -f "$tmp/stdin"
+  rm -f "$ac_tmp/stdin"
   case $ac_file in
-  -) cat "$tmp/out"; rm -f "$tmp/out";;
-  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
-  esac
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
  ;;
   :H)
   #
   # CONFIG_HEADER
   #
-_ACEOF
-
-# Transform confdefs.h into a sed script `conftest.defines', that
-# substitutes the proper values into config.h.in to produce config.h.
-rm -f conftest.defines conftest.tail
-# First, append a space to every undef/define line, to ease matching.
-echo 's/$/ /' >conftest.defines
-# Then, protect against being on the right side of a sed subst, or in
-# an unquoted here document, in config.status.  If some macros were
-# called several times there might be several #defines for the same
-# symbol, which is useless.  But do not sort them, since the last
-# AC_DEFINE must be honored.
-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
-# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
-# NAME is the cpp macro being defined, VALUE is the value it is being given.
-# PARAMS is the parameter list in the macro definition--in most cases, it's
-# just an empty string.
-ac_dA='s,^\\([	 #]*\\)[^	 ]*\\([	 ]*'
-ac_dB='\\)[	 (].*,\\1define\\2'
-ac_dC=' '
-ac_dD=' ,'
-
-uniq confdefs.h |
-  sed -n '
-	t rset
-	:rset
-	s/^[	 ]*#[	 ]*define[	 ][	 ]*//
-	t ok
-	d
-	:ok
-	s/[\\&,]/\\&/g
-	s/^\('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
-	s/^\('"$ac_word_re"'\)[	 ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
-  ' >>conftest.defines
-
-# Remove the space that was appended to ease matching.
-# Then replace #undef with comments.  This is necessary, for
-# example, in the case of _POSIX_SOURCE, which is predefined and required
-# on some systems where configure will not decide to define it.
-# (The regexp can be short, since the line contains either #define or #undef.)
-echo 's/ $//
-s,^[	 #]*u.*,/* & */,' >>conftest.defines
-
-# Break up conftest.defines:
-ac_max_sed_lines=50
-
-# First sed command is:	 sed -f defines.sed $ac_file_inputs >"$tmp/out1"
-# Second one is:	 sed -f defines.sed "$tmp/out1" >"$tmp/out2"
-# Third one will be:	 sed -f defines.sed "$tmp/out2" >"$tmp/out1"
-# et cetera.
-ac_in='$ac_file_inputs'
-ac_out='"$tmp/out1"'
-ac_nxt='"$tmp/out2"'
-
-while :
-do
-  # Write a here document:
-    cat >>$CONFIG_STATUS <<_ACEOF
-    # First, check the format of the line:
-    cat >"\$tmp/defines.sed" <<\\CEOF
-/^[	 ]*#[	 ]*undef[	 ][	 ]*$ac_word_re[	 ]*\$/b def
-/^[	 ]*#[	 ]*define[	 ][	 ]*$ac_word_re[(	 ]/b def
-b
-:def
-_ACEOF
-  sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
-  echo 'CEOF
-    sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
-  ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
-  sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
-  grep . conftest.tail >/dev/null || break
-  rm -f conftest.defines
-  mv conftest.tail conftest.defines
-done
-rm -f conftest.defines conftest.tail
-
-echo "ac_result=$ac_in" >>$CONFIG_STATUS
-cat >>$CONFIG_STATUS <<\_ACEOF
   if test x"$ac_file" != x-; then
-    echo "/* $configure_input  */" >"$tmp/config.h"
-    cat "$ac_result" >>"$tmp/config.h"
-    if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
-      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
-echo "$as_me: $ac_file is unchanged" >&6;}
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
     else
-      rm -f $ac_file
-      mv "$tmp/config.h" $ac_file
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
     fi
   else
-    echo "/* $configure_input  */"
-    cat "$ac_result"
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
   fi
-  rm -f "$tmp/out12"
  ;;
 
-
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
   esac
 
+
+  case $ac_file$ac_mode in
+    "default-1":C) if test -f .devel; then
+	echo timestamp > stamp-h
+	cat Makefile-devel-adds >> Makefile
+	make depend
+fi ;;
+
+  esac
 done # for ac_tag
 
 
-{ (exit 0); exit 0; }
+as_fn_exit 0
 _ACEOF
-chmod +x $CONFIG_STATUS
 ac_clean_files=$ac_clean_files_save
 
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
 
 # configure is writing to config.log, and then calls config.status.
 # config.status does its own redirection, appending to config.log.
@@ -8806,11 +9713,11 @@
   exec 5>>config.log
   # Use ||, not &&, to avoid exiting from the if with $? = 1, which
   # would make configure fail if this is the last instruction.
-  $ac_cs_success || { (exit 1); exit 1; }
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
-
-if test -f .devel ; then
-	make depend
-fi
 exit 0
diff --git a/configure.in b/configure.in
index 5cd8b14..3566f82 100644
--- a/configure.in
+++ b/configure.in
@@ -1,4 +1,4 @@
-dnl @(#) $Header: /tcpdump/master/libpcap/configure.in,v 1.120.2.13 2007/09/12 19:17:24 guy Exp $ (LBL)
+dnl @(#) $Header: /tcpdump/master/libpcap/configure.in,v 1.168 2008-12-23 20:49:26 guy Exp $ (LBL)
 dnl
 dnl Copyright (c) 1994, 1995, 1996, 1997
 dnl	The Regents of the University of California.  All rights reserved.
@@ -6,30 +6,129 @@
 dnl Process this file with autoconf to produce a configure script.
 dnl
 
-AC_REVISION($Revision: 1.120.2.13 $)
-AC_PREREQ(2.50)
+#
+# See
+#
+#	http://ftp.gnu.org/gnu/config/README
+#
+# for the URLs to use to fetch new versions of config.guess and
+# config.sub.
+#
+
+AC_PREREQ(2.61)
 AC_INIT(pcap.c)
 
 AC_CANONICAL_SYSTEM
 
-AC_LBL_C_INIT(V_CCOPT, V_INCLS, V_LIBS)
+AC_LBL_C_INIT_BEFORE_CC(V_CCOPT, V_INCLS)
+AC_PROG_CC
+AC_LBL_C_INIT(V_CCOPT, V_INCLS)
+AC_LBL_SHLIBS_INIT
 AC_LBL_C_INLINE
 AC_C___ATTRIBUTE__
+if test "$ac_cv___attribute__" = "yes"; then
+	AC_C___ATTRIBUTE___UNUSED
+	AC_C___ATTRIBUTE___FORMAT
+fi
 
-AC_LBL_CHECK_TYPE(u_int8_t, u_char)
-AC_LBL_CHECK_TYPE(u_int16_t, u_short)
-AC_LBL_CHECK_TYPE(u_int32_t, u_int)
+AC_CHECK_HEADERS(sys/bitypes.h)
+
+AC_CHECK_TYPE([int8_t], ,
+	[AC_DEFINE([int8_t], [signed char],
+	[Define to `signed char' if int8_t not defined.])],
+	[AC_INCLUDES_DEFAULT
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif])
+AC_CHECK_TYPE([u_int8_t], ,
+	[AC_DEFINE([u_int8_t], [unsigned char],
+	[Define to `unsigned char' if u_int8_t not defined.])],
+	[AC_INCLUDES_DEFAULT
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif])
+AC_CHECK_TYPE([int16_t], ,
+	[AC_DEFINE([int16_t], [short],
+	[Define to `short' if int16_t not defined.])]
+	[AC_INCLUDES_DEFAULT
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif])
+AC_CHECK_TYPE([u_int16_t], ,
+	[AC_DEFINE([u_int16_t], [unsigned short],
+	[Define to `unsigned short' if u_int16_t not defined.])],
+	[AC_INCLUDES_DEFAULT
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif])
+AC_CHECK_TYPE([int32_t], ,
+	[AC_DEFINE([int32_t], [int],
+	[Define to `int' if int32_t not defined.])],
+	[AC_INCLUDES_DEFAULT
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif])
+AC_CHECK_TYPE([u_int32_t], ,
+	[AC_DEFINE([u_int32_t], [unsigned int],
+	[Define to `unsigned int' if u_int32_t not defined.])],
+	[AC_INCLUDES_DEFAULT
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif])
+AC_CHECK_TYPE([int64_t], ,
+	[AC_DEFINE([int64_t], [long long],
+	[Define to `long long' if int64_t not defined.])],
+	[AC_INCLUDES_DEFAULT
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif])
+AC_CHECK_TYPE([u_int64_t], ,
+	[AC_DEFINE([u_int64_t], [unsigned long long],
+	[Define to `unsigned long long' if u_int64_t not defined.])],
+	[AC_INCLUDES_DEFAULT
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif])
+
+#
+# Try to arrange for large file support.
+#
+AC_SYS_LARGEFILE
+AC_FUNC_FSEEKO
 
 dnl
-dnl libpcap doesn't itself use <sys/ioccom.h>; however, the test program
-dnl in "AC_LBL_FIXINCLUDES" in "aclocal.m4" uses it, so we have to
-dnl test for it and set "HAVE_SYS_IOCCOM_H" if we have it, otherwise
-dnl "AC_LBL_FIXINCLUDES" won't work on some platforms such as Solaris.
+dnl Even if <net/bpf.h> were, on all OSes that support BPF, fixed to
+dnl include <sys/ioccom.h>, and we were to drop support for older
+dnl releases without that fix, so that pcap-bpf.c doesn't need to
+dnl include <sys/ioccom.h>, the test program in "AC_LBL_FIXINCLUDES"
+dnl in "aclocal.m4" uses it, so we would still have to test for it
+dnl and set "HAVE_SYS_IOCCOM_H" if we have it, otherwise
+dnl "AC_LBL_FIXINCLUDES" wouldn't work on some platforms such as Solaris.
 dnl
 AC_CHECK_HEADERS(sys/ioccom.h sys/sockio.h limits.h paths.h)
+AC_CHECK_HEADERS(linux/types.h)
+AC_CHECK_HEADERS(linux/if_packet.h netpacket/packet.h netpacket/if_packet.h)
 AC_CHECK_HEADERS(net/pfvar.h, , , [#include <sys/types.h>
 #include <sys/socket.h>
 #include <net/if.h>])
+if test "$ac_cv_header_net_pfvar_h" = yes; then
+	#
+	# Check for various PF actions.
+	#
+	AC_MSG_CHECKING(whether net/pfvar.h defines PF_NAT through PF_NORDR)
+	AC_TRY_COMPILE(
+	    [#include <sys/types.h>
+	    #include <sys/socket.h>
+	    #include <net/if.h>
+	    #include <net/pfvar.h>],
+	    [return PF_NAT+PF_NONAT+PF_BINAT+PF_NOBINAT+PF_RDR+PF_NORDR;],
+	    [
+		AC_MSG_RESULT(yes)
+		AC_DEFINE(HAVE_PF_NAT_THROUGH_PF_NORDR, 1,
+		    [define if net/pfvar.h defines PF_NAT through PF_NORDR])
+	    ],
+	    AC_MSG_RESULT(no))
+fi
 AC_CHECK_HEADERS(netinet/if_ether.h, , , [#include <sys/types.h>
 #include <sys/socket.h>])
 if test "$ac_cv_header_netinet_if_ether_h" != yes; then
@@ -58,7 +157,7 @@
 AC_CHECK_FUNCS(vsnprintf snprintf,,
 	[needsnprintf=yes])
 if test $needsnprintf = yes; then
-	AC_LIBOBJ(snprintf)
+	AC_LIBOBJ([snprintf])
 fi
 
 #
@@ -160,7 +259,8 @@
 
 dnl to pacify those who hate protochain insn
 AC_MSG_CHECKING(if --disable-protochain option is specified)
-AC_ARG_ENABLE(protochain, [  --disable-protochain    disable \"protochain\" insn])
+AC_ARG_ENABLE(protochain,
+AC_HELP_STRING([--disable-protochain],[disable \"protochain\" insn]))
 case "x$enable_protochain" in
 xyes)	enable_protochain=enabled	;;
 xno)	enable_protochain=disabled	;;
@@ -172,6 +272,21 @@
 fi
 AC_MSG_RESULT(${enable_protochain})
 
+#
+# SITA support is mutually exclusive with native capture support;
+# "--with-sita" selects SITA support.
+#
+AC_ARG_WITH(sita,
+AC_HELP_STRING([--with-sita],[include SITA support]),
+[
+	if test ! "x$withval" = "xno" ; then
+		AC_DEFINE(SITA,1,[include ACN support])
+		AC_MSG_NOTICE(Enabling SITA ACN support)
+		V_PCAP=sita
+		V_FINDALLDEVS=sita
+	fi
+],
+[
 dnl
 dnl Not all versions of test support -c (character special) but it's a
 dnl better way of testing since the device might be protected. So we
@@ -183,11 +298,12 @@
 if test -z "$with_pcap" && test "$cross_compiling" = yes; then
 	AC_MSG_ERROR(pcap type not determined when cross-compiling; use --with-pcap=...)
 fi
-AC_ARG_WITH(pcap, [  --with-pcap=TYPE        use packet capture TYPE])
+AC_ARG_WITH(pcap,
+AC_HELP_STRING([--with-pcap=TYPE],[use packet capture TYPE]))
 AC_MSG_CHECKING(packet capture type)
 if test ! -z "$with_pcap" ; then
 	V_PCAP="$withval"
-elif test -r /dev/bpf ; then
+elif test -r /dev/bpf -o -h /dev/bpf ; then
 	#
 	# Cloning BPF device.
 	#
@@ -214,10 +330,10 @@
 	# We check for odmi.h instead.
 	#
 	V_PCAP=bpf
-elif test -r /usr/include/sys/dlpi.h ; then
-	V_PCAP=dlpi
 elif test -c /dev/bpf0 ; then		# check again in case not readable
 	V_PCAP=bpf
+elif test -r /usr/include/sys/dlpi.h ; then
+	V_PCAP=dlpi
 elif test -c /dev/enet ; then		# check again in case not readable
 	V_PCAP=enet
 elif test -c /dev/nit ; then		# check again in case not readable
@@ -227,6 +343,231 @@
 fi
 AC_MSG_RESULT($V_PCAP)
 
+#
+# Do capture-mechanism-dependent tests.
+#
+case "$V_PCAP" in
+dlpi)
+	#
+	# Needed for common functions used by pcap-[dlpi,libdlpi].c
+	#
+ 	SSRC="dlpisubs.c"
+
+	#
+	# Checks for some header files.
+	#
+	AC_CHECK_HEADERS(sys/bufmod.h sys/dlpi_ext.h)
+
+	#
+	# Checks to see if Solaris has the public libdlpi(3LIB) library.
+	# Note: The existence of /usr/include/libdlpi.h does not mean it is the
+	# public libdlpi(3LIB) version. Before libdlpi was made public, a 
+	# private version also existed, which did not have the same APIs. 
+	# Due to a gcc bug, the default search path for 32-bit libraries does
+	# not include /lib, we add it explicitly here.
+	# [http://bugs.opensolaris.org/view_bug.do?bug_id=6619485]. 
+	# Also, due to the bug above applications that link to libpcap with
+	# libdlpi will have to add "-L/lib" option to "configure".
+	#
+	saved_ldflags=$LDFLAGS
+	LDFLAGS="$LIBS -L/lib"
+	AC_CHECK_LIB(dlpi, dlpi_walk,
+		[
+			LIBS="-ldlpi $LIBS"
+			V_PCAP=libdlpi
+			AC_DEFINE(HAVE_LIBDLPI,1,[if libdlpi exists])
+		],
+		V_PCAP=dlpi)
+	LDFLAGS=$saved_ldflags
+
+	#
+	# Checks whether <sys/dlpi.h> is usable, to catch weird SCO
+	# versions of DLPI.
+	#
+	AC_MSG_CHECKING(whether <sys/dlpi.h> is usable)
+	AC_CACHE_VAL(ac_cv_sys_dlpi_usable,
+		AC_TRY_COMPILE(
+		    [
+			#include <sys/types.h>
+			#include <sys/time.h>
+			#include <sys/dlpi.h>
+		    ],
+		    [int i = DL_PROMISC_PHYS;],
+		    ac_cv_sys_dlpi_usable=yes,
+		    ac_cv_sys_dlpi_usable=no))
+	AC_MSG_RESULT($ac_cv_sys_dlpi_usable)
+	if test $ac_cv_sys_dlpi_usable = no ; then
+		AC_MSG_ERROR(<sys/dlpi.h> is not usable on this system; it probably has a non-standard DLPI)
+	fi
+
+	#
+	# Check whether we have a /dev/dlpi device or have multiple devices.
+	#
+	AC_MSG_CHECKING(for /dev/dlpi device)
+	if test -c /dev/dlpi ; then
+		AC_MSG_RESULT(yes)
+		AC_DEFINE(HAVE_DEV_DLPI, 1, [define if you have a /dev/dlpi])
+	else
+		AC_MSG_RESULT(no)
+		dir="/dev/dlpi"
+		AC_MSG_CHECKING(for $dir directory)
+		if test -d $dir ; then
+			AC_MSG_RESULT(yes)
+			AC_DEFINE_UNQUOTED(PCAP_DEV_PREFIX, "$dir", [/dev/dlpi directory])
+		else
+			AC_MSG_RESULT(no)
+		fi
+	fi
+
+	#
+	# This check is for Solaris with DLPI support for passive modes.
+	# See dlpi(7P) for more details.
+	#
+	AC_LBL_DL_PASSIVE_REQ_T
+	;;
+
+linux)
+	#
+	# Do we have the wireless extensions?
+	#
+	AC_CHECK_HEADERS(linux/wireless.h, [], [],
+	[
+#include <sys/socket.h>
+#include <linux/if.h>
+#include <linux/types.h>
+	])
+
+	#
+	# Do we have libnl?
+	#
+	AC_ARG_WITH(libnl,
+	AC_HELP_STRING([--without-libnl],[disable libnl support @<:@default=yes, on Linux, if present@:>@]),
+		with_libnl=$withval,,)
+
+	if test x$with_libnl != xno ; then
+		have_any_nl="no"
+
+		#
+		# Try libnl 3.x first.
+		#
+		AC_CHECK_LIB(nl-3, nl_socket_alloc,
+		[
+			#
+			# Yes, we have libnl 3.x.
+			#
+			LIBS="-lnl-genl-3 -lnl-3 $LIBS"
+			AC_DEFINE(HAVE_LIBNL,1,[if libnl exists])
+			AC_DEFINE(HAVE_LIBNL_3_x,1,[if libnl exists and is version 3.x])
+			AC_DEFINE(HAVE_LIBNL_NLE,1,[libnl has NLE_FAILURE])
+			AC_DEFINE(HAVE_LIBNL_SOCKETS,1,[libnl has new-style socket api])
+			V_INCLS="$V_INCLS -I/usr/include/libnl3"
+			have_any_nl="yes"
+		])
+
+		if test x$have_any_nl = xno ; then
+			#
+			# Try libnl 2.x
+			#
+			AC_CHECK_LIB(nl, nl_socket_alloc,
+			[
+				#
+				# Yes, we have libnl 2.x.
+				#
+				LIBS="-lnl-genl -lnl $LIBS"
+				AC_DEFINE(HAVE_LIBNL,1,[if libnl exists])
+				AC_DEFINE(HAVE_LIBNL_2_x,1,[if libnl exists and is version 2.x])
+				AC_DEFINE(HAVE_LIBNL_NLE,1,[libnl has NLE_FAILURE])
+				AC_DEFINE(HAVE_LIBNL_SOCKETS,1,[libnl has new-style socket api])
+				have_any_nl="yes"
+			])
+		fi
+
+		if test x$have_any_nl = xno ; then
+			#
+			# No, we don't; do we have libnl 1.x?
+			#
+			AC_CHECK_LIB(nl, nl_handle_alloc,
+			[
+				#
+				# Yes.
+				#
+				LIBS="-lnl $LIBS"
+				AC_DEFINE(HAVE_LIBNL,1,[if libnl exists])
+				have_any_nl="yes"
+			])
+		fi
+
+		if test x$have_any_nl = xno ; then
+			#
+			# No, we don't have libnl at all.
+			#
+			if test x$with_libnl = xyes ; then
+				AC_MSG_ERROR([libnl support requested but libnl not found])
+			fi
+		fi
+	fi
+
+	AC_CHECK_HEADERS(linux/ethtool.h,,,
+	    [
+AC_INCLUDES_DEFAULT
+#include <linux/types.h>
+	    ])
+	AC_LBL_TPACKET_STATS
+	AC_LBL_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI
+	;;
+
+bpf)
+	#
+	# Check whether we have the *BSD-style ioctls.
+	#
+	AC_CHECK_HEADERS(net/if_media.h)
+
+	AC_MSG_CHECKING(whether the system supports zerocopy BPF)
+	AC_TRY_COMPILE(
+	    [#include <sys/socket.h>
+	    #include <sys/ioctl.h>
+	    #include <net/if.h>
+	    #include <net/bpf.h>],
+	    [return (BIOCROTZBUF + BPF_BUFMODE_ZBUF);],
+	    [  
+		AC_MSG_RESULT(yes)
+		AC_DEFINE(HAVE_ZEROCOPY_BPF, 1,
+		[define if the system supports zerocopy BPF])
+	    ],
+	    AC_MSG_RESULT(no))
+
+	    #
+	    # Check whether we have struct BPF_TIMEVAL.
+	    #
+	    AC_CHECK_TYPES(struct BPF_TIMEVAL,,,
+		[
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#ifdef HAVE_SYS_IOCCOM_H
+#include <sys/ioccom.h>
+#endif
+#include <net/bpf.h>
+		    ])
+	;;
+
+dag)
+	V_DEFS="$V_DEFS -DDAG_ONLY"
+	;;
+
+septel)
+	V_DEFS="$V_DEFS -DSEPTEL_ONLY"
+	;;
+
+snf)
+	V_DEFS="$V_DEFS -DSNF_ONLY"
+	;;
+
+null)
+	AC_MSG_WARN(cannot determine packet capture interface)
+	AC_MSG_WARN((see the INSTALL doc for more info))
+	;;
+esac
+
 dnl
 dnl Now figure out how we get a list of interfaces and addresses,
 dnl if we support capturing.  Don't bother if we don't support
@@ -273,7 +614,7 @@
 		#
 		case "$V_PCAP" in
 
-		dlpi)
+		dlpi|libdlpi)
 			#
 			# This might be Solaris 8 or later, with
 			# SIOCGLIFCONF, or it might be some other OS
@@ -310,97 +651,56 @@
 			;;
 		esac])
 fi
+])
 
-AC_MSG_CHECKING(if --enable-ipv6 option is specified)
-AC_ARG_ENABLE(ipv6, [  --enable-ipv6           build IPv6-capable version])
-if test "$enable_ipv6" = "yes"; then
-	AC_DEFINE(INET6,1,[IPv6])
+AC_MSG_CHECKING(for socklen_t)
+AC_TRY_COMPILE([
+	#include <sys/types.h>
+	#include <sys/socket.h>
+	],
+	[ socklen_t x; ],
+	have_socklen_t=yes,
+	have_socklen_t=no)
+if test "x$have_socklen_t" = "xyes"; then
+	AC_DEFINE(HAVE_SOCKLEN_T, 1, [define if socklen_t is defined])
 fi
-AC_MSG_RESULT(${enable_ipv6-no})
+AC_MSG_RESULT($have_socklen_t)
+
+AC_ARG_ENABLE(ipv6,
+AC_HELP_STRING([--enable-ipv6],[build IPv6-capable version @<:@default=yes, if getaddrinfo available@:>@]),
+    [],
+    [enable_ipv6=ifavailable])
+if test "$enable_ipv6" != "no"; then
+	AC_CHECK_FUNC(getaddrinfo,
+	    [
+		AC_DEFINE(INET6,1,[IPv6])
+	    ],
+	    [
+		if test "$enable_ipv6" != "ifavailable"; then
+			AC_MSG_FAILURE([--enable-ipv6 was given, but getaddrinfo isn't available])
+		fi
+	    ])
+fi
 
 AC_MSG_CHECKING(whether to build optimizer debugging code)
-AC_ARG_ENABLE(optimizer-dbg, [  --enable-optimizer-dbg  build optimizer debugging code])
+AC_ARG_ENABLE(optimizer-dbg,
+AC_HELP_STRING([--enable-optimizer-dbg],[build optimizer debugging code]))
 if test "$enable_optimizer_dbg" = "yes"; then
 	AC_DEFINE(BDEBUG,1,[Enable optimizer debugging])
 fi
 AC_MSG_RESULT(${enable_optimizer_dbg-no})
 
 AC_MSG_CHECKING(whether to build parser debugging code)
-AC_ARG_ENABLE(yydebug, [  --enable-yydebug        build parser debugging code])
+AC_ARG_ENABLE(yydebug,
+AC_HELP_STRING([--enable-yydebug],[build parser debugging code]))
 if test "$enable_yydebug" = "yes"; then
 	AC_DEFINE(YYDEBUG,1,[Enable parser debugging])
 fi
 AC_MSG_RESULT(${enable_yydebug-no})
 
-case "$V_PCAP" in
-
-dlpi)
-	AC_CHECK_HEADERS(sys/bufmod.h sys/dlpi_ext.h)
-	AC_MSG_CHECKING(for /dev/dlpi device)
-	if test -c /dev/dlpi ; then
-		AC_MSG_RESULT(yes)
-		AC_DEFINE(HAVE_DEV_DLPI, 1, [define if you have a /dev/dlpi])
-	else
-		AC_MSG_RESULT(no)
-		dir="/dev/dlpi"
-		AC_MSG_CHECKING(for $dir directory)
-		if test -d $dir ; then
-			AC_MSG_RESULT(yes)
-			AC_DEFINE_UNQUOTED(PCAP_DEV_PREFIX, "$dir", [/dev/dlpi directory])
-		else
-			AC_MSG_RESULT(no)
-		fi
-	fi
-	;;
-
-linux)
-	AC_MSG_CHECKING(Linux kernel version)
- 	if test "$cross_compiling" = yes; then
- 		AC_CACHE_VAL(ac_cv_linux_vers,
- 		    ac_cv_linux_vers=unknown)
- 	else
- 		AC_CACHE_VAL(ac_cv_linux_vers,
- 		    ac_cv_linux_vers=`uname -r 2>&1 | \
- 			sed -n -e '$s/.* //' -e '$s/\..*//p'`)
- 	fi
-	AC_MSG_RESULT($ac_cv_linux_vers)
- 	if test $ac_cv_linux_vers = unknown ; then
- 		AC_MSG_ERROR(cannot determine linux version when cross-compiling)
- 	fi
-	if test $ac_cv_linux_vers -lt 2 ; then
-		AC_MSG_ERROR(version 2 or higher required; see the INSTALL doc for more info)
-	fi
-	AC_LBL_TPACKET_STATS
-	;;
-
-dag)
-	V_DEFS="$V_DEFS -DDAG_ONLY"
-	;;
-
-septel)
-	V_DEFS="$V_DEFS -DSEPTEL_ONLY"
-	;;
-
-null)
-	AC_MSG_WARN(cannot determine packet capture interface)
-	AC_MSG_WARN((see the INSTALL doc for more info))
-	;;
-
-esac
-
-AC_MSG_CHECKING(whether we have /proc/net/dev)
-if test -r /proc/net/dev ; then
-	ac_cv_lbl_proc_net_dev=yes
-else
-	ac_cv_lbl_proc_net_dev=no
-fi
-if test $ac_cv_lbl_proc_net_dev = yes; then
-	AC_DEFINE(HAVE_PROC_NET_DEV, 1, [define if you have a /proc/net/dev])
-fi
-AC_MSG_RESULT($ac_cv_lbl_proc_net_dev)
-
 # Check for Endace DAG card support.
-AC_ARG_WITH([dag], [  --with-dag[[=DIR]]        include Endace DAG support ("yes", "no" or DIR; default="yes" on BSD and Linux if present)],
+AC_ARG_WITH([dag],
+AC_HELP_STRING([--with-dag@<:@=DIR@:>@],[include Endace DAG support @<:@"yes", "no" or DIR; default="yes" on BSD and Linux if present@:>@]),
 [
 	if test "$withval" = no
 	then
@@ -422,14 +722,16 @@
 	want_dag=ifpresent
 ])
 
-AC_ARG_WITH([dag-includes], [  --with-dag-includes=DIR   Endace DAG include directory],
+AC_ARG_WITH([dag-includes],
+AC_HELP_STRING([--with-dag-includes=DIR],[Endace DAG include directory]),
 [
 	# User wants DAG support and has specified a header directory, so use the provided value.
 	want_dag=yes
 	dag_include_dir=$withval
 ],[])
 
-AC_ARG_WITH([dag-libraries], [  --with-dag-libraries=DIR  Endace DAG library directory],
+AC_ARG_WITH([dag-libraries],
+AC_HELP_STRING([--with-dag-libraries=DIR],[Endace DAG library directory]),
 [
 	# User wants DAG support and has specified a library directory, so use the provided value.
 	want_dag=yes
@@ -478,7 +780,7 @@
 	
 	if test -z "$dag_tools_dir"; then
 	    dag_tools_dir="$dag_root/tools"
-		fi
+	fi
 
 	if test -r $dag_include_dir/dagapi.h; then
 		ac_cv_lbl_dag_api=yes
@@ -487,100 +789,8 @@
 fi
 
 if test $ac_cv_lbl_dag_api = yes; then
-
-	AC_MSG_CHECKING([dagapi.o])	
-	dagapi_obj=no
-	if test -r $dag_tools_dir/dagapi.o; then
-		# 2.4.x.
-		dagapi_obj=$dag_tools_dir/dagapi.o
-	elif test -r $dag_lib_dir/dagapi.o; then
-		# 2.5.x.
-		dagapi_obj=$dag_lib_dir/dagapi.o
-	elif test -r $dag_lib_dir/libdag.a; then
-		# 2.5.x.
-		ar x $dag_lib_dir/libdag.a dagapi.o
-		if test -r ./dagapi.o; then
-		    dagapi_obj=./dagapi.o
-		else
-		    ar x $dag_lib_dir/libdag.a libdag_la-dagapi.o
-		    if test -r ./libdag_la-dagapi.o; then
-		       dagapi_obj=./libdag_la-dagapi.o
-		    fi		
-		fi
-	fi
-
-	if test $dagapi_obj = no; then
-		AC_MSG_RESULT([no (checked $dag_lib_dir  $dag_tools_dir  $dag_lib_dir/libdag.a)])
-			ac_cv_lbl_dag_api=no
-	else
-		AC_MSG_RESULT([yes ($dagapi_obj)])
-	fi
-fi
-
-if test $ac_cv_lbl_dag_api = yes; then
-
-	AC_MSG_CHECKING([dagopts.o])	
-	dagopts_obj=no
-	if test -r $dag_tools_dir/dagopts.o; then
-		# 2.4.x.
-		dagopts_obj=$dag_tools_dir/dagopts.o
-	elif test -r $dag_lib_dir/dagopts.o; then
-		# 2.5.x.
-		dagopts_obj=$dag_lib_dir/dagopts.o
-	elif test -r $dag_lib_dir/libdag.a; then
-		# 2.5.x.
-		ar x $dag_lib_dir/libdag.a dagopts.o
-		if test -r ./dagopts.o; then
-		    dagopts_obj=./dagopts.o
-		else
-		    ar x $dag_lib_dir/libdag.a libdag_la-dagopts.o
-		    if test -r ./libdag_la-dagopts.o; then
-		       dagopts_obj=./libdag_la-dagopts.o
-		    fi
-		fi
-	fi
-
-	if test $dagopts_obj = no; then
-		AC_MSG_RESULT([no (checked $dag_lib_dir  $dag_tools_dir  $dag_lib_dir/libdag.a)])
-		ac_cv_lbl_dag_api=no
-	else
-		AC_MSG_RESULT([yes ($dagopts_obj)])
-	fi
-fi
-
-if test $ac_cv_lbl_dag_api = yes; then
-	# Under 2.5.x only we need to add dagreg.o.
-	if test -r $dag_include_dir/dagreg.h; then
-		AC_MSG_CHECKING([dagreg.o])	
-		dagreg_obj=no
-		if test -r $dag_lib_dir/dagreg.o; then
-			# Object file is ready and waiting.
-			dagreg_obj=$dag_lib_dir/dagreg.o
-		elif test -r $dag_lib_dir/libdag.a; then
-			# Extract from libdag.a.
-			ar x $dag_lib_dir/libdag.a dagreg.o
-			if test -r ./dagreg.o; then
-				dagreg_obj=./dagreg.o
-			else
-				ar x $dag_lib_dir/libdag.a libdag_la-dagreg.o
-				if test -r ./libdag_la-dagreg.o; then
-				   dagreg_obj=./libdag_la-dagreg.o
-				fi
-			fi
-		fi
-
-		if test $dagreg_obj = no; then
-			AC_MSG_RESULT([no (checked $dag_lib_dir  $dag_lib_dir/libdag.a)])
-			ac_cv_lbl_dag_api=no
-		else
-			AC_MSG_RESULT([yes ($dagreg_obj)])
-		fi
-	fi
-fi
-
-if test $ac_cv_lbl_dag_api = yes; then
 	V_INCLS="$V_INCLS -I$dag_include_dir"
-	V_LIBS="$V_LIBS $dagapi_obj $dagopts_obj $dagreg_obj"
+
 	if test $V_PCAP != dag ; then
 		 SSRC="pcap-dag.c"
 	fi
@@ -590,27 +800,33 @@
 	# included if there's a found-action (arg 3).
 	saved_ldflags=$LDFLAGS
 	LDFLAGS="-L$dag_lib_dir"
-	AC_CHECK_LIB([dag], [dag_attach_stream], [dag_version="2.5.x"], [dag_version="2.4.x"])
+	AC_CHECK_LIB([dag], [dag_attach_stream], [dag_streams="1"], [dag_streams="0"])
 	AC_CHECK_LIB([dag],[dag_get_erf_types], [
-		AC_DEFINE(HAVE_DAG_GET_ERF_TYPES, 1, [define if you have dag_get_erf_types()])]
-	)
+		AC_DEFINE(HAVE_DAG_GET_ERF_TYPES, 1, [define if you have dag_get_erf_types()])])
+	AC_CHECK_LIB([dag],[dag_get_stream_erf_types], [
+		AC_DEFINE(HAVE_DAG_GET_STREAM_ERF_TYPES, 1, [define if you have dag_get_stream_erf_types()])])
+
 	LDFLAGS=$saved_ldflags
 
-	if test "$dag_version" = 2.5.x; then
+	if test "$dag_streams" = 1; then
 		AC_DEFINE(HAVE_DAG_STREAMS_API, 1, [define if you have streams capable DAG API])
-		DAGLIBS="-ldag"
+		LIBS="$LIBS -ldag"
+		LDFLAGS="$LDFLAGS -L$dag_lib_dir"
+		
+		AC_CHECK_LIB([vdag],[vdag_set_device_info], [ac_dag_have_vdag="1"], [ac_dag_have_vdag="0"])
+		if test "$ac_dag_have_vdag" = 1; then
+			AC_DEFINE(HAVE_DAG_VDAG, 1, [define if you have vdag_set_device_info()])
+			LIBS="$LIBS -lpthread"
+		fi
 	fi
 
-	# See if we can find a specific version string.
-	AC_MSG_CHECKING([the DAG API version])
-	if test -r "$dag_root/VERSION"; then
-		dag_version="`cat $dag_root/VERSION`"
-	fi
-	AC_MSG_RESULT([$dag_version])
 	AC_DEFINE(HAVE_DAG_API, 1, [define if you have the DAG API])
 fi
 
+AC_MSG_CHECKING(whether we have the DAG API)
+
 if test $ac_cv_lbl_dag_api = no; then
+	AC_MSG_RESULT(no)
 	if test "$want_dag" = yes; then
         	# User wanted DAG support but we couldn't find it.
 		AC_MSG_ERROR([DAG API requested, but not found at $dag_root: use --without-dag])
@@ -621,9 +837,12 @@
 		# found.
 		AC_MSG_ERROR([Specifying the capture type as "dag" requires the DAG API to be present; use the --with-dag options to specify the location. (Try "./configure --help" for more information.)])
 	fi
+else
+	AC_MSG_RESULT(yes)
 fi
 
-AC_ARG_WITH(septel, [  --with-septel[[=DIR]]     include Septel support (located in directory DIR, if supplied).  [default=yes, on Linux, if present]],
+AC_ARG_WITH(septel,
+AC_HELP_STRING([--with-septel@<:@=DIR@:>@],[include Septel support (located in directory DIR, if supplied).  @<:@default=yes, on Linux, if present@:>@]),
 [
 	if test "$withval" = no
 	then
@@ -671,22 +890,19 @@
 
 	if test -z "$septel_root"; then
 		septel_root=$srcdir/../septel
-
 	fi
 
 	septel_tools_dir="$septel_root"
 	septel_include_dir="$septel_root/INC"
-	DEF="-DHAVE_SEPTEL_API"
 
 	ac_cv_lbl_septel_api=no
 	if test -r "$septel_include_dir/msg.h"; then
 		V_INCLS="$V_INCLS -I$septel_include_dir"
-		V_DEFS="$V_DEFS $DEF"
-		V_LIBS="$V_LIBS $septel_tools_dir/asciibin.o $septel_tools_dir/bit2byte.o $septel_tools_dir/confirm.o $septel_tools_dir/fmtmsg.o $septel_tools_dir/gct_unix.o $septel_tools_dir/hqueue.o $septel_tools_dir/ident.o $septel_tools_dir/mem.o $septel_tools_dir/pack.o $septel_tools_dir/parse.o $septel_tools_dir/pool.o $septel_tools_dir/sdlsig.o $septel_tools_dir/strtonum.o $septel_tools_dir/timer.o $septel_tools_dir/trace.o "
+		ADDLOBJS="$ADDLOBJS $septel_tools_dir/asciibin.o $septel_tools_dir/bit2byte.o $septel_tools_dir/confirm.o $septel_tools_dir/fmtmsg.o $septel_tools_dir/gct_unix.o $septel_tools_dir/hqueue.o $septel_tools_dir/ident.o $septel_tools_dir/mem.o $septel_tools_dir/pack.o $septel_tools_dir/parse.o $septel_tools_dir/pool.o $septel_tools_dir/sdlsig.o $septel_tools_dir/strtonum.o $septel_tools_dir/timer.o $septel_tools_dir/trace.o"
+		ADDLARCHIVEOBJS="$ADDLARCHIVEOBJS $septel_tools_dir/asciibin.o $septel_tools_dir/bit2byte.o $septel_tools_dir/confirm.o $septel_tools_dir/fmtmsg.o $septel_tools_dir/gct_unix.o $septel_tools_dir/hqueue.o $septel_tools_dir/ident.o $septel_tools_dir/mem.o $septel_tools_dir/pack.o $septel_tools_dir/parse.o $septel_tools_dir/pool.o $septel_tools_dir/sdlsig.o $septel_tools_dir/strtonum.o $septel_tools_dir/timer.o $septel_tools_dir/trace.o"
 
 		if test "$V_PCAP" != septel ; then
 			 SSRC="pcap-septel.c"
-
 		fi
 		ac_cv_lbl_septel_api=yes
 	fi
@@ -705,6 +921,119 @@
 	AC_MSG_ERROR(Specifying the capture type as 'septel' requires the Septel API to be present; use --with-septel=DIR)
 fi
 
+# Check for Myricom SNF support.
+AC_ARG_WITH([snf],
+AC_HELP_STRING([--with-snf@<:@=DIR@:>@],[include Myricom SNF support @<:@"yes", "no" or DIR; default="yes" on BSD and Linux if present@:>@]),
+[
+	if test "$withval" = no
+	then
+		# User explicitly doesn't want SNF
+		want_snf=no
+	elif test "$withval" = yes
+	then
+		# User wants SNF support but hasn't specific a directory.
+		want_snf=yes
+	else
+		# User wants SNF support with a specified directory.
+		want_snf=yes
+		snf_root=$withval
+	fi
+],[
+	#
+	# Use Sniffer API if present, otherwise don't
+	#
+	want_snf=ifpresent
+])
+
+AC_ARG_WITH([snf-includes],
+AC_HELP_STRING([--with-snf-includes=DIR],[Myricom SNF include directory]),
+[
+	# User wants SNF with specific header directory
+	want_snf=yes
+	snf_include_dir=$withval
+],[])
+
+AC_ARG_WITH([snf-libraries],
+AC_HELP_STRING([--with-snf-libraries=DIR],[Myricom SNF library directory]),
+[
+	# User wants SNF with specific lib directory
+	want_snf=yes
+	snf_lib_dir=$withval
+],[])
+
+case "$V_PCAP" in
+bpf|linux|snf)
+	#
+	# We support the Sniffer API if we're on BSD, Linux, or if we're
+	# building a Sniffer-only libpcap.
+	#
+	;;
+*)
+	#
+	# If the user explicitly requested Sniffer, tell them it's not
+	# supported.
+	#
+	# If they expressed no preference, don't include it.
+	#
+	if test $want_snf = yes; then
+		AC_MSG_ERROR(Myricom SNF support only available with 'bpf' 'linux' and 'snf' packet capture types)
+	elif test $want_snf = yes; then
+		want_snf=no
+	fi
+	;;
+esac
+
+ac_cv_lbl_snf_api=no
+if test "$with_snf" != no; then
+
+	AC_MSG_CHECKING(whether we have Myricom Sniffer API)
+
+	if test -z "$snf_root"; then
+		snf_root=/opt/snf
+	fi
+
+	if test -z "$snf_include_dir"; then
+		snf_include_dir="$snf_root/include"
+	fi
+
+	if test -z "$snf_lib_dir"; then
+		snf_lib_dir="$snf_root/lib"
+	fi
+
+	if test -f "$snf_include_dir/snf.h"; then
+		ac_cv_lbl_snf_api=yes
+	fi
+	AC_MSG_RESULT([$ac_cv_lbl_snf_api ($snf_root)])
+
+	if test $ac_cv_lbl_snf_api = no; then
+		if test "$want_snf" = yes; then
+			AC_MSG_ERROR(SNF API headers not found under $snf_include_dir; use --without-snf)
+		fi
+	else
+		saved_ldflags=$LDFLAGS
+		LDFLAGS="$LDFLAGS -L$snf_lib_dir"
+		AC_CHECK_LIB([snf], [snf_init], [ac_cv_lbl_snf_api="yes"], [ac_cv_lbl_snf_api="no"])
+		LDFLAGS="$saved_ldflags"
+
+		if test $ac_cv_lbl_snf_api = no; then
+			if test "$want_snf" = yes; then
+				AC_MSG_ERROR(SNF API cannot correctly be linked check config.log; use --without-snf)
+			fi
+		else
+			V_INCLS="$V_INCLS -I$snf_include_dir"
+			LIBS="$LIBS -lsnf"
+			LDFLAGS="$LDFLAGS -L$snf_lib_dir"
+			if test "$V_PCAP" != snf ; then
+				SSRC="pcap-snf.c"
+			fi
+			AC_DEFINE(HAVE_SNF_API, 1, [define if you have Myricom SNF API])
+		fi
+	fi
+fi
+
+if test "$V_PCAP" = snf -a "$ac_cv_lbl_snf_api" = no; then
+	AC_MSG_ERROR(Specifying the capture type as 'snf' requires the Myricom Sniffer API to be present; use --with-snf=DIR)
+fi
 
 AC_LBL_LEX_AND_YACC(V_LEX, V_YACC, pcap_)
 if test "$V_LEX" = lex ; then
@@ -724,22 +1053,170 @@
 	fi
 fi
 
-DYEXT="so"
+#
+# Assume, by default, no support for shared libraries and V7/BSD convention
+# for man pages (file formats in section 5, miscellaneous info in section 7).
+# Individual cases can override this.
+#
+DYEXT="none"
+MAN_FILE_FORMATS=5
+MAN_MISC_INFO=7
 case "$host_os" in
 
 aix*)
 	dnl Workaround to enable certain features
 	AC_DEFINE(_SUN,1,[define on AIX to get certain functions])
+
+	#
+	# AIX makes it fun to build shared and static libraries,
+	# because they're *both* ".a" archive libraries.  We
+	# build the static library for the benefit of the traditional
+	# scheme of building libpcap and tcpdump in subdirectories of
+	# the same directory, with tcpdump statically linked with the
+	# libpcap in question, but we also build a shared library as
+	# "libpcap.shareda" and install *it*, rather than the static
+	# library, as "libpcap.a".
+	#
+	DYEXT="shareda"
+
+	case "$V_PCAP" in
+
+	dlpi)
+		#
+		# If we're using DLPI, applications will need to
+		# use /lib/pse.exp if present, as we use the
+		# STREAMS routines.
+		#
+		pseexe="/lib/pse.exp"
+		AC_MSG_CHECKING(for $pseexe)
+		if test -f $pseexe ; then
+			AC_MSG_RESULT(yes)
+			LIBS="-I:$pseexe"
+		fi
+		;;
+
+	bpf)
+		#
+		# If we're using BPF, we need "-lodm" and "-lcfg", as
+		# we use them to load the BPF module.
+		#
+		LIBS="-lodm -lcfg"
+		;;
+	esac
+	;;
+
+darwin*)
+	DYEXT="dylib"
+	V_CCOPT="$V_CCOPT -fno-common"
+	AC_ARG_ENABLE(universal,
+	AC_HELP_STRING([--disable-universal],[don't build universal on OS X]))
+	if test "$enable_universal" != "no"; then
+		case "$host_os" in
+
+		darwin[0-7].*)
+			#
+			# Pre-Tiger.  Build only for 32-bit PowerPC; no
+			# need for any special compiler or linker flags.
+			#
+			;;
+
+		darwin8.[0123]*)
+			#
+			# Tiger, prior to Intel support.  Build for 32-bit
+			# PowerPC and 64-bit PowerPC, with 32-bit PowerPC
+			# first.  (I'm guessing that's what Apple does.)
+			#
+			V_CCOPT="$V_CCOPT -arch ppc -arch ppc64"
+			LDFLAGS="$LDFLAGS -arch ppc -arch ppc64"
+			;;
+
+		darwin8.[456]*)
+			#
+			# Tiger, subsequent to Intel support but prior to
+			# x86-64 support.  Build for 32-bit PowerPC, 64-bit
+			# PowerPC, and x86, with 32-bit PowerPC first.
+			# (I'm guessing that's what Apple does.)
+			#
+			V_CCOPT="$V_CCOPT -arch ppc -arch ppc64 -arch i386"
+			LDFLAGS="$LDFLAGS -arch ppc -arch ppc64 -arch i386"
+			;;
+
+		darwin8.*)
+			#
+			# All other Tiger, so subsequent to x86-64
+			# support. Build for 32-bit PowerPC, 64-bit
+			# PowerPC, x86, and x86-64, and with 32-bit PowerPC
+			# first.  (I'm guessing that's what Apple does.)
+			#
+			V_CCOPT="$V_CCOPT -arch ppc -arch ppc64 -arch i386 -arch x86_64"
+			LDFLAGS="$LDFLAGS -arch ppc -arch ppc64 -arch i386 -arch x86_64"
+			;;
+
+		darwin9.*)
+			#
+			# Leopard.  Build for 32-bit PowerPC, 64-bit
+			# PowerPC, x86, and x86-64, with 32-bit PowerPC
+			# first.  (That's what Apple does.)
+			#
+			V_CCOPT="$V_CCOPT -arch ppc -arch ppc64 -arch i386 -arch x86_64"
+			LDFLAGS="$LDFLAGS -arch ppc -arch ppc64 -arch i386 -arch x86_64"
+			;;
+
+		darwin10.*)
+			#
+			# Snow Leopard.  Build for x86-64, x86, and
+			# 32-bit PowerPC, with x86-64 first.  (That's
+			# what Apple does, even though Snow Leopard
+			# doesn't run on PPC, so PPC libpcap runs under
+			# Rosetta, and Rosetta doesn't support BPF
+			# ioctls, so PPC programs can't do live
+			# captures.)
+			#
+			V_CCOPT="$V_CCOPT -arch x86_64 -arch i386 -arch ppc"
+			LDFLAGS="$LDFLAGS -arch x86_64 -arch i386 -arch ppc"
+			;;
+
+		darwin*)
+			#
+			# Post-Snow Leopard.  Build for x86-64 and
+			# x86, with x86-64 first.  (That's probably what
+			# Apple does, given that Rosetta is gone.)
+			# XXX - update if and when Apple drops support
+			# for 32-bit x86 code.
+			#
+			V_CCOPT="$V_CCOPT -arch x86_64 -arch i386"
+			LDFLAGS="$LDFLAGS -arch x86_64 -arch i386"
+			;;
+		esac
+	fi
 	;;
 
 hpux9*)
 	AC_DEFINE(HAVE_HPUX9,1,[on HP-UX 9.x])
+
+	#
+	# Use System V conventions for man pages.
+	#
+	MAN_FILE_FORMATS=4
+	MAN_MISC_INFO=5
 	;;
 
 hpux10.0*)
+
+	#
+	# Use System V conventions for man pages.
+	#
+	MAN_FILE_FORMATS=4
+	MAN_MISC_INFO=5
 	;;
 
 hpux10.1*)
+
+	#
+	# Use System V conventions for man pages.
+	#
+	MAN_FILE_FORMATS=4
+	MAN_MISC_INFO=5
 	;;
 
 hpux*)
@@ -750,6 +1227,53 @@
 	dnl for 32-bit PA-RISC, but should be left as "so" for
 	dnl 64-bit PA-RISC or, I suspect, IA-64.
 	AC_DEFINE(HAVE_HPUX10_20_OR_LATER,1,[on HP-UX 10.20 or later])
+	if test "`uname -m`" = "ia64"; then
+		DYEXT="so"
+	else
+		DYEXT="sl"
+	fi
+
+	#
+	# "-b" builds a shared library; "+h" sets the soname.
+	#
+	SHLIB_OPT="-b"
+	SONAME_OPT="+h"
+
+	#
+	# Use System V conventions for man pages.
+	#
+	MAN_FILE_FORMATS=4
+	MAN_MISC_INFO=5
+	;;
+
+irix*)
+	#
+	# Use System V conventions for man pages.
+	#
+	MAN_FILE_FORMATS=4
+	MAN_MISC_INFO=5
+	;;
+
+linux*|freebsd*|netbsd*|openbsd*|dragonfly*|kfreebsd*|gnu*)
+	DYEXT="so"
+
+	#
+	# Compiler assumed to be GCC; run-time linker may require a -R
+	# flag.
+	#
+	if test "$libdir" != "/usr/lib"; then
+		V_RFLAGS=-Wl,-R$libdir
+	fi
+	;;
+
+osf*)
+	DYEXT="so"
+
+	#
+	# Use System V conventions for man pages.
+	#
+	MAN_FILE_FORMATS=4
+	MAN_MISC_INFO=5
 	;;
 
 sinix*)
@@ -768,20 +1292,25 @@
 
 solaris*)
 	AC_DEFINE(HAVE_SOLARIS,1,[On solaris])
-	;;
 
-darwin*)
-	DYEXT="dylib"
-	V_CCOPT="$V_CCOPT -fno-common"
+	DYEXT="so"
+	#
+	# Use System V conventions for man pages.
+	#
+	MAN_FILE_FORMATS=4
+	MAN_MISC_INFO=5
 	;;
-
-linux*)
-	V_CCOPT="$V_CCOPT -fPIC"
-	;;
-
 esac
 
+AC_ARG_ENABLE(shared,
+AC_HELP_STRING([--enable-shared],[build shared libraries @<:@default=yes, if support available@:>@]))
+test "x$enable_shared" = "xno" && DYEXT="none"
+
 AC_PROG_RANLIB
+AC_CHECK_TOOL([AR], [ar])
+
+AC_PROG_LN_S
+AC_SUBST(LN_S)
 
 AC_LBL_DEVEL(V_CCOPT)
 
@@ -804,24 +1333,322 @@
 
 AC_SUBST(V_CCOPT)
 AC_SUBST(V_DEFS)
+AC_SUBST(V_FINDALLDEVS)
 AC_SUBST(V_INCLS)
-AC_SUBST(V_LIBS)
 AC_SUBST(V_LEX)
 AC_SUBST(V_PCAP)
-AC_SUBST(V_FINDALLDEVS)
-AC_SUBST(V_RANLIB)
+AC_SUBST(V_SHLIB_CMD)
+AC_SUBST(V_SHLIB_OPT)
+AC_SUBST(V_SONAME_OPT)
+AC_SUBST(V_RPATH_OPT)
 AC_SUBST(V_YACC)
+AC_SUBST(ADDLOBJS)
+AC_SUBST(ADDLARCHIVEOBJS)
 AC_SUBST(SSRC)
 AC_SUBST(DYEXT)
-AC_SUBST(DAGLIBS)
+AC_SUBST(MAN_FILE_FORMATS)
+AC_SUBST(MAN_MISC_INFO)
+
+dnl check for USB sniffing support
+AC_MSG_CHECKING(for USB sniffing support)
+case "$host_os" in
+linux*)
+	AC_DEFINE(PCAP_SUPPORT_USB, 1, [target host supports USB sniffing])
+	USB_SRC=pcap-usb-linux.c
+	AC_MSG_RESULT(yes)
+	ac_usb_dev_name=`udevinfo -q name -p /sys/class/usb_device/usbmon 2>/dev/null`
+	if test $? -ne 0 ; then
+	  ac_usb_dev_name="usbmon"
+	fi
+	AC_DEFINE_UNQUOTED(LINUX_USB_MON_DEV, "/dev/$ac_usb_dev_name", [path for device for USB sniffing])
+	AC_MSG_NOTICE(Device for USB sniffing is /dev/$ac_usb_dev_name)
+	#
+	# Do we have a version of <linux/compiler.h> available?
+	# If so, we might need it for <linux/usbdevice_fs.h>.
+	#
+	AC_CHECK_HEADERS(linux/compiler.h)
+	if test "$ac_cv_header_linux_compiler_h" = yes; then
+	  #
+	  # Yes - include it when testing for <linux/usbdevice_fs.h>.
+	  #
+	  AC_CHECK_HEADERS(linux/usbdevice_fs.h,,,[#include <linux/compiler.h>])
+	else
+	  AC_CHECK_HEADERS(linux/usbdevice_fs.h)
+	fi
+	if test "$ac_cv_header_linux_usbdevice_fs_h" = yes; then
+	  #
+	  # OK, does it define bRequestType?  Older versions of the kernel
+	  # define fields with names like "requesttype, "request", and
+	  # "value", rather than "bRequestType", "bRequest", and
+	  # "wValue".
+	  #
+	  AC_MSG_CHECKING(if usbdevfs_ctrltransfer struct has bRequestType member)
+	  AC_CACHE_VAL(ac_cv_usbdevfs_ctrltransfer_has_bRequestType,
+	    AC_TRY_COMPILE([
+AC_INCLUDES_DEFAULT
+#ifdef HAVE_SYS_BITYPES_H
+#include <sys/bitypes.h>
+#endif
+#ifdef HAVE_LINUX_COMPILER_H
+#include <linux/compiler.h>
+#endif
+#include <linux/usbdevice_fs.h>],
+	      [u_int i = sizeof(((struct usbdevfs_ctrltransfer *)0)->bRequestType)],
+	      ac_cv_usbdevfs_ctrltransfer_has_bRequestType=yes,
+	      ac_cv_usbdevfs_ctrltransfer_has_bRequestType=no))
+	    AC_MSG_RESULT($ac_cv_usbdevfs_ctrltransfer_has_bRequestType)
+	    if test $ac_cv_usbdevfs_ctrltransfer_has_bRequestType = yes ; then
+	      AC_DEFINE(HAVE_USBDEVFS_CTRLTRANSFER_BREQUESTTYPE,1,
+	        [if struct usbdevfs_ctrltransfer has bRequestType])
+	    fi
+	fi
+	;;
+*)
+	AC_MSG_RESULT(no)
+	;;
+esac
+AC_SUBST(PCAP_SUPPORT_USB)
+AC_SUBST(USB_SRC)
+
+dnl check for netfilter sniffing support
+AC_MSG_CHECKING(whether the platform could support netfilter sniffing)
+case "$host_os" in
+linux*)
+	AC_MSG_RESULT(yes)
+	#
+	# Life's too short to deal with trying to get this to compile
+	# if you don't get the right types defined with
+	# __KERNEL_STRICT_NAMES getting defined by some other include.
+	#
+	# Check whether the includes Just Work.  If not, don't turn on
+	# netfilter support.
+	#
+	AC_MSG_CHECKING(whether we can compile the netfilter support)
+	AC_CACHE_VAL(ac_cv_netfilter_can_compile,
+	  AC_TRY_COMPILE([
+AC_INCLUDES_DEFAULT
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <linux/types.h>
+
+#include <linux/netlink.h>
+#include <linux/netfilter.h>
+#include <linux/netfilter/nfnetlink.h>
+#include <linux/netfilter/nfnetlink_log.h>
+#include <linux/netfilter/nfnetlink_queue.h>],
+	    [],
+	    ac_cv_netfilter_can_compile=yes,
+	    ac_cv_netfilter_can_compile=no))
+	AC_MSG_RESULT($ac_cv_netfilter_can_compile)
+	if test $ac_cv_netfilter_can_compile = yes ; then
+	  AC_DEFINE(PCAP_SUPPORT_NETFILTER, 1,
+	    [target host supports netfilter sniffing])
+	  NETFILTER_SRC=pcap-netfilter-linux.c
+	fi
+	;;
+*)
+	AC_MSG_RESULT(no)
+	;;
+esac
+AC_SUBST(PCAP_SUPPORT_NETFILTER)
+AC_SUBST(NETFILTER_SRC)
+
+AC_ARG_ENABLE([bluetooth],
+[AC_HELP_STRING([--enable-bluetooth],[enable Bluetooth support @<:@default=yes, if support available@:>@])],
+    [],
+    [enable_bluetooth=yes])
+
+if test "x$enable_bluetooth" != "xno" ; then
+	dnl check for Bluetooth sniffing support
+	case "$host_os" in
+	linux*)
+		AC_CHECK_HEADER(bluetooth/bluetooth.h,
+		[
+		  AC_DEFINE(PCAP_SUPPORT_BT, 1, [target host supports Bluetooth sniffing])
+		  BT_SRC=pcap-bt-linux.c
+		  AC_MSG_NOTICE(Bluetooth sniffing is supported)
+
+		  #
+		  # OK, does struct sockaddr_hci have an hci_channel
+		  # member?
+		  #
+		  AC_MSG_CHECKING(if struct sockaddr_hci has hci_channel member)
+		  AC_CACHE_VAL(ac_cv_lbl_sockaddr_hci_has_hci_channel,
+		    AC_TRY_COMPILE(
+[
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/hci.h>
+],
+		      [u_int i = sizeof(((struct sockaddr_hci *)0)->hci_channel)],
+		      ac_cv_lbl_sockaddr_hci_has_hci_channel=yes,
+		      ac_cv_lbl_sockaddr_hci_has_hci_channel=no))
+		    AC_MSG_RESULT($ac_cv_lbl_sockaddr_hci_has_hci_channel)
+		    if test $ac_cv_lbl_sockaddr_hci_has_hci_channel = yes ; then
+		      AC_DEFINE(SOCKADDR_HCI_HAS_HCI_CHANNEL,,
+			[if struct sockaddr_hci has hci_channel member])
+		    fi
+		],
+		AC_MSG_NOTICE(Bluetooth sniffing is not supported; install bluez-lib devel to enable it)
+		)
+		;;
+	*)
+		AC_MSG_NOTICE(no Bluetooth sniffing support implemented for $host_os)
+		;;
+	esac
+	AC_SUBST(PCAP_SUPPORT_BT)
+	AC_SUBST(BT_SRC)
+fi
+
+AC_ARG_ENABLE([canusb],
+[AC_HELP_STRING([--enable-canusb],[enable canusb support @<:@default=yes, if support available@:>@])],
+    [],
+    [enable_canusb=yes])
+
+if test "x$enable_canusb" != "xno" ; then
+	dnl check for canusb support
+	case "$host_os" in
+	linux*)
+		AC_CHECK_HEADER(libusb-1.0/libusb.h,
+		[
+		    AC_DEFINE(PCAP_SUPPORT_CANUSB, 1, [target host supports canusb])
+		    CANUSB_SRC=pcap-canusb-linux.c
+		    LIBS="-lusb-1.0 -lpthread $LIBS"
+		    AC_MSG_NOTICE(canusb sniffing is supported)
+		],
+		AC_MSG_NOTICE(canusb sniffing is not supported; install libusb1.0 lib devel to enable it)
+		)
+		;;
+	*)
+		AC_MSG_NOTICE(no canusb support implemented for $host_os)
+		;;
+	esac
+	AC_SUBST(PCAP_SUPPORT_CANUSB)
+	AC_SUBST(CANUSB_SRC)
+fi
+
+AC_ARG_ENABLE([can],
+[AC_HELP_STRING([--enable-can],[enable CAN support @<:@default=yes, if support available@:>@])],
+    [],
+    [enable_can=yes])
+
+if test "x$enable_can" != "xno" ; then
+	dnl check for CAN sniffing support
+	case "$host_os" in
+	linux*)
+		AC_CHECK_HEADER(linux/can.h,
+			[ AC_DEFINE(PCAP_SUPPORT_CAN, 1, [target host supports CAN sniffing])
+			CAN_SRC=pcap-can-linux.c
+			AC_MSG_NOTICE(CAN sniffing is supported)],
+			AC_MSG_NOTICE(CAN sniffing is not supported),
+			[#include <sys/socket.h>]
+		   )
+		;;
+	*)
+		AC_MSG_NOTICE(no CAN sniffing support implemented for $host_os)
+		;;
+	esac
+	AC_SUBST(PCAP_SUPPORT_CAN)
+	AC_SUBST(CAN_SRC)
+fi
+
+AC_ARG_ENABLE([dbus],
+[AC_HELP_STRING([--enable-dbus],[enable D-Bus capture support @<:@default=yes, if support available@:>@])],
+    [],
+    [enable_dbus=ifavailable])
+
+if test "x$enable_dbus" != "xno"; then
+	if test "x$enable_dbus" = "xyes"; then
+		case "$host_os" in
+
+		darwin*)
+			#
+			# https://bugs.freedesktop.org/show_bug.cgi?id=74029
+			#
+			AC_MSG_ERROR([Due to freedesktop.org bug 74029, D-Bus capture support is not available on OS X])
+			;;
+		esac
+	else		
+		case "$host_os" in
+
+		darwin*)
+			#
+			# https://bugs.freedesktop.org/show_bug.cgi?id=74029
+			#
+			;;
+
+		*)
+			AC_CHECK_PROG([PKGCONFIG], [pkg-config], [pkg-config], [no])
+			if test "x$PKGCONFIG" != "xno"; then
+				AC_MSG_CHECKING([for D-Bus])
+				if "$PKGCONFIG" dbus-1; then
+					AC_MSG_RESULT([yes])
+					DBUS_CFLAGS=`"$PKGCONFIG" --cflags dbus-1`
+					DBUS_LIBS=`"$PKGCONFIG" --libs dbus-1`
+					save_CFLAGS="$CFLAGS"
+					save_LIBS="$LIBS"
+					CFLAGS="$CFLAGS $DBUS_CFLAGS"
+					LIBS="$LIBS $DBUS_LIBS"
+					AC_MSG_CHECKING(whether the D-Bus library defines dbus_connection_read_write)
+					AC_TRY_LINK(
+					    [#include <string.h>
+
+					     #include <time.h>
+					     #include <sys/time.h>
+
+					     #include <dbus/dbus.h>],
+					    [return dbus_connection_read_write(NULL, 0);],
+					    [
+						AC_MSG_RESULT([yes])
+						AC_DEFINE(PCAP_SUPPORT_DBUS, 1, [support D-Bus sniffing])
+						DBUS_SRC=pcap-dbus.c
+						V_INCLS="$V_INCLS $DBUS_CFLAGS"
+					    ],
+					    [
+						AC_MSG_RESULT([no])
+						if test "x$enable_dbus" = "xyes"; then
+						    AC_MSG_ERROR([--enable-dbus was given, but the D-Bus library doesn't define dbus_connection_read_write()])
+						fi
+						LIBS="$save_LIBS"
+					     ])
+					CFLAGS="$save_CFLAGS"
+				else
+					AC_MSG_RESULT([no])
+					if test "x$enable_dbus" = "xyes"; then
+						AC_MSG_ERROR([--enable-dbus was given, but the dbus-1 package is not installed])
+					fi
+				fi
+			fi
+			;;	
+		esac
+	fi
+	AC_SUBST(PCAP_SUPPORT_DBUS)
+	AC_SUBST(DBUS_SRC)
+fi
+
+dnl check for hardware timestamp support
+case "$host_os" in
+linux*)
+	AC_CHECK_HEADERS([linux/net_tstamp.h])
+	;;
+*)
+	AC_MSG_NOTICE(no hardware timestamp support implemented for $host_os)
+	;;
+esac
 
 AC_PROG_INSTALL
 
 AC_CONFIG_HEADER(config.h)
 
-AC_OUTPUT(Makefile)
-
-if test -f .devel ; then
+AC_OUTPUT_COMMANDS([if test -f .devel; then
+	echo timestamp > stamp-h
+	cat Makefile-devel-adds >> Makefile
 	make depend
-fi
+fi])
+AC_OUTPUT(Makefile pcap-filter.manmisc pcap-linktype.manmisc
+	pcap-tstamp.manmisc pcap-savefile.manfile pcap.3pcap
+	pcap_compile.3pcap pcap_datalink.3pcap pcap_dump_open.3pcap
+	pcap_get_tstamp_precision.3pcap pcap_list_datalinks.3pcap
+	pcap_list_tstamp_types.3pcap pcap_open_dead.3pcap
+	pcap_open_offline.3pcap pcap_set_tstamp_precision.3pcap
+	pcap_set_tstamp_type.3pcap)
 exit 0
diff --git a/dlpisubs.c b/dlpisubs.c
new file mode 100644
index 0000000..671302f
--- /dev/null
+++ b/dlpisubs.c
@@ -0,0 +1,371 @@
+/*
+ * This code is derived from code formerly in pcap-dlpi.c, originally
+ * contributed by Atanu Ghosh (atanu@cs.ucl.ac.uk), University College
+ * London, and subsequently modified by Guy Harris (guy@alum.mit.edu),
+ * Mark Pizzolato <List-tcpdump-workers@subscriptions.pizzolato.net>,
+ * Mark C. Brown (mbrown@hp.com), and Sagun Shakya <Sagun.Shakya@Sun.COM>.
+ */
+
+/*
+ * This file contains dlpi/libdlpi related common functions used
+ * by pcap-[dlpi,libdlpi].c.
+ */
+#ifndef lint
+static const char rcsid[] _U_ =
+	"@(#) $Header: /tcpdump/master/libpcap/dlpisubs.c,v 1.3 2008-12-02 16:40:19 guy Exp $ (LBL)";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifndef DL_IPATM
+#define DL_IPATM	0x12	/* ATM Classical IP interface */
+#endif
+
+#ifdef HAVE_SYS_BUFMOD_H
+	/*
+	 * Size of a bufmod chunk to pass upstream; that appears to be the
+	 * biggest value to which you can set it, and setting it to that value
+	 * (which is bigger than what appears to be the Solaris default of 8192)
+	 * reduces the number of packet drops.
+	 */
+#define	CHUNKSIZE	65536
+
+	/*
+	 * Size of the buffer to allocate for packet data we read; it must be
+	 * large enough to hold a chunk.
+	 */
+#define	PKTBUFSIZE	CHUNKSIZE
+
+#else /* HAVE_SYS_BUFMOD_H */
+
+	/*
+	 * Size of the buffer to allocate for packet data we read; this is
+	 * what the value used to be - there's no particular reason why it
+	 * should be tied to MAXDLBUF, but we'll leave it as this for now.
+	 */
+#define	MAXDLBUF	8192
+#define	PKTBUFSIZE	(MAXDLBUF * sizeof(bpf_u_int32))
+
+#endif
+
+#include <sys/types.h>
+#include <sys/time.h>
+#ifdef HAVE_SYS_BUFMOD_H
+#include <sys/bufmod.h>
+#endif
+#include <sys/dlpi.h>
+#include <sys/stream.h>
+
+#include <errno.h>
+#include <memory.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stropts.h>
+#include <unistd.h>
+
+#ifdef HAVE_LIBDLPI
+#include <libdlpi.h>
+#endif
+
+#include "pcap-int.h"
+#include "dlpisubs.h"
+
+#ifdef HAVE_SYS_BUFMOD_H
+static void pcap_stream_err(const char *, int, char *);
+#endif
+
+/*
+ * Get the packet statistics.
+ */
+int
+pcap_stats_dlpi(pcap_t *p, struct pcap_stat *ps)
+{
+	struct pcap_dlpi *pd = p->priv;
+
+	/*
+	 * "ps_recv" counts packets handed to the filter, not packets
+	 * that passed the filter.  As filtering is done in userland,
+	 * this would not include packets dropped because we ran out
+	 * of buffer space; in order to make this more like other
+	 * platforms (Linux 2.4 and later, BSDs with BPF), where the
+	 * "packets received" count includes packets received but dropped
+	 * due to running out of buffer space, and to keep from confusing
+	 * applications that, for example, compute packet drop percentages,
+	 * we also make it count packets dropped by "bufmod" (otherwise we
+	 * might run the risk of the packet drop count being bigger than
+	 * the received-packet count).
+	 *
+	 * "ps_drop" counts packets dropped by "bufmod" because of
+	 * flow control requirements or resource exhaustion; it doesn't
+	 * count packets dropped by the interface driver, or packets
+	 * dropped upstream.  As filtering is done in userland, it counts
+	 * packets regardless of whether they would've passed the filter.
+	 *
+	 * These statistics don't include packets not yet read from
+	 * the kernel by libpcap, but they may include packets not
+	 * yet read from libpcap by the application.
+	 */
+	*ps = pd->stat;
+
+	/*
+	 * Add in the drop count, as per the above comment.
+	 */
+	ps->ps_recv += ps->ps_drop;
+	return (0);
+}
+
+/*
+ * Loop through the packets and call the callback for each packet.
+ * Return the number of packets read.
+ */
+int
+pcap_process_pkts(pcap_t *p, pcap_handler callback, u_char *user,
+	int count, u_char *bufp, int len)
+{
+	struct pcap_dlpi *pd = p->priv;
+	int n, caplen, origlen;
+	u_char *ep, *pk;
+	struct pcap_pkthdr pkthdr;
+#ifdef HAVE_SYS_BUFMOD_H
+	struct sb_hdr *sbp;
+#ifdef LBL_ALIGN
+	struct sb_hdr sbhdr;
+#endif
+#endif
+
+	/* Loop through packets */
+	ep = bufp + len;
+	n = 0;
+
+#ifdef HAVE_SYS_BUFMOD_H
+	while (bufp < ep) {
+		/*
+		 * Has "pcap_breakloop()" been called?
+		 * If so, return immediately - if we haven't read any
+		 * packets, clear the flag and return -2 to indicate
+		 * that we were told to break out of the loop, otherwise
+		 * leave the flag set, so that the *next* call will break
+		 * out of the loop without having read any packets, and
+		 * return the number of packets we've processed so far.
+		 */
+		if (p->break_loop) {
+			if (n == 0) {
+				p->break_loop = 0;
+				return (-2);
+			} else {
+				p->bp = bufp;
+				p->cc = ep - bufp;
+				return (n);
+			}
+		}
+#ifdef LBL_ALIGN
+		if ((long)bufp & 3) {
+			sbp = &sbhdr;
+			memcpy(sbp, bufp, sizeof(*sbp));
+		} else
+#endif
+			sbp = (struct sb_hdr *)bufp;
+		pd->stat.ps_drop = sbp->sbh_drops;
+		pk = bufp + sizeof(*sbp);
+		bufp += sbp->sbh_totlen;
+		origlen = sbp->sbh_origlen;
+		caplen = sbp->sbh_msglen;
+#else
+		origlen = len;
+		caplen = min(p->snapshot, len);
+		pk = bufp;
+		bufp += caplen;
+#endif
+		++pd->stat.ps_recv;
+		if (bpf_filter(p->fcode.bf_insns, pk, origlen, caplen)) {
+#ifdef HAVE_SYS_BUFMOD_H
+			pkthdr.ts.tv_sec = sbp->sbh_timestamp.tv_sec;
+			pkthdr.ts.tv_usec = sbp->sbh_timestamp.tv_usec;
+#else
+			(void) gettimeofday(&pkthdr.ts, NULL);
+#endif
+			pkthdr.len = origlen;
+			pkthdr.caplen = caplen;
+			/* Insure caplen does not exceed snapshot */
+			if (pkthdr.caplen > p->snapshot)
+				pkthdr.caplen = p->snapshot;
+			(*callback)(user, &pkthdr, pk);
+			if (++n >= count && !PACKET_COUNT_IS_UNLIMITED(count)) {
+				p->cc = ep - bufp;
+				p->bp = bufp;
+				return (n);
+			}
+		}
+#ifdef HAVE_SYS_BUFMOD_H
+	}
+#endif
+	p->cc = 0;
+	return (n);
+}
+
+/*
+ * Process the mac type. Returns -1 if no matching mac type found, otherwise 0.
+ */
+int
+pcap_process_mactype(pcap_t *p, u_int mactype)
+{
+	int retv = 0;
+
+	switch (mactype) {
+
+	case DL_CSMACD:
+	case DL_ETHER:
+		p->linktype = DLT_EN10MB;
+		p->offset = 2;
+		/*
+		 * This is (presumably) a real Ethernet capture; give it a
+		 * link-layer-type list with DLT_EN10MB and DLT_DOCSIS, so
+		 * that an application can let you choose it, in case you're
+		 * capturing DOCSIS traffic that a Cisco Cable Modem
+		 * Termination System is putting out onto an Ethernet (it
+		 * doesn't put an Ethernet header onto the wire, it puts raw
+		 * DOCSIS frames out on the wire inside the low-level
+		 * Ethernet framing).
+		 */
+		p->dlt_list = (u_int *)malloc(sizeof(u_int) * 2);
+		/*
+		 * If that fails, just leave the list empty.
+		 */
+		if (p->dlt_list != NULL) {
+			p->dlt_list[0] = DLT_EN10MB;
+			p->dlt_list[1] = DLT_DOCSIS;
+			p->dlt_count = 2;
+		}
+		break;
+
+	case DL_FDDI:
+		p->linktype = DLT_FDDI;
+		p->offset = 3;
+		break;
+
+	case DL_TPR:
+		/* XXX - what about DL_TPB?  Is that Token Bus?  */
+		p->linktype = DLT_IEEE802;
+		p->offset = 2;
+		break;
+
+#ifdef HAVE_SOLARIS
+	case DL_IPATM:
+		p->linktype = DLT_SUNATM;
+		p->offset = 0;  /* works for LANE and LLC encapsulation */
+		break;
+#endif
+
+	default:
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "unknown mactype %u",
+		    mactype);
+		retv = -1;
+	}
+
+	return (retv);
+}
+
+#ifdef HAVE_SYS_BUFMOD_H
+/*
+ * Push and configure the buffer module. Returns -1 for error, otherwise 0.
+ */
+int
+pcap_conf_bufmod(pcap_t *p, int snaplen)
+{
+	struct timeval to;
+	bpf_u_int32 ss, chunksize;
+
+	/* Non-standard call to get the data nicely buffered. */
+	if (ioctl(p->fd, I_PUSH, "bufmod") != 0) {
+		pcap_stream_err("I_PUSH bufmod", errno, p->errbuf);
+		return (-1);
+	}
+
+	ss = snaplen;
+	if (ss > 0 &&
+	    strioctl(p->fd, SBIOCSSNAP, sizeof(ss), (char *)&ss) != 0) {
+		pcap_stream_err("SBIOCSSNAP", errno, p->errbuf);
+		return (-1);
+	}
+
+	if (p->opt.immediate) {
+		/* Set the timeout to zero, for immediate delivery. */
+		to.tv_sec = 0;
+		to.tv_usec = 0;
+		if (strioctl(p->fd, SBIOCSTIME, sizeof(to), (char *)&to) != 0) {
+			pcap_stream_err("SBIOCSTIME", errno, p->errbuf);
+			return (-1);
+		}
+	} else {
+		/* Set up the bufmod timeout. */
+		if (p->opt.timeout != 0) {
+			to.tv_sec = p->opt.timeout / 1000;
+			to.tv_usec = (p->opt.timeout * 1000) % 1000000;
+			if (strioctl(p->fd, SBIOCSTIME, sizeof(to), (char *)&to) != 0) {
+				pcap_stream_err("SBIOCSTIME", errno, p->errbuf);
+				return (-1);
+			}
+		}
+
+		/* Set the chunk length. */
+		chunksize = CHUNKSIZE;
+		if (strioctl(p->fd, SBIOCSCHUNK, sizeof(chunksize), (char *)&chunksize)
+		    != 0) {
+			pcap_stream_err("SBIOCSCHUNKP", errno, p->errbuf);
+			return (-1);
+		}
+	}
+
+	return (0);
+}
+#endif /* HAVE_SYS_BUFMOD_H */
+
+/*
+ * Allocate data buffer. Returns -1 if memory allocation fails, else 0.
+ */
+int
+pcap_alloc_databuf(pcap_t *p)
+{
+	p->bufsize = PKTBUFSIZE;
+	p->buffer = (u_char *)malloc(p->bufsize + p->offset);
+	if (p->buffer == NULL) {
+		strlcpy(p->errbuf, pcap_strerror(errno), PCAP_ERRBUF_SIZE);
+		return (-1);
+	}
+
+	return (0);
+}
+
+/*
+ * Issue a STREAMS I_STR ioctl. Returns -1 on error, otherwise
+ * length of returned data on success.
+ */
+int
+strioctl(int fd, int cmd, int len, char *dp)
+{
+	struct strioctl str;
+	int retv;
+
+	str.ic_cmd = cmd;
+	str.ic_timout = -1;
+	str.ic_len = len;
+	str.ic_dp = dp;
+	if ((retv = ioctl(fd, I_STR, &str)) < 0)
+		return (retv);
+
+	return (str.ic_len);
+}
+
+#ifdef HAVE_SYS_BUFMOD_H
+/*
+ * Write stream error message to errbuf.
+ */
+static void
+pcap_stream_err(const char *func, int err, char *errbuf)
+{
+	snprintf(errbuf, PCAP_ERRBUF_SIZE, "%s: %s", func, pcap_strerror(err));
+}
+#endif
diff --git a/dlpisubs.h b/dlpisubs.h
new file mode 100644
index 0000000..858bca3
--- /dev/null
+++ b/dlpisubs.h
@@ -0,0 +1,42 @@
+/*
+ * @(#) $Header: /tcpdump/master/libpcap/dlpisubs.h,v 1.2 2008-04-04 19:37:45 guy Exp $
+ */
+
+#ifndef dlpisubs_h
+#define	dlpisubs_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Private data for capturing on DLPI devices.
+ */
+struct pcap_dlpi {
+#ifdef HAVE_LIBDLPI
+	dlpi_handle_t dlpi_hd;
+#endif /* HAVE_LIBDLPI */
+#ifdef DL_HP_RAWDLS
+	int send_fd;
+#endif /* DL_HP_RAWDLS */
+
+	struct pcap_stat stat;
+};
+
+/*
+ * Functions defined by dlpisubs.c.
+ */
+int pcap_stats_dlpi(pcap_t *, struct pcap_stat *);
+int pcap_process_pkts(pcap_t *, pcap_handler, u_char *, int, u_char *, int);
+int pcap_process_mactype(pcap_t *, u_int);
+#ifdef HAVE_SYS_BUFMOD_H
+int pcap_conf_bufmod(pcap_t *, int);
+#endif
+int pcap_alloc_databuf(pcap_t *);
+int strioctl(int, int, int, char *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/etherent.c b/etherent.c
index 9d29955..d9de114 100644
--- a/etherent.c
+++ b/etherent.c
@@ -21,14 +21,26 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/etherent.c,v 1.22 2003/11/15 23:23:57 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>
@@ -37,7 +49,7 @@
 
 #include "pcap-int.h"
 
-#include <pcap-namedb.h>
+#include <pcap/namedb.h>
 
 #ifdef HAVE_OS_PROTO_H
 #include "os-proto.h"
diff --git a/ethertype.h b/ethertype.h
index 2d21c6d..2d6bbeb 100644
--- a/ethertype.h
+++ b/ethertype.h
@@ -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.13.2.1 2005/09/05 09:08:03 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/ethertype.h,v 1.14 2005-09-05 09:06:58 guy Exp $ (LBL)
  */
 
 /*
@@ -117,3 +117,6 @@
 #ifndef	ETHERTYPE_LOOPBACK
 #define	ETHERTYPE_LOOPBACK	0x9000
 #endif
+#ifndef ETHERTYPE_8021QINQ
+#define ETHERTYPE_8021QINQ	0x9100
+#endif
diff --git a/fad-getad.c b/fad-getad.c
index 8101165..af371d4 100644
--- a/fad-getad.c
+++ b/fad-getad.c
@@ -34,7 +34,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/fad-getad.c,v 1.10.2.2 2007/09/14 00:45:17 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
@@ -60,13 +60,28 @@
 #include "os-proto.h"
 #endif
 
-#ifdef AF_PACKET
+/*
+ * We don't do this on Solaris 11 and later, as it appears there aren't
+ * any AF_PACKET addresses on interfaces, so we don't need this, and
+ * we end up including both the OS's <net/bpf.h> and our <pcap/bpf.h>,
+ * and their definitions of some data structures collide.
+ */
+#if (defined(linux) || defined(__Lynx__)) && defined(AF_PACKET)
+# ifdef HAVE_NETPACKET_PACKET_H
+/* 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 /* (defined(linux) || defined(__Lynx__)) && defined(AF_PACKET) */
 
 /*
  * This is fun.
@@ -111,7 +126,7 @@
 		return (sizeof (struct sockaddr_in6));
 #endif
 
-#ifdef AF_PACKET
+#if (defined(linux) || defined(__Lynx__)) && defined(AF_PACKET)
 	case AF_PACKET:
 		return (sizeof (struct sockaddr_ll));
 #endif
@@ -132,11 +147,9 @@
  * Returns -1 on error, 0 otherwise.
  * The list, as returned through "alldevsp", may be null if no interfaces
  * were up and could be opened.
- *
- * This is the implementation used on platforms that have "getifaddrs()".
  */
 int
-pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf)
 {
 	pcap_if_t *devlist = NULL;
 	struct ifaddrs *ifap, *ifa;
@@ -264,15 +277,6 @@
 
 	freeifaddrs(ifap);
 
-	if (ret != -1) {
-		/*
-		 * We haven't had any errors yet; do any platform-specific
-		 * operations to add devices.
-		 */
-		if (pcap_platform_finddevs(&devlist, errbuf) < 0)
-			ret = -1;
-	}
-
 	if (ret == -1) {
 		/*
 		 * We had an error; free the list we've been constructing.
diff --git a/fad-gifc.c b/fad-gifc.c
index 985d2c0..d453518 100644
--- a/fad-gifc.c
+++ b/fad-gifc.c
@@ -34,7 +34,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/fad-gifc.c,v 1.8.2.2 2005/06/29 06:43:31 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/fad-gifc.c,v 1.12 2008-08-06 07:34:09 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -42,7 +42,6 @@
 #endif
 
 #include <sys/param.h>
-#include <sys/file.h>
 #include <sys/ioctl.h>
 #include <sys/socket.h>
 #ifdef HAVE_SYS_SOCKIO_H
@@ -123,136 +122,6 @@
  */
 #define MAX_SA_LEN	255
 
-#ifdef HAVE_PROC_NET_DEV
-/*
- * Get from "/proc/net/dev" all interfaces listed there; if they're
- * already in the list of interfaces we have, that won't add another
- * instance, but if they're not, that'll add them.
- *
- * We don't bother getting any addresses for them; it appears you can't
- * use SIOCGIFADDR on Linux to get IPv6 addresses for interfaces, and,
- * although some other types of addresses can be fetched with SIOCGIFADDR,
- * we don't bother with them for now.
- *
- * We also don't fail if we couldn't open "/proc/net/dev"; we just leave
- * the list of interfaces as is.
- */
-static int
-scan_proc_net_dev(pcap_if_t **devlistp, int fd, char *errbuf)
-{
-	FILE *proc_net_f;
-	char linebuf[512];
-	int linenum;
-	unsigned char *p;
-	char name[512];	/* XXX - pick a size */
-	char *q, *saveq;
-	struct ifreq ifrflags;
-	int ret = 0;
-
-	proc_net_f = fopen("/proc/net/dev", "r");
-	if (proc_net_f == NULL)
-		return (0);
-
-	for (linenum = 1;
-	    fgets(linebuf, sizeof linebuf, proc_net_f) != NULL; linenum++) {
-		/*
-		 * Skip the first two lines - they're headers.
-		 */
-		if (linenum <= 2)
-			continue;
-
-		p = &linebuf[0];
-
-		/*
-		 * Skip leading white space.
-		 */
-		while (*p != '\0' && isspace(*p))
-			p++;
-		if (*p == '\0' || *p == '\n')
-			continue;	/* blank line */
-
-		/*
-		 * Get the interface name.
-		 */
-		q = &name[0];
-		while (*p != '\0' && !isspace(*p)) {
-			if (*p == ':') {
-				/*
-				 * This could be the separator between a
-				 * name and an alias number, or it could be
-				 * the separator between a name with no
-				 * alias number and the next field.
-				 *
-				 * If there's a colon after digits, it
-				 * separates the name and the alias number,
-				 * otherwise it separates the name and the
-				 * next field.
-				 */
-				saveq = q;
-				while (isdigit(*p))
-					*q++ = *p++;
-				if (*p != ':') {
-					/*
-					 * That was the next field,
-					 * not the alias number.
-					 */
-					q = saveq;
-				}
-				break;
-			} else
-				*q++ = *p++;
-		}
-		*q = '\0';
-
-		/*
-		 * Get the flags for this interface, and skip it if
-		 * it's not up.
-		 */
-		strncpy(ifrflags.ifr_name, name, sizeof(ifrflags.ifr_name));
-		if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifrflags) < 0) {
-			if (errno == ENXIO)
-				continue;
-			(void)snprintf(errbuf, PCAP_ERRBUF_SIZE,
-			    "SIOCGIFFLAGS: %.*s: %s",
-			    (int)sizeof(ifrflags.ifr_name),
-			    ifrflags.ifr_name,
-			    pcap_strerror(errno));
-			ret = -1;
-			break;
-		}
-		if (!(ifrflags.ifr_flags & IFF_UP))
-			continue;
-
-		/*
-		 * Add an entry for this interface, with no addresses.
-		 */
-		if (pcap_add_if(devlistp, name, ifrflags.ifr_flags, NULL,
-		    errbuf) == -1) {
-			/*
-			 * Failure.
-			 */
-			ret = -1;
-			break;
-		}
-	}
-	if (ret != -1) {
-		/*
-		 * Well, we didn't fail for any other reason; did we
-		 * fail due to an error reading the file?
-		 */
-		if (ferror(proc_net_f)) {
-			(void)snprintf(errbuf, PCAP_ERRBUF_SIZE,
-			    "Error reading /proc/net/dev: %s",
-			    pcap_strerror(errno));
-			ret = -1;
-		}
-	}
-
-	(void)fclose(proc_net_f);
-	return (ret);
-}
-#endif /* HAVE_PROC_NET_DEV */
-
 /*
  * Get a list of all interfaces that are up and that we can open.
  * Returns -1 on error, 0 otherwise.
@@ -264,10 +133,11 @@
  *
  * XXX - or platforms that have other, better mechanisms but for which
  * we don't yet have code to use that mechanism; I think there's a better
- * way on Linux, for example.
+ * way on Linux, for example, but if that better way is "getifaddrs()",
+ * we already have that.
  */
 int
-pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf)
 {
 	pcap_if_t *devlist = NULL;
 	register int fd;
@@ -538,31 +408,8 @@
 		}
 	}
 	free(buf);
-
-#ifdef HAVE_PROC_NET_DEV
-	if (ret != -1) {
-		/*
-		 * We haven't had any errors yet; now read "/proc/net/dev",
-		 * and add to the list of interfaces all interfaces listed
-		 * there that we don't already have, because, on Linux,
-		 * SIOCGIFCONF reports only interfaces with IPv4 addresses,
-		 * so you need to read "/proc/net/dev" to get the names of
-		 * the rest of the interfaces.
-		 */
-		ret = scan_proc_net_dev(&devlist, fd, errbuf);
-	}
-#endif
 	(void)close(fd);
 
-	if (ret != -1) {
-		/*
-		 * We haven't had any errors yet; do any platform-specific
-		 * operations to add devices.
-		 */
-		if (pcap_platform_finddevs(&devlist, errbuf) < 0)
-			ret = -1;
-	}
-
 	if (ret == -1) {
 		/*
 		 * We had an error; free the list we've been constructing.
diff --git a/fad-glifc.c b/fad-glifc.c
index 8a86a3d..b24b564 100644
--- a/fad-glifc.c
+++ b/fad-glifc.c
@@ -34,7 +34,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/fad-glifc.c,v 1.5.2.1 2005/04/19 00:54:16 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/fad-glifc.c,v 1.7 2008-01-30 09:35:48 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -75,12 +75,12 @@
  * The list, as returned through "alldevsp", may be null if no interfaces
  * were up and could be opened.
  *
- * This is the implementation used on platforms that have SIOCLGIFCONF
+ * This is the implementation used on platforms that have SIOCGLIFCONF
  * but don't have "getifaddrs()".  (Solaris 8 and later; we use
- * SIOCLGIFCONF rather than SIOCGIFCONF in order to get IPv6 addresses.)
+ * SIOCGLIFCONF rather than SIOCGIFCONF in order to get IPv6 addresses.)
  */
 int
-pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf)
 {
 	pcap_if_t *devlist = NULL;
 	register int fd4, fd6, fd;
@@ -362,15 +362,6 @@
 	(void)close(fd6);
 	(void)close(fd4);
 
-	if (ret != -1) {
-		/*
-		 * We haven't had any errors yet; do any platform-specific
-		 * operations to add devices.
-		 */
-		if (pcap_platform_finddevs(&devlist, errbuf) < 0)
-			ret = -1;
-	}
-
 	if (ret == -1) {
 		/*
 		 * We had an error; free the list we've been constructing.
diff --git a/fad-null.c b/fad-null.c
index 676ff71..f6384fd 100644
--- a/fad-null.c
+++ b/fad-null.c
@@ -34,7 +34,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/fad-null.c,v 1.2 2003/11/15 23:23:58 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/fad-null.c,v 1.2 2003-11-15 23:23:58 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -53,7 +53,7 @@
  * packet capture.
  */
 int
-pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf)
 {
 	/*
 	 * Succeed, but don't return any interfaces; we return only those
diff --git a/fad-sita.c b/fad-sita.c
new file mode 100644
index 0000000..76dcb2e
--- /dev/null
+++ b/fad-sita.c
@@ -0,0 +1,61 @@
+/*
+ *  fad-sita.c: Packet capture interface additions for SITA ACN devices
+ *
+ *  Copyright (c) 2007 Fulko Hew, SITA INC Canada, Inc <fulko.hew@sita.aero>
+ *
+ *  License: BSD
+ *
+ *  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 names of the authors may not 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.
+ */
+
+ /* $Id: fad-sita.c */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include "pcap-int.h"
+
+#include "pcap-sita.h"
+
+extern pcap_if_t	*acn_if_list;								/* pcap's list of available interfaces */
+
+int pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf) {
+
+	//printf("pcap_findalldevs()\n");				// fulko
+
+	*alldevsp = 0;												/* initialize the returned variables before we do anything */
+	strcpy(errbuf, "");
+	if (acn_parse_hosts_file(errbuf))							/* scan the hosts file for potential IOPs */
+		{
+		//printf("pcap_findalldevs() returning BAD after parsehosts\n");				// fulko
+		return -1;
+		}
+	//printf("pcap_findalldevs() got hostlist now finding devs\n");				// fulko
+	if (acn_findalldevs(errbuf))								/* then ask the IOPs for their monitorable devices */
+		{
+		//printf("pcap_findalldevs() returning BAD after findalldevs\n");				// fulko
+		return -1;
+		}
+	*alldevsp = acn_if_list;
+	acn_if_list = 0;											/* then forget our list head, because someone will call pcap_freealldevs() to empty the malloc'ed stuff */
+	//printf("pcap_findalldevs() returning ZERO OK\n");				// fulko
+	return 0;
+}
diff --git a/fad-win32.c b/fad-win32.c
index 4d2c01e..6536695 100644
--- a/fad-win32.c
+++ b/fad-win32.c
@@ -33,7 +33,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/fad-win32.c,v 1.11.2.3 2006/02/22 17:09:32 gianluca Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/fad-win32.c,v 1.15 2007-09-25 20:34:36 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -216,7 +216,7 @@
  * Win32 implementation, based on WinPcap
  */
 int
-pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)
+pcap_findalldevs_interfaces(pcap_if_t **alldevsp, char *errbuf)
 {
 	pcap_if_t *devlist = NULL;
 	int ret = 0;
@@ -225,6 +225,24 @@
 	ULONG NameLength;
 	char *name;
 	
+	/*
+	 * Find out how big a buffer we need.
+	 *
+	 * This call should always return FALSE; if the error is
+	 * ERROR_INSUFFICIENT_BUFFER, NameLength will be set to
+	 * the size of the buffer we need, otherwise there's a
+	 * problem, and NameLength should be set to 0.
+	 *
+	 * It shouldn't require NameLength to be set, but,
+	 * at least as of WinPcap 4.1.3, it checks whether
+	 * NameLength is big enough before it checks for a
+	 * NULL buffer argument, so, while it'll still do
+	 * the right thing if NameLength is uninitialized and
+	 * whatever junk happens to be there is big enough
+	 * (because the pointer argument will be null), it's
+	 * still reading an uninitialized variable.
+	 */
+	NameLength = 0;
 	if (!PacketGetAdapterNames(NULL, &NameLength))
 	{
 		DWORD last_error = GetLastError();
@@ -301,6 +319,15 @@
 		name += strlen(name) + 1;
 		desc += strlen(desc) + 1;
 	}
+
+	if (ret != -1) {
+		/*
+		 * We haven't had any errors yet; do any platform-specific
+		 * operations to add devices.
+		 */
+		if (pcap_platform_finddevs(&devlist, errbuf) < 0)
+			ret = -1;
+	}
 	
 	if (ret == -1) {
 		/*
diff --git a/ffs.h b/ffs.h
deleted file mode 100644
index bea409b..0000000
--- a/ffs.h
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef _FFS_H_
-#define _FFS_H_
-
-/*
- * A really hacky implementation copied from asm/bitops.h
- * to make it compile
- */
-inline int ffs(int x)
-{
-	int r = 1;
-
-	if (!x)
-		return 0;
-	if (!(x & 0xffff)) {
-		x >>= 16;
-		r += 16;
-	}
-	if (!(x & 0xff)) {
-		x >>= 8;
-		r += 8;
-	}
-	if (!(x & 0xf)) {
-		x >>= 4;
-		r += 4;
-	}
-	if (!(x & 3)) {
-		x >>= 2;
-		r += 2;
-	}
-	if (!(x & 1)) {
-		x >>= 1;
-		r += 1;
-	}
-	return r;
-}
-
-#endif
diff --git a/gencode.c b/gencode.c
index d2cae21..7bb07fb 100644
--- a/gencode.c
+++ b/gencode.c
@@ -21,7 +21,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.221.2.53 2007/09/12 19:17:24 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 @@
 #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 @@
  * 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 @@
 #endif
 
 #include <netinet/in.h>
+#include <arpa/inet.h>
 
 #endif /* WIN32 */
 
@@ -68,11 +77,18 @@
 #include "nlpid.h"
 #include "llc.h"
 #include "gencode.h"
+#include "ieee80211.h"
 #include "atmuni31.h"
 #include "sunatmpos.h"
 #include "ppp.h"
-#include "sll.h"
+#include "pcap/sll.h"
+#include "pcap/ipnet.h"
 #include "arcnet.h"
+#if defined(linux) && defined(PF_PACKET) && defined(SO_ATTACH_FILTER)
+#include <linux/types.h>
+#include <linux/if_packet.h>
+#include <linux/filter.h>
+#endif
 #ifdef HAVE_NET_PFVAR_H
 #include <sys/socket.h>
 #include <net/if.h>
@@ -87,10 +103,22 @@
 #include <netdb.h>	/* for "struct addrinfo" */
 #endif /* WIN32 */
 #endif /*INET6*/
-#include <pcap-namedb.h>
+#include <pcap/namedb.h>
 
 #define ETHERMTU	1500
 
+#ifndef IPPROTO_HOPOPTS
+#define IPPROTO_HOPOPTS 0
+#endif
+#ifndef IPPROTO_ROUTING
+#define IPPROTO_ROUTING 43
+#endif
+#ifndef IPPROTO_FRAGMENT
+#define IPPROTO_FRAGMENT 44
+#endif
+#ifndef IPPROTO_DSTOPTS
+#define IPPROTO_DSTOPTS 60
+#endif
 #ifndef IPPROTO_SCTP
 #define IPPROTO_SCTP 132
 #endif
@@ -105,17 +133,15 @@
 static jmp_buf top_ctx;
 static pcap_t *bpf_pcap;
 
-#ifdef WIN32
 /* Hack for updating VLAN, MPLS, and PPPoE offsets. */
+#ifdef WIN32
 static u_int	orig_linktype = (u_int)-1, orig_nl = (u_int)-1, label_stack_depth = (u_int)-1;
 #else
 static u_int	orig_linktype = -1U, orig_nl = -1U, label_stack_depth = -1U;
 #endif
 
 /* XXX */
-#ifdef PCAP_FDDIPAD
 static int	pcap_fddipad;
-#endif
 
 /* VARARGS */
 void
@@ -134,6 +160,7 @@
 
 static void init_linktype(pcap_t *);
 
+static void init_regs(void);
 static int alloc_reg(void);
 static void free_reg(int);
 
@@ -145,13 +172,25 @@
  */
 enum e_offrel {
 	OR_PACKET,	/* relative to the beginning of the packet */
-	OR_LINK,	/* relative to the link-layer header */
+	OR_LINK,	/* relative to the beginning of the link-layer header */
+	OR_MACPL,	/* relative to the end of the MAC-layer header */
 	OR_NET,		/* relative to the network-layer header */
 	OR_NET_NOSNAP,	/* relative to the network-layer header, with no SNAP header at the link layer */
 	OR_TRAN_IPV4,	/* relative to the transport-layer header, with IPv4 network layer */
 	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
@@ -190,19 +229,25 @@
 static struct block *gen_ncmp(enum e_offrel, bpf_u_int32, bpf_u_int32,
     bpf_u_int32, bpf_u_int32, int, bpf_int32);
 static struct slist *gen_load_llrel(u_int, u_int);
+static struct slist *gen_load_macplrel(u_int, u_int);
 static struct slist *gen_load_a(enum e_offrel, u_int, u_int);
 static struct slist *gen_loadx_iphdrlen(void);
 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 void insert_radiotap_load_llprefixlen(struct block *);
-static void insert_ppi_load_llprefixlen(struct block *);
-static void insert_load_llprefixlen(struct block *);
+static struct slist *gen_load_prism_llprefixlen(void);
+static struct slist *gen_load_avs_llprefixlen(void);
+static struct slist *gen_load_radiotap_llprefixlen(void);
+static struct slist *gen_load_ppi_llprefixlen(void);
+static void insert_compute_vloffsets(struct block *);
 static struct slist *gen_llprefixlen(void);
+static struct slist *gen_off_macpl(void);
+static int ethertype_to_ppptype(int);
 static struct block *gen_linktype(int);
-static struct block *gen_snap(bpf_u_int32, bpf_u_int32, u_int);
+static struct block *gen_snap(bpf_u_int32, bpf_u_int32);
 static struct block *gen_llc_linktype(int);
 static struct block *gen_hostop(bpf_u_int32, bpf_u_int32, int, int, u_int, u_int);
 #ifdef INET6
@@ -226,20 +271,16 @@
 static struct block *gen_ipfrag(void);
 static struct block *gen_portatom(int, bpf_int32);
 static struct block *gen_portrangeatom(int, bpf_int32, bpf_int32);
-#ifdef INET6
 static struct block *gen_portatom6(int, bpf_int32);
 static struct block *gen_portrangeatom6(int, bpf_int32, bpf_int32);
-#endif
 struct block *gen_portop(int, int, int);
 static struct block *gen_port(int, int, int);
 struct block *gen_portrangeop(int, int, int, int);
 static struct block *gen_portrange(int, int, int, int);
-#ifdef INET6
 struct block *gen_portop6(int, int, int);
 static struct block *gen_port6(int, int, int);
 struct block *gen_portrangeop6(int, int, int, int);
 static struct block *gen_portrange6(int, int, int, int);
-#endif
 static int lookup_proto(const char *, int);
 static struct block *gen_protochain(int, int, int);
 static struct block *gen_proto(int, int, int);
@@ -247,6 +288,7 @@
 static struct slist *xfer_to_a(struct arth *);
 static struct block *gen_mac_multicast(int);
 static struct block *gen_len(int, int);
+static struct block *gen_check_802_11_data_frame(void);
 
 static struct block *gen_ppi_dlt_check(void);
 static struct block *gen_msg_abbrev(int type);
@@ -356,20 +398,60 @@
 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;
+	u_int len;
 
+	/*
+	 * If this pcap_t hasn't been activated, it doesn't have a
+	 * link-layer type, so we can't use it.
+	 */
+	if (!p->activated) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+		    "not-yet-activated pcap_t passed to pcap_compile");
+		return (-1);
+	}
 	no_optimize = 0;
 	n_errors = 0;
 	root = NULL;
 	bpf_pcap = p;
+	init_regs();
 	if (setjmp(top_ctx)) {
+#ifdef INET6
+		if (ai != NULL) {
+			freeaddrinfo(ai);
+			ai = NULL;
+		}
+#endif
 		lex_cleanup();
 		freechunks();
 		return (-1);
@@ -484,24 +566,11 @@
 	*p = b1;
 }
 
-
 void
 finish_parse(p)
 	struct block *p;
 {
 	struct block *ppi_dlt_check;
-	
-	ppi_dlt_check = gen_ppi_dlt_check();
-
-	if (ppi_dlt_check != NULL)
-	{
-		gen_and(ppi_dlt_check, p);
-	}
-
-	backpatch(p, gen_retblk(snaplen));
-	p->sense = !p->sense;
-	backpatch(p, gen_retblk(0));
-	root = p->head;
 
 	/*
 	 * Insert before the statements of the first (root) block any
@@ -512,14 +581,30 @@
 	 * statements of all blocks that use those lengths and that
 	 * have no predecessors that use them, so that we only compute
 	 * the lengths if we need them.  There might be even better
-	 * approaches than that.  However, as we're currently only
-	 * handling variable-length radiotap headers, and as all
-	 * filtering expressions other than raw link[M:N] tests
-	 * require the length of that header, doing more for that
-	 * header length isn't really worth the effort.
+	 * approaches than that.
+	 *
+	 * However, those strategies would be more complicated, and
+	 * as we don't generate code to compute a length if the
+	 * program has no tests that use the length, and as most
+	 * tests will probably use those lengths, we would just
+	 * postpone computing the lengths so that it's not done
+	 * for tests that fail early, and it's not clear that's
+	 * worth the effort.
 	 */
+	insert_compute_vloffsets(p->head);
+	
+	/*
+	 * For DLT_PPI captures, generate a check of the per-packet
+	 * DLT value to make sure it's DLT_IEEE802_11.
+	 */
+	ppi_dlt_check = gen_ppi_dlt_check();
+	if (ppi_dlt_check != NULL)
+		gen_and(ppi_dlt_check, p);
 
-	insert_load_llprefixlen(root);
+	backpatch(p, gen_retblk(snaplen));
+	p->sense = !p->sense;
+	backpatch(p, gen_retblk(0));
+	root = p->head;
 }
 
 void
@@ -682,13 +767,7 @@
  * Various code constructs need to know the layout of the data link
  * layer.  These variables give the necessary offsets from the beginning
  * of the packet data.
- *
- * If the link layer has variable_length headers, the offsets are offsets
- * from the end of the link-link-layer header, and "reg_ll_size" is
- * the register number for a register containing the length of the
- * link-layer header.  Otherwise, "reg_ll_size" is -1.
  */
-static int reg_ll_size;
 
 /*
  * This is the offset of the beginning of the link-layer header from
@@ -701,13 +780,50 @@
 static u_int off_ll;
 
 /*
- * This is the offset of the beginning of the MAC-layer header.
+ * If there's a variable-length header preceding the link-layer header,
+ * "reg_off_ll" is the register number for a register containing the
+ * length of that header, and therefore the offset of the link-layer
+ * header from the beginning of the raw packet data.  Otherwise,
+ * "reg_off_ll" is -1.
+ */
+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;
 
 /*
+ * This is the offset of the beginning of the MAC-layer payload,
+ * from the beginning of the raw packet data.
+ *
+ * I.e., it's the sum of the length of the link-layer header (without,
+ * for example, any 802.2 LLC header, so it's the MAC-layer
+ * portion of that header), plus any prefix preceding the
+ * link-layer header.
+ */
+static u_int off_macpl;
+
+/*
+ * This is 1 if the offset of the beginning of the MAC-layer payload
+ * from the beginning of the link-layer header is variable-length.
+ */
+static int off_macpl_is_variable;
+
+/*
+ * If the link layer has variable_length headers, "reg_off_macpl"
+ * is the register number for a register containing the length of the
+ * link-layer header plus the length of any variable-length header
+ * preceding the link-layer header.  Otherwise, "reg_off_macpl"
+ * is -1.
+ */
+static int reg_off_macpl;
+
+/*
  * "off_linktype" is the offset to information in the link-layer header
  * giving the packet type.  This offset is relative to the beginning
  * of the link-layer header (i.e., it doesn't include off_ll).
@@ -730,6 +846,13 @@
 static u_int off_linktype;
 
 /*
+ * TRUE if "pppoes" appeared in the filter; it causes link-layer type
+ * checks to check the PPP header, assumed to follow a LAN-style link-
+ * layer header and a PPPoE session header.
+ */
+static int is_pppoes = 0;
+
+/*
  * TRUE if the link layer includes an ATM pseudo-header.
  */
 static int is_atm = 0;
@@ -751,6 +874,7 @@
  * These are offsets for the MTP2 fields.
  */
 static u_int off_li;
+static u_int off_li_hsl;
 
 /*
  * These are offsets for the MTP3 fields.
@@ -768,8 +892,8 @@
 
 /*
  * These are offsets to the beginning of the network-layer header.
- * They are relative to the beginning of the link-layer header (i.e.,
- * they don't include off_ll).
+ * They are relative to the beginning of the MAC-layer payload (i.e.,
+ * they don't include off_ll or off_macpl).
  *
  * If the link layer never uses 802.2 LLC:
  *
@@ -800,9 +924,7 @@
 	pcap_t *p;
 {
 	linktype = pcap_datalink(p);
-#ifdef PCAP_FDDIPAD
 	pcap_fddipad = p->fddipad;
-#endif
 
 	/*
 	 * Assume it's not raw ATM with a pseudo-header, for now.
@@ -816,43 +938,55 @@
 	off_payload = -1;
 
 	/*
+	 * And that we're not doing PPPoE.
+	 */
+	is_pppoes = 0;
+
+	/*
 	 * And assume we're not doing SS7.
 	 */
 	off_li = -1;
+	off_li_hsl = -1;
 	off_sio = -1;
 	off_opc = -1;
 	off_dpc = -1;
 	off_sls = -1;
 
 	/*
-	 * Also assume it's not 802.11 with a fixed-length radio header.
+	 * Also assume it's not 802.11.
 	 */
 	off_ll = 0;
+	off_macpl = 0;
+	off_macpl_is_variable = 0;
 
 	orig_linktype = -1;
 	orig_nl = -1;
         label_stack_depth = 0;
 
-	reg_ll_size = -1;
+	reg_off_ll = -1;
+	reg_off_macpl = -1;
 
 	switch (linktype) {
 
 	case DLT_ARCNET:
 		off_linktype = 2;
-		off_nl = 6;		/* XXX in reality, variable! */
-		off_nl_nosnap = 6;	/* no 802.2 LLC */
+		off_macpl = 6;
+		off_nl = 0;		/* XXX in reality, variable! */
+		off_nl_nosnap = 0;	/* no 802.2 LLC */
 		return;
 
 	case DLT_ARCNET_LINUX:
 		off_linktype = 4;
-		off_nl = 8;		/* XXX in reality, variable! */
-		off_nl_nosnap = 8;	/* no 802.2 LLC */
+		off_macpl = 8;
+		off_nl = 0;		/* XXX in reality, variable! */
+		off_nl_nosnap = 0;	/* no 802.2 LLC */
 		return;
 
 	case DLT_EN10MB:
 		off_linktype = 12;
-		off_nl = 14;		/* Ethernet II */
-		off_nl_nosnap = 17;	/* 802.3+802.2 */
+		off_macpl = 14;		/* Ethernet header length */
+		off_nl = 0;		/* Ethernet II */
+		off_nl_nosnap = 3;	/* 802.3+802.2 */
 		return;
 
 	case DLT_SLIP:
@@ -861,29 +995,33 @@
 		 * header is hacked into our SLIP driver.
 		 */
 		off_linktype = -1;
-		off_nl = 16;
-		off_nl_nosnap = 16;	/* no 802.2 LLC */
+		off_macpl = 16;
+		off_nl = 0;
+		off_nl_nosnap = 0;	/* no 802.2 LLC */
 		return;
 
 	case DLT_SLIP_BSDOS:
 		/* XXX this may be the same as the DLT_PPP_BSDOS case */
 		off_linktype = -1;
 		/* XXX end */
-		off_nl = 24;
-		off_nl_nosnap = 24;	/* no 802.2 LLC */
+		off_macpl = 24;
+		off_nl = 0;
+		off_nl_nosnap = 0;	/* no 802.2 LLC */
 		return;
 
 	case DLT_NULL:
 	case DLT_LOOP:
 		off_linktype = 0;
-		off_nl = 4;
-		off_nl_nosnap = 4;	/* no 802.2 LLC */
+		off_macpl = 4;
+		off_nl = 0;
+		off_nl_nosnap = 0;	/* no 802.2 LLC */
 		return;
 
 	case DLT_ENC:
 		off_linktype = 0;
-		off_nl = 12;
-		off_nl_nosnap = 12;	/* no 802.2 LLC */
+		off_macpl = 12;
+		off_nl = 0;
+		off_nl_nosnap = 0;	/* no 802.2 LLC */
 		return;
 
 	case DLT_PPP:
@@ -891,8 +1029,9 @@
 	case DLT_C_HDLC:		/* BSD/OS Cisco HDLC */
 	case DLT_PPP_SERIAL:		/* NetBSD sync/async serial PPP */
 		off_linktype = 2;
-		off_nl = 4;
-		off_nl_nosnap = 4;	/* no 802.2 LLC */
+		off_macpl = 4;
+		off_nl = 0;
+		off_nl_nosnap = 0;	/* no 802.2 LLC */
 		return;
 
 	case DLT_PPP_ETHER:
@@ -901,14 +1040,16 @@
 		 * only covers session state.
 		 */
 		off_linktype = 6;
-		off_nl = 8;
-		off_nl_nosnap = 8;	/* no 802.2 LLC */
+		off_macpl = 8;
+		off_nl = 0;
+		off_nl_nosnap = 0;	/* no 802.2 LLC */
 		return;
 
 	case DLT_PPP_BSDOS:
 		off_linktype = 5;
-		off_nl = 24;
-		off_nl_nosnap = 24;	/* no 802.2 LLC */
+		off_macpl = 24;
+		off_nl = 0;
+		off_nl_nosnap = 0;	/* no 802.2 LLC */
 		return;
 
 	case DLT_FDDI:
@@ -921,15 +1062,11 @@
 		 * XXX - should we generate code to check for SNAP?
 		 */
 		off_linktype = 13;
-#ifdef PCAP_FDDIPAD
 		off_linktype += pcap_fddipad;
-#endif
-		off_nl = 21;		/* FDDI+802.2+SNAP */
-		off_nl_nosnap = 16;	/* FDDI+802.2 */
-#ifdef PCAP_FDDIPAD
-		off_nl += pcap_fddipad;
-		off_nl_nosnap += pcap_fddipad;
-#endif
+		off_macpl = 13;		/* FDDI MAC header length */
+		off_macpl += pcap_fddipad;
+		off_nl = 8;		/* 802.2+SNAP */
+		off_nl_nosnap = 3;	/* 802.2 */
 		return;
 
 	case DLT_IEEE802:
@@ -957,11 +1094,15 @@
 		 * 8 - figure out which byte that is).
 		 */
 		off_linktype = 14;
-		off_nl = 22;		/* Token Ring+802.2+SNAP */
-		off_nl_nosnap = 17;	/* Token Ring+802.2 */
+		off_macpl = 14;		/* Token Ring MAC header length */
+		off_nl = 8;		/* 802.2+SNAP */
+		off_nl_nosnap = 3;	/* 802.2 */
 		return;
 
 	case DLT_IEEE802_11:
+	case DLT_PRISM_HEADER:
+	case DLT_IEEE802_11_RADIO_AVS:
+	case DLT_IEEE802_11_RADIO:
 		/*
 		 * 802.11 doesn't really have a link-level type field.
 		 * We set "off_linktype" to the offset of the LLC header.
@@ -970,90 +1111,37 @@
 		 * is being used and pick out the encapsulated Ethernet type.
 		 * XXX - should we generate code to check for SNAP?
 		 *
-		 * XXX - the header is actually variable-length.  We
-		 * assume a 24-byte link-layer header, as appears in
-		 * data frames in networks with no bridges.  If the
-		 * fromds and tods 802.11 header bits are both set,
-		 * it's actually supposed to be 30 bytes.
+		 * We also handle variable-length radio headers here.
+		 * The Prism header is in theory variable-length, but in
+		 * practice it's always 144 bytes long.  However, some
+		 * drivers on Linux use ARPHRD_IEEE80211_PRISM, but
+		 * sometimes or always supply an AVS header, so we
+		 * have to check whether the radio header is a Prism
+		 * header or an AVS header, so, in practice, it's
+		 * variable-length.
 		 */
 		off_linktype = 24;
-		off_nl = 32;		/* 802.11+802.2+SNAP */
-		off_nl_nosnap = 27;	/* 802.11+802.2 */
+		off_macpl = 0;		/* link-layer header is variable-length */
+		off_macpl_is_variable = 1;
+		off_nl = 8;		/* 802.2+SNAP */
+		off_nl_nosnap = 3;	/* 802.2 */
 		return;
 
-	case DLT_PRISM_HEADER:
-		/*
-		 * Same as 802.11, but with an additional header before
-		 * the 802.11 header, containing a bunch of additional
-		 * information including radio-level information.
-		 *
-		 * The header is 144 bytes long.
-		 *
-		 * XXX - same variable-length header problem; at least
-		 * the Prism header is fixed-length.
-		 */
-		off_ll = 144;
-		off_linktype = 24;
-		off_nl = 32;	/* Prism+802.11+802.2+SNAP */
-		off_nl_nosnap = 27;	/* Prism+802.11+802.2 */
-		return;
-
-	case DLT_IEEE802_11_RADIO_AVS:
-		/*
-		 * Same as 802.11, but with an additional header before
-		 * the 802.11 header, containing a bunch of additional
-		 * information including radio-level information.
-		 *
-		 * The header is 64 bytes long, at least in its
-		 * current incarnation.
-		 *
-		 * XXX - same variable-length header problem, only
-		 * more so; this header is also variable-length,
-		 * with the length being the 32-bit big-endian
-		 * number at an offset of 4 from the beginning
-		 * of the radio header.  We should handle that the
-		 * same way we handle the length at the beginning
-		 * of the radiotap header.
-		 *
-		 * XXX - in Linux, do any drivers that supply an AVS
-		 * header supply a link-layer type other than
-		 * ARPHRD_IEEE80211_PRISM?  If so, we should map that
-		 * to DLT_IEEE802_11_RADIO_AVS; if not, or if there are
-		 * any drivers that supply an AVS header but supply
-		 * an ARPHRD value of ARPHRD_IEEE80211_PRISM, we'll
-		 * have to check the header in the generated code to
-		 * determine whether it's Prism or AVS.
-		 */
-		off_ll = 64;
-		off_linktype = 24;
-		off_nl = 32;		/* Radio+802.11+802.2+SNAP */
-		off_nl_nosnap = 27;	/* Radio+802.11+802.2 */
-		return;
-
-		
-		/* 
-		 * At the moment we treat PPI as normal Radiotap encoded
-		 * packets. The difference is in the function that generates
-		 * the code at the beginning to compute the header length.
-		 * Since this code generator of PPI supports bare 802.11
-		 * encapsulation only (i.e. the encapsulated DLT should be
-		 * DLT_IEEE802_11) we generate code to check for this too.
-		 */
 	case DLT_PPI:
-	case DLT_IEEE802_11_RADIO:
-		/*
-		 * Same as 802.11, but with an additional header before
-		 * the 802.11 header, containing a bunch of additional
-		 * information including radio-level information.
-		 *
-		 * The radiotap header is variable length, and we
-		 * generate code to compute its length and store it
-		 * in a register.  These offsets are relative to the
-		 * beginning of the 802.11 header.
+		/* 
+		 * At the moment we treat PPI the same way that we treat
+		 * normal Radiotap encoded packets. The difference is in
+		 * the function that generates the code at the beginning
+		 * to compute the header length.  Since this code generator
+		 * of PPI supports bare 802.11 encapsulation only (i.e.
+		 * the encapsulated DLT should be DLT_IEEE802_11) we
+		 * generate code to check for this too.
 		 */
 		off_linktype = 24;
-		off_nl = 32;		/* 802.11+802.2+SNAP */
-		off_nl_nosnap = 27;	/* 802.11+802.2 */
+		off_macpl = 0;		/* link-layer header is variable-length */
+		off_macpl_is_variable = 1;
+		off_nl = 8;		/* 802.2+SNAP */
+		off_nl_nosnap = 3;	/* 802.2 */
 		return;
 
 	case DLT_ATM_RFC1483:
@@ -1070,6 +1158,7 @@
 		 * PPPo{A,E} and a PPP protocol of IP and....
 		 */
 		off_linktype = 0;
+		off_macpl = 0;		/* packet begins with LLC header */
 		off_nl = 8;		/* 802.2+SNAP */
 		off_nl_nosnap = 3;	/* 802.2 */
 		return;
@@ -1083,23 +1172,28 @@
 		off_vpi = SUNATM_VPI_POS;
 		off_vci = SUNATM_VCI_POS;
 		off_proto = PROTO_POS;
-		off_mac = -1;	/* LLC-encapsulated, so no MAC-layer header */
+		off_mac = -1;	/* assume LLC-encapsulated, so no MAC-layer header */
 		off_payload = SUNATM_PKT_BEGIN_POS;
 		off_linktype = off_payload;
-		off_nl = off_payload+8;		/* 802.2+SNAP */
-		off_nl_nosnap = off_payload+3;	/* 802.2 */
+		off_macpl = off_payload;	/* if LLC-encapsulated */
+		off_nl = 8;		/* 802.2+SNAP */
+		off_nl_nosnap = 3;	/* 802.2 */
 		return;
 
 	case DLT_RAW:
+	case DLT_IPV4:
+	case DLT_IPV6:
 		off_linktype = -1;
+		off_macpl = 0;
 		off_nl = 0;
 		off_nl_nosnap = 0;	/* no 802.2 LLC */
 		return;
 
 	case DLT_LINUX_SLL:	/* fake header for Linux cooked socket */
 		off_linktype = 14;
-		off_nl = 16;
-		off_nl_nosnap = 16;	/* no 802.2 LLC */
+		off_macpl = 16;
+		off_nl = 0;
+		off_nl_nosnap = 0;	/* no 802.2 LLC */
 		return;
 
 	case DLT_LTALK:
@@ -1109,6 +1203,7 @@
 		 * "long" DDP packet following.
 		 */
 		off_linktype = -1;
+		off_macpl = 0;
 		off_nl = 0;
 		off_nl_nosnap = 0;	/* no 802.2 LLC */
 		return;
@@ -1125,8 +1220,9 @@
 		 * 2625 says SNAP should be used.
 		 */
 		off_linktype = 16;
-		off_nl = 24;		/* IPFC+802.2+SNAP */
-		off_nl_nosnap = 19;	/* IPFC+802.2 */
+		off_macpl = 16;
+		off_nl = 8;		/* 802.2+SNAP */
+		off_nl_nosnap = 3;	/* 802.2 */
 		return;
 
 	case DLT_FRELAY:
@@ -1135,6 +1231,7 @@
 		 * frames (NLPID of 0x80).
 		 */
 		off_linktype = -1;
+		off_macpl = 0;
 		off_nl = 0;
 		off_nl_nosnap = 0;	/* no 802.2 LLC */
 		return;
@@ -1146,45 +1243,31 @@
                  */
 	case DLT_MFR:
 		off_linktype = -1;
+		off_macpl = 0;
 		off_nl = 4;
 		off_nl_nosnap = 0;	/* XXX - for now -> no 802.2 LLC */
 		return;
 
 	case DLT_APPLE_IP_OVER_IEEE1394:
 		off_linktype = 16;
-		off_nl = 18;
-		off_nl_nosnap = 18;	/* no 802.2 LLC */
-		return;
-
-	case DLT_LINUX_IRDA:
-		/*
-		 * Currently, only raw "link[N:M]" filtering is supported.
-		 */
-		off_linktype = -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_nl = -1;
-		off_nl_nosnap = -1;
+		off_macpl = 18;
+		off_nl = 0;
+		off_nl_nosnap = 0;	/* no 802.2 LLC */
 		return;
 
 	case DLT_SYMANTEC_FIREWALL:
 		off_linktype = 6;
-		off_nl = 44;		/* Ethernet II */
-		off_nl_nosnap = 44;	/* XXX - what does it do with 802.3 packets? */
+		off_macpl = 44;
+		off_nl = 0;		/* Ethernet II */
+		off_nl_nosnap = 0;	/* XXX - what does it do with 802.3 packets? */
 		return;
 
 #ifdef HAVE_NET_PFVAR_H
 	case DLT_PFLOG:
 		off_linktype = 0;
-		off_nl = PFLOG_HDRLEN;
-		off_nl_nosnap = PFLOG_HDRLEN;	/* no 802.2 LLC */
+		off_macpl = PFLOG_HDRLEN;
+		off_nl = 0;
+		off_nl_nosnap = 0;	/* no 802.2 LLC */
 		return;
 #endif
 
@@ -1195,26 +1278,30 @@
         case DLT_JUNIPER_CHDLC:
         case DLT_JUNIPER_FRELAY:
                 off_linktype = 4;
-		off_nl = 4;
+		off_macpl = 4;
+		off_nl = 0;
 		off_nl_nosnap = -1;	/* no 802.2 LLC */
                 return;
 
 	case DLT_JUNIPER_ATM1:
-		off_linktype = 4; /* in reality variable between 4-8 */
-		off_nl = 4;
-		off_nl_nosnap = 14;
+		off_linktype = 4;	/* in reality variable between 4-8 */
+		off_macpl = 4;	/* in reality variable between 4-8 */
+		off_nl = 0;
+		off_nl_nosnap = 10;
 		return;
 
 	case DLT_JUNIPER_ATM2:
-		off_linktype = 8; /* in reality variable between 8-12 */
-		off_nl = 8;
-		off_nl_nosnap = 18;
+		off_linktype = 8;	/* in reality variable between 8-12 */
+		off_macpl = 8;	/* in reality variable between 8-12 */
+		off_nl = 0;
+		off_nl_nosnap = 10;
 		return;
 
 		/* frames captured on a Juniper PPPoE service PIC
 		 * contain raw ethernet frames */
 	case DLT_JUNIPER_PPPOE:
         case DLT_JUNIPER_ETHER:
+        	off_macpl = 14;
 		off_linktype = 16;
 		off_nl = 18;		/* Ethernet II */
 		off_nl_nosnap = 21;	/* 802.3+802.2 */
@@ -1222,96 +1309,171 @@
 
 	case DLT_JUNIPER_PPPOE_ATM:
 		off_linktype = 4;
-		off_nl = 6;
-		off_nl_nosnap = -1;	 /* no 802.2 LLC */
+		off_macpl = 6;
+		off_nl = 0;
+		off_nl_nosnap = -1;	/* no 802.2 LLC */
 		return;
 
 	case DLT_JUNIPER_GGSN:
 		off_linktype = 6;
-		off_nl = 12;
-		off_nl_nosnap = -1;	 /* no 802.2 LLC */
+		off_macpl = 12;
+		off_nl = 0;
+		off_nl_nosnap = -1;	/* no 802.2 LLC */
 		return;
 
 	case DLT_JUNIPER_ES:
 		off_linktype = 6;
-		off_nl = -1;		/* not really a network layer but raw IP adresses */
+		off_macpl = -1;		/* not really a network layer but raw IP addresses */
+		off_nl = -1;		/* not really a network layer but raw IP addresses */
 		off_nl_nosnap = -1;	/* no 802.2 LLC */
 		return;
 
 	case DLT_JUNIPER_MONITOR:
 		off_linktype = 12;
-		off_nl = 12;		/* raw IP/IP6 header */
+		off_macpl = 12;
+		off_nl = 0;		/* raw IP/IP6 header */
 		off_nl_nosnap = -1;	/* no 802.2 LLC */
 		return;
 
+	case DLT_BACNET_MS_TP:
+		off_linktype = -1;
+		off_macpl = -1;
+		off_nl = -1;
+		off_nl_nosnap = -1;
+		return;
+
 	case DLT_JUNIPER_SERVICES:
 		off_linktype = 12;
+		off_macpl = -1;		/* L3 proto location dep. on cookie type */
 		off_nl = -1;		/* L3 proto location dep. on cookie type */
 		off_nl_nosnap = -1;	/* no 802.2 LLC */
 		return;
 
 	case DLT_JUNIPER_VP:
 		off_linktype = 18;
+		off_macpl = -1;
+		off_nl = -1;
+		off_nl_nosnap = -1;
+		return;
+
+	case DLT_JUNIPER_ST:
+		off_linktype = 18;
+		off_macpl = -1;
+		off_nl = -1;
+		off_nl_nosnap = -1;
+		return;
+
+	case DLT_JUNIPER_ISM:
+		off_linktype = 8;
+		off_macpl = -1;
+		off_nl = -1;
+		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_li_hsl = 4;
 		off_sio = 3;
 		off_opc = 4;
 		off_dpc = 4;
 		off_sls = 7;
 		off_linktype = -1;
+		off_macpl = -1;
 		off_nl = -1;
 		off_nl_nosnap = -1;
 		return;
 
 	case DLT_MTP2_WITH_PHDR:
 		off_li = 6;
+		off_li_hsl = 8;
 		off_sio = 7;
 		off_opc = 8;
 		off_dpc = 8;
 		off_sls = 11;
 		off_linktype = -1;
+		off_macpl = -1;
 		off_nl = -1;
 		off_nl_nosnap = -1;
 		return;
 
-#ifdef DLT_PFSYNC
+	case DLT_ERF:
+		off_li = 22;
+		off_li_hsl = 24;
+		off_sio = 23;
+		off_opc = 24;
+		off_dpc = 24;
+		off_sls = 27;
+		off_linktype = -1;
+		off_macpl = -1;
+		off_nl = -1;
+		off_nl_nosnap = -1;
+		return;
+
 	case DLT_PFSYNC:
 		off_linktype = -1;
-		off_nl = 4;
-		off_nl_nosnap = 4;
+		off_macpl = 4;
+		off_nl = 0;
+		off_nl_nosnap = 0;
 		return;
-#endif
 
-	case DLT_LINUX_LAPD:
+	case DLT_AX25_KISS:
 		/*
 		 * Currently, only raw "link[N:M]" filtering is supported.
 		 */
-		off_linktype = -1;
-		off_nl = -1;
+		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;
+
+	case DLT_IPNET:
+		off_linktype = 1;
+		off_macpl = 24;		/* ipnet header length */
+		off_nl = 0;
 		off_nl_nosnap = -1;
 		return;
 
-	case DLT_USB:
-		/*
-		 * Currently, only raw "link[N:M]" filtering is supported.
-		 */
-		off_linktype = -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:
-		/*
-		 * Currently, only raw "link[N:M]" filtering is supported.
-		 */
-		off_linktype = -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;
+
+	default:
+		/*
+		 * For values in the range in which we've assigned new
+		 * DLT_ values, only raw "link[N:M]" filtering is supported.
+		 */
+		if (linktype >= DLT_MATCHING_MIN &&
+		    linktype <= DLT_MATCHING_MAX) {
+			off_linktype = -1;
+			off_macpl = -1;
+			off_nl = -1;
+			off_nl_nosnap = -1;
+			return;
+		}
+
 	}
 	bpf_error("unknown data link type %d", linktype);
 	/* NOTREACHED */
@@ -1362,6 +1524,45 @@
 	return s;
 }
 
+/*
+ * Load a value relative to the beginning of the MAC-layer payload.
+ */
+static struct slist *
+gen_load_macplrel(offset, size)
+	u_int offset, size;
+{
+	struct slist *s, *s2;
+
+	s = gen_off_macpl();
+
+	/*
+	 * If s is non-null, the offset of the MAC-layer payload is
+	 * variable, and s points to a list of instructions that
+	 * arrange that the X register contains that offset.
+	 *
+	 * Otherwise, the offset of the MAC-layer payload is constant,
+	 * and is in off_macpl.
+	 */
+	if (s != NULL) {
+		/*
+		 * The offset of the MAC-layer payload is in the X
+		 * register.  Do an indirect load, to use the X register
+		 * as an offset.
+		 */
+		s2 = new_stmt(BPF_LD|BPF_IND|size);
+		s2->s.k = offset;
+		sappend(s, s2);
+	} else {
+		/*
+		 * The offset of the MAC-layer payload is constant,
+		 * and is in off_macpl; load the value at that offset
+		 * plus the specified offset.
+		 */
+		s = new_stmt(BPF_LD|BPF_ABS|size);
+		s->s.k = off_macpl + offset;
+	}
+	return s;
+}
 
 /*
  * Load a value relative to the beginning of the specified header.
@@ -1384,12 +1585,16 @@
 		s = gen_load_llrel(offset, size);
 		break;
 
+	case OR_MACPL:
+		s = gen_load_macplrel(offset, size);
+		break;
+
 	case OR_NET:
-		s = gen_load_llrel(off_nl + offset, size);
+		s = gen_load_macplrel(off_nl + offset, size);
 		break;
 
 	case OR_NET_NOSNAP:
-		s = gen_load_llrel(off_nl_nosnap + offset, size);
+		s = gen_load_macplrel(off_nl_nosnap + offset, size);
 		break;
 
 	case OR_TRAN_IPV4:
@@ -1402,21 +1607,22 @@
 		s = gen_loadx_iphdrlen();
 
 		/*
-		 * Load the item at {offset of the link-layer header} +
-		 * {offset, relative to the start of the link-layer
-		 * header, of the IPv4 header} + {length of the IPv4 header} +
+		 * Load the item at {offset of the MAC-layer payload} +
+		 * {offset, relative to the start of the MAC-layer
+		 * paylod, of the IPv4 header} + {length of the IPv4 header} +
 		 * {specified offset}.
 		 *
-		 * (If the link-layer is variable-length, it's included
-		 * in the value in the X register, and off_ll is 0.)
+		 * (If the offset of the MAC-layer payload is variable,
+		 * it's included in the value in the X register, and
+		 * off_macpl is 0.)
 		 */
 		s2 = new_stmt(BPF_LD|BPF_IND|size);
-		s2->s.k = off_ll + off_nl + offset;
+		s2->s.k = off_macpl + off_nl + offset;
 		sappend(s, s2);
 		break;
 
 	case OR_TRAN_IPV6:
-		s = gen_load_llrel(off_nl + 40 + offset, size);
+		s = gen_load_macplrel(off_nl + 40 + offset, size);
 		break;
 
 	default:
@@ -1436,12 +1642,15 @@
 {
 	struct slist *s, *s2;
 
-	s = gen_llprefixlen();
+	s = gen_off_macpl();
 	if (s != NULL) {
 		/*
 		 * There's a variable-length prefix preceding the
-		 * link-layer header.  "s" points to a list of statements
-		 * that put the length of that prefix into the X register.
+		 * link-layer header, or the link-layer header is itself
+		 * variable-length.  "s" points to a list of statements
+		 * that put the offset of the MAC-layer payload into
+		 * the X register.
+		 *
 		 * The 4*([k]&0xf) addressing mode can't be used, as we
 		 * don't have a constant offset, so we have to load the
 		 * value in question into the A register and add to it
@@ -1459,22 +1668,24 @@
 
 		/*
 		 * The A register now contains the length of the
-		 * IP header.  We need to add to it the length
-		 * of the prefix preceding the link-layer
-		 * header, which is still in the X register, and
-		 * move the result into the X register.
+		 * IP header.  We need to add to it the offset of
+		 * the MAC-layer payload, which is still in the X
+		 * register, and move the result into the X register.
 		 */
 		sappend(s, new_stmt(BPF_ALU|BPF_ADD|BPF_X));
 		sappend(s, new_stmt(BPF_MISC|BPF_TAX));
 	} else {
 		/*
 		 * There is no variable-length header preceding the
-		 * link-layer header; add in off_ll, which, if there's
-		 * a fixed-length header preceding the link-layer header,
-		 * is the length of that header.
+		 * link-layer header, and the link-layer header is
+		 * fixed-length; load the length of the IPv4 header,
+		 * which is at an offset of off_nl from the beginning
+		 * of the MAC-layer payload, and thus at an offset
+		 * of off_mac_pl + off_nl from the beginning of the
+		 * raw packet data.
 		 */
 		s = new_stmt(BPF_LDX|BPF_MSH|BPF_B);
-		s->s.k = off_ll + off_nl;
+		s->s.k = off_macpl + off_nl;
 	}
 	return s;
 }
@@ -1548,7 +1759,7 @@
 		 */
 		b0 = gen_cmp_gt(OR_LINK, off_linktype, BPF_H, ETHERMTU);
 		gen_not(b0);
-		b1 = gen_cmp(OR_LINK, off_linktype + 2, BPF_H, (bpf_int32)
+		b1 = gen_cmp(OR_MACPL, 0, BPF_H, (bpf_int32)
 			     ((proto << 8) | proto));
 		gen_and(b0, b1);
 		return b1;
@@ -1586,17 +1797,15 @@
 		 * This generates code to check both for the
 		 * IPX LSAP (Ethernet_802.2) and for Ethernet_802.3.
 		 */
-		b0 = gen_cmp(OR_LINK, off_linktype + 2, BPF_B,
-		    (bpf_int32)LLCSAP_IPX);
-		b1 = gen_cmp(OR_LINK, off_linktype + 2, BPF_H,
-		    (bpf_int32)0xFFFF);
+		b0 = gen_cmp(OR_MACPL, 0, BPF_B, (bpf_int32)LLCSAP_IPX);
+		b1 = gen_cmp(OR_MACPL, 0, BPF_H, (bpf_int32)0xFFFF);
 		gen_or(b0, b1);
 
 		/*
 		 * Now we add code to check for SNAP frames with
 		 * ETHERTYPE_IPX, i.e. Ethernet_SNAP.
 		 */
-		b0 = gen_snap(0x000000, ETHERTYPE_IPX, 14);
+		b0 = gen_snap(0x000000, ETHERTYPE_IPX);
 		gen_or(b0, b1);
 
 		/*
@@ -1651,9 +1860,9 @@
 		 * type of ETHERTYPE_AARP (Appletalk ARP).
 		 */
 		if (proto == ETHERTYPE_ATALK)
-			b1 = gen_snap(0x080007, ETHERTYPE_ATALK, 14);
+			b1 = gen_snap(0x080007, ETHERTYPE_ATALK);
 		else	/* proto == ETHERTYPE_AARP */
-			b1 = gen_snap(0x000000, ETHERTYPE_AARP, 14);
+			b1 = gen_snap(0x000000, ETHERTYPE_AARP);
 		gen_and(b0, b1);
 
 		/*
@@ -1699,6 +1908,33 @@
 }
 
 /*
+ * "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
@@ -1730,7 +1966,7 @@
 		 * (i.e., other SAP values)?
 		 */
 		b0 = gen_cmp(OR_LINK, off_linktype, BPF_H, LINUX_SLL_P_802_2);
-		b1 = gen_cmp(OR_LINK, off_linktype + 2, BPF_H, (bpf_int32)
+		b1 = gen_cmp(OR_MACPL, 0, BPF_H, (bpf_int32)
 			     ((proto << 8) | proto));
 		gen_and(b0, b1);
 		return b1;
@@ -1761,10 +1997,8 @@
 		 * then put a check for LINUX_SLL_P_802_2 frames
 		 * before it.
 		 */
-		b0 = gen_cmp(OR_LINK, off_linktype + 2, BPF_B,
-		    (bpf_int32)LLCSAP_IPX);
-		b1 = gen_snap(0x000000, ETHERTYPE_IPX,
-		    off_linktype + 2);
+		b0 = gen_cmp(OR_MACPL, 0, BPF_B, (bpf_int32)LLCSAP_IPX);
+		b1 = gen_snap(0x000000, ETHERTYPE_IPX);
 		gen_or(b0, b1);
 		b0 = gen_cmp(OR_LINK, off_linktype, BPF_H, LINUX_SLL_P_802_2);
 		gen_and(b0, b1);
@@ -1812,11 +2046,9 @@
 		 * type of ETHERTYPE_AARP (Appletalk ARP).
 		 */
 		if (proto == ETHERTYPE_ATALK)
-			b1 = gen_snap(0x080007, ETHERTYPE_ATALK,
-			    off_linktype + 2);
+			b1 = gen_snap(0x080007, ETHERTYPE_ATALK);
 		else	/* proto == ETHERTYPE_AARP */
-			b1 = gen_snap(0x000000, ETHERTYPE_AARP,
-			    off_linktype + 2);
+			b1 = gen_snap(0x000000, ETHERTYPE_AARP);
 		gen_and(b0, b1);
 
 		/*
@@ -1840,7 +2072,7 @@
 			 */
 			b0 = gen_cmp(OR_LINK, off_linktype, BPF_H,
 			    LINUX_SLL_P_802_2);
-			b1 = gen_cmp(OR_LINK, off_linktype + 2, BPF_B,
+			b1 = gen_cmp(OR_LINK, off_macpl, BPF_B,
 			     (bpf_int32)proto);
 			gen_and(b0, b1);
 			return b1;
@@ -1860,18 +2092,169 @@
 	}
 }
 
-static void
-insert_radiotap_load_llprefixlen(b)
-	struct block *b;
+static struct slist *
+gen_load_prism_llprefixlen()
+{
+	struct slist *s1, *s2;
+	struct slist *sjeq_avs_cookie;
+	struct slist *sjcommon;
+
+	/*
+	 * This code is not compatible with the optimizer, as
+	 * we are generating jmp instructions within a normal
+	 * slist of instructions
+	 */
+	no_optimize = 1;
+
+	/*
+	 * Generate code to load the length of the radio header into
+	 * the register assigned to hold that length, if one has been
+	 * assigned.  (If one hasn't been assigned, no code we've
+	 * generated uses that prefix, so we don't need to generate any
+	 * code to load it.)
+	 *
+	 * Some Linux drivers use ARPHRD_IEEE80211_PRISM but sometimes
+	 * or always use the AVS header rather than the Prism header.
+	 * We load a 4-byte big-endian value at the beginning of the
+	 * raw packet data, and see whether, when masked with 0xFFFFF000,
+	 * it's equal to 0x80211000.  If so, that indicates that it's
+	 * an AVS header (the masked-out bits are the version number).
+	 * Otherwise, it's a Prism header.
+	 *
+	 * XXX - the Prism header is also, in theory, variable-length,
+	 * but no known software generates headers that aren't 144
+	 * bytes long.
+	 */
+	if (reg_off_ll != -1) {
+		/*
+		 * Load the cookie.
+		 */
+		s1 = new_stmt(BPF_LD|BPF_W|BPF_ABS);
+		s1->s.k = 0;
+
+		/*
+		 * AND it with 0xFFFFF000.
+		 */
+		s2 = new_stmt(BPF_ALU|BPF_AND|BPF_K);
+		s2->s.k = 0xFFFFF000;
+		sappend(s1, s2);
+
+		/*
+		 * Compare with 0x80211000.
+		 */
+		sjeq_avs_cookie = new_stmt(JMP(BPF_JEQ));
+		sjeq_avs_cookie->s.k = 0x80211000;
+		sappend(s1, sjeq_avs_cookie);
+
+		/*
+		 * If it's AVS:
+		 *
+		 * The 4 bytes at an offset of 4 from the beginning of
+		 * the AVS header are the length of the AVS header.
+		 * That field is big-endian.
+		 */
+		s2 = new_stmt(BPF_LD|BPF_W|BPF_ABS);
+		s2->s.k = 4;
+		sappend(s1, s2);
+		sjeq_avs_cookie->s.jt = s2;
+
+		/*
+		 * Now jump to the code to allocate a register
+		 * into which to save the header length and
+		 * store the length there.  (The "jump always"
+		 * instruction needs to have the k field set;
+		 * it's added to the PC, so, as we're jumping
+		 * over a single instruction, it should be 1.)
+		 */
+		sjcommon = new_stmt(JMP(BPF_JA));
+		sjcommon->s.k = 1;
+		sappend(s1, sjcommon);
+
+		/*
+		 * Now for the code that handles the Prism header.
+		 * Just load the length of the Prism header (144)
+		 * into the A register.  Have the test for an AVS
+		 * header branch here if we don't have an AVS header.
+		 */
+		s2 = new_stmt(BPF_LD|BPF_W|BPF_IMM);
+		s2->s.k = 144;
+		sappend(s1, s2);
+		sjeq_avs_cookie->s.jf = s2;
+
+		/*
+		 * Now allocate a register to hold that value and store
+		 * it.  The code for the AVS header will jump here after
+		 * loading the length of the AVS header.
+		 */
+		s2 = new_stmt(BPF_ST);
+		s2->s.k = reg_off_ll;
+		sappend(s1, s2);
+		sjcommon->s.jf = s2;
+
+		/*
+		 * Now move it into the X register.
+		 */
+		s2 = new_stmt(BPF_MISC|BPF_TAX);
+		sappend(s1, s2);
+
+		return (s1);
+	} else
+		return (NULL);
+}
+
+static struct slist *
+gen_load_avs_llprefixlen()
 {
 	struct slist *s1, *s2;
 
 	/*
-	 * Prepend to the statements in this block code to load the
-	 * length of the radiotap header into the register assigned
-	 * to hold that length, if one has been assigned.
+	 * Generate code to load the length of the AVS header into
+	 * the register assigned to hold that length, if one has been
+	 * assigned.  (If one hasn't been assigned, no code we've
+	 * generated uses that prefix, so we don't need to generate any
+	 * code to load it.)
 	 */
-	if (reg_ll_size != -1) {
+	if (reg_off_ll != -1) {
+		/*
+		 * The 4 bytes at an offset of 4 from the beginning of
+		 * the AVS header are the length of the AVS header.
+		 * That field is big-endian.
+		 */
+		s1 = new_stmt(BPF_LD|BPF_W|BPF_ABS);
+		s1->s.k = 4;
+
+		/*
+		 * Now allocate a register to hold that value and store
+		 * it.
+		 */
+		s2 = new_stmt(BPF_ST);
+		s2->s.k = reg_off_ll;
+		sappend(s1, s2);
+
+		/*
+		 * Now move it into the X register.
+		 */
+		s2 = new_stmt(BPF_MISC|BPF_TAX);
+		sappend(s1, s2);
+
+		return (s1);
+	} else
+		return (NULL);
+}
+
+static struct slist *
+gen_load_radiotap_llprefixlen()
+{
+	struct slist *s1, *s2;
+
+	/*
+	 * Generate code to load the length of the radiotap header into
+	 * the register assigned to hold that length, if one has been
+	 * assigned.  (If one hasn't been assigned, no code we've
+	 * generated uses that prefix, so we don't need to generate any
+	 * code to load it.)
+	 */
+	if (reg_off_ll != -1) {
 		/*
 		 * The 2 bytes at offsets of 2 and 3 from the beginning
 		 * of the radiotap header are the length of the radiotap
@@ -1906,7 +2289,7 @@
 		 * it.
 		 */
 		s2 = new_stmt(BPF_ST);
-		s2->s.k = reg_ll_size;
+		s2->s.k = reg_off_ll;
 		sappend(s1, s2);
 
 		/*
@@ -1915,13 +2298,9 @@
 		s2 = new_stmt(BPF_MISC|BPF_TAX);
 		sappend(s1, s2);
 
-		/*
-		 * Now append all the existing statements in this
-		 * block to these statements.
-		 */
-		sappend(s1, b->stmts);
-		b->stmts = s1;
-	}
+		return (s1);
+	} else
+		return (NULL);
 }
 
 /* 
@@ -1930,21 +2309,21 @@
  * the code at the beginning to compute the header length.
  * Since this code generator of PPI supports bare 802.11
  * encapsulation only (i.e. the encapsulated DLT should be
- * DLT_IEEE802_11) we generate code to check for this too.
+ * DLT_IEEE802_11) we generate code to check for this too;
+ * that's done in finish_parse().
  */
-static void
-insert_ppi_load_llprefixlen(b)
-	struct block *b;
+static struct slist *
+gen_load_ppi_llprefixlen()
 {
 	struct slist *s1, *s2;
 	
 	/*
-	 * Prepend to the statements in this block code to load the
-	 * length of the radiotap header into the register assigned
-	 * to hold that length, if one has been assigned.
+	 * Generate code to load the length of the radiotap header
+	 * into the register assigned to hold that length, if one has
+	 * been assigned.
 	 */
-	if (reg_ll_size != -1) {
-	    /*
+	if (reg_off_ll != -1) {
+		/*
 		 * The 2 bytes at offsets of 2 and 3 from the beginning
 		 * of the radiotap header are the length of the radiotap
 		 * header; unfortunately, it's little-endian, so we have
@@ -1978,7 +2357,7 @@
 		 * it.
 		 */
 		s2 = new_stmt(BPF_ST);
-		s2->s.k = reg_ll_size;
+		s2->s.k = reg_off_ll;
 		sappend(s1, s2);
 
 		/*
@@ -1987,16 +2366,295 @@
 		s2 = new_stmt(BPF_MISC|BPF_TAX);
 		sappend(s1, s2);
 
-		/*
-		 * Now append all the existing statements in this
-		 * block to these statements.
-		 */
-		sappend(s1, b->stmts);
-		b->stmts = s1;
+		return (s1);
+	} else
+		return (NULL);
+}
 
+/*
+ * Load a value relative to the beginning of the link-layer header after the 802.11
+ * header, i.e. LLC_SNAP.
+ * The link-layer header doesn't necessarily begin at the beginning
+ * of the packet data; there might be a variable-length prefix containing
+ * radio information.
+ */
+static struct slist *
+gen_load_802_11_header_len(struct slist *s, struct slist *snext)
+{
+	struct slist *s2;
+	struct slist *sjset_data_frame_1;
+	struct slist *sjset_data_frame_2;
+	struct slist *sjset_qos;
+	struct slist *sjset_radiotap_flags;
+	struct slist *sjset_radiotap_tsft;
+	struct slist *sjset_tsft_datapad, *sjset_notsft_datapad;
+	struct slist *s_roundup;
+
+	if (reg_off_macpl == -1) {
+		/*
+		 * No register has been assigned to the offset of
+		 * the MAC-layer payload, which means nobody needs
+		 * it; don't bother computing it - just return
+		 * what we already have.
+		 */
+		return (s);
+	}
+
+	/*
+	 * This code is not compatible with the optimizer, as
+	 * we are generating jmp instructions within a normal
+	 * slist of instructions
+	 */
+	no_optimize = 1;
+	
+	/*
+	 * If "s" is non-null, it has code to arrange that the X register
+	 * contains the length of the prefix preceding the link-layer
+	 * header.
+	 *
+	 * Otherwise, the length of the prefix preceding the link-layer
+	 * header is "off_ll".
+	 */
+	if (s == NULL) {
+		/*
+		 * There is no variable-length header preceding the
+		 * link-layer header.
+		 *
+		 * Load the length of the fixed-length prefix preceding
+		 * the link-layer header (if any) into the X register,
+		 * and store it in the reg_off_macpl register.
+		 * That length is off_ll.
+		 */
+		s = new_stmt(BPF_LDX|BPF_IMM);
+		s->s.k = off_ll;
+	}
+
+	/*
+	 * The X register contains the offset of the beginning of the
+	 * link-layer header; add 24, which is the minimum length
+	 * of the MAC header for a data frame, to that, and store it
+	 * in reg_off_macpl, and then load the Frame Control field,
+	 * which is at the offset in the X register, with an indexed load.
+	 */
+	s2 = new_stmt(BPF_MISC|BPF_TXA);
+	sappend(s, s2);
+	s2 = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
+	s2->s.k = 24;
+	sappend(s, s2);
+	s2 = new_stmt(BPF_ST);
+	s2->s.k = reg_off_macpl;
+	sappend(s, s2);
+
+	s2 = new_stmt(BPF_LD|BPF_IND|BPF_B);
+	s2->s.k = 0;
+	sappend(s, s2);
+
+	/*
+	 * Check the Frame Control field to see if this is a data frame;
+	 * a data frame has the 0x08 bit (b3) in that field set and the
+	 * 0x04 bit (b2) clear.
+	 */
+	sjset_data_frame_1 = new_stmt(JMP(BPF_JSET));
+	sjset_data_frame_1->s.k = 0x08;
+	sappend(s, sjset_data_frame_1);
+		
+	/*
+	 * If b3 is set, test b2, otherwise go to the first statement of
+	 * the rest of the program.
+	 */
+	sjset_data_frame_1->s.jt = sjset_data_frame_2 = new_stmt(JMP(BPF_JSET));
+	sjset_data_frame_2->s.k = 0x04;
+	sappend(s, sjset_data_frame_2);
+	sjset_data_frame_1->s.jf = snext;
+
+	/*
+	 * If b2 is not set, this is a data frame; test the QoS bit.
+	 * Otherwise, go to the first statement of the rest of the
+	 * program.
+	 */
+	sjset_data_frame_2->s.jt = snext;
+	sjset_data_frame_2->s.jf = sjset_qos = new_stmt(JMP(BPF_JSET));
+	sjset_qos->s.k = 0x80;	/* QoS bit */
+	sappend(s, sjset_qos);
+		
+	/*
+	 * If it's set, add 2 to reg_off_macpl, to skip the QoS
+	 * field.
+	 * Otherwise, go to the first statement of the rest of the
+	 * program.
+	 */
+	sjset_qos->s.jt = s2 = new_stmt(BPF_LD|BPF_MEM);
+	s2->s.k = reg_off_macpl;
+	sappend(s, s2);
+	s2 = new_stmt(BPF_ALU|BPF_ADD|BPF_IMM);
+	s2->s.k = 2;
+	sappend(s, s2);
+	s2 = new_stmt(BPF_ST);
+	s2->s.k = reg_off_macpl;
+	sappend(s, s2);
+
+	/*
+	 * If we have a radiotap header, look at it to see whether
+	 * there's Atheros padding between the MAC-layer header
+	 * and the payload.
+	 *
+	 * Note: all of the fields in the radiotap header are
+	 * little-endian, so we byte-swap all of the values
+	 * we test against, as they will be loaded as big-endian
+	 * values.
+	 */
+	if (linktype == DLT_IEEE802_11_RADIO) {
+		/*
+		 * Is the IEEE80211_RADIOTAP_FLAGS bit (0x0000002) set
+		 * in the presence flag?
+		 */
+		sjset_qos->s.jf = s2 = new_stmt(BPF_LD|BPF_ABS|BPF_W);
+		s2->s.k = 4;
+		sappend(s, s2);
+
+		sjset_radiotap_flags = new_stmt(JMP(BPF_JSET));
+		sjset_radiotap_flags->s.k = SWAPLONG(0x00000002);
+		sappend(s, sjset_radiotap_flags);
+
+		/*
+		 * If not, skip all of this.
+		 */
+		sjset_radiotap_flags->s.jf = snext;
+
+		/*
+		 * Otherwise, is the IEEE80211_RADIOTAP_TSFT bit set?
+		 */
+		sjset_radiotap_tsft = sjset_radiotap_flags->s.jt =
+		    new_stmt(JMP(BPF_JSET));
+		sjset_radiotap_tsft->s.k = SWAPLONG(0x00000001);
+		sappend(s, sjset_radiotap_tsft);
+
+		/*
+		 * If IEEE80211_RADIOTAP_TSFT is set, the flags field is
+		 * at an offset of 16 from the beginning of the raw packet
+		 * data (8 bytes for the radiotap header and 8 bytes for
+		 * the TSFT field).
+		 *
+		 * Test whether the IEEE80211_RADIOTAP_F_DATAPAD bit (0x20)
+		 * is set.
+		 */
+		sjset_radiotap_tsft->s.jt = s2 = new_stmt(BPF_LD|BPF_ABS|BPF_B);
+		s2->s.k = 16;
+		sappend(s, s2);
+
+		sjset_tsft_datapad = new_stmt(JMP(BPF_JSET));
+		sjset_tsft_datapad->s.k = 0x20;
+		sappend(s, sjset_tsft_datapad);
+
+		/*
+		 * If IEEE80211_RADIOTAP_TSFT is not set, the flags field is
+		 * at an offset of 8 from the beginning of the raw packet
+		 * data (8 bytes for the radiotap header).
+		 *
+		 * Test whether the IEEE80211_RADIOTAP_F_DATAPAD bit (0x20)
+		 * is set.
+		 */
+		sjset_radiotap_tsft->s.jf = s2 = new_stmt(BPF_LD|BPF_ABS|BPF_B);
+		s2->s.k = 8;
+		sappend(s, s2);
+
+		sjset_notsft_datapad = new_stmt(JMP(BPF_JSET));
+		sjset_notsft_datapad->s.k = 0x20;
+		sappend(s, sjset_notsft_datapad);
+
+		/*
+		 * In either case, if IEEE80211_RADIOTAP_F_DATAPAD is
+		 * set, round the length of the 802.11 header to
+		 * a multiple of 4.  Do that by adding 3 and then
+		 * dividing by and multiplying by 4, which we do by
+		 * ANDing with ~3.
+		 */
+		s_roundup = new_stmt(BPF_LD|BPF_MEM);
+		s_roundup->s.k = reg_off_macpl;
+		sappend(s, s_roundup);
+		s2 = new_stmt(BPF_ALU|BPF_ADD|BPF_IMM);
+		s2->s.k = 3;
+		sappend(s, s2);
+		s2 = new_stmt(BPF_ALU|BPF_AND|BPF_IMM);
+		s2->s.k = ~3;
+		sappend(s, s2);
+		s2 = new_stmt(BPF_ST);
+		s2->s.k = reg_off_macpl;
+		sappend(s, s2);
+
+		sjset_tsft_datapad->s.jt = s_roundup;
+		sjset_tsft_datapad->s.jf = snext;
+		sjset_notsft_datapad->s.jt = s_roundup;
+		sjset_notsft_datapad->s.jf = snext;
+	} else
+		sjset_qos->s.jf = snext;
+
+	return s;
+}
+
+static void
+insert_compute_vloffsets(b)
+	struct block *b;
+{
+	struct slist *s;
+
+	/*
+	 * For link-layer types that have a variable-length header
+	 * preceding the link-layer header, generate code to load
+	 * the offset of the link-layer header into the register
+	 * assigned to that offset, if any.
+	 */
+	switch (linktype) {
+
+	case DLT_PRISM_HEADER:
+		s = gen_load_prism_llprefixlen();
+		break;
+
+	case DLT_IEEE802_11_RADIO_AVS:
+		s = gen_load_avs_llprefixlen();
+		break;
+
+	case DLT_IEEE802_11_RADIO:
+		s = gen_load_radiotap_llprefixlen();
+		break;
+
+	case DLT_PPI:
+		s = gen_load_ppi_llprefixlen();
+		break;
+
+	default:
+		s = NULL;
+		break;
+	}
+
+	/*
+	 * For link-layer types that have a variable-length link-layer
+	 * header, generate code to load the offset of the MAC-layer
+	 * payload into the register assigned to that offset, if any.
+	 */
+	switch (linktype) {
+
+	case DLT_IEEE802_11:
+	case DLT_PRISM_HEADER:
+	case DLT_IEEE802_11_RADIO_AVS:
+	case DLT_IEEE802_11_RADIO:
+	case DLT_PPI:
+		s = gen_load_802_11_header_len(s, b->stmts);
+		break;
+	}
+
+	/*
+	 * If we have any offset-loading code, append all the
+	 * existing statements in the block to those statements,
+	 * and make the resulting list the list of statements
+	 * for the block.
+	 */
+	if (s != NULL) {
+		sappend(s, b->stmts);
+		b->stmts = s;
 	}
 }
-	
+
 static struct block *
 gen_ppi_dlt_check(void)
 {
@@ -2023,42 +2681,61 @@
 	return b;
 }
 
-static void
-insert_load_llprefixlen(b)
-	struct block *b;
+static struct slist *
+gen_prism_llprefixlen(void)
 {
-	switch (linktype) {
+	struct slist *s;
 
-	/* 
-	 * At the moment we treat PPI as normal Radiotap encoded
-	 * packets. The difference is in the function that generates
-	 * the code at the beginning to compute the header length.
-	 * Since this code generator of PPI supports bare 802.11
-	 * encapsulation only (i.e. the encapsulated DLT should be
-	 * DLT_IEEE802_11) we generate code to check for this too.
-	 */
-	case DLT_PPI:
-		insert_ppi_load_llprefixlen(b);
-		break;
-
-	case DLT_IEEE802_11_RADIO:
-		insert_radiotap_load_llprefixlen(b);
-		break;
+	if (reg_off_ll == -1) {
+		/*
+		 * We haven't yet assigned a register for the length
+		 * of the radio header; allocate one.
+		 */
+		reg_off_ll = alloc_reg();
 	}
+
+	/*
+	 * Load the register containing the radio length
+	 * into the X register.
+	 */
+	s = new_stmt(BPF_LDX|BPF_MEM);
+	s->s.k = reg_off_ll;
+	return s;
 }
 
+static struct slist *
+gen_avs_llprefixlen(void)
+{
+	struct slist *s;
+
+	if (reg_off_ll == -1) {
+		/*
+		 * We haven't yet assigned a register for the length
+		 * of the AVS header; allocate one.
+		 */
+		reg_off_ll = alloc_reg();
+	}
+
+	/*
+	 * Load the register containing the AVS length
+	 * into the X register.
+	 */
+	s = new_stmt(BPF_LDX|BPF_MEM);
+	s->s.k = reg_off_ll;
+	return s;
+}
 
 static struct slist *
 gen_radiotap_llprefixlen(void)
 {
 	struct slist *s;
 
-	if (reg_ll_size == -1) {
+	if (reg_off_ll == -1) {
 		/*
 		 * We haven't yet assigned a register for the length
 		 * of the radiotap header; allocate one.
 		 */
-		reg_ll_size = alloc_reg();
+		reg_off_ll = alloc_reg();
 	}
 
 	/*
@@ -2066,7 +2743,7 @@
 	 * into the X register.
 	 */
 	s = new_stmt(BPF_LDX|BPF_MEM);
-	s->s.k = reg_ll_size;
+	s->s.k = reg_off_ll;
 	return s;
 }
 
@@ -2083,25 +2760,23 @@
 {
 	struct slist *s;
 
-	if (reg_ll_size == -1) {
+	if (reg_off_ll == -1) {
 		/*
 		 * We haven't yet assigned a register for the length
 		 * of the radiotap header; allocate one.
 		 */
-		reg_ll_size = alloc_reg();
+		reg_off_ll = alloc_reg();
 	}
 
 	/*
-	 * Load the register containing the radiotap length
+	 * Load the register containing the PPI length
 	 * into the X register.
 	 */
 	s = new_stmt(BPF_LDX|BPF_MEM);
-	s->s.k = reg_ll_size;
+	s->s.k = reg_off_ll;
 	return s;
 }
 
-
-
 /*
  * Generate code to compute the link-layer header length, if necessary,
  * putting it into the X register, and to return either a pointer to a
@@ -2113,19 +2788,108 @@
 {
 	switch (linktype) {
 
-	case DLT_PPI:
-		return gen_ppi_llprefixlen();
+	case DLT_PRISM_HEADER:
+		return gen_prism_llprefixlen();
 
-	
+	case DLT_IEEE802_11_RADIO_AVS:
+		return gen_avs_llprefixlen();
+
 	case DLT_IEEE802_11_RADIO:
 		return gen_radiotap_llprefixlen();
 
+	case DLT_PPI:
+		return gen_ppi_llprefixlen();
+
 	default:
 		return NULL;
 	}
 }
 
 /*
+ * Generate code to load the register containing the offset of the
+ * MAC-layer payload into the X register; if no register for that offset
+ * has been allocated, allocate it first.
+ */
+static struct slist *
+gen_off_macpl(void)
+{
+	struct slist *s;
+
+	if (off_macpl_is_variable) {
+		if (reg_off_macpl == -1) {
+			/*
+			 * We haven't yet assigned a register for the offset
+			 * of the MAC-layer payload; allocate one.
+			 */
+			reg_off_macpl = alloc_reg();
+		}
+
+		/*
+		 * Load the register containing the offset of the MAC-layer
+		 * payload into the X register.
+		 */
+		s = new_stmt(BPF_LDX|BPF_MEM);
+		s->s.k = reg_off_macpl;
+		return s;
+	} else {
+		/*
+		 * That offset isn't variable, so we don't need to
+		 * generate any code.
+		 */
+		return NULL;
+	}
+}
+
+/*
+ * Map an Ethernet type to the equivalent PPP type.
+ */
+static int
+ethertype_to_ppptype(proto)
+	int proto;
+{
+	switch (proto) {
+
+	case ETHERTYPE_IP:
+		proto = PPP_IP;
+		break;
+
+	case ETHERTYPE_IPV6:
+		proto = PPP_IPV6;
+		break;
+
+	case ETHERTYPE_DN:
+		proto = PPP_DECNET;
+		break;
+
+	case ETHERTYPE_ATALK:
+		proto = PPP_APPLE;
+		break;
+
+	case ETHERTYPE_NS:
+		proto = PPP_NS;
+		break;
+
+	case LLCSAP_ISONS:
+		proto = PPP_OSI;
+		break;
+
+	case LLCSAP_8021D:
+		/*
+		 * I'm assuming the "Bridging PDU"s that go
+		 * over PPP are Spanning Tree Protocol
+		 * Bridging PDUs.
+		 */
+		proto = PPP_BRPDU;
+		break;
+
+	case LLCSAP_IPX:
+		proto = PPP_IPX;
+		break;
+	}
+	return (proto);
+}
+
+/*
  * Generate code to match a particular packet type by matching the
  * link-layer type field or fields in the 802.2 LLC header.
  *
@@ -2143,12 +2907,12 @@
 		switch (proto) {
 		case ETHERTYPE_IP:
 		case PPP_IP:
-		/* FIXME add other L3 proto IDs */
+			/* FIXME add other L3 proto IDs */
 			return gen_mpls_linktype(Q_IP); 
 
 		case ETHERTYPE_IPV6:
 		case PPP_IPV6:
-		/* FIXME add other L3 proto IDs */
+			/* FIXME add other L3 proto IDs */
 			return gen_mpls_linktype(Q_IPV6); 
 
 		default:
@@ -2157,9 +2921,30 @@
 		}
 	}
 
+	/*
+	 * Are we testing PPPoE packets?
+	 */
+	if (is_pppoes) {
+		/*
+		 * The PPPoE session header is part of the
+		 * MAC-layer payload, so all references
+		 * should be relative to the beginning of
+		 * that payload.
+		 */
+
+		/*
+		 * We use Ethernet protocol types inside libpcap;
+		 * map them to the corresponding PPP protocol types.
+		 */
+		proto = ethertype_to_ppptype(proto);
+		return gen_cmp(OR_MACPL, off_linktype, BPF_H, (bpf_int32)proto);
+	}
+
 	switch (linktype) {
 
 	case DLT_EN10MB:
+	case DLT_NETANALYZER:
+	case DLT_NETANALYZER_TRANSPARENT:
 		return gen_ether_linktype(proto);
 		/*NOTREACHED*/
 		break;
@@ -2179,13 +2964,41 @@
 		}
 		break;
 
-	case DLT_PPI:
-	case DLT_FDDI:
-	case DLT_IEEE802:
 	case DLT_IEEE802_11:
+	case DLT_PRISM_HEADER:
 	case DLT_IEEE802_11_RADIO_AVS:
 	case DLT_IEEE802_11_RADIO:
-	case DLT_PRISM_HEADER:
+	case DLT_PPI:
+		/*
+		 * Check that we have a data frame.
+		 */
+		b0 = gen_check_802_11_data_frame();
+
+		/*
+		 * Now check for the specified link-layer type.
+		 */
+		b1 = gen_llc_linktype(proto);
+		gen_and(b0, b1);
+		return b1;
+		/*NOTREACHED*/
+		break;
+
+	case DLT_FDDI:
+		/*
+		 * XXX - check for asynchronous frames, as per RFC 1103.
+		 */
+		return gen_llc_linktype(proto);
+		/*NOTREACHED*/
+		break;
+
+	case DLT_IEEE802:
+		/*
+		 * XXX - check for LLC PDUs, as per IEEE 802.5.
+		 */
+		return gen_llc_linktype(proto);
+		/*NOTREACHED*/
+		break;
+
 	case DLT_ATM_RFC1483:
 	case DLT_ATM_CLIP:
 	case DLT_IP_OVER_FC:
@@ -2250,11 +3063,10 @@
 		case ETHERTYPE_IP:
 			/* Check for a version number of 4. */
 			return gen_mcmp(OR_LINK, 0, BPF_B, 0x40, 0xF0);
-#ifdef INET6
+
 		case ETHERTYPE_IPV6:
 			/* Check for a version number of 6. */
 			return gen_mcmp(OR_LINK, 0, BPF_B, 0x60, 0xF0);
-#endif
 
 		default:
 			return gen_false();		/* always false */
@@ -2262,6 +3074,30 @@
 		/*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.
+		 */
+		if (proto == ETHERTYPE_IPV6)
+			return gen_true();		/* always true */
+
+		/* Checking for something other than IPv6; always false */
+		return gen_false();
+		/*NOTREACHED*/
+		break;
+
 	case DLT_PPP:
 	case DLT_PPP_PPPD:
 	case DLT_PPP_SERIAL:
@@ -2270,47 +3106,9 @@
 		 * We use Ethernet protocol types inside libpcap;
 		 * map them to the corresponding PPP protocol types.
 		 */
-		switch (proto) {
-
-		case ETHERTYPE_IP:
-			proto = PPP_IP;
-			break;
-
-#ifdef INET6
-		case ETHERTYPE_IPV6:
-			proto = PPP_IPV6;
-			break;
-#endif
-
-		case ETHERTYPE_DN:
-			proto = PPP_DECNET;
-			break;
-
-		case ETHERTYPE_ATALK:
-			proto = PPP_APPLE;
-			break;
-
-		case ETHERTYPE_NS:
-			proto = PPP_NS;
-			break;
-
-		case LLCSAP_ISONS:
-			proto = PPP_OSI;
-			break;
-
-		case LLCSAP_8021D:
-			/*
-			 * I'm assuming the "Bridging PDU"s that go
-			 * over PPP are Spanning Tree Protocol
-			 * Bridging PDUs.
-			 */
-			proto = PPP_BRPDU;
-			break;
-
-		case LLCSAP_IPX:
-			proto = PPP_IPX;
-			break;
-		}
+		proto = ethertype_to_ppptype(proto);
+		return gen_cmp(OR_LINK, off_linktype, BPF_H, (bpf_int32)proto);
+		/*NOTREACHED*/
 		break;
 
 	case DLT_PPP_BSDOS:
@@ -2321,6 +3119,10 @@
 		switch (proto) {
 
 		case ETHERTYPE_IP:
+			/*
+			 * Also check for Van Jacobson-compressed IP.
+			 * XXX - do this for other forms of PPP?
+			 */
 			b0 = gen_cmp(OR_LINK, off_linktype, BPF_H, PPP_IP);
 			b1 = gen_cmp(OR_LINK, off_linktype, BPF_H, PPP_VJC);
 			gen_or(b0, b1);
@@ -2328,42 +3130,12 @@
 			gen_or(b1, b0);
 			return b0;
 
-#ifdef INET6
-		case ETHERTYPE_IPV6:
-			proto = PPP_IPV6;
-			/* more to go? */
-			break;
-#endif
-
-		case ETHERTYPE_DN:
-			proto = PPP_DECNET;
-			break;
-
-		case ETHERTYPE_ATALK:
-			proto = PPP_APPLE;
-			break;
-
-		case ETHERTYPE_NS:
-			proto = PPP_NS;
-			break;
-
-		case LLCSAP_ISONS:
-			proto = PPP_OSI;
-			break;
-
-		case LLCSAP_8021D:
-			/*
-			 * I'm assuming the "Bridging PDU"s that go
-			 * over PPP are Spanning Tree Protocol
-			 * Bridging PDUs.
-			 */
-			proto = PPP_BRPDU;
-			break;
-
-		case LLCSAP_IPX:
-			proto = PPP_IPX;
-			break;
+		default:
+			proto = ethertype_to_ppptype(proto);
+			return gen_cmp(OR_LINK, off_linktype, BPF_H,
+				(bpf_int32)proto);
 		}
+		/*NOTREACHED*/
 		break;
 
 	case DLT_NULL:
@@ -2425,8 +3197,7 @@
 			 * Then we run it through "htonl()", and
 			 * generate code to compare against the result.
 			 */
-			if (bpf_pcap->sf.rfile != NULL &&
-			    bpf_pcap->sf.swapped)
+			if (bpf_pcap->rfile != NULL && bpf_pcap->swapped)
 				proto = SWAPLONG(proto);
 			proto = htonl(proto);
 		}
@@ -2441,11 +3212,9 @@
 		if (proto == ETHERTYPE_IP)
 			return (gen_cmp(OR_LINK, offsetof(struct pfloghdr, af),
 			    BPF_B, (bpf_int32)AF_INET));
-#ifdef INET6
 		else if (proto == ETHERTYPE_IPV6)
 			return (gen_cmp(OR_LINK, offsetof(struct pfloghdr, af),
 			    BPF_B, (bpf_int32)AF_INET6));
-#endif /* INET6 */
 		else
 			return gen_false();
 		/*NOTREACHED*/
@@ -2463,11 +3232,9 @@
 		default:
 			return gen_false();
 
-#ifdef INET6
 		case ETHERTYPE_IPV6:
 			return (gen_cmp(OR_LINK, off_linktype, BPF_B,
 				(bpf_int32)ARCTYPE_INET6));
-#endif /* INET6 */
 
 		case ETHERTYPE_IP:
 			b0 = gen_cmp(OR_LINK, off_linktype, BPF_B,
@@ -2519,13 +3286,11 @@
 			 */
 			return gen_cmp(OR_LINK, 2, BPF_H, (0x03<<8) | 0xcc);
 
-#ifdef INET6
 		case ETHERTYPE_IPV6:
 			/*
 			 * Check for the special NLPID for IPv6.
 			 */
 			return gen_cmp(OR_LINK, 2, BPF_H, (0x03<<8) | 0x8e);
-#endif
 
 		case LLCSAP_ISONS:
 			/*
@@ -2552,6 +3317,9 @@
 		/*NOTREACHED*/
 		break;
 
+	case DLT_MFR:
+		bpf_error("Multi-link Frame Relay link-layer type filtering not implemented");
+
         case DLT_JUNIPER_MFR:
         case DLT_JUNIPER_MLFR:
         case DLT_JUNIPER_MLPPP:
@@ -2568,6 +3336,13 @@
         case DLT_JUNIPER_FRELAY:
         case DLT_JUNIPER_CHDLC:
         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
@@ -2577,14 +3352,64 @@
 		 */
 		return gen_mcmp(OR_LINK, 0, BPF_W, 0x4d474300, 0xffffff00); /* compare the magic number */
 
+	case DLT_BACNET_MS_TP:
+		return gen_mcmp(OR_LINK, 0, BPF_W, 0x55FF0000, 0xffff0000);
+
+	case DLT_IPNET:
+		return gen_ipnet_linktype(proto);
+
 	case DLT_LINUX_IRDA:
 		bpf_error("IrDA link-layer type filtering not implemented");
 
 	case DLT_DOCSIS:
 		bpf_error("DOCSIS link-layer type filtering not implemented");
 
+	case DLT_MTP2:
+	case DLT_MTP2_WITH_PHDR:
+		bpf_error("MTP2 link-layer type filtering not implemented");
+
+	case DLT_ERF:
+		bpf_error("ERF link-layer type filtering not implemented");
+
+	case DLT_PFSYNC:
+		bpf_error("PFSYNC link-layer type filtering not implemented");
+
 	case DLT_LINUX_LAPD:
 		bpf_error("LAPD link-layer type filtering not implemented");
+
+	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:
+	case DLT_BLUETOOTH_HCI_H4_WITH_PHDR:
+		bpf_error("Bluetooth link-layer type filtering not implemented");
+
+	case DLT_CAN20B:
+	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:
+		bpf_error("IEEE 802.16 link-layer type filtering not implemented");
+
+	case DLT_SITA:
+		bpf_error("SITA link-layer type filtering not implemented");
+
+	case DLT_RAIF1:
+		bpf_error("RAIF1 link-layer type filtering not implemented");
+
+	case DLT_IPMB:
+		bpf_error("IPMB link-layer type filtering not implemented");
+
+	case DLT_AX25_KISS:
+		bpf_error("AX.25 link-layer type filtering not implemented");
 	}
 
 	/*
@@ -2602,12 +3427,7 @@
 
 	/*
 	 * Any type not handled above should always have an Ethernet
-	 * type at an offset of "off_linktype".  (PPP is partially
-	 * handled above - the protocol type is mapped from the
-	 * Ethernet and LLC types we use internally to the corresponding
-	 * PPP type - but the PPP type is always specified by a value
-	 * at "off_linktype", so we don't have to do the code generation
-	 * above.)
+	 * type at an offset of "off_linktype".
 	 */
 	return gen_cmp(OR_LINK, off_linktype, BPF_H, (bpf_int32)proto);
 }
@@ -2620,10 +3440,9 @@
  * code and protocol type in the SNAP header.
  */
 static struct block *
-gen_snap(orgcode, ptype, offset)
+gen_snap(orgcode, ptype)
 	bpf_u_int32 orgcode;
 	bpf_u_int32 ptype;
-	u_int offset;
 {
 	u_char snapblock[8];
 
@@ -2635,7 +3454,7 @@
 	snapblock[5] = (orgcode >> 0);	/* lower 8 bits of organization code */
 	snapblock[6] = (ptype >> 8);	/* upper 8 bits of protocol type */
 	snapblock[7] = (ptype >> 0);	/* lower 8 bits of protocol type */
-	return gen_bcmp(OR_LINK, offset, 8, snapblock);
+	return gen_bcmp(OR_MACPL, 0, 8, snapblock);
 }
 
 /*
@@ -2668,7 +3487,7 @@
 		 * DSAP, as we do for other types <= ETHERMTU
 		 * (i.e., other SAP values)?
 		 */
-		return gen_cmp(OR_LINK, off_linktype, BPF_H, (bpf_u_int32)
+		return gen_cmp(OR_MACPL, 0, BPF_H, (bpf_u_int32)
 			     ((proto << 8) | proto));
 
 	case LLCSAP_IPX:
@@ -2676,7 +3495,7 @@
 		 * XXX - are there ever SNAP frames for IPX on
 		 * non-Ethernet 802.x networks?
 		 */
-		return gen_cmp(OR_LINK, off_linktype, BPF_B,
+		return gen_cmp(OR_MACPL, 0, BPF_B,
 		    (bpf_int32)LLCSAP_IPX);
 
 	case ETHERTYPE_ATALK:
@@ -2689,7 +3508,7 @@
 		 * XXX - check for an organization code of
 		 * encapsulated Ethernet as well?
 		 */
-		return gen_snap(0x080007, ETHERTYPE_ATALK, off_linktype);
+		return gen_snap(0x080007, ETHERTYPE_ATALK);
 
 	default:
 		/*
@@ -2701,8 +3520,7 @@
 			 * This is an LLC SAP value, so check
 			 * the DSAP.
 			 */
-			return gen_cmp(OR_LINK, off_linktype, BPF_B,
-			    (bpf_int32)proto);
+			return gen_cmp(OR_MACPL, 0, BPF_B, (bpf_int32)proto);
 		} else {
 			/*
 			 * This is an Ethernet type; we assume that it's
@@ -2717,15 +3535,13 @@
 			 * organization code of 0x000000 (encapsulated
 			 * Ethernet), we'd do
 			 *
-			 *	return gen_snap(0x000000, proto,
-			 *	    off_linktype);
+			 *	return gen_snap(0x000000, proto);
 			 *
 			 * here; for now, we don't, as per the above.
 			 * I don't know whether it's worth the extra CPU
 			 * time to do the right check or not.
 			 */
-			return gen_cmp(OR_LINK, off_linktype+6, BPF_H,
-			    (bpf_int32)proto);
+			return gen_cmp(OR_MACPL, 6, BPF_H, (bpf_int32)proto);
 		}
 	}
 }
@@ -2824,7 +3640,7 @@
 	gen_and(b0, b1);
 	return b1;
 }
-#endif /*INET6*/
+#endif
 
 static struct block *
 gen_ehostop(eaddr, dir)
@@ -2852,6 +3668,30 @@
 		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 */
@@ -2869,18 +3709,10 @@
 
 	switch (dir) {
 	case Q_SRC:
-#ifdef PCAP_FDDIPAD
 		return gen_bcmp(OR_LINK, 6 + 1 + pcap_fddipad, 6, eaddr);
-#else
-		return gen_bcmp(OR_LINK, 6 + 1, 6, eaddr);
-#endif
 
 	case Q_DST:
-#ifdef PCAP_FDDIPAD
 		return gen_bcmp(OR_LINK, 0 + 1 + pcap_fddipad, 6, eaddr);
-#else
-		return gen_bcmp(OR_LINK, 0 + 1, 6, eaddr);
-#endif
 
 	case Q_AND:
 		b0 = gen_fhostop(eaddr, Q_SRC);
@@ -2894,6 +3726,30 @@
 		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 */
@@ -2928,13 +3784,38 @@
 		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 */
 }
 
 /*
- * Like gen_ehostop, but for DLT_IEEE802_11 (802.11 wireless LAN)
+ * Like gen_ehostop, but for DLT_IEEE802_11 (802.11 wireless LAN) and
+ * various 802.11 + radio headers.
  */
 static struct block *
 gen_wlanhostop(eaddr, dir)
@@ -2944,6 +3825,16 @@
 	register struct block *b0, *b1, *b2;
 	register struct slist *s;
 
+#ifdef ENABLE_WLAN_FILTERING_PATCH
+	/*
+	 * TODO GV 20070613
+	 * We need to disable the optimizer because the optimizer is buggy
+	 * and wipes out some LD instructions generated by the below
+	 * code to validate the Frame Control bits
+	 */
+	no_optimize = 1;
+#endif /* ENABLE_WLAN_FILTERING_PATCH */
+
 	switch (dir) {
 	case Q_SRC:
 		/*
@@ -3041,7 +3932,7 @@
 		 * Now check for a data frame.
 		 * I.e, check "link[0] & 0x08".
 		 */
-		gen_load_a(OR_LINK, 0, BPF_B);
+		s = gen_load_a(OR_LINK, 0, BPF_B);
 		b1 = new_block(JMP(BPF_JSET));
 		b1->s.k = 0x08;
 		b1->stmts = s;
@@ -3210,6 +4101,126 @@
 		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 BSSID keyword?
+	 */
+	case Q_ADDR1:
+		return (gen_bcmp(OR_LINK, 4, 6, eaddr));
+
+	case Q_ADDR2:
+		/*
+		 * 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);
+		b1 = gen_bcmp(OR_LINK, 10, 6, eaddr);
+		gen_and(b2, b1);
+		return b1;
+
+	case Q_ADDR3:
+		/*
+		 * Not present in control frames.
+		 */
+		b0 = gen_mcmp(OR_LINK, 0, BPF_B, IEEE80211_FC0_TYPE_CTL,
+			IEEE80211_FC0_TYPE_MASK);
+		gen_not(b0);
+		b1 = gen_bcmp(OR_LINK, 16, 6, eaddr);
+		gen_and(b0, b1);
+		return b1;
+
+	case Q_ADDR4:
+		/*
+		 * Present only if the direction mask has both "From DS"
+		 * and "To DS" set.  Neither control frames nor management
+		 * frames should have both of those set, so we don't
+		 * check the frame type.
+		 */
+		b0 = gen_mcmp(OR_LINK, 1, BPF_B,
+			IEEE80211_FC1_DIR_DSTODS, IEEE80211_FC1_DIR_MASK);
+		b1 = gen_bcmp(OR_LINK, 24, 6, eaddr);
+		gen_and(b0, b1);
+		return b1;
+
 	case Q_AND:
 		b0 = gen_wlanhostop(eaddr, Q_SRC);
 		b1 = gen_wlanhostop(eaddr, Q_DST);
@@ -3258,6 +4269,30 @@
 		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 */
@@ -3451,6 +4486,9 @@
 	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");
 
@@ -3472,13 +4510,11 @@
 	case Q_MOPRC:
 		bpf_error("MOPRC host filtering not implemented");
 
-#ifdef INET6
 	case Q_IPV6:
 		bpf_error("'ip6' modifier applied to ip host");
 
 	case Q_ICMPV6:
 		bpf_error("'icmp6' modifier applied to %s", typestr);
-#endif /* INET6 */
 
 	case Q_AH:
 		bpf_error("'ah' modifier applied to %s", typestr);
@@ -3537,6 +4573,9 @@
 	case Q_DEFAULT:
 		return gen_host6(addr, mask, Q_IPV6, dir, type);
 
+	case Q_LINK:
+		bpf_error("link-layer modifier applied to ip6 %s", typestr);
+
 	case Q_IP:
 		bpf_error("'ip' modifier applied to ip6 %s", typestr);
 
@@ -3570,6 +4609,9 @@
 	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");
 
@@ -3632,7 +4674,7 @@
 	}
 	/* NOTREACHED */
 }
-#endif /*INET6*/
+#endif
 
 #ifndef INET6
 static struct block *
@@ -3652,32 +4694,36 @@
 	case Q_IP:
 	case Q_ARP:
 	case Q_RARP:
-                switch (linktype) {
-                case DLT_EN10MB:
-                    b0 = gen_ehostop(eaddr, Q_OR);
-                    break;
-                case DLT_FDDI:
-                    b0 = gen_fhostop(eaddr, Q_OR);
-                    break;
+		switch (linktype) {
+		case DLT_EN10MB:
+		case DLT_NETANALYZER:
+		case DLT_NETANALYZER_TRANSPARENT:
+			b0 = gen_ehostop(eaddr, Q_OR);
+			break;
+		case DLT_FDDI:
+			b0 = gen_fhostop(eaddr, Q_OR);
+			break;
 		case DLT_IEEE802:
-                    b0 = gen_thostop(eaddr, Q_OR);
-                    break;
+			b0 = gen_thostop(eaddr, Q_OR);
+			break;
 		case DLT_IEEE802_11:
-		case DLT_IEEE802_11_RADIO_AVS:
-		case DLT_PPI:
-		case DLT_IEEE802_11_RADIO:
 		case DLT_PRISM_HEADER:
-                    b0 = gen_wlanhostop(eaddr, Q_OR);
-                    break;
-                case DLT_SUNATM:
-                    if (is_lane) {
+		case DLT_IEEE802_11_RADIO_AVS:
+		case DLT_IEEE802_11_RADIO:
+		case DLT_PPI:
+			b0 = gen_wlanhostop(eaddr, Q_OR);
+			break;
+		case DLT_SUNATM:
+			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);
+			b1 = gen_cmp(OR_LINK, SUNATM_PKT_BEGIN_POS,
+			    BPF_H, 0xFF00);
 			gen_not(b1);
 
 			/*
@@ -3685,15 +4731,14 @@
 			 */
 			b0 = gen_ehostop(eaddr, Q_OR);
 			gen_and(b1, b0);
-                    }
-                    break;
+			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");
-                }
+			b0 = gen_ipfchostop(eaddr, Q_OR);
+			break;
+		default:
+			bpf_error(
+			    "'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) {
 			tmp = gen_host(**alist++, 0xffffffff, proto, Q_OR,
@@ -3721,26 +4766,20 @@
 
 	case Q_SCTP:
 		b1 = gen_proto(IPPROTO_SCTP, Q_IP, Q_DEFAULT);
-#ifdef INET6
 		b0 = gen_proto(IPPROTO_SCTP, Q_IPV6, Q_DEFAULT);
 		gen_or(b0, b1);
-#endif
 		break;
 
 	case Q_TCP:
 		b1 = gen_proto(IPPROTO_TCP, Q_IP, Q_DEFAULT);
-#ifdef INET6
 		b0 = gen_proto(IPPROTO_TCP, Q_IPV6, Q_DEFAULT);
 		gen_or(b0, b1);
-#endif
 		break;
 
 	case Q_UDP:
 		b1 = gen_proto(IPPROTO_UDP, Q_IP, Q_DEFAULT);
-#ifdef INET6
 		b0 = gen_proto(IPPROTO_UDP, Q_IPV6, Q_DEFAULT);
 		gen_or(b0, b1);
-#endif
 		break;
 
 	case Q_ICMP:
@@ -3768,10 +4807,8 @@
 
 	case Q_PIM:
 		b1 = gen_proto(IPPROTO_PIM, Q_IP, Q_DEFAULT);
-#ifdef INET6
 		b0 = gen_proto(IPPROTO_PIM, Q_IPV6, Q_DEFAULT);
 		gen_or(b0, b1);
-#endif
 		break;
 
 #ifndef IPPROTO_VRRP
@@ -3782,6 +4819,14 @@
 		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;
@@ -3825,7 +4870,6 @@
 		b1 =  gen_linktype(ETHERTYPE_MOPRC);
 		break;
 
-#ifdef INET6
 	case Q_IPV6:
 		b1 = gen_linktype(ETHERTYPE_IPV6);
 		break;
@@ -3836,17 +4880,14 @@
 	case Q_ICMPV6:
 		b1 = gen_proto(IPPROTO_ICMPV6, Q_IPV6, Q_DEFAULT);
 		break;
-#endif /* INET6 */
 
 #ifndef IPPROTO_AH
 #define IPPROTO_AH	51
 #endif
 	case Q_AH:
 		b1 = gen_proto(IPPROTO_AH, Q_IP, Q_DEFAULT);
-#ifdef INET6
 		b0 = gen_proto(IPPROTO_AH, Q_IPV6, Q_DEFAULT);
 		gen_or(b0, b1);
-#endif
 		break;
 
 #ifndef IPPROTO_ESP
@@ -3854,10 +4895,8 @@
 #endif
 	case Q_ESP:
 		b1 = gen_proto(IPPROTO_ESP, Q_IP, Q_DEFAULT);
-#ifdef INET6
 		b0 = gen_proto(IPPROTO_ESP, Q_IPV6, Q_DEFAULT);
 		gen_or(b0, b1);
-#endif
 		break;
 
 	case Q_ISO:
@@ -3963,7 +5002,7 @@
 	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;
@@ -3990,7 +5029,6 @@
 	return gen_cmp(OR_TRAN_IPV4, off, BPF_H, v);
 }
 
-#ifdef INET6
 static struct block *
 gen_portatom6(off, v)
 	int off;
@@ -3998,7 +5036,6 @@
 {
 	return gen_cmp(OR_TRAN_IPV6, off, BPF_H, v);
 }
-#endif/*INET6*/
 
 struct block *
 gen_portop(port, proto, dir)
@@ -4006,7 +5043,7 @@
 {
 	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);
@@ -4090,7 +5127,6 @@
 	return b1;
 }
 
-#ifdef INET6
 struct block *
 gen_portop6(port, proto, dir)
 	int port, proto, dir;
@@ -4098,6 +5134,7 @@
 	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) {
@@ -4162,7 +5199,6 @@
 	gen_and(b0, b1);
 	return b1;
 }
-#endif /* INET6 */
 
 /* gen_portrange code */
 static struct block *
@@ -4199,7 +5235,7 @@
 {
 	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);
@@ -4267,7 +5303,6 @@
 	return b1;
 }
 
-#ifdef INET6
 static struct block *
 gen_portrangeatom6(off, v1, v2)
 	int off;
@@ -4303,6 +5338,7 @@
 	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) {
@@ -4367,7 +5403,6 @@
 	gen_and(b0, b1);
 	return b1;
 }
-#endif /* INET6 */
 
 static int
 lookup_proto(name, proto)
@@ -4458,7 +5493,8 @@
 	}
 
 	/*
-	 * We don't handle variable-length radiotap here headers yet.
+	 * We don't handle variable-length prefixes before the link-layer
+	 * header, or variable-length link-layer headers, here yet.
 	 * We might want to add BPF instructions to do the protochain
 	 * work, to simplify that and, on platforms that have a BPF
 	 * interpreter with the new instructions, let the filtering
@@ -4467,11 +5503,15 @@
 	 * branches, and backward branch support is unlikely to appear
 	 * in kernel BPF engines.)
 	 */
-	if (linktype == DLT_IEEE802_11_RADIO)
-		bpf_error("'protochain' not supported with radiotap headers");
+	switch (linktype) {
 
-	if (linktype == DLT_PPI)
-		bpf_error("'protochain' not supported with PPI headers");
+	case DLT_IEEE802_11:
+	case DLT_PRISM_HEADER:
+	case DLT_IEEE802_11_RADIO_AVS:
+	case DLT_IEEE802_11_RADIO:
+	case DLT_PPI:
+		bpf_error("'protochain' not supported with 802.11");
+	}
 
 	no_optimize = 1; /*this code is not compatible with optimzer yet */
 
@@ -4490,27 +5530,27 @@
 
 		/* A = ip->ip_p */
 		s[i] = new_stmt(BPF_LD|BPF_ABS|BPF_B);
-		s[i]->s.k = off_ll + off_nl + 9;
+		s[i]->s.k = off_macpl + off_nl + 9;
 		i++;
 		/* X = ip->ip_hl << 2 */
 		s[i] = new_stmt(BPF_LDX|BPF_MSH|BPF_B);
-		s[i]->s.k = off_ll + off_nl;
+		s[i]->s.k = off_macpl + off_nl;
 		i++;
 		break;
-#ifdef INET6
+
 	case Q_IPV6:
 		b0 = gen_linktype(ETHERTYPE_IPV6);
 
 		/* A = ip6->ip_nxt */
 		s[i] = new_stmt(BPF_LD|BPF_ABS|BPF_B);
-		s[i]->s.k = off_ll + off_nl + 6;
+		s[i]->s.k = off_macpl + off_nl + 6;
 		i++;
 		/* X = sizeof(struct ip6_hdr) */
 		s[i] = new_stmt(BPF_LDX|BPF_IMM);
 		s[i]->s.k = 40;
 		i++;
 		break;
-#endif
+
 	default:
 		bpf_error("unsupported proto to gen_protochain");
 		/*NOTREACHED*/
@@ -4537,7 +5577,6 @@
 	fix2 = i;
 	i++;
 
-#ifdef INET6
 	if (proto == Q_IPV6) {
 		int v6start, v6end, v6advance, j;
 
@@ -4575,33 +5614,20 @@
 
 		/*
 		 * 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_ll + off_nl;
+		s[i]->s.k = off_macpl + off_nl;
 		i++;
 		/* MEM[reg2] = A */
 		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_ll + off_nl;
+		s[i]->s.k = off_macpl + off_nl + 1;
 		i++;
 		/* A += 1 */
 		s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
@@ -4611,6 +5637,10 @@
 		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++;
@@ -4628,9 +5658,7 @@
 		/* fixup */
 		for (j = v6start; j <= v6end; j++)
 			s[j]->s.jt = s[v6advance];
-	} else
-#endif
-	{
+	} else {
 		/* nop */
 		s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
 		s[i]->s.k = 0;
@@ -4660,7 +5688,7 @@
 	i++;
 	/* A = P[X + packet head]; */
 	s[i] = new_stmt(BPF_LD|BPF_IND|BPF_B);
-	s[i]->s.k = off_ll + off_nl;
+	s[i]->s.k = off_macpl + off_nl;
 	i++;
 	/* MEM[reg2] = A */
 	s[i] = new_stmt(BPF_ST);
@@ -4678,7 +5706,7 @@
 	i++;
 	/* A = P[X + packet head] */
 	s[i] = new_stmt(BPF_LD|BPF_IND|BPF_B);
-	s[i]->s.k = off_ll + off_nl;
+	s[i]->s.k = off_macpl + off_nl;
 	i++;
 	/* A += 2 */
 	s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
@@ -4732,6 +5760,31 @@
 #endif
 }
 
+static struct block *
+gen_check_802_11_data_frame()
+{
+	struct slist *s;
+	struct block *b0, *b1;
+
+	/*
+	 * A data frame has the 0x08 bit (b3) in the frame control field set
+	 * and the 0x04 bit (b2) clear.
+	 */
+	s = gen_load_a(OR_LINK, 0, BPF_B);
+	b0 = new_block(JMP(BPF_JSET));
+	b0->s.k = 0x08;
+	b0->stmts = s;
+	
+	s = gen_load_a(OR_LINK, 0, BPF_B);
+	b1 = new_block(JMP(BPF_JSET));
+	b1->s.k = 0x04;
+	b1->stmts = s;
+	gen_not(b1);
+
+	gen_and(b1, b0);
+
+	return b0;
+}
 
 /*
  * Generate code that checks whether the packet is a packet for protocol
@@ -4749,20 +5802,20 @@
 	int dir;
 {
 	struct block *b0, *b1;
+#ifndef CHASE_CHAIN
+	struct block *b2;
+#endif
 
 	if (dir != Q_DEFAULT)
 		bpf_error("direction applied to 'proto'");
 
 	switch (proto) {
 	case Q_DEFAULT:
-#ifdef INET6
 		b0 = gen_proto(v, Q_IP, dir);
 		b1 = gen_proto(v, Q_IPV6, dir);
 		gen_or(b0, b1);
 		return b1;
-#else
-		/*FALLTHROUGH*/
-#endif
+
 	case Q_IP:
 		/*
 		 * For FDDI, RFC 1188 says that SNAP encapsulation is used,
@@ -4909,11 +5962,22 @@
 		bpf_error("'vrrp proto' is bogus");
 		/* NOTREACHED */
 
-#ifdef INET6
+	case Q_CARP:
+		bpf_error("'carp proto' is bogus");
+		/* NOTREACHED */
+
 	case Q_IPV6:
 		b0 = gen_linktype(ETHERTYPE_IPV6);
 #ifndef CHASE_CHAIN
-		b1 = gen_cmp(OR_NET, 6, BPF_B, (bpf_int32)v);
+		/*
+		 * Also check for a fragment header before the final
+		 * header.
+		 */
+		b2 = gen_cmp(OR_NET, 6, BPF_B, IPPROTO_FRAGMENT);
+		b1 = gen_cmp(OR_NET, 40, BPF_B, (bpf_int32)v);
+		gen_and(b2, b1);
+		b2 = gen_cmp(OR_NET, 6, BPF_B, (bpf_int32)v);
+		gen_or(b2, b1);
 #else
 		b1 = gen_protochain(v, Q_IPV6);
 #endif
@@ -4922,7 +5986,6 @@
 
 	case Q_ICMPV6:
 		bpf_error("'icmp6 proto' is bogus");
-#endif /* INET6 */
 
 	case Q_AH:
 		bpf_error("'ah proto' is bogus");
@@ -4992,6 +6055,8 @@
 			switch (linktype) {
 
 			case DLT_EN10MB:
+			case DLT_NETANALYZER:
+			case DLT_NETANALYZER_TRANSPARENT:
 				eaddr = pcap_ether_hostton(name);
 				if (eaddr == NULL)
 					bpf_error(
@@ -5019,9 +6084,9 @@
 				return b;
 
 			case DLT_IEEE802_11:
+			case DLT_PRISM_HEADER:
 			case DLT_IEEE802_11_RADIO_AVS:
 			case DLT_IEEE802_11_RADIO:
-			case DLT_PRISM_HEADER:
 			case DLT_PPI:
 				eaddr = pcap_ether_hostton(name);
 				if (eaddr == NULL)
@@ -5092,6 +6157,7 @@
 			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) {
@@ -5125,6 +6191,7 @@
 					gen_or(b, tmp);
 				b = tmp;
 			}
+			ai = NULL;
 			freeaddrinfo(res0);
 			if (b == NULL) {
 				bpf_error("unknown host '%s'%s", name,
@@ -5171,13 +6238,13 @@
 				/* override PROTO_UNDEF */
 				real_proto = IPPROTO_SCTP;
 		}
-#ifndef INET6
-		return gen_port(port, real_proto, dir);
-#else
+		if (port < 0)
+			bpf_error("illegal port number %d < 0", port);
+		if (port > 65535)
+			bpf_error("illegal port number %d > 65535", port);
 		b = gen_port(port, real_proto, dir);
 		gen_or(gen_port6(port, real_proto, dir), b);
 		return b;
-#endif /* INET6 */
 
 	case Q_PORTRANGE:
 		if (proto != Q_DEFAULT &&
@@ -5212,13 +6279,18 @@
 				/* override PROTO_UNDEF */
 				real_proto = IPPROTO_SCTP;	
 		}
-#ifndef INET6
-		return gen_portrange(port1, port2, real_proto, dir);
-#else
+		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);
+
 		b = gen_portrange(port1, port2, real_proto, dir);
 		gen_or(gen_portrange6(port1, port2, real_proto, dir), b);
 		return b;
-#endif /* INET6 */
 
 	case Q_GATEWAY:
 #ifndef INET6
@@ -5250,7 +6322,6 @@
 		else
 			bpf_error("unknown protocol: %s", name);
 
-
 	case Q_UNDEF:
 		syntax();
 		/* NOTREACHED */
@@ -5364,16 +6435,15 @@
 		else
 			bpf_error("illegal qualifier of 'port'");
 
-#ifndef INET6
-		return gen_port((int)v, proto, dir);
-#else
+		if (v > 65535)
+			bpf_error("illegal port number %u > 65535", v);
+
 	    {
 		struct block *b;
 		b = gen_port((int)v, proto, dir);
 		gen_or(gen_port6((int)v, proto, dir), b);
 		return b;
 	    }
-#endif /* INET6 */
 
 	case Q_PORTRANGE:
 		if (proto == Q_UDP)
@@ -5387,16 +6457,15 @@
 		else
 			bpf_error("illegal qualifier of 'portrange'");
 
-#ifndef INET6
-		return gen_portrange((int)v, (int)v, proto, dir);
-#else
+		if (v > 65535)
+			bpf_error("illegal port number %u > 65535", v);
+
 	    {
 		struct block *b;
 		b = gen_portrange((int)v, (int)v, proto, dir);
 		gen_or(gen_portrange6((int)v, (int)v, proto, dir), b);
 		return b;
 	    }
-#endif /* INET6 */
 
 	case Q_GATEWAY:
 		bpf_error("'gateway' requires a name");
@@ -5438,6 +6507,7 @@
 	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;
@@ -5468,6 +6538,7 @@
 
 	case Q_NET:
 		b = gen_host6(addr, &mask, q.proto, q.dir, q.addr);
+		ai = NULL;
 		freeaddrinfo(res);
 		return b;
 
@@ -5487,44 +6558,46 @@
 	struct block *b, *tmp;
 
 	if ((q.addr == Q_HOST || q.addr == Q_DEFAULT) && q.proto == Q_LINK) {
-            switch (linktype) {
-            case DLT_EN10MB:
-                return gen_ehostop(eaddr, (int)q.dir);
-            case DLT_FDDI:
-                return gen_fhostop(eaddr, (int)q.dir);
-            case DLT_IEEE802:
-                return gen_thostop(eaddr, (int)q.dir);
-			case DLT_IEEE802_11:
-			case DLT_IEEE802_11_RADIO_AVS:
-			case DLT_IEEE802_11_RADIO:
-			case DLT_PRISM_HEADER:
-			case DLT_PPI:
-				return gen_wlanhostop(eaddr, (int)q.dir);
-			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.)
-					 */
-					tmp = gen_cmp(OR_LINK, SUNATM_PKT_BEGIN_POS, BPF_H,
-						0xFF00);
-					gen_not(tmp);
+		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);
+		case DLT_IEEE802:
+			return gen_thostop(eaddr, (int)q.dir);
+		case DLT_IEEE802_11:
+		case DLT_PRISM_HEADER:
+		case DLT_IEEE802_11_RADIO_AVS:
+		case DLT_IEEE802_11_RADIO:
+		case DLT_PPI:
+			return gen_wlanhostop(eaddr, (int)q.dir);
+		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.)
+				 */
+				tmp = gen_cmp(OR_LINK, SUNATM_PKT_BEGIN_POS, BPF_H,
+					0xFF00);
+				gen_not(tmp);
 
-					/*
-					 * Now check the MAC address.
-					 */
-					b = gen_ehostop(eaddr, (int)q.dir);
-					gen_and(tmp, b);
-					return b;
-				}
-				break;
-			case DLT_IP_OVER_FC:
-                return gen_ipfchostop(eaddr, (int)q.dir);
-            default:
-				bpf_error("ethernet addresses supported only on ethernet/FDDI/token ring/802.11/ATM LANE/Fibre Channel");
-                break;
-            }
+				/*
+				 * Now check the MAC address.
+				 */
+				b = gen_ehostop(eaddr, (int)q.dir);
+				gen_and(tmp, b);
+				return b;
+			}
+			break;
+		case DLT_IP_OVER_FC:
+			return gen_ipfchostop(eaddr, (int)q.dir);
+		default:
+			bpf_error("ethernet addresses supported only on ethernet/FDDI/token ring/802.11/ATM LANE/Fibre Channel");
+			break;
+		}
 	}
 	bpf_error("ethernet address used in non-ether expression");
 	/* NOTREACHED */
@@ -5618,7 +6691,7 @@
 
 		/*
 		 * Load into the X register the offset computed into the
-		 * register specifed by "index".
+		 * register specified by "index".
 		 */
 		s = xfer_to_x(inst);
 
@@ -5650,7 +6723,7 @@
 		 * 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) {
@@ -5682,24 +6755,22 @@
 	case Q_LAT:
 	case Q_MOPRC:
 	case Q_MOPDL:
-#ifdef INET6
 	case Q_IPV6:
-#endif
 		/*
 		 * The offset is relative to the beginning of
 		 * the network-layer header.
 		 * XXX - are there any cases where we want
 		 * off_nl_nosnap?
 		 */
-		s = gen_llprefixlen();
+		s = gen_off_macpl();
 
 		/*
 		 * If "s" is non-null, it has code to arrange that the
-		 * X register contains the length of the prefix preceding
-		 * 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
+		 * X register contains the offset of the MAC-layer
+		 * 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 specified
 		 * by "index".
 		 */
 		if (s != NULL) {
@@ -5712,13 +6783,17 @@
 		/*
 		 * Load the item at the sum of the offset we've put in the
 		 * X register, the offset of the start of the network
-		 * layer header, and the offset of the start of the link
-		 * layer header (which is 0 if the radio header is
-		 * variable-length; that header length is what we put
-		 * into the X register and then added to the index).
+		 * layer header from the beginning of the MAC-layer
+		 * payload, and the purported offset of the start of the
+		 * MAC-layer payload (which might be 0 if there's a
+		 * variable-length prefix before the link-layer header
+		 * or the link-layer header itself is variable-length;
+		 * the variable-length offset of the start of the
+		 * MAC-layer payload is what we put into the X register
+		 * and then added to the index).
 		 */
 		tmp = new_stmt(BPF_LD|BPF_IND|size);
-		tmp->s.k = off_ll + off_nl;
+		tmp->s.k = off_macpl + off_nl;
 		sappend(s, tmp);
 		sappend(inst->s, s);
 
@@ -5740,6 +6815,7 @@
 	case Q_IGRP:
 	case Q_PIM:
 	case Q_VRRP:
+	case Q_CARP:
 		/*
 		 * The offset is relative to the beginning of
 		 * the transport-layer header.
@@ -5759,22 +6835,24 @@
 		/*
 		 * The X register now contains the sum of the length
 		 * of any variable-length header preceding the link-layer
-		 * header and the length of the network-layer header.
+		 * header, any variable-length link-layer header, and the
+		 * length of the network-layer header.
+		 *
 		 * Load into the A register the offset relative to
 		 * the beginning of the transport layer header,
 		 * add the X register to that, move that to the
 		 * X register, and load with an offset from the
 		 * X register equal to the offset of the network
 		 * layer header relative to the beginning of
-		 * the link-layer header plus the length of any
-		 * fixed-length header preceding the link-layer
-		 * header.
+		 * the MAC-layer payload plus the fixed-length
+		 * portion of the offset of the MAC-layer payload
+		 * from the beginning of the raw packet data.
 		 */
 		sappend(s, xfer_to_a(inst));
 		sappend(s, new_stmt(BPF_ALU|BPF_ADD|BPF_X));
 		sappend(s, new_stmt(BPF_MISC|BPF_TAX));
 		sappend(s, tmp = new_stmt(BPF_LD|BPF_IND|size));
-		tmp->s.k = off_ll + off_nl;
+		tmp->s.k = off_macpl + off_nl;
 		sappend(inst->s, s);
 
 		/*
@@ -5786,16 +6864,12 @@
 		gen_and(gen_proto_abbrev(proto), b = gen_ipfrag());
 		if (inst->b)
 			gen_and(inst->b, b);
-#ifdef INET6
 		gen_and(gen_proto_abbrev(Q_IP), b);
-#endif
 		inst->b = b;
 		break;
-#ifdef INET6
 	case Q_ICMPV6:
 		bpf_error("IPv6 upper-layer protocol is not supported by proto[x]");
 		/*NOTREACHED*/
-#endif
 	}
 	inst->regno = regno;
 	s = new_stmt(BPF_ST);
@@ -5941,6 +7015,16 @@
 static int curreg;
 
 /*
+ * Initialize the table of used registers and the current register.
+ */
+static void
+init_regs()
+{
+	curreg = 0;
+	memset(regused, 0, sizeof regused);
+}
+
+/*
  * Return the next free register.
  */
 static int
@@ -6071,49 +7155,58 @@
 
 	case Q_DEFAULT:
 	case Q_LINK:
-                switch (linktype) {
-                case DLT_ARCNET:
-                case DLT_ARCNET_LINUX:
-                    return gen_ahostop(abroadcast, Q_DST);
-                case DLT_EN10MB:    
-                    return gen_ehostop(ebroadcast, Q_DST);
-                case DLT_FDDI:
-                    return gen_fhostop(ebroadcast, Q_DST);
-                case DLT_IEEE802:
-                    return gen_thostop(ebroadcast, Q_DST);
-                case DLT_IEEE802_11:
-                case DLT_IEEE802_11_RADIO_AVS:
-                case DLT_IEEE802_11_RADIO:
-				case DLT_PPI:
-                case DLT_PRISM_HEADER:
-                    return gen_wlanhostop(ebroadcast, Q_DST);
-                case DLT_IP_OVER_FC:
-                    return gen_ipfchostop(ebroadcast, Q_DST);
-                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);
+		switch (linktype) {
+		case DLT_ARCNET:
+		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);
+		case DLT_IEEE802:
+			return gen_thostop(ebroadcast, Q_DST);
+		case DLT_IEEE802_11:
+		case DLT_PRISM_HEADER:
+		case DLT_IEEE802_11_RADIO_AVS:
+		case DLT_IEEE802_11_RADIO:
+		case DLT_PPI:
+			return gen_wlanhostop(ebroadcast, Q_DST);
+		case DLT_IP_OVER_FC:
+			return gen_ipfchostop(ebroadcast, Q_DST);
+		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);
 
-			/*
-			 * Now check the MAC address.
-			 */
-			b0 = gen_ehostop(ebroadcast, Q_DST);
-			gen_and(b1, b0);
-			return b0;
-                    }
-                    break;
-                default:
-                    bpf_error("not a broadcast link");
-                }
+				/*
+				 * Now check the MAC address.
+				 */
+				b0 = gen_ehostop(ebroadcast, Q_DST);
+				gen_and(b1, b0);
+				return b0;
+			}
+			break;
+		default:
+			bpf_error("not a broadcast link");
+		}
 		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);
@@ -6158,167 +7251,169 @@
 
 	case Q_DEFAULT:
 	case Q_LINK:
-                switch (linktype) {
-                case DLT_ARCNET:
-                case DLT_ARCNET_LINUX:
-                    /* all ARCnet multicasts use the same address */
-                    return gen_ahostop(abroadcast, Q_DST);
-                case  DLT_EN10MB:
-                    /* ether[0] & 1 != 0 */
-                    return gen_mac_multicast(0);
-                case DLT_FDDI:
-                    /*
-                     * XXX TEST THIS: MIGHT NOT PORT PROPERLY XXX
-                     *
-                     * XXX - was that referring to bit-order issues?
-                     */
-                    /* fddi[1] & 1 != 0 */
-                    return gen_mac_multicast(1);
-                case DLT_IEEE802:
-                    /* tr[2] & 1 != 0 */
-                    return gen_mac_multicast(2);
-                case DLT_IEEE802_11:
-                case DLT_IEEE802_11_RADIO_AVS:
-				case DLT_PPI:
-                case DLT_IEEE802_11_RADIO:
-                case DLT_PRISM_HEADER:
-                    /*
-                     * Oh, yuk.
-                     *
-                     *	For control frames, there is no DA.
-                     *
-                     *	For management frames, DA is at an
-                     *	offset of 4 from the beginning of
-                     *	the packet.
-                     *
-                     *	For data frames, DA is at an offset
-                     *	of 4 from the beginning of the packet
-                     *	if To DS is clear and at an offset of
-                     *	16 from the beginning of the packet
-                     *	if To DS is set.
-                     */
-                    
-                    /*
-                     * Generate the tests to be done for data frames.
-                     *
-                     * First, check for To DS set, i.e. "link[1] & 0x01".
-                     */
-                    s = gen_load_a(OR_LINK, 1, BPF_B);
-                    b1 = new_block(JMP(BPF_JSET));
-                    b1->s.k = 0x01;	/* To DS */
-                    b1->stmts = s;
-                    
-                    /*
-                     * If To DS is set, the DA is at 16.
-                     */
-                    b0 = gen_mac_multicast(16);
-                    gen_and(b1, b0);
-                    
-                    /*
-                     * Now, check for To DS not set, i.e. check
-                     * "!(link[1] & 0x01)".
-                     */
-                    s = gen_load_a(OR_LINK, 1, BPF_B);
-                    b2 = new_block(JMP(BPF_JSET));
-                    b2->s.k = 0x01;	/* To DS */
-                    b2->stmts = s;
-                    gen_not(b2);
-                    
-                    /*
-                     * If To DS is not set, the DA is at 4.
-                     */
-                    b1 = gen_mac_multicast(4);
-                    gen_and(b2, b1);
-                    
-                    /*
-                     * Now OR together the last two checks.  That gives
-                     * the complete set of checks for data frames.
-                     */
-                    gen_or(b1, b0);
-                    
-                    /*
-                     * Now check for a data 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 checks done for data frames.
-                     */
-                    gen_and(b1, b0);
-                    
-                    /*
-                     * 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);
-                    b2 = new_block(JMP(BPF_JSET));
-                    b2->s.k = 0x08;
-                    b2->stmts = s;
-                    gen_not(b2);
-                    
-                    /*
-                     * For management frames, the DA is at 4.
-                     */
-                    b1 = gen_mac_multicast(4);
-                    gen_and(b2, b1);
-                    
-                    /*
-                     * OR that with the checks done for data frames.
-                     * That gives the checks done for management and
-                     * data frames.
-                     */
-                    gen_or(b1, b0);
-                    
-                    /*
-                     * If the low-order bit of the type value is 1,
-                     * this is either a control frame or a frame
-                     * with a reserved type, and thus not a
-                     * frame with an SA.
-                     *
-                     * I.e., check "!(link[0] & 0x04)".
-                     */
-                    s = gen_load_a(OR_LINK, 0, BPF_B);
-                    b1 = new_block(JMP(BPF_JSET));
-                    b1->s.k = 0x04;
-                    b1->stmts = s;
-                    gen_not(b1);
-                    
-                    /*
-                     * AND that with the checks for data and management
-                     * frames.
-                     */
-                    gen_and(b1, b0);
-                    return b0;
-                case DLT_IP_OVER_FC:
-                    b0 = gen_mac_multicast(2);
-                    return b0;
-                case DLT_SUNATM:
-                    if (is_lane) {
+		switch (linktype) {
+		case DLT_ARCNET:
+		case DLT_ARCNET_LINUX:
+			/* 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:
 			/*
-			 * Check that the packet doesn't begin with an
-			 * LE Control marker.  (We've already generated
-			 * a test for LANE.)
+			 * XXX TEST THIS: MIGHT NOT PORT PROPERLY XXX
+			 *
+			 * XXX - was that referring to bit-order issues?
 			 */
-			b1 = gen_cmp(OR_LINK, SUNATM_PKT_BEGIN_POS, BPF_H,
-			    0xFF00);
+			/* fddi[1] & 1 != 0 */
+			return gen_mac_multicast(1);
+		case DLT_IEEE802:
+			/* tr[2] & 1 != 0 */
+			return gen_mac_multicast(2);
+		case DLT_IEEE802_11:
+		case DLT_PRISM_HEADER:
+		case DLT_IEEE802_11_RADIO_AVS:
+		case DLT_IEEE802_11_RADIO:
+		case DLT_PPI:
+			/*
+			 * Oh, yuk.
+			 *
+			 *	For control frames, there is no DA.
+			 *
+			 *	For management frames, DA is at an
+			 *	offset of 4 from the beginning of
+			 *	the packet.
+			 *
+			 *	For data frames, DA is at an offset
+			 *	of 4 from the beginning of the packet
+			 *	if To DS is clear and at an offset of
+			 *	16 from the beginning of the packet
+			 *	if To DS is set.
+			 */
+
+			/*
+			 * Generate the tests to be done for data frames.
+			 *
+			 * First, check for To DS set, i.e. "link[1] & 0x01".
+			 */
+			s = gen_load_a(OR_LINK, 1, BPF_B);
+			b1 = new_block(JMP(BPF_JSET));
+			b1->s.k = 0x01;	/* To DS */
+			b1->stmts = s;
+
+			/*
+			 * If To DS is set, the DA is at 16.
+			 */
+			b0 = gen_mac_multicast(16);
+			gen_and(b1, b0);
+
+			/*
+			 * Now, check for To DS not set, i.e. check
+			 * "!(link[1] & 0x01)".
+			 */
+			s = gen_load_a(OR_LINK, 1, BPF_B);
+			b2 = new_block(JMP(BPF_JSET));
+			b2->s.k = 0x01;	/* To DS */
+			b2->stmts = s;
+			gen_not(b2);
+
+			/*
+			 * If To DS is not set, the DA is at 4.
+			 */
+			b1 = gen_mac_multicast(4);
+			gen_and(b2, b1);
+
+			/*
+			 * Now OR together the last two checks.  That gives
+			 * the complete set of checks for data frames.
+			 */
+			gen_or(b1, b0);
+
+			/*
+			 * Now check for a data 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 checks done for data frames.
+			 */
+			gen_and(b1, b0);
+
+			/*
+			 * 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);
+			b2 = new_block(JMP(BPF_JSET));
+			b2->s.k = 0x08;
+			b2->stmts = s;
+			gen_not(b2);
+
+			/*
+			 * For management frames, the DA is at 4.
+			 */
+			b1 = gen_mac_multicast(4);
+			gen_and(b2, b1);
+
+			/*
+			 * OR that with the checks done for data frames.
+			 * That gives the checks done for management and
+			 * data frames.
+			 */
+			gen_or(b1, b0);
+
+			/*
+			 * If the low-order bit of the type value is 1,
+			 * this is either a control frame or a frame
+			 * with a reserved type, and thus not a
+			 * frame with an SA.
+			 *
+			 * I.e., check "!(link[0] & 0x04)".
+			 */
+			s = gen_load_a(OR_LINK, 0, BPF_B);
+			b1 = new_block(JMP(BPF_JSET));
+			b1->s.k = 0x04;
+			b1->stmts = s;
 			gen_not(b1);
 
-			/* ether[off_mac] & 1 != 0 */
-			b0 = gen_mac_multicast(off_mac);
+			/*
+			 * AND that with the checks for data and management
+			 * frames.
+			 */
 			gen_and(b1, b0);
 			return b0;
-                    }
-                    break;
-                default:
-                    break;
-                }
-                /* Link not known to support multicasts */
-                break;
+		case DLT_IP_OVER_FC:
+			b0 = gen_mac_multicast(2);
+			return b0;
+		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);
+
+				/* ether[off_mac] & 1 != 0 */
+				b0 = gen_mac_multicast(off_mac);
+				gen_and(b1, b0);
+				return b0;
+			}
+			break;
+		default:
+			break;
+		}
+		/* Link not known to support multicasts */
+		break;
 
 	case Q_IP:
 		b0 = gen_linktype(ETHERTYPE_IP);
@@ -6326,13 +7421,11 @@
 		gen_and(b0, b1);
 		return b1;
 
-#ifdef INET6
 	case Q_IPV6:
 		b0 = gen_linktype(ETHERTYPE_IPV6);
 		b1 = gen_cmp(OR_NET, 24, BPF_B, (bpf_int32)255);
 		gen_and(b0, b1);
 		return b1;
-#endif /* INET6 */
 	}
 	bpf_error("link-layer multicast filters supported only on ethernet/FDDI/token ring/ARCNET/802.11/ATM LANE/Fibre Channel");
 	/* NOTREACHED */
@@ -6340,9 +7433,13 @@
 }
 
 /*
- * generate command for inbound/outbound.  It's here so we can
- * make it link-type specific.  'dir' = 0 implies "inbound",
- * = 1 implies "outbound".
+ * Filter on inbound (dir == 0) or outbound (dir == 1) traffic.
+ * Outbound traffic is sent by this machine, while inbound traffic is
+ * sent by a remote machine (and may include packets destined for a
+ * unicast or multicast link-layer address we are not subscribing to).
+ * These are the same definitions implemented by pcap_setdirection().
+ * Capturing only unicast traffic destined for this host is probably
+ * better accomplished using a higher-layer filter.
  */
 struct block *
 gen_inbound(dir)
@@ -6361,24 +7458,22 @@
 			  dir);
 		break;
 
-	case DLT_LINUX_SLL:
+	case DLT_IPNET:
 		if (dir) {
-			/*
-			 * Match packets sent by this machine.
-			 */
-			b0 = gen_cmp(OR_LINK, 0, BPF_H, LINUX_SLL_OUTGOING);
+			/* match outgoing packets */
+			b0 = gen_cmp(OR_LINK, 2, BPF_H, IPNET_OUTBOUND);
 		} else {
-			/*
-			 * Match packets sent to this machine.
-			 * (No broadcast or multicast packets, or
-			 * packets sent to some other machine and
-			 * received promiscuously.)
-			 *
-			 * XXX - packets sent to other machines probably
-			 * shouldn't be matched, but what about broadcast
-			 * or multicast packets we received?
-			 */
-			b0 = gen_cmp(OR_LINK, 0, BPF_H, LINUX_SLL_HOST);
+			/* match incoming packets */
+			b0 = gen_cmp(OR_LINK, 2, BPF_H, IPNET_INBOUND);
+		}
+		break;
+
+	case DLT_LINUX_SLL:
+		/* match outgoing packets */
+		b0 = gen_cmp(OR_LINK, 0, BPF_H, LINUX_SLL_OUTGOING);
+		if (!dir) {
+			/* to filter on inbound traffic, invert the match */
+			gen_not(b0);
 		}
 		break;
 
@@ -6415,6 +7510,13 @@
         case DLT_JUNIPER_FRELAY:
         case DLT_JUNIPER_CHDLC:
         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) {
@@ -6424,13 +7526,41 @@
 			/* match incoming packets */
 			b0 = gen_mcmp(OR_LINK, 3, BPF_B, 1, 0x01);
 		}
-	    break;
+		break;
 
 	default:
+		/*
+		 * If we have packet meta-data indicating a direction,
+		 * check it, otherwise give up as this link-layer type
+		 * has nothing in the packet data.
+		 */
+#if defined(linux) && defined(PF_PACKET) && defined(SO_ATTACH_FILTER)
+		/*
+		 * This is Linux with PF_PACKET support.
+		 * If this is a *live* capture, we can look at
+		 * special meta-data in the filter expression;
+		 * if it's a savefile, we can't.
+		 */
+		if (bpf_pcap->rfile != NULL) {
+			/* We have a FILE *, so this is a savefile */
+			bpf_error("inbound/outbound not supported on linktype %d when reading savefiles",
+			    linktype);
+			b0 = NULL;
+			/* NOTREACHED */
+		}
+		/* match outgoing packets */
+		b0 = gen_cmp(OR_LINK, SKF_AD_OFF + SKF_AD_PKTTYPE, BPF_H,
+		             PACKET_OUTGOING);
+		if (!dir) {
+			/* to filter on inbound traffic, invert the match */
+			gen_not(b0);
+		}
+#else /* defined(linux) && defined(PF_PACKET) && defined(SO_ATTACH_FILTER) */
 		bpf_error("inbound/outbound not supported on linktype %d",
 		    linktype);
 		b0 = NULL;
 		/* NOTREACHED */
+#endif /* defined(linux) && defined(PF_PACKET) && defined(SO_ATTACH_FILTER) */
 	}
 	return (b0);
 }
@@ -6443,13 +7573,12 @@
 	struct block *b0;
 	u_int len, off;
 
-	if (linktype == DLT_PFLOG) {
-		len = sizeof(((struct pfloghdr *)0)->ifname);
-		off = offsetof(struct pfloghdr, ifname);
-	} else {
-		bpf_error("ifname not supported on linktype 0x%x", linktype);
+	if (linktype != DLT_PFLOG) {
+		bpf_error("ifname supported only on PF linktype");
 		/* NOTREACHED */
 	}
+	len = sizeof(((struct pfloghdr *)0)->ifname);
+	off = offsetof(struct pfloghdr, ifname);
 	if (strlen(ifname) >= len) {
 		bpf_error("ifname interface names can only be %d characters",
 		    len-1);
@@ -6466,14 +7595,16 @@
 	struct block *b0;
 
 	if (linktype != DLT_PFLOG) {
-		bpf_error("ruleset not supported on linktype 0x%x", linktype);
+		bpf_error("ruleset supported only on PF linktype");
 		/* NOTREACHED */
 	}
+
 	if (strlen(ruleset) >= sizeof(((struct pfloghdr *)0)->ruleset)) {
 		bpf_error("ruleset names can only be %ld characters",
 		    (long)(sizeof(((struct pfloghdr *)0)->ruleset) - 1));
 		/* NOTREACHED */
 	}
+
 	b0 = gen_bcmp(OR_LINK, offsetof(struct pfloghdr, ruleset),
 	    strlen(ruleset), (const u_char *)ruleset);
 	return (b0);
@@ -6485,14 +7616,13 @@
 {
 	struct block *b0;
 
-	if (linktype == DLT_PFLOG) {
-		b0 = gen_cmp(OR_LINK, offsetof(struct pfloghdr, rulenr), BPF_W,
-			 (bpf_int32)rnr);
-	} else {
-		bpf_error("rnr not supported on linktype 0x%x", linktype);
+	if (linktype != DLT_PFLOG) {
+		bpf_error("rnr supported only on PF linktype");
 		/* NOTREACHED */
 	}
 
+	b0 = gen_cmp(OR_LINK, offsetof(struct pfloghdr, rulenr), BPF_W,
+		 (bpf_int32)rnr);
 	return (b0);
 }
 
@@ -6503,7 +7633,7 @@
 	struct block *b0;
 
 	if (linktype != DLT_PFLOG) {
-		bpf_error("srnr not supported on linktype 0x%x", linktype);
+		bpf_error("srnr supported only on PF linktype");
 		/* NOTREACHED */
 	}
 
@@ -6518,14 +7648,13 @@
 {
 	struct block *b0;
 
-	if (linktype == DLT_PFLOG) {
-		b0 = gen_cmp(OR_LINK, offsetof(struct pfloghdr, reason), BPF_B,
-		    (bpf_int32)reason);
-	} else {
-		bpf_error("reason not supported on linktype 0x%x", linktype);
+	if (linktype != DLT_PFLOG) {
+		bpf_error("reason supported only on PF linktype");
 		/* NOTREACHED */
 	}
 
+	b0 = gen_cmp(OR_LINK, offsetof(struct pfloghdr, reason), BPF_B,
+	    (bpf_int32)reason);
 	return (b0);
 }
 
@@ -6535,14 +7664,13 @@
 {
 	struct block *b0;
 
-	if (linktype == DLT_PFLOG) {
-		b0 = gen_cmp(OR_LINK, offsetof(struct pfloghdr, action), BPF_B,
-		    (bpf_int32)action);
-	} else {
-		bpf_error("action not supported on linktype 0x%x", linktype);
+	if (linktype != DLT_PFLOG) {
+		bpf_error("action supported only on PF linktype");
 		/* NOTREACHED */
 	}
 
+	b0 = gen_cmp(OR_LINK, offsetof(struct pfloghdr, action), BPF_B,
+	    (bpf_int32)action);
 	return (b0);
 }
 #else /* !HAVE_NET_PFVAR_H */
@@ -6595,14 +7723,75 @@
 }
 #endif /* HAVE_NET_PFVAR_H */
 
+/* IEEE 802.11 wireless header */
+struct block *
+gen_p80211_type(int type, int mask)
+{
+	struct block *b0;
+
+	switch (linktype) {
+
+	case DLT_IEEE802_11:
+	case DLT_PRISM_HEADER:
+	case DLT_IEEE802_11_RADIO_AVS:
+	case DLT_IEEE802_11_RADIO:
+		b0 = gen_mcmp(OR_LINK, 0, BPF_B, (bpf_int32)type,
+		    (bpf_int32)mask);
+		break;
+
+	default:
+		bpf_error("802.11 link-layer types supported only on 802.11");
+		/* NOTREACHED */
+	}
+
+	return (b0);
+}
+
+struct block *
+gen_p80211_fcdir(int fcdir)
+{
+	struct block *b0;
+
+	switch (linktype) {
+
+	case DLT_IEEE802_11:
+	case DLT_PRISM_HEADER:
+	case DLT_IEEE802_11_RADIO_AVS:
+	case DLT_IEEE802_11_RADIO:
+		break;
+
+	default:
+		bpf_error("frame direction supported only with 802.11 headers");
+		/* NOTREACHED */
+	}
+
+	b0 = gen_mcmp(OR_LINK, 1, BPF_B, (bpf_int32)fcdir,
+		(bpf_u_int32)IEEE80211_FC1_DIR_MASK);
+
+	return (b0);
+}
+
 struct block *
 gen_acode(eaddr, q)
 	register const u_char *eaddr;
 	struct qual q;
 {
-	if ((q.addr == Q_HOST || q.addr == Q_DEFAULT) && q.proto == Q_LINK) {
-		if (linktype == DLT_ARCNET || linktype == DLT_ARCNET_LINUX)
-			return gen_ahostop(eaddr, (int)q.dir);
+	switch (linktype) {
+
+	case DLT_ARCNET:
+	case DLT_ARCNET_LINUX:
+		if ((q.addr == Q_HOST || q.addr == Q_DEFAULT) &&
+		    q.proto == Q_LINK)
+			return (gen_ahostop(eaddr, (int)q.dir));
+		else {
+			bpf_error("ARCnet address used in non-arc expression");
+			/* NOTREACHED */
+		}
+		break;
+
+	default:
+		bpf_error("aid supported only on ARCnet");
+		/* NOTREACHED */
 	}
 	bpf_error("ARCnet address used in non-arc expression");
 	/* NOTREACHED */
@@ -6636,6 +7825,30 @@
 		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 */
@@ -6655,10 +7868,11 @@
 		bpf_error("no VLAN match after MPLS");
 
 	/*
-	 * Change the offsets to point to the type and data fields within
-	 * the VLAN packet.  Just increment the offsets, so that we
-	 * can support a hierarchy, e.g. "vlan 300 && vlan 200" to
-	 * capture VLAN 200 encapsulated within VLAN 100.
+	 * Check for a VLAN packet, and then change the offsets to point
+	 * to the type and data fields within the VLAN packet.  Just
+	 * increment the offsets, so that we can support a hierarchy, e.g.
+	 * "vlan 300 && vlan 200" to capture VLAN 200 encapsulated within
+	 * VLAN 100.
 	 *
 	 * XXX - this is a bit of a kludge.  If we were to split the
 	 * compiler into a parser that parses an expression and
@@ -6684,15 +7898,35 @@
 	 * be done assuming a VLAN, even though the "or" could be viewed
 	 * as meaning "or, if this isn't a VLAN packet...".
 	 */
-	orig_linktype = off_linktype;	/* save original values */
 	orig_nl = off_nl;
 
 	switch (linktype) {
 
 	case DLT_EN10MB:
+	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) {
+			b1 = gen_mcmp(OR_MACPL, 0, BPF_H,
+			    (bpf_int32)vlan_num, 0x0fff);
+			gen_and(b0, b1);
+			b0 = b1;
+		}
+
+		off_macpl += 4;
 		off_linktype += 4;
+#if 0
 		off_nl_nosnap += 4;
 		off_nl += 4;
+#endif
 		break;
 
 	default:
@@ -6701,17 +7935,6 @@
 		/*NOTREACHED*/
 	}
 
-	/* check for VLAN */
-	b0 = gen_cmp(OR_LINK, orig_linktype, BPF_H, (bpf_int32)ETHERTYPE_8021Q);
-
-	/* If a specific VLAN is requested, check VLAN id */
-	if (vlan_num >= 0) {
-		b1 = gen_mcmp(OR_LINK, orig_nl, BPF_H, (bpf_int32)vlan_num,
-		    0x0fff);
-		gen_and(b0, b1);
-		b0 = b1;
-	}
-
 	return (b0);
 }
 
@@ -6737,7 +7960,7 @@
 
         if (label_stack_depth > 0) {
             /* just match the bottom-of-stack bit clear */
-            b0 = gen_mcmp(OR_LINK, orig_nl-2, BPF_B, 0, 0x01);
+            b0 = gen_mcmp(OR_MACPL, orig_nl-2, BPF_B, 0, 0x01);
         } else {
             /*
              * Indicate that we're checking MPLS-encapsulated headers,
@@ -6749,6 +7972,8 @@
                 
             case DLT_C_HDLC: /* fall through */
             case DLT_EN10MB:
+            case DLT_NETANALYZER:
+            case DLT_NETANALYZER_TRANSPARENT:
                     b0 = gen_linktype(ETHERTYPE_MPLS);
                     break;
                 
@@ -6772,7 +7997,7 @@
 	/* If a specific MPLS label is requested, check it */
 	if (label_num >= 0) {
 		label_num = label_num << 12; /* label is shifted 12 bits on the wire */
-		b1 = gen_mcmp(OR_LINK, orig_nl, BPF_W, (bpf_int32)label_num,
+		b1 = gen_mcmp(OR_MACPL, orig_nl, BPF_W, (bpf_int32)label_num,
 		    0xfffff000); /* only compare the first 20 bits */
 		gen_and(b0, b1);
 		b0 = b1;
@@ -6795,9 +8020,10 @@
 }
 
 struct block *
-gen_pppoes()
+gen_pppoes(sess_num)
+	int sess_num;
 {
-	struct block *b0;
+	struct block *b0, *b1;
 
 	/*
 	 * Test against the PPPoE session link-layer type.
@@ -6806,7 +8032,8 @@
 
 	/*
 	 * Change the offsets to point to the type and data fields within
-	 * the PPP packet.
+	 * the PPP packet, and note that this is PPPoE rather than
+	 * raw PPP.
 	 *
 	 * XXX - this is a bit of a kludge.  If we were to split the
 	 * compiler into a parser that parses an expression and
@@ -6834,24 +8061,36 @@
 	 */
 	orig_linktype = off_linktype;	/* save original values */
 	orig_nl = off_nl;
+	is_pppoes = 1;
+
+	/* If a specific session is requested, check PPPoE session id */
+	if (sess_num >= 0) {
+		b1 = gen_mcmp(OR_MACPL, orig_nl, BPF_W,
+		    (bpf_int32)sess_num, 0x0000ffff);
+		gen_and(b0, b1);
+		b0 = b1;
+	}
 
 	/*
 	 * The "network-layer" protocol is PPPoE, which has a 6-byte
-	 * PPPoE header, followed by PPP payload, so we set the
-	 * offsets to the network layer offset plus 6 bytes for
-	 * the PPPoE header plus the values appropriate for PPP when
-	 * encapsulated in Ethernet (which means there's no HDLC
-	 * encapsulation).
+	 * PPPoE header, followed by a PPP packet.
+	 *
+	 * There is no HDLC encapsulation for the PPP packet (it's
+	 * encapsulated in PPPoES instead), so the link-layer type
+	 * starts at the first byte of the PPP packet.  For PPPoE,
+	 * that offset is relative to the beginning of the total
+	 * link-layer payload, including any 802.2 LLC header, so
+	 * it's 6 bytes past off_nl.
 	 */
-	off_linktype = orig_nl + 6;
-	off_nl = orig_nl + 6 + 2;
-	off_nl_nosnap = orig_nl + 6 + 2;
+	off_linktype = off_nl + 6;
 
 	/*
-	 * Set the link-layer type to PPP, as all subsequent tests will
-	 * be on the encapsulated PPP header.
+	 * The network-layer offsets are relative to the beginning
+	 * of the MAC-layer payload; that's past the 6-byte
+	 * PPPoE header and the 2-byte PPP header.
 	 */
-	linktype = DLT_PPP;
+	off_nl = 6+2;
+	off_nl_nosnap = 6+2;
 
 	return b0;
 }
@@ -6997,8 +8236,9 @@
 		is_lane = 1;
 		off_mac = off_payload + 2;	/* MAC header */
 		off_linktype = off_mac + 12;
-		off_nl = off_mac + 14;		/* Ethernet II */
-		off_nl_nosnap = off_mac + 17;	/* 802.3+802.2 */
+		off_macpl = off_mac + 14;	/* Ethernet */
+		off_nl = 0;			/* Ethernet II */
+		off_nl_nosnap = 3;		/* 802.3+802.2 */
 		break;
 
 	case A_LLC:
@@ -7020,6 +8260,7 @@
  * FISU, length is null
  * LSSU, length is 1 or 2
  * MSU, length is 3 or more
+ * For MTP2_HSL, sequences are on 2 bytes, and length on 9 bits
  */
 struct block *
 gen_mtp2type_abbrev(type)
@@ -7031,6 +8272,7 @@
 
 	case M_FISU:
 		if ( (linktype != DLT_MTP2) &&
+		     (linktype != DLT_ERF) &&
 		     (linktype != DLT_MTP2_WITH_PHDR) )
 			bpf_error("'fisu' supported only on MTP2");
 		/* gen_ncmp(offrel, offset, size, mask, jtype, reverse, value) */
@@ -7039,6 +8281,7 @@
 
 	case M_LSSU:
 		if ( (linktype != DLT_MTP2) &&
+		     (linktype != DLT_ERF) &&
 		     (linktype != DLT_MTP2_WITH_PHDR) )
 			bpf_error("'lssu' supported only on MTP2");
 		b0 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JGT, 1, 2);
@@ -7048,11 +8291,39 @@
 
 	case M_MSU:
 		if ( (linktype != DLT_MTP2) &&
+		     (linktype != DLT_ERF) &&
 		     (linktype != DLT_MTP2_WITH_PHDR) )
 			bpf_error("'msu' supported only on MTP2");
 		b0 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JGT, 0, 2);
 		break;
 
+	case MH_FISU:
+		if ( (linktype != DLT_MTP2) &&
+		     (linktype != DLT_ERF) &&
+		     (linktype != DLT_MTP2_WITH_PHDR) )
+			bpf_error("'hfisu' supported only on MTP2_HSL");
+		/* gen_ncmp(offrel, offset, size, mask, jtype, reverse, value) */
+		b0 = gen_ncmp(OR_PACKET, off_li_hsl, BPF_H, 0xff80, BPF_JEQ, 0, 0);
+		break;
+
+	case MH_LSSU:
+		if ( (linktype != DLT_MTP2) &&
+		     (linktype != DLT_ERF) &&
+		     (linktype != DLT_MTP2_WITH_PHDR) )
+			bpf_error("'hlssu' supported only on MTP2_HSL");
+		b0 = gen_ncmp(OR_PACKET, off_li_hsl, BPF_H, 0xff80, BPF_JGT, 1, 0x0100);
+		b1 = gen_ncmp(OR_PACKET, off_li_hsl, BPF_H, 0xff80, BPF_JGT, 0, 0);
+		gen_and(b1, b0);
+		break;
+
+	case MH_MSU:
+		if ( (linktype != DLT_MTP2) &&
+		     (linktype != DLT_ERF) &&
+		     (linktype != DLT_MTP2_WITH_PHDR) )
+			bpf_error("'hmsu' supported only on MTP2_HSL");
+		b0 = gen_ncmp(OR_PACKET, off_li_hsl, BPF_H, 0xff80, BPF_JGT, 0, 0x0100);
+		break;
+
 	default:
 		abort();
 	}
@@ -7068,9 +8339,17 @@
 {
 	struct block *b0;
 	bpf_u_int32 val1 , val2 , val3;
+	u_int newoff_sio=off_sio;
+	u_int newoff_opc=off_opc;
+	u_int newoff_dpc=off_dpc;
+	u_int newoff_sls=off_sls;
 
 	switch (mtp3field) {
 
+	case MH_SIO:
+		newoff_sio += 3; /* offset for MTP2_HSL */
+		/* FALLTHROUGH */
+
 	case M_SIO:
 		if (off_sio == (u_int)-1)
 			bpf_error("'sio' supported only on SS7");
@@ -7078,10 +8357,12 @@
 		if(jvalue > 255)
 		        bpf_error("sio value %u too big; max value = 255",
 		            jvalue);
-		b0 = gen_ncmp(OR_PACKET, off_sio, BPF_B, 0xffffffff,
+		b0 = gen_ncmp(OR_PACKET, newoff_sio, BPF_B, 0xffffffff,
 		    (u_int)jtype, reverse, (u_int)jvalue);
 		break;
 
+	case MH_OPC:
+		newoff_opc+=3;
         case M_OPC:
 	        if (off_opc == (u_int)-1)
 			bpf_error("'opc' supported only on SS7");
@@ -7098,10 +8379,14 @@
 		val3 = jvalue & 0x00000003;
 		val3 = val3 <<22;
 		jvalue = val1 + val2 + val3;
-		b0 = gen_ncmp(OR_PACKET, off_opc, BPF_W, 0x00c0ff0f,
+		b0 = gen_ncmp(OR_PACKET, newoff_opc, BPF_W, 0x00c0ff0f,
 		    (u_int)jtype, reverse, (u_int)jvalue);
 		break;
 
+	case MH_DPC:
+		newoff_dpc += 3;
+		/* FALLTHROUGH */
+
 	case M_DPC:
 	        if (off_dpc == (u_int)-1)
 			bpf_error("'dpc' supported only on SS7");
@@ -7116,10 +8401,12 @@
 		val2 = jvalue & 0x00003f00;
 		val2 = val2 << 8;
 		jvalue = val1 + val2;
-		b0 = gen_ncmp(OR_PACKET, off_dpc, BPF_W, 0xff3f0000,
+		b0 = gen_ncmp(OR_PACKET, newoff_dpc, BPF_W, 0xff3f0000,
 		    (u_int)jtype, reverse, (u_int)jvalue);
 		break;
 
+	case MH_SLS:
+	  newoff_sls+=3;
 	case M_SLS:
 	        if (off_sls == (u_int)-1)
 			bpf_error("'sls' supported only on SS7");
@@ -7130,7 +8417,7 @@
 		/* the following instruction is made to convert jvalue
 		 * to the forme used to write sls in an ss7 message*/
 		jvalue = jvalue << 4;
-		b0 = gen_ncmp(OR_PACKET, off_sls, BPF_B, 0xf0,
+		b0 = gen_ncmp(OR_PACKET, newoff_sls, BPF_B, 0xf0,
 		    (u_int)jtype,reverse, (u_int)jvalue);
 		break;
 
diff --git a/gencode.h b/gencode.h
index f4c5cf7..afb6933 100644
--- a/gencode.h
+++ b/gencode.h
@@ -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.60.2.11 2007/06/11 09:52:04 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/gencode.h,v 1.71 2007-11-18 02:03:52 guy Exp $ (LBL)
  */
 
 /*
@@ -126,12 +126,20 @@
 
 #define Q_RADIO		40
 
+#define Q_CARP		41
+
 /* Directional qualifiers. */
 
 #define Q_SRC		1
 #define Q_DST		2
 #define Q_OR		3
 #define Q_AND		4
+#define Q_ADDR1		5
+#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
@@ -178,12 +186,23 @@
 #define M_LSSU		23	/* LSSU */
 #define M_MSU		24	/* MSU */
 
+/* MTP2 HSL types */
+#define MH_FISU		25	/* FISU for HSL */
+#define MH_LSSU		26	/* LSSU */
+#define MH_MSU		27	/* MSU */
+
 /* MTP3 field types */
 #define M_SIO		1
 #define M_OPC		2
 #define M_DPC		3
 #define M_SLS		4
 
+/* MTP3 field types in case of MTP2 HSL */
+#define MH_SIO		5
+#define MH_OPC		6
+#define MH_DPC		7
+#define MH_SLS		8
+
 
 struct slist;
 
@@ -232,8 +251,8 @@
 	struct slist *stmts;	/* side effect stmts */
 	struct stmt s;		/* branch stmt */
 	int mark;
-	int longjt;		/* jt branch requires long jump */
-	int longjf;		/* jf branch requires long jump */
+	u_int longjt;		/* jt branch requires long jump */
+	u_int longjf;		/* jf branch requires long jump */
 	int level;
 	int offset;
 	int sense;
@@ -295,7 +314,7 @@
 struct block *gen_mpls(int);
 
 struct block *gen_pppoed(void);
-struct block *gen_pppoes(void);
+struct block *gen_pppoes(int);
 
 struct block *gen_atmfield_code(int atmfield, bpf_int32 jvalue, bpf_u_int32 jtype, int reverse);
 struct block *gen_atmtype_abbrev(int type);
@@ -312,14 +331,21 @@
 struct block *gen_pf_action(int);
 struct block *gen_pf_dir(int);
 
+struct block *gen_p80211_type(int, int);
+struct block *gen_p80211_fcdir(int);
+
 void bpf_optimize(struct block **);
 void bpf_error(const char *, ...)
-    __attribute__((noreturn, format (printf, 1, 2)));
+    __attribute__((noreturn))
+#ifdef __ATTRIBUTE___FORMAT_OK
+    __attribute__((format (printf, 1, 2)))
+#endif /* __ATTRIBUTE___FORMAT_OK */
+    ;
 
 void finish_parse(struct block *);
 char *sdup(const char *);
 
-struct bpf_insn *icode_to_fcode(struct block *, int *);
+struct bpf_insn *icode_to_fcode(struct block *, u_int *);
 int pcap_parse(void);
 void lex_init(const char *);
 void lex_cleanup(void);
diff --git a/grammar.c b/grammar.c
index 94cdd61..ea3169c 100644
--- a/grammar.c
+++ b/grammar.c
@@ -1,30 +1,37 @@
-/* A Bison parser, made by GNU Bison 2.1.  */
+/* A Bison parser, made by GNU Bison 2.5.  */
 
-/* Skeleton parser for Yacc-like parsing with Bison,
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
+/* Bison implementation for Yacc-like parsers in C
+   
+      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+   
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+   
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-
+   
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-/* As a special exception, when this file is copied by Bison into a
-   Bison output file, you may use that output file without restriction.
-   This special exception was added by the Free Software Foundation
-   in version 1.24 of Bison.  */
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+   
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
 
-/* Written by Richard Stallman by simplifying the original so called
-   ``semantic'' parser.  */
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+   simplifying the original so-called "semantic" parser.  */
 
 /* All symbols defined below should begin with yy or YY, to avoid
    infringing on user name space.  This should be done even for local
@@ -37,7 +44,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "2.1"
+#define YYBISON_VERSION "2.5"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -45,235 +52,28 @@
 /* Pure parsers.  */
 #define YYPURE 0
 
+/* Push parsers.  */
+#define YYPUSH 0
+
+/* Pull parsers.  */
+#define YYPULL 1
+
 /* Using locations.  */
 #define YYLSP_NEEDED 0
 
 /* Substitute the variable and function names.  */
-#define yyparse pcap_parse
-#define yylex   pcap_lex
-#define yyerror pcap_error
-#define yylval  pcap_lval
-#define yychar  pcap_char
-#define yydebug pcap_debug
-#define yynerrs pcap_nerrs
-
-
-/* Tokens.  */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     DST = 258,
-     SRC = 259,
-     HOST = 260,
-     GATEWAY = 261,
-     NET = 262,
-     NETMASK = 263,
-     PORT = 264,
-     PORTRANGE = 265,
-     LESS = 266,
-     GREATER = 267,
-     PROTO = 268,
-     PROTOCHAIN = 269,
-     CBYTE = 270,
-     ARP = 271,
-     RARP = 272,
-     IP = 273,
-     SCTP = 274,
-     TCP = 275,
-     UDP = 276,
-     ICMP = 277,
-     IGMP = 278,
-     IGRP = 279,
-     PIM = 280,
-     VRRP = 281,
-     ATALK = 282,
-     AARP = 283,
-     DECNET = 284,
-     LAT = 285,
-     SCA = 286,
-     MOPRC = 287,
-     MOPDL = 288,
-     TK_BROADCAST = 289,
-     TK_MULTICAST = 290,
-     NUM = 291,
-     INBOUND = 292,
-     OUTBOUND = 293,
-     PF_IFNAME = 294,
-     PF_RSET = 295,
-     PF_RNR = 296,
-     PF_SRNR = 297,
-     PF_REASON = 298,
-     PF_ACTION = 299,
-     LINK = 300,
-     GEQ = 301,
-     LEQ = 302,
-     NEQ = 303,
-     ID = 304,
-     EID = 305,
-     HID = 306,
-     HID6 = 307,
-     AID = 308,
-     LSH = 309,
-     RSH = 310,
-     LEN = 311,
-     IPV6 = 312,
-     ICMPV6 = 313,
-     AH = 314,
-     ESP = 315,
-     VLAN = 316,
-     MPLS = 317,
-     PPPOED = 318,
-     PPPOES = 319,
-     ISO = 320,
-     ESIS = 321,
-     CLNP = 322,
-     ISIS = 323,
-     L1 = 324,
-     L2 = 325,
-     IIH = 326,
-     LSP = 327,
-     SNP = 328,
-     CSNP = 329,
-     PSNP = 330,
-     STP = 331,
-     IPX = 332,
-     NETBEUI = 333,
-     LANE = 334,
-     LLC = 335,
-     METAC = 336,
-     BCC = 337,
-     SC = 338,
-     ILMIC = 339,
-     OAMF4EC = 340,
-     OAMF4SC = 341,
-     OAM = 342,
-     OAMF4 = 343,
-     CONNECTMSG = 344,
-     METACONNECT = 345,
-     VPI = 346,
-     VCI = 347,
-     RADIO = 348,
-     FISU = 349,
-     LSSU = 350,
-     MSU = 351,
-     SIO = 352,
-     OPC = 353,
-     DPC = 354,
-     SLS = 355,
-     AND = 356,
-     OR = 357,
-     UMINUS = 358
-   };
-#endif
-/* Tokens.  */
-#define DST 258
-#define SRC 259
-#define HOST 260
-#define GATEWAY 261
-#define NET 262
-#define NETMASK 263
-#define PORT 264
-#define PORTRANGE 265
-#define LESS 266
-#define GREATER 267
-#define PROTO 268
-#define PROTOCHAIN 269
-#define CBYTE 270
-#define ARP 271
-#define RARP 272
-#define IP 273
-#define SCTP 274
-#define TCP 275
-#define UDP 276
-#define ICMP 277
-#define IGMP 278
-#define IGRP 279
-#define PIM 280
-#define VRRP 281
-#define ATALK 282
-#define AARP 283
-#define DECNET 284
-#define LAT 285
-#define SCA 286
-#define MOPRC 287
-#define MOPDL 288
-#define TK_BROADCAST 289
-#define TK_MULTICAST 290
-#define NUM 291
-#define INBOUND 292
-#define OUTBOUND 293
-#define PF_IFNAME 294
-#define PF_RSET 295
-#define PF_RNR 296
-#define PF_SRNR 297
-#define PF_REASON 298
-#define PF_ACTION 299
-#define LINK 300
-#define GEQ 301
-#define LEQ 302
-#define NEQ 303
-#define ID 304
-#define EID 305
-#define HID 306
-#define HID6 307
-#define AID 308
-#define LSH 309
-#define RSH 310
-#define LEN 311
-#define IPV6 312
-#define ICMPV6 313
-#define AH 314
-#define ESP 315
-#define VLAN 316
-#define MPLS 317
-#define PPPOED 318
-#define PPPOES 319
-#define ISO 320
-#define ESIS 321
-#define CLNP 322
-#define ISIS 323
-#define L1 324
-#define L2 325
-#define IIH 326
-#define LSP 327
-#define SNP 328
-#define CSNP 329
-#define PSNP 330
-#define STP 331
-#define IPX 332
-#define NETBEUI 333
-#define LANE 334
-#define LLC 335
-#define METAC 336
-#define BCC 337
-#define SC 338
-#define ILMIC 339
-#define OAMF4EC 340
-#define OAMF4SC 341
-#define OAM 342
-#define OAMF4 343
-#define CONNECTMSG 344
-#define METACONNECT 345
-#define VPI 346
-#define VCI 347
-#define RADIO 348
-#define FISU 349
-#define LSSU 350
-#define MSU 351
-#define SIO 352
-#define OPC 353
-#define DPC 354
-#define SLS 355
-#define AND 356
-#define OR 357
-#define UMINUS 358
-
-
+#define yyparse         pcap_parse
+#define yylex           pcap_lex
+#define yyerror         pcap_error
+#define yylval          pcap_lval
+#define yychar          pcap_char
+#define yydebug         pcap_debug
+#define yynerrs         pcap_nerrs
 
 
 /* Copy the first part of user declarations.  */
+
+/* Line 268 of yacc.c  */
 #line 1 "grammar.y"
 
 /*
@@ -299,7 +99,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/grammar.y,v 1.86.2.9 2007/09/12 19:17:25 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
@@ -322,6 +122,7 @@
 #endif
 
 #include <netinet/in.h>
+#include <arpa/inet.h>
 #endif /* WIN32 */
 
 #include <stdio.h>
@@ -334,7 +135,8 @@
 #include <net/pfvar.h>
 #include <net/if_pflog.h>
 #endif
-#include <pcap-namedb.h>
+#include "ieee80211.h"
+#include <pcap/namedb.h>
 
 #ifdef HAVE_OS_PROTO_H
 #include "os-proto.h"
@@ -344,6 +146,92 @@
 			 (q).dir = (d),\
 			 (q).addr = (a)
 
+struct tok {
+	int v;			/* value */
+	const char *s;		/* string */
+};
+
+static const struct tok ieee80211_types[] = {
+	{ IEEE80211_FC0_TYPE_DATA, "data" },
+	{ IEEE80211_FC0_TYPE_MGT, "mgt" },
+	{ IEEE80211_FC0_TYPE_MGT, "management" },
+	{ IEEE80211_FC0_TYPE_CTL, "ctl" },
+	{ IEEE80211_FC0_TYPE_CTL, "control" },
+	{ 0, NULL }
+};
+static const struct tok ieee80211_mgt_subtypes[] = {
+	{ IEEE80211_FC0_SUBTYPE_ASSOC_REQ, "assocreq" },
+	{ IEEE80211_FC0_SUBTYPE_ASSOC_REQ, "assoc-req" },
+	{ IEEE80211_FC0_SUBTYPE_ASSOC_RESP, "assocresp" },
+	{ IEEE80211_FC0_SUBTYPE_ASSOC_RESP, "assoc-resp" },
+	{ IEEE80211_FC0_SUBTYPE_REASSOC_REQ, "reassocreq" },
+	{ IEEE80211_FC0_SUBTYPE_REASSOC_REQ, "reassoc-req" },
+	{ IEEE80211_FC0_SUBTYPE_REASSOC_RESP, "reassocresp" },
+	{ IEEE80211_FC0_SUBTYPE_REASSOC_RESP, "reassoc-resp" },
+	{ IEEE80211_FC0_SUBTYPE_PROBE_REQ, "probereq" },
+	{ IEEE80211_FC0_SUBTYPE_PROBE_REQ, "probe-req" },
+	{ IEEE80211_FC0_SUBTYPE_PROBE_RESP, "proberesp" },
+	{ IEEE80211_FC0_SUBTYPE_PROBE_RESP, "probe-resp" },
+	{ IEEE80211_FC0_SUBTYPE_BEACON, "beacon" },
+	{ IEEE80211_FC0_SUBTYPE_ATIM, "atim" },
+	{ IEEE80211_FC0_SUBTYPE_DISASSOC, "disassoc" },
+	{ IEEE80211_FC0_SUBTYPE_DISASSOC, "disassociation" },
+	{ IEEE80211_FC0_SUBTYPE_AUTH, "auth" },
+	{ IEEE80211_FC0_SUBTYPE_AUTH, "authentication" },
+	{ IEEE80211_FC0_SUBTYPE_DEAUTH, "deauth" },
+	{ IEEE80211_FC0_SUBTYPE_DEAUTH, "deauthentication" },
+	{ 0, NULL }
+};
+static const struct tok ieee80211_ctl_subtypes[] = {
+	{ IEEE80211_FC0_SUBTYPE_PS_POLL, "ps-poll" },
+	{ IEEE80211_FC0_SUBTYPE_RTS, "rts" },
+	{ IEEE80211_FC0_SUBTYPE_CTS, "cts" },
+	{ IEEE80211_FC0_SUBTYPE_ACK, "ack" },
+	{ IEEE80211_FC0_SUBTYPE_CF_END, "cf-end" },
+	{ IEEE80211_FC0_SUBTYPE_CF_END_ACK, "cf-end-ack" },
+	{ 0, NULL }
+};
+static const struct tok ieee80211_data_subtypes[] = {
+	{ IEEE80211_FC0_SUBTYPE_DATA, "data" },
+	{ IEEE80211_FC0_SUBTYPE_CF_ACK, "data-cf-ack" },
+	{ IEEE80211_FC0_SUBTYPE_CF_POLL, "data-cf-poll" },
+	{ IEEE80211_FC0_SUBTYPE_CF_ACPL, "data-cf-ack-poll" },
+	{ IEEE80211_FC0_SUBTYPE_NODATA, "null" },
+	{ IEEE80211_FC0_SUBTYPE_NODATA_CF_ACK, "cf-ack" },
+	{ IEEE80211_FC0_SUBTYPE_NODATA_CF_POLL, "cf-poll"  },
+	{ IEEE80211_FC0_SUBTYPE_NODATA_CF_ACPL, "cf-ack-poll" },
+	{ IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_DATA, "qos-data" },
+	{ IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_CF_ACK, "qos-data-cf-ack" },
+	{ IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_CF_POLL, "qos-data-cf-poll" },
+	{ IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_CF_ACPL, "qos-data-cf-ack-poll" },
+	{ IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_NODATA, "qos" },
+	{ IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_NODATA_CF_POLL, "qos-cf-poll" },
+	{ IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_NODATA_CF_ACPL, "qos-cf-ack-poll" },
+	{ 0, NULL }
+};
+struct type2tok {
+	int type;
+	const struct tok *tok;
+};
+static const struct type2tok ieee80211_type_subtypes[] = {
+	{ IEEE80211_FC0_TYPE_MGT, ieee80211_mgt_subtypes },
+	{ IEEE80211_FC0_TYPE_CTL, ieee80211_ctl_subtypes },
+	{ IEEE80211_FC0_TYPE_DATA, ieee80211_data_subtypes },
+	{ 0, NULL }
+};
+
+static int
+str2tok(const char *str, const struct tok *toks)
+{
+	int i;
+
+	for (i = 0; toks[i].s != NULL; i++) {
+		if (pcap_strcasecmp(toks[i].s, str) == 0)
+			return (toks[i].v);
+	}
+	return (-1);
+}
+
 int n_errors = 0;
 
 static struct qual qerr = { Q_UNDEF, Q_UNDEF, Q_UNDEF, Q_UNDEF };
@@ -356,7 +244,7 @@
 	/* NOTREACHED */
 }
 
-#ifndef YYBISON
+#ifdef NEED_YYPARSE_WRAPPER
 int yyparse(void);
 
 int
@@ -390,6 +278,16 @@
 	else if (pcap_strcasecmp(action, "drop") == 0 ||
 		pcap_strcasecmp(action, "block") == 0)
 		return (PF_DROP);
+#if HAVE_PF_NAT_THROUGH_PF_NORDR
+	else if (pcap_strcasecmp(action, "rdr") == 0)
+		return (PF_RDR);
+	else if (pcap_strcasecmp(action, "nat") == 0)
+		return (PF_NAT);
+	else if (pcap_strcasecmp(action, "binat") == 0)
+		return (PF_BINAT);
+	else if (pcap_strcasecmp(action, "nordr") == 0)
+		return (PF_NORDR);
+#endif
 	else {
 		bpf_error("unknown PF action");
 		/*NOTREACHED*/
@@ -401,6 +299,9 @@
 {
 	bpf_error("libpcap was compiled on a machine without pf support");
 	/*NOTREACHED*/
+
+	/* this is to make the VC compiler happy */
+	return -1;
 }
 
 static int
@@ -408,10 +309,16 @@
 {
 	bpf_error("libpcap was compiled on a machine without pf support");
 	/*NOTREACHED*/
+
+	/* this is to make the VC compiler happy */
+	return -1;
 }
 #endif /* HAVE_NET_PFVAR_H */
 
 
+/* Line 268 of yacc.c  */
+#line 321 "y.tab.c"
+
 /* Enabling traces.  */
 #ifndef YYDEBUG
 # define YYDEBUG 0
@@ -430,9 +337,263 @@
 # define YYTOKEN_TABLE 0
 #endif
 
-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 138 "grammar.y"
-typedef union YYSTYPE {
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     DST = 258,
+     SRC = 259,
+     HOST = 260,
+     GATEWAY = 261,
+     NET = 262,
+     NETMASK = 263,
+     PORT = 264,
+     PORTRANGE = 265,
+     LESS = 266,
+     GREATER = 267,
+     PROTO = 268,
+     PROTOCHAIN = 269,
+     CBYTE = 270,
+     ARP = 271,
+     RARP = 272,
+     IP = 273,
+     SCTP = 274,
+     TCP = 275,
+     UDP = 276,
+     ICMP = 277,
+     IGMP = 278,
+     IGRP = 279,
+     PIM = 280,
+     VRRP = 281,
+     CARP = 282,
+     ATALK = 283,
+     AARP = 284,
+     DECNET = 285,
+     LAT = 286,
+     SCA = 287,
+     MOPRC = 288,
+     MOPDL = 289,
+     TK_BROADCAST = 290,
+     TK_MULTICAST = 291,
+     NUM = 292,
+     INBOUND = 293,
+     OUTBOUND = 294,
+     PF_IFNAME = 295,
+     PF_RSET = 296,
+     PF_RNR = 297,
+     PF_SRNR = 298,
+     PF_REASON = 299,
+     PF_ACTION = 300,
+     TYPE = 301,
+     SUBTYPE = 302,
+     DIR = 303,
+     ADDR1 = 304,
+     ADDR2 = 305,
+     ADDR3 = 306,
+     ADDR4 = 307,
+     RA = 308,
+     TA = 309,
+     LINK = 310,
+     GEQ = 311,
+     LEQ = 312,
+     NEQ = 313,
+     ID = 314,
+     EID = 315,
+     HID = 316,
+     HID6 = 317,
+     AID = 318,
+     LSH = 319,
+     RSH = 320,
+     LEN = 321,
+     IPV6 = 322,
+     ICMPV6 = 323,
+     AH = 324,
+     ESP = 325,
+     VLAN = 326,
+     MPLS = 327,
+     PPPOED = 328,
+     PPPOES = 329,
+     ISO = 330,
+     ESIS = 331,
+     CLNP = 332,
+     ISIS = 333,
+     L1 = 334,
+     L2 = 335,
+     IIH = 336,
+     LSP = 337,
+     SNP = 338,
+     CSNP = 339,
+     PSNP = 340,
+     STP = 341,
+     IPX = 342,
+     NETBEUI = 343,
+     LANE = 344,
+     LLC = 345,
+     METAC = 346,
+     BCC = 347,
+     SC = 348,
+     ILMIC = 349,
+     OAMF4EC = 350,
+     OAMF4SC = 351,
+     OAM = 352,
+     OAMF4 = 353,
+     CONNECTMSG = 354,
+     METACONNECT = 355,
+     VPI = 356,
+     VCI = 357,
+     RADIO = 358,
+     FISU = 359,
+     LSSU = 360,
+     MSU = 361,
+     HFISU = 362,
+     HLSSU = 363,
+     HMSU = 364,
+     SIO = 365,
+     OPC = 366,
+     DPC = 367,
+     SLS = 368,
+     HSIO = 369,
+     HOPC = 370,
+     HDPC = 371,
+     HSLS = 372,
+     AND = 373,
+     OR = 374,
+     UMINUS = 375
+   };
+#endif
+/* Tokens.  */
+#define DST 258
+#define SRC 259
+#define HOST 260
+#define GATEWAY 261
+#define NET 262
+#define NETMASK 263
+#define PORT 264
+#define PORTRANGE 265
+#define LESS 266
+#define GREATER 267
+#define PROTO 268
+#define PROTOCHAIN 269
+#define CBYTE 270
+#define ARP 271
+#define RARP 272
+#define IP 273
+#define SCTP 274
+#define TCP 275
+#define UDP 276
+#define ICMP 277
+#define IGMP 278
+#define IGRP 279
+#define PIM 280
+#define VRRP 281
+#define CARP 282
+#define ATALK 283
+#define AARP 284
+#define DECNET 285
+#define LAT 286
+#define SCA 287
+#define MOPRC 288
+#define MOPDL 289
+#define TK_BROADCAST 290
+#define TK_MULTICAST 291
+#define NUM 292
+#define INBOUND 293
+#define OUTBOUND 294
+#define PF_IFNAME 295
+#define PF_RSET 296
+#define PF_RNR 297
+#define PF_SRNR 298
+#define PF_REASON 299
+#define PF_ACTION 300
+#define TYPE 301
+#define SUBTYPE 302
+#define DIR 303
+#define ADDR1 304
+#define ADDR2 305
+#define ADDR3 306
+#define ADDR4 307
+#define RA 308
+#define TA 309
+#define LINK 310
+#define GEQ 311
+#define LEQ 312
+#define NEQ 313
+#define ID 314
+#define EID 315
+#define HID 316
+#define HID6 317
+#define AID 318
+#define LSH 319
+#define RSH 320
+#define LEN 321
+#define IPV6 322
+#define ICMPV6 323
+#define AH 324
+#define ESP 325
+#define VLAN 326
+#define MPLS 327
+#define PPPOED 328
+#define PPPOES 329
+#define ISO 330
+#define ESIS 331
+#define CLNP 332
+#define ISIS 333
+#define L1 334
+#define L2 335
+#define IIH 336
+#define LSP 337
+#define SNP 338
+#define CSNP 339
+#define PSNP 340
+#define STP 341
+#define IPX 342
+#define NETBEUI 343
+#define LANE 344
+#define LLC 345
+#define METAC 346
+#define BCC 347
+#define SC 348
+#define ILMIC 349
+#define OAMF4EC 350
+#define OAMF4SC 351
+#define OAM 352
+#define OAMF4 353
+#define CONNECTMSG 354
+#define METACONNECT 355
+#define VPI 356
+#define VCI 357
+#define RADIO 358
+#define FISU 359
+#define LSSU 360
+#define MSU 361
+#define HFISU 362
+#define HLSSU 363
+#define HMSU 364
+#define SIO 365
+#define OPC 366
+#define DPC 367
+#define SLS 368
+#define HSIO 369
+#define HOPC 370
+#define HDPC 371
+#define HSLS 372
+#define AND 373
+#define OR 374
+#define UMINUS 375
+
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+{
+
+/* Line 293 of yacc.c  */
+#line 242 "grammar.y"
+
 	int i;
 	bpf_u_int32 h;
 	u_char *e;
@@ -446,38 +607,73 @@
 		struct block *b;
 	} blk;
 	struct block *rblk;
+
+
+
+/* Line 293 of yacc.c  */
+#line 615 "y.tab.c"
 } YYSTYPE;
-/* Line 196 of yacc.c.  */
-#line 452 "y.tab.c"
+# define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
 #endif
 
 
-
 /* Copy the second part of user declarations.  */
 
 
-/* Line 219 of yacc.c.  */
-#line 464 "y.tab.c"
+/* Line 343 of yacc.c  */
+#line 627 "y.tab.c"
 
-#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
-# define YYSIZE_T __SIZE_TYPE__
+#ifdef short
+# undef short
 #endif
-#if ! defined (YYSIZE_T) && defined (size_t)
-# define YYSIZE_T size_t
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
 #endif
-#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus))
-# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
 #endif
-#if ! defined (YYSIZE_T)
-# define YYSIZE_T unsigned int
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
 #endif
 
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+#  define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+#  define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# else
+#  define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
 #ifndef YY_
-# if YYENABLE_NLS
+# if defined YYENABLE_NLS && YYENABLE_NLS
 #  if ENABLE_NLS
 #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
 #   define YY_(msgid) dgettext ("bison-runtime", msgid)
@@ -488,7 +684,32 @@
 # endif
 #endif
 
-#if ! defined (yyoverflow) || YYERROR_VERBOSE
+/* Suppress unused-variable warnings by "using" E.  */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions.  */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int yyi)
+#else
+static int
+YYID (yyi)
+    int yyi;
+#endif
+{
+  return yyi;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
 
 /* The parser invokes alloca or malloc; define the necessary symbols.  */
 
@@ -496,66 +717,78 @@
 #  if YYSTACK_USE_ALLOCA
 #   ifdef __GNUC__
 #    define YYSTACK_ALLOC __builtin_alloca
+#   elif defined __BUILTIN_VA_ARG_INCR
+#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+#   elif defined _AIX
+#    define YYSTACK_ALLOC __alloca
+#   elif defined _MSC_VER
+#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+#    define alloca _alloca
 #   else
 #    define YYSTACK_ALLOC alloca
-#    if defined (__STDC__) || defined (__cplusplus)
+#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#     define YYINCLUDED_STDLIB_H
+#     ifndef EXIT_SUCCESS
+#      define EXIT_SUCCESS 0
+#     endif
 #    endif
 #   endif
 #  endif
 # endif
 
 # ifdef YYSTACK_ALLOC
-   /* Pacify GCC's `empty if-body' warning. */
-#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+   /* Pacify GCC's `empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
 #  ifndef YYSTACK_ALLOC_MAXIMUM
     /* The OS might guarantee only one guard page at the bottom of the stack,
        and a page size can be as small as 4096 bytes.  So we cannot safely
        invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
        to allow for a few compiler-allocated temporary stack slots.  */
-#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
 #  endif
 # else
 #  define YYSTACK_ALLOC YYMALLOC
 #  define YYSTACK_FREE YYFREE
 #  ifndef YYSTACK_ALLOC_MAXIMUM
-#   define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1)
+#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
 #  endif
-#  ifdef __cplusplus
-extern "C" {
+#  if (defined __cplusplus && ! defined EXIT_SUCCESS \
+       && ! ((defined YYMALLOC || defined malloc) \
+	     && (defined YYFREE || defined free)))
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   ifndef EXIT_SUCCESS
+#    define EXIT_SUCCESS 0
+#   endif
 #  endif
 #  ifndef YYMALLOC
 #   define YYMALLOC malloc
-#   if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \
-	&& (defined (__STDC__) || defined (__cplusplus)))
+#   if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
 #  ifndef YYFREE
 #   define YYFREE free
-#   if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \
-	&& (defined (__STDC__) || defined (__cplusplus)))
+#   if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 void free (void *); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
-#  ifdef __cplusplus
-}
-#  endif
 # endif
-#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
 
 
-#if (! defined (yyoverflow) \
-     && (! defined (__cplusplus) \
-	 || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
+#if (! defined yyoverflow \
+     && (! defined __cplusplus \
+	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
 {
-  short int yyss;
-  YYSTYPE yyvs;
-  };
+  yytype_int16 yyss_alloc;
+  YYSTYPE yyvs_alloc;
+};
 
 /* The size of the maximum gap between one aligned stack and the next.  */
 # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
@@ -563,13 +796,34 @@
 /* The size of an array large to enough to hold all stacks, each with
    N elements.  */
 # define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (short int) + sizeof (YYSTYPE))			\
+     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
       + YYSTACK_GAP_MAXIMUM)
 
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack)				\
+    do									\
+      {									\
+	YYSIZE_T yynewbytes;						\
+	YYCOPY (&yyptr->Stack_alloc, Stack, yysize);			\
+	Stack = &yyptr->Stack_alloc;					\
+	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+	yyptr += yynewbytes / sizeof (*yyptr);				\
+      }									\
+    while (YYID (0))
+
+#endif
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
 /* Copy COUNT objects from FROM to TO.  The source and destination do
    not overlap.  */
 # ifndef YYCOPY
-#  if defined (__GNUC__) && 1 < __GNUC__
+#  if defined __GNUC__ && 1 < __GNUC__
 #   define YYCOPY(To, From, Count) \
       __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
 #  else
@@ -580,71 +834,48 @@
 	  for (yyi = 0; yyi < (Count); yyi++)	\
 	    (To)[yyi] = (From)[yyi];		\
 	}					\
-      while (0)
+      while (YYID (0))
 #  endif
 # endif
+#endif /* !YYCOPY_NEEDED */
 
-/* Relocate STACK from its old location to the new one.  The
-   local variables YYSIZE and YYSTACKSIZE give the old and new number of
-   elements in the stack, and YYPTR gives the new location of the
-   stack.  Advance YYPTR to a properly aligned location for the next
-   stack.  */
-# define YYSTACK_RELOCATE(Stack)					\
-    do									\
-      {									\
-	YYSIZE_T yynewbytes;						\
-	YYCOPY (&yyptr->Stack, Stack, yysize);				\
-	Stack = &yyptr->Stack;						\
-	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-	yyptr += yynewbytes / sizeof (*yyptr);				\
-      }									\
-    while (0)
-
-#endif
-
-#if defined (__STDC__) || defined (__cplusplus)
-   typedef signed char yysigned_char;
-#else
-   typedef short int yysigned_char;
-#endif
-
-/* YYFINAL -- State number of the termination state. */
+/* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   605
+#define YYLAST   710
 
-/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS  119
-/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS  41
-/* YYNRULES -- Number of rules. */
-#define YYNRULES  186
-/* YYNRULES -- Number of states. */
-#define YYNSTATES  254
+/* YYNTOKENS -- Number of terminals.  */
+#define YYNTOKENS  136
+/* YYNNTS -- Number of nonterminals.  */
+#define YYNNTS  46
+/* YYNRULES -- Number of rules.  */
+#define YYNRULES  213
+/* YYNRULES -- Number of states.  */
+#define YYNSTATES  285
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   358
+#define YYMAXUTOK   375
 
 #define YYTRANSLATE(YYX)						\
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
 
 /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
-static const unsigned char yytranslate[] =
+static const yytype_uint8 yytranslate[] =
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,   103,     2,     2,     2,     2,   105,     2,
-     112,   111,   108,   106,     2,   107,     2,   109,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,   118,     2,
-     115,   114,   113,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,   120,     2,     2,     2,     2,   122,     2,
+     129,   128,   125,   123,     2,   124,     2,   126,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,   135,     2,
+     132,   131,   130,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,   116,     2,   117,     2,     2,     2,     2,     2,     2,
+       2,   133,     2,   134,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,   104,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,   121,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -667,13 +898,15 @@
       65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
       75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
       85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
-      95,    96,    97,    98,    99,   100,   101,   102,   110
+      95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
+     105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
+     115,   116,   117,   118,   119,   127
 };
 
 #if YYDEBUG
 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
    YYRHS.  */
-static const unsigned short int yyprhs[] =
+static const yytype_uint16 yyprhs[] =
 {
        0,     0,     3,     6,     8,     9,    11,    15,    19,    23,
       27,    29,    31,    33,    35,    39,    41,    45,    49,    51,
@@ -685,117 +918,132 @@
      184,   186,   188,   190,   192,   194,   196,   198,   200,   202,
      204,   206,   208,   210,   212,   214,   216,   218,   220,   222,
      224,   226,   228,   230,   232,   234,   236,   238,   240,   242,
-     244,   246,   249,   252,   255,   258,   263,   265,   267,   270,
-     272,   275,   277,   279,   281,   283,   286,   289,   292,   295,
-     298,   301,   303,   305,   307,   309,   311,   313,   315,   317,
-     319,   321,   323,   328,   335,   339,   343,   347,   351,   355,
-     359,   363,   367,   370,   374,   376,   378,   380,   382,   384,
-     386,   388,   392,   394,   396,   398,   400,   402,   404,   406,
-     408,   410,   412,   414,   416,   418,   420,   422,   425,   428,
-     432,   434,   436,   440,   442,   444,   446,   448,   450,   452,
-     454,   456,   459,   462,   466,   468,   470
+     244,   246,   248,   250,   252,   254,   256,   258,   260,   263,
+     266,   269,   272,   277,   279,   281,   284,   286,   289,   291,
+     293,   296,   298,   300,   303,   306,   309,   312,   315,   318,
+     321,   326,   329,   332,   335,   337,   339,   341,   343,   345,
+     347,   349,   351,   353,   355,   357,   359,   361,   363,   365,
+     367,   369,   371,   376,   383,   387,   391,   395,   399,   403,
+     407,   411,   415,   418,   422,   424,   426,   428,   430,   432,
+     434,   436,   440,   442,   444,   446,   448,   450,   452,   454,
+     456,   458,   460,   462,   464,   466,   468,   470,   473,   476,
+     480,   482,   484,   488,   490,   492,   494,   496,   498,   500,
+     502,   504,   506,   508,   510,   512,   514,   516,   518,   521,
+     524,   528,   530,   532
 };
 
-/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-static const short int yyrhs[] =
+/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+static const yytype_int16 yyrhs[] =
 {
-     120,     0,    -1,   121,   122,    -1,   121,    -1,    -1,   131,
-      -1,   122,   123,   131,    -1,   122,   123,   125,    -1,   122,
-     124,   131,    -1,   122,   124,   125,    -1,   101,    -1,   102,
-      -1,   126,    -1,   148,    -1,   128,   129,   111,    -1,    49,
-      -1,    51,   109,    36,    -1,    51,     8,    51,    -1,    51,
-      -1,    52,   109,    36,    -1,    52,    -1,    50,    -1,    53,
-      -1,   127,   125,    -1,   103,    -1,   112,    -1,   126,    -1,
-     130,   123,   125,    -1,   130,   124,   125,    -1,   148,    -1,
-     129,    -1,   133,    -1,   127,   131,    -1,   134,   135,   136,
-      -1,   134,   135,    -1,   134,   136,    -1,   134,    13,    -1,
-     134,    14,    -1,   134,   137,    -1,   132,   125,    -1,   128,
-     122,   111,    -1,   138,    -1,   145,   143,   145,    -1,   145,
-     144,   145,    -1,   139,    -1,   149,    -1,   150,    -1,   151,
-     152,    -1,   155,    -1,   156,   157,    -1,   138,    -1,    -1,
-       4,    -1,     3,    -1,     4,   102,     3,    -1,     3,   102,
-       4,    -1,     4,   101,     3,    -1,     3,   101,     4,    -1,
-       5,    -1,     7,    -1,     9,    -1,    10,    -1,     6,    -1,
-      45,    -1,    18,    -1,    16,    -1,    17,    -1,    19,    -1,
-      20,    -1,    21,    -1,    22,    -1,    23,    -1,    24,    -1,
-      25,    -1,    26,    -1,    27,    -1,    28,    -1,    29,    -1,
-      30,    -1,    31,    -1,    33,    -1,    32,    -1,    57,    -1,
-      58,    -1,    59,    -1,    60,    -1,    65,    -1,    66,    -1,
-      68,    -1,    69,    -1,    70,    -1,    71,    -1,    72,    -1,
-      73,    -1,    75,    -1,    74,    -1,    67,    -1,    76,    -1,
-      77,    -1,    78,    -1,    93,    -1,   134,    34,    -1,   134,
-      35,    -1,    11,    36,    -1,    12,    36,    -1,    15,    36,
-     147,    36,    -1,    37,    -1,    38,    -1,    61,   148,    -1,
-      61,    -1,    62,   148,    -1,    62,    -1,    63,    -1,    64,
-      -1,   140,    -1,    39,    49,    -1,    40,    49,    -1,    41,
-      36,    -1,    42,    36,    -1,    43,   141,    -1,    44,   142,
-      -1,    36,    -1,    49,    -1,    49,    -1,   113,    -1,    46,
-      -1,   114,    -1,    47,    -1,   115,    -1,    48,    -1,   148,
-      -1,   146,    -1,   138,   116,   145,   117,    -1,   138,   116,
-     145,   118,    36,   117,    -1,   145,   106,   145,    -1,   145,
-     107,   145,    -1,   145,   108,   145,    -1,   145,   109,   145,
-      -1,   145,   105,   145,    -1,   145,   104,   145,    -1,   145,
-      54,   145,    -1,   145,    55,   145,    -1,   107,   145,    -1,
-     128,   146,   111,    -1,    56,    -1,   105,    -1,   104,    -1,
-     115,    -1,   113,    -1,   114,    -1,    36,    -1,   128,   148,
-     111,    -1,    79,    -1,    80,    -1,    81,    -1,    82,    -1,
-      85,    -1,    86,    -1,    83,    -1,    84,    -1,    87,    -1,
-      88,    -1,    89,    -1,    90,    -1,    91,    -1,    92,    -1,
-     153,    -1,   143,    36,    -1,   144,    36,    -1,   128,   154,
-     111,    -1,    36,    -1,   153,    -1,   154,   124,   153,    -1,
-      94,    -1,    95,    -1,    96,    -1,    97,    -1,    98,    -1,
-      99,    -1,   100,    -1,   158,    -1,   143,    36,    -1,   144,
-      36,    -1,   128,   159,   111,    -1,    36,    -1,   158,    -1,
-     159,   124,   158,    -1
+     137,     0,    -1,   138,   139,    -1,   138,    -1,    -1,   148,
+      -1,   139,   140,   148,    -1,   139,   140,   142,    -1,   139,
+     141,   148,    -1,   139,   141,   142,    -1,   118,    -1,   119,
+      -1,   143,    -1,   170,    -1,   145,   146,   128,    -1,    59,
+      -1,    61,   126,    37,    -1,    61,     8,    61,    -1,    61,
+      -1,    62,   126,    37,    -1,    62,    -1,    60,    -1,    63,
+      -1,   144,   142,    -1,   120,    -1,   129,    -1,   143,    -1,
+     147,   140,   142,    -1,   147,   141,   142,    -1,   170,    -1,
+     146,    -1,   150,    -1,   144,   148,    -1,   151,   152,   153,
+      -1,   151,   152,    -1,   151,   153,    -1,   151,    13,    -1,
+     151,    14,    -1,   151,   154,    -1,   149,   142,    -1,   145,
+     139,   128,    -1,   155,    -1,   167,   165,   167,    -1,   167,
+     166,   167,    -1,   156,    -1,   171,    -1,   172,    -1,   173,
+     174,    -1,   177,    -1,   178,   179,    -1,   155,    -1,    -1,
+       4,    -1,     3,    -1,     4,   119,     3,    -1,     3,   119,
+       4,    -1,     4,   118,     3,    -1,     3,   118,     4,    -1,
+      49,    -1,    50,    -1,    51,    -1,    52,    -1,    53,    -1,
+      54,    -1,     5,    -1,     7,    -1,     9,    -1,    10,    -1,
+       6,    -1,    55,    -1,    18,    -1,    16,    -1,    17,    -1,
+      19,    -1,    20,    -1,    21,    -1,    22,    -1,    23,    -1,
+      24,    -1,    25,    -1,    26,    -1,    27,    -1,    28,    -1,
+      29,    -1,    30,    -1,    31,    -1,    32,    -1,    34,    -1,
+      33,    -1,    67,    -1,    68,    -1,    69,    -1,    70,    -1,
+      75,    -1,    76,    -1,    78,    -1,    79,    -1,    80,    -1,
+      81,    -1,    82,    -1,    83,    -1,    85,    -1,    84,    -1,
+      77,    -1,    86,    -1,    87,    -1,    88,    -1,   103,    -1,
+     151,    35,    -1,   151,    36,    -1,    11,    37,    -1,    12,
+      37,    -1,    15,    37,   169,    37,    -1,    38,    -1,    39,
+      -1,    71,   170,    -1,    71,    -1,    72,   170,    -1,    72,
+      -1,    73,    -1,    74,   170,    -1,    74,    -1,   157,    -1,
+     151,   158,    -1,    40,    59,    -1,    41,    59,    -1,    42,
+      37,    -1,    43,    37,    -1,    44,   163,    -1,    45,   164,
+      -1,    46,   159,    47,   160,    -1,    46,   159,    -1,    47,
+     161,    -1,    48,   162,    -1,    37,    -1,    59,    -1,    37,
+      -1,    59,    -1,    59,    -1,    37,    -1,    59,    -1,    37,
+      -1,    59,    -1,    59,    -1,   130,    -1,    56,    -1,   131,
+      -1,    57,    -1,   132,    -1,    58,    -1,   170,    -1,   168,
+      -1,   155,   133,   167,   134,    -1,   155,   133,   167,   135,
+      37,   134,    -1,   167,   123,   167,    -1,   167,   124,   167,
+      -1,   167,   125,   167,    -1,   167,   126,   167,    -1,   167,
+     122,   167,    -1,   167,   121,   167,    -1,   167,    64,   167,
+      -1,   167,    65,   167,    -1,   124,   167,    -1,   145,   168,
+     128,    -1,    66,    -1,   122,    -1,   121,    -1,   132,    -1,
+     130,    -1,   131,    -1,    37,    -1,   145,   170,   128,    -1,
+      89,    -1,    90,    -1,    91,    -1,    92,    -1,    95,    -1,
+      96,    -1,    93,    -1,    94,    -1,    97,    -1,    98,    -1,
+      99,    -1,   100,    -1,   101,    -1,   102,    -1,   175,    -1,
+     165,    37,    -1,   166,    37,    -1,   145,   176,   128,    -1,
+      37,    -1,   175,    -1,   176,   141,   175,    -1,   104,    -1,
+     105,    -1,   106,    -1,   107,    -1,   108,    -1,   109,    -1,
+     110,    -1,   111,    -1,   112,    -1,   113,    -1,   114,    -1,
+     115,    -1,   116,    -1,   117,    -1,   180,    -1,   165,    37,
+      -1,   166,    37,    -1,   145,   181,   128,    -1,    37,    -1,
+     180,    -1,   181,   141,   180,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
-static const unsigned short int yyrline[] =
+static const yytype_uint16 yyrline[] =
 {
-       0,   210,   210,   214,   216,   218,   219,   220,   221,   222,
-     224,   226,   228,   229,   231,   233,   234,   236,   238,   243,
-     252,   261,   270,   279,   281,   283,   285,   286,   287,   289,
-     291,   293,   294,   296,   297,   298,   299,   300,   301,   303,
-     304,   305,   306,   308,   310,   311,   312,   313,   314,   315,
-     318,   319,   322,   323,   324,   325,   326,   327,   330,   331,
-     332,   333,   336,   338,   339,   340,   341,   342,   343,   344,
-     345,   346,   347,   348,   349,   350,   351,   352,   353,   354,
-     355,   356,   357,   358,   359,   360,   361,   362,   363,   364,
-     365,   366,   367,   368,   369,   370,   371,   372,   373,   374,
-     375,   377,   378,   379,   380,   381,   382,   383,   384,   385,
-     386,   387,   388,   389,   390,   393,   394,   395,   396,   397,
-     398,   401,   402,   405,   408,   409,   410,   412,   413,   414,
-     416,   417,   419,   420,   421,   422,   423,   424,   425,   426,
-     427,   428,   429,   430,   431,   433,   434,   435,   436,   437,
-     439,   440,   442,   443,   444,   445,   446,   447,   448,   449,
-     451,   452,   453,   454,   457,   458,   460,   461,   462,   463,
-     465,   472,   473,   476,   477,   478,   481,   482,   483,   484,
-     486,   487,   488,   489,   491,   500,   501
+       0,   316,   316,   320,   322,   324,   325,   326,   327,   328,
+     330,   332,   334,   335,   337,   339,   340,   342,   344,   357,
+     366,   375,   384,   393,   395,   397,   399,   400,   401,   403,
+     405,   407,   408,   410,   411,   412,   413,   414,   415,   417,
+     418,   419,   420,   422,   424,   425,   426,   427,   428,   429,
+     432,   433,   436,   437,   438,   439,   440,   441,   442,   443,
+     444,   445,   446,   447,   450,   451,   452,   453,   456,   458,
+     459,   460,   461,   462,   463,   464,   465,   466,   467,   468,
+     469,   470,   471,   472,   473,   474,   475,   476,   477,   478,
+     479,   480,   481,   482,   483,   484,   485,   486,   487,   488,
+     489,   490,   491,   492,   493,   494,   495,   496,   498,   499,
+     500,   501,   502,   503,   504,   505,   506,   507,   508,   509,
+     510,   511,   512,   513,   516,   517,   518,   519,   520,   521,
+     524,   529,   532,   536,   539,   540,   546,   547,   567,   583,
+     584,   597,   598,   601,   604,   605,   606,   608,   609,   610,
+     612,   613,   615,   616,   617,   618,   619,   620,   621,   622,
+     623,   624,   625,   626,   627,   629,   630,   631,   632,   633,
+     635,   636,   638,   639,   640,   641,   642,   643,   644,   645,
+     647,   648,   649,   650,   653,   654,   656,   657,   658,   659,
+     661,   668,   669,   672,   673,   674,   675,   676,   677,   680,
+     681,   682,   683,   684,   685,   686,   687,   689,   690,   691,
+     692,   694,   707,   708
 };
 #endif
 
 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
 {
   "$end", "error", "$undefined", "DST", "SRC", "HOST", "GATEWAY", "NET",
   "NETMASK", "PORT", "PORTRANGE", "LESS", "GREATER", "PROTO", "PROTOCHAIN",
   "CBYTE", "ARP", "RARP", "IP", "SCTP", "TCP", "UDP", "ICMP", "IGMP",
-  "IGRP", "PIM", "VRRP", "ATALK", "AARP", "DECNET", "LAT", "SCA", "MOPRC",
-  "MOPDL", "TK_BROADCAST", "TK_MULTICAST", "NUM", "INBOUND", "OUTBOUND",
-  "PF_IFNAME", "PF_RSET", "PF_RNR", "PF_SRNR", "PF_REASON", "PF_ACTION",
-  "LINK", "GEQ", "LEQ", "NEQ", "ID", "EID", "HID", "HID6", "AID", "LSH",
-  "RSH", "LEN", "IPV6", "ICMPV6", "AH", "ESP", "VLAN", "MPLS", "PPPOED",
-  "PPPOES", "ISO", "ESIS", "CLNP", "ISIS", "L1", "L2", "IIH", "LSP", "SNP",
-  "CSNP", "PSNP", "STP", "IPX", "NETBEUI", "LANE", "LLC", "METAC", "BCC",
-  "SC", "ILMIC", "OAMF4EC", "OAMF4SC", "OAM", "OAMF4", "CONNECTMSG",
-  "METACONNECT", "VPI", "VCI", "RADIO", "FISU", "LSSU", "MSU", "SIO",
-  "OPC", "DPC", "SLS", "AND", "OR", "'!'", "'|'", "'&'", "'+'", "'-'",
-  "'*'", "'/'", "UMINUS", "')'", "'('", "'>'", "'='", "'<'", "'['", "']'",
-  "':'", "$accept", "prog", "null", "expr", "and", "or", "id", "nid",
-  "not", "paren", "pid", "qid", "term", "head", "rterm", "pqual", "dqual",
-  "aqual", "ndaqual", "pname", "other", "pfvar", "reason", "action",
+  "IGRP", "PIM", "VRRP", "CARP", "ATALK", "AARP", "DECNET", "LAT", "SCA",
+  "MOPRC", "MOPDL", "TK_BROADCAST", "TK_MULTICAST", "NUM", "INBOUND",
+  "OUTBOUND", "PF_IFNAME", "PF_RSET", "PF_RNR", "PF_SRNR", "PF_REASON",
+  "PF_ACTION", "TYPE", "SUBTYPE", "DIR", "ADDR1", "ADDR2", "ADDR3",
+  "ADDR4", "RA", "TA", "LINK", "GEQ", "LEQ", "NEQ", "ID", "EID", "HID",
+  "HID6", "AID", "LSH", "RSH", "LEN", "IPV6", "ICMPV6", "AH", "ESP",
+  "VLAN", "MPLS", "PPPOED", "PPPOES", "ISO", "ESIS", "CLNP", "ISIS", "L1",
+  "L2", "IIH", "LSP", "SNP", "CSNP", "PSNP", "STP", "IPX", "NETBEUI",
+  "LANE", "LLC", "METAC", "BCC", "SC", "ILMIC", "OAMF4EC", "OAMF4SC",
+  "OAM", "OAMF4", "CONNECTMSG", "METACONNECT", "VPI", "VCI", "RADIO",
+  "FISU", "LSSU", "MSU", "HFISU", "HLSSU", "HMSU", "SIO", "OPC", "DPC",
+  "SLS", "HSIO", "HOPC", "HDPC", "HSLS", "AND", "OR", "'!'", "'|'", "'&'",
+  "'+'", "'-'", "'*'", "'/'", "UMINUS", "')'", "'('", "'>'", "'='", "'<'",
+  "'['", "']'", "':'", "$accept", "prog", "null", "expr", "and", "or",
+  "id", "nid", "not", "paren", "pid", "qid", "term", "head", "rterm",
+  "pqual", "dqual", "aqual", "ndaqual", "pname", "other", "pfvar",
+  "p80211", "type", "subtype", "type_subtype", "dir", "reason", "action",
   "relop", "irelop", "arth", "narth", "byteop", "pnum", "atmtype",
   "atmmultitype", "atmfield", "atmvalue", "atmfieldvalue", "atmlistvalue",
   "mtp2type", "mtp3field", "mtp3value", "mtp3fieldvalue", "mtp3listvalue", 0
@@ -805,7 +1053,7 @@
 # ifdef YYPRINT
 /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
    token YYLEX-NUM.  */
-static const unsigned short int yytoknum[] =
+static const yytype_uint16 yytoknum[] =
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
@@ -817,37 +1065,42 @@
      325,   326,   327,   328,   329,   330,   331,   332,   333,   334,
      335,   336,   337,   338,   339,   340,   341,   342,   343,   344,
      345,   346,   347,   348,   349,   350,   351,   352,   353,   354,
-     355,   356,   357,    33,   124,    38,    43,    45,    42,    47,
-     358,    41,    40,    62,    61,    60,    91,    93,    58
+     355,   356,   357,   358,   359,   360,   361,   362,   363,   364,
+     365,   366,   367,   368,   369,   370,   371,   372,   373,   374,
+      33,   124,    38,    43,    45,    42,    47,   375,    41,    40,
+      62,    61,    60,    91,    93,    58
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const unsigned char yyr1[] =
+static const yytype_uint8 yyr1[] =
 {
-       0,   119,   120,   120,   121,   122,   122,   122,   122,   122,
-     123,   124,   125,   125,   125,   126,   126,   126,   126,   126,
-     126,   126,   126,   126,   127,   128,   129,   129,   129,   130,
-     130,   131,   131,   132,   132,   132,   132,   132,   132,   133,
-     133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
-     134,   134,   135,   135,   135,   135,   135,   135,   136,   136,
-     136,   136,   137,   138,   138,   138,   138,   138,   138,   138,
-     138,   138,   138,   138,   138,   138,   138,   138,   138,   138,
-     138,   138,   138,   138,   138,   138,   138,   138,   138,   138,
-     138,   138,   138,   138,   138,   138,   138,   138,   138,   138,
-     138,   139,   139,   139,   139,   139,   139,   139,   139,   139,
-     139,   139,   139,   139,   139,   140,   140,   140,   140,   140,
-     140,   141,   141,   142,   143,   143,   143,   144,   144,   144,
-     145,   145,   146,   146,   146,   146,   146,   146,   146,   146,
-     146,   146,   146,   146,   146,   147,   147,   147,   147,   147,
-     148,   148,   149,   149,   149,   149,   149,   149,   149,   149,
-     150,   150,   150,   150,   151,   151,   152,   152,   152,   152,
-     153,   154,   154,   155,   155,   155,   156,   156,   156,   156,
-     157,   157,   157,   157,   158,   159,   159
+       0,   136,   137,   137,   138,   139,   139,   139,   139,   139,
+     140,   141,   142,   142,   142,   143,   143,   143,   143,   143,
+     143,   143,   143,   143,   144,   145,   146,   146,   146,   147,
+     147,   148,   148,   149,   149,   149,   149,   149,   149,   150,
+     150,   150,   150,   150,   150,   150,   150,   150,   150,   150,
+     151,   151,   152,   152,   152,   152,   152,   152,   152,   152,
+     152,   152,   152,   152,   153,   153,   153,   153,   154,   155,
+     155,   155,   155,   155,   155,   155,   155,   155,   155,   155,
+     155,   155,   155,   155,   155,   155,   155,   155,   155,   155,
+     155,   155,   155,   155,   155,   155,   155,   155,   155,   155,
+     155,   155,   155,   155,   155,   155,   155,   155,   156,   156,
+     156,   156,   156,   156,   156,   156,   156,   156,   156,   156,
+     156,   156,   156,   156,   157,   157,   157,   157,   157,   157,
+     158,   158,   158,   158,   159,   159,   160,   160,   161,   162,
+     162,   163,   163,   164,   165,   165,   165,   166,   166,   166,
+     167,   167,   168,   168,   168,   168,   168,   168,   168,   168,
+     168,   168,   168,   168,   168,   169,   169,   169,   169,   169,
+     170,   170,   171,   171,   171,   171,   171,   171,   171,   171,
+     172,   172,   172,   172,   173,   173,   174,   174,   174,   174,
+     175,   176,   176,   177,   177,   177,   177,   177,   177,   178,
+     178,   178,   178,   178,   178,   178,   178,   179,   179,   179,
+     179,   180,   181,   181
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
-static const unsigned char yyr2[] =
+static const yytype_uint8 yyr2[] =
 {
        0,     2,     2,     1,     0,     1,     3,     3,     3,     3,
        1,     1,     1,     1,     3,     1,     3,     3,     1,     3,
@@ -859,268 +1112,307 @@
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     2,     2,     2,     2,     4,     1,     1,     2,     1,
-       2,     1,     1,     1,     1,     2,     2,     2,     2,     2,
-       2,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     2,     2,
+       2,     2,     4,     1,     1,     2,     1,     2,     1,     1,
+       2,     1,     1,     2,     2,     2,     2,     2,     2,     2,
+       4,     2,     2,     2,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     4,     6,     3,     3,     3,     3,     3,     3,
        3,     3,     2,     3,     1,     1,     1,     1,     1,     1,
        1,     3,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     2,     2,     3,
        1,     1,     3,     1,     1,     1,     1,     1,     1,     1,
-       1,     2,     2,     3,     1,     1,     3
+       1,     1,     1,     1,     1,     1,     1,     1,     2,     2,
+       3,     1,     1,     3
 };
 
-/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
-   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
+   Performed when YYTABLE doesn't specify something else to do.  Zero
    means the default is an error.  */
-static const unsigned char yydefact[] =
+static const yytype_uint8 yydefact[] =
 {
-       4,     0,    51,     1,     0,     0,     0,    65,    66,    64,
-      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
-      77,    78,    79,    81,    80,   150,   106,   107,     0,     0,
-       0,     0,     0,     0,    63,   144,    82,    83,    84,    85,
-     109,   111,   112,   113,    86,    87,    96,    88,    89,    90,
-      91,    92,    93,    95,    94,    97,    98,    99,   152,   153,
-     154,   155,   158,   159,   156,   157,   160,   161,   162,   163,
-     164,   165,   100,   173,   174,   175,   176,   177,   178,   179,
-      24,     0,    25,     2,    51,    51,     5,     0,    31,     0,
-      50,    44,   114,     0,   131,   130,    45,    46,     0,    48,
-       0,   103,   104,     0,   115,   116,   117,   118,   121,   122,
-     119,   123,   120,     0,   108,   110,     0,     0,   142,    10,
-      11,    51,    51,    32,     0,   131,   130,    15,    21,    18,
-      20,    22,    39,    12,     0,     0,    13,    53,    52,    58,
-      62,    59,    60,    61,    36,    37,   101,   102,    34,    35,
-      38,     0,   125,   127,   129,     0,     0,     0,     0,     0,
-       0,     0,     0,   124,   126,   128,     0,     0,   170,     0,
-       0,     0,    47,   166,   184,     0,     0,     0,    49,   180,
-     146,   145,   148,   149,   147,     0,     0,     0,     7,    51,
-      51,     6,   130,     9,     8,    40,   143,   151,     0,     0,
-       0,    23,    26,    30,     0,    29,     0,     0,     0,     0,
-      33,     0,   140,   141,   139,   138,   134,   135,   136,   137,
-      42,    43,   171,     0,   167,   168,   185,     0,   181,   182,
-     105,   130,    17,    16,    19,    14,     0,     0,    57,    55,
-      56,    54,   132,     0,   169,     0,   183,     0,    27,    28,
-       0,   172,   186,   133
+       4,     0,    51,     1,     0,     0,     0,    71,    72,    70,
+      73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
+      83,    84,    85,    86,    88,    87,   170,   113,   114,     0,
+       0,     0,     0,     0,     0,    69,   164,    89,    90,    91,
+      92,   116,   118,   119,   121,    93,    94,   103,    95,    96,
+      97,    98,    99,   100,   102,   101,   104,   105,   106,   172,
+     173,   174,   175,   178,   179,   176,   177,   180,   181,   182,
+     183,   184,   185,   107,   193,   194,   195,   196,   197,   198,
+     199,   200,   201,   202,   203,   204,   205,   206,    24,     0,
+      25,     2,    51,    51,     5,     0,    31,     0,    50,    44,
+     122,     0,   151,   150,    45,    46,     0,    48,     0,   110,
+     111,     0,   124,   125,   126,   127,   141,   142,   128,   143,
+     129,     0,   115,   117,   120,     0,     0,   162,    10,    11,
+      51,    51,    32,     0,   151,   150,    15,    21,    18,    20,
+      22,    39,    12,     0,     0,    13,    53,    52,    64,    68,
+      65,    66,    67,    36,    37,   108,   109,     0,     0,     0,
+      58,    59,    60,    61,    62,    63,    34,    35,    38,   123,
+       0,   145,   147,   149,     0,     0,     0,     0,     0,     0,
+       0,     0,   144,   146,   148,     0,     0,   190,     0,     0,
+       0,    47,   186,   211,     0,     0,     0,    49,   207,   166,
+     165,   168,   169,   167,     0,     0,     0,     7,    51,    51,
+       6,   150,     9,     8,    40,   163,   171,     0,     0,     0,
+      23,    26,    30,     0,    29,     0,     0,     0,     0,   134,
+     135,   131,   138,   132,   139,   140,   133,    33,     0,   160,
+     161,   159,   158,   154,   155,   156,   157,    42,    43,   191,
+       0,   187,   188,   212,     0,   208,   209,   112,   150,    17,
+      16,    19,    14,     0,     0,    57,    55,    56,    54,     0,
+     152,     0,   189,     0,   210,     0,    27,    28,   136,   137,
+     130,     0,   192,   213,   153
 };
 
-/* YYDEFGOTO[NTERM-NUM]. */
-static const short int yydefgoto[] =
+/* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int16 yydefgoto[] =
 {
-      -1,     1,     2,   124,   121,   122,   201,   133,   134,   116,
-     203,   204,    86,    87,    88,    89,   148,   149,   150,   117,
-      91,    92,   110,   112,   166,   167,    93,    94,   185,    95,
-      96,    97,    98,   172,   173,   223,    99,   100,   178,   179,
-     227
+      -1,     1,     2,   133,   130,   131,   220,   142,   143,   125,
+     222,   223,    94,    95,    96,    97,   166,   167,   168,   126,
+      99,   100,   169,   231,   280,   233,   236,   118,   120,   185,
+     186,   101,   102,   204,   103,   104,   105,   106,   191,   192,
+     250,   107,   108,   197,   198,   254
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -181
-static const short int yypact[] =
+#define YYPACT_NINF -208
+static const yytype_int16 yypact[] =
 {
-    -181,    19,   200,  -181,    -3,     1,    15,  -181,  -181,  -181,
-    -181,  -181,  -181,  -181,  -181,  -181,  -181,  -181,  -181,  -181,
-    -181,  -181,  -181,  -181,  -181,  -181,  -181,  -181,    13,    20,
-      18,    44,   -26,    35,  -181,  -181,  -181,  -181,  -181,  -181,
-     -19,   -19,  -181,  -181,  -181,  -181,  -181,  -181,  -181,  -181,
-    -181,  -181,  -181,  -181,  -181,  -181,  -181,  -181,  -181,  -181,
-    -181,  -181,  -181,  -181,  -181,  -181,  -181,  -181,  -181,  -181,
-    -181,  -181,  -181,  -181,  -181,  -181,  -181,  -181,  -181,  -181,
-    -181,   493,  -181,    41,   396,   396,  -181,   -24,  -181,   155,
-       2,  -181,  -181,   488,  -181,  -181,  -181,  -181,     9,  -181,
-     134,  -181,  -181,    62,  -181,  -181,  -181,  -181,  -181,  -181,
-    -181,  -181,  -181,   -19,  -181,  -181,   493,    -9,  -181,  -181,
-    -181,   298,   298,  -181,   -53,   -14,    -1,  -181,  -181,     0,
-       3,  -181,  -181,  -181,   -24,   -24,  -181,    77,    82,  -181,
-    -181,  -181,  -181,  -181,  -181,  -181,  -181,  -181,   437,  -181,
-    -181,   493,  -181,  -181,  -181,   493,   493,   493,   493,   493,
-     493,   493,   493,  -181,  -181,  -181,   493,   493,  -181,    78,
-      81,    89,  -181,  -181,  -181,    95,   108,   113,  -181,  -181,
-    -181,  -181,  -181,  -181,  -181,   120,    -1,   -34,  -181,   298,
-     298,  -181,     4,  -181,  -181,  -181,  -181,  -181,   112,   149,
-     150,  -181,  -181,    80,    41,    -1,   188,   189,   205,   206,
-    -181,   -41,    65,    65,    98,   144,   -93,   -93,  -181,  -181,
-     -34,   -34,  -181,   -80,  -181,  -181,  -181,   -58,  -181,  -181,
-    -181,    46,  -181,  -181,  -181,  -181,   -24,   -24,  -181,  -181,
-    -181,  -181,  -181,   174,  -181,    78,  -181,    95,  -181,  -181,
-      96,  -181,  -181,  -181
+    -208,    20,   226,  -208,   -10,    -3,     1,  -208,  -208,  -208,
+    -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
+    -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,   -28,
+     -15,    49,    68,   -18,    62,  -208,  -208,  -208,  -208,  -208,
+    -208,   -26,   -26,  -208,   -26,  -208,  -208,  -208,  -208,  -208,
+    -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
+    -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
+    -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
+    -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,   570,
+    -208,   -42,   456,   456,  -208,    19,  -208,   656,    12,  -208,
+    -208,   153,  -208,  -208,  -208,  -208,    55,  -208,    59,  -208,
+    -208,   -69,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,
+    -208,   -26,  -208,  -208,  -208,   570,   -19,  -208,  -208,  -208,
+     341,   341,  -208,   -93,    -1,    21,  -208,  -208,    -6,    34,
+    -208,  -208,  -208,    19,    19,  -208,    -9,     6,  -208,  -208,
+    -208,  -208,  -208,  -208,  -208,  -208,  -208,   -14,    74,   -13,
+    -208,  -208,  -208,  -208,  -208,  -208,    23,  -208,  -208,  -208,
+     570,  -208,  -208,  -208,   570,   570,   570,   570,   570,   570,
+     570,   570,  -208,  -208,  -208,   570,   570,  -208,    81,   134,
+     139,  -208,  -208,  -208,   140,   141,   142,  -208,  -208,  -208,
+    -208,  -208,  -208,  -208,   143,    21,    79,  -208,   341,   341,
+    -208,     4,  -208,  -208,  -208,  -208,  -208,    86,   144,   145,
+    -208,  -208,    64,   -42,    21,   179,   189,   191,   192,  -208,
+    -208,   149,  -208,  -208,  -208,  -208,  -208,  -208,   -51,    42,
+      42,    99,   110,    33,    33,  -208,  -208,    79,    79,  -208,
+     -61,  -208,  -208,  -208,   -59,  -208,  -208,  -208,   -64,  -208,
+    -208,  -208,  -208,    19,    19,  -208,  -208,  -208,  -208,    -8,
+    -208,   160,  -208,    81,  -208,   140,  -208,  -208,  -208,  -208,
+    -208,    65,  -208,  -208,  -208
 };
 
 /* YYPGOTO[NTERM-NUM].  */
-static const short int yypgoto[] =
+static const yytype_int16 yypgoto[] =
 {
-    -181,  -181,  -181,   212,    50,  -180,   -86,   -89,     5,    -2,
-    -181,  -181,   -81,  -181,  -181,  -181,  -181,   107,  -181,     7,
-    -181,  -181,  -181,  -181,   -66,   -39,   -21,   -74,  -181,   -35,
-    -181,  -181,  -181,  -181,  -151,  -181,  -181,  -181,  -181,  -145,
-    -181
+    -208,  -208,  -208,   196,   -11,  -207,   -94,  -122,     5,    -2,
+    -208,  -208,   -82,  -208,  -208,  -208,  -208,    53,  -208,     7,
+    -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,  -208,   -91,
+     -40,   -24,   -75,  -208,   -36,  -208,  -208,  -208,  -208,  -185,
+    -208,  -208,  -208,  -208,  -173,  -208
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
-   number is the opposite.  If zero, do what YYDEFACT says.
-   If YYTABLE_NINF, syntax error.  */
+   number is the opposite.  If YYTABLE_NINF, syntax error.  */
 #define YYTABLE_NINF -42
-static const short int yytable[] =
+static const yytype_int16 yytable[] =
 {
-      85,   132,   -41,   123,   -13,   114,   115,    84,   198,    90,
-     108,   125,    25,   155,   156,   161,   162,    25,   222,     3,
-     155,   156,   120,   109,   237,   127,   128,   129,   130,   131,
-     226,   244,   170,   101,   176,   188,   193,   102,   113,   113,
-     191,   194,   125,   245,   120,   168,   202,   247,   119,   120,
-     126,   103,   136,   246,   106,   152,   153,   154,   195,   171,
-     118,   177,   104,   157,   158,   159,   160,   161,   162,   105,
-     157,   158,   159,   160,   161,   162,   242,   243,   186,    80,
-     107,   126,    85,    85,   111,   135,   192,   192,    82,    84,
-      84,    90,    90,    82,   251,   187,   169,   196,   175,   136,
-     205,   202,   252,   -41,   -41,   -13,   -13,   151,   123,   199,
-     197,   113,   200,   -41,   168,   -13,   125,   224,   151,   190,
-     190,    82,   163,   164,   165,   225,   189,   189,    90,    90,
-     211,   174,   135,   113,   212,   213,   214,   215,   216,   217,
-     218,   219,   119,   120,   228,   220,   221,   -29,   -29,   229,
-     248,   249,   155,   156,   192,   231,   230,   197,   137,   138,
-     139,   140,   141,   232,   142,   143,   180,   181,   144,   145,
-     174,   159,   160,   161,   162,   182,   183,   184,   206,   207,
-     152,   153,   154,   208,   209,   233,   234,   190,    85,   146,
-     147,   235,   238,   239,   189,   189,    90,    90,   155,   156,
-      -3,   136,   136,   158,   159,   160,   161,   162,   240,   241,
-     250,     4,     5,   253,    83,     6,     7,     8,     9,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,    24,   135,   135,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    34,    82,   163,   164,   165,
-     159,   160,   161,   162,   236,   210,    35,    36,    37,    38,
+      93,   141,   217,   249,   -13,   122,   123,    92,   124,    98,
+     132,    26,   -41,   174,   175,   189,   264,   195,   134,   116,
+       3,   253,   221,   229,   234,   128,   129,   109,   148,   278,
+     150,   112,   151,   152,   110,   214,   207,   212,   111,   121,
+     121,   117,   121,   273,   113,   230,   235,   275,   210,   213,
+     134,   279,   199,   200,   -29,   -29,    26,   135,   129,   145,
+     129,   201,   202,   203,   216,   127,   190,   272,   196,   274,
+     176,   177,   178,   179,   180,   181,   128,   129,   136,   137,
+     138,   139,   140,   270,   271,   205,   114,   221,   282,   135,
+      93,    93,   187,   144,   211,   211,   193,    92,    92,    98,
+      98,   206,   283,    90,   188,   115,   194,   145,   224,   225,
+     226,   171,   172,   173,   170,   171,   172,   173,   187,   121,
+     218,   119,   -13,   -13,   227,   228,   132,   215,   209,   209,
+     -41,   -41,   -13,   232,   134,   208,   208,    98,    98,    88,
+     -41,   144,   121,   174,   175,   170,   238,   259,    90,   216,
+     239,   240,   241,   242,   243,   244,   245,   246,   180,   181,
+     219,   247,   248,   174,   175,   178,   179,   180,   181,   276,
+     277,   251,   211,   258,   174,   175,   252,   193,   255,   256,
+     257,   260,   261,   265,    90,   182,   183,   184,    90,   182,
+     183,   184,   262,   266,   267,   268,   269,   281,    91,   284,
+     176,   177,   178,   179,   180,   181,   209,    93,     0,   171,
+     172,   173,   263,   208,   208,    98,    98,   174,   175,   237,
+       0,   177,   178,   179,   180,   181,    -3,   145,   145,     0,
+       0,     0,     0,   178,   179,   180,   181,     4,     5,     0,
+       0,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,   144,   144,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,     0,     0,   176,   177,   178,   179,   180,   181,
+       0,    35,     0,   182,   183,   184,     0,     0,     0,     0,
+       0,     0,    36,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+      84,    85,    86,    87,     0,     0,    88,     0,     0,     0,
+      89,     0,     4,     5,     0,    90,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,     0,     0,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    35,     0,     0,     0,
+     136,   137,   138,   139,   140,     0,     0,    36,    37,    38,
       39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
       49,    50,    51,    52,    53,    54,    55,    56,    57,    58,
       59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
       69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,     0,     0,    80,     0,     0,     0,    81,     0,     4,
-       5,     0,    82,     6,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    24,     0,     0,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,     0,     0,     0,   127,   128,   129,
-     130,   131,     0,     0,    35,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
-      51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      71,    72,    73,    74,    75,    76,    77,    78,    79,     0,
-       0,    80,     0,     0,     0,    81,     0,     4,     5,     0,
-      82,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,     0,
+       0,    88,     0,     0,     0,    89,     0,     4,     5,     0,
+      90,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-       0,     0,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    34,   139,     0,   141,     0,   142,   143,     0,     0,
-       0,     0,    35,    36,    37,    38,    39,    40,    41,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
-      53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
-      73,    74,    75,    76,    77,    78,    79,     0,     0,    80,
-       0,     0,     0,    81,     0,     0,     0,     0,    82,     7,
-       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,     0,     0,    25,
-       0,     0,     0,     0,   152,   153,   154,     0,    34,     0,
-       0,     0,   155,   156,     0,     0,     0,     0,     0,    35,
-      36,    37,    38,    39,     0,     0,     0,     0,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
-      56,    57,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    72,     0,     0,     0,
-       0,     0,   157,   158,   159,   160,   161,   162,     0,     0,
-      81,   163,   164,   165,     0,    82
-};
-
-static const short int yycheck[] =
-{
-       2,    87,     0,    84,     0,    40,    41,     2,     8,     2,
-      36,    85,    36,    54,    55,   108,   109,    36,   169,     0,
-      54,    55,   102,    49,   204,    49,    50,    51,    52,    53,
-     175,   111,    98,    36,   100,   121,   122,    36,    40,    41,
-     121,   122,   116,   223,   102,    36,   135,   227,   101,   102,
-      85,    36,    87,   111,    36,    46,    47,    48,   111,    98,
-      81,   100,    49,   104,   105,   106,   107,   108,   109,    49,
-     104,   105,   106,   107,   108,   109,   117,   118,   113,   103,
-      36,   116,    84,    85,    49,    87,   121,   122,   112,    84,
-      85,    84,    85,   112,   245,   116,    98,   111,   100,   134,
-     135,   190,   247,   101,   102,   101,   102,   116,   189,   109,
-     111,   113,   109,   111,    36,   111,   190,    36,   116,   121,
-     122,   112,   113,   114,   115,    36,   121,   122,   121,   122,
-     151,    36,   134,   135,   155,   156,   157,   158,   159,   160,
-     161,   162,   101,   102,    36,   166,   167,   101,   102,    36,
-     236,   237,    54,    55,   189,   190,    36,   111,     3,     4,
-       5,     6,     7,    51,     9,    10,   104,   105,    13,    14,
-      36,   106,   107,   108,   109,   113,   114,   115,   101,   102,
-      46,    47,    48,   101,   102,    36,    36,   189,   190,    34,
-      35,   111,     4,     4,   189,   190,   189,   190,    54,    55,
-       0,   236,   237,   105,   106,   107,   108,   109,     3,     3,
-      36,    11,    12,   117,     2,    15,    16,    17,    18,    19,
-      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
-      30,    31,    32,    33,   236,   237,    36,    37,    38,    39,
-      40,    41,    42,    43,    44,    45,   112,   113,   114,   115,
-     106,   107,   108,   109,   204,   148,    56,    57,    58,    59,
-      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
-      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
-      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
-     100,    -1,    -1,   103,    -1,    -1,    -1,   107,    -1,    11,
-      12,    -1,   112,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    -1,    -1,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    -1,    -1,    -1,    49,    50,    51,
-      52,    53,    -1,    -1,    56,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
-      82,    83,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    98,    99,   100,    -1,
-      -1,   103,    -1,    -1,    -1,   107,    -1,    11,    12,    -1,
-     112,    15,    16,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
-      -1,    -1,    36,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,     5,    -1,     7,    -1,     9,    10,    -1,    -1,
-      -1,    -1,    56,    57,    58,    59,    60,    61,    62,    63,
+      25,     0,     0,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    35,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    36,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
+      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
       64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
       74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+      84,    85,    86,    87,     0,     0,    88,     0,     0,     0,
+      89,     0,     0,     0,     0,    90,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,     0,     0,    26,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    35,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    36,    37,    38,    39,
+      40,     0,     0,     0,     0,    45,    46,    47,    48,    49,
+      50,    51,    52,    53,    54,    55,    56,    57,    58,   146,
+     147,   148,   149,   150,     0,   151,   152,     0,     0,   153,
+     154,     0,     0,    73,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   155,   156,     0,    89,     0,     0,     0,     0,    90,
+       0,     0,   157,   158,   159,   160,   161,   162,   163,   164,
+     165
+};
+
+#define yypact_value_is_default(yystate) \
+  ((yystate) == (-208))
+
+#define yytable_value_is_error(yytable_value) \
+  YYID (0)
+
+static const yytype_int16 yycheck[] =
+{
+       2,    95,     8,   188,     0,    41,    42,     2,    44,     2,
+      92,    37,     0,    64,    65,   106,   223,   108,    93,    37,
+       0,   194,   144,    37,    37,   118,   119,    37,     5,    37,
+       7,    59,     9,    10,    37,   128,   130,   131,    37,    41,
+      42,    59,    44,   250,    59,    59,    59,   254,   130,   131,
+     125,    59,   121,   122,   118,   119,    37,    93,   119,    95,
+     119,   130,   131,   132,   128,    89,   106,   128,   108,   128,
+     121,   122,   123,   124,   125,   126,   118,   119,    59,    60,
+      61,    62,    63,   134,   135,   121,    37,   209,   273,   125,
+      92,    93,    37,    95,   130,   131,    37,    92,    93,    92,
+      93,   125,   275,   129,   106,    37,   108,   143,   144,   118,
+     119,    56,    57,    58,   133,    56,    57,    58,    37,   121,
+     126,    59,   118,   119,   118,   119,   208,   128,   130,   131,
+     118,   119,   128,    59,   209,   130,   131,   130,   131,   120,
+     128,   143,   144,    64,    65,   133,   170,    61,   129,   128,
+     174,   175,   176,   177,   178,   179,   180,   181,   125,   126,
+     126,   185,   186,    64,    65,   123,   124,   125,   126,   263,
+     264,    37,   208,   209,    64,    65,    37,    37,    37,    37,
+      37,    37,    37,     4,   129,   130,   131,   132,   129,   130,
+     131,   132,   128,     4,     3,     3,    47,    37,     2,   134,
+     121,   122,   123,   124,   125,   126,   208,   209,    -1,    56,
+      57,    58,   223,   208,   209,   208,   209,    64,    65,   166,
+      -1,   122,   123,   124,   125,   126,     0,   263,   264,    -1,
+      -1,    -1,    -1,   123,   124,   125,   126,    11,    12,    -1,
+      -1,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,   263,   264,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    -1,    -1,   121,   122,   123,   124,   125,   126,
+      -1,    55,    -1,   130,   131,   132,    -1,    -1,    -1,    -1,
+      -1,    -1,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
       84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
-      94,    95,    96,    97,    98,    99,   100,    -1,    -1,   103,
-      -1,    -1,    -1,   107,    -1,    -1,    -1,    -1,   112,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    28,    29,    30,    31,    32,    33,    -1,    -1,    36,
-      -1,    -1,    -1,    -1,    46,    47,    48,    -1,    45,    -1,
-      -1,    -1,    54,    55,    -1,    -1,    -1,    -1,    -1,    56,
-      57,    58,    59,    60,    -1,    -1,    -1,    -1,    65,    66,
-      67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
-      77,    78,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    93,    -1,    -1,    -1,
-      -1,    -1,   104,   105,   106,   107,   108,   109,    -1,    -1,
-     107,   113,   114,   115,    -1,   112
+      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
+     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
+     114,   115,   116,   117,    -1,    -1,   120,    -1,    -1,    -1,
+     124,    -1,    11,    12,    -1,   129,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    -1,    -1,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    55,    -1,    -1,    -1,
+      59,    60,    61,    62,    63,    -1,    -1,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,    96,    97,    98,
+      99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
+     109,   110,   111,   112,   113,   114,   115,   116,   117,    -1,
+      -1,   120,    -1,    -1,    -1,   124,    -1,    11,    12,    -1,
+     129,    15,    16,    17,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    -1,    -1,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    55,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    66,    67,    68,    69,    70,    71,    72,    73,
+      74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
+      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
+      94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
+     104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
+     114,   115,   116,   117,    -1,    -1,   120,    -1,    -1,    -1,
+     124,    -1,    -1,    -1,    -1,   129,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    -1,    -1,    37,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    55,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    66,    67,    68,    69,
+      70,    -1,    -1,    -1,    -1,    75,    76,    77,    78,    79,
+      80,    81,    82,    83,    84,    85,    86,    87,    88,     3,
+       4,     5,     6,     7,    -1,     9,    10,    -1,    -1,    13,
+      14,    -1,    -1,   103,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    35,    36,    -1,   124,    -1,    -1,    -1,    -1,   129,
+      -1,    -1,    46,    47,    48,    49,    50,    51,    52,    53,
+      54
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
-static const unsigned char yystos[] =
+static const yytype_uint8 yystos[] =
 {
-       0,   120,   121,     0,    11,    12,    15,    16,    17,    18,
+       0,   137,   138,     0,    11,    12,    15,    16,    17,    18,
       19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
-      29,    30,    31,    32,    33,    36,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    56,    57,    58,    59,    60,
-      61,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-      71,    72,    73,    74,    75,    76,    77,    78,    79,    80,
-      81,    82,    83,    84,    85,    86,    87,    88,    89,    90,
-      91,    92,    93,    94,    95,    96,    97,    98,    99,   100,
-     103,   107,   112,   122,   127,   128,   131,   132,   133,   134,
-     138,   139,   140,   145,   146,   148,   149,   150,   151,   155,
-     156,    36,    36,    36,    49,    49,    36,    36,    36,    49,
-     141,    49,   142,   128,   148,   148,   128,   138,   145,   101,
-     102,   123,   124,   131,   122,   146,   148,    49,    50,    51,
-      52,    53,   125,   126,   127,   128,   148,     3,     4,     5,
-       6,     7,     9,    10,    13,    14,    34,    35,   135,   136,
-     137,   116,    46,    47,    48,    54,    55,   104,   105,   106,
-     107,   108,   109,   113,   114,   115,   143,   144,    36,   128,
-     143,   144,   152,   153,    36,   128,   143,   144,   157,   158,
-     104,   105,   113,   114,   115,   147,   148,   145,   125,   127,
-     128,   131,   148,   125,   131,   111,   111,   111,     8,   109,
-     109,   125,   126,   129,   130,   148,   101,   102,   101,   102,
-     136,   145,   145,   145,   145,   145,   145,   145,   145,   145,
-     145,   145,   153,   154,    36,    36,   158,   159,    36,    36,
-      36,   148,    51,    36,    36,   111,   123,   124,     4,     4,
-       3,     3,   117,   118,   111,   124,   111,   124,   125,   125,
-      36,   153,   158,   117
+      29,    30,    31,    32,    33,    34,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    55,    66,    67,    68,    69,
+      70,    71,    72,    73,    74,    75,    76,    77,    78,    79,
+      80,    81,    82,    83,    84,    85,    86,    87,    88,    89,
+      90,    91,    92,    93,    94,    95,    96,    97,    98,    99,
+     100,   101,   102,   103,   104,   105,   106,   107,   108,   109,
+     110,   111,   112,   113,   114,   115,   116,   117,   120,   124,
+     129,   139,   144,   145,   148,   149,   150,   151,   155,   156,
+     157,   167,   168,   170,   171,   172,   173,   177,   178,    37,
+      37,    37,    59,    59,    37,    37,    37,    59,   163,    59,
+     164,   145,   170,   170,   170,   145,   155,   167,   118,   119,
+     140,   141,   148,   139,   168,   170,    59,    60,    61,    62,
+      63,   142,   143,   144,   145,   170,     3,     4,     5,     6,
+       7,     9,    10,    13,    14,    35,    36,    46,    47,    48,
+      49,    50,    51,    52,    53,    54,   152,   153,   154,   158,
+     133,    56,    57,    58,    64,    65,   121,   122,   123,   124,
+     125,   126,   130,   131,   132,   165,   166,    37,   145,   165,
+     166,   174,   175,    37,   145,   165,   166,   179,   180,   121,
+     122,   130,   131,   132,   169,   170,   167,   142,   144,   145,
+     148,   170,   142,   148,   128,   128,   128,     8,   126,   126,
+     142,   143,   146,   147,   170,   118,   119,   118,   119,    37,
+      59,   159,    59,   161,    37,    59,   162,   153,   167,   167,
+     167,   167,   167,   167,   167,   167,   167,   167,   167,   175,
+     176,    37,    37,   180,   181,    37,    37,    37,   170,    61,
+      37,    37,   128,   140,   141,     4,     4,     3,     3,    47,
+     134,   135,   128,   141,   128,   141,   142,   142,    37,    59,
+     160,    37,   175,   180,   134
 };
 
 #define yyerrok		(yyerrstatus = 0)
@@ -1135,9 +1427,18 @@
 
 /* Like YYERROR except do call yyerror.  This remains here temporarily
    to ease the transition to the new meaning of YYERROR, for GCC.
-   Once GCC version 2 has supplanted version 1, this can go.  */
+   Once GCC version 2 has supplanted version 1, this can go.  However,
+   YYFAIL appears to be in use.  Nevertheless, it is formally deprecated
+   in Bison 2.4.2's NEWS entry, where a plan to phase it out is
+   discussed.  */
 
 #define YYFAIL		goto yyerrlab
+#if defined YYFAIL
+  /* This is here to suppress warnings from the GCC cpp's
+     -Wunused-macros.  Normally we don't worry about that warning, but
+     some users do, and we want to make it easy for users to remove
+     YYFAIL uses, which will produce warnings from Bison 2.5.  */
+#endif
 
 #define YYRECOVERING()  (!!yyerrstatus)
 
@@ -1147,8 +1448,7 @@
     {								\
       yychar = (Token);						\
       yylval = (Value);						\
-      yytoken = YYTRANSLATE (yychar);				\
-      YYPOPSTACK;						\
+      YYPOPSTACK (1);						\
       goto yybackup;						\
     }								\
   else								\
@@ -1156,7 +1456,7 @@
       yyerror (YY_("syntax error: cannot back up")); \
       YYERROR;							\
     }								\
-while (0)
+while (YYID (0))
 
 
 #define YYTERROR	1
@@ -1171,7 +1471,7 @@
 #ifndef YYLLOC_DEFAULT
 # define YYLLOC_DEFAULT(Current, Rhs, N)				\
     do									\
-      if (N)								\
+      if (YYID (N))                                                    \
 	{								\
 	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
 	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
@@ -1185,23 +1485,14 @@
 	  (Current).first_column = (Current).last_column =		\
 	    YYRHSLOC (Rhs, 0).last_column;				\
 	}								\
-    while (0)
+    while (YYID (0))
 #endif
 
 
-/* YY_LOCATION_PRINT -- Print the location on the stream.
-   This macro was not mandated originally: define only if we know
-   we won't break user code: when these are the locations we know.  */
+/* This macro is provided for backward compatibility. */
 
 #ifndef YY_LOCATION_PRINT
-# if YYLTYPE_IS_TRIVIAL
-#  define YY_LOCATION_PRINT(File, Loc)			\
-     fprintf (File, "%d.%d-%d.%d",			\
-              (Loc).first_line, (Loc).first_column,	\
-              (Loc).last_line,  (Loc).last_column)
-# else
-#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-# endif
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
 #endif
 
 
@@ -1225,37 +1516,100 @@
 do {						\
   if (yydebug)					\
     YYFPRINTF Args;				\
-} while (0)
+} while (YYID (0))
 
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)		\
-do {								\
-  if (yydebug)							\
-    {								\
-      YYFPRINTF (stderr, "%s ", Title);				\
-      yysymprint (stderr,					\
-                  Type, Value);	\
-      YYFPRINTF (stderr, "\n");					\
-    }								\
-} while (0)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
+do {									  \
+  if (yydebug)								  \
+    {									  \
+      YYFPRINTF (stderr, "%s ", Title);					  \
+      yy_symbol_print (stderr,						  \
+		  Type, Value); \
+      YYFPRINTF (stderr, "\n");						  \
+    }									  \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (!yyvaluep)
+    return;
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+  YYUSE (yyoutput);
+# endif
+  switch (yytype)
+    {
+      default:
+	break;
+    }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  yy_symbol_value_print (yyoutput, yytype, yyvaluep);
+  YYFPRINTF (yyoutput, ")");
+}
 
 /*------------------------------------------------------------------.
 | yy_stack_print -- Print the state stack from its BOTTOM up to its |
 | TOP (included).                                                   |
 `------------------------------------------------------------------*/
 
-#if defined (__STDC__) || defined (__cplusplus)
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
-yy_stack_print (short int *bottom, short int *top)
+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
 #else
 static void
-yy_stack_print (bottom, top)
-    short int *bottom;
-    short int *top;
+yy_stack_print (yybottom, yytop)
+    yytype_int16 *yybottom;
+    yytype_int16 *yytop;
 #endif
 {
   YYFPRINTF (stderr, "Stack now");
-  for (/* Nothing. */; bottom <= top; ++bottom)
-    YYFPRINTF (stderr, " %d", *bottom);
+  for (; yybottom <= yytop; yybottom++)
+    {
+      int yybot = *yybottom;
+      YYFPRINTF (stderr, " %d", yybot);
+    }
   YYFPRINTF (stderr, "\n");
 }
 
@@ -1263,37 +1617,45 @@
 do {								\
   if (yydebug)							\
     yy_stack_print ((Bottom), (Top));				\
-} while (0)
+} while (YYID (0))
 
 
 /*------------------------------------------------.
 | Report that the YYRULE is going to be reduced.  |
 `------------------------------------------------*/
 
-#if defined (__STDC__) || defined (__cplusplus)
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
-yy_reduce_print (int yyrule)
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
 #else
 static void
-yy_reduce_print (yyrule)
+yy_reduce_print (yyvsp, yyrule)
+    YYSTYPE *yyvsp;
     int yyrule;
 #endif
 {
+  int yynrhs = yyr2[yyrule];
   int yyi;
   unsigned long int yylno = yyrline[yyrule];
-  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ",
-             yyrule - 1, yylno);
-  /* Print the symbols being reduced, and their result.  */
-  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
-    YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
-  YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]);
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+	     yyrule - 1, yylno);
+  /* The symbols being reduced.  */
+  for (yyi = 0; yyi < yynrhs; yyi++)
+    {
+      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
+      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+		       &(yyvsp[(yyi + 1) - (yynrhs)])
+		       		       );
+      YYFPRINTF (stderr, "\n");
+    }
 }
 
 # define YY_REDUCE_PRINT(Rule)		\
 do {					\
   if (yydebug)				\
-    yy_reduce_print (Rule);		\
-} while (0)
+    yy_reduce_print (yyvsp, Rule); \
+} while (YYID (0))
 
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
@@ -1322,47 +1684,48 @@
 # define YYMAXDEPTH 10000
 #endif
 
-
 
 #if YYERROR_VERBOSE
 
 # ifndef yystrlen
-#  if defined (__GLIBC__) && defined (_STRING_H)
+#  if defined __GLIBC__ && defined _STRING_H
 #   define yystrlen strlen
 #  else
 /* Return the length of YYSTR.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static YYSIZE_T
-#   if defined (__STDC__) || defined (__cplusplus)
 yystrlen (const char *yystr)
-#   else
+#else
+static YYSIZE_T
 yystrlen (yystr)
-     const char *yystr;
-#   endif
+    const char *yystr;
+#endif
 {
-  const char *yys = yystr;
-
-  while (*yys++ != '\0')
+  YYSIZE_T yylen;
+  for (yylen = 0; yystr[yylen]; yylen++)
     continue;
-
-  return yys - yystr - 1;
+  return yylen;
 }
 #  endif
 # endif
 
 # ifndef yystpcpy
-#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
 #   define yystpcpy stpcpy
 #  else
 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
    YYDEST.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static char *
-#   if defined (__STDC__) || defined (__cplusplus)
 yystpcpy (char *yydest, const char *yysrc)
-#   else
+#else
+static char *
 yystpcpy (yydest, yysrc)
-     char *yydest;
-     const char *yysrc;
-#   endif
+    char *yydest;
+    const char *yysrc;
+#endif
 {
   char *yyd = yydest;
   const char *yys = yysrc;
@@ -1388,7 +1751,7 @@
 {
   if (*yystr == '"')
     {
-      size_t yyn = 0;
+      YYSIZE_T yyn = 0;
       char const *yyp = yystr;
 
       for (;;)
@@ -1423,53 +1786,150 @@
 }
 # endif
 
+/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
+   about the unexpected token YYTOKEN for the state stack whose top is
+   YYSSP.
+
+   Return 0 if *YYMSG was successfully written.  Return 1 if *YYMSG is
+   not large enough to hold the message.  In that case, also set
+   *YYMSG_ALLOC to the required number of bytes.  Return 2 if the
+   required number of bytes is too large to store.  */
+static int
+yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
+                yytype_int16 *yyssp, int yytoken)
+{
+  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]);
+  YYSIZE_T yysize = yysize0;
+  YYSIZE_T yysize1;
+  enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+  /* Internationalized format string. */
+  const char *yyformat = 0;
+  /* Arguments of yyformat. */
+  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+  /* Number of reported tokens (one for the "unexpected", one per
+     "expected"). */
+  int yycount = 0;
+
+  /* There are many possibilities here to consider:
+     - Assume YYFAIL is not used.  It's too flawed to consider.  See
+       <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
+       for details.  YYERROR is fine as it does not invoke this
+       function.
+     - If this state is a consistent state with a default action, then
+       the only way this function was invoked is if the default action
+       is an error action.  In that case, don't check for expected
+       tokens because there are none.
+     - The only way there can be no lookahead present (in yychar) is if
+       this state is a consistent state with a default action.  Thus,
+       detecting the absence of a lookahead is sufficient to determine
+       that there is no unexpected or expected token to report.  In that
+       case, just report a simple "syntax error".
+     - Don't assume there isn't a lookahead just because this state is a
+       consistent state with a default action.  There might have been a
+       previous inconsistent state, consistent state with a non-default
+       action, or user semantic action that manipulated yychar.
+     - Of course, the expected token list depends on states to have
+       correct lookahead information, and it depends on the parser not
+       to perform extra reductions after fetching a lookahead from the
+       scanner and before detecting a syntax error.  Thus, state merging
+       (from LALR or IELR) and default reductions corrupt the expected
+       token list.  However, the list is correct for canonical LR with
+       one exception: it will still contain any token that will not be
+       accepted due to an error action in a later state.
+  */
+  if (yytoken != YYEMPTY)
+    {
+      int yyn = yypact[*yyssp];
+      yyarg[yycount++] = yytname[yytoken];
+      if (!yypact_value_is_default (yyn))
+        {
+          /* Start YYX at -YYN if negative to avoid negative indexes in
+             YYCHECK.  In other words, skip the first -YYN actions for
+             this state because they are default actions.  */
+          int yyxbegin = yyn < 0 ? -yyn : 0;
+          /* Stay within bounds of both yycheck and yytname.  */
+          int yychecklim = YYLAST - yyn + 1;
+          int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+          int yyx;
+
+          for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
+                && !yytable_value_is_error (yytable[yyx + yyn]))
+              {
+                if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+                  {
+                    yycount = 1;
+                    yysize = yysize0;
+                    break;
+                  }
+                yyarg[yycount++] = yytname[yyx];
+                yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+                if (! (yysize <= yysize1
+                       && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+                  return 2;
+                yysize = yysize1;
+              }
+        }
+    }
+
+  switch (yycount)
+    {
+# define YYCASE_(N, S)                      \
+      case N:                               \
+        yyformat = S;                       \
+      break
+      YYCASE_(0, YY_("syntax error"));
+      YYCASE_(1, YY_("syntax error, unexpected %s"));
+      YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
+      YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
+      YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
+      YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
+# undef YYCASE_
+    }
+
+  yysize1 = yysize + yystrlen (yyformat);
+  if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+    return 2;
+  yysize = yysize1;
+
+  if (*yymsg_alloc < yysize)
+    {
+      *yymsg_alloc = 2 * yysize;
+      if (! (yysize <= *yymsg_alloc
+             && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
+        *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
+      return 1;
+    }
+
+  /* Avoid sprintf, as that infringes on the user's name space.
+     Don't have undefined behavior even if the translation
+     produced a string with the wrong number of "%s"s.  */
+  {
+    char *yyp = *yymsg;
+    int yyi = 0;
+    while ((*yyp = *yyformat) != '\0')
+      if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
+        {
+          yyp += yytnamerr (yyp, yyarg[yyi++]);
+          yyformat += 2;
+        }
+      else
+        {
+          yyp++;
+          yyformat++;
+        }
+  }
+  return 0;
+}
 #endif /* YYERROR_VERBOSE */
 
-
-
-#if YYDEBUG
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
-
-#if defined (__STDC__) || defined (__cplusplus)
-static void
-yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
-#else
-static void
-yysymprint (yyoutput, yytype, yyvaluep)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE *yyvaluep;
-#endif
-{
-  /* Pacify ``unused variable'' warnings.  */
-  (void) yyvaluep;
-
-  if (yytype < YYNTOKENS)
-    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-  else
-    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-
-
-# ifdef YYPRINT
-  if (yytype < YYNTOKENS)
-    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# endif
-  switch (yytype)
-    {
-      default:
-        break;
-    }
-  YYFPRINTF (yyoutput, ")");
-}
-
-#endif /* ! YYDEBUG */
 /*-----------------------------------------------.
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
-#if defined (__STDC__) || defined (__cplusplus)
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
 yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
 #else
@@ -1480,8 +1940,7 @@
     YYSTYPE *yyvaluep;
 #endif
 {
-  /* Pacify ``unused variable'' warnings.  */
-  (void) yyvaluep;
+  YYUSE (yyvaluep);
 
   if (!yymsg)
     yymsg = "Deleting";
@@ -1491,21 +1950,20 @@
     {
 
       default:
-        break;
+	break;
     }
 }
-
+
 
 /* Prevent warnings from -Wmissing-prototypes.  */
-
 #ifdef YYPARSE_PARAM
-# if defined (__STDC__) || defined (__cplusplus)
+#if defined __STDC__ || defined __cplusplus
 int yyparse (void *YYPARSE_PARAM);
-# else
+#else
 int yyparse ();
-# endif
+#endif
 #else /* ! YYPARSE_PARAM */
-#if defined (__STDC__) || defined (__cplusplus)
+#if defined __STDC__ || defined __cplusplus
 int yyparse (void);
 #else
 int yyparse ();
@@ -1513,94 +1971,102 @@
 #endif /* ! YYPARSE_PARAM */
 
 
-
-/* The look-ahead symbol.  */
+/* The lookahead symbol.  */
 int yychar;
 
-/* The semantic value of the look-ahead symbol.  */
+/* The semantic value of the lookahead symbol.  */
 YYSTYPE yylval;
 
 /* Number of syntax errors so far.  */
 int yynerrs;
 
 
-
 /*----------.
 | yyparse.  |
 `----------*/
 
 #ifdef YYPARSE_PARAM
-# if defined (__STDC__) || defined (__cplusplus)
-int yyparse (void *YYPARSE_PARAM)
-# else
-int yyparse (YYPARSE_PARAM)
-  void *YYPARSE_PARAM;
-# endif
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+    void *YYPARSE_PARAM;
+#endif
 #else /* ! YYPARSE_PARAM */
-#if defined (__STDC__) || defined (__cplusplus)
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 int
 yyparse (void)
 #else
 int
 yyparse ()
-    ;
+
 #endif
 #endif
 {
-  
-  int yystate;
+    int yystate;
+    /* Number of tokens to shift before error messages enabled.  */
+    int yyerrstatus;
+
+    /* The stacks and their tools:
+       `yyss': related to states.
+       `yyvs': related to semantic values.
+
+       Refer to the stacks thru separate pointers, to allow yyoverflow
+       to reallocate them elsewhere.  */
+
+    /* The state stack.  */
+    yytype_int16 yyssa[YYINITDEPTH];
+    yytype_int16 *yyss;
+    yytype_int16 *yyssp;
+
+    /* The semantic value stack.  */
+    YYSTYPE yyvsa[YYINITDEPTH];
+    YYSTYPE *yyvs;
+    YYSTYPE *yyvsp;
+
+    YYSIZE_T yystacksize;
+
   int yyn;
   int yyresult;
-  /* Number of tokens to shift before error messages enabled.  */
-  int yyerrstatus;
-  /* Look-ahead token as an internal (translated) token number.  */
-  int yytoken = 0;
-
-  /* Three stacks and their tools:
-     `yyss': related to states,
-     `yyvs': related to semantic values,
-     `yyls': related to locations.
-
-     Refer to the stacks thru separate pointers, to allow yyoverflow
-     to reallocate them elsewhere.  */
-
-  /* The state stack.  */
-  short int yyssa[YYINITDEPTH];
-  short int *yyss = yyssa;
-  short int *yyssp;
-
-  /* The semantic value stack.  */
-  YYSTYPE yyvsa[YYINITDEPTH];
-  YYSTYPE *yyvs = yyvsa;
-  YYSTYPE *yyvsp;
-
-
-
-#define YYPOPSTACK   (yyvsp--, yyssp--)
-
-  YYSIZE_T yystacksize = YYINITDEPTH;
-
+  /* Lookahead token as an internal (translated) token number.  */
+  int yytoken;
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;
 
+#if YYERROR_VERBOSE
+  /* Buffer for error messages, and its allocated size.  */
+  char yymsgbuf[128];
+  char *yymsg = yymsgbuf;
+  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
 
-  /* When reducing, the number of symbols on the RHS of the reduced
-     rule.  */
-  int yylen;
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
+
+  /* The number of symbols on the RHS of the reduced rule.
+     Keep to zero when no symbol should be popped.  */
+  int yylen = 0;
+
+  yytoken = 0;
+  yyss = yyssa;
+  yyvs = yyvsa;
+  yystacksize = YYINITDEPTH;
 
   YYDPRINTF ((stderr, "Starting parse\n"));
 
   yystate = 0;
   yyerrstatus = 0;
   yynerrs = 0;
-  yychar = YYEMPTY;		/* Cause a token to be read.  */
+  yychar = YYEMPTY; /* Cause a token to be read.  */
 
   /* Initialize stack pointers.
      Waste one element of value and location stack
      so that they stay on the same level as the state stack.
      The wasted elements are never initialized.  */
-
   yyssp = yyss;
   yyvsp = yyvs;
 
@@ -1611,8 +2077,7 @@
 `------------------------------------------------------------*/
  yynewstate:
   /* In all cases, when you get here, the value and location stacks
-     have just been pushed. so pushing a state here evens the stacks.
-     */
+     have just been pushed.  So pushing a state here evens the stacks.  */
   yyssp++;
 
  yysetstate:
@@ -1625,12 +2090,11 @@
 
 #ifdef yyoverflow
       {
-	/* Give user a chance to reallocate the stack. Use copies of
+	/* Give user a chance to reallocate the stack.  Use copies of
 	   these so that the &'s don't force the real ones into
 	   memory.  */
 	YYSTYPE *yyvs1 = yyvs;
-	short int *yyss1 = yyss;
-
+	yytype_int16 *yyss1 = yyss;
 
 	/* Each stack pointer address is followed by the size of the
 	   data in use in that stack, in bytes.  This used to be a
@@ -1639,7 +2103,6 @@
 	yyoverflow (YY_("memory exhausted"),
 		    &yyss1, yysize * sizeof (*yyssp),
 		    &yyvs1, yysize * sizeof (*yyvsp),
-
 		    &yystacksize);
 
 	yyss = yyss1;
@@ -1657,14 +2120,13 @@
 	yystacksize = YYMAXDEPTH;
 
       {
-	short int *yyss1 = yyss;
+	yytype_int16 *yyss1 = yyss;
 	union yyalloc *yyptr =
 	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 	if (! yyptr)
 	  goto yyexhaustedlab;
-	YYSTACK_RELOCATE (yyss);
-	YYSTACK_RELOCATE (yyvs);
-
+	YYSTACK_RELOCATE (yyss_alloc, yyss);
+	YYSTACK_RELOCATE (yyvs_alloc, yyvs);
 #  undef YYSTACK_RELOCATE
 	if (yyss1 != yyssa)
 	  YYSTACK_FREE (yyss1);
@@ -1675,7 +2137,6 @@
       yyssp = yyss + yysize - 1;
       yyvsp = yyvs + yysize - 1;
 
-
       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
 		  (unsigned long int) yystacksize));
 
@@ -1685,6 +2146,9 @@
 
   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
 
+  if (yystate == YYFINAL)
+    YYACCEPT;
+
   goto yybackup;
 
 /*-----------.
@@ -1692,19 +2156,17 @@
 `-----------*/
 yybackup:
 
-/* Do appropriate processing given the current state.  */
-/* Read a look-ahead token if we need one and don't already have one.  */
-/* yyresume: */
+  /* Do appropriate processing given the current state.  Read a
+     lookahead token if we need one and don't already have one.  */
 
-  /* First try to decide what to do without reference to look-ahead token.  */
-
+  /* First try to decide what to do without reference to lookahead token.  */
   yyn = yypact[yystate];
-  if (yyn == YYPACT_NINF)
+  if (yypact_value_is_default (yyn))
     goto yydefault;
 
-  /* Not known => get a look-ahead token if don't already have one.  */
+  /* Not known => get a lookahead token if don't already have one.  */
 
-  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
   if (yychar == YYEMPTY)
     {
       YYDPRINTF ((stderr, "Reading a token: "));
@@ -1730,31 +2192,26 @@
   yyn = yytable[yyn];
   if (yyn <= 0)
     {
-      if (yyn == 0 || yyn == YYTABLE_NINF)
-	goto yyerrlab;
+      if (yytable_value_is_error (yyn))
+        goto yyerrlab;
       yyn = -yyn;
       goto yyreduce;
     }
 
-  if (yyn == YYFINAL)
-    YYACCEPT;
-
-  /* Shift the look-ahead token.  */
-  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
-  /* Discard the token being shifted unless it is eof.  */
-  if (yychar != YYEOF)
-    yychar = YYEMPTY;
-
-  *++yyvsp = yylval;
-
-
   /* Count tokens shifted since error; after three, turn off error
      status.  */
   if (yyerrstatus)
     yyerrstatus--;
 
+  /* Shift the lookahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+  /* Discard the shifted token.  */
+  yychar = YYEMPTY;
+
   yystate = yyn;
+  *++yyvsp = yylval;
+
   goto yynewstate;
 
 
@@ -1790,90 +2247,128 @@
   switch (yyn)
     {
         case 2:
-#line 211 "grammar.y"
+
+/* Line 1806 of yacc.c  */
+#line 317 "grammar.y"
     {
-	finish_parse((yyvsp[0].blk).b);
+	finish_parse((yyvsp[(2) - (2)].blk).b);
 }
     break;
 
   case 4:
-#line 216 "grammar.y"
+
+/* Line 1806 of yacc.c  */
+#line 322 "grammar.y"
     { (yyval.blk).q = qerr; }
     break;
 
   case 6:
-#line 219 "grammar.y"
-    { gen_and((yyvsp[-2].blk).b, (yyvsp[0].blk).b); (yyval.blk) = (yyvsp[0].blk); }
+
+/* Line 1806 of yacc.c  */
+#line 325 "grammar.y"
+    { gen_and((yyvsp[(1) - (3)].blk).b, (yyvsp[(3) - (3)].blk).b); (yyval.blk) = (yyvsp[(3) - (3)].blk); }
     break;
 
   case 7:
-#line 220 "grammar.y"
-    { gen_and((yyvsp[-2].blk).b, (yyvsp[0].blk).b); (yyval.blk) = (yyvsp[0].blk); }
+
+/* Line 1806 of yacc.c  */
+#line 326 "grammar.y"
+    { gen_and((yyvsp[(1) - (3)].blk).b, (yyvsp[(3) - (3)].blk).b); (yyval.blk) = (yyvsp[(3) - (3)].blk); }
     break;
 
   case 8:
-#line 221 "grammar.y"
-    { gen_or((yyvsp[-2].blk).b, (yyvsp[0].blk).b); (yyval.blk) = (yyvsp[0].blk); }
+
+/* Line 1806 of yacc.c  */
+#line 327 "grammar.y"
+    { gen_or((yyvsp[(1) - (3)].blk).b, (yyvsp[(3) - (3)].blk).b); (yyval.blk) = (yyvsp[(3) - (3)].blk); }
     break;
 
   case 9:
-#line 222 "grammar.y"
-    { gen_or((yyvsp[-2].blk).b, (yyvsp[0].blk).b); (yyval.blk) = (yyvsp[0].blk); }
+
+/* Line 1806 of yacc.c  */
+#line 328 "grammar.y"
+    { gen_or((yyvsp[(1) - (3)].blk).b, (yyvsp[(3) - (3)].blk).b); (yyval.blk) = (yyvsp[(3) - (3)].blk); }
     break;
 
   case 10:
-#line 224 "grammar.y"
-    { (yyval.blk) = (yyvsp[-1].blk); }
+
+/* Line 1806 of yacc.c  */
+#line 330 "grammar.y"
+    { (yyval.blk) = (yyvsp[(0) - (1)].blk); }
     break;
 
   case 11:
-#line 226 "grammar.y"
-    { (yyval.blk) = (yyvsp[-1].blk); }
+
+/* Line 1806 of yacc.c  */
+#line 332 "grammar.y"
+    { (yyval.blk) = (yyvsp[(0) - (1)].blk); }
     break;
 
   case 13:
-#line 229 "grammar.y"
-    { (yyval.blk).b = gen_ncode(NULL, (bpf_u_int32)(yyvsp[0].i),
-						   (yyval.blk).q = (yyvsp[-1].blk).q); }
+
+/* Line 1806 of yacc.c  */
+#line 335 "grammar.y"
+    { (yyval.blk).b = gen_ncode(NULL, (bpf_u_int32)(yyvsp[(1) - (1)].i),
+						   (yyval.blk).q = (yyvsp[(0) - (1)].blk).q); }
     break;
 
   case 14:
-#line 231 "grammar.y"
-    { (yyval.blk) = (yyvsp[-1].blk); }
+
+/* Line 1806 of yacc.c  */
+#line 337 "grammar.y"
+    { (yyval.blk) = (yyvsp[(2) - (3)].blk); }
     break;
 
   case 15:
-#line 233 "grammar.y"
-    { (yyval.blk).b = gen_scode((yyvsp[0].s), (yyval.blk).q = (yyvsp[-1].blk).q); }
+
+/* Line 1806 of yacc.c  */
+#line 339 "grammar.y"
+    { (yyval.blk).b = gen_scode((yyvsp[(1) - (1)].s), (yyval.blk).q = (yyvsp[(0) - (1)].blk).q); }
     break;
 
   case 16:
-#line 234 "grammar.y"
-    { (yyval.blk).b = gen_mcode((yyvsp[-2].s), NULL, (yyvsp[0].i),
-				    (yyval.blk).q = (yyvsp[-3].blk).q); }
+
+/* Line 1806 of yacc.c  */
+#line 340 "grammar.y"
+    { (yyval.blk).b = gen_mcode((yyvsp[(1) - (3)].s), NULL, (yyvsp[(3) - (3)].i),
+				    (yyval.blk).q = (yyvsp[(0) - (3)].blk).q); }
     break;
 
   case 17:
-#line 236 "grammar.y"
-    { (yyval.blk).b = gen_mcode((yyvsp[-2].s), (yyvsp[0].s), 0,
-				    (yyval.blk).q = (yyvsp[-3].blk).q); }
+
+/* Line 1806 of yacc.c  */
+#line 342 "grammar.y"
+    { (yyval.blk).b = gen_mcode((yyvsp[(1) - (3)].s), (yyvsp[(3) - (3)].s), 0,
+				    (yyval.blk).q = (yyvsp[(0) - (3)].blk).q); }
     break;
 
   case 18:
-#line 238 "grammar.y"
+
+/* Line 1806 of yacc.c  */
+#line 344 "grammar.y"
     {
 				  /* Decide how to parse HID based on proto */
-				  (yyval.blk).q = (yyvsp[-1].blk).q;
-				  (yyval.blk).b = gen_ncode((yyvsp[0].s), 0, (yyval.blk).q);
+				  (yyval.blk).q = (yyvsp[(0) - (1)].blk).q;
+				  if ((yyval.blk).q.addr == Q_PORT)
+				  	bpf_error("'port' modifier applied to ip host");
+				  else if ((yyval.blk).q.addr == Q_PORTRANGE)
+				  	bpf_error("'portrange' modifier applied to ip host");
+				  else if ((yyval.blk).q.addr == Q_PROTO)
+				  	bpf_error("'proto' modifier applied to ip host");
+				  else if ((yyval.blk).q.addr == Q_PROTOCHAIN)
+				  	bpf_error("'protochain' modifier applied to ip host");
+				  (yyval.blk).b = gen_ncode((yyvsp[(1) - (1)].s), 0, (yyval.blk).q);
 				}
     break;
 
   case 19:
-#line 243 "grammar.y"
+
+/* Line 1806 of yacc.c  */
+#line 357 "grammar.y"
     {
 #ifdef INET6
-				  (yyval.blk).b = gen_mcode6((yyvsp[-2].s), NULL, (yyvsp[0].i),
-				    (yyval.blk).q = (yyvsp[-3].blk).q);
+				  (yyval.blk).b = gen_mcode6((yyvsp[(1) - (3)].s), NULL, (yyvsp[(3) - (3)].i),
+				    (yyval.blk).q = (yyvsp[(0) - (3)].blk).q);
 #else
 				  bpf_error("'ip6addr/prefixlen' not supported "
 					"in this configuration");
@@ -1882,11 +2377,13 @@
     break;
 
   case 20:
-#line 252 "grammar.y"
+
+/* Line 1806 of yacc.c  */
+#line 366 "grammar.y"
     {
 #ifdef INET6
-				  (yyval.blk).b = gen_mcode6((yyvsp[0].s), 0, 128,
-				    (yyval.blk).q = (yyvsp[-1].blk).q);
+				  (yyval.blk).b = gen_mcode6((yyvsp[(1) - (1)].s), 0, 128,
+				    (yyval.blk).q = (yyvsp[(0) - (1)].blk).q);
 #else
 				  bpf_error("'ip6addr' not supported "
 					"in this configuration");
@@ -1895,832 +2392,1376 @@
     break;
 
   case 21:
-#line 261 "grammar.y"
+
+/* Line 1806 of yacc.c  */
+#line 375 "grammar.y"
     { 
-				  (yyval.blk).b = gen_ecode((yyvsp[0].e), (yyval.blk).q = (yyvsp[-1].blk).q);
+				  (yyval.blk).b = gen_ecode((yyvsp[(1) - (1)].e), (yyval.blk).q = (yyvsp[(0) - (1)].blk).q);
 				  /*
 				   * $1 was allocated by "pcap_ether_aton()",
 				   * so we must free it now that we're done
 				   * with it.
 				   */
-				  free((yyvsp[0].e));
+				  free((yyvsp[(1) - (1)].e));
 				}
     break;
 
   case 22:
-#line 270 "grammar.y"
+
+/* Line 1806 of yacc.c  */
+#line 384 "grammar.y"
     {
-				  (yyval.blk).b = gen_acode((yyvsp[0].e), (yyval.blk).q = (yyvsp[-1].blk).q);
+				  (yyval.blk).b = gen_acode((yyvsp[(1) - (1)].e), (yyval.blk).q = (yyvsp[(0) - (1)].blk).q);
 				  /*
 				   * $1 was allocated by "pcap_ether_aton()",
 				   * so we must free it now that we're done
 				   * with it.
 				   */
-				  free((yyvsp[0].e));
+				  free((yyvsp[(1) - (1)].e));
 				}
     break;
 
   case 23:
-#line 279 "grammar.y"
-    { gen_not((yyvsp[0].blk).b); (yyval.blk) = (yyvsp[0].blk); }
+
+/* Line 1806 of yacc.c  */
+#line 393 "grammar.y"
+    { gen_not((yyvsp[(2) - (2)].blk).b); (yyval.blk) = (yyvsp[(2) - (2)].blk); }
     break;
 
   case 24:
-#line 281 "grammar.y"
-    { (yyval.blk) = (yyvsp[-1].blk); }
+
+/* Line 1806 of yacc.c  */
+#line 395 "grammar.y"
+    { (yyval.blk) = (yyvsp[(0) - (1)].blk); }
     break;
 
   case 25:
-#line 283 "grammar.y"
-    { (yyval.blk) = (yyvsp[-1].blk); }
+
+/* Line 1806 of yacc.c  */
+#line 397 "grammar.y"
+    { (yyval.blk) = (yyvsp[(0) - (1)].blk); }
     break;
 
   case 27:
-#line 286 "grammar.y"
-    { gen_and((yyvsp[-2].blk).b, (yyvsp[0].blk).b); (yyval.blk) = (yyvsp[0].blk); }
+
+/* Line 1806 of yacc.c  */
+#line 400 "grammar.y"
+    { gen_and((yyvsp[(1) - (3)].blk).b, (yyvsp[(3) - (3)].blk).b); (yyval.blk) = (yyvsp[(3) - (3)].blk); }
     break;
 
   case 28:
-#line 287 "grammar.y"
-    { gen_or((yyvsp[-2].blk).b, (yyvsp[0].blk).b); (yyval.blk) = (yyvsp[0].blk); }
+
+/* Line 1806 of yacc.c  */
+#line 401 "grammar.y"
+    { gen_or((yyvsp[(1) - (3)].blk).b, (yyvsp[(3) - (3)].blk).b); (yyval.blk) = (yyvsp[(3) - (3)].blk); }
     break;
 
   case 29:
-#line 289 "grammar.y"
-    { (yyval.blk).b = gen_ncode(NULL, (bpf_u_int32)(yyvsp[0].i),
-						   (yyval.blk).q = (yyvsp[-1].blk).q); }
+
+/* Line 1806 of yacc.c  */
+#line 403 "grammar.y"
+    { (yyval.blk).b = gen_ncode(NULL, (bpf_u_int32)(yyvsp[(1) - (1)].i),
+						   (yyval.blk).q = (yyvsp[(0) - (1)].blk).q); }
     break;
 
   case 32:
-#line 294 "grammar.y"
-    { gen_not((yyvsp[0].blk).b); (yyval.blk) = (yyvsp[0].blk); }
+
+/* Line 1806 of yacc.c  */
+#line 408 "grammar.y"
+    { gen_not((yyvsp[(2) - (2)].blk).b); (yyval.blk) = (yyvsp[(2) - (2)].blk); }
     break;
 
   case 33:
-#line 296 "grammar.y"
-    { QSET((yyval.blk).q, (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i)); }
+
+/* Line 1806 of yacc.c  */
+#line 410 "grammar.y"
+    { QSET((yyval.blk).q, (yyvsp[(1) - (3)].i), (yyvsp[(2) - (3)].i), (yyvsp[(3) - (3)].i)); }
     break;
 
   case 34:
-#line 297 "grammar.y"
-    { QSET((yyval.blk).q, (yyvsp[-1].i), (yyvsp[0].i), Q_DEFAULT); }
+
+/* Line 1806 of yacc.c  */
+#line 411 "grammar.y"
+    { QSET((yyval.blk).q, (yyvsp[(1) - (2)].i), (yyvsp[(2) - (2)].i), Q_DEFAULT); }
     break;
 
   case 35:
-#line 298 "grammar.y"
-    { QSET((yyval.blk).q, (yyvsp[-1].i), Q_DEFAULT, (yyvsp[0].i)); }
+
+/* Line 1806 of yacc.c  */
+#line 412 "grammar.y"
+    { QSET((yyval.blk).q, (yyvsp[(1) - (2)].i), Q_DEFAULT, (yyvsp[(2) - (2)].i)); }
     break;
 
   case 36:
-#line 299 "grammar.y"
-    { QSET((yyval.blk).q, (yyvsp[-1].i), Q_DEFAULT, Q_PROTO); }
+
+/* Line 1806 of yacc.c  */
+#line 413 "grammar.y"
+    { QSET((yyval.blk).q, (yyvsp[(1) - (2)].i), Q_DEFAULT, Q_PROTO); }
     break;
 
   case 37:
-#line 300 "grammar.y"
-    { QSET((yyval.blk).q, (yyvsp[-1].i), Q_DEFAULT, Q_PROTOCHAIN); }
+
+/* Line 1806 of yacc.c  */
+#line 414 "grammar.y"
+    { QSET((yyval.blk).q, (yyvsp[(1) - (2)].i), Q_DEFAULT, Q_PROTOCHAIN); }
     break;
 
   case 38:
-#line 301 "grammar.y"
-    { QSET((yyval.blk).q, (yyvsp[-1].i), Q_DEFAULT, (yyvsp[0].i)); }
+
+/* Line 1806 of yacc.c  */
+#line 415 "grammar.y"
+    { QSET((yyval.blk).q, (yyvsp[(1) - (2)].i), Q_DEFAULT, (yyvsp[(2) - (2)].i)); }
     break;
 
   case 39:
-#line 303 "grammar.y"
-    { (yyval.blk) = (yyvsp[0].blk); }
+
+/* Line 1806 of yacc.c  */
+#line 417 "grammar.y"
+    { (yyval.blk) = (yyvsp[(2) - (2)].blk); }
     break;
 
   case 40:
-#line 304 "grammar.y"
-    { (yyval.blk).b = (yyvsp[-1].blk).b; (yyval.blk).q = (yyvsp[-2].blk).q; }
+
+/* Line 1806 of yacc.c  */
+#line 418 "grammar.y"
+    { (yyval.blk).b = (yyvsp[(2) - (3)].blk).b; (yyval.blk).q = (yyvsp[(1) - (3)].blk).q; }
     break;
 
   case 41:
-#line 305 "grammar.y"
-    { (yyval.blk).b = gen_proto_abbrev((yyvsp[0].i)); (yyval.blk).q = qerr; }
+
+/* Line 1806 of yacc.c  */
+#line 419 "grammar.y"
+    { (yyval.blk).b = gen_proto_abbrev((yyvsp[(1) - (1)].i)); (yyval.blk).q = qerr; }
     break;
 
   case 42:
-#line 306 "grammar.y"
-    { (yyval.blk).b = gen_relation((yyvsp[-1].i), (yyvsp[-2].a), (yyvsp[0].a), 0);
+
+/* Line 1806 of yacc.c  */
+#line 420 "grammar.y"
+    { (yyval.blk).b = gen_relation((yyvsp[(2) - (3)].i), (yyvsp[(1) - (3)].a), (yyvsp[(3) - (3)].a), 0);
 				  (yyval.blk).q = qerr; }
     break;
 
   case 43:
-#line 308 "grammar.y"
-    { (yyval.blk).b = gen_relation((yyvsp[-1].i), (yyvsp[-2].a), (yyvsp[0].a), 1);
+
+/* Line 1806 of yacc.c  */
+#line 422 "grammar.y"
+    { (yyval.blk).b = gen_relation((yyvsp[(2) - (3)].i), (yyvsp[(1) - (3)].a), (yyvsp[(3) - (3)].a), 1);
 				  (yyval.blk).q = qerr; }
     break;
 
   case 44:
-#line 310 "grammar.y"
-    { (yyval.blk).b = (yyvsp[0].rblk); (yyval.blk).q = qerr; }
+
+/* Line 1806 of yacc.c  */
+#line 424 "grammar.y"
+    { (yyval.blk).b = (yyvsp[(1) - (1)].rblk); (yyval.blk).q = qerr; }
     break;
 
   case 45:
-#line 311 "grammar.y"
-    { (yyval.blk).b = gen_atmtype_abbrev((yyvsp[0].i)); (yyval.blk).q = qerr; }
+
+/* Line 1806 of yacc.c  */
+#line 425 "grammar.y"
+    { (yyval.blk).b = gen_atmtype_abbrev((yyvsp[(1) - (1)].i)); (yyval.blk).q = qerr; }
     break;
 
   case 46:
-#line 312 "grammar.y"
-    { (yyval.blk).b = gen_atmmulti_abbrev((yyvsp[0].i)); (yyval.blk).q = qerr; }
+
+/* Line 1806 of yacc.c  */
+#line 426 "grammar.y"
+    { (yyval.blk).b = gen_atmmulti_abbrev((yyvsp[(1) - (1)].i)); (yyval.blk).q = qerr; }
     break;
 
   case 47:
-#line 313 "grammar.y"
-    { (yyval.blk).b = (yyvsp[0].blk).b; (yyval.blk).q = qerr; }
+
+/* Line 1806 of yacc.c  */
+#line 427 "grammar.y"
+    { (yyval.blk).b = (yyvsp[(2) - (2)].blk).b; (yyval.blk).q = qerr; }
     break;
 
   case 48:
-#line 314 "grammar.y"
-    { (yyval.blk).b = gen_mtp2type_abbrev((yyvsp[0].i)); (yyval.blk).q = qerr; }
+
+/* Line 1806 of yacc.c  */
+#line 428 "grammar.y"
+    { (yyval.blk).b = gen_mtp2type_abbrev((yyvsp[(1) - (1)].i)); (yyval.blk).q = qerr; }
     break;
 
   case 49:
-#line 315 "grammar.y"
-    { (yyval.blk).b = (yyvsp[0].blk).b; (yyval.blk).q = qerr; }
+
+/* Line 1806 of yacc.c  */
+#line 429 "grammar.y"
+    { (yyval.blk).b = (yyvsp[(2) - (2)].blk).b; (yyval.blk).q = qerr; }
     break;
 
   case 51:
-#line 319 "grammar.y"
+
+/* Line 1806 of yacc.c  */
+#line 433 "grammar.y"
     { (yyval.i) = Q_DEFAULT; }
     break;
 
   case 52:
-#line 322 "grammar.y"
+
+/* Line 1806 of yacc.c  */
+#line 436 "grammar.y"
     { (yyval.i) = Q_SRC; }
     break;
 
   case 53:
-#line 323 "grammar.y"
+
+/* Line 1806 of yacc.c  */
+#line 437 "grammar.y"
     { (yyval.i) = Q_DST; }
     break;
 
   case 54:
-#line 324 "grammar.y"
+
+/* Line 1806 of yacc.c  */
+#line 438 "grammar.y"
     { (yyval.i) = Q_OR; }
     break;
 
   case 55:
-#line 325 "grammar.y"
+
+/* Line 1806 of yacc.c  */
+#line 439 "grammar.y"
     { (yyval.i) = Q_OR; }
     break;
 
   case 56:
-#line 326 "grammar.y"
+
+/* Line 1806 of yacc.c  */
+#line 440 "grammar.y"
     { (yyval.i) = Q_AND; }
     break;
 
   case 57:
-#line 327 "grammar.y"
+
+/* Line 1806 of yacc.c  */
+#line 441 "grammar.y"
     { (yyval.i) = Q_AND; }
     break;
 
   case 58:
-#line 330 "grammar.y"
-    { (yyval.i) = Q_HOST; }
+
+/* Line 1806 of yacc.c  */
+#line 442 "grammar.y"
+    { (yyval.i) = Q_ADDR1; }
     break;
 
   case 59:
-#line 331 "grammar.y"
-    { (yyval.i) = Q_NET; }
+
+/* Line 1806 of yacc.c  */
+#line 443 "grammar.y"
+    { (yyval.i) = Q_ADDR2; }
     break;
 
   case 60:
-#line 332 "grammar.y"
-    { (yyval.i) = Q_PORT; }
+
+/* Line 1806 of yacc.c  */
+#line 444 "grammar.y"
+    { (yyval.i) = Q_ADDR3; }
     break;
 
   case 61:
-#line 333 "grammar.y"
-    { (yyval.i) = Q_PORTRANGE; }
+
+/* Line 1806 of yacc.c  */
+#line 445 "grammar.y"
+    { (yyval.i) = Q_ADDR4; }
     break;
 
   case 62:
-#line 336 "grammar.y"
-    { (yyval.i) = Q_GATEWAY; }
+
+/* Line 1806 of yacc.c  */
+#line 446 "grammar.y"
+    { (yyval.i) = Q_RA; }
     break;
 
   case 63:
-#line 338 "grammar.y"
-    { (yyval.i) = Q_LINK; }
+
+/* Line 1806 of yacc.c  */
+#line 447 "grammar.y"
+    { (yyval.i) = Q_TA; }
     break;
 
   case 64:
-#line 339 "grammar.y"
-    { (yyval.i) = Q_IP; }
+
+/* Line 1806 of yacc.c  */
+#line 450 "grammar.y"
+    { (yyval.i) = Q_HOST; }
     break;
 
   case 65:
-#line 340 "grammar.y"
-    { (yyval.i) = Q_ARP; }
+
+/* Line 1806 of yacc.c  */
+#line 451 "grammar.y"
+    { (yyval.i) = Q_NET; }
     break;
 
   case 66:
-#line 341 "grammar.y"
-    { (yyval.i) = Q_RARP; }
+
+/* Line 1806 of yacc.c  */
+#line 452 "grammar.y"
+    { (yyval.i) = Q_PORT; }
     break;
 
   case 67:
-#line 342 "grammar.y"
-    { (yyval.i) = Q_SCTP; }
+
+/* Line 1806 of yacc.c  */
+#line 453 "grammar.y"
+    { (yyval.i) = Q_PORTRANGE; }
     break;
 
   case 68:
-#line 343 "grammar.y"
-    { (yyval.i) = Q_TCP; }
+
+/* Line 1806 of yacc.c  */
+#line 456 "grammar.y"
+    { (yyval.i) = Q_GATEWAY; }
     break;
 
   case 69:
-#line 344 "grammar.y"
-    { (yyval.i) = Q_UDP; }
+
+/* Line 1806 of yacc.c  */
+#line 458 "grammar.y"
+    { (yyval.i) = Q_LINK; }
     break;
 
   case 70:
-#line 345 "grammar.y"
-    { (yyval.i) = Q_ICMP; }
+
+/* Line 1806 of yacc.c  */
+#line 459 "grammar.y"
+    { (yyval.i) = Q_IP; }
     break;
 
   case 71:
-#line 346 "grammar.y"
-    { (yyval.i) = Q_IGMP; }
+
+/* Line 1806 of yacc.c  */
+#line 460 "grammar.y"
+    { (yyval.i) = Q_ARP; }
     break;
 
   case 72:
-#line 347 "grammar.y"
-    { (yyval.i) = Q_IGRP; }
+
+/* Line 1806 of yacc.c  */
+#line 461 "grammar.y"
+    { (yyval.i) = Q_RARP; }
     break;
 
   case 73:
-#line 348 "grammar.y"
-    { (yyval.i) = Q_PIM; }
+
+/* Line 1806 of yacc.c  */
+#line 462 "grammar.y"
+    { (yyval.i) = Q_SCTP; }
     break;
 
   case 74:
-#line 349 "grammar.y"
-    { (yyval.i) = Q_VRRP; }
+
+/* Line 1806 of yacc.c  */
+#line 463 "grammar.y"
+    { (yyval.i) = Q_TCP; }
     break;
 
   case 75:
-#line 350 "grammar.y"
-    { (yyval.i) = Q_ATALK; }
+
+/* Line 1806 of yacc.c  */
+#line 464 "grammar.y"
+    { (yyval.i) = Q_UDP; }
     break;
 
   case 76:
-#line 351 "grammar.y"
-    { (yyval.i) = Q_AARP; }
+
+/* Line 1806 of yacc.c  */
+#line 465 "grammar.y"
+    { (yyval.i) = Q_ICMP; }
     break;
 
   case 77:
-#line 352 "grammar.y"
-    { (yyval.i) = Q_DECNET; }
+
+/* Line 1806 of yacc.c  */
+#line 466 "grammar.y"
+    { (yyval.i) = Q_IGMP; }
     break;
 
   case 78:
-#line 353 "grammar.y"
-    { (yyval.i) = Q_LAT; }
+
+/* Line 1806 of yacc.c  */
+#line 467 "grammar.y"
+    { (yyval.i) = Q_IGRP; }
     break;
 
   case 79:
-#line 354 "grammar.y"
-    { (yyval.i) = Q_SCA; }
+
+/* Line 1806 of yacc.c  */
+#line 468 "grammar.y"
+    { (yyval.i) = Q_PIM; }
     break;
 
   case 80:
-#line 355 "grammar.y"
-    { (yyval.i) = Q_MOPDL; }
+
+/* Line 1806 of yacc.c  */
+#line 469 "grammar.y"
+    { (yyval.i) = Q_VRRP; }
     break;
 
   case 81:
-#line 356 "grammar.y"
-    { (yyval.i) = Q_MOPRC; }
+
+/* Line 1806 of yacc.c  */
+#line 470 "grammar.y"
+    { (yyval.i) = Q_CARP; }
     break;
 
   case 82:
-#line 357 "grammar.y"
-    { (yyval.i) = Q_IPV6; }
+
+/* Line 1806 of yacc.c  */
+#line 471 "grammar.y"
+    { (yyval.i) = Q_ATALK; }
     break;
 
   case 83:
-#line 358 "grammar.y"
-    { (yyval.i) = Q_ICMPV6; }
+
+/* Line 1806 of yacc.c  */
+#line 472 "grammar.y"
+    { (yyval.i) = Q_AARP; }
     break;
 
   case 84:
-#line 359 "grammar.y"
-    { (yyval.i) = Q_AH; }
+
+/* Line 1806 of yacc.c  */
+#line 473 "grammar.y"
+    { (yyval.i) = Q_DECNET; }
     break;
 
   case 85:
-#line 360 "grammar.y"
-    { (yyval.i) = Q_ESP; }
+
+/* Line 1806 of yacc.c  */
+#line 474 "grammar.y"
+    { (yyval.i) = Q_LAT; }
     break;
 
   case 86:
-#line 361 "grammar.y"
-    { (yyval.i) = Q_ISO; }
+
+/* Line 1806 of yacc.c  */
+#line 475 "grammar.y"
+    { (yyval.i) = Q_SCA; }
     break;
 
   case 87:
-#line 362 "grammar.y"
-    { (yyval.i) = Q_ESIS; }
+
+/* Line 1806 of yacc.c  */
+#line 476 "grammar.y"
+    { (yyval.i) = Q_MOPDL; }
     break;
 
   case 88:
-#line 363 "grammar.y"
-    { (yyval.i) = Q_ISIS; }
+
+/* Line 1806 of yacc.c  */
+#line 477 "grammar.y"
+    { (yyval.i) = Q_MOPRC; }
     break;
 
   case 89:
-#line 364 "grammar.y"
-    { (yyval.i) = Q_ISIS_L1; }
+
+/* Line 1806 of yacc.c  */
+#line 478 "grammar.y"
+    { (yyval.i) = Q_IPV6; }
     break;
 
   case 90:
-#line 365 "grammar.y"
-    { (yyval.i) = Q_ISIS_L2; }
+
+/* Line 1806 of yacc.c  */
+#line 479 "grammar.y"
+    { (yyval.i) = Q_ICMPV6; }
     break;
 
   case 91:
-#line 366 "grammar.y"
-    { (yyval.i) = Q_ISIS_IIH; }
+
+/* Line 1806 of yacc.c  */
+#line 480 "grammar.y"
+    { (yyval.i) = Q_AH; }
     break;
 
   case 92:
-#line 367 "grammar.y"
-    { (yyval.i) = Q_ISIS_LSP; }
+
+/* Line 1806 of yacc.c  */
+#line 481 "grammar.y"
+    { (yyval.i) = Q_ESP; }
     break;
 
   case 93:
-#line 368 "grammar.y"
-    { (yyval.i) = Q_ISIS_SNP; }
+
+/* Line 1806 of yacc.c  */
+#line 482 "grammar.y"
+    { (yyval.i) = Q_ISO; }
     break;
 
   case 94:
-#line 369 "grammar.y"
-    { (yyval.i) = Q_ISIS_PSNP; }
+
+/* Line 1806 of yacc.c  */
+#line 483 "grammar.y"
+    { (yyval.i) = Q_ESIS; }
     break;
 
   case 95:
-#line 370 "grammar.y"
-    { (yyval.i) = Q_ISIS_CSNP; }
+
+/* Line 1806 of yacc.c  */
+#line 484 "grammar.y"
+    { (yyval.i) = Q_ISIS; }
     break;
 
   case 96:
-#line 371 "grammar.y"
-    { (yyval.i) = Q_CLNP; }
+
+/* Line 1806 of yacc.c  */
+#line 485 "grammar.y"
+    { (yyval.i) = Q_ISIS_L1; }
     break;
 
   case 97:
-#line 372 "grammar.y"
-    { (yyval.i) = Q_STP; }
+
+/* Line 1806 of yacc.c  */
+#line 486 "grammar.y"
+    { (yyval.i) = Q_ISIS_L2; }
     break;
 
   case 98:
-#line 373 "grammar.y"
-    { (yyval.i) = Q_IPX; }
+
+/* Line 1806 of yacc.c  */
+#line 487 "grammar.y"
+    { (yyval.i) = Q_ISIS_IIH; }
     break;
 
   case 99:
-#line 374 "grammar.y"
-    { (yyval.i) = Q_NETBEUI; }
+
+/* Line 1806 of yacc.c  */
+#line 488 "grammar.y"
+    { (yyval.i) = Q_ISIS_LSP; }
     break;
 
   case 100:
-#line 375 "grammar.y"
-    { (yyval.i) = Q_RADIO; }
+
+/* Line 1806 of yacc.c  */
+#line 489 "grammar.y"
+    { (yyval.i) = Q_ISIS_SNP; }
     break;
 
   case 101:
-#line 377 "grammar.y"
-    { (yyval.rblk) = gen_broadcast((yyvsp[-1].i)); }
+
+/* Line 1806 of yacc.c  */
+#line 490 "grammar.y"
+    { (yyval.i) = Q_ISIS_PSNP; }
     break;
 
   case 102:
-#line 378 "grammar.y"
-    { (yyval.rblk) = gen_multicast((yyvsp[-1].i)); }
+
+/* Line 1806 of yacc.c  */
+#line 491 "grammar.y"
+    { (yyval.i) = Q_ISIS_CSNP; }
     break;
 
   case 103:
-#line 379 "grammar.y"
-    { (yyval.rblk) = gen_less((yyvsp[0].i)); }
+
+/* Line 1806 of yacc.c  */
+#line 492 "grammar.y"
+    { (yyval.i) = Q_CLNP; }
     break;
 
   case 104:
-#line 380 "grammar.y"
-    { (yyval.rblk) = gen_greater((yyvsp[0].i)); }
+
+/* Line 1806 of yacc.c  */
+#line 493 "grammar.y"
+    { (yyval.i) = Q_STP; }
     break;
 
   case 105:
-#line 381 "grammar.y"
-    { (yyval.rblk) = gen_byteop((yyvsp[-1].i), (yyvsp[-2].i), (yyvsp[0].i)); }
+
+/* Line 1806 of yacc.c  */
+#line 494 "grammar.y"
+    { (yyval.i) = Q_IPX; }
     break;
 
   case 106:
-#line 382 "grammar.y"
-    { (yyval.rblk) = gen_inbound(0); }
+
+/* Line 1806 of yacc.c  */
+#line 495 "grammar.y"
+    { (yyval.i) = Q_NETBEUI; }
     break;
 
   case 107:
-#line 383 "grammar.y"
-    { (yyval.rblk) = gen_inbound(1); }
+
+/* Line 1806 of yacc.c  */
+#line 496 "grammar.y"
+    { (yyval.i) = Q_RADIO; }
     break;
 
   case 108:
-#line 384 "grammar.y"
-    { (yyval.rblk) = gen_vlan((yyvsp[0].i)); }
+
+/* Line 1806 of yacc.c  */
+#line 498 "grammar.y"
+    { (yyval.rblk) = gen_broadcast((yyvsp[(1) - (2)].i)); }
     break;
 
   case 109:
-#line 385 "grammar.y"
-    { (yyval.rblk) = gen_vlan(-1); }
+
+/* Line 1806 of yacc.c  */
+#line 499 "grammar.y"
+    { (yyval.rblk) = gen_multicast((yyvsp[(1) - (2)].i)); }
     break;
 
   case 110:
-#line 386 "grammar.y"
-    { (yyval.rblk) = gen_mpls((yyvsp[0].i)); }
+
+/* Line 1806 of yacc.c  */
+#line 500 "grammar.y"
+    { (yyval.rblk) = gen_less((yyvsp[(2) - (2)].i)); }
     break;
 
   case 111:
-#line 387 "grammar.y"
-    { (yyval.rblk) = gen_mpls(-1); }
+
+/* Line 1806 of yacc.c  */
+#line 501 "grammar.y"
+    { (yyval.rblk) = gen_greater((yyvsp[(2) - (2)].i)); }
     break;
 
   case 112:
-#line 388 "grammar.y"
-    { (yyval.rblk) = gen_pppoed(); }
+
+/* Line 1806 of yacc.c  */
+#line 502 "grammar.y"
+    { (yyval.rblk) = gen_byteop((yyvsp[(3) - (4)].i), (yyvsp[(2) - (4)].i), (yyvsp[(4) - (4)].i)); }
     break;
 
   case 113:
-#line 389 "grammar.y"
-    { (yyval.rblk) = gen_pppoes(); }
+
+/* Line 1806 of yacc.c  */
+#line 503 "grammar.y"
+    { (yyval.rblk) = gen_inbound(0); }
     break;
 
   case 114:
-#line 390 "grammar.y"
-    { (yyval.rblk) = (yyvsp[0].rblk); }
+
+/* Line 1806 of yacc.c  */
+#line 504 "grammar.y"
+    { (yyval.rblk) = gen_inbound(1); }
     break;
 
   case 115:
-#line 393 "grammar.y"
-    { (yyval.rblk) = gen_pf_ifname((yyvsp[0].s)); }
+
+/* Line 1806 of yacc.c  */
+#line 505 "grammar.y"
+    { (yyval.rblk) = gen_vlan((yyvsp[(2) - (2)].i)); }
     break;
 
   case 116:
-#line 394 "grammar.y"
-    { (yyval.rblk) = gen_pf_ruleset((yyvsp[0].s)); }
+
+/* Line 1806 of yacc.c  */
+#line 506 "grammar.y"
+    { (yyval.rblk) = gen_vlan(-1); }
     break;
 
   case 117:
-#line 395 "grammar.y"
-    { (yyval.rblk) = gen_pf_rnr((yyvsp[0].i)); }
+
+/* Line 1806 of yacc.c  */
+#line 507 "grammar.y"
+    { (yyval.rblk) = gen_mpls((yyvsp[(2) - (2)].i)); }
     break;
 
   case 118:
-#line 396 "grammar.y"
-    { (yyval.rblk) = gen_pf_srnr((yyvsp[0].i)); }
+
+/* Line 1806 of yacc.c  */
+#line 508 "grammar.y"
+    { (yyval.rblk) = gen_mpls(-1); }
     break;
 
   case 119:
-#line 397 "grammar.y"
-    { (yyval.rblk) = gen_pf_reason((yyvsp[0].i)); }
+
+/* Line 1806 of yacc.c  */
+#line 509 "grammar.y"
+    { (yyval.rblk) = gen_pppoed(); }
     break;
 
   case 120:
-#line 398 "grammar.y"
-    { (yyval.rblk) = gen_pf_action((yyvsp[0].i)); }
+
+/* Line 1806 of yacc.c  */
+#line 510 "grammar.y"
+    { (yyval.rblk) = gen_pppoes((yyvsp[(2) - (2)].i)); }
     break;
 
   case 121:
-#line 401 "grammar.y"
-    { (yyval.i) = (yyvsp[0].i); }
+
+/* Line 1806 of yacc.c  */
+#line 511 "grammar.y"
+    { (yyval.rblk) = gen_pppoes(-1); }
     break;
 
   case 122:
-#line 402 "grammar.y"
-    { (yyval.i) = pfreason_to_num((yyvsp[0].s)); }
+
+/* Line 1806 of yacc.c  */
+#line 512 "grammar.y"
+    { (yyval.rblk) = (yyvsp[(1) - (1)].rblk); }
     break;
 
   case 123:
-#line 405 "grammar.y"
-    { (yyval.i) = pfaction_to_num((yyvsp[0].s)); }
+
+/* Line 1806 of yacc.c  */
+#line 513 "grammar.y"
+    { (yyval.rblk) = (yyvsp[(2) - (2)].rblk); }
     break;
 
   case 124:
-#line 408 "grammar.y"
-    { (yyval.i) = BPF_JGT; }
+
+/* Line 1806 of yacc.c  */
+#line 516 "grammar.y"
+    { (yyval.rblk) = gen_pf_ifname((yyvsp[(2) - (2)].s)); }
     break;
 
   case 125:
-#line 409 "grammar.y"
-    { (yyval.i) = BPF_JGE; }
+
+/* Line 1806 of yacc.c  */
+#line 517 "grammar.y"
+    { (yyval.rblk) = gen_pf_ruleset((yyvsp[(2) - (2)].s)); }
     break;
 
   case 126:
-#line 410 "grammar.y"
-    { (yyval.i) = BPF_JEQ; }
+
+/* Line 1806 of yacc.c  */
+#line 518 "grammar.y"
+    { (yyval.rblk) = gen_pf_rnr((yyvsp[(2) - (2)].i)); }
     break;
 
   case 127:
-#line 412 "grammar.y"
-    { (yyval.i) = BPF_JGT; }
+
+/* Line 1806 of yacc.c  */
+#line 519 "grammar.y"
+    { (yyval.rblk) = gen_pf_srnr((yyvsp[(2) - (2)].i)); }
     break;
 
   case 128:
-#line 413 "grammar.y"
-    { (yyval.i) = BPF_JGE; }
+
+/* Line 1806 of yacc.c  */
+#line 520 "grammar.y"
+    { (yyval.rblk) = gen_pf_reason((yyvsp[(2) - (2)].i)); }
     break;
 
   case 129:
-#line 414 "grammar.y"
-    { (yyval.i) = BPF_JEQ; }
+
+/* Line 1806 of yacc.c  */
+#line 521 "grammar.y"
+    { (yyval.rblk) = gen_pf_action((yyvsp[(2) - (2)].i)); }
     break;
 
   case 130:
-#line 416 "grammar.y"
-    { (yyval.a) = gen_loadi((yyvsp[0].i)); }
+
+/* Line 1806 of yacc.c  */
+#line 525 "grammar.y"
+    { (yyval.rblk) = gen_p80211_type((yyvsp[(2) - (4)].i) | (yyvsp[(4) - (4)].i),
+					IEEE80211_FC0_TYPE_MASK |
+					IEEE80211_FC0_SUBTYPE_MASK);
+				}
+    break;
+
+  case 131:
+
+/* Line 1806 of yacc.c  */
+#line 529 "grammar.y"
+    { (yyval.rblk) = gen_p80211_type((yyvsp[(2) - (2)].i),
+					IEEE80211_FC0_TYPE_MASK);
+				}
     break;
 
   case 132:
-#line 419 "grammar.y"
-    { (yyval.a) = gen_load((yyvsp[-3].i), (yyvsp[-1].a), 1); }
+
+/* Line 1806 of yacc.c  */
+#line 532 "grammar.y"
+    { (yyval.rblk) = gen_p80211_type((yyvsp[(2) - (2)].i),
+					IEEE80211_FC0_TYPE_MASK |
+					IEEE80211_FC0_SUBTYPE_MASK);
+				}
     break;
 
   case 133:
-#line 420 "grammar.y"
-    { (yyval.a) = gen_load((yyvsp[-5].i), (yyvsp[-3].a), (yyvsp[-1].i)); }
-    break;
 
-  case 134:
-#line 421 "grammar.y"
-    { (yyval.a) = gen_arth(BPF_ADD, (yyvsp[-2].a), (yyvsp[0].a)); }
+/* Line 1806 of yacc.c  */
+#line 536 "grammar.y"
+    { (yyval.rblk) = gen_p80211_fcdir((yyvsp[(2) - (2)].i)); }
     break;
 
   case 135:
-#line 422 "grammar.y"
-    { (yyval.a) = gen_arth(BPF_SUB, (yyvsp[-2].a), (yyvsp[0].a)); }
-    break;
 
-  case 136:
-#line 423 "grammar.y"
-    { (yyval.a) = gen_arth(BPF_MUL, (yyvsp[-2].a), (yyvsp[0].a)); }
+/* Line 1806 of yacc.c  */
+#line 540 "grammar.y"
+    { (yyval.i) = str2tok((yyvsp[(1) - (1)].s), ieee80211_types);
+				  if ((yyval.i) == -1)
+				  	bpf_error("unknown 802.11 type name");
+				}
     break;
 
   case 137:
-#line 424 "grammar.y"
-    { (yyval.a) = gen_arth(BPF_DIV, (yyvsp[-2].a), (yyvsp[0].a)); }
+
+/* Line 1806 of yacc.c  */
+#line 547 "grammar.y"
+    { const struct tok *types = NULL;
+				  int i;
+				  for (i = 0;; i++) {
+				  	if (ieee80211_type_subtypes[i].tok == NULL) {
+				  		/* Ran out of types */
+						bpf_error("unknown 802.11 type");
+						break;
+					}
+					if ((yyvsp[(-1) - (1)].i) == ieee80211_type_subtypes[i].type) {
+						types = ieee80211_type_subtypes[i].tok;
+						break;
+					}
+				  }
+
+				  (yyval.i) = str2tok((yyvsp[(1) - (1)].s), types);
+				  if ((yyval.i) == -1)
+					bpf_error("unknown 802.11 subtype name");
+				}
     break;
 
   case 138:
-#line 425 "grammar.y"
-    { (yyval.a) = gen_arth(BPF_AND, (yyvsp[-2].a), (yyvsp[0].a)); }
-    break;
 
-  case 139:
-#line 426 "grammar.y"
-    { (yyval.a) = gen_arth(BPF_OR, (yyvsp[-2].a), (yyvsp[0].a)); }
+/* Line 1806 of yacc.c  */
+#line 567 "grammar.y"
+    { int i;
+				  for (i = 0;; i++) {
+				  	if (ieee80211_type_subtypes[i].tok == NULL) {
+				  		/* Ran out of types */
+						bpf_error("unknown 802.11 type name");
+						break;
+					}
+					(yyval.i) = str2tok((yyvsp[(1) - (1)].s), ieee80211_type_subtypes[i].tok);
+					if ((yyval.i) != -1) {
+						(yyval.i) |= ieee80211_type_subtypes[i].type;
+						break;
+					}
+				  }
+				}
     break;
 
   case 140:
-#line 427 "grammar.y"
-    { (yyval.a) = gen_arth(BPF_LSH, (yyvsp[-2].a), (yyvsp[0].a)); }
+
+/* Line 1806 of yacc.c  */
+#line 584 "grammar.y"
+    { if (pcap_strcasecmp((yyvsp[(1) - (1)].s), "nods") == 0)
+					(yyval.i) = IEEE80211_FC1_DIR_NODS;
+				  else if (pcap_strcasecmp((yyvsp[(1) - (1)].s), "tods") == 0)
+					(yyval.i) = IEEE80211_FC1_DIR_TODS;
+				  else if (pcap_strcasecmp((yyvsp[(1) - (1)].s), "fromds") == 0)
+					(yyval.i) = IEEE80211_FC1_DIR_FROMDS;
+				  else if (pcap_strcasecmp((yyvsp[(1) - (1)].s), "dstods") == 0)
+					(yyval.i) = IEEE80211_FC1_DIR_DSTODS;
+				  else
+					bpf_error("unknown 802.11 direction");
+				}
     break;
 
   case 141:
-#line 428 "grammar.y"
-    { (yyval.a) = gen_arth(BPF_RSH, (yyvsp[-2].a), (yyvsp[0].a)); }
+
+/* Line 1806 of yacc.c  */
+#line 597 "grammar.y"
+    { (yyval.i) = (yyvsp[(1) - (1)].i); }
     break;
 
   case 142:
-#line 429 "grammar.y"
-    { (yyval.a) = gen_neg((yyvsp[0].a)); }
+
+/* Line 1806 of yacc.c  */
+#line 598 "grammar.y"
+    { (yyval.i) = pfreason_to_num((yyvsp[(1) - (1)].s)); }
     break;
 
   case 143:
-#line 430 "grammar.y"
-    { (yyval.a) = (yyvsp[-1].a); }
+
+/* Line 1806 of yacc.c  */
+#line 601 "grammar.y"
+    { (yyval.i) = pfaction_to_num((yyvsp[(1) - (1)].s)); }
     break;
 
   case 144:
-#line 431 "grammar.y"
-    { (yyval.a) = gen_loadlen(); }
+
+/* Line 1806 of yacc.c  */
+#line 604 "grammar.y"
+    { (yyval.i) = BPF_JGT; }
     break;
 
   case 145:
-#line 433 "grammar.y"
-    { (yyval.i) = '&'; }
+
+/* Line 1806 of yacc.c  */
+#line 605 "grammar.y"
+    { (yyval.i) = BPF_JGE; }
     break;
 
   case 146:
-#line 434 "grammar.y"
-    { (yyval.i) = '|'; }
+
+/* Line 1806 of yacc.c  */
+#line 606 "grammar.y"
+    { (yyval.i) = BPF_JEQ; }
     break;
 
   case 147:
-#line 435 "grammar.y"
-    { (yyval.i) = '<'; }
+
+/* Line 1806 of yacc.c  */
+#line 608 "grammar.y"
+    { (yyval.i) = BPF_JGT; }
     break;
 
   case 148:
-#line 436 "grammar.y"
-    { (yyval.i) = '>'; }
+
+/* Line 1806 of yacc.c  */
+#line 609 "grammar.y"
+    { (yyval.i) = BPF_JGE; }
     break;
 
   case 149:
-#line 437 "grammar.y"
-    { (yyval.i) = '='; }
+
+/* Line 1806 of yacc.c  */
+#line 610 "grammar.y"
+    { (yyval.i) = BPF_JEQ; }
     break;
 
-  case 151:
-#line 440 "grammar.y"
-    { (yyval.i) = (yyvsp[-1].i); }
+  case 150:
+
+/* Line 1806 of yacc.c  */
+#line 612 "grammar.y"
+    { (yyval.a) = gen_loadi((yyvsp[(1) - (1)].i)); }
     break;
 
   case 152:
-#line 442 "grammar.y"
-    { (yyval.i) = A_LANE; }
+
+/* Line 1806 of yacc.c  */
+#line 615 "grammar.y"
+    { (yyval.a) = gen_load((yyvsp[(1) - (4)].i), (yyvsp[(3) - (4)].a), 1); }
     break;
 
   case 153:
-#line 443 "grammar.y"
-    { (yyval.i) = A_LLC; }
+
+/* Line 1806 of yacc.c  */
+#line 616 "grammar.y"
+    { (yyval.a) = gen_load((yyvsp[(1) - (6)].i), (yyvsp[(3) - (6)].a), (yyvsp[(5) - (6)].i)); }
     break;
 
   case 154:
-#line 444 "grammar.y"
-    { (yyval.i) = A_METAC;	}
+
+/* Line 1806 of yacc.c  */
+#line 617 "grammar.y"
+    { (yyval.a) = gen_arth(BPF_ADD, (yyvsp[(1) - (3)].a), (yyvsp[(3) - (3)].a)); }
     break;
 
   case 155:
-#line 445 "grammar.y"
-    { (yyval.i) = A_BCC; }
+
+/* Line 1806 of yacc.c  */
+#line 618 "grammar.y"
+    { (yyval.a) = gen_arth(BPF_SUB, (yyvsp[(1) - (3)].a), (yyvsp[(3) - (3)].a)); }
     break;
 
   case 156:
-#line 446 "grammar.y"
-    { (yyval.i) = A_OAMF4EC; }
+
+/* Line 1806 of yacc.c  */
+#line 619 "grammar.y"
+    { (yyval.a) = gen_arth(BPF_MUL, (yyvsp[(1) - (3)].a), (yyvsp[(3) - (3)].a)); }
     break;
 
   case 157:
-#line 447 "grammar.y"
-    { (yyval.i) = A_OAMF4SC; }
+
+/* Line 1806 of yacc.c  */
+#line 620 "grammar.y"
+    { (yyval.a) = gen_arth(BPF_DIV, (yyvsp[(1) - (3)].a), (yyvsp[(3) - (3)].a)); }
     break;
 
   case 158:
-#line 448 "grammar.y"
-    { (yyval.i) = A_SC; }
+
+/* Line 1806 of yacc.c  */
+#line 621 "grammar.y"
+    { (yyval.a) = gen_arth(BPF_AND, (yyvsp[(1) - (3)].a), (yyvsp[(3) - (3)].a)); }
     break;
 
   case 159:
-#line 449 "grammar.y"
-    { (yyval.i) = A_ILMIC; }
+
+/* Line 1806 of yacc.c  */
+#line 622 "grammar.y"
+    { (yyval.a) = gen_arth(BPF_OR, (yyvsp[(1) - (3)].a), (yyvsp[(3) - (3)].a)); }
     break;
 
   case 160:
-#line 451 "grammar.y"
-    { (yyval.i) = A_OAM; }
+
+/* Line 1806 of yacc.c  */
+#line 623 "grammar.y"
+    { (yyval.a) = gen_arth(BPF_LSH, (yyvsp[(1) - (3)].a), (yyvsp[(3) - (3)].a)); }
     break;
 
   case 161:
-#line 452 "grammar.y"
-    { (yyval.i) = A_OAMF4; }
+
+/* Line 1806 of yacc.c  */
+#line 624 "grammar.y"
+    { (yyval.a) = gen_arth(BPF_RSH, (yyvsp[(1) - (3)].a), (yyvsp[(3) - (3)].a)); }
     break;
 
   case 162:
-#line 453 "grammar.y"
-    { (yyval.i) = A_CONNECTMSG; }
+
+/* Line 1806 of yacc.c  */
+#line 625 "grammar.y"
+    { (yyval.a) = gen_neg((yyvsp[(2) - (2)].a)); }
     break;
 
   case 163:
-#line 454 "grammar.y"
-    { (yyval.i) = A_METACONNECT; }
+
+/* Line 1806 of yacc.c  */
+#line 626 "grammar.y"
+    { (yyval.a) = (yyvsp[(2) - (3)].a); }
     break;
 
   case 164:
-#line 457 "grammar.y"
-    { (yyval.blk).atmfieldtype = A_VPI; }
+
+/* Line 1806 of yacc.c  */
+#line 627 "grammar.y"
+    { (yyval.a) = gen_loadlen(); }
     break;
 
   case 165:
-#line 458 "grammar.y"
-    { (yyval.blk).atmfieldtype = A_VCI; }
+
+/* Line 1806 of yacc.c  */
+#line 629 "grammar.y"
+    { (yyval.i) = '&'; }
+    break;
+
+  case 166:
+
+/* Line 1806 of yacc.c  */
+#line 630 "grammar.y"
+    { (yyval.i) = '|'; }
     break;
 
   case 167:
-#line 461 "grammar.y"
-    { (yyval.blk).b = gen_atmfield_code((yyvsp[-2].blk).atmfieldtype, (bpf_int32)(yyvsp[0].i), (bpf_u_int32)(yyvsp[-1].i), 0); }
+
+/* Line 1806 of yacc.c  */
+#line 631 "grammar.y"
+    { (yyval.i) = '<'; }
     break;
 
   case 168:
-#line 462 "grammar.y"
-    { (yyval.blk).b = gen_atmfield_code((yyvsp[-2].blk).atmfieldtype, (bpf_int32)(yyvsp[0].i), (bpf_u_int32)(yyvsp[-1].i), 1); }
+
+/* Line 1806 of yacc.c  */
+#line 632 "grammar.y"
+    { (yyval.i) = '>'; }
     break;
 
   case 169:
-#line 463 "grammar.y"
-    { (yyval.blk).b = (yyvsp[-1].blk).b; (yyval.blk).q = qerr; }
+
+/* Line 1806 of yacc.c  */
+#line 633 "grammar.y"
+    { (yyval.i) = '='; }
     break;
 
-  case 170:
-#line 465 "grammar.y"
-    {
-	(yyval.blk).atmfieldtype = (yyvsp[-1].blk).atmfieldtype;
-	if ((yyval.blk).atmfieldtype == A_VPI ||
-	    (yyval.blk).atmfieldtype == A_VCI)
-		(yyval.blk).b = gen_atmfield_code((yyval.blk).atmfieldtype, (bpf_int32) (yyvsp[0].i), BPF_JEQ, 0);
-	}
+  case 171:
+
+/* Line 1806 of yacc.c  */
+#line 636 "grammar.y"
+    { (yyval.i) = (yyvsp[(2) - (3)].i); }
     break;
 
   case 172:
-#line 473 "grammar.y"
-    { gen_or((yyvsp[-2].blk).b, (yyvsp[0].blk).b); (yyval.blk) = (yyvsp[0].blk); }
+
+/* Line 1806 of yacc.c  */
+#line 638 "grammar.y"
+    { (yyval.i) = A_LANE; }
     break;
 
   case 173:
-#line 476 "grammar.y"
-    { (yyval.i) = M_FISU; }
+
+/* Line 1806 of yacc.c  */
+#line 639 "grammar.y"
+    { (yyval.i) = A_LLC; }
     break;
 
   case 174:
-#line 477 "grammar.y"
-    { (yyval.i) = M_LSSU; }
+
+/* Line 1806 of yacc.c  */
+#line 640 "grammar.y"
+    { (yyval.i) = A_METAC;	}
     break;
 
   case 175:
-#line 478 "grammar.y"
-    { (yyval.i) = M_MSU; }
+
+/* Line 1806 of yacc.c  */
+#line 641 "grammar.y"
+    { (yyval.i) = A_BCC; }
     break;
 
   case 176:
-#line 481 "grammar.y"
-    { (yyval.blk).mtp3fieldtype = M_SIO; }
+
+/* Line 1806 of yacc.c  */
+#line 642 "grammar.y"
+    { (yyval.i) = A_OAMF4EC; }
     break;
 
   case 177:
-#line 482 "grammar.y"
-    { (yyval.blk).mtp3fieldtype = M_OPC; }
+
+/* Line 1806 of yacc.c  */
+#line 643 "grammar.y"
+    { (yyval.i) = A_OAMF4SC; }
     break;
 
   case 178:
-#line 483 "grammar.y"
-    { (yyval.blk).mtp3fieldtype = M_DPC; }
+
+/* Line 1806 of yacc.c  */
+#line 644 "grammar.y"
+    { (yyval.i) = A_SC; }
     break;
 
   case 179:
-#line 484 "grammar.y"
-    { (yyval.blk).mtp3fieldtype = M_SLS; }
+
+/* Line 1806 of yacc.c  */
+#line 645 "grammar.y"
+    { (yyval.i) = A_ILMIC; }
+    break;
+
+  case 180:
+
+/* Line 1806 of yacc.c  */
+#line 647 "grammar.y"
+    { (yyval.i) = A_OAM; }
     break;
 
   case 181:
-#line 487 "grammar.y"
-    { (yyval.blk).b = gen_mtp3field_code((yyvsp[-2].blk).mtp3fieldtype, (u_int)(yyvsp[0].i), (u_int)(yyvsp[-1].i), 0); }
+
+/* Line 1806 of yacc.c  */
+#line 648 "grammar.y"
+    { (yyval.i) = A_OAMF4; }
     break;
 
   case 182:
-#line 488 "grammar.y"
-    { (yyval.blk).b = gen_mtp3field_code((yyvsp[-2].blk).mtp3fieldtype, (u_int)(yyvsp[0].i), (u_int)(yyvsp[-1].i), 1); }
+
+/* Line 1806 of yacc.c  */
+#line 649 "grammar.y"
+    { (yyval.i) = A_CONNECTMSG; }
     break;
 
   case 183:
-#line 489 "grammar.y"
-    { (yyval.blk).b = (yyvsp[-1].blk).b; (yyval.blk).q = qerr; }
+
+/* Line 1806 of yacc.c  */
+#line 650 "grammar.y"
+    { (yyval.i) = A_METACONNECT; }
     break;
 
   case 184:
-#line 491 "grammar.y"
+
+/* Line 1806 of yacc.c  */
+#line 653 "grammar.y"
+    { (yyval.blk).atmfieldtype = A_VPI; }
+    break;
+
+  case 185:
+
+/* Line 1806 of yacc.c  */
+#line 654 "grammar.y"
+    { (yyval.blk).atmfieldtype = A_VCI; }
+    break;
+
+  case 187:
+
+/* Line 1806 of yacc.c  */
+#line 657 "grammar.y"
+    { (yyval.blk).b = gen_atmfield_code((yyvsp[(0) - (2)].blk).atmfieldtype, (bpf_int32)(yyvsp[(2) - (2)].i), (bpf_u_int32)(yyvsp[(1) - (2)].i), 0); }
+    break;
+
+  case 188:
+
+/* Line 1806 of yacc.c  */
+#line 658 "grammar.y"
+    { (yyval.blk).b = gen_atmfield_code((yyvsp[(0) - (2)].blk).atmfieldtype, (bpf_int32)(yyvsp[(2) - (2)].i), (bpf_u_int32)(yyvsp[(1) - (2)].i), 1); }
+    break;
+
+  case 189:
+
+/* Line 1806 of yacc.c  */
+#line 659 "grammar.y"
+    { (yyval.blk).b = (yyvsp[(2) - (3)].blk).b; (yyval.blk).q = qerr; }
+    break;
+
+  case 190:
+
+/* Line 1806 of yacc.c  */
+#line 661 "grammar.y"
     {
-	(yyval.blk).mtp3fieldtype = (yyvsp[-1].blk).mtp3fieldtype;
-	if ((yyval.blk).mtp3fieldtype == M_SIO ||
-	    (yyval.blk).mtp3fieldtype == M_OPC ||
-	    (yyval.blk).mtp3fieldtype == M_DPC ||
-	    (yyval.blk).mtp3fieldtype == M_SLS )
-		(yyval.blk).b = gen_mtp3field_code((yyval.blk).mtp3fieldtype, (u_int) (yyvsp[0].i), BPF_JEQ, 0);
+	(yyval.blk).atmfieldtype = (yyvsp[(0) - (1)].blk).atmfieldtype;
+	if ((yyval.blk).atmfieldtype == A_VPI ||
+	    (yyval.blk).atmfieldtype == A_VCI)
+		(yyval.blk).b = gen_atmfield_code((yyval.blk).atmfieldtype, (bpf_int32) (yyvsp[(1) - (1)].i), BPF_JEQ, 0);
 	}
     break;
 
-  case 186:
-#line 501 "grammar.y"
-    { gen_or((yyvsp[-2].blk).b, (yyvsp[0].blk).b); (yyval.blk) = (yyvsp[0].blk); }
+  case 192:
+
+/* Line 1806 of yacc.c  */
+#line 669 "grammar.y"
+    { gen_or((yyvsp[(1) - (3)].blk).b, (yyvsp[(3) - (3)].blk).b); (yyval.blk) = (yyvsp[(3) - (3)].blk); }
+    break;
+
+  case 193:
+
+/* Line 1806 of yacc.c  */
+#line 672 "grammar.y"
+    { (yyval.i) = M_FISU; }
+    break;
+
+  case 194:
+
+/* Line 1806 of yacc.c  */
+#line 673 "grammar.y"
+    { (yyval.i) = M_LSSU; }
+    break;
+
+  case 195:
+
+/* Line 1806 of yacc.c  */
+#line 674 "grammar.y"
+    { (yyval.i) = M_MSU; }
+    break;
+
+  case 196:
+
+/* Line 1806 of yacc.c  */
+#line 675 "grammar.y"
+    { (yyval.i) = MH_FISU; }
+    break;
+
+  case 197:
+
+/* Line 1806 of yacc.c  */
+#line 676 "grammar.y"
+    { (yyval.i) = MH_LSSU; }
+    break;
+
+  case 198:
+
+/* Line 1806 of yacc.c  */
+#line 677 "grammar.y"
+    { (yyval.i) = MH_MSU; }
+    break;
+
+  case 199:
+
+/* Line 1806 of yacc.c  */
+#line 680 "grammar.y"
+    { (yyval.blk).mtp3fieldtype = M_SIO; }
+    break;
+
+  case 200:
+
+/* Line 1806 of yacc.c  */
+#line 681 "grammar.y"
+    { (yyval.blk).mtp3fieldtype = M_OPC; }
+    break;
+
+  case 201:
+
+/* Line 1806 of yacc.c  */
+#line 682 "grammar.y"
+    { (yyval.blk).mtp3fieldtype = M_DPC; }
+    break;
+
+  case 202:
+
+/* Line 1806 of yacc.c  */
+#line 683 "grammar.y"
+    { (yyval.blk).mtp3fieldtype = M_SLS; }
+    break;
+
+  case 203:
+
+/* Line 1806 of yacc.c  */
+#line 684 "grammar.y"
+    { (yyval.blk).mtp3fieldtype = MH_SIO; }
+    break;
+
+  case 204:
+
+/* Line 1806 of yacc.c  */
+#line 685 "grammar.y"
+    { (yyval.blk).mtp3fieldtype = MH_OPC; }
+    break;
+
+  case 205:
+
+/* Line 1806 of yacc.c  */
+#line 686 "grammar.y"
+    { (yyval.blk).mtp3fieldtype = MH_DPC; }
+    break;
+
+  case 206:
+
+/* Line 1806 of yacc.c  */
+#line 687 "grammar.y"
+    { (yyval.blk).mtp3fieldtype = MH_SLS; }
+    break;
+
+  case 208:
+
+/* Line 1806 of yacc.c  */
+#line 690 "grammar.y"
+    { (yyval.blk).b = gen_mtp3field_code((yyvsp[(0) - (2)].blk).mtp3fieldtype, (u_int)(yyvsp[(2) - (2)].i), (u_int)(yyvsp[(1) - (2)].i), 0); }
+    break;
+
+  case 209:
+
+/* Line 1806 of yacc.c  */
+#line 691 "grammar.y"
+    { (yyval.blk).b = gen_mtp3field_code((yyvsp[(0) - (2)].blk).mtp3fieldtype, (u_int)(yyvsp[(2) - (2)].i), (u_int)(yyvsp[(1) - (2)].i), 1); }
+    break;
+
+  case 210:
+
+/* Line 1806 of yacc.c  */
+#line 692 "grammar.y"
+    { (yyval.blk).b = (yyvsp[(2) - (3)].blk).b; (yyval.blk).q = qerr; }
+    break;
+
+  case 211:
+
+/* Line 1806 of yacc.c  */
+#line 694 "grammar.y"
+    {
+	(yyval.blk).mtp3fieldtype = (yyvsp[(0) - (1)].blk).mtp3fieldtype;
+	if ((yyval.blk).mtp3fieldtype == M_SIO ||
+	    (yyval.blk).mtp3fieldtype == M_OPC ||
+	    (yyval.blk).mtp3fieldtype == M_DPC ||
+	    (yyval.blk).mtp3fieldtype == M_SLS ||
+	    (yyval.blk).mtp3fieldtype == MH_SIO ||
+	    (yyval.blk).mtp3fieldtype == MH_OPC ||
+	    (yyval.blk).mtp3fieldtype == MH_DPC ||
+	    (yyval.blk).mtp3fieldtype == MH_SLS)
+		(yyval.blk).b = gen_mtp3field_code((yyval.blk).mtp3fieldtype, (u_int) (yyvsp[(1) - (1)].i), BPF_JEQ, 0);
+	}
+    break;
+
+  case 213:
+
+/* Line 1806 of yacc.c  */
+#line 708 "grammar.y"
+    { gen_or((yyvsp[(1) - (3)].blk).b, (yyvsp[(3) - (3)].blk).b); (yyval.blk) = (yyvsp[(3) - (3)].blk); }
     break;
 
 
+
+/* Line 1806 of yacc.c  */
+#line 3744 "y.tab.c"
       default: break;
     }
+  /* User semantic actions sometimes alter yychar, and that requires
+     that yytoken be updated with the new translation.  We take the
+     approach of translating immediately before every use of yytoken.
+     One alternative is translating here after every semantic action,
+     but that translation would be missed if the semantic action invokes
+     YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+     if it invokes YYBACKUP.  In the case of YYABORT or YYACCEPT, an
+     incorrect destructor might then be invoked immediately.  In the
+     case of YYERROR or YYBACKUP, subsequent parser actions might lead
+     to an incorrect destructor call or verbose syntax error message
+     before the lookahead is translated.  */
+  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
 
-/* Line 1126 of yacc.c.  */
-#line 2714 "y.tab.c"
-
-  yyvsp -= yylen;
-  yyssp -= yylen;
-
-
+  YYPOPSTACK (yylen);
+  yylen = 0;
   YY_STACK_PRINT (yyss, yyssp);
 
   *++yyvsp = yyval;
 
-
   /* Now `shift' the result of the reduction.  Determine what state
      that goes to, based on the state we popped back to and the rule
      number reduced by.  */
@@ -2740,137 +3781,72 @@
 | yyerrlab -- here on detecting error |
 `------------------------------------*/
 yyerrlab:
+  /* Make sure we have latest lookahead translation.  See comments at
+     user semantic actions for why this is necessary.  */
+  yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
+
   /* If not already recovering from an error, report this error.  */
   if (!yyerrstatus)
     {
       ++yynerrs;
-#if YYERROR_VERBOSE
-      yyn = yypact[yystate];
-
-      if (YYPACT_NINF < yyn && yyn < YYLAST)
-	{
-	  int yytype = YYTRANSLATE (yychar);
-	  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
-	  YYSIZE_T yysize = yysize0;
-	  YYSIZE_T yysize1;
-	  int yysize_overflow = 0;
-	  char *yymsg = 0;
-#	  define YYERROR_VERBOSE_ARGS_MAXIMUM 5
-	  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-	  int yyx;
-
-#if 0
-	  /* This is so xgettext sees the translatable formats that are
-	     constructed on the fly.  */
-	  YY_("syntax error, unexpected %s");
-	  YY_("syntax error, unexpected %s, expecting %s");
-	  YY_("syntax error, unexpected %s, expecting %s or %s");
-	  YY_("syntax error, unexpected %s, expecting %s or %s or %s");
-	  YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+#if ! YYERROR_VERBOSE
+      yyerror (YY_("syntax error"));
+#else
+# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
+                                        yyssp, yytoken)
+      {
+        char const *yymsgp = YY_("syntax error");
+        int yysyntax_error_status;
+        yysyntax_error_status = YYSYNTAX_ERROR;
+        if (yysyntax_error_status == 0)
+          yymsgp = yymsg;
+        else if (yysyntax_error_status == 1)
+          {
+            if (yymsg != yymsgbuf)
+              YYSTACK_FREE (yymsg);
+            yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
+            if (!yymsg)
+              {
+                yymsg = yymsgbuf;
+                yymsg_alloc = sizeof yymsgbuf;
+                yysyntax_error_status = 2;
+              }
+            else
+              {
+                yysyntax_error_status = YYSYNTAX_ERROR;
+                yymsgp = yymsg;
+              }
+          }
+        yyerror (yymsgp);
+        if (yysyntax_error_status == 2)
+          goto yyexhaustedlab;
+      }
+# undef YYSYNTAX_ERROR
 #endif
-	  char *yyfmt;
-	  char const *yyf;
-	  static char const yyunexpected[] = "syntax error, unexpected %s";
-	  static char const yyexpecting[] = ", expecting %s";
-	  static char const yyor[] = " or %s";
-	  char yyformat[sizeof yyunexpected
-			+ sizeof yyexpecting - 1
-			+ ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-			   * (sizeof yyor - 1))];
-	  char const *yyprefix = yyexpecting;
-
-	  /* Start YYX at -YYN if negative to avoid negative indexes in
-	     YYCHECK.  */
-	  int yyxbegin = yyn < 0 ? -yyn : 0;
-
-	  /* Stay within bounds of both yycheck and yytname.  */
-	  int yychecklim = YYLAST - yyn;
-	  int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-	  int yycount = 1;
-
-	  yyarg[0] = yytname[yytype];
-	  yyfmt = yystpcpy (yyformat, yyunexpected);
-
-	  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-	    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-	      {
-		if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-		  {
-		    yycount = 1;
-		    yysize = yysize0;
-		    yyformat[sizeof yyunexpected - 1] = '\0';
-		    break;
-		  }
-		yyarg[yycount++] = yytname[yyx];
-		yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-		yysize_overflow |= yysize1 < yysize;
-		yysize = yysize1;
-		yyfmt = yystpcpy (yyfmt, yyprefix);
-		yyprefix = yyor;
-	      }
-
-	  yyf = YY_(yyformat);
-	  yysize1 = yysize + yystrlen (yyf);
-	  yysize_overflow |= yysize1 < yysize;
-	  yysize = yysize1;
-
-	  if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM)
-	    yymsg = (char *) YYSTACK_ALLOC (yysize);
-	  if (yymsg)
-	    {
-	      /* Avoid sprintf, as that infringes on the user's name space.
-		 Don't have undefined behavior even if the translation
-		 produced a string with the wrong number of "%s"s.  */
-	      char *yyp = yymsg;
-	      int yyi = 0;
-	      while ((*yyp = *yyf))
-		{
-		  if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
-		    {
-		      yyp += yytnamerr (yyp, yyarg[yyi++]);
-		      yyf += 2;
-		    }
-		  else
-		    {
-		      yyp++;
-		      yyf++;
-		    }
-		}
-	      yyerror (yymsg);
-	      YYSTACK_FREE (yymsg);
-	    }
-	  else
-	    {
-	      yyerror (YY_("syntax error"));
-	      goto yyexhaustedlab;
-	    }
-	}
-      else
-#endif /* YYERROR_VERBOSE */
-	yyerror (YY_("syntax error"));
     }
 
 
 
   if (yyerrstatus == 3)
     {
-      /* If just tried and failed to reuse look-ahead token after an
+      /* If just tried and failed to reuse lookahead token after an
 	 error, discard it.  */
 
       if (yychar <= YYEOF)
-        {
+	{
 	  /* Return failure if at end of input.  */
 	  if (yychar == YYEOF)
 	    YYABORT;
-        }
+	}
       else
 	{
-	  yydestruct ("Error: discarding", yytoken, &yylval);
+	  yydestruct ("Error: discarding",
+		      yytoken, &yylval);
 	  yychar = YYEMPTY;
 	}
     }
 
-  /* Else will try to reuse look-ahead token after shifting the error
+  /* Else will try to reuse lookahead token after shifting the error
      token.  */
   goto yyerrlab1;
 
@@ -2883,11 +3859,14 @@
   /* Pacify compilers like GCC when the user code never invokes
      YYERROR and the label yyerrorlab therefore never appears in user
      code.  */
-  if (0)
+  if (/*CONSTCOND*/ 0)
      goto yyerrorlab;
 
-yyvsp -= yylen;
-  yyssp -= yylen;
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYERROR.  */
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
   yystate = *yyssp;
   goto yyerrlab1;
 
@@ -2901,7 +3880,7 @@
   for (;;)
     {
       yyn = yypact[yystate];
-      if (yyn != YYPACT_NINF)
+      if (!yypact_value_is_default (yyn))
 	{
 	  yyn += YYTERROR;
 	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
@@ -2917,19 +3896,17 @@
 	YYABORT;
 
 
-      yydestruct ("Error: popping", yystos[yystate], yyvsp);
-      YYPOPSTACK;
+      yydestruct ("Error: popping",
+		  yystos[yystate], yyvsp);
+      YYPOPSTACK (1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
     }
 
-  if (yyn == YYFINAL)
-    YYACCEPT;
-
   *++yyvsp = yylval;
 
 
-  /* Shift the error token. */
+  /* Shift the error token.  */
   YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
 
   yystate = yyn;
@@ -2950,7 +3927,7 @@
   yyresult = 1;
   goto yyreturn;
 
-#ifndef yyoverflow
+#if !defined(yyoverflow) || YYERROR_VERBOSE
 /*-------------------------------------------------.
 | yyexhaustedlab -- memory exhaustion comes here.  |
 `-------------------------------------------------*/
@@ -2961,23 +3938,39 @@
 #endif
 
 yyreturn:
-  if (yychar != YYEOF && yychar != YYEMPTY)
-     yydestruct ("Cleanup: discarding lookahead",
-		 yytoken, &yylval);
+  if (yychar != YYEMPTY)
+    {
+      /* Make sure we have latest lookahead translation.  See comments at
+         user semantic actions for why this is necessary.  */
+      yytoken = YYTRANSLATE (yychar);
+      yydestruct ("Cleanup: discarding lookahead",
+                  yytoken, &yylval);
+    }
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYABORT or YYACCEPT.  */
+  YYPOPSTACK (yylen);
+  YY_STACK_PRINT (yyss, yyssp);
   while (yyssp != yyss)
     {
       yydestruct ("Cleanup: popping",
 		  yystos[*yyssp], yyvsp);
-      YYPOPSTACK;
+      YYPOPSTACK (1);
     }
 #ifndef yyoverflow
   if (yyss != yyssa)
     YYSTACK_FREE (yyss);
 #endif
-  return yyresult;
+#if YYERROR_VERBOSE
+  if (yymsg != yymsgbuf)
+    YYSTACK_FREE (yymsg);
+#endif
+  /* Make sure YYID is used.  */
+  return YYID (yyresult);
 }
 
 
-#line 503 "grammar.y"
+
+/* Line 2067 of yacc.c  */
+#line 710 "grammar.y"
 
 
diff --git a/grammar.y b/grammar.y
index f9b7cb1..e9cc6e6 100644
--- a/grammar.y
+++ b/grammar.y
@@ -22,7 +22,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/grammar.y,v 1.86.2.9 2007/09/12 19:17:25 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 @@
 #endif
 
 #include <netinet/in.h>
+#include <arpa/inet.h>
 #endif /* WIN32 */
 
 #include <stdio.h>
@@ -57,7 +58,8 @@
 #include <net/pfvar.h>
 #include <net/if_pflog.h>
 #endif
-#include <pcap-namedb.h>
+#include "ieee80211.h"
+#include <pcap/namedb.h>
 
 #ifdef HAVE_OS_PROTO_H
 #include "os-proto.h"
@@ -67,6 +69,92 @@
 			 (q).dir = (d),\
 			 (q).addr = (a)
 
+struct tok {
+	int v;			/* value */
+	const char *s;		/* string */
+};
+
+static const struct tok ieee80211_types[] = {
+	{ IEEE80211_FC0_TYPE_DATA, "data" },
+	{ IEEE80211_FC0_TYPE_MGT, "mgt" },
+	{ IEEE80211_FC0_TYPE_MGT, "management" },
+	{ IEEE80211_FC0_TYPE_CTL, "ctl" },
+	{ IEEE80211_FC0_TYPE_CTL, "control" },
+	{ 0, NULL }
+};
+static const struct tok ieee80211_mgt_subtypes[] = {
+	{ IEEE80211_FC0_SUBTYPE_ASSOC_REQ, "assocreq" },
+	{ IEEE80211_FC0_SUBTYPE_ASSOC_REQ, "assoc-req" },
+	{ IEEE80211_FC0_SUBTYPE_ASSOC_RESP, "assocresp" },
+	{ IEEE80211_FC0_SUBTYPE_ASSOC_RESP, "assoc-resp" },
+	{ IEEE80211_FC0_SUBTYPE_REASSOC_REQ, "reassocreq" },
+	{ IEEE80211_FC0_SUBTYPE_REASSOC_REQ, "reassoc-req" },
+	{ IEEE80211_FC0_SUBTYPE_REASSOC_RESP, "reassocresp" },
+	{ IEEE80211_FC0_SUBTYPE_REASSOC_RESP, "reassoc-resp" },
+	{ IEEE80211_FC0_SUBTYPE_PROBE_REQ, "probereq" },
+	{ IEEE80211_FC0_SUBTYPE_PROBE_REQ, "probe-req" },
+	{ IEEE80211_FC0_SUBTYPE_PROBE_RESP, "proberesp" },
+	{ IEEE80211_FC0_SUBTYPE_PROBE_RESP, "probe-resp" },
+	{ IEEE80211_FC0_SUBTYPE_BEACON, "beacon" },
+	{ IEEE80211_FC0_SUBTYPE_ATIM, "atim" },
+	{ IEEE80211_FC0_SUBTYPE_DISASSOC, "disassoc" },
+	{ IEEE80211_FC0_SUBTYPE_DISASSOC, "disassociation" },
+	{ IEEE80211_FC0_SUBTYPE_AUTH, "auth" },
+	{ IEEE80211_FC0_SUBTYPE_AUTH, "authentication" },
+	{ IEEE80211_FC0_SUBTYPE_DEAUTH, "deauth" },
+	{ IEEE80211_FC0_SUBTYPE_DEAUTH, "deauthentication" },
+	{ 0, NULL }
+};
+static const struct tok ieee80211_ctl_subtypes[] = {
+	{ IEEE80211_FC0_SUBTYPE_PS_POLL, "ps-poll" },
+	{ IEEE80211_FC0_SUBTYPE_RTS, "rts" },
+	{ IEEE80211_FC0_SUBTYPE_CTS, "cts" },
+	{ IEEE80211_FC0_SUBTYPE_ACK, "ack" },
+	{ IEEE80211_FC0_SUBTYPE_CF_END, "cf-end" },
+	{ IEEE80211_FC0_SUBTYPE_CF_END_ACK, "cf-end-ack" },
+	{ 0, NULL }
+};
+static const struct tok ieee80211_data_subtypes[] = {
+	{ IEEE80211_FC0_SUBTYPE_DATA, "data" },
+	{ IEEE80211_FC0_SUBTYPE_CF_ACK, "data-cf-ack" },
+	{ IEEE80211_FC0_SUBTYPE_CF_POLL, "data-cf-poll" },
+	{ IEEE80211_FC0_SUBTYPE_CF_ACPL, "data-cf-ack-poll" },
+	{ IEEE80211_FC0_SUBTYPE_NODATA, "null" },
+	{ IEEE80211_FC0_SUBTYPE_NODATA_CF_ACK, "cf-ack" },
+	{ IEEE80211_FC0_SUBTYPE_NODATA_CF_POLL, "cf-poll"  },
+	{ IEEE80211_FC0_SUBTYPE_NODATA_CF_ACPL, "cf-ack-poll" },
+	{ IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_DATA, "qos-data" },
+	{ IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_CF_ACK, "qos-data-cf-ack" },
+	{ IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_CF_POLL, "qos-data-cf-poll" },
+	{ IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_CF_ACPL, "qos-data-cf-ack-poll" },
+	{ IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_NODATA, "qos" },
+	{ IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_NODATA_CF_POLL, "qos-cf-poll" },
+	{ IEEE80211_FC0_SUBTYPE_QOS|IEEE80211_FC0_SUBTYPE_NODATA_CF_ACPL, "qos-cf-ack-poll" },
+	{ 0, NULL }
+};
+struct type2tok {
+	int type;
+	const struct tok *tok;
+};
+static const struct type2tok ieee80211_type_subtypes[] = {
+	{ IEEE80211_FC0_TYPE_MGT, ieee80211_mgt_subtypes },
+	{ IEEE80211_FC0_TYPE_CTL, ieee80211_ctl_subtypes },
+	{ IEEE80211_FC0_TYPE_DATA, ieee80211_data_subtypes },
+	{ 0, NULL }
+};
+
+static int
+str2tok(const char *str, const struct tok *toks)
+{
+	int i;
+
+	for (i = 0; toks[i].s != NULL; i++) {
+		if (pcap_strcasecmp(toks[i].s, str) == 0)
+			return (toks[i].v);
+	}
+	return (-1);
+}
+
 int n_errors = 0;
 
 static struct qual qerr = { Q_UNDEF, Q_UNDEF, Q_UNDEF, Q_UNDEF };
@@ -79,7 +167,7 @@
 	/* NOTREACHED */
 }
 
-#ifndef YYBISON
+#ifdef NEED_YYPARSE_WRAPPER
 int yyparse(void);
 
 int
@@ -113,6 +201,16 @@
 	else if (pcap_strcasecmp(action, "drop") == 0 ||
 		pcap_strcasecmp(action, "block") == 0)
 		return (PF_DROP);
+#if HAVE_PF_NAT_THROUGH_PF_NORDR
+	else if (pcap_strcasecmp(action, "rdr") == 0)
+		return (PF_RDR);
+	else if (pcap_strcasecmp(action, "nat") == 0)
+		return (PF_NAT);
+	else if (pcap_strcasecmp(action, "binat") == 0)
+		return (PF_BINAT);
+	else if (pcap_strcasecmp(action, "nordr") == 0)
+		return (PF_NORDR);
+#endif
 	else {
 		bpf_error("unknown PF action");
 		/*NOTREACHED*/
@@ -124,6 +222,9 @@
 {
 	bpf_error("libpcap was compiled on a machine without pf support");
 	/*NOTREACHED*/
+
+	/* this is to make the VC compiler happy */
+	return -1;
 }
 
 static int
@@ -131,6 +232,9 @@
 {
 	bpf_error("libpcap was compiled on a machine without pf support");
 	/*NOTREACHED*/
+
+	/* this is to make the VC compiler happy */
+	return -1;
 }
 #endif /* HAVE_NET_PFVAR_H */
 %}
@@ -157,7 +261,7 @@
 %type	<a>	arth narth
 %type	<i>	byteop pname pnum relop irelop
 %type	<blk>	and or paren not null prog
-%type	<rblk>	other pfvar
+%type	<rblk>	other pfvar p80211
 %type	<i>	atmtype atmmultitype
 %type	<blk>	atmfield
 %type	<blk>	atmfieldvalue atmvalue atmlistvalue
@@ -168,11 +272,12 @@
 
 %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 RA TA
 %token  LINK
 %token	GEQ LEQ NEQ
 %token	ID EID HID HID6 AID
@@ -189,14 +294,15 @@
 %token	OAM OAMF4 CONNECTMSG METACONNECT
 %token	VPI VCI
 %token	RADIO
-%token	FISU LSSU MSU
-%token	SIO OPC DPC SLS
+%token	FISU LSSU MSU HFISU HLSSU HMSU
+%token	SIO OPC DPC SLS HSIO HOPC HDPC HSLS
+ 
 
 %type	<s> ID
 %type	<e> EID
 %type	<e> AID
 %type	<s> HID HID6
-%type	<i> NUM action reason
+%type	<i> NUM action reason type subtype type_subtype dir
 
 %left OR AND
 %nonassoc  '!'
@@ -238,6 +344,14 @@
 	| HID			{
 				  /* Decide how to parse HID based on proto */
 				  $$.q = $<blk>0.q;
+				  if ($$.q.addr == Q_PORT)
+				  	bpf_error("'port' modifier applied to ip host");
+				  else if ($$.q.addr == Q_PORTRANGE)
+				  	bpf_error("'portrange' modifier applied to ip host");
+				  else if ($$.q.addr == Q_PROTO)
+				  	bpf_error("'proto' modifier applied to ip host");
+				  else if ($$.q.addr == Q_PROTOCHAIN)
+				  	bpf_error("'protochain' modifier applied to ip host");
 				  $$.b = gen_ncode($1, 0, $$.q);
 				}
 	| HID6 '/' NUM		{
@@ -325,6 +439,12 @@
 	| DST OR SRC		{ $$ = Q_OR; }
 	| SRC AND DST		{ $$ = Q_AND; }
 	| DST AND SRC		{ $$ = Q_AND; }
+	| ADDR1			{ $$ = Q_ADDR1; }
+	| ADDR2			{ $$ = Q_ADDR2; }
+	| ADDR3			{ $$ = Q_ADDR3; }
+	| ADDR4			{ $$ = Q_ADDR4; }
+	| RA			{ $$ = Q_RA; }
+	| TA			{ $$ = Q_TA; }
 	;
 /* address type qualifiers */
 aqual:	  HOST			{ $$ = Q_HOST; }
@@ -347,6 +467,7 @@
 	| IGRP			{ $$ = Q_IGRP; }
 	| PIM			{ $$ = Q_PIM; }
 	| VRRP			{ $$ = Q_VRRP; }
+	| CARP 			{ $$ = Q_CARP; }
 	| ATALK			{ $$ = Q_ATALK; }
 	| AARP			{ $$ = Q_AARP; }
 	| DECNET		{ $$ = Q_DECNET; }
@@ -386,8 +507,10 @@
 	| MPLS pnum		{ $$ = gen_mpls($2); }
 	| MPLS			{ $$ = gen_mpls(-1); }
 	| PPPOED		{ $$ = gen_pppoed(); }
-	| PPPOES		{ $$ = gen_pppoes(); }
+	| PPPOES pnum		{ $$ = gen_pppoes($2); }
+	| PPPOES		{ $$ = gen_pppoes(-1); }
 	| pfvar			{ $$ = $1; }
+	| pqual p80211		{ $$ = $2; }
 	;
 
 pfvar:	  PF_IFNAME ID		{ $$ = gen_pf_ifname($2); }
@@ -398,6 +521,79 @@
 	| PF_ACTION action	{ $$ = gen_pf_action($2); }
 	;
 
+p80211:   TYPE type SUBTYPE subtype
+				{ $$ = gen_p80211_type($2 | $4,
+					IEEE80211_FC0_TYPE_MASK |
+					IEEE80211_FC0_SUBTYPE_MASK);
+				}
+	| TYPE type		{ $$ = gen_p80211_type($2,
+					IEEE80211_FC0_TYPE_MASK);
+				}
+	| SUBTYPE type_subtype	{ $$ = gen_p80211_type($2,
+					IEEE80211_FC0_TYPE_MASK |
+					IEEE80211_FC0_SUBTYPE_MASK);
+				}
+	| DIR dir		{ $$ = gen_p80211_fcdir($2); }
+	;
+
+type:	  NUM
+	| ID			{ $$ = str2tok($1, ieee80211_types);
+				  if ($$ == -1)
+				  	bpf_error("unknown 802.11 type name");
+				}
+	;
+
+subtype:  NUM
+	| ID			{ const struct tok *types = NULL;
+				  int i;
+				  for (i = 0;; i++) {
+				  	if (ieee80211_type_subtypes[i].tok == NULL) {
+				  		/* Ran out of types */
+						bpf_error("unknown 802.11 type");
+						break;
+					}
+					if ($<i>-1 == ieee80211_type_subtypes[i].type) {
+						types = ieee80211_type_subtypes[i].tok;
+						break;
+					}
+				  }
+
+				  $$ = str2tok($1, types);
+				  if ($$ == -1)
+					bpf_error("unknown 802.11 subtype name");
+				}
+	;
+
+type_subtype:	ID		{ int i;
+				  for (i = 0;; i++) {
+				  	if (ieee80211_type_subtypes[i].tok == NULL) {
+				  		/* Ran out of types */
+						bpf_error("unknown 802.11 type name");
+						break;
+					}
+					$$ = str2tok($1, ieee80211_type_subtypes[i].tok);
+					if ($$ != -1) {
+						$$ |= ieee80211_type_subtypes[i].type;
+						break;
+					}
+				  }
+				}
+		;
+
+dir:	  NUM
+	| ID			{ if (pcap_strcasecmp($1, "nods") == 0)
+					$$ = IEEE80211_FC1_DIR_NODS;
+				  else if (pcap_strcasecmp($1, "tods") == 0)
+					$$ = IEEE80211_FC1_DIR_TODS;
+				  else if (pcap_strcasecmp($1, "fromds") == 0)
+					$$ = IEEE80211_FC1_DIR_FROMDS;
+				  else if (pcap_strcasecmp($1, "dstods") == 0)
+					$$ = IEEE80211_FC1_DIR_DSTODS;
+				  else
+					bpf_error("unknown 802.11 direction");
+				}
+	;
+
 reason:	  NUM			{ $$ = $1; }
 	| ID			{ $$ = pfreason_to_num($1); }
 	;
@@ -476,12 +672,19 @@
 mtp2type: FISU			{ $$ = M_FISU; }
 	| LSSU			{ $$ = M_LSSU; }
 	| MSU			{ $$ = M_MSU; }
+	| HFISU			{ $$ = MH_FISU; }
+	| HLSSU			{ $$ = MH_LSSU; }
+	| HMSU			{ $$ = MH_MSU; }
 	;
 	/* MTP3 field types quantifier */
 mtp3field: SIO			{ $$.mtp3fieldtype = M_SIO; }
 	| OPC			{ $$.mtp3fieldtype = M_OPC; }
 	| DPC			{ $$.mtp3fieldtype = M_DPC; }
 	| SLS                   { $$.mtp3fieldtype = M_SLS; }
+	| HSIO			{ $$.mtp3fieldtype = MH_SIO; }
+	| HOPC			{ $$.mtp3fieldtype = MH_OPC; }
+	| HDPC			{ $$.mtp3fieldtype = MH_DPC; }
+	| HSLS                  { $$.mtp3fieldtype = MH_SLS; }
 	;
 mtp3value: mtp3fieldvalue
 	| relop NUM		{ $$.b = gen_mtp3field_code($<blk>0.mtp3fieldtype, (u_int)$2, (u_int)$1, 0); }
@@ -493,7 +696,11 @@
 	if ($$.mtp3fieldtype == M_SIO ||
 	    $$.mtp3fieldtype == M_OPC ||
 	    $$.mtp3fieldtype == M_DPC ||
-	    $$.mtp3fieldtype == M_SLS )
+	    $$.mtp3fieldtype == M_SLS ||
+	    $$.mtp3fieldtype == MH_SIO ||
+	    $$.mtp3fieldtype == MH_OPC ||
+	    $$.mtp3fieldtype == MH_DPC ||
+	    $$.mtp3fieldtype == MH_SLS)
 		$$.b = gen_mtp3field_code($$.mtp3fieldtype, (u_int) $1, BPF_JEQ, 0);
 	}
 	;
diff --git a/ieee80211.h b/ieee80211.h
new file mode 100644
index 0000000..473803d
--- /dev/null
+++ b/ieee80211.h
@@ -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_ */
diff --git a/inet.c b/inet.c
index 8a44728..6ae46ef 100644
--- a/inet.c
+++ b/inet.c
@@ -34,7 +34,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/inet.c,v 1.66.2.6 2007/06/11 09:52:04 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 @@
 	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 @@
 			}
 			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.
@@ -356,6 +357,52 @@
 	return (0);
 }
 
+/*
+ * XXX - on FreeBSDs that support it, should it get the sysctl named
+ * "dev.{adapter family name}.{adapter unit}.%desc" to get a description
+ * of the adapter?  Note that "dev.an.0.%desc" is "Aironet PC4500/PC4800"
+ * with my Cisco 350 card, so the name isn't entirely descriptive.  The
+ * "dev.an.0.%pnpinfo" has a better description, although one might argue
+ * that the problem is really a driver bug - if it can find out that it's
+ * 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?  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 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.
+ *
+ * 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?
+ */
 int
 add_addr_to_iflist(pcap_if_t **alldevs, const char *name, u_int flags,
     struct sockaddr *addr, size_t addr_size,
@@ -365,14 +412,90 @@
     char *errbuf)
 {
 	pcap_if_t *curdev;
+	char *description = NULL;
 	pcap_addr_t *curaddr, *prevaddr, *nextaddr;
+#ifdef SIOCGIFDESCR
+	int s;
+	struct ifreq ifrdesc;
+#ifndef IFDESCRSIZE
+	size_t descrlen = 64;
+#else
+	size_t descrlen = IFDESCRSIZE;
+#endif /* IFDESCRSIZE */
+#endif /* SIOCGIFDESCR */
 
-	if (add_or_find_if(&curdev, alldevs, name, flags, NULL, errbuf) == -1) {
+#ifdef SIOCGIFDESCR
+	/*
+	 * Get the description for the interface.
+	 */
+	memset(&ifrdesc, 0, sizeof ifrdesc);
+	strlcpy(ifrdesc.ifr_name, name, sizeof ifrdesc.ifr_name);
+	s = socket(AF_INET, SOCK_DGRAM, 0);
+	if (s >= 0) {
+#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 /* 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.
@@ -608,6 +731,15 @@
 #ifdef HAVE_SEPTEL_API
 	    || strstr(device, "septel") != NULL
 #endif
+#ifdef PCAP_SUPPORT_BT
+	    || strstr(device, "bluetooth") != NULL
+#endif
+#ifdef PCAP_SUPPORT_USB
+	    || strstr(device, "usbmon") != NULL
+#endif
+#ifdef HAVE_SNF_API
+	    || strstr(device, "snf") != NULL
+#endif
 	    ) {
 		*netp = *maskp = 0;
 		return 0;
@@ -639,6 +771,12 @@
 	}
 	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));
@@ -740,8 +878,10 @@
 		 */
 		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;
 		}
 
diff --git a/lbl/os-aix4.h b/lbl/os-aix4.h
index f7edb62..c5dfce2 100644
--- a/lbl/os-aix4.h
+++ b/lbl/os-aix4.h
@@ -18,7 +18,7 @@
  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/lbl/os-aix4.h,v 1.1 2002/06/01 09:37:40 guy Exp $
+ * @(#) $Header: /tcpdump/master/libpcap/lbl/os-aix4.h,v 1.1 2002-06-01 09:37:40 guy Exp $
  */
 
 /* Prototypes missing in AIX 4.x */
diff --git a/lbl/os-hpux11.h b/lbl/os-hpux11.h
index 55a79e5..5e325a9 100644
--- a/lbl/os-hpux11.h
+++ b/lbl/os-hpux11.h
@@ -18,7 +18,7 @@
  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/lbl/os-hpux11.h,v 1.1 2002/06/01 09:37:41 guy Exp $
+ * @(#) $Header: /tcpdump/master/libpcap/lbl/os-hpux11.h,v 1.1 2002-06-01 09:37:41 guy Exp $
  */
 
 /* Prototypes missing in HP-UX 11.x */
diff --git a/lbl/os-osf4.h b/lbl/os-osf4.h
index abb207e..60abcd9 100644
--- a/lbl/os-osf4.h
+++ b/lbl/os-osf4.h
@@ -18,7 +18,7 @@
  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/lbl/os-osf4.h,v 1.2 2000/12/22 11:51:33 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/lbl/os-osf4.h,v 1.2 2000-12-22 11:51:33 guy Exp $ (LBL)
  */
 
 /* Prototypes missing in Digital UNIX 4.x */
diff --git a/lbl/os-osf5.h b/lbl/os-osf5.h
index 338caa8..1ebcac6 100644
--- a/lbl/os-osf5.h
+++ b/lbl/os-osf5.h
@@ -18,7 +18,7 @@
  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/lbl/os-osf5.h,v 1.2 2002/08/02 03:24:15 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/lbl/os-osf5.h,v 1.2 2002-08-02 03:24:15 guy Exp $ (LBL)
  */
 
 /*
diff --git a/lbl/os-solaris2.h b/lbl/os-solaris2.h
index 5de2c6e..fae2aa3 100644
--- a/lbl/os-solaris2.h
+++ b/lbl/os-solaris2.h
@@ -18,7 +18,7 @@
  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/lbl/os-solaris2.h,v 1.19 2000/10/11 04:02:52 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/lbl/os-solaris2.h,v 1.19 2000-10-11 04:02:52 guy Exp $ (LBL)
  */
 
 /* Prototypes missing in SunOS 5 */
diff --git a/lbl/os-sunos4.h b/lbl/os-sunos4.h
index fd8f508..cfd4b04 100644
--- a/lbl/os-sunos4.h
+++ b/lbl/os-sunos4.h
@@ -18,7 +18,7 @@
  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/lbl/os-sunos4.h,v 1.32.1.1 1999/10/07 23:46:41 mcr Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/lbl/os-sunos4.h,v 1.32 1999-10-07 23:46:41 mcr Exp $ (LBL)
  */
 
 /* Prototypes missing in SunOS 4 */
diff --git a/lbl/os-ultrix4.h b/lbl/os-ultrix4.h
index bd931b3..9f2a155 100644
--- a/lbl/os-ultrix4.h
+++ b/lbl/os-ultrix4.h
@@ -18,7 +18,7 @@
  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/lbl/os-ultrix4.h,v 1.19.1.1 1999/10/07 23:46:41 mcr Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/lbl/os-ultrix4.h,v 1.19 1999-10-07 23:46:41 mcr Exp $ (LBL)
  */
 
 /* Prototypes missing in Ultrix 4 */
diff --git a/llc.h b/llc.h
index ffd3a60..b8c221f 100644
--- a/llc.h
+++ b/llc.h
@@ -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)
  */
 
 /*
diff --git a/missing/snprintf.c b/missing/snprintf.c
index 9c0a6ee..8991f24 100644
--- a/missing/snprintf.c
+++ b/missing/snprintf.c
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  */
 
-/* $Id: snprintf.c,v 1.1 2004/04/05 22:43:51 guy Exp $ */
+/* $Id: snprintf.c,v 1.1 2004-04-05 22:43:51 guy Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
@@ -39,7 +39,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-     "@(#) $Header: /tcpdump/master/libpcap/missing/snprintf.c,v 1.1 2004/04/05 22:43:51 guy Exp $";
+     "@(#) $Header: /tcpdump/master/libpcap/missing/snprintf.c,v 1.1 2004-04-05 22:43:51 guy Exp $";
 #endif
 
 #include <stdio.h>
diff --git a/mkdep b/mkdep
index 2a9c221..bfe4a26 100755
--- a/mkdep
+++ b/mkdep
@@ -13,11 +13,12 @@
 #	@(#)mkdep.sh	5.11 (Berkeley) 5/5/88
 #
 
-PATH=/bin:/usr/bin:/usr/ucb:/usr/local:/usr/local/bin
+PATH=/bin:/usr/bin:/usr/ucb:/usr/local:/usr/local/bin:/usr/sfw/bin
 export PATH
 
 MAKE=Makefile			# default makefile name is "Makefile"
 CC=cc				# default C compiler is "cc"
+DEPENDENCY_CFLAG=-M		# default dependency-generation flag is -M
 
 while :
 	do case "$1" in
@@ -31,6 +32,11 @@
 			MAKE=$2
 			shift; shift ;;
 
+		# -m allows you to specify the dependency-generation flag
+		-m)
+			DEPENDENCY_CFLAG=$2
+			shift; shift ;;
+
 		# the -p flag produces "program: program.c" style dependencies
 		# so .o's don't get produced
 		-p)
@@ -42,7 +48,7 @@
 done
 
 if [ $# = 0 ] ; then
-	echo 'usage: mkdep [-p] [-c cc] [-f makefile] [flags] file ...'
+	echo 'usage: mkdep [-p] [-c cc] [-f makefile] [-m dependency-cflag] [flags] file ...'
 	exit 1
 fi
 
@@ -74,7 +80,7 @@
 # sed -e 's/:[^"]*"\([^"]*\)".*/: \1/' -e 's/\.c/.o/' |
 
 # XXX this doesn't work with things like "-DDECLWAITSTATUS=union\ wait"
-$CC -M $* |
+$CC $DEPENDENCY_CFLAG $* |
 sed "
 	s; \./; ;g
 	$SED" |
diff --git a/msdos/bin2c.c b/msdos/bin2c.c
new file mode 100644
index 0000000..d82056e
--- /dev/null
+++ b/msdos/bin2c.c
@@ -0,0 +1,43 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <stdarg.h>

+#include <time.h>

+

+static void Abort (char *fmt,...)

+{

+  va_list args;

+  va_start (args, fmt);

+  vfprintf (stderr, fmt, args);

+  va_end (args);

+  exit (1);

+}

+

+int main (int argc, char **argv)

+{

+  FILE  *inFile;

+  FILE  *outFile = stdout;

+  time_t now     = time (NULL);

+  int    ch, i;

+

+  if (argc != 2)

+     Abort ("Usage: %s bin-file [> result]", argv[0]);

+

+  if ((inFile = fopen(argv[1],"rb")) == NULL)

+     Abort ("Cannot open %s\n", argv[1]);

+

+  fprintf (outFile,

+           "/* data statements for file %s at %.24s */\n"

+           "/* Generated by BIN2C, G.Vanem 1995 */\n",

+           argv[1], ctime(&now));

+

+  i = 0;

+  while ((ch = fgetc(inFile)) != EOF)

+  {

+    if (i++ % 12 == 0)

+       fputs ("\n  ", outFile);

+    fprintf (outFile, "0x%02X,", ch);

+  }

+  fputc ('\n', outFile);

+  fclose (inFile);

+  return (0);

+}

diff --git a/msdos/common.dj b/msdos/common.dj
new file mode 100644
index 0000000..3f64d14
--- /dev/null
+++ b/msdos/common.dj
@@ -0,0 +1,80 @@
+#
+# Common defines for libpcap and 16/32-bit network drivers (djgpp)
+#
+# @(#) $Header: /tcpdump/master/libpcap/msdos/common.dj,v 1.2 2004-12-19 19:36:33 guy Exp $ (LBL)
+
+.SUFFIXES: .exe .wlm .dxe .l .y
+.PHONY:    check_gcclib
+
+default: check_gcclib all
+
+GCCLIB   = /djgpp/lib/gcc-lib/djgpp/3.31
+MAKEFILE = Makefile.dj
+
+#
+# DLX 2.91+ lib. Change path to suite.
+# Not used anymore. Uses DXE3 now.
+#
+# DLX_LIB  = $(DJDIR)/contrib/dlx.291/libdlx.a
+# DLX_LINK = $(DJDIR)/bin/dlxgen.exe
+
+WATT32_ROOT = $(subst \,/,$(WATT_ROOT))
+
+
+ifeq ($(wildcard $(GCCLIB)/libgcc.a),)
+check_gcclib:
+	@echo libgcc.a not found. Set \"$(GCCLIB)\" to \"/djgpp/lib/gcc-lib/djgpp/3.X\"
+endif
+
+
+#
+# Include 32-bit driver support
+#
+USE_32BIT_DRIVERS = 0
+
+#
+# Use loadable driver modules instead of statically linking
+# all drivers.
+#
+USE_32BIT_MODULES = 0
+
+#
+# Put interrupt sensitive code/data in locked sections
+# Do `make clean' in all affected directories after changing this.
+#
+USE_SECTION_LOCKING = 0
+
+#
+# Set to 1 to use exception handler lib (only for me)
+#
+USE_EXCEPT = 0
+
+CC   = gcc.exe
+LD   = ld.exe
+ASM  = nasm.exe -fbin -dDEBUG
+YACC = bison.exe
+LEX  = flex.exe
+
+CFLAGS = -g -gcoff -O2 -Wall -I. -I$(WATT32_ROOT)/inc
+
+ifeq ($(USE_EXCEPT),1)
+  CFLAGS += -DUSE_EXCEPT
+  EXC_LIB = d:/prog/mw/except/lib/libexc.a
+endif
+
+ifeq ($(USE_SECTION_LOCKING),1)
+  CFLAGS += -DUSE_SECTION_LOCKING
+endif
+
+ifeq ($(USE_32BIT_DRIVERS),1)
+  CFLAGS += -DUSE_32BIT_DRIVERS
+endif
+
+%.o: %.c
+	$(CC) -c $(CFLAGS) $<
+	@echo
+
+%.o: %.s
+	$(CC) -c $(CFLAGS) -x assembler-with-cpp -o $@ $<
+	@echo
+
diff --git a/msdos/makefile b/msdos/makefile
new file mode 100644
index 0000000..cdb4e7c
--- /dev/null
+++ b/msdos/makefile
@@ -0,0 +1,184 @@
+#

+#  Makefile for dos-libpcap. NB. This makefile requires a Borland

+#  compatible make tool.

+#

+#  Targets:

+#    Borland C 4.0+      (DOS large model)

+#    Metaware HighC 3.3+ (PharLap 386|DosX)

+#

+

+.AUTODEPEND

+.SWAP

+

+!if "$(WATT_ROOT)" == ""

+!error Environment variable "WATT_ROOT" not set.

+!endif

+

+WATT_INC = $(WATT_ROOT)\inc

+

+DEFS   = -DMSDOS -DDEBUG -DNDIS_DEBUG -D_U_= -Dinline= \

+         -DHAVE_STRERROR -DHAVE_LIMITS_H

+

+ASM    = tasm.exe -t -l -mx -m2 -DDEBUG

+

+SOURCE = grammar.c  scanner.c bpf_filt.c bpf_imag.c bpf_dump.c \

+         etherent.c gencode.c nametoad.c pcap-dos.c optimize.c \

+         savefile.c pcap.c inet.c msdos\ndis2.c msdos\pktdrvr.c \

+         missing\snprintf.c

+

+BORLAND_OBJ = $(SOURCE:.c=.obj) msdos\pkt_rx0.obj msdos\ndis_0.obj

+

+HIGHC_OBJ   = $(SOURCE:.c=.o32) msdos\pkt_rx0.o32

+

+all:

+            @echo Usage: make pcap_bc.lib or pcap_hc.lib

+

+

+pcap_bc.lib: bcc.arg $(BORLAND_OBJ) pcap_bc

+

+

+pcap_hc.lib: hc386.arg $(HIGHC_OBJ)

+            386lib $< @&&|

+               -nowarn -nobackup -twocase -replace $(HIGHC_OBJ)

+|

+

+pcap_bc:    $(BORLAND_OBJ)

+            @tlib pcap_bc.lib /C @&&|

+               -+$(**:.obj=-+)

+|

+

+.c.obj:

+            bcc.exe @bcc.arg -o$*.obj $*.c

+

+.c.o32:

+            hc386.exe @hc386.arg -o $*.o32 $*.c

+

+.asm.obj:

+            $(ASM) $*.asm, $*.obj

+

+.asm.o32:

+            $(ASM) -DDOSX=1 $*.asm, $*.o32

+

+scanner.c: scanner.l

+            flex -Ppcap_ -7 -oscanner.c scanner.l

+

+grammar.c tokdefs.h: grammar.y

+            bison --name-prefix=pcap_ --yacc --defines grammar.y

+            - @del grammar.c

+            - @del tokdefs.h

+            ren y_tab.c grammar.c

+            ren y_tab.h tokdefs.h

+

+bcc.arg:    msdos\Makefile

+            @copy &&|

+              $(DEFS) -ml -c -v -3 -O2 -po -RT- -w-

+              -I$(WATT_INC) -I. -I.\msdos\pm_drvr -H=$(TEMP)\bcc.sym

+| $<

+

+hc386.arg:  msdos\Makefile

+            @copy &&|

+            # -DUSE_32BIT_DRIVERS

+              $(DEFS) -DDOSX=1 -w3 -c -g -O5

+              -I$(WATT_INC) -I. -I.\msdos\pm_drvr

+              -Hsuffix=.o32

+              -Hnocopyr

+              -Hpragma=Offwarn(491,553,572)

+              -Hon=Recognize_library  # make memcpy/strlen etc. inline

+              -Hoff=Behaved           # turn off some optimiser warnings

+| $<

+

+clean:

+            @del *.obj

+            @del *.o32

+            @del *.lst

+            @del *.map

+            @del bcc.arg

+            @del hc386.arg

+            @del grammar.c

+            @del tokdefs.h

+            @del scanner.c

+            @echo Cleaned

+

+#

+# dependencies

+#             

+pkt_rx0.obj:  msdos\pkt_rx0.asm

+

+bpf_filt.obj: bpf_filt.c pcap-int.h pcap.h pcap-bpf.h gnuc.h

+

+bpf_imag.obj: bpf_imag.c pcap-int.h pcap.h pcap-bpf.h

+

+bpf_dump.obj: bpf_dump.c pcap.h pcap-bpf.h

+

+etherent.obj: etherent.c pcap-int.h pcap.h pcap-bpf.h pcap-namedb.h

+

+optimize.obj: optimize.c pcap-int.h pcap.h pcap-bpf.h gencode.h

+

+savefile.obj: savefile.c pcap-int.h pcap.h pcap-bpf.h

+

+pcap.obj: pcap.c pcap-dos.h pcap-int.h pcap.h pcap-bpf.h

+

+inet.obj: inet.c pcap-int.h pcap.h pcap-bpf.h

+

+grammar.obj: grammar.c pcap-int.h pcap.h pcap-bpf.h gencode.h \

+  pf.h pcap-namedb.h

+

+scanner.obj: scanner.c pcap-int.h pcap.h pcap-bpf.h gencode.h \

+  pcap-namedb.h tokdefs.h

+

+gencode.obj: gencode.c pcap-dos.h pcap-int.h pcap.h pcap-bpf.h \

+  ethertype.h nlpid.h llc.h gencode.h atmuni31.h sunatmpos.h ppp.h sll.h \

+  arcnet.h pf.h pcap-namedb.h

+

+nametoad.obj: nametoad.c pcap-int.h pcap.h pcap-bpf.h gencode.h \

+  pcap-namedb.h ethertype.h

+

+pcap-dos.obj: pcap-dos.c pcap.h pcap-bpf.h pcap-dos.h pcap-int.h \

+  msdos\pktdrvr.h

+

+pktdrvr.obj: msdos\pktdrvr.c gnuc.h pcap-dos.h pcap-int.h \

+  pcap.h pcap-bpf.h msdos\pktdrvr.h msdos\pkt_stub.inc

+

+ndis2.obj: msdos\ndis2.c pcap-dos.h pcap-int.h pcap.h pcap-bpf.h \

+  msdos\ndis2.h

+

+pkt_rx0.o32:  msdos\pkt_rx0.asm

+

+bpf_filt.o32: bpf_filt.c pcap-int.h pcap.h pcap-bpf.h gnuc.h

+

+bpf_imag.o32: bpf_imag.c pcap-int.h pcap.h pcap-bpf.h

+

+bpf_dump.o32: bpf_dump.c pcap.h pcap-bpf.h

+

+etherent.o32: etherent.c pcap-int.h pcap.h pcap-bpf.h pcap-namedb.h

+

+optimize.o32: optimize.c pcap-int.h pcap.h pcap-bpf.h gencode.h

+

+savefile.o32: savefile.c pcap-int.h pcap.h pcap-bpf.h

+

+pcap.o32: pcap.c pcap-dos.h pcap-int.h pcap.h pcap-bpf.h

+

+inet.o32: inet.c pcap-int.h pcap.h pcap-bpf.h

+

+grammar.o32: grammar.c pcap-int.h pcap.h pcap-bpf.h gencode.h \

+  pf.h pcap-namedb.h

+

+scanner.o32: scanner.c pcap-int.h pcap.h pcap-bpf.h gencode.h \

+  pcap-namedb.h tokdefs.h

+

+gencode.o32: gencode.c pcap-dos.h pcap-int.h pcap.h pcap-bpf.h \

+  ethertype.h nlpid.h llc.h gencode.h atmuni31.h sunatmpos.h ppp.h sll.h \

+  arcnet.h pf.h pcap-namedb.h

+

+nametoad.o32: nametoad.c pcap-int.h pcap.h pcap-bpf.h gencode.h \

+  pcap-namedb.h ethertype.h

+

+pcap-dos.o32: pcap-dos.c pcap.h pcap-bpf.h pcap-dos.h pcap-int.h \

+  msdos\pktdrvr.h

+

+pktdrvr.o32: msdos\pktdrvr.c gnuc.h pcap-dos.h pcap-int.h \

+  pcap.h pcap-bpf.h msdos\pktdrvr.h msdos\pkt_stub.inc

+

+ndis2.o32: msdos\ndis2.c pcap-dos.h pcap-int.h pcap.h pcap-bpf.h \

+  msdos\ndis2.h

+

diff --git a/msdos/makefile.dj b/msdos/makefile.dj
new file mode 100644
index 0000000..7ce58b4
--- /dev/null
+++ b/msdos/makefile.dj
@@ -0,0 +1,152 @@
+#
+# GNU Makefile for DOS-libpcap. djgpp version.
+#
+# Use this makefile from the libpcap root directory.
+# E.g. like this:
+#
+#  c:\net\pcap> make -f msdos/makefile.dj
+#
+# @(#) $Header: /tcpdump/master/libpcap/msdos/makefile.dj,v 1.2 2004-12-19 19:41:06 guy Exp $ (LBL)
+
+VPATH = missing msdos
+
+PREREQUISITES = scanner.c grammar.c tokdefs.h version.h msdos/pkt_stub.inc
+
+include msdos/common.dj
+
+DRIVER_DIR = ./msdos/pm_drvr
+
+CFLAGS += -DDEBUG -DNDIS_DEBUG -DHAVE_LIMITS_H -DHAVE_STRERROR \
+          -D_U_='__attribute__((unused))' -DHAVE_VERSION_H
+
+# CFLAGS += -Dyylval=pcap_lval -DBDEBUG -DNDEBUG
+
+SOURCES = grammar.c scanner.c bpf_filt.c bpf_imag.c bpf_dump.c   \
+          etherent.c gencode.c nametoad.c pcap-dos.c optimize.c  \
+          savefile.c pcap.c inet.c msdos\pktdrvr.c msdos/ndis2.c \
+          missing/snprintf.c
+
+OBJECTS = $(notdir $(SOURCES:.c=.o))
+TEMPBIN = tmp.bin
+
+ifeq ($(USE_32BIT_DRIVERS),1)
+  PM_OBJECTS = $(addprefix $(DRIVER_DIR)/, \
+                 printk.o pci.o pci-scan.o bios32.o dma.o irq.o intwrap.o \
+                 lock.o kmalloc.o quirks.o timer.o net_init.o)
+  #
+  # Static link of drivers
+  #
+  ifeq ($(USE_32BIT_MODULES),0)
+    PM_OBJECTS += $(addprefix $(DRIVER_DIR)/, \
+                    accton.o 8390.o 3c503.o 3c509.o 3c59x.o 3c515.o \
+                    3c575_cb.o 3c90x.o ne.o wd.o cs89x0.o rtl8139.o)
+  endif
+endif
+
+all: libpcap.a
+
+ifeq ($(USE_32BIT_DRIVERS),1)
+$(PM_OBJECTS):
+	$(MAKE) -f Makefile.dj -C $(DRIVER_DIR) $(notdir $@)
+endif
+
+libpcap.a: version.h $(OBJECTS) $(PM_OBJECTS)
+	rm -f $@
+	ar rs $@ $^
+
+msdos/pkt_stub.inc: msdos/bin2c.exe msdos/pkt_rx1.S
+	$(ASM) -o $(TEMPBIN) -lmsdos/pkt_rx1.lst msdos/pkt_rx1.S
+	./msdos/bin2c $(TEMPBIN) > $@
+	rm -f $(TEMPBIN)
+
+grammar.c tokdefs.h: grammar.y
+	rm -f grammar.c tokdefs.h
+	$(YACC) --name-prefix=pcap_ --yacc --defines grammar.y
+	mv -f y_tab.c grammar.c
+	mv -f y_tab.h tokdefs.h
+
+version.h: ./VERSION
+	@echo '/* Generated from VERSION. Do not edit */' > $@
+	sed -e 's/.*/static char pcap_version_string[] = "libpcap (&)";/' ./VERSION >> $@
+
+scanner.c: scanner.l
+	$(LEX) -Ppcap_ -7 -t $^ > $@
+	@echo
+
+msdos/bin2c.exe: msdos/bin2c.c
+	$(CC) $*.c -o $*.exe
+
+clean:
+	$(MAKE) -f Makefile.dj -C $(DRIVER_DIR) clean
+	$(MAKE) -f Makefile.dj -C libcpcap clean
+	rm -f $(OBJECTS) msdos/pkt_rx1.lst Makefile.bak $(PREREQUISITES)
+
+vclean: clean
+	rm -f libpcap.a msdos/bin2c.exe
+
+#
+# Generated dependencies; Due to some hacks in gcc 2.95 and djgpp 2.03
+# we must prevent "$(DJDIR)/bin/../include/sys/version.h" from beeing
+# included in dependency output (or else this makefile cannot be used on
+# another machine). We therefore use a special 'specs' file during
+# pre-processing.
+#
+MM_SPECS = specs.tmp
+MAKEFILE = msdos/Makefile.dj
+
+depend: $(PREREQUISITES)
+	@echo Generating dependencies..
+	@cp $(MAKEFILE) Makefile.bak
+	@echo "*cpp: %(cpp_cpu) %{posix:-D_POSIX_SOURCE} -remap" > $(MM_SPECS)
+	sed -e "/^# DO NOT DELETE THIS LINE/,$$d" < Makefile.bak > $(MAKEFILE)
+	echo "# DO NOT DELETE THIS LINE"                        >> $(MAKEFILE)
+	$(CC) -MM -specs=$(MM_SPECS) $(CFLAGS) $(SOURCES)       >> $(MAKEFILE)
+	rm -f $(MM_SPECS)
+
+#
+# Manually generated dependencies
+#             
+msdos/pktdrvr.c: msdos/pkt_stub.inc
+scanner.c: scanner.l
+grammar.c tokdefs.h: grammar.y
+grammar.h: grammar.y
+scanner.l: pcap-int.h pcap-namedb.h gencode.h grammar.h gnuc.h
+grammar.y: pcap-int.h gencode.h pcap-namedb.h gnuc.h
+
+#
+# Automatically generated dependencies
+#
+# DO NOT DELETE THIS LINE
+grammar.o: grammar.c pcap-int.h pcap.h pcap-bpf.h gencode.h pf.h \
+  pcap-namedb.h
+scanner.o: scanner.c pcap-int.h pcap.h pcap-bpf.h gencode.h pcap-namedb.h \
+  tokdefs.h
+bpf_filt.o: bpf_filt.c pcap-int.h pcap.h pcap-bpf.h gnuc.h
+bpf_imag.o: bpf_imag.c pcap-int.h pcap.h pcap-bpf.h
+bpf_dump.o: bpf_dump.c pcap.h pcap-bpf.h
+etherent.o: etherent.c pcap-int.h pcap.h pcap-bpf.h pcap-namedb.h
+gencode.o: gencode.c pcap-dos.h msdos/pm_drvr/lock.h pcap-int.h pcap.h \
+  pcap-bpf.h ethertype.h nlpid.h llc.h gencode.h atmuni31.h sunatmpos.h \
+  ppp.h sll.h arcnet.h pf.h pcap-namedb.h
+nametoad.o: nametoad.c pcap-int.h pcap.h pcap-bpf.h gencode.h \
+  pcap-namedb.h ethertype.h
+pcap-dos.o: pcap-dos.c msdos/pm_drvr/pmdrvr.h msdos/pm_drvr/iface.h \
+  msdos/pm_drvr/lock.h msdos/pm_drvr/ioport.h pcap-dos.h pcap-int.h \
+  pcap.h pcap-bpf.h msdos/pm_drvr/kmalloc.h msdos/pm_drvr/bitops.h \
+  msdos/pm_drvr/timer.h msdos/pm_drvr/dma.h msdos/pm_drvr/irq.h \
+  msdos/pm_drvr/printk.h msdos/pm_drvr/pci.h msdos/pm_drvr/bios32.h \
+  msdos/pm_drvr/module.h msdos/pm_drvr/3c501.h msdos/pm_drvr/3c503.h \
+  msdos/pm_drvr/3c509.h msdos/pm_drvr/3c59x.h msdos/pm_drvr/3c515.h \
+  msdos/pm_drvr/3c90x.h msdos/pm_drvr/3c575_cb.h msdos/pm_drvr/ne.h \
+  msdos/pm_drvr/wd.h msdos/pm_drvr/accton.h msdos/pm_drvr/cs89x0.h \
+  msdos/pm_drvr/rtl8139.h msdos/pm_drvr/ne2k-pci.h msdos/pktdrvr.h
+optimize.o: optimize.c pcap-int.h pcap.h pcap-bpf.h gencode.h
+savefile.o: savefile.c pcap-int.h pcap.h pcap-bpf.h
+pcap.o: pcap.c pcap-dos.h msdos/pm_drvr/lock.h pcap-int.h pcap.h \
+  pcap-bpf.h
+inet.o: inet.c pcap-int.h pcap.h pcap-bpf.h
+pktdrvr.o: msdos/pktdrvr.c gnuc.h pcap-dos.h msdos/pm_drvr/lock.h \
+  pcap-int.h pcap.h pcap-bpf.h msdos/pktdrvr.h msdos/pkt_stub.inc
+ndis2.o: msdos/ndis2.c pcap-dos.h msdos/pm_drvr/lock.h pcap-int.h pcap.h \
+  pcap-bpf.h msdos/ndis2.h
+snprintf.o: missing/snprintf.c pcap-int.h pcap.h pcap-bpf.h
diff --git a/msdos/makefile.wc b/msdos/makefile.wc
new file mode 100644
index 0000000..e0d5672
--- /dev/null
+++ b/msdos/makefile.wc
@@ -0,0 +1,131 @@
+#

+#  Watcom Makefile for dos-libpcap.

+#

+# Specify MODEL = `3r' or `3s'

+# Specify TARGET = `pharlap' or `dos4g'

+#

+# Use this makefile from the libpcap root directory.

+# E.g. like this:

+#

+#  c:\net\pcap> wmake -f msdos\makefile.wc

+#

+

+MODEL  = 3s

+TARGET = dos4g

+

+OBJDIR = msdos\$(TARGET).w$(MODEL)

+LIB    = $(OBJDIR)\pcap.lib

+

+.EXTENSIONS: .l .y

+

+DEFS = -dDEBUG -dNDIS_DEBUG -d_U_= -dHAVE_LIMITS_H -dHAVE_STRERROR &

+       -dHAVE_SNPRINTF -dHAVE_VSNPRINTF

+

+CC  = wcc386.exe

+ASM = wasm.exe -$(MODEL) $(DEFS) -dDOSX -dDOS4GW -zq -bt=dos -fr=nul -d3 -s

+

+OBJS = $(OBJDIR)\grammar.obj  $(OBJDIR)\scanner.obj  $(OBJDIR)\pcap.obj     &

+       $(OBJDIR)\bpf_filt.obj $(OBJDIR)\bpf_imag.obj $(OBJDIR)\bpf_dump.obj &

+       $(OBJDIR)\etherent.obj $(OBJDIR)\gencode.obj  $(OBJDIR)\nametoad.obj &

+       $(OBJDIR)\pcap-dos.obj $(OBJDIR)\pktdrvr.obj  $(OBJDIR)\optimize.obj &

+       $(OBJDIR)\savefile.obj $(OBJDIR)\inet.obj     $(OBJDIR)\ndis2.obj

+

+CFLAGS = $(DEFS) $(YYDEFS) -I. -I$(%watt_root)\inc -I.\msdos\pm_drvr &

+         -$(MODEL) -mf -zff -zgf -zq -bt=dos -fr=nul -w6 -fpi        &

+         -oilrtf -zm

+

+TEMPBIN = tmp.bin

+

+all: $(OBJDIR) $(OBJDIR)\pcap.lib

+

+$(OBJDIR):

+          - mkdir $(OBJDIR)

+

+$(OBJDIR)\pcap.lib: $(OBJS) wlib.arg

+          wlib -q -b -c $(OBJDIR)\pcap.lib @wlib.arg

+

+wlib.arg: msdos\makefile.wc

+          %create $^@

+          for %f in ($(OBJS)) do %append $^@ +- %f

+

+$(OBJDIR)\pktdrvr.obj: msdos\pkt_stub.inc msdos\pktdrvr.c gnuc.h &

+  pcap-dos.h pcap-int.h pcap.h msdos\pktdrvr.h

+          *$(CC) $(CFLAGS) msdos\pktdrvr.c -fo=$@

+

+$(OBJDIR)\ndis2.obj: msdos\ndis2.c

+          *$(CC) $(CFLAGS) msdos\ndis2.c -fo=$@

+

+.ERASE

+.c{$(OBJDIR)}.obj:

+          *$(CC) $(CFLAGS) $[@ -fo=$@

+

+grammar.c tokdefs.h: grammar.y 

+          bison --name-prefix=pcap_ --yacc --defines $[@

+          - @del grammar.c

+          - @del tokdefs.h

+          ren y_tab.c grammar.c

+          ren y_tab.h tokdefs.h

+

+scanner.c: scanner.l

+          flex -Ppcap_ -7 -o$@ $[@

+

+msdos\pkt_stub.inc: bin2c.exe msdos\pkt_rx1.S

+          nasm -fbin -dDEBUG -o $(TEMPBIN) -lmsdos\pkt_rx1.lst msdos\pkt_rx1.S

+          bin2c.exe  $(TEMPBIN) > $@

+          @del $(TEMPBIN)

+

+bin2c.exe: msdos\bin2c.c

+          wcl $[@

+

+clean realclean vclean: .SYMBOLIC

+          for %f in (dos4g.w3r dos4g.w3s pharlap.w3r pharlap.w3s) do &

+            @del %f\*.obj

+          @del grammar.c

+          @del tokdefs.h

+          @del scanner.c

+          @del bin2c.exe

+          @del bin2c.obj

+          @del msdos\pkt_stub.inc

+          @echo Cleaned

+

+#

+# dependencies

+#                     

+$(OBJDIR)\bpf_filt.obj: bpf_filt.c pcap-int.h pcap.h pcap-bpf.h gnuc.h

+

+$(OBJDIR)\bpf_imag.obj: bpf_imag.c pcap-int.h pcap.h pcap-bpf.h

+

+$(OBJDIR)\bpf_dump.obj: bpf_dump.c pcap.h pcap-bpf.h

+

+$(OBJDIR)\etherent.obj: etherent.c pcap-int.h pcap.h pcap-bpf.h pcap-nam.h

+

+$(OBJDIR)\optimize.obj: optimize.c pcap-int.h pcap.h pcap-bpf.h gencode.h

+

+$(OBJDIR)\savefile.obj: savefile.c pcap-int.h pcap.h pcap-bpf.h

+

+$(OBJDIR)\pcap.obj: pcap.c pcap-dos.h pcap-int.h pcap.h pcap-bpf.h

+

+$(OBJDIR)\inet.obj: inet.c pcap-int.h pcap.h pcap-bpf.h

+

+$(OBJDIR)\grammar.obj: grammar.c pcap-int.h pcap.h pcap-bpf.h gencode.h &

+  pf.h pcap-nam.h

+

+$(OBJDIR)\scanner.obj: scanner.c pcap-int.h pcap.h pcap-bpf.h gencode.h &

+  pcap-nam.h tokdefs.h

+

+$(OBJDIR)\gencode.obj: gencode.c pcap-dos.h pcap-int.h pcap.h pcap-bpf.h &

+  ethertyp.h nlpid.h llc.h gencode.h atmuni31.h sunatmpo.h ppp.h sll.h &

+  arcnet.h pf.h pcap-nam.h

+

+$(OBJDIR)\nametoad.obj: nametoad.c pcap-int.h pcap.h pcap-bpf.h gencode.h &

+  pcap-nam.h ethertyp.h

+

+$(OBJDIR)\pcap-dos.obj: pcap-dos.c pcap.h pcap-bpf.h pcap-dos.h pcap-int.h &

+  msdos\pktdrvr.h

+

+$(OBJDIR)\pktdrvr.obj: msdos\pktdrvr.c gnuc.h pcap-dos.h pcap-int.h &

+  pcap.h pcap-bpf.h msdos\pktdrvr.h msdos\pkt_stub.inc

+

+$(OBJDIR)\ndis2.obj: msdos\ndis2.c pcap-dos.h pcap-int.h pcap.h pcap-bpf.h &

+  msdos\ndis2.h

+

diff --git a/msdos/ndis2.c b/msdos/ndis2.c
new file mode 100644
index 0000000..0a5ea2a
--- /dev/null
+++ b/msdos/ndis2.c
@@ -0,0 +1,860 @@
+/* 

+ * Copyright (c) 1993,1994

+ *      Texas A&M University.  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. All advertising materials mentioning features or use of this software

+ *    must display the following acknowledgement:

+ *      This product includes software developed by Texas A&M University

+ *      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 UNIVERSITY 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 UNIVERSITY 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.

+ *

+ * Developers:

+ *             David K. Hess, Douglas Lee Schales, David R. Safford

+ *

+ * Heavily modified for Metaware HighC + GNU C 2.8+

+ *             Gisle Vanem 1998

+ */

+

+#include <stdio.h>

+#include <stdlib.h>

+#include <dos.h>

+#include <io.h>

+#include <fcntl.h>

+#include <malloc.h>

+#include <string.h>

+

+#include "pcap-dos.h"

+#include "pcap-int.h"

+#include "msdos/ndis2.h"

+

+#if defined(USE_NDIS2)

+

+/*

+ *  Packet buffer handling

+ */

+extern int     FreePktBuf  (PktBuf *buf);

+extern int     EnquePktBuf (PktBuf *buf);

+extern PktBuf* AllocPktBuf (void);

+

+/*

+ *  Various defines

+ */

+#define MAX_NUM_DEBUG_STRINGS 90

+#define DEBUG_STRING_LENGTH   80

+#define STACK_POOL_SIZE       6

+#define STACK_SIZE            256

+

+#define MEDIA_FDDI            1

+#define MEDIA_ETHERNET        2

+#define MEDIA_TOKEN           3

+

+static int     startDebug     = 0;

+static int     stopDebug      = 0;

+

+static DWORD   droppedPackets = 0L;

+static WORD    frameSize      = 0;

+static WORD    headerSize     = 0;

+static int     mediaType      = 0;

+static char   *lastErr        = NULL;

+

+static BYTE    debugStrings [MAX_NUM_DEBUG_STRINGS][DEBUG_STRING_LENGTH];

+static BYTE   *freeStacks   [STACK_POOL_SIZE];

+static int     freeStackPtr = STACK_POOL_SIZE - 1;

+

+static ProtMan protManEntry = NULL;

+static WORD    protManDS    = 0;

+static volatile int xmitPending;

+

+static struct _PktBuf        *txBufPending;

+static struct _CardHandle    *handle;

+static struct _CommonChars    common;

+static struct _ProtocolChars  protChars;

+static struct _ProtDispatch   lowerTable;

+

+static struct _FailingModules failingModules;

+static struct _BindingsList   bindings;

+

+static struct {

+         WORD  err_num;

+         char *err_text;

+       } ndis_errlist[] = {

+

+  { ERR_SUCCESS,

+    "The function completed successfully.\n"  },

+

+  { ERR_WAIT_FOR_RELEASE,

+    "The ReceiveChain completed successfully but the protocol has\n"

+    "retained control of the buffer.\n"  },

+

+  { ERR_REQUEST_QUEUED,

+    "The current request has been queued.\n"  },

+

+  { ERR_FRAME_NOT_RECOGNIZED,

+    "Frame not recognized.\n"  },

+

+  { ERR_FRAME_REJECTED,

+    "Frame was discarded.\n"  },

+

+  { ERR_FORWARD_FRAME,

+    "Protocol wishes to forward frame to another protocol.\n"  },

+

+  { ERR_OUT_OF_RESOURCE,

+    "Out of resource.\n"  },

+

+  { ERR_INVALID_PARAMETER,

+    "Invalid parameter.\n"  },

+

+  { ERR_INVALID_FUNCTION,

+    "Invalid function.\n"  },

+

+  { ERR_NOT_SUPPORTED,

+    "Not supported.\n"  },

+

+  { ERR_HARDWARE_ERROR,

+    "Hardware error.\n"  },

+

+  { ERR_TRANSMIT_ERROR,

+    "The packet was not transmitted due to an error.\n"  },

+

+  { ERR_NO_SUCH_DESTINATION,

+    "Token ring packet was not recognized when transmitted.\n"  },

+

+  { ERR_BUFFER_TOO_SMALL,

+    "Provided buffer was too small.\n"  },

+

+  { ERR_ALREADY_STARTED,

+    "Network drivers already started.\n"  },

+

+  { ERR_INCOMPLETE_BINDING,

+    "Protocol driver could not complete its bindings.\n"  },

+

+  { ERR_DRIVER_NOT_INITIALIZED,

+    "MAC did not initialize properly.\n"  },

+

+  { ERR_HARDWARE_NOT_FOUND,

+    "Hardware not found.\n"  },

+

+  { ERR_HARDWARE_FAILURE,

+    "Hardware failure.\n"  },

+

+  { ERR_CONFIGURATION_FAILURE,

+    "Configuration failure.\n"  },

+

+  { ERR_INTERRUPT_CONFLICT,

+    "Interrupt conflict.\n"  },

+

+  { ERR_INCOMPATIBLE_MAC,

+    "The MAC is not compatible with the protocol.\n"  },

+

+  { ERR_INITIALIZATION_FAILED,

+    "Initialization failed.\n"  },

+

+  { ERR_NO_BINDING,

+    "Binding did not occur.\n"  },

+

+  { ERR_NETWORK_MAY_NOT_BE_CONNECTED,

+    "The network may not be connected to the adapter.\n"  },

+

+  { ERR_INCOMPATIBLE_OS_VERSION,

+    "The version of the operating system is incompatible with the protocol.\n"  },

+

+  { ERR_ALREADY_REGISTERED,

+    "The protocol is already registered.\n"  },

+

+  { ERR_PATH_NOT_FOUND,

+    "PROTMAN.EXE could not be found.\n"  },

+

+  { ERR_INSUFFICIENT_MEMORY,

+    "Insufficient memory.\n"  },

+

+  { ERR_INFO_NOT_FOUND,

+    "Protocol Mananger info structure is lost or corrupted.\n"  },

+

+  { ERR_GENERAL_FAILURE,

+    "General failure.\n"  }

+};

+

+/*

+ *  Some handy macros

+ */       

+#define PERROR(str)    printf("%s (%d): %s\n", __FILE__,__LINE__,str)

+#define DEBUG_RING()   (debugStrings[stopDebug+1 == MAX_NUM_DEBUG_STRINGS ? \

+                        stopDebug = 0 : ++stopDebug])

+

+/*

+ * needs rewrite for DOSX

+ */

+#define MAC_DISPATCH(hnd)  ((struct _MacUpperDispatch*)(hnd)->common->upperDispatchTable)

+#define MAC_STATUS(hnd)    ((struct _MacStatusTable*)  (hnd)->common->serviceStatus)

+#define MAC_CHAR(hnd)      ((struct _MacChars*)        (hnd)->common->serviceChars)

+

+#ifdef NDIS_DEBUG

+  #define DEBUG0(str)      printf (str)

+  #define DEBUG1(fmt,a)    printf (fmt,a)

+  #define DEBUG2(fmt,a,b)  printf (fmt,a,b)

+  #define TRACE0(str)      sprintf (DEBUG_RING(),str)

+  #define TRACE1(fmt,a)    sprintf (DEBUG_RING(),fmt,a)

+#else

+  #define DEBUG0(str)      ((void)0)

+  #define DEBUG1(fmt,a)    ((void)0)

+  #define DEBUG2(fmt,a,b)  ((void)0)

+  #define TRACE0(str)      ((void)0)

+  #define TRACE1(fmt,a)    ((void)0)

+#endif

+

+/*

+ * This routine is called from both threads

+ */

+void NdisFreeStack (BYTE *aStack)

+{

+  GUARD();

+

+  if (freeStackPtr == STACK_POOL_SIZE - 1)

+     PERROR ("tried to free too many stacks");

+

+  freeStacks[++freeStackPtr] = aStack;

+

+  if (freeStackPtr == 0)

+     TRACE0 ("freeStackPtr went positive\n");

+

+  UNGUARD();

+}

+

+/*

+ * This routine is called from callbacks to allocate local data

+ */

+BYTE *NdisAllocStack (void)

+{

+  BYTE *stack;

+

+  GUARD();

+

+  if (freeStackPtr < 0)

+  {

+    /* Ran out of stack buffers. Return NULL which will start

+     * dropping packets

+     */

+    TRACE0 ("freeStackPtr went negative\n");

+    stack = 0;

+  }

+  else

+    stack = freeStacks[freeStackPtr--];

+

+  UNGUARD();

+  return (stack);

+}

+

+CALLBACK (NdisSystemRequest (DWORD param1, DWORD param2, WORD param3,

+                             WORD opcode, WORD targetDS))

+{

+  static int            bindEntry = 0;

+  struct _CommonChars  *macCommon;

+  volatile WORD result;

+

+  switch (opcode)

+  {

+    case REQ_INITIATE_BIND:

+         macCommon = (struct _CommonChars*) param2;

+         if (macCommon == NULL)

+	 {

+           printf ("There is an NDIS misconfiguration.\n");

+           result = ERR_GENERAL_FAILURE;

+	   break;

+	 }

+         DEBUG2 ("module name %s\n"

+                 "module type %s\n",

+                 macCommon->moduleName,

+                 ((MacChars*) macCommon->serviceChars)->macName);

+

+         /* Binding to the MAC */

+         result = macCommon->systemRequest ((DWORD)&common, (DWORD)&macCommon,

+                                            0, REQ_BIND,

+                                            macCommon->moduleDS);

+

+         if (!strcmp(bindings.moduleName[bindEntry], handle->moduleName))

+              handle->common = macCommon;

+         else PERROR ("unknown module");

+         ++bindEntry;

+	 break;

+

+    case REQ_INITIATE_UNBIND:

+         macCommon = (struct _CommonChars*) param2;

+         result = macCommon->systemRequest ((DWORD)&common, 0,

+                                            0, REQ_UNBIND,

+                                            macCommon->moduleDS);

+         break;

+

+    default:

+         result = ERR_GENERAL_FAILURE;

+	 break;

+  }

+  ARGSUSED (param1);

+  ARGSUSED (param3);

+  ARGSUSED (targetDS);

+  return (result);

+}

+

+CALLBACK (NdisRequestConfirm (WORD protId, WORD macId,   WORD reqHandle,

+                              WORD status, WORD request, WORD protDS))

+{

+  ARGSUSED (protId);    ARGSUSED (macId);

+  ARGSUSED (reqHandle); ARGSUSED (status);

+  ARGSUSED (request);   ARGSUSED (protDS);

+  return (ERR_SUCCESS);

+}

+

+CALLBACK (NdisTransmitConfirm (WORD protId, WORD macId, WORD reqHandle,

+                               WORD status, WORD protDS))

+{

+  xmitPending--;

+  FreePktBuf (txBufPending);  /* Add passed ECB back to the free list */

+

+  ARGSUSED (reqHandle);

+  ARGSUSED (status);

+  ARGSUSED (protDS);

+  return (ERR_SUCCESS);

+}

+

+

+/*

+ * The primary function for receiving packets

+ */

+CALLBACK (NdisReceiveLookahead (WORD  macId,      WORD  frameSize,

+                                WORD  bytesAvail, BYTE *buffer,

+                                BYTE *indicate,   WORD  protDS))

+{

+  int     result;

+  PktBuf *pktBuf;

+  WORD    bytesCopied;

+  struct _TDBufDescr tDBufDescr;

+

+#if 0

+  TRACE1 ("lookahead length = %d, ", bytesAvail);

+  TRACE1 ("ecb = %08lX, ",          *ecb);

+  TRACE1 ("count = %08lX\n",         count);

+  TRACE1 ("offset = %08lX, ",        offset);

+  TRACE1 ("timesAllowed = %d, ",     timesAllowed);

+  TRACE1 ("packet size = %d\n",      look->dataLookAheadLen);

+#endif

+

+  /* Allocate a buffer for the packet

+   */

+  if ((pktBuf = AllocPktBuf()) == NULL)

+  {

+    droppedPackets++;

+    return (ERR_FRAME_REJECTED);

+  }

+

+  /*

+   * Now kludge things. Note we will have to undo this later. This will

+   * make the packet contiguous after the MLID has done the requested copy.

+   */

+

+  tDBufDescr.tDDataCount = 1;

+  tDBufDescr.tDBufDescrRec[0].tDPtrType = NDIS_PTR_PHYSICAL;

+  tDBufDescr.tDBufDescrRec[0].tDDataPtr = pktBuf->buffer;

+  tDBufDescr.tDBufDescrRec[0].tDDataLen = pktBuf->length;

+  tDBufDescr.tDBufDescrRec[0].dummy     = 0;

+

+  result = MAC_DISPATCH(handle)->transferData (&bytesCopied, 0, &tDBufDescr,

+                                               handle->common->moduleDS);

+  pktBuf->packetLength = bytesCopied;

+

+  if (result == ERR_SUCCESS)

+       EnquePktBuf(pktBuf);

+  else FreePktBuf (pktBuf);

+

+  ARGSUSED (frameSize);

+  ARGSUSED (bytesAvail);

+  ARGSUSED (indicate);

+  ARGSUSED (protDS);

+

+  return (ERR_SUCCESS);

+}

+

+CALLBACK (NdisIndicationComplete (WORD macId, WORD protDS))

+{

+  ARGSUSED (macId);

+  ARGSUSED (protDS);

+

+  /* We don't give a hoot about these. Just return

+   */

+  return (ERR_SUCCESS);

+}

+

+/*

+ * This is the OTHER way we may receive packets

+ */

+CALLBACK (NdisReceiveChain (WORD macId, WORD frameSize, WORD reqHandle,

+                            struct _RxBufDescr *rxBufDescr,

+                            BYTE *indicate, WORD protDS))

+{

+  struct _PktBuf *pktBuf;

+  int     i;

+

+  /*

+   * For now we copy the entire packet over to a PktBuf structure. This may be

+   * a performance hit but this routine probably isn't called very much, and

+   * it is a lot of work to do it otherwise. Also if it is a filter protocol

+   * packet we could end up sucking up MAC buffes.

+   */

+

+  if ((pktBuf = AllocPktBuf()) == NULL)

+  {

+    droppedPackets++;

+    return (ERR_FRAME_REJECTED);

+  }

+  pktBuf->packetLength = 0;

+

+  /* Copy the packet to the buffer

+   */

+  for (i = 0; i < rxBufDescr->rxDataCount; ++i)

+  {

+    struct _RxBufDescrRec *rxDescr = &rxBufDescr->rxBufDescrRec[i];

+

+    memcpy (pktBuf->buffer + pktBuf->packetLength,

+            rxDescr->rxDataPtr, rxDescr->rxDataLen);

+    pktBuf->packetLength += rxDescr->rxDataLen;

+  }

+

+  EnquePktBuf (pktBuf);

+

+  ARGSUSED (frameSize);

+  ARGSUSED (reqHandle);

+  ARGSUSED (indicate);

+  ARGSUSED (protDS);   

+

+  /* This frees up the buffer for the MAC to use

+   */

+  return (ERR_SUCCESS);

+}

+

+CALLBACK (NdisStatusProc (WORD macId,  WORD param1, BYTE *indicate,

+                          WORD opcode, WORD protDS))

+{

+  switch (opcode)

+  {

+    case STATUS_RING_STATUS:

+	 break;

+    case STATUS_ADAPTER_CHECK:

+	 break;

+    case STATUS_START_RESET:

+	 break;

+    case STATUS_INTERRUPT:

+	 break;

+    case STATUS_END_RESET:

+	 break;

+    default:

+	 break;

+  }

+  ARGSUSED (macId);

+  ARGSUSED (param1);

+  ARGSUSED (indicate);

+  ARGSUSED (opcode);

+  ARGSUSED (protDS);

+

+  /* We don't need to do anything about this stuff yet

+   */

+  return (ERR_SUCCESS);

+}

+

+/*

+ * Tell the NDIS driver to start the delivery of the packet

+ */

+int NdisSendPacket (struct _PktBuf *pktBuf, int macId)

+{ 

+  struct _TxBufDescr txBufDescr;

+  int     result;

+

+  xmitPending++;

+  txBufPending = pktBuf;    /* we only have 1 pending Tx at a time */

+

+  txBufDescr.txImmedLen  = 0;

+  txBufDescr.txImmedPtr  = NULL;

+  txBufDescr.txDataCount = 1;

+  txBufDescr.txBufDescrRec[0].txPtrType = NDIS_PTR_PHYSICAL;

+  txBufDescr.txBufDescrRec[0].dummy     = 0;

+  txBufDescr.txBufDescrRec[0].txDataLen = pktBuf->packetLength;

+  txBufDescr.txBufDescrRec[0].txDataPtr = pktBuf->buffer;

+

+  result = MAC_DISPATCH(handle)->transmitChain (common.moduleId,

+                                                pktBuf->handle,

+                                                &txBufDescr,

+                                                handle->common->moduleDS);

+  switch (result)

+  {

+    case ERR_OUT_OF_RESOURCE:

+         /* Note that this should not happen but if it does there is not

+          * much we can do about it

+          */

+         printf ("ERROR: transmit queue overflowed\n");

+         return (0);

+

+    case ERR_SUCCESS:

+         /* Everything was hunky dory and synchronous. Free up the 

+          * packet buffer

+          */

+         xmitPending--;

+         FreePktBuf (pktBuf);

+         return (1);

+

+    case ERR_REQUEST_QUEUED:

+         /* Everything was hunky dory and asynchronous. Do nothing

+          */

+         return (1);

+

+    default:

+         printf ("Tx fail, code = %04X\n", result);

+         return (0);

+  }

+}

+

+

+

+static int ndis_nerr = sizeof(ndis_errlist) / sizeof(ndis_errlist[0]);

+

+static char *Ndis_strerror (WORD errorCode)

+{

+  static char buf[30];

+  int    i;

+

+  for (i = 0; i < ndis_nerr; i++)

+      if (errorCode == ndis_errlist[i].err_num)

+         return (ndis_errlist[i].err_text);

+

+  sprintf (buf,"unknown error %d",errorCode);

+  return (buf);

+}

+

+

+char *NdisLastError (void)

+{

+  char *errStr = lastErr;

+  lastErr = NULL;

+  return (errStr);

+}

+

+int NdisOpen (void)

+{

+  struct _ReqBlock reqBlock;

+  int     result;

+  int     ndisFd = open (NDIS_PATH, O_RDONLY);

+

+  if (ndisFd < 0)

+  {

+    printf ("Could not open NDIS Protocol Manager device.\n");

+    return (0);

+  }

+

+  memset (&reqBlock, 0, sizeof(ReqBlock));

+

+  reqBlock.opcode = PM_GET_PROTOCOL_MANAGER_LINKAGE;

+

+  result = NdisGetLinkage (ndisFd, (char*)&reqBlock, sizeof(ReqBlock));

+  if (result != 0)

+  {

+    printf ("Could not get Protocol Manager linkage.\n");

+    close (ndisFd);

+    return (0);

+  }

+

+  close (ndisFd);

+  protManEntry = (ProtMan) reqBlock.pointer1;

+  protManDS    = reqBlock.word1;

+

+  DEBUG2 ("Entry Point = %04X:%04X\n", FP_SEG(protManEntry),FP_OFF(protManEntry));

+  DEBUG1 ("ProtMan DS  = %04X\n", protManDS);

+  return (1);

+}

+

+

+int NdisRegisterAndBind (int promis)

+{

+  struct _ReqBlock reqBlock;

+  WORD    result;

+

+  memset (&common,0,sizeof(common));

+

+  common.tableSize = sizeof (common);

+

+  common.majorNdisVersion   = 2;

+  common.minorNdisVersion   = 0;

+  common.majorModuleVersion = 2;

+  common.minorModuleVersion = 0;

+

+  /* Indicates binding from below and dynamically loaded

+   */

+  common.moduleFlags = 0x00000006L;

+

+  strcpy (common.moduleName, "PCAP");

+

+  common.protocolLevelUpper = 0xFF;

+  common.protocolLevelLower = 1;

+  common.interfaceLower     = 1;

+#ifdef __DJGPP__

+  common.moduleDS           = _dos_ds; /* the callback data segment */

+#else

+  common.moduleDS           = _DS;

+#endif

+

+  common.systemRequest      = (SystemRequest) systemRequestGlue;

+  common.serviceChars       = (BYTE*) &protChars;

+  common.serviceStatus      = NULL;

+  common.upperDispatchTable = NULL;

+  common.lowerDispatchTable = (BYTE*) &lowerTable;

+

+  protChars.length  = sizeof (protChars);

+  protChars.name[0] = 0;

+  protChars.type    = 0;

+

+  lowerTable.backPointer        = &common;

+  lowerTable.requestConfirm     = requestConfirmGlue;

+  lowerTable.transmitConfirm    = transmitConfirmGlue;

+  lowerTable.receiveLookahead   = receiveLookaheadGlue;

+  lowerTable.indicationComplete = indicationCompleteGlue;

+  lowerTable.receiveChain       = receiveChainGlue;

+  lowerTable.status             = statusGlue;

+  lowerTable.flags              = 3;

+  if (promis)

+     lowerTable.flags |= 4;   /* promiscous mode (receive everything) */

+

+  bindings.numBindings = 1;

+  strcpy (bindings.moduleName[0], handle->moduleName);

+

+  /* Register ourselves with NDIS

+   */

+  reqBlock.opcode   = PM_REGISTER_MODULE;

+  reqBlock.pointer1 = (BYTE FAR*) &common;

+  reqBlock.pointer2 = (BYTE FAR*) &bindings;

+

+  result = (*protManEntry) (&reqBlock, protManDS);

+  if (result)

+  {

+    printf ("Protman registering failed: %s\n", Ndis_strerror(result));

+    return (0);

+  }

+

+  /* Start the binding process

+   */

+  reqBlock.opcode   = PM_BIND_AND_START;

+  reqBlock.pointer1 = (BYTE FAR*) &failingModules;

+

+  result = (*protManEntry) (&reqBlock, protManDS);

+  if (result)

+  {

+    printf ("Start binding failed: %s\n", Ndis_strerror(result));

+    return (0);

+  }

+  return (1);

+}

+

+static int CheckMacFeatures (CardHandle *card)

+{

+  DWORD      serviceFlags;

+  BYTE _far *mediaString;

+  BYTE _far *mac_addr;

+

+  DEBUG2 ("checking card features\n"

+          "common table address = %08lX, macId = %d\n",

+          card->common, card->common->moduleId);

+

+  serviceFlags = MAC_CHAR (handle)->serviceFlags;

+

+  if ((serviceFlags & SF_PROMISCUOUS) == 0)

+  {

+    printf ("The MAC %s does not support promiscuous mode.\n",

+            card->moduleName);

+    return (0);

+  }

+

+  mediaString = MAC_CHAR (handle)->macName;

+

+  DEBUG1 ("media type = %s\n",mediaString);

+

+  /* Get the media type. And set the header size

+   */

+  if (!strncmp(mediaString,"802.3",5) ||

+      !strncmp(mediaString,"DIX",3)   ||

+      !strncmp(mediaString,"DIX+802.3",9))

+       headerSize = sizeof (EthernetIIHeader);

+

+  else if (!strncmp(mediaString,"FDDI",4))

+       headerSize = sizeof (FddiHeader) +

+                    sizeof (Ieee802Dot2SnapHeader);

+  else

+  {

+    printf ("Unsupported MAC type: `%s'\n", mediaString);

+    return (0);

+  }

+

+  frameSize = MAC_CHAR (handle)->maxFrameSize;

+  mac_addr  = MAC_CHAR (handle)->currentAddress;

+

+  printf ("Hardware address: %02X:%02X:%02X:%02X:%02X:%02X\n",

+          mac_addr[0], mac_addr[1], mac_addr[2],

+          mac_addr[3], mac_addr[4], mac_addr[5]);

+  return (1);

+}

+

+static int NdisStartMac (CardHandle *card)

+{

+  WORD result;

+

+  /* Set the lookahead length

+   */

+  result = MAC_DISPATCH(handle)->request (common.moduleId, 0,

+                                          headerSize, 0,

+                                          REQ_SET_LOOKAHEAD,

+                                          card->common->moduleDS);

+

+  /* We assume that if we got INVALID PARAMETER then either this

+   * is not supported or will work anyway. NE2000 does this.

+   */

+  if (result != ERR_SUCCESS && result != ERR_INVALID_PARAMETER)

+  {

+    DEBUG1 ("Set lookahead failed: %s\n", Ndis_strerror(result));

+    return (0);

+  }

+

+  /* Set the packet filter. Note that for some medias and drivers we

+   * must specify all three flags or the card(s) will not operate correctly.

+   */

+  result = MAC_DISPATCH(handle)->request (common.moduleId, 0,

+                      /* all packets */   FILTER_PROMISCUOUS |

+                      /* packets to us */ FILTER_DIRECTED    |

+                      /* broadcasts */    FILTER_BROADCAST,

+                                          0, REQ_SET_PACKET_FILTER,

+                                          card->common->moduleDS);

+  if (result != ERR_SUCCESS)

+  {

+    DEBUG1 ("Set packet filter failed: %s\n", Ndis_strerror(result));

+    return (0);

+  }

+

+  /* If OPEN/CLOSE supported then open the adapter

+   */

+  if (MAC_CHAR(handle)->serviceFlags & SF_OPEN_CLOSE)

+  {

+    result = MAC_DISPATCH(handle)->request (common.moduleId, 0, 0, NULL,

+                                            REQ_OPEN_ADAPTER,

+                                            card->common->moduleDS);

+    if (result != ERR_SUCCESS)

+    {

+      DEBUG1 ("Opening the MAC failed: %s\n", Ndis_strerror(result));

+      return (0);

+    }

+  }

+  return (1);

+}

+

+void NdisShutdown (void)

+{

+  struct _ReqBlock reqBlock;

+  int     result, i;

+

+  if (!handle)

+     return;

+

+  /* If the adapters support open and are open then close them

+   */

+  if ((MAC_CHAR(handle)->serviceFlags & SF_OPEN_CLOSE) &&

+      (MAC_STATUS(handle)->macStatus & MAC_OPEN))

+  {

+    result = MAC_DISPATCH(handle)->request (common.moduleId, 0, 0, 0,

+                                            REQ_CLOSE_ADAPTER,

+                                            handle->common->moduleDS);

+    if (result != ERR_SUCCESS)

+    {

+      printf ("Closing the MAC failed: %s\n", Ndis_strerror(result));

+      return;

+    }

+  }

+

+  /* Tell the Protocol Manager to unbind and stop

+   */

+  reqBlock.opcode   = PM_UNBIND_AND_STOP;

+  reqBlock.pointer1 = (BYTE FAR*) &failingModules;

+  reqBlock.pointer2 = NULL;

+

+  result = (*protManEntry) (&reqBlock, protManDS);

+  if (result)

+     printf ("Unbind failed: %s\n",  Ndis_strerror(result));

+

+  for (i = 0; i < STACK_POOL_SIZE; ++i)

+     free (freeStacks[i] - STACK_SIZE);

+

+  handle = NULL;

+}

+

+int NdisInit (int promis)

+{

+  int i, result;

+

+  /* Allocate the real mode stacks used for NDIS callbacks

+   */

+  for (i = 0; i < STACK_POOL_SIZE; ++i)

+  {

+    freeStacks[i] = malloc (STACK_SIZE);

+    if (!freeStacks[i])

+       return (0);

+    freeStacks[i] += STACK_SIZE;

+  }

+

+  if (!NdisOpen())

+     return (0);

+

+  if (!NdisRegisterAndBind(promis))

+     return (0);

+

+  DEBUG1 ("My module id: %d\n", common.moduleId);

+  DEBUG1 ("Handle id;    %d\n", handle->common->moduleId);

+  DEBUG1 ("MAC card:     %-16s - ", handle->moduleName);

+

+  atexit (NdisShutdown);

+

+  if (!CheckMacFeatures(&handle))

+     return (0);

+

+  switch (mediaType)

+  {

+    case MEDIA_FDDI:

+         DEBUG0 ("Media type: FDDI");

+	 break;

+    case MEDIA_ETHERNET:

+         DEBUG0 ("Media type: ETHERNET");

+	 break;

+    default:

+         DEBUG0 ("Unsupported media.\n");

+         return (0);

+  }

+

+  DEBUG1 (" - Frame size: %d\n", frameSize);

+

+  if (!NdisStartMac(&handle))

+     return (0);

+  return (1);

+}

+#endif  /* USE_NDIS2 */

+

diff --git a/msdos/ndis2.h b/msdos/ndis2.h
new file mode 100644
index 0000000..dc72f4c
--- /dev/null
+++ b/msdos/ndis2.h
@@ -0,0 +1,559 @@
+/* 

+ * Copyright (c) 1993,1994

+ *      Texas A&M University.  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. All advertising materials mentioning features or use of this software

+ *    must display the following acknowledgement:

+ *      This product includes software developed by Texas A&M University

+ *      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 UNIVERSITY 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 UNIVERSITY 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.

+ *

+ * Developers:

+ *             David K. Hess, Douglas Lee Schales, David R. Safford

+ *

+ * Heavily modified for Metaware HighC + GNU C 2.8+

+ *             Gisle Vanem 1998

+ */

+

+#ifndef __PCAP_NDIS_H

+#define __PCAP_NDIS_H

+

+#if defined (__HIGHC__)

+  #define pascal          _CC(_CALLEE_POPS_STACK & ~_REVERSE_PARMS) /* calling convention */

+  #define CALLBACK(foo)   pascal WORD foo

+  #define PAS_PTR(x,arg)  typedef FAR WORD pascal (*x) arg

+  #define GUARD()         _inline (0x9C,0xFA)   /* pushfd, cli */

+  #define UNGUARD()       _inline (0x9D)        /* popfd */

+  #define FAR             _far

+

+#elif defined(__GNUC__)

+  #define CALLBACK(foo)   WORD foo __attribute__((stdcall))

+  #define PAS_PTR(x,arg)  typedef WORD (*x) arg __attribute__((stdcall))

+  #define GUARD()         __asm__ __volatile__ ("pushfd; cli")

+  #define UNGUARD()       __asm__ __volatile__ ("popfd")

+  #define FAR

+

+#elif defined (__TURBOC__)

+  #define CALLBACK(foo)   WORD pascal foo

+  #define PAS_PTR(x,arg)  typedef WORD pascal (_far *x) arg

+  #define GUARD()         _asm { pushf; cli }

+  #define UNGUARD()       _asm { popf }

+  #define FAR             _far

+

+#elif defined (__WATCOMC__)

+  #define CALLBACK(foo)   WORD pascal foo

+  #define PAS_PTR(x,arg)  typedef WORD pascal (_far *x) arg

+  #define GUARD()         _disable()

+  #define UNGUARD()       _enable()

+  #define FAR             _far

+

+#else

+  #error Unsupported compiler

+#endif

+

+

+/*

+ *  Forwards

+ */

+struct _ReqBlock;

+struct _TxBufDescr;

+struct _TDBufDescr;

+

+/*

+ * Protocol Manager API

+ */

+PAS_PTR (ProtMan, (struct _ReqBlock FAR*, WORD));

+

+/*

+ * System request

+ */

+PAS_PTR (SystemRequest, (DWORD, DWORD, WORD, WORD, WORD));

+

+/*

+ * MAC API

+ */

+PAS_PTR (TransmitChain, (WORD, WORD, struct _TxBufDescr FAR*, WORD));

+PAS_PTR (TransferData,  (WORD*,WORD, struct _TDBufDescr FAR*, WORD));

+PAS_PTR (Request,       (WORD, WORD, WORD, DWORD, WORD, WORD));

+PAS_PTR (ReceiveRelease,(WORD, WORD));

+PAS_PTR (IndicationOn,  (WORD));

+PAS_PTR (IndicationOff, (WORD));

+

+

+typedef enum {

+        HARDWARE_NOT_INSTALLED  = 0,

+        HARDWARE_FAILED_DIAG    = 1,

+        HARDWARE_FAILED_CONFIG  = 2,

+        HARDWARE_HARD_FAULT     = 3,

+        HARDWARE_SOFT_FAULT     = 4,

+        HARDWARE_OK             = 7,

+        HARDWARE_MASK           = 0x0007,

+        MAC_BOUND               = 0x0008,

+        MAC_OPEN                = 0x0010,

+        DIAG_IN_PROGRESS        = 0x0020

+      } NdisMacStatus;

+

+typedef enum {

+        STATUS_RING_STATUS      = 1,

+        STATUS_ADAPTER_CHECK    = 2,

+        STATUS_START_RESET      = 3,

+        STATUS_INTERRUPT        = 4,

+        STATUS_END_RESET        = 5

+      } NdisStatus;

+

+typedef enum {

+        FILTER_DIRECTED         = 1,

+        FILTER_BROADCAST        = 2,

+        FILTER_PROMISCUOUS      = 4,

+        FILTER_SOURCE_ROUTE     = 8

+      } NdisPacketFilter;

+

+typedef enum {

+        REQ_INITIATE_DIAGNOSTICS     = 1,

+        REQ_READ_ERROR_LOG           = 2,

+        REQ_SET_STATION_ADDRESS      = 3,

+        REQ_OPEN_ADAPTER             = 4,

+        REQ_CLOSE_ADAPTER            = 5,

+        REQ_RESET_MAC                = 6,

+        REQ_SET_PACKET_FILTER        = 7,

+        REQ_ADD_MULTICAST_ADDRESS    = 8,

+        REQ_DELETE_MULTICAST_ADDRESS = 9,

+        REQ_UPDATE_STATISTICS        = 10,

+        REQ_CLEAR_STATISTICS         = 11,

+        REQ_INTERRUPT_REQUEST        = 12,

+        REQ_SET_FUNCTIONAL_ADDRESS   = 13,

+        REQ_SET_LOOKAHEAD            = 14

+      } NdisGeneralRequest;

+

+typedef enum {

+        SF_BROADCAST             = 0x00000001L,

+        SF_MULTICAST             = 0x00000002L,

+        SF_FUNCTIONAL            = 0x00000004L,

+        SF_PROMISCUOUS           = 0x00000008L,

+        SF_SOFT_ADDRESS          = 0x00000010L,

+        SF_STATS_CURRENT         = 0x00000020L,

+        SF_INITIATE_DIAGS        = 0x00000040L,

+        SF_LOOPBACK              = 0x00000080L,

+        SF_RECEIVE_CHAIN         = 0x00000100L,

+        SF_SOURCE_ROUTING        = 0x00000200L,

+        SF_RESET_MAC             = 0x00000400L,

+        SF_OPEN_CLOSE            = 0x00000800L,

+        SF_INTERRUPT_REQUEST     = 0x00001000L,

+        SF_SOURCE_ROUTING_BRIDGE = 0x00002000L,

+        SF_VIRTUAL_ADDRESSES     = 0x00004000L

+      } NdisMacServiceFlags;

+

+typedef enum {

+        REQ_INITIATE_BIND        = 1,

+        REQ_BIND                 = 2,

+        REQ_INITIATE_PREBIND     = 3,

+        REQ_INITIATE_UNBIND      = 4,

+        REQ_UNBIND               = 5

+      } NdisSysRequest;

+

+typedef enum  {

+        PM_GET_PROTOCOL_MANAGER_INFO      = 1,

+        PM_REGISTER_MODULE                = 2,

+        PM_BIND_AND_START                 = 3,

+        PM_GET_PROTOCOL_MANAGER_LINKAGE   = 4,

+        PM_GET_PROTOCOL_INI_PATH          = 5,

+        PM_REGISTER_PROTOCOL_MANAGER_INFO = 6,

+        PM_INIT_AND_REGISTER              = 7,

+        PM_UNBIND_AND_STOP                = 8,

+        PM_BIND_STATUS                    = 9,

+        PM_REGISTER_STATUS                = 10

+      } NdisProtManager;

+

+

+typedef enum {

+        ERR_SUCCESS                      = 0x00,

+        ERR_WAIT_FOR_RELEASE             = 0x01,

+        ERR_REQUEST_QUEUED               = 0x02,

+        ERR_FRAME_NOT_RECOGNIZED         = 0x03,

+        ERR_FRAME_REJECTED               = 0x04,

+        ERR_FORWARD_FRAME                = 0x05,

+        ERR_OUT_OF_RESOURCE              = 0x06,

+        ERR_INVALID_PARAMETER            = 0x07,

+        ERR_INVALID_FUNCTION             = 0x08,

+        ERR_NOT_SUPPORTED                = 0x09,

+        ERR_HARDWARE_ERROR               = 0x0A,

+        ERR_TRANSMIT_ERROR               = 0x0B,

+        ERR_NO_SUCH_DESTINATION          = 0x0C,

+        ERR_BUFFER_TOO_SMALL             = 0x0D,

+        ERR_ALREADY_STARTED              = 0x20,

+        ERR_INCOMPLETE_BINDING           = 0x21,

+        ERR_DRIVER_NOT_INITIALIZED       = 0x22,

+        ERR_HARDWARE_NOT_FOUND           = 0x23,

+        ERR_HARDWARE_FAILURE             = 0x24,

+        ERR_CONFIGURATION_FAILURE        = 0x25,

+        ERR_INTERRUPT_CONFLICT           = 0x26,

+        ERR_INCOMPATIBLE_MAC             = 0x27,

+        ERR_INITIALIZATION_FAILED        = 0x28,

+        ERR_NO_BINDING                   = 0x29,

+        ERR_NETWORK_MAY_NOT_BE_CONNECTED = 0x2A,

+        ERR_INCOMPATIBLE_OS_VERSION      = 0x2B,

+        ERR_ALREADY_REGISTERED           = 0x2C,

+        ERR_PATH_NOT_FOUND               = 0x2D,

+        ERR_INSUFFICIENT_MEMORY          = 0x2E,

+        ERR_INFO_NOT_FOUND               = 0x2F,

+        ERR_GENERAL_FAILURE              = 0xFF

+      } NdisError;

+

+#define NDIS_PARAM_INTEGER   0

+#define NDIS_PARAM_STRING    1

+

+#define NDIS_TX_BUF_LENGTH   8

+#define NDIS_TD_BUF_LENGTH   1

+#define NDIS_RX_BUF_LENGTH   8

+

+#define NDIS_PTR_PHYSICAL    0

+#define NDIS_PTR_VIRTUAL     2

+

+#define NDIS_PATH    "PROTMAN$"

+

+

+typedef struct _CommonChars {

+        WORD  tableSize;

+        BYTE  majorNdisVersion;        /* 2 - Latest version */

+        BYTE  minorNdisVersion;        /* 0                  */

+        WORD  reserved1;

+        BYTE  majorModuleVersion;

+        BYTE  minorModuleVersion;

+        DWORD moduleFlags;

+        /* 0 - Binding at upper boundary supported

+         * 1 - Binding at lower boundary supported

+         * 2 - Dynamically bound.

+         * 3-31 - Reserved, must be zero.

+         */

+        BYTE  moduleName[16];

+        BYTE  protocolLevelUpper;

+        /* 1 - MAC

+         * 2 - Data Link

+         * 3 - Network

+         * 4 - Transport

+         * 5 - Session

+         * -1 - Not specified

+         */

+        BYTE  interfaceUpper;

+        BYTE  protocolLevelLower;

+        /* 0 - Physical

+         * 1 - MAC

+         * 2 - Data Link

+         * 3 - Network

+         * 4 - Transport

+         * 5 - Session

+         * -1 - Not specified

+         */

+        BYTE  interfaceLower;

+        WORD  moduleId;

+        WORD  moduleDS;

+        SystemRequest systemRequest;

+        BYTE *serviceChars;

+        BYTE *serviceStatus;

+        BYTE *upperDispatchTable;

+        BYTE *lowerDispatchTable;

+        BYTE *reserved2;            /* Must be NULL */

+        BYTE *reserved3;            /* Must be NULL */

+      } CommonChars;

+

+

+typedef struct _MulticastList {

+        WORD   maxMulticastAddresses;

+        WORD   numberMulticastAddresses;

+        BYTE   multicastAddress[16][16];

+      } MulticastList;

+

+

+typedef struct _MacChars {

+        WORD   tableSize;

+        BYTE   macName[16];

+        WORD   addressLength;

+        BYTE   permanentAddress[16];

+        BYTE   currentAddress[16];

+        DWORD  currentFunctionalAddress;

+        MulticastList *multicastList;

+        DWORD  linkSpeed;

+        DWORD  serviceFlags;

+        WORD   maxFrameSize;

+        DWORD  txBufferSize;

+        WORD   txBufferAllocSize;

+        DWORD  rxBufferSize;

+        WORD   rxBufferAllocSize;

+        BYTE   ieeeVendor[3];

+        BYTE   vendorAdapter;

+        BYTE  *vendorAdapterDescription;

+        WORD   interruptLevel;

+        WORD   txQueueDepth;

+        WORD   maxDataBlocks;

+      } MacChars;

+

+

+typedef struct _ProtocolChars {

+        WORD   length;

+        BYTE   name[16];

+        WORD   type;

+      } ProtocolChars;

+

+

+typedef struct _MacUpperDispatch {

+        CommonChars      *backPointer;

+        Request           request;

+        TransmitChain     transmitChain;

+        TransferData      transferData;

+        ReceiveRelease    receiveRelease;

+        IndicationOn      indicationOn;

+        IndicationOff     indicationOff;

+      } MacUpperDispatch;

+

+

+typedef struct _MacStatusTable {

+        WORD   tableSize;

+        DWORD  lastDiag;

+        DWORD  macStatus;

+        WORD   packetFilter;

+        BYTE  *mediaSpecificStats;

+        DWORD  lastClear;

+        DWORD  totalFramesRx;

+        DWORD  totalFramesCrc;

+        DWORD  totalBytesRx;

+        DWORD  totalDiscardBufSpaceRx;

+        DWORD  totalMulticastRx;

+        DWORD  totalBroadcastRx;

+        DWORD  obsolete1[5];

+        DWORD  totalDiscardHwErrorRx;

+        DWORD  totalFramesTx;

+        DWORD  totalBytesTx;

+        DWORD  totalMulticastTx;

+        DWORD  totalBroadcastTx;

+        DWORD  obsolete2[2];

+        DWORD  totalDiscardTimeoutTx;

+        DWORD  totalDiscardHwErrorTx;

+      } MacStatusTable;

+

+

+typedef struct _ProtDispatch {

+        CommonChars *backPointer;

+        DWORD        flags;

+        /* 0 - handles non-LLC frames

+         * 1 - handles specific-LSAP LLC frames

+         * 2 - handles specific-LSAP LLC frames

+         * 3-31 - reserved must be 0

+         */

+        void  (*requestConfirm) (void);

+        void  (*transmitConfirm) (void);

+        void  (*receiveLookahead) (void);

+        void  (*indicationComplete) (void);

+        void  (*receiveChain) (void);

+        void  (*status) (void);

+      } ProtDispatch;

+

+

+typedef struct _ReqBlock {

+        WORD      opcode;

+        WORD      status;

+        BYTE FAR *pointer1;

+        BYTE FAR *pointer2;

+        WORD      word1;

+      } ReqBlock;

+

+

+typedef struct _TxBufDescrRec {

+        BYTE   txPtrType;

+        BYTE   dummy;

+        WORD   txDataLen;

+        BYTE  *txDataPtr;

+      } TxBufDescrRec;

+

+

+typedef struct _TxBufDescr {

+        WORD          txImmedLen;

+        BYTE         *txImmedPtr;

+        WORD          txDataCount;

+        TxBufDescrRec txBufDescrRec[NDIS_TX_BUF_LENGTH];

+      } TxBufDescr;

+

+

+typedef struct _TDBufDescrRec {

+        BYTE   tDPtrType;

+        BYTE   dummy;

+        WORD   tDDataLen;

+        BYTE  *tDDataPtr;

+      } TDBufDescrRec;

+

+

+typedef struct _TDBufDescr {

+        WORD          tDDataCount;

+        TDBufDescrRec tDBufDescrRec[NDIS_TD_BUF_LENGTH];

+      } TDBufDescr;

+

+

+typedef struct _RxBufDescrRec {

+        WORD   rxDataLen;

+        BYTE  *rxDataPtr;

+      } RxBufDescrRec;

+

+

+typedef struct _RxBufDescr {

+        WORD          rxDataCount;

+        RxBufDescrRec rxBufDescrRec[NDIS_RX_BUF_LENGTH];

+      } RxBufDescr;

+

+

+typedef struct _PktBuf {

+	struct _PktBuf *nextLink;

+	struct _PktBuf *prevLink;

+        int    handle;

+        int    length;

+        int    packetLength;

+        DWORD  sequence;

+        BYTE  *buffer;

+      } PktBuf;

+

+

+typedef struct _CardHandle {

+        BYTE         moduleName[16];

+        CommonChars *common;

+      } CardHandle;

+

+

+typedef struct _BindingsList {

+        WORD  numBindings;

+        BYTE  moduleName[2][16];

+      } BindingsList;

+

+

+typedef struct _FailingModules {

+        BYTE  upperModuleName[16];

+        BYTE  lowerModuleName[16];

+      } FailingModules;

+

+

+typedef union _HardwareAddress {

+        BYTE  bytes[6];

+        WORD  words[3];

+        struct {

+          BYTE bytes[6];

+        } addr;

+      } HardwareAddress;

+

+

+typedef struct _FddiHeader {

+        BYTE             frameControl;

+        HardwareAddress  etherDestHost;

+        HardwareAddress  etherSrcHost;

+      } FddiHeader;

+

+

+typedef struct _EthernetIIHeader {

+        HardwareAddress  etherDestHost;

+        HardwareAddress  etherSrcHost;

+        WORD             etherType;

+      } EthernetIIHeader;

+

+

+typedef struct _Ieee802Dot5Header {

+        HardwareAddress  etherDestHost;

+        HardwareAddress  etherSrcHost;

+        BYTE             routeInfo[30];

+      } Ieee802Dot5Header;

+

+

+typedef struct _Ieee802Dot2SnapHeader {

+        BYTE  dsap;                      /* 0xAA */

+        BYTE  ssap;                      /* 0xAA */

+        BYTE  control;                   /* 3    */

+        BYTE protocolId[5];

+      } Ieee802Dot2SnapHeader;

+

+

+/*

+ *  Prototypes

+ */

+extern char *NdisLastError        (void);

+extern int   NdisOpen             (void);

+extern int   NdisInit             (int promis);

+extern int   NdisRegisterAndBind  (int promis);

+extern void  NdisShutdown         (void);

+extern void  NdisCheckMacFeatures (struct _CardHandle *card);

+extern int   NdisSendPacket       (struct _PktBuf *pktBuf, int macId);

+

+/*

+ *  Assembly "glue" functions

+ */

+extern int systemRequestGlue();

+extern int requestConfirmGlue();

+extern int transmitConfirmGlue();

+extern int receiveLookaheadGlue();

+extern int indicationCompleteGlue();

+extern int receiveChainGlue();

+extern int statusGlue();

+

+/*

+ *  IOCTL function

+ */

+#ifdef __SMALL__

+extern int _far NdisGetLinkage (int handle, char *data, int size);

+#else

+extern int NdisGetLinkage (int handle, char *data, int size);

+#endif

+

+/*

+ *  NDIS callback handlers

+ */

+CALLBACK (NdisSystemRequest     (DWORD,DWORD, WORD, WORD, WORD));

+CALLBACK (NdisRequestConfirm    ( WORD, WORD, WORD, WORD, WORD,WORD));

+CALLBACK (NdisTransmitConfirm   ( WORD, WORD, WORD, WORD, WORD));

+CALLBACK (NdisReceiveLookahead  ( WORD, WORD, WORD, BYTE*, BYTE*, WORD));

+CALLBACK (NdisReceiveChain      ( WORD, WORD, WORD, struct _RxBufDescr*, BYTE*, WORD));

+CALLBACK (NdisStatusProc        ( WORD, WORD, BYTE*, WORD,WORD));

+CALLBACK (NdisIndicationComplete( WORD, WORD));

+

+BYTE *NdisAllocStack (void);

+void  NdisFreeStack  (BYTE*);

+

+#ifdef __HIGHC__

+  #define RENAME_ASM_SYM(x) pragma Alias(x,"@" #x "")  /* prepend `@' */

+  #define RENAME_C_SYM(x)   pragma Alias(x,"_" #x "")  /* prepend `_' */

+

+  RENAME_ASM_SYM (systemRequestGlue);

+  RENAME_ASM_SYM (requestConfirmGlue);

+  RENAME_ASM_SYM (transmitConfirmGlue);

+  RENAME_ASM_SYM (receiveLookaheadGlue);

+  RENAME_ASM_SYM (indicationCompleteGlue);

+  RENAME_ASM_SYM (receiveChainGlue);

+  RENAME_ASM_SYM (statusGlue);

+  RENAME_ASM_SYM (NdisGetLinkage);

+  RENAME_C_SYM   (NdisSystemRequest);

+  RENAME_C_SYM   (NdisRequestConfirm);

+  RENAME_C_SYM   (NdisTransmitConfirm);

+  RENAME_C_SYM   (NdisReceiveLookahead);

+  RENAME_C_SYM   (NdisIndicationComplete);

+  RENAME_C_SYM   (NdisReceiveChain);

+  RENAME_C_SYM   (NdisStatusProc);

+  RENAME_C_SYM   (NdisAllocStack);

+  RENAME_C_SYM   (NdisFreeStack);

+#endif

+

+#endif

diff --git a/msdos/ndis_0.asm b/msdos/ndis_0.asm
new file mode 100644
index 0000000..2990985
--- /dev/null
+++ b/msdos/ndis_0.asm
@@ -0,0 +1,188 @@
+PAGE 60,132

+NAME NDIS_0

+

+ifdef DOSX

+  .386

+  _TEXT   SEGMENT PUBLIC DWORD USE16 'CODE'

+  _TEXT   ENDS

+  _DATA   SEGMENT PUBLIC DWORD USE16 'CODE'

+  _DATA   ENDS

+  _TEXT32 SEGMENT PUBLIC BYTE  USE32 'CODE'

+  _TEXT32 ENDS

+  CB_DSEG EQU <CS>                          ; DOSX is tiny-model

+  D_SEG   EQU <_TEXT SEGMENT>

+  D_END   EQU <_TEXT ENDS>

+  ASSUME  CS:_TEXT,DS:_TEXT

+

+  PUSHREGS equ <pushad>

+  POPREGS  equ <popad>

+

+  PUBPROC macro name

+          align 4

+          public @&name

+          @&name label near

+          endm

+else

+  .286

+  _TEXT   SEGMENT PUBLIC DWORD 'CODE'

+  _TEXT   ENDS

+  _DATA   SEGMENT PUBLIC DWORD 'DATA'

+  _DATA   ENDS

+  CB_DSEG EQU <SEG _DATA>                   ; 16bit is small/large model

+  D_SEG   EQU <_DATA SEGMENT>

+  D_END   EQU <_DATA ENDS>

+  ASSUME  CS:_TEXT,DS:_DATA

+

+  PUSHREGS equ <pusha>

+  POPREGS  equ <popa>

+

+  PUBPROC  macro name

+           public _&name

+           _&name label far

+           endm

+endif

+

+;-------------------------------------------

+

+D_SEG

+

+D_END

+

+

+_TEXT SEGMENT

+

+EXTRN _NdisSystemRequest      : near

+EXTRN _NdisRequestConfirm     : near

+EXTRN _NdisTransmitConfirm    : near

+EXTRN _NdisReceiveLookahead   : near

+EXTRN _NdisIndicationComplete : near

+EXTRN _NdisReceiveChain       : near

+EXTRN _NdisStatusProc         : near

+EXTRN _NdisAllocStack         : near

+EXTRN _NdisFreeStack          : near

+

+;

+; *ALL* interrupt threads come through this macro.

+;

+CALLBACK macro callbackProc, argsSize

+

+     pushf

+     PUSHREGS                ;; Save the registers

+

+     push es

+     push ds

+     mov  ax,CB_DSEG         ;; Load DS

+     mov  ds,ax

+     call _NdisAllocStack    ;; Get and install a stack.

+

+     mov  bx,ss              ;; Save off the old stack in other regs

+     mov  cx,sp

+     mov  ss,dx              ;; Install the new one

+     mov  sp,ax

+     push bx                 ;; Save the old one on to the new stack

+     push cx

+     sub  sp,&argsSize       ;; Allocate space for arguments on the stack

+

+     mov  ax,ss              ;; Set up the destination for the move

+     mov  es,ax

+     mov  di,sp

+     mov  ds,bx              ;; Set up the source for the move.

+     mov  si,cx

+     add  si,4+6+32

+

+     mov  cx,&argsSize       ;; Move the arguments to the stack.

+     shr  cx,1

+     cld

+     rep  movsw

+

+     mov  ax,CB_DSEG         ;; Set my data segment again.

+     mov  ds,ax

+

+     call &callbackProc      ;; Call the real callback.

+     pop  di                 ;; Pop off the old stack

+     pop  si

+     mov  bx,ss              ;; Save off the current allocated stack.

+     mov  cx,sp

+     mov  ss,si              ;; Restore the old stack

+     mov  sp,di

+     push ax                 ;; Save the return code

+     push bx                 ;; Free the stack. Push the pointer to it

+     push cx

+     call _NdisFreeStack

+     add  sp,4

+     pop  ax                 ;; Get the return code back

+     add  di,32              ;; Get a pointer to ax on the stack

+     mov  word ptr ss:[di],ax

+     pop  ds

+     pop  es

+

+     POPREGS

+     popf

+endm

+

+;

+; Define all of the callbacks for the NDIS procs.

+;

+

+PUBPROC systemRequestGlue

+CALLBACK _NdisSystemRequest,14

+RETF

+

+PUBPROC requestConfirmGlue

+CALLBACK _NdisRequestConfirm,12

+RETF

+

+PUBPROC transmitConfirmGlue

+CALLBACK _NdisTransmitConfirm,10

+RETF

+

+PUBPROC receiveLookaheadGlue

+CALLBACK _NdisReceiveLookahead,16

+RETF

+

+PUBPROC indicationCompleteGlue

+CALLBACK _NdisIndicationComplete,4

+RETF

+

+PUBPROC receiveChainGlue

+CALLBACK _NdisReceiveChain,16

+RETF

+

+PUBPROC statusGlue

+CALLBACK _NdisStatusProc,12

+RETF

+

+;

+; int FAR NdisGetLinkage (int handle, char *data, int size);

+;

+

+ifdef DOSX

+  PUBPROC NdisGetLinkage

+          push ebx

+          mov ebx, [esp+8]              ; device handle

+          mov eax, 4402h                ; IOCTRL read function

+          mov edx, [esp+12]             ; DS:EDX -> result data

+          mov ecx, [esp+16]             ; ECX = length

+          int 21h

+          pop ebx

+          jc  @fail

+          xor eax, eax

+  @fail:  ret

+

+else

+  PUBPROC NdisGetLinkage

+          enter 0, 0

+          mov bx, [bp+6]

+          mov ax, 4402h

+          mov dx, [bp+8]

+          mov cx, [bp+12]

+          int 21h

+          jc  @fail

+          xor ax, ax

+  @fail:  leave

+          retf

+endif

+

+ENDS

+

+END

diff --git a/msdos/pkt_rx0.asm b/msdos/pkt_rx0.asm
new file mode 100644
index 0000000..94f3d09
--- /dev/null
+++ b/msdos/pkt_rx0.asm
@@ -0,0 +1,197 @@
+PAGE 60,132

+NAME PKT_RX

+

+ifdef ??version        ; using TASM

+  masm

+  jumps

+endif

+

+PUBLIC _pktDrop, _pktRxBuf, _pktTxBuf,    _pktTemp

+PUBLIC _rxOutOfs, _rxInOfs, _PktReceiver, _pktRxEnd

+

+;

+; these sizes MUST be equal to the sizes in PKTDRVR.H

+;

+

+RX_BUF_SIZE = 1500      ; max message size on Ethernet

+TX_BUF_SIZE = 1500

+

+ifdef DOSX

+ .386

+  NUM_RX_BUF = 32       ; # of RX element buffers

+  _TEXT   SEGMENT PUBLIC DWORD USE16 'CODE'

+  _TEXT   ENDS

+  _DATA   SEGMENT PUBLIC DWORD USE16 'CODE'

+  _DATA   ENDS

+  D_SEG   EQU <_TEXT SEGMENT>

+  D_END   EQU <_TEXT ENDS>

+  ASSUME  CS:_TEXT,DS:_TEXT

+else

+ .286

+  NUM_RX_BUF = 10

+  _TEXT   SEGMENT PUBLIC DWORD 'CODE'

+  _TEXT   ENDS

+  _DATA   SEGMENT PUBLIC DWORD 'DATA'

+  _DATA   ENDS

+  D_SEG   EQU <_DATA SEGMENT>

+  D_END   EQU <_DATA ENDS>

+  ASSUME  CS:_TEXT,DS:_DATA

+endif

+

+;-------------------------------------------

+

+D_SEG

+

+RX_ELEMENT     STRUC

+   firstCount  dw  0                          ; # of bytes on 1st call

+   secondCount dw  0                          ; # of bytes on 2nd call

+   handle      dw  0                          ; handle for upcall

+   destinAdr   db  6           dup (0)        ; packet destination address

+   sourceAdr   db  6           dup (0)        ; packet source address

+   protocol    dw  0                          ; packet protocol number

+   rxBuffer    db  RX_BUF_SIZE dup (0)        ; RX buffer

+ENDS

+               align 4

+_rxOutOfs      dw  offset _pktRxBuf           ; ring buffer offsets

+_rxInOfs       dw  offset _pktRxBuf           ; into _pktRxBuf

+_pktDrop       dw  0,0                        ; packet drop counter

+_pktTemp       db  20                dup (0)  ; temp work area

+_pktTxBuf      db  (TX_BUF_SIZE+14)  dup (0)  ; TX buffer

+_pktRxBuf      RX_ELEMENT NUM_RX_BUF dup (<>) ; RX structures

+ LAST_OFS      = offset $

+

+ screenSeg     dw  0B800h

+ newInOffset   dw  0

+

+ fanChars      db  '-\|/'

+ fanIndex      dw  0

+

+D_END

+

+_TEXT SEGMENT

+

+

+SHOW_RX  MACRO

+         push es

+         push bx

+         mov bx, screenSeg

+         mov es, bx                    ;; r-mode segment of colour screen

+         mov di, 158                   ;; upper right corner - 1

+         mov bx, fanIndex

+         mov al, fanChars[bx]          ;; get write char

+         mov ah, 15                    ;;  and white colour

+         stosw                         ;; write to screen at ES:EDI

+         inc fanIndex                  ;; update next index

+         and fanIndex, 3

+         pop bx

+         pop es

+ENDM

+

+;------------------------------------------------------------------------

+;

+; This macro return ES:DI to tail of Rx queue

+

+ENQUEUE  MACRO

+         LOCAL @noWrap

+         mov ax, _rxInOfs              ;; DI = current in-offset

+         add ax, SIZE RX_ELEMENT       ;; point to next _pktRxBuf buffer

+         cmp ax, LAST_OFS              ;; pointing past last ?

+         jb  @noWrap                   ;; no - jump

+         lea ax, _pktRxBuf             ;; yes, point to 1st buffer

+         align 4

+@noWrap: cmp ax, _rxOutOfs             ;; in-ofs = out-ofs ?

+         je  @dump                     ;; yes, queue is full

+         mov di, _rxInOfs              ;; ES:DI -> buffer at queue input

+         mov newInOffset, ax           ;; remember new input offset

+

+   ;; NOTE. rxInOfs is updated after the packet has been copied

+   ;; to ES:DI (= DS:SI on 2nd call) by the packet driver

+

+ENDM

+

+;------------------------------------------------------------------------

+;

+; This routine gets called by the packet driver twice:

+;   1st time (AX=0) it requests an address where to put the packet

+;

+;   2nd time (AX=1) the packet has been copied to this location (DS:SI)

+;   BX has client handle (stored in RX_ELEMENT.handle).

+;   CX has # of bytes in packet on both call. They should be equal.

+;

+; A test for equality is done by putting CX in _pktRxBuf [n].firstCount

+; and _pktRxBuf[n].secondCount, and CL on first call in

+; _pktRxBuf[n].rxBuffer[CX]. These values are checked in "PktReceive"

+; (PKTDRVR.C)

+;

+;---------------------------------------------------------------------

+

+_PktReceiver:

+         pushf

+         cli                         ; no distraction wanted !

+         push ds

+         push bx

+ifdef DOSX

+         mov bx, cs

+else

+         mov bx, SEG _DATA

+endif

+         mov ds, bx

+         mov es, bx                  ; ES = DS = CS or seg _DATA

+         pop bx                      ; restore handle

+

+         cmp ax, 0                   ; first call? (AX=0)

+         jne @post                   ; AX=1: second call, do post process

+

+ifdef DEBUG

+         SHOW_RX                     ; show that a packet is received

+endif

+         cmp cx, RX_BUF_SIZE+14      ; size OK ?

+         ja  @skip                   ; no, packet to large for us

+

+         ENQUEUE                     ; ES:DI -> _pktRxBuf[n]

+

+         mov [di].firstCount, cx     ; remember the first count.

+         mov [di].handle, bx         ; remember the handle.

+         add di, 6                   ; ES:DI -> _pktRxBuf[n].destinAdr

+         pop ds

+         popf

+         retf                        ; far return to driver with ES:DI

+

+         align 4

+@dump:   inc _pktDrop[0]             ; discard the packet on 1st call

+         adc _pktDrop[2], 0          ; increment packets lost

+

+@skip:   xor di, di                  ; return ES:DI = NIL pointer

+         xor ax, ax

+         mov es, ax

+         pop ds

+         popf

+         retf

+

+         align 4

+@post:   or si, si                   ; DS:SI->_pktRxBuf[n][n].destinAdr

+         jz @discard                 ; make sure we don't use NULL-pointer

+

+         sub si, 6                   ; DS:SI -> _pktRxBuf[n].destinAdr

+       ;

+       ; push si

+       ; push [si].firstCount

+       ; call bpf_filter_match       ; run the filter here some day?

+       ; add sp, 4

+       ; cmp ax, 0

+       ; je  @discard

+

+         mov [si].secondCount, cx

+         mov ax, newInOffset

+         mov _rxInOfs, ax            ; update _pktRxBuf input offset

+

+         align 4

+@discard:pop ds

+         popf

+         retf

+

+_pktRxEnd  db 0                      ; marker for end of r-mode code/data

+

+_TEXT ENDS

+

+END

diff --git a/msdos/pkt_rx1.s b/msdos/pkt_rx1.s
new file mode 100644
index 0000000..b294a36
--- /dev/null
+++ b/msdos/pkt_rx1.s
@@ -0,0 +1,155 @@
+;

+; This file requires NASM 0.97+ to assemble

+;

+; Currently used only for djgpp + DOS4GW targets

+;

+; these sizes MUST be equal to the sizes in PKTDRVR.H

+;

+%define  ETH_MTU     1500                  ; max data size on Ethernet

+%define  ETH_MIN     60                    ; min/max total frame size

+%define  ETH_MAX     (ETH_MTU+2*6+2)

+%define  NUM_RX_BUF  32                    ; # of RX element buffers

+%define  RX_SIZE     (ETH_MAX+6)           ; sizeof(RX_ELEMENT) = 1514+6

+%idefine offset

+

+struc RX_ELEMENT

+      .firstCount  resw 1                  ; # of bytes on 1st call

+      .secondCount resw 1                  ; # of bytes on 2nd call

+      .handle      resw 1                  ; handle for upcall

+    ; .timeStamp   resw 4                  ; 64-bit RDTSC value

+      .destinAdr   resb 6                  ; packet destination address

+      .sourceAdr   resb 6                  ; packet source address

+      .protocol    resw 1                  ; packet protocol number

+      .rxBuffer    resb ETH_MTU            ; RX buffer

+endstruc

+

+;-------------------------------------------

+

+[org 0]  ; assemble to .bin file

+

+_rxOutOfs   dw   offset _pktRxBuf          ; ring buffer offsets

+_rxInOfs    dw   offset _pktRxBuf          ; into _pktRxBuf

+_pktDrop    dw   0,0                       ; packet drop counter

+_pktTemp    resb 20                        ; temp work area

+_pktTxBuf   resb (ETH_MAX)                 ; TX buffer

+_pktRxBuf   resb (RX_SIZE*NUM_RX_BUF)      ; RX structures

+ LAST_OFS   equ  $

+

+screenSeg   dw  0B800h

+newInOffset dw  0

+

+fanChars    db  '-\|/'

+fanIndex    dw  0

+

+%macro SHOW_RX 0

+       push es

+       push bx

+       mov bx, [screenSeg]

+       mov es, bx                    ;; r-mode segment of colour screen

+       mov di, 158                   ;; upper right corner - 1

+       mov bx, [fanIndex]

+       mov al, [fanChars+bx]         ;; get write char

+       mov ah, 15                    ;;  and white colour

+       cld                           ;; Needed?

+       stosw                         ;; write to screen at ES:EDI

+       inc word [fanIndex]           ;; update next index

+       and word [fanIndex], 3

+       pop bx

+       pop es

+%endmacro

+

+;PutTimeStamp

+;       rdtsc

+;       mov [si].timeStamp, eax

+;       mov [si+4].timeStamp, edx

+;       ret

+

+

+;------------------------------------------------------------------------

+;

+; This routine gets called by the packet driver twice:

+;   1st time (AX=0) it requests an address where to put the packet

+;

+;   2nd time (AX=1) the packet has been copied to this location (DS:SI)

+;   BX has client handle (stored in RX_ELEMENT.handle).

+;   CX has # of bytes in packet on both call. They should be equal.

+; A test for equality is done by putting CX in _pktRxBuf [n].firstCount

+; and _pktRxBuf[n].secondCount, and CL on first call in

+; _pktRxBuf[n].rxBuffer[CX]. These values are checked in "PktReceive"

+; (PKTDRVR.C)

+;

+;---------------------------------------------------------------------

+

+_PktReceiver:

+         pushf

+         cli                         ; no distraction wanted !

+         push ds

+         push bx

+         mov bx, cs

+         mov ds, bx

+         mov es, bx                  ; ES = DS = CS or seg _DATA

+         pop bx                      ; restore handle

+

+         cmp ax, 0                   ; first call? (AX=0)

+         jne @post                   ; AX=1: second call, do post process

+

+%ifdef DEBUG

+         SHOW_RX                     ; show that a packet is received

+%endif

+

+         cmp cx, ETH_MAX             ; size OK ?

+         ja  @skip                   ; no, too big

+

+         mov ax, [_rxInOfs]

+         add ax, RX_SIZE

+         cmp ax, LAST_OFS

+         jb  @noWrap

+         mov ax, offset _pktRxBuf

+@noWrap:

+         cmp ax, [_rxOutOfs]

+         je  @dump

+         mov di, [_rxInOfs]          ; ES:DI -> _pktRxBuf[n]

+         mov [newInOffset], ax

+

+         mov [di], cx                ; remember firstCount.

+         mov [di+4], bx              ; remember handle.

+         add di, 6                   ; ES:DI -> _pktRxBuf[n].destinAdr

+         pop ds

+         popf

+         retf                        ; far return to driver with ES:DI

+

+@dump:   add word [_pktDrop+0], 1    ; discard the packet on 1st call

+         adc word [_pktDrop+2], 0    ; increment packets lost

+

+@skip:   xor di, di                  ; return ES:DI = NIL pointer

+         xor ax, ax

+         mov es, ax

+         pop ds

+         popf

+         retf

+

+@post:   or si, si                   ; DS:SI->_pktRxBuf[n][n].destinAdr

+         jz @discard                 ; make sure we don't use NULL-pointer

+

+       ;

+       ; push si

+       ; call bpf_filter_match       ; run the filter here some day

+       ; pop si

+       ; cmp ax, 0

+       ; je  @discard

+

+         mov [si-6+2], cx            ; store _pktRxBuf[n].secondCount

+         mov ax, [newInOffset]

+         mov [_rxInOfs], ax          ; update _pktRxBuf input offset

+

+       ; call PutTimeStamp

+

+@discard:

+         pop ds

+         popf

+         retf

+

+_pktRxEnd  db 0                      ; marker for end of r-mode code/data

+

+END

+

diff --git a/msdos/pktdrvr.c b/msdos/pktdrvr.c
new file mode 100644
index 0000000..cd22ee6
--- /dev/null
+++ b/msdos/pktdrvr.c
@@ -0,0 +1,1436 @@
+/*

+ *  File.........: pktdrvr.c

+ *

+ *  Responsible..: Gisle Vanem,  giva@bgnett.no

+ *

+ *  Created......: 26.Sept 1995

+ *

+ *  Description..: Packet-driver interface for 16/32-bit C :

+ *                 Borland C/C++ 3.0+ small/large model

+ *                 Watcom C/C++ 11+, DOS4GW flat model

+ *                 Metaware HighC 3.1+ and PharLap 386|DosX

+ *                 GNU C/C++ 2.7+ and djgpp 2.x extender

+ *

+ *  References...: PC/TCP Packet driver Specification. rev 1.09

+ *                 FTP Software Inc.

+ *

+ */

+

+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <dos.h>

+

+#include "pcap-dos.h"

+#include "pcap-int.h"

+#include "msdos/pktdrvr.h"

+

+#if (DOSX)

+#define NUM_RX_BUF  32      /* # of buffers in Rx FIFO queue */

+#else

+#define NUM_RX_BUF  10

+#endif

+

+#define DIM(x)   (sizeof((x)) / sizeof(x[0]))

+#define PUTS(s)  do {                                           \

+                   if (!pktInfo.quiet)                          \

+                      pktInfo.error ?                           \

+                        printf ("%s: %s\n", s, pktInfo.error) : \

+                        printf ("%s\n", pktInfo.error = s);     \

+                 } while (0)

+

+#if defined(__HIGHC__)

+  extern UINT _mwenv;

+

+#elif defined(__DJGPP__)

+  #include <stddef.h>

+  #include <dpmi.h>

+  #include <go32.h>

+  #include <pc.h>

+  #include <sys/farptr.h>

+

+#elif defined(__WATCOMC__)

+  #include <i86.h>

+  #include <stddef.h>

+  extern char _Extender;

+

+#else

+  extern void far PktReceiver (void);

+#endif

+

+

+#if (DOSX & (DJGPP|DOS4GW))

+  #include <sys/pack_on.h>

+

+  struct DPMI_regs {

+         DWORD  r_di;

+         DWORD  r_si;

+         DWORD  r_bp;

+         DWORD  reserved;

+         DWORD  r_bx;

+         DWORD  r_dx;

+         DWORD  r_cx;

+         DWORD  r_ax;

+         WORD   r_flags;

+         WORD   r_es, r_ds, r_fs, r_gs;

+         WORD   r_ip, r_cs, r_sp, r_ss;

+       };

+

+  /* Data located in a real-mode segment. This becomes far at runtime

+   */

+  typedef struct  {          /* must match data/code in pkt_rx1.s */

+          WORD       _rxOutOfs;

+          WORD       _rxInOfs;

+          DWORD      _pktDrop;

+          BYTE       _pktTemp [20];

+          TX_ELEMENT _pktTxBuf[1];

+          RX_ELEMENT _pktRxBuf[NUM_RX_BUF];

+          WORD       _dummy[2];        /* screenSeg,newInOffset */

+          BYTE       _fanChars[4];

+          WORD       _fanIndex;

+          BYTE       _PktReceiver[15]; /* starts on a paragraph (16byte) */

+        } PktRealStub;

+  #include <sys/pack_off.h>

+

+  static BYTE real_stub_array [] = {

+         #include "pkt_stub.inc"       /* generated opcode array */

+       };

+

+  #define rxOutOfs      offsetof (PktRealStub,_rxOutOfs)

+  #define rxInOfs       offsetof (PktRealStub,_rxInOfs)

+  #define PktReceiver   offsetof (PktRealStub,_PktReceiver [para_skip])

+  #define pktDrop       offsetof (PktRealStub,_pktDrop)

+  #define pktTemp       offsetof (PktRealStub,_pktTemp)

+  #define pktTxBuf      offsetof (PktRealStub,_pktTxBuf)

+  #define FIRST_RX_BUF  offsetof (PktRealStub,_pktRxBuf [0])

+  #define LAST_RX_BUF   offsetof (PktRealStub,_pktRxBuf [NUM_RX_BUF-1])

+

+#else

+  extern WORD       rxOutOfs;    /* offsets into pktRxBuf FIFO queue   */

+  extern WORD       rxInOfs;

+  extern DWORD      pktDrop;     /* # packets dropped in PktReceiver() */

+  extern BYTE       pktRxEnd;    /* marks the end of r-mode code/data  */

+

+  extern RX_ELEMENT pktRxBuf [NUM_RX_BUF];       /* PktDrvr Rx buffers */

+  extern TX_ELEMENT pktTxBuf;                    /* PktDrvr Tx buffer  */

+  extern char       pktTemp[20];                 /* PktDrvr temp area  */

+

+  #define FIRST_RX_BUF (WORD) &pktRxBuf [0]

+  #define LAST_RX_BUF  (WORD) &pktRxBuf [NUM_RX_BUF-1]

+#endif

+

+

+#ifdef __BORLANDC__           /* Use Borland's inline functions */

+  #define memcpy  __memcpy__

+  #define memcmp  __memcmp__

+  #define memset  __memset__

+#endif

+

+

+#if (DOSX & PHARLAP)

+  extern void PktReceiver (void);     /* in pkt_rx0.asm */

+  static int  RealCopy    (ULONG, ULONG, REALPTR*, FARPTR*, USHORT*);

+

+  #undef  FP_SEG

+  #undef  FP_OFF

+  #define FP_OFF(x)     ((WORD)(x))

+  #define FP_SEG(x)     ((WORD)(realBase >> 16))

+  #define DOS_ADDR(s,o) (((DWORD)(s) << 16) + (WORD)(o))

+  #define r_ax          eax

+  #define r_bx          ebx

+  #define r_dx          edx

+  #define r_cx          ecx

+  #define r_si          esi

+  #define r_di          edi

+  #define r_ds          ds

+  #define r_es          es

+  LOCAL FARPTR          protBase;

+  LOCAL REALPTR         realBase;

+  LOCAL WORD            realSeg;   /* DOS para-address of allocated area */

+  LOCAL SWI_REGS        reg;

+

+  static WORD _far *rxOutOfsFp, *rxInOfsFp;

+

+#elif (DOSX & DJGPP)

+  static _go32_dpmi_seginfo rm_mem;

+  static __dpmi_regs        reg;

+  static DWORD              realBase;

+  static int                para_skip = 0;

+

+  #define DOS_ADDR(s,o)     (((WORD)(s) << 4) + (o))

+  #define r_ax              x.ax

+  #define r_bx              x.bx

+  #define r_dx              x.dx

+  #define r_cx              x.cx

+  #define r_si              x.si

+  #define r_di              x.di

+  #define r_ds              x.ds

+  #define r_es              x.es

+

+#elif (DOSX & DOS4GW)

+  LOCAL struct DPMI_regs    reg;

+  LOCAL WORD                rm_base_seg, rm_base_sel;

+  LOCAL DWORD               realBase;

+  LOCAL int                 para_skip = 0;

+

+  LOCAL DWORD dpmi_get_real_vector (int intr);

+  LOCAL WORD  dpmi_real_malloc     (int size, WORD *selector);

+  LOCAL void  dpmi_real_free       (WORD selector);

+  #define DOS_ADDR(s,o) (((DWORD)(s) << 4) + (WORD)(o))

+

+#else              /* real-mode Borland etc. */

+  static struct  {

+         WORD r_ax, r_bx, r_cx, r_dx, r_bp;

+         WORD r_si, r_di, r_ds, r_es, r_flags;

+       } reg;

+#endif

+

+#ifdef __HIGHC__

+  #pragma Alias (pktDrop,    "_pktDrop")

+  #pragma Alias (pktRxBuf,   "_pktRxBuf")

+  #pragma Alias (pktTxBuf,   "_pktTxBuf")

+  #pragma Alias (pktTemp,    "_pktTemp")

+  #pragma Alias (rxOutOfs,   "_rxOutOfs")

+  #pragma Alias (rxInOfs,    "_rxInOfs")

+  #pragma Alias (pktRxEnd,   "_pktRxEnd")

+  #pragma Alias (PktReceiver,"_PktReceiver")

+#endif

+

+

+PUBLIC PKT_STAT    pktStat;    /* statistics for packets    */

+PUBLIC PKT_INFO    pktInfo;    /* packet-driver information */

+

+PUBLIC PKT_RX_MODE receiveMode  = PDRX_DIRECT;

+PUBLIC ETHER       myAddress    = {   0,  0,  0,  0,  0,  0 };

+PUBLIC ETHER       ethBroadcast = { 255,255,255,255,255,255 };

+

+LOCAL  struct {             /* internal statistics */

+       DWORD  tooSmall;     /* size < ETH_MIN */

+       DWORD  tooLarge;     /* size > ETH_MAX */

+       DWORD  badSync;      /* count_1 != count_2 */

+       DWORD  wrongHandle;  /* upcall to wrong handle */

+     } intStat;  

+

+/***************************************************************************/

+

+PUBLIC const char *PktGetErrorStr (int errNum)

+{

+  static const char *errStr[] = {

+                    "",

+                    "Invalid handle number",

+                    "No interfaces of specified class found",

+                    "No interfaces of specified type found",

+                    "No interfaces of specified number found",

+                    "Bad packet type specified",

+                    "Interface does not support multicast",

+                    "Packet driver cannot terminate",

+                    "Invalid receiver mode specified",

+                    "Insufficient memory space",

+                    "Type previously accessed, and not released",

+                    "Command out of range, or not implemented",

+                    "Cannot send packet (usually hardware error)",

+                    "Cannot change hardware address ( > 1 handle open)",

+                    "Hardware address has bad length or format",

+                    "Cannot reset interface (more than 1 handle open)",

+                    "Bad Check-sum",

+                    "Bad size",

+                    "Bad sync" ,

+                    "Source hit"

+                  };

+

+  if (errNum < 0 || errNum >= DIM(errStr))

+     return ("Unknown driver error.");

+  return (errStr [errNum]);

+}

+

+/**************************************************************************/

+

+PUBLIC const char *PktGetClassName (WORD class)

+{

+  switch (class)

+  { 

+    case PD_ETHER:

+         return ("DIX-Ether");

+    case PD_PRONET10:

+         return ("ProNET-10");

+    case PD_IEEE8025:

+         return ("IEEE 802.5");

+    case PD_OMNINET:

+         return ("OmniNet");

+    case PD_APPLETALK:

+         return ("AppleTalk");

+    case PD_SLIP:

+         return ("SLIP");

+    case PD_STARTLAN:

+         return ("StartLAN");

+    case PD_ARCNET:

+         return ("ArcNet");

+    case PD_AX25:

+         return ("AX.25");

+    case PD_KISS:

+         return ("KISS");

+    case PD_IEEE8023_2:

+         return ("IEEE 802.3 w/802.2 hdr");

+    case PD_FDDI8022:

+         return ("FDDI w/802.2 hdr");

+    case PD_X25:

+         return ("X.25");

+    case PD_LANstar:

+         return ("LANstar");

+    case PD_PPP:

+         return ("PPP");

+    default:

+         return ("unknown");

+  }

+}

+

+/**************************************************************************/

+

+PUBLIC char const *PktRXmodeStr (PKT_RX_MODE mode)

+{

+  static const char *modeStr [] = {

+                    "Receiver turned off",

+                    "Receive only directly addressed packets",

+                    "Receive direct & broadcast packets",

+                    "Receive direct,broadcast and limited multicast packets",

+                    "Receive direct,broadcast and all multicast packets",

+                    "Receive all packets (promiscuouos mode)"

+                  };

+

+  if (mode > DIM(modeStr))

+     return ("??");

+  return (modeStr [mode-1]);

+}

+

+/**************************************************************************/

+

+LOCAL __inline BOOL PktInterrupt (void)

+{

+  BOOL okay;

+

+#if (DOSX & PHARLAP)

+  _dx_real_int ((UINT)pktInfo.intr, &reg);

+  okay = ((reg.flags & 1) == 0);  /* OK if carry clear */

+

+#elif (DOSX & DJGPP)

+  __dpmi_int ((int)pktInfo.intr, &reg);

+  okay = ((reg.x.flags & 1) == 0);

+

+#elif (DOSX & DOS4GW)

+  union  REGS  r;

+  struct SREGS s;

+

+  memset (&r, 0, sizeof(r));

+  segread (&s);

+  r.w.ax  = 0x300;

+  r.x.ebx = pktInfo.intr;

+  r.w.cx  = 0;

+  s.es    = FP_SEG (&reg);

+  r.x.edi = FP_OFF (&reg);

+  reg.r_flags = 0;

+  reg.r_ss = reg.r_sp = 0;     /* DPMI host provides stack */

+

+  int386x (0x31, &r, &r, &s);

+  okay = (!r.w.cflag);

+

+#else

+  reg.r_flags = 0;

+  intr (pktInfo.intr, (struct REGPACK*)&reg);

+  okay = ((reg.r_flags & 1) == 0);

+#endif

+

+  if (okay)

+       pktInfo.error = NULL;

+  else pktInfo.error = PktGetErrorStr (reg.r_dx >> 8);

+  return (okay);

+}

+

+/**************************************************************************/

+

+/*

+ * Search for packet driver at interrupt 60h through 80h. If ASCIIZ

+ * string "PKT DRVR" found at offset 3 in the interrupt handler, return

+ * interrupt number, else return zero in pktInfo.intr

+ */

+PUBLIC BOOL PktSearchDriver (void)

+{

+  BYTE intr  = 0x20;

+  BOOL found = FALSE;

+

+  while (!found && intr < 0xFF)

+  {

+    static char str[12];                 /* 3 + strlen("PKT DRVR") */

+    static char pktStr[9] = "PKT DRVR";  /* ASCIIZ string at ofs 3 */

+    DWORD  rp;                           /* in interrupt  routine  */

+

+#if (DOSX & PHARLAP)

+    _dx_rmiv_get (intr, &rp);

+    ReadRealMem (&str, (REALPTR)rp, sizeof(str));

+

+#elif (DOSX & DJGPP)

+    __dpmi_raddr realAdr;

+    __dpmi_get_real_mode_interrupt_vector (intr, &realAdr);

+    rp = (realAdr.segment << 4) + realAdr.offset16;

+    dosmemget (rp, sizeof(str), &str);

+

+#elif (DOSX & DOS4GW)

+    rp = dpmi_get_real_vector (intr);

+    memcpy (&str, (void*)rp, sizeof(str));

+

+#else

+    _fmemcpy (&str, getvect(intr), sizeof(str));

+#endif

+

+    found = memcmp (&str[3],&pktStr,sizeof(pktStr)) == 0;

+    intr++;

+  }

+  pktInfo.intr = (found ? intr-1 : 0);

+  return (found);

+}

+

+

+/**************************************************************************/

+

+static BOOL PktSetAccess (void)

+{

+  reg.r_ax = 0x0200 + pktInfo.class;

+  reg.r_bx = 0xFFFF;

+  reg.r_dx = 0;

+  reg.r_cx = 0;

+

+#if (DOSX & PHARLAP)

+  reg.ds  = 0;

+  reg.esi = 0;

+  reg.es  = RP_SEG (realBase);

+  reg.edi = (WORD) &PktReceiver;

+

+#elif (DOSX & DJGPP)

+  reg.x.ds = 0;

+  reg.x.si = 0;

+  reg.x.es = rm_mem.rm_segment;

+  reg.x.di = PktReceiver;

+

+#elif (DOSX & DOS4GW)

+  reg.r_ds = 0;

+  reg.r_si = 0;

+  reg.r_es = rm_base_seg;

+  reg.r_di = PktReceiver;

+

+#else

+  reg.r_ds = 0;

+  reg.r_si = 0;

+  reg.r_es = FP_SEG (&PktReceiver);

+  reg.r_di = FP_OFF (&PktReceiver);

+#endif

+

+  if (!PktInterrupt())

+     return (FALSE);

+

+  pktInfo.handle = reg.r_ax;

+  return (TRUE);

+}

+

+/**************************************************************************/

+

+PUBLIC BOOL PktReleaseHandle (WORD handle)

+{

+  reg.r_ax = 0x0300;

+  reg.r_bx = handle;

+  return PktInterrupt();

+}

+

+/**************************************************************************/

+

+PUBLIC BOOL PktTransmit (const void *eth, int len)

+{

+  if (len > ETH_MTU)

+     return (FALSE);

+

+  reg.r_ax = 0x0400;             /* Function 4, send pkt */

+  reg.r_cx = len;                /* total size of frame  */

+

+#if (DOSX & DJGPP)

+  dosmemput (eth, len, realBase+pktTxBuf);

+  reg.x.ds = rm_mem.rm_segment;  /* DOS data segment and */

+  reg.x.si = pktTxBuf;           /* DOS offset to buffer */

+

+#elif (DOSX & DOS4GW)

+  memcpy ((void*)(realBase+pktTxBuf), eth, len);

+  reg.r_ds = rm_base_seg;

+  reg.r_si = pktTxBuf;

+

+#elif (DOSX & PHARLAP)

+  memcpy (&pktTxBuf, eth, len);

+  reg.r_ds = FP_SEG (&pktTxBuf);

+  reg.r_si = FP_OFF (&pktTxBuf);

+

+#else

+  reg.r_ds = FP_SEG (eth);

+  reg.r_si = FP_OFF (eth);

+#endif

+

+  return PktInterrupt();

+}

+

+/**************************************************************************/

+

+#if (DOSX & (DJGPP|DOS4GW))

+LOCAL __inline BOOL CheckElement (RX_ELEMENT *rx)

+#else

+LOCAL __inline BOOL CheckElement (RX_ELEMENT _far *rx)

+#endif

+{

+  WORD count_1, count_2;

+

+  /*

+   * We got an upcall to the same RMCB with wrong handle.

+   * This can happen if we failed to release handle at program exit

+   */

+  if (rx->handle != pktInfo.handle)

+  {

+    pktInfo.error = "Wrong handle";

+    intStat.wrongHandle++;

+    PktReleaseHandle (rx->handle);

+    return (FALSE);

+  }

+  count_1 = rx->firstCount;

+  count_2 = rx->secondCount;

+

+  if (count_1 != count_2)

+  {

+    pktInfo.error = "Bad sync";

+    intStat.badSync++;

+    return (FALSE);

+  }

+  if (count_1 > ETH_MAX)

+  {

+    pktInfo.error = "Large esize";

+    intStat.tooLarge++;

+    return (FALSE);

+  }

+#if 0

+  if (count_1 < ETH_MIN)

+  {

+    pktInfo.error = "Small esize";

+    intStat.tooSmall++;

+    return (FALSE);

+  }

+#endif

+  return (TRUE);

+}

+

+/**************************************************************************/

+

+PUBLIC BOOL PktTerminHandle (WORD handle)

+{

+  reg.r_ax = 0x0500;

+  reg.r_bx = handle;

+  return PktInterrupt();

+}

+

+/**************************************************************************/

+

+PUBLIC BOOL PktResetInterface (WORD handle)

+{

+  reg.r_ax = 0x0700;

+  reg.r_bx = handle;

+  return PktInterrupt();

+}

+

+/**************************************************************************/

+

+PUBLIC BOOL PktSetReceiverMode (PKT_RX_MODE mode)

+{

+  if (pktInfo.class == PD_SLIP || pktInfo.class == PD_PPP)

+     return (TRUE);

+

+  reg.r_ax = 0x1400;

+  reg.r_bx = pktInfo.handle;

+  reg.r_cx = (WORD)mode;

+

+  if (!PktInterrupt())

+     return (FALSE);

+

+  receiveMode = mode;

+  return (TRUE);

+}

+

+/**************************************************************************/

+

+PUBLIC BOOL PktGetReceiverMode (PKT_RX_MODE *mode)

+{

+  reg.r_ax = 0x1500;

+  reg.r_bx = pktInfo.handle;

+

+  if (!PktInterrupt())

+     return (FALSE);

+

+  *mode = reg.r_ax;

+  return (TRUE);

+}

+

+/**************************************************************************/

+

+static PKT_STAT initialStat;         /* statistics at startup */

+static BOOL     resetStat = FALSE;   /* statistics reset ? */

+

+PUBLIC BOOL PktGetStatistics (WORD handle)

+{

+  reg.r_ax = 0x1800;

+  reg.r_bx = handle;

+

+  if (!PktInterrupt())

+     return (FALSE);

+

+#if (DOSX & PHARLAP)

+  ReadRealMem (&pktStat, DOS_ADDR(reg.ds,reg.esi), sizeof(pktStat));

+

+#elif (DOSX & DJGPP)

+  dosmemget (DOS_ADDR(reg.x.ds,reg.x.si), sizeof(pktStat), &pktStat);

+

+#elif (DOSX & DOS4GW)

+  memcpy (&pktStat, (void*)DOS_ADDR(reg.r_ds,reg.r_si), sizeof(pktStat));

+

+#else

+  _fmemcpy (&pktStat, MK_FP(reg.r_ds,reg.r_si), sizeof(pktStat));

+#endif

+

+  return (TRUE);

+}

+

+/**************************************************************************/

+

+PUBLIC BOOL PktSessStatistics (WORD handle)

+{

+  if (!PktGetStatistics(pktInfo.handle))

+     return (FALSE);

+

+  if (resetStat)

+  {

+    pktStat.inPackets  -= initialStat.inPackets;

+    pktStat.outPackets -= initialStat.outPackets;

+    pktStat.inBytes    -= initialStat.inBytes;

+    pktStat.outBytes   -= initialStat.outBytes;

+    pktStat.inErrors   -= initialStat.inErrors;

+    pktStat.outErrors  -= initialStat.outErrors;

+    pktStat.outErrors  -= initialStat.outErrors;

+    pktStat.lost       -= initialStat.lost;

+  }

+  return (TRUE);

+}

+

+/**************************************************************************/

+

+PUBLIC BOOL PktResetStatistics (WORD handle)

+{

+  if (!PktGetStatistics(pktInfo.handle))

+     return (FALSE);

+

+  memcpy (&initialStat, &pktStat, sizeof(initialStat));

+  resetStat = TRUE;

+  return (TRUE);

+}

+

+/**************************************************************************/

+

+PUBLIC BOOL PktGetAddress (ETHER *addr)

+{

+  reg.r_ax = 0x0600;

+  reg.r_bx = pktInfo.handle;

+  reg.r_cx = sizeof (*addr);

+

+#if (DOSX & DJGPP)

+  reg.x.es = rm_mem.rm_segment;

+  reg.x.di = pktTemp;

+#elif (DOSX & DOS4GW)

+  reg.r_es = rm_base_seg;

+  reg.r_di = pktTemp;

+#else

+  reg.r_es = FP_SEG (&pktTemp);

+  reg.r_di = FP_OFF (&pktTemp);  /* ES:DI = address for result */

+#endif

+

+  if (!PktInterrupt())

+     return (FALSE);

+

+#if (DOSX & PHARLAP)

+  ReadRealMem (addr, realBase + (WORD)&pktTemp, sizeof(*addr));

+

+#elif (DOSX & DJGPP)

+  dosmemget (realBase+pktTemp, sizeof(*addr), addr);

+

+#elif (DOSX & DOS4GW)

+  memcpy (addr, (void*)(realBase+pktTemp), sizeof(*addr));

+

+#else

+  memcpy ((void*)addr, &pktTemp, sizeof(*addr));

+#endif

+

+  return (TRUE);

+}

+

+/**************************************************************************/

+

+PUBLIC BOOL PktSetAddress (const ETHER *addr)

+{

+  /* copy addr to real-mode scrath area */

+

+#if (DOSX & PHARLAP)

+  WriteRealMem (realBase + (WORD)&pktTemp, (void*)addr, sizeof(*addr));

+

+#elif (DOSX & DJGPP)

+  dosmemput (addr, sizeof(*addr), realBase+pktTemp);

+

+#elif (DOSX & DOS4GW)

+  memcpy ((void*)(realBase+pktTemp), addr, sizeof(*addr));

+

+#else

+  memcpy (&pktTemp, (void*)addr, sizeof(*addr));

+#endif

+

+  reg.r_ax = 0x1900;

+  reg.r_cx = sizeof (*addr);      /* address length       */

+

+#if (DOSX & DJGPP)

+  reg.x.es = rm_mem.rm_segment;   /* DOS offset to param  */

+  reg.x.di = pktTemp;             /* DOS segment to param */

+#elif (DOSX & DOS4GW)

+  reg.r_es = rm_base_seg;

+  reg.r_di = pktTemp;

+#else

+  reg.r_es = FP_SEG (&pktTemp);

+  reg.r_di = FP_OFF (&pktTemp);

+#endif

+

+  return PktInterrupt();

+}

+

+/**************************************************************************/

+

+PUBLIC BOOL PktGetDriverInfo (void)

+{

+  pktInfo.majVer = 0;

+  pktInfo.minVer = 0;

+  memset (&pktInfo.name, 0, sizeof(pktInfo.name));

+  reg.r_ax = 0x01FF;

+  reg.r_bx = 0;

+

+  if (!PktInterrupt())

+     return (FALSE);

+

+  pktInfo.number = reg.r_cx & 0xFF;

+  pktInfo.class  = reg.r_cx >> 8;

+#if 0

+  pktInfo.minVer = reg.r_bx % 10;

+  pktInfo.majVer = reg.r_bx / 10;

+#else

+  pktInfo.majVer = reg.r_bx;  // !!

+#endif

+  pktInfo.funcs  = reg.r_ax & 0xFF;

+  pktInfo.type   = reg.r_dx & 0xFF;

+

+#if (DOSX & PHARLAP)

+  ReadRealMem (&pktInfo.name, DOS_ADDR(reg.ds,reg.esi), sizeof(pktInfo.name));

+

+#elif (DOSX & DJGPP)

+  dosmemget (DOS_ADDR(reg.x.ds,reg.x.si), sizeof(pktInfo.name), &pktInfo.name);

+

+#elif (DOSX & DOS4GW)

+  memcpy (&pktInfo.name, (void*)DOS_ADDR(reg.r_ds,reg.r_si), sizeof(pktInfo.name));

+

+#else

+  _fmemcpy (&pktInfo.name, MK_FP(reg.r_ds,reg.r_si), sizeof(pktInfo.name));

+#endif

+  return (TRUE);

+}

+

+/**************************************************************************/

+

+PUBLIC BOOL PktGetDriverParam (void)

+{

+  reg.r_ax = 0x0A00;

+

+  if (!PktInterrupt())

+     return (FALSE);

+

+#if (DOSX & PHARLAP)

+  ReadRealMem (&pktInfo.majVer, DOS_ADDR(reg.es,reg.edi), PKT_PARAM_SIZE);

+

+#elif (DOSX & DJGPP)

+  dosmemget (DOS_ADDR(reg.x.es,reg.x.di), PKT_PARAM_SIZE, &pktInfo.majVer);

+

+#elif (DOSX & DOS4GW)

+  memcpy (&pktInfo.majVer, (void*)DOS_ADDR(reg.r_es,reg.r_di), PKT_PARAM_SIZE);

+

+#else

+  _fmemcpy (&pktInfo.majVer, MK_FP(reg.r_es,reg.r_di), PKT_PARAM_SIZE);

+#endif

+  return (TRUE);

+}

+

+/**************************************************************************/

+

+#if (DOSX & PHARLAP)

+  PUBLIC int PktReceive (BYTE *buf, int max)

+  {

+    WORD inOfs  = *rxInOfsFp;

+    WORD outOfs = *rxOutOfsFp;

+

+    if (outOfs != inOfs)

+    {

+      RX_ELEMENT _far *head = (RX_ELEMENT _far*)(protBase+outOfs);

+      int size, len = max;

+

+      if (CheckElement(head))

+      {

+        size = min (head->firstCount, sizeof(RX_ELEMENT));

+        len  = min (size, max);

+        _fmemcpy (buf, &head->destin, len);

+      }

+      else

+        size = -1;

+

+      outOfs += sizeof (RX_ELEMENT);

+      if (outOfs > LAST_RX_BUF)

+          outOfs = FIRST_RX_BUF;

+      *rxOutOfsFp = outOfs;

+      return (size);

+    }

+    return (0);

+  }

+

+  PUBLIC void PktQueueBusy (BOOL busy)

+  {

+    *rxOutOfsFp = busy ? (*rxInOfsFp + sizeof(RX_ELEMENT)) : *rxInOfsFp;

+    if (*rxOutOfsFp > LAST_RX_BUF)

+        *rxOutOfsFp = FIRST_RX_BUF;

+    *(DWORD _far*)(protBase + (WORD)&pktDrop) = 0;

+  }

+

+  PUBLIC WORD PktBuffersUsed (void)

+  {

+    WORD inOfs  = *rxInOfsFp;

+    WORD outOfs = *rxOutOfsFp;

+

+    if (inOfs >= outOfs)

+       return (inOfs - outOfs) / sizeof(RX_ELEMENT);

+    return (NUM_RX_BUF - (outOfs - inOfs) / sizeof(RX_ELEMENT));

+  }

+

+  PUBLIC DWORD PktRxDropped (void)

+  {

+    return (*(DWORD _far*)(protBase + (WORD)&pktDrop));

+  }

+

+#elif (DOSX & DJGPP)

+  PUBLIC int PktReceive (BYTE *buf, int max)

+  {

+    WORD ofs = _farpeekw (_dos_ds, realBase+rxOutOfs);

+

+    if (ofs != _farpeekw (_dos_ds, realBase+rxInOfs))

+    {

+      RX_ELEMENT head;

+      int  size, len = max;

+

+      head.firstCount  = _farpeekw (_dos_ds, realBase+ofs);

+      head.secondCount = _farpeekw (_dos_ds, realBase+ofs+2);

+      head.handle      = _farpeekw (_dos_ds, realBase+ofs+4);

+

+      if (CheckElement(&head))

+      {

+        size = min (head.firstCount, sizeof(RX_ELEMENT));

+        len  = min (size, max);

+        dosmemget (realBase+ofs+6, len, buf);

+      }

+      else

+        size = -1;

+

+      ofs += sizeof (RX_ELEMENT);

+      if (ofs > LAST_RX_BUF)

+           _farpokew (_dos_ds, realBase+rxOutOfs, FIRST_RX_BUF);

+      else _farpokew (_dos_ds, realBase+rxOutOfs, ofs);

+      return (size);

+    }

+    return (0);

+  }

+

+  PUBLIC void PktQueueBusy (BOOL busy)

+  {

+    WORD ofs;

+

+    disable();

+    ofs = _farpeekw (_dos_ds, realBase+rxInOfs);

+    if (busy)

+       ofs += sizeof (RX_ELEMENT);

+

+    if (ofs > LAST_RX_BUF)

+         _farpokew (_dos_ds, realBase+rxOutOfs, FIRST_RX_BUF);

+    else _farpokew (_dos_ds, realBase+rxOutOfs, ofs);

+    _farpokel (_dos_ds, realBase+pktDrop, 0UL);

+    enable();

+  }

+

+  PUBLIC WORD PktBuffersUsed (void)

+  {

+    WORD inOfs, outOfs;

+

+    disable();

+    inOfs  = _farpeekw (_dos_ds, realBase+rxInOfs);

+    outOfs = _farpeekw (_dos_ds, realBase+rxOutOfs);

+    enable();

+    if (inOfs >= outOfs)

+       return (inOfs - outOfs) / sizeof(RX_ELEMENT);

+    return (NUM_RX_BUF - (outOfs - inOfs) / sizeof(RX_ELEMENT));

+  }

+

+  PUBLIC DWORD PktRxDropped (void)

+  {

+    return _farpeekl (_dos_ds, realBase+pktDrop);

+  }

+

+#elif (DOSX & DOS4GW)

+  PUBLIC int PktReceive (BYTE *buf, int max)

+  {

+    WORD ofs = *(WORD*) (realBase+rxOutOfs);

+

+    if (ofs != *(WORD*) (realBase+rxInOfs))

+    {

+      RX_ELEMENT head;

+      int  size, len = max;

+

+      head.firstCount  = *(WORD*) (realBase+ofs);

+      head.secondCount = *(WORD*) (realBase+ofs+2);

+      head.handle      = *(WORD*) (realBase+ofs+4);

+

+      if (CheckElement(&head))

+      {

+        size = min (head.firstCount, sizeof(RX_ELEMENT));

+        len  = min (size, max);

+        memcpy (buf, (const void*)(realBase+ofs+6), len);

+      }

+      else

+        size = -1;

+

+      ofs += sizeof (RX_ELEMENT);

+      if (ofs > LAST_RX_BUF)

+           *(WORD*) (realBase+rxOutOfs) = FIRST_RX_BUF;

+      else *(WORD*) (realBase+rxOutOfs) = ofs;

+      return (size);

+    }

+    return (0);

+  }

+

+  PUBLIC void PktQueueBusy (BOOL busy)

+  {

+    WORD ofs;

+

+    _disable();

+    ofs = *(WORD*) (realBase+rxInOfs);

+    if (busy)

+       ofs += sizeof (RX_ELEMENT);

+

+    if (ofs > LAST_RX_BUF)

+         *(WORD*) (realBase+rxOutOfs) = FIRST_RX_BUF;

+    else *(WORD*) (realBase+rxOutOfs) = ofs;

+    *(DWORD*) (realBase+pktDrop) = 0UL;

+    _enable();

+  }

+

+  PUBLIC WORD PktBuffersUsed (void)

+  {

+    WORD inOfs, outOfs;

+

+    _disable();

+    inOfs  = *(WORD*) (realBase+rxInOfs);

+    outOfs = *(WORD*) (realBase+rxOutOfs);

+    _enable();

+    if (inOfs >= outOfs)

+       return (inOfs - outOfs) / sizeof(RX_ELEMENT);

+    return (NUM_RX_BUF - (outOfs - inOfs) / sizeof(RX_ELEMENT));

+  }

+

+  PUBLIC DWORD PktRxDropped (void)

+  {

+    return *(DWORD*) (realBase+pktDrop);

+  }

+

+#else     /* real-mode small/large model */

+

+  PUBLIC int PktReceive (BYTE *buf, int max)

+  {

+    if (rxOutOfs != rxInOfs)

+    {

+      RX_ELEMENT far *head = (RX_ELEMENT far*) MK_FP (_DS,rxOutOfs);

+      int  size, len = max;

+

+      if (CheckElement(head))

+      {

+        size = min (head->firstCount, sizeof(RX_ELEMENT));

+        len  = min (size, max);

+        _fmemcpy (buf, &head->destin, len);

+      }

+      else

+        size = -1;

+

+      rxOutOfs += sizeof (RX_ELEMENT);

+      if (rxOutOfs > LAST_RX_BUF)

+          rxOutOfs = FIRST_RX_BUF;

+      return (size);

+    }

+    return (0);

+  }

+

+  PUBLIC void PktQueueBusy (BOOL busy)

+  {

+    rxOutOfs = busy ? (rxInOfs + sizeof(RX_ELEMENT)) : rxInOfs;

+    if (rxOutOfs > LAST_RX_BUF)

+        rxOutOfs = FIRST_RX_BUF;

+    pktDrop = 0L;

+  }

+

+  PUBLIC WORD PktBuffersUsed (void)

+  {

+    WORD inOfs  = rxInOfs;

+    WORD outOfs = rxOutOfs;

+

+    if (inOfs >= outOfs)

+       return ((inOfs - outOfs) / sizeof(RX_ELEMENT));

+    return (NUM_RX_BUF - (outOfs - inOfs) / sizeof(RX_ELEMENT));

+  }

+

+  PUBLIC DWORD PktRxDropped (void)

+  {

+    return (pktDrop);

+  }

+#endif

+

+/**************************************************************************/

+

+LOCAL __inline void PktFreeMem (void)

+{

+#if (DOSX & PHARLAP)

+  if (realSeg)

+  {

+    _dx_real_free (realSeg);

+    realSeg = 0;

+  }

+#elif (DOSX & DJGPP)

+  if (rm_mem.rm_segment)

+  {

+    unsigned ofs;  /* clear the DOS-mem to prevent further upcalls */

+

+    for (ofs = 0; ofs < 16 * rm_mem.size / 4; ofs += 4)

+       _farpokel (_dos_ds, realBase + ofs, 0);

+    _go32_dpmi_free_dos_memory (&rm_mem);

+    rm_mem.rm_segment = 0;

+  }

+#elif (DOSX & DOS4GW)

+  if (rm_base_sel)

+  {

+    dpmi_real_free (rm_base_sel);

+    rm_base_sel = 0;

+  }

+#endif

+}

+

+/**************************************************************************/

+

+PUBLIC BOOL PktExitDriver (void)

+{           

+  if (pktInfo.handle)

+  {

+    if (!PktSetReceiverMode(PDRX_BROADCAST))

+       PUTS ("Error restoring receiver mode.");

+

+    if (!PktReleaseHandle(pktInfo.handle))

+       PUTS ("Error releasing PKT-DRVR handle.");

+

+    PktFreeMem();

+    pktInfo.handle = 0;

+  }

+

+  if (pcap_pkt_debug >= 1)

+     printf ("Internal stats: too-small %lu, too-large %lu, bad-sync %lu, "

+             "wrong-handle %lu\n",

+             intStat.tooSmall, intStat.tooLarge,

+             intStat.badSync, intStat.wrongHandle);

+  return (TRUE);

+}

+

+#if (DOSX & (DJGPP|DOS4GW))

+static void dump_pkt_stub (void)

+{

+  int i;

+

+  fprintf (stderr, "PktReceiver %lu, pkt_stub[PktReceiver] =\n",

+           PktReceiver);

+  for (i = 0; i < 15; i++)

+      fprintf (stderr, "%02X, ", real_stub_array[i+PktReceiver]);

+  fputs ("\n", stderr);

+}

+#endif

+

+/*

+ * Front end initialization routine

+ */

+PUBLIC BOOL PktInitDriver (PKT_RX_MODE mode)

+{

+  PKT_RX_MODE rxMode;

+  BOOL   writeInfo = (pcap_pkt_debug >= 3);

+

+  pktInfo.quiet = (pcap_pkt_debug < 3);

+

+#if (DOSX & PHARLAP) && defined(__HIGHC__)

+  if (_mwenv != 2)

+  {

+    fprintf (stderr, "Only Pharlap DOS extender supported.\n");

+    return (FALSE);

+  }

+#endif

+

+#if (DOSX & PHARLAP) && defined(__WATCOMC__)

+  if (_Extender != 1)

+  {

+    fprintf (stderr, "Only DOS4GW style extenders supported.\n");

+    return (FALSE);

+  }

+#endif

+

+  if (!PktSearchDriver())

+  {

+    PUTS ("Packet driver not found.");

+    PktFreeMem();

+    return (FALSE);

+  }

+

+  if (!PktGetDriverInfo())

+  {

+    PUTS ("Error getting pkt-drvr information.");

+    PktFreeMem();

+    return (FALSE);

+  }

+

+#if (DOSX & PHARLAP)

+  if (RealCopy((ULONG)&rxOutOfs, (ULONG)&pktRxEnd,

+               &realBase, &protBase, (USHORT*)&realSeg))

+  {

+    rxOutOfsFp  = (WORD _far *) (protBase + (WORD) &rxOutOfs);

+    rxInOfsFp   = (WORD _far *) (protBase + (WORD) &rxInOfs);

+    *rxOutOfsFp = FIRST_RX_BUF;

+    *rxInOfsFp  = FIRST_RX_BUF;

+  }

+  else

+  {

+    PUTS ("Cannot allocate real-mode stub.");

+    return (FALSE);

+  }

+

+#elif (DOSX & (DJGPP|DOS4GW))

+  if (sizeof(real_stub_array) > 0xFFFF)

+  {

+    fprintf (stderr, "`real_stub_array[]' too big.\n");

+    return (FALSE);

+  }

+#if (DOSX & DJGPP)

+  rm_mem.size = (sizeof(real_stub_array) + 15) / 16;

+

+  if (_go32_dpmi_allocate_dos_memory(&rm_mem) || rm_mem.rm_offset != 0)

+  {

+    PUTS ("real-mode init failed.");

+    return (FALSE);

+  }

+  realBase = (rm_mem.rm_segment << 4);

+  dosmemput (&real_stub_array, sizeof(real_stub_array), realBase);

+  _farpokel (_dos_ds, realBase+rxOutOfs, FIRST_RX_BUF);

+  _farpokel (_dos_ds, realBase+rxInOfs,  FIRST_RX_BUF);

+

+#elif (DOSX & DOS4GW)

+  rm_base_seg = dpmi_real_malloc (sizeof(real_stub_array), &rm_base_sel);

+  if (!rm_base_seg)

+  {

+    PUTS ("real-mode init failed.");

+    return (FALSE);

+  }

+  realBase = (rm_base_seg << 4);

+  memcpy ((void*)realBase, &real_stub_array, sizeof(real_stub_array));

+  *(WORD*) (realBase+rxOutOfs) = FIRST_RX_BUF;

+  *(WORD*) (realBase+rxInOfs)  = FIRST_RX_BUF;

+

+#endif

+  {

+    int pushf = PktReceiver;

+

+    while (real_stub_array[pushf++] != 0x9C &&    /* pushf */

+           real_stub_array[pushf]   != 0xFA)      /* cli   */

+    {

+      if (++para_skip > 16)

+      {

+        fprintf (stderr, "Something wrong with `pkt_stub.inc'.\n");

+        para_skip = 0;

+        dump_pkt_stub();

+        return (FALSE);

+      }

+    }

+    if (*(WORD*)(real_stub_array + offsetof(PktRealStub,_dummy)) != 0xB800)

+    {

+      fprintf (stderr, "`real_stub_array[]' is misaligned.\n");

+      return (FALSE);

+    }

+  }

+

+  if (pcap_pkt_debug > 2)

+      dump_pkt_stub();

+

+#else

+  rxOutOfs = FIRST_RX_BUF;

+  rxInOfs  = FIRST_RX_BUF;

+#endif

+

+  if (!PktSetAccess())

+  {

+    PUTS ("Error setting pkt-drvr access.");

+    PktFreeMem();

+    return (FALSE);

+  }

+

+  if (!PktGetAddress(&myAddress))

+  {

+    PUTS ("Error fetching adapter address.");

+    PktFreeMem();

+    return (FALSE);

+  }

+

+  if (!PktSetReceiverMode(mode))

+  {

+    PUTS ("Error setting receiver mode.");

+    PktFreeMem();

+    return (FALSE);

+  }

+

+  if (!PktGetReceiverMode(&rxMode))

+  {

+    PUTS ("Error getting receiver mode.");

+    PktFreeMem();

+    return (FALSE);

+  }

+

+  if (writeInfo)

+     printf ("Pkt-driver information:\n"

+             "  Version  : %d.%d\n"

+             "  Name     : %.15s\n"

+             "  Class    : %u (%s)\n"

+             "  Type     : %u\n"

+             "  Number   : %u\n"

+             "  Funcs    : %u\n"

+             "  Intr     : %Xh\n"

+             "  Handle   : %u\n"

+             "  Extended : %s\n"

+             "  Hi-perf  : %s\n"

+             "  RX mode  : %s\n"

+             "  Eth-addr : %02X:%02X:%02X:%02X:%02X:%02X\n",

+

+             pktInfo.majVer, pktInfo.minVer, pktInfo.name,

+             pktInfo.class,  PktGetClassName(pktInfo.class),

+             pktInfo.type,   pktInfo.number,

+             pktInfo.funcs,  pktInfo.intr,   pktInfo.handle,

+             pktInfo.funcs == 2 || pktInfo.funcs == 6 ? "Yes" : "No",

+             pktInfo.funcs == 5 || pktInfo.funcs == 6 ? "Yes" : "No",

+             PktRXmodeStr(rxMode),

+             myAddress[0], myAddress[1], myAddress[2],

+             myAddress[3], myAddress[4], myAddress[5]);

+

+#if defined(DEBUG) && (DOSX & PHARLAP)

+  if (writeInfo)

+  {

+    DWORD    rAdr = realBase + (WORD)&PktReceiver;

+    unsigned sel, ofs;

+

+    printf ("\nReceiver at   %04X:%04X\n", RP_SEG(rAdr),    RP_OFF(rAdr));

+    printf ("Realbase    = %04X:%04X\n",   RP_SEG(realBase),RP_OFF(realBase));

+

+    sel = _FP_SEG (protBase);

+    ofs = _FP_OFF (protBase);

+    printf ("Protbase    = %04X:%08X\n", sel,ofs);

+    printf ("RealSeg     = %04X\n", realSeg);

+

+    sel = _FP_SEG (rxOutOfsFp);

+    ofs = _FP_OFF (rxOutOfsFp);

+    printf ("rxOutOfsFp  = %04X:%08X\n", sel,ofs);

+

+    sel = _FP_SEG (rxInOfsFp);

+    ofs = _FP_OFF (rxInOfsFp);

+    printf ("rxInOfsFp   = %04X:%08X\n", sel,ofs);

+

+    printf ("Ready: *rxOutOfsFp = %04X *rxInOfsFp = %04X\n",

+            *rxOutOfsFp, *rxInOfsFp);

+

+    PktQueueBusy (TRUE);

+    printf ("Busy:  *rxOutOfsFp = %04X *rxInOfsFp = %04X\n",

+            *rxOutOfsFp, *rxInOfsFp);

+  }

+#endif

+

+  memset (&pktStat, 0, sizeof(pktStat));  /* clear statistics */

+  PktQueueBusy (TRUE);

+  return (TRUE);

+}

+

+

+/*

+ * DPMI functions only for Watcom + DOS4GW extenders

+ */

+#if (DOSX & DOS4GW)

+LOCAL DWORD dpmi_get_real_vector (int intr)

+{

+  union REGS r;

+

+  r.x.eax = 0x200;

+  r.x.ebx = (DWORD) intr;

+  int386 (0x31, &r, &r);

+  return ((r.w.cx << 4) + r.w.dx);

+}

+

+LOCAL WORD dpmi_real_malloc (int size, WORD *selector)

+{

+  union REGS r;

+

+  r.x.eax = 0x0100;             /* DPMI allocate DOS memory */

+  r.x.ebx = (size + 15) / 16;   /* Number of paragraphs requested */

+  int386 (0x31, &r, &r);

+  if (r.w.cflag & 1)

+     return (0);

+

+  *selector = r.w.dx;

+  return (r.w.ax);              /* Return segment address */

+}

+

+LOCAL void dpmi_real_free (WORD selector)

+{

+  union REGS r;

+

+  r.x.eax = 0x101;              /* DPMI free DOS memory */

+  r.x.ebx = selector;           /* Selector to free */

+  int386 (0x31, &r, &r);

+}

+#endif

+

+

+#if defined(DOSX) && (DOSX & PHARLAP)

+/*

+ * Description:

+ *     This routine allocates conventional memory for the specified block

+ *     of code (which must be within the first 64K of the protected mode

+ *     program segment) and copies the code to it.

+ *

+ *     The caller should free up the conventional memory block when it

+ *     is done with the conventional memory.

+ *

+ *     NOTE THIS ROUTINE REQUIRES 386|DOS-EXTENDER 3.0 OR LATER.

+ *

+ * Calling arguments:

+ *     start_offs      start of real mode code in program segment

+ *     end_offs        1 byte past end of real mode code in program segment

+ *     real_basep      returned;  real mode ptr to use as a base for the

+ *                        real mode code (eg, to get the real mode FAR

+ *                        addr of a function foo(), take

+ *                        real_basep + (ULONG) foo).

+ *                        This pointer is constructed such that

+ *                        offsets within the real mode segment are

+ *                        the same as the link-time offsets in the

+ *                        protected mode program segment

+ *     prot_basep      returned;  prot mode ptr to use as a base for getting

+ *                        to the conventional memory, also constructed

+ *                        so that adding the prot mode offset of a

+ *                        function or variable to the base gets you a

+ *                        ptr to the function or variable in the

+ *                        conventional memory block.

+ *     rmem_adrp       returned;  real mode para addr of allocated

+ *                        conventional memory block, to be used to free

+ *                        up the conventional memory when done.  DO NOT

+ *                        USE THIS TO CONSTRUCT A REAL MODE PTR, USE

+ *                        REAL_BASEP INSTEAD SO THAT OFFSETS WORK OUT

+ *                        CORRECTLY.

+ *

+ * Returned values:

+ *     0      if error

+ *     1      if success

+ */

+int RealCopy (ULONG    start_offs,

+              ULONG    end_offs,

+              REALPTR *real_basep,

+              FARPTR  *prot_basep,

+              USHORT  *rmem_adrp)

+{

+  ULONG   rm_base;    /* base real mode para addr for accessing */

+                      /* allocated conventional memory          */

+  UCHAR  *source;     /* source pointer for copy                */

+  FARPTR  destin;     /* destination pointer for copy           */

+  ULONG   len;        /* number of bytes to copy                */

+  ULONG   temp;

+  USHORT  stemp;

+

+  /* First check for valid inputs

+   */

+  if (start_offs >= end_offs || end_offs > 0x10000)

+     return (FALSE);

+

+  /* Round start_offs down to a paragraph (16-byte) boundary so we can set up

+   * the real mode pointer easily. Round up end_offs to make sure we allocate

+   * enough paragraphs

+   */

+  start_offs &= ~15;

+  end_offs = (15 + (end_offs << 4)) >> 4;

+

+  /* Allocate the conventional memory for our real mode code.  Remember to

+   * round byte count UP to 16-byte paragraph size.  We alloc it

+   * above the DOS data buffer so both the DOS data buffer and the appl

+   * conventional mem block can still be resized.

+   *

+   * First just try to alloc it;  if we can't get it, shrink the appl mem

+   * block down to the minimum, try to alloc the memory again, then grow the

+   * appl mem block back to the maximum.  (Don't try to shrink the DOS data

+   * buffer to free conventional memory;  it wouldn't be good for this routine

+   * to have the possible side effect of making file I/O run slower.)

+   */

+  len = ((end_offs - start_offs) + 15) >> 4;

+  if (_dx_real_above(len, rmem_adrp, &stemp) != _DOSE_NONE)

+  {

+    if (_dx_cmem_usage(0, 0, &temp, &temp) != _DOSE_NONE)

+       return (FALSE);

+

+    if (_dx_real_above(len, rmem_adrp, &stemp) != _DOSE_NONE)

+       *rmem_adrp = 0;

+

+    if (_dx_cmem_usage(0, 1, &temp, &temp) != _DOSE_NONE)

+    {

+      if (*rmem_adrp != 0)

+         _dx_real_free (*rmem_adrp);

+      return (FALSE);

+    }

+

+    if (*rmem_adrp == 0)

+       return (FALSE);

+  }

+

+  /* Construct real mode & protected mode pointers to access the allocated

+   * memory.  Note we know start_offs is aligned on a paragraph (16-byte)

+   * boundary, because we rounded it down.

+   *

+   * We make the offsets come out rights by backing off the real mode selector

+   * by start_offs.

+   */

+  rm_base = ((ULONG) *rmem_adrp) - (start_offs >> 4);

+  RP_SET (*real_basep, 0, rm_base);

+  FP_SET (*prot_basep, rm_base << 4, SS_DOSMEM);

+

+  /* Copy the real mode code/data to the allocated memory

+   */

+  source = (UCHAR *) start_offs;

+  destin = *prot_basep;

+  FP_SET (destin, FP_OFF(*prot_basep) + start_offs, FP_SEL(*prot_basep));

+  len = end_offs - start_offs;

+  WriteFarMem (destin, source, len);

+

+  return (TRUE);

+}

+#endif /* DOSX && (DOSX & PHARLAP) */

diff --git a/msdos/pktdrvr.h b/msdos/pktdrvr.h
new file mode 100644
index 0000000..08898ae
--- /dev/null
+++ b/msdos/pktdrvr.h
@@ -0,0 +1,153 @@
+#ifndef __PKTDRVR_H

+#define __PKTDRVR_H

+

+#define PUBLIC

+#define LOCAL        static

+

+#define RX_BUF_SIZE  ETH_MTU   /* buffer size variables. NB !! */

+#define TX_BUF_SIZE  ETH_MTU   /* must be same as in pkt_rx*.* */

+

+#ifdef __HIGHC__

+#pragma Off(Align_members)

+#else

+#pragma pack(1)

+#endif

+

+typedef enum  {                /* Packet-driver classes */

+        PD_ETHER      = 1,

+        PD_PRONET10   = 2,

+        PD_IEEE8025   = 3,

+        PD_OMNINET    = 4,

+        PD_APPLETALK  = 5,

+        PD_SLIP       = 6,

+        PD_STARTLAN   = 7,

+        PD_ARCNET     = 8,

+        PD_AX25       = 9,

+        PD_KISS       = 10,

+        PD_IEEE8023_2 = 11,

+        PD_FDDI8022   = 12,

+        PD_X25        = 13,

+        PD_LANstar    = 14,

+        PD_PPP        = 18

+      } PKT_CLASS;

+

+typedef enum  {             /* Packet-driver receive modes    */

+        PDRX_OFF    = 1,    /* turn off receiver              */

+        PDRX_DIRECT,        /* receive only to this interface */

+        PDRX_BROADCAST,     /* DIRECT + broadcast packets     */

+        PDRX_MULTICAST1,    /* BROADCAST + limited multicast  */

+        PDRX_MULTICAST2,    /* BROADCAST + all multicast      */

+        PDRX_ALL_PACKETS,   /* receive all packets on network */

+      } PKT_RX_MODE;

+

+typedef struct {

+        char type[8];

+        char len;

+      } PKT_FRAME;

+

+

+typedef struct {

+        BYTE  class;        /* = 1 for DEC/Interl/Xerox Ethernet */

+        BYTE  number;       /* = 0 for single LAN adapter        */

+        WORD  type;         /* = 13 for 3C523                    */

+        BYTE  funcs;        /* Basic/Extended/HiPerf functions   */

+        WORD  intr;         /* user interrupt vector number      */

+        WORD  handle;       /* Handle associated with session    */

+        BYTE  name [15];    /* Name of adapter interface,ie.3C523*/

+        BOOL  quiet;        /* (don't) print errors to stdout    */

+        const char *error;  /* address of error string           */

+        BYTE  majVer;       /* Major driver implementation ver.  */

+        BYTE  minVer;       /* Minor driver implementation ver.  */

+        BYTE  dummyLen;     /* length of following data          */

+        WORD  MAClength;    /* HiPerformance data, N/A           */

+        WORD  MTU;          /* HiPerformance data, N/A           */

+        WORD  multicast;    /* HiPerformance data, N/A           */

+        WORD  rcvrBuffers;  /* valid for                         */

+        WORD  UMTbufs;      /*   High Performance drivers only   */

+        WORD  postEOIintr;  /*                  Usage ??         */

+      } PKT_INFO;

+

+#define PKT_PARAM_SIZE  14    /* members majVer - postEOIintr */

+

+

+typedef struct {

+        DWORD inPackets;          /* # of packets received    */

+        DWORD outPackets;         /* # of packets transmitted */

+        DWORD inBytes;            /* # of bytes received      */

+        DWORD outBytes;           /* # of bytes transmitted   */

+        DWORD inErrors;           /* # of reception errors    */

+        DWORD outErrors;          /* # of transmission errors */

+        DWORD lost;               /* # of packets lost (RX)   */

+      } PKT_STAT;

+                   

+

+typedef struct {

+        ETHER destin;

+        ETHER source;

+        WORD  proto;

+        BYTE  data [TX_BUF_SIZE];

+      } TX_ELEMENT;

+

+typedef struct {

+        WORD  firstCount;         /* # of bytes on 1st         */

+        WORD  secondCount;        /* and 2nd upcall            */

+        WORD  handle;             /* instance that upcalled    */

+        ETHER destin;             /* E-net destination address */

+        ETHER source;             /* E-net source address      */

+        WORD  proto;              /* protocol number           */

+        BYTE  data [RX_BUF_SIZE];

+      } RX_ELEMENT;

+

+

+#ifdef __HIGHC__

+#pragma pop(Align_members)

+#else

+#pragma pack()

+#endif

+

+

+/*

+ * Prototypes for publics

+ */

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+extern PKT_STAT    pktStat;     /* statistics for packets */

+extern PKT_INFO    pktInfo;     /* packet-driver information */

+

+extern PKT_RX_MODE receiveMode;

+extern ETHER       myAddress, ethBroadcast;

+

+extern BOOL  PktInitDriver (PKT_RX_MODE mode);

+extern BOOL  PktExitDriver (void);

+

+extern const char *PktGetErrorStr    (int errNum);

+extern const char *PktGetClassName   (WORD class);

+extern const char *PktRXmodeStr      (PKT_RX_MODE mode);

+extern BOOL        PktSearchDriver   (void);

+extern int         PktReceive        (BYTE *buf, int max);

+extern BOOL        PktTransmit       (const void *eth, int len);

+extern DWORD       PktRxDropped      (void);

+extern BOOL        PktReleaseHandle  (WORD handle);

+extern BOOL        PktTerminHandle   (WORD handle);

+extern BOOL        PktResetInterface (WORD handle);

+extern BOOL        PktSetReceiverMode(PKT_RX_MODE  mode);

+extern BOOL        PktGetReceiverMode(PKT_RX_MODE *mode);

+extern BOOL        PktGetStatistics  (WORD handle);

+extern BOOL        PktSessStatistics (WORD handle);

+extern BOOL        PktResetStatistics(WORD handle);

+extern BOOL        PktGetAddress     (ETHER *addr);

+extern BOOL        PktSetAddress     (const ETHER *addr);

+extern BOOL        PktGetDriverInfo  (void);

+extern BOOL        PktGetDriverParam (void);

+extern void        PktQueueBusy      (BOOL busy);

+extern WORD        PktBuffersUsed    (void);

+

+#ifdef __cplusplus

+}

+#endif

+

+#endif /* __PKTDRVR_H */

+

diff --git a/msdos/readme.dos b/msdos/readme.dos
new file mode 100644
index 0000000..02ef1f7
--- /dev/null
+++ b/msdos/readme.dos
@@ -0,0 +1,162 @@
+@(#) $Header: /tcpdump/master/libpcap/msdos/readme.dos,v 1.3 2004-12-19 19:47:01 guy Exp $ (LBL)
+
+libpcap for DOS
+---------------
+
+This file contains some notes on building and using libpcap for MS-DOS.
+Look in `README' and `pcap.man' for usage and details. These targets are
+supported:
+
+ - Borland C 4.0+ small or large model.
+ - Metaware HighC 3.1+ with PharLap DOS-extender
+ - GNU C 2.7+ with djgpp 2.01+ DOS extender
+ - Watcom C 11.x with DOS4GW extender
+
+Note: the files in the libpcap.zip contains short trucated filenames.
+  So for djgpp to work with these, disable the use of long file names by
+  setting "LFN=n" in the environment.
+
+Files specific to DOS are pcap-dos.[ch] and the assembly and C files in
+the MSDOS sub-directory. Remember to built lipcap libraries from the top
+install directory. And not from the MSDOS sub-directory.
+
+Note for djgpp users:
+  If you got the libpcap from the official site www.tcpdump, then that
+  distribution does NOT contain any sources for building 32-bit drivers.
+  Instead get the full version at
+     http://www.bgnett.no/~giva/pcap/libpcap.zip
+
+  and set "USE_32BIT_DRIVERS = 1" in msdos\common.dj.
+
+
+
+Requirements
+------------
+
+DOS-libpcap currently only works reliably with a real-mode Ethernet packet-
+driver. This driver must be installed prior to using any program (e.g.
+tcpdump) compiled with libpcap. Work is underway to implement protected-
+mode drivers for 32-bit targets (djgpp only). The 3Com 3c509 driver is
+working almost perfectly. Due to lack of LAN-cards, I've not had the
+opportunity to test other drivers. These 32-bit drivers are modified
+Linux drivers.
+
+
+Required packages
+-----------------
+
+The following packages and tools must be present for all targets.
+
+1. Watt-32 tcp/ip library. This library is *not* used to send or
+   receive network data. It's mostly used to access the 'hosts'
+   file and other <netdb.h> features. Get 'watt32s*.zip' at:
+
+     http://www.bgnett.no/~giva/
+
+2. Exception handler and disassember library (libexc.a) is needed if
+   "USE_EXCEPT = 1" in common.dj. Available at:
+
+     http://www.bgnett.no/~giva/misc/exc_dx07.zip
+
+3. Flex & Bison is used to generate parser for the filter handler
+   pcap_compile:
+
+     ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/flx254b.zip
+     ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/bsn128b.zip
+
+4. NASM assembler v 0.98 or later is required when building djgpp and
+   Watcom targets:
+
+     ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2tk/nasm098p.zip
+
+5. sed (Stream Editor) is required for doing `make depend'.
+   It's available at
+     ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/sed*.zip
+
+   A touch tool to update the time-stamp of a file. E.g.
+     ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/grep*.zip
+
+6. For djgpp rm.exe and cp.exe are required. These should already be
+   part of your djgpp installation. Also required (experimental at the
+   time) for djgpp is DLX 2.91 or later. This tool is for the generation
+   of dynamically loadable modules.
+
+
+Compiling libpcap
+-----------------
+
+Follow these steps in building libpcap:
+
+1. Make sure you've installed Watt-32 properly (see it's `INSTALL' file).
+   During that installation a environment variable `WATT_ROOT' is set.
+   This variable is used for building libpcap also (`WATT_INC' is
+   deducted from `WATT_ROOT'). djgpp users should also define environment
+   variables `C_INCLUDE_PATH' and `LIBRARY_PATH' to point to the include
+   directory and library directory respectively.  E.g. put this in your
+   AUTOEXEC.BAT:
+     set C_INCLUDE_PATH=c:/net/watt/inc
+     set LIBRARY_PATH=c:/net/watt/lib
+
+2. Revise the msdos/common.dj file for your djgpp/gcc installation;
+   - change the value of `GCCLIB' to match location of libgcc.a.
+   - set `USE_32BIT_DRIVERS = 1' to build 32-bit driver objects.
+
+
+3. Build pcap by using appropriate makefile. For djgpp, use:
+     `make -f msdos/makefile.dj'  (i.e. GNU `make')
+
+   For a Watcom target say:
+     `wmake -f msdos\makefile.wc'
+
+   For a Borland target say:
+     `maker -f msdos\Makefile pcap_bc.lib'  (Borland's `maker.exe')
+
+   And for a HighC/Pharlap target say:
+     `maker -f msdos\Makefile pcap_hc.lib'  (Borland's `maker.exe')
+
+   You might like to change some `CFLAGS' -- only `DEBUG' define currently
+   have any effect. It shows a rotating "fan" in upper right corner of
+   screen.  Remove `DEBUG' if you don't like it. You could add
+   `-fomit-frame-pointer' to `CFLAGS' to speed up the generated code.
+   But note, this makes debugging and crash-traceback difficult. Only
+   add it if you're fully confident your application is 100% stable.
+
+   Note: Code in `USE_NDIS2' does not work at the moment.
+
+4. The resulting libraries are put in current directory. There's no
+   test-program for `libpcap'. Linking the library with `tcpdump' is
+   the ultimate test anyway.
+
+
+
+Extensions to libpcap
+---------------------
+
+I've included some extra functions to DOS-libpcap:
+
+  `pcap_config_hook (const char *name, const char *value)' 
+
+    Allows an application to set values of internal libpcap variables.
+    `name' is typically a left-side keyword with an associated `value'
+    that is called from application's configure process (see tcpdump's
+    config.c file). libpcap keeps a set of tables that are searched for
+    a name/value match. Currently only used to set debug-levels and
+    parameters for the 32-bit network drivers.
+
+  `pcap_set_wait (pcap_t *, void (*)(void), int)' :
+
+    Only effective when reading offline traffic from dump-files.
+    Function `pcap_offline_read()' will wait (and optionally yield)
+    before printing next packet. This will simulate the pace the packets
+    where actually recorded.
+
+
+
+Happy sniffing !
+
+
+Gisle Vanem <giva@bgnett.no>
+            <gvanem@broadpark.no>
+
+October 1999, 2004
+
diff --git a/nametoaddr.c b/nametoaddr.c
index d60e93d..55439f7 100644
--- a/nametoaddr.c
+++ b/nametoaddr.c
@@ -24,13 +24,18 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/nametoaddr.c,v 1.77.2.4 2007/06/11 09:52:05 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 @@
 #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
 /*
@@ -80,7 +78,7 @@
 #include "pcap-int.h"
 
 #include "gencode.h"
-#include <pcap-namedb.h>
+#include <pcap/namedb.h>
 
 #ifdef HAVE_OS_PROTO_H
 #include "os-proto.h"
@@ -249,6 +247,7 @@
 			free(cpy);
 			return 0;
 		}
+		free(cpy);
 
 		if (*proto != save_proto)
 			*proto = PROTO_UNDEF;
@@ -398,7 +397,15 @@
 }
 
 /*
- * Convert 's' which has the form "xx:xx:xx:xx:xx:xx" into a new
+ * Convert 's', which can have the one of the forms:
+ *
+ *	"xx:xx:xx:xx:xx:xx"
+ *	"xx.xx.xx.xx.xx.xx"
+ *	"xx-xx-xx-xx-xx-xx"
+ *	"xxxx.xxxx.xxxx"
+ *	"xxxxxxxxxxxx"
+ *
+ * (or various mixes of ':', '.', and '-') into a new
  * ethernet address.  Assumes 's' is well formed.
  */
 u_char *
@@ -408,9 +415,11 @@
 	register u_int d;
 
 	e = ep = (u_char *)malloc(6);
+	if (e == NULL)
+		return (NULL);
 
 	while (*s) {
-		if (*s == ':')
+		if (*s == ':' || *s == '.' || *s == '-')
 			s += 1;
 		d = xdtoi(*s++);
 		if (isxdigit((unsigned char)*s)) {
diff --git a/nlpid.h b/nlpid.h
index c3ab8c2..5327a36 100644
--- a/nlpid.h
+++ b/nlpid.h
@@ -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 */
diff --git a/optimize.c b/optimize.c
index bc3ac5d..8215543 100644
--- a/optimize.c
+++ b/optimize.c
@@ -22,13 +22,27 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/optimize.c,v 1.85.2.3 2007/09/12 21:29:45 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>
@@ -53,6 +67,10 @@
 #define ffs _w32_ffs
 #endif
 
+#if defined(WIN32) && defined (_MSC_VER)
+int ffs(int mask);
+#endif
+
 /*
  * Represents a deleted instruction.
  */
@@ -94,51 +112,9 @@
 static void opt_init(struct block *);
 static void opt_cleanup(void);
 
-static void make_marks(struct block *);
-static void mark_code(struct block *);
-
 static void intern_blocks(struct block *);
 
-static int eq_slist(struct slist *, struct slist *);
-
-static void find_levels_r(struct block *);
-
-static void find_levels(struct block *);
-static void find_dom(struct block *);
-static void propedom(struct edge *);
-static void find_edom(struct block *);
-static void find_closure(struct block *);
-static int atomuse(struct stmt *);
-static int atomdef(struct stmt *);
-static void compute_local_ud(struct block *);
-static void find_ud(struct block *);
-static void init_val(void);
-static int F(int, int, int);
-static inline void vstore(struct stmt *, int *, int, int);
-static void opt_blk(struct block *, int);
-static int use_conflict(struct block *, struct block *);
-static void opt_j(struct edge *);
-static void or_pullup(struct block *);
-static void and_pullup(struct block *);
-static void opt_blks(struct block *, int);
-static inline void link_inedge(struct edge *, struct block *);
 static void find_inedges(struct block *);
-static void opt_root(struct block **);
-static void opt_loop(struct block *, int);
-static void fold_op(struct stmt *, int, int);
-static inline struct slist *this_op(struct slist *);
-static void opt_not(struct block *);
-static void opt_peep(struct block *);
-static void opt_stmt(struct stmt *, int[], int);
-static void deadstmt(struct stmt *, struct stmt *[]);
-static void opt_deadstores(struct block *);
-static struct block *fold_edge(struct block *, struct edge *);
-static inline int eq_blk(struct block *, struct block *);
-static int slength(struct slist *);
-static int count_blocks(struct block *);
-static void number_blks_r(struct block *);
-static int count_stmts(struct block *);
-static int convert_code_r(struct block *);
 #ifdef BDEBUG
 static void opt_dump(struct block *);
 #endif
@@ -214,8 +190,7 @@
 #endif
 
 static void
-find_levels_r(b)
-	struct block *b;
+find_levels_r(struct block *b)
 {
 	int level;
 
@@ -243,8 +218,7 @@
  * with the 'link' field of the struct block.
  */
 static void
-find_levels(root)
-	struct block *root;
+find_levels(struct block *root)
 {
 	memset((char *)levels, 0, n_blocks * sizeof(*levels));
 	unMarkAll();
@@ -256,8 +230,7 @@
  * Assumes graph has been leveled.
  */
 static void
-find_dom(root)
-	struct block *root;
+find_dom(struct block *root)
 {
 	int i;
 	struct block *b;
@@ -287,8 +260,7 @@
 }
 
 static void
-propedom(ep)
-	struct edge *ep;
+propedom(struct edge *ep)
 {
 	SET_INSERT(ep->edom, ep->id);
 	if (ep->succ) {
@@ -302,8 +274,7 @@
  * Assumes graph has been leveled and predecessors established.
  */
 static void
-find_edom(root)
-	struct block *root;
+find_edom(struct block *root)
 {
 	int i;
 	uset x;
@@ -332,8 +303,7 @@
  * Assumes graph has been leveled.
  */
 static void
-find_closure(root)
-	struct block *root;
+find_closure(struct block *root)
 {
 	int i;
 	struct block *b;
@@ -363,8 +333,7 @@
  * The implementation should probably change to an array access.
  */
 static int
-atomuse(s)
-	struct stmt *s;
+atomuse(struct stmt *s)
 {
 	register int c = s->code;
 
@@ -409,8 +378,7 @@
  * The implementation should probably change to an array access.
  */
 static int
-atomdef(s)
-	struct stmt *s;
+atomdef(struct stmt *s)
 {
 	if (s->code == NOP)
 		return -1;
@@ -446,8 +414,7 @@
  * register by a predecessor block of this block.
  */
 static void
-compute_local_ud(b)
-	struct block *b;
+compute_local_ud(struct block *b)
 {
 	struct slist *s;
 	atomset def = 0, use = 0, kill = 0;
@@ -508,8 +475,7 @@
  * Assume graph is already leveled.
  */
 static void
-find_ud(root)
-	struct block *root;
+find_ud(struct block *root)
 {
 	int i, maxlevel;
 	struct block *p;
@@ -564,7 +530,7 @@
 struct valnode *next_vnode;
 
 static void
-init_val()
+init_val(void)
 {
 	curval = 0;
 	next_vnode = vnode_base;
@@ -574,9 +540,7 @@
 
 /* Because we really don't have an IR, this stuff is a little messy. */
 static int
-F(code, v0, v1)
-	int code;
-	int v0, v1;
+F(int code, int v0, int v1)
 {
 	u_int hash;
 	int val;
@@ -607,11 +571,7 @@
 }
 
 static inline void
-vstore(s, valp, newval, alter)
-	struct stmt *s;
-	int *valp;
-	int newval;
-	int alter;
+vstore(struct stmt *s, int *valp, int newval, int alter)
 {
 	if (alter && *valp == newval)
 		s->code = NOP;
@@ -619,10 +579,12 @@
 		*valp = newval;
 }
 
+/*
+ * Do constant-folding on binary operators.
+ * (Unary operators are handled elsewhere.)
+ */
 static void
-fold_op(s, v0, v1)
-	struct stmt *s;
-	int v0, v1;
+fold_op(struct stmt *s, int v0, int v1)
 {
 	bpf_u_int32 a, b;
 
@@ -664,10 +626,6 @@
 		a >>= b;
 		break;
 
-	case BPF_NEG:
-		a = -a;
-		break;
-
 	default:
 		abort();
 	}
@@ -677,8 +635,7 @@
 }
 
 static inline struct slist *
-this_op(s)
-	struct slist *s;
+this_op(struct slist *s)
 {
 	while (s != 0 && s->s.code == NOP)
 		s = s->next;
@@ -686,8 +643,7 @@
 }
 
 static void
-opt_not(b)
-	struct block *b;
+opt_not(struct block *b)
 {
 	struct block *tmp = JT(b);
 
@@ -696,8 +652,7 @@
 }
 
 static void
-opt_peep(b)
-	struct block *b;
+opt_peep(struct block *b)
 {
 	struct slist *s;
 	struct slist *next, *last;
@@ -906,6 +861,17 @@
 			JF(b) = JT(b);
 	}
 	/*
+	 * If we're comparing against the index register, and the index
+	 * register is a known constant, we can just compare against that
+	 * constant.
+	 */
+	val = b->val[X_ATOM];
+	if (vmap[val].is_const && BPF_SRC(b->s.code) == BPF_X) {
+		bpf_int32 v = vmap[val].const_val;
+		b->s.code &= ~BPF_X;
+		b->s.k = v;
+	}
+	/*
 	 * If the accumulator is a known constant, we can compute the
 	 * comparison result.
 	 */
@@ -949,10 +915,7 @@
  * evaluation and code transformations weren't folded together.
  */
 static void
-opt_stmt(s, val, alter)
-	struct stmt *s;
-	int val[];
-	int alter;
+opt_stmt(struct stmt *s, int val[], int alter)
 {
 	int op;
 	int v;
@@ -1137,9 +1100,7 @@
 }
 
 static void
-deadstmt(s, last)
-	register struct stmt *s;
-	register struct stmt *last[];
+deadstmt(register struct stmt *s, register struct stmt *last[])
 {
 	register int atom;
 
@@ -1163,8 +1124,7 @@
 }
 
 static void
-opt_deadstores(b)
-	register struct block *b;
+opt_deadstores(register struct block *b)
 {
 	register struct slist *s;
 	register int atom;
@@ -1184,9 +1144,7 @@
 }
 
 static void
-opt_blk(b, do_stmts)
-	struct block *b;
-	int do_stmts;
+opt_blk(struct block *b, int do_stmts)
 {
 	struct slist *s;
 	struct edge *p;
@@ -1290,8 +1248,7 @@
  * from 'b'.
  */
 static int
-use_conflict(b, succ)
-	struct block *b, *succ;
+use_conflict(struct block *b, struct block *succ)
 {
 	int atom;
 	atomset use = succ->out_use;
@@ -1307,9 +1264,7 @@
 }
 
 static struct block *
-fold_edge(child, ep)
-	struct block *child;
-	struct edge *ep;
+fold_edge(struct block *child, struct edge *ep)
 {
 	int sense;
 	int aval0, aval1, oval0, oval1;
@@ -1360,10 +1315,8 @@
 	return 0;
 }
 
-#include "ffs.h"
 static void
-opt_j(ep)
-	struct edge *ep;
+opt_j(struct edge *ep)
 {
 	register int i, k;
 	register struct block *target;
@@ -1418,8 +1371,7 @@
 
 
 static void
-or_pullup(b)
-	struct block *b;
+or_pullup(struct block *b)
 {
 	int val, at_top;
 	struct block *pull;
@@ -1511,8 +1463,7 @@
 }
 
 static void
-and_pullup(b)
-	struct block *b;
+and_pullup(struct block *b)
 {
 	int val, at_top;
 	struct block *pull;
@@ -1603,9 +1554,7 @@
 }
 
 static void
-opt_blks(root, do_stmts)
-	struct block *root;
-	int do_stmts;
+opt_blks(struct block *root, int do_stmts)
 {
 	int i, maxlevel;
 	struct block *p;
@@ -1642,17 +1591,14 @@
 }
 
 static inline void
-link_inedge(parent, child)
-	struct edge *parent;
-	struct block *child;
+link_inedge(struct edge *parent, struct block *child)
 {
 	parent->next = child->in_edges;
 	child->in_edges = parent;
 }
 
 static void
-find_inedges(root)
-	struct block *root;
+find_inedges(struct block *root)
 {
 	int i;
 	struct block *b;
@@ -1673,8 +1619,7 @@
 }
 
 static void
-opt_root(b)
-	struct block **b;
+opt_root(struct block **b)
 {
 	struct slist *tmp, *s;
 
@@ -1698,9 +1643,7 @@
 }
 
 static void
-opt_loop(root, do_stmts)
-	struct block *root;
-	int do_stmts;
+opt_loop(struct block *root, int do_stmts)
 {
 
 #ifdef BDEBUG
@@ -1730,8 +1673,7 @@
  * Optimize the filter code in its dag representation.
  */
 void
-bpf_optimize(rootp)
-	struct block **rootp;
+bpf_optimize(struct block **rootp)
 {
 	struct block *root;
 
@@ -1758,8 +1700,7 @@
 }
 
 static void
-make_marks(p)
-	struct block *p;
+make_marks(struct block *p)
 {
 	if (!isMarked(p)) {
 		Mark(p);
@@ -1775,8 +1716,7 @@
  * only for nodes that are alive.
  */
 static void
-mark_code(p)
-	struct block *p;
+mark_code(struct block *p)
 {
 	cur_mark += 1;
 	make_marks(p);
@@ -1787,8 +1727,7 @@
  * the accumulator.
  */
 static int
-eq_slist(x, y)
-	struct slist *x, *y;
+eq_slist(struct slist *x, struct slist *y)
 {
 	while (1) {
 		while (x && x->s.code == NOP)
@@ -1807,8 +1746,7 @@
 }
 
 static inline int
-eq_blk(b0, b1)
-	struct block *b0, *b1;
+eq_blk(struct block *b0, struct block *b1)
 {
 	if (b0->s.code == b1->s.code &&
 	    b0->s.k == b1->s.k &&
@@ -1819,8 +1757,7 @@
 }
 
 static void
-intern_blocks(root)
-	struct block *root;
+intern_blocks(struct block *root)
 {
 	struct block *p;
 	int i, j;
@@ -1863,7 +1800,7 @@
 }
 
 static void
-opt_cleanup()
+opt_cleanup(void)
 {
 	free((void *)vnode_base);
 	free((void *)vmap);
@@ -1876,11 +1813,10 @@
 /*
  * Return the number of stmts in 's'.
  */
-static int
-slength(s)
-	struct slist *s;
+static u_int
+slength(struct slist *s)
 {
-	int n = 0;
+	u_int n = 0;
 
 	for (; s; s = s->next)
 		if (s->s.code != NOP)
@@ -1893,8 +1829,7 @@
  * All nodes should be initially unmarked.
  */
 static int
-count_blocks(p)
-	struct block *p;
+count_blocks(struct block *p)
 {
 	if (p == 0 || isMarked(p))
 		return 0;
@@ -1907,8 +1842,7 @@
  * the basic blocks, and entering them into the 'blocks' array.`
  */
 static void
-number_blks_r(p)
-	struct block *p;
+number_blks_r(struct block *p)
 {
 	int n;
 
@@ -1942,11 +1876,10 @@
  *
  *	an extra long jump if the false branch requires it (p->longjf).
  */
-static int
-count_stmts(p)
-	struct block *p;
+static u_int
+count_stmts(struct block *p)
 {
-	int n;
+	u_int n;
 
 	if (p == 0 || isMarked(p))
 		return 0;
@@ -1961,8 +1894,7 @@
  * from the total number of blocks and/or statements.
  */
 static void
-opt_init(root)
-	struct block *root;
+opt_init(struct block *root)
 {
 	bpf_u_int32 *p;
 	int i, n, max_stmts;
@@ -2060,8 +1992,7 @@
  * properly.
  */
 static int
-convert_code_r(p)
-	struct block *p;
+convert_code_r(struct block *p)
 {
 	struct bpf_insn *dst;
 	struct slist *src;
@@ -2233,11 +2164,9 @@
  * done with the filter program.  See the pcap man page.
  */
 struct bpf_insn *
-icode_to_fcode(root, lenp)
-	struct block *root;
-	int *lenp;
+icode_to_fcode(struct block *root, u_int *lenp)
 {
-	int n;
+	u_int n;
 	struct bpf_insn *fp;
 
 	/*
@@ -2278,6 +2207,15 @@
 	size_t prog_size;
 
 	/*
+	 * Validate the program.
+	 */
+	if (!bpf_validate(fp->bf_insns, fp->bf_len)) {
+		snprintf(p->errbuf, sizeof(p->errbuf),
+			"BPF program is not valid");
+		return (-1);
+	}
+
+	/*
 	 * Free up any already installed program.
 	 */
 	pcap_freecode(&p->fcode);
@@ -2296,8 +2234,7 @@
 
 #ifdef BDEBUG
 static void
-opt_dump(root)
-	struct block *root;
+opt_dump(struct block *root)
 {
 	struct bpf_program f;
 
diff --git a/org.tcpdump.chmod_bpf.plist b/org.tcpdump.chmod_bpf.plist
new file mode 100644
index 0000000..8ad6852
--- /dev/null
+++ b/org.tcpdump.chmod_bpf.plist
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>Label</key>
+	<string>org.tcpdump.chmod_bpf</string>
+	<key>RunAtLoad</key>
+	<true/>
+	<key>Program</key>
+	<string>/usr/local/bin/chmod_bpf</string>
+	<key>ProgramArguments</key>
+	<array>
+		<string>/usr/local/bin/chmod_bpf</string>
+	</array>
+</dict>
+</plist>
diff --git a/packaging/pcap.spec b/packaging/pcap.spec
deleted file mode 100644
index 7df7abc..0000000
--- a/packaging/pcap.spec
+++ /dev/null
@@ -1,65 +0,0 @@
-%define prefix   /usr
-%define version 0.9.4
-
-Summary: packet capture library
-Name: libpcap
-Version: %version
-Release: 1
-Group: Development/Libraries
-Copyright: BSD
-Source: libpcap-0.9.4.tar.gz
-BuildRoot: /tmp/%{name}-buildroot
-URL: http://www.tcpdump.org
-
-%description
-Packet-capture library LIBPCAP 0.9.4
-Now maintained by "The Tcpdump Group"
-See http://www.tcpdump.org
-Please send inquiries/comments/reports to tcpdump-workers@tcpdump.org
-
-%prep
-%setup
-
-%post
-ldconfig
-
-%build
-CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%prefix
-make
-
-%install
-rm -rf $RPM_BUILD_ROOT
-mkdir -p $RPM_BUILD_ROOT/usr/{lib,include}
-mkdir -p $RPM_BUILD_ROOT/usr/share/man
-mkdir -p $RPM_BUILD_ROOT/usr/include/net
-mkdir -p $RPM_BUILD_ROOT/usr/man/man3
-make install DESTDIR=$RPM_BUILD_ROOT mandir=/usr/share/man
-cd $RPM_BUILD_ROOT/usr/lib
-V1=`echo 0.9.4 | sed 's/\\.[^\.]*$//g'`
-V2=`echo 0.9.4 | sed 's/\\.[^\.]*\.[^\.]*$//g'`
-ln -sf libpcap.so.0.9.4 libpcap.so.$V1
-if test "$V2" -ne "$V1"; then
-    ln -sf libpcap.so.$V1 libpcap.so.$V2
-    ln -sf libpcap.so.$V2 libpcap.so
-else
-    ln -sf libpcap.so.$V1 libpcap.so
-fi
-
-#install -m 755 -o root libpcap.a $RPM_BUILD_ROOT/usr/lib
-#install -m 644 -o root pcap.3 $RPM_BUILD_ROOT/usr/man/man3
-#install -m 644 -o root pcap.h $RPM_BUILD_ROOT/usr/include
-#install -m 644 -o root pcap-bpf.h $RPM_BUILD_ROOT/usr/include/net
-#install -m 644 -o root pcap-namedb.h $RPM_BUILD_ROOT/usr/include
-
-%clean
-rm -rf $RPM_BUILD_ROOT
-
-%files
-%defattr(-,root,root)
-%doc LICENSE CHANGES INSTALL.txt README.linux TODO VERSION CREDITS packaging/pcap.spec
-/usr/lib/libpcap.a
-/usr/share/man/man3/*
-/usr/include/pcap.h
-/usr/include/pcap-bpf.h
-/usr/include/pcap-namedb.h
-/usr/lib/libpcap.so*
diff --git a/packaging/pcap.spec.in b/packaging/pcap.spec.in
index 388427e..ff7b996 100644
--- a/packaging/pcap.spec.in
+++ b/packaging/pcap.spec.in
@@ -1,65 +1,77 @@
 %define prefix   /usr
 %define version @VERSION@
 
-Summary: packet capture library
+Summary: A system-independent interface for user-level packet capture
 Name: libpcap
 Version: %version
 Release: 1
 Group: Development/Libraries
-Copyright: BSD
+License: BSD with advertising
 Source: @NAME@.tar.gz
 BuildRoot: /tmp/%{name}-buildroot
 URL: http://www.tcpdump.org
 
+Source: http://www.tcpdump.org/release/%{name}-%{version}.tar.gz
+
 %description
-Packet-capture library LIBPCAP @VERSION@
-Now maintained by "The Tcpdump Group"
-See http://www.tcpdump.org
-Please send inquiries/comments/reports to tcpdump-workers@tcpdump.org
+Libpcap provides a portable framework for low-level network
+monitoring.  Libpcap can provide network statistics collection,
+security monitoring and network debugging.  Since almost every system
+vendor provides a different interface for packet capture, the libpcap
+authors created this system-independent API to ease in porting and to
+alleviate the need for several system-dependent packet capture modules
+in each application.
 
+Install libpcap if you need to do low-level network traffic monitoring
+on your network.
+
+%package devel
+Summary: Libraries and header files for the libpcap library
+Group: Development/Libraries
+
+%description devel
+Libpcap provides a portable framework for low-level network
+monitoring.  Libpcap can provide network statistics collection,
+security monitoring and network debugging.  Since almost every system
+vendor provides a different interface for packet capture, the libpcap
+authors created this system-independent API to ease in porting and to
+alleviate the need for several system-dependent packet capture modules
+in each application.
+
+This package provides the libraries, include files, and other 
+resources needed for developing libpcap applications.
+ 
 %prep
-%setup
-
-%post
-ldconfig
+%setup -q
 
 %build
-CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%prefix
-make
+export CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing"
+%configure
+make %{?_smp_mflags}
 
 %install
 rm -rf $RPM_BUILD_ROOT
-mkdir -p $RPM_BUILD_ROOT/usr/{lib,include}
-mkdir -p $RPM_BUILD_ROOT/usr/share/man
-mkdir -p $RPM_BUILD_ROOT/usr/include/net
-mkdir -p $RPM_BUILD_ROOT/usr/man/man3
-make install DESTDIR=$RPM_BUILD_ROOT mandir=/usr/share/man
-cd $RPM_BUILD_ROOT/usr/lib
-V1=`echo @VERSION@ | sed 's/\\.[^\.]*$//g'`
-V2=`echo @VERSION@ | sed 's/\\.[^\.]*\.[^\.]*$//g'`
-ln -sf libpcap.so.@VERSION@ libpcap.so.$V1
-if test "$V2" -ne "$V1"; then
-    ln -sf libpcap.so.$V1 libpcap.so.$V2
-    ln -sf libpcap.so.$V2 libpcap.so
-else
-    ln -sf libpcap.so.$V1 libpcap.so
-fi
 
-#install -m 755 -o root libpcap.a $RPM_BUILD_ROOT/usr/lib
-#install -m 644 -o root pcap.3 $RPM_BUILD_ROOT/usr/man/man3
-#install -m 644 -o root pcap.h $RPM_BUILD_ROOT/usr/include
-#install -m 644 -o root pcap-bpf.h $RPM_BUILD_ROOT/usr/include/net
-#install -m 644 -o root pcap-namedb.h $RPM_BUILD_ROOT/usr/include
+make DESTDIR=$RPM_BUILD_ROOT install
 
 %clean
 rm -rf $RPM_BUILD_ROOT
 
 %files
 %defattr(-,root,root)
-%doc LICENSE CHANGES INSTALL.txt README.linux TODO VERSION CREDITS packaging/pcap.spec
-/usr/lib/libpcap.a
-/usr/share/man/man3/*
-/usr/include/pcap.h
-/usr/include/pcap-bpf.h
-/usr/include/pcap-namedb.h
-/usr/lib/libpcap.so*
+%doc LICENSE README CHANGES INSTALL.txt README.linux TODO VERSION CREDITS packaging/pcap.spec
+%{_libdir}/libpcap.so.*
+%{_mandir}/man7/pcap*.7*
+
+%files devel
+%defattr(-,root,root)
+%{_bindir}/pcap-config
+%{_includedir}/pcap/*.h
+%{_includedir}/pcap.h
+%{_includedir}/pcap-bpf.h
+%{_includedir}/pcap-namedb.h
+%{_libdir}/libpcap.so
+%{_libdir}/libpcap.a
+%{_mandir}/man1/pcap-config.1*
+%{_mandir}/man3/pcap*.3*
+%{_mandir}/man5/pcap*.5*
diff --git a/pcap-bpf.c b/pcap-bpf.c
index 027913e..250298a 100644
--- a/pcap-bpf.c
+++ b/pcap-bpf.c
@@ -20,7 +20,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/pcap-bpf.c,v 1.86.2.12 2007/06/15 17:57:27 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
@@ -28,19 +28,40 @@
 #endif
 
 #include <sys/param.h>			/* optionally get BSD define */
-#include <sys/time.h>
-#include <sys/timeb.h>
+#ifdef HAVE_ZEROCOPY_BPF
+#include <sys/mman.h>
+#endif
 #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
+#include <machine/atomic.h>
+#endif
+
 #include <net/if.h>
 
 #ifdef _AIX
 
 /*
- * Make "pcap.h" not include "pcap-bpf.h"; we are going to include the
+ * Make "pcap.h" not include "pcap/bpf.h"; we are going to include the
  * native OS version, as we need "struct bpf_config" from it.
  */
 #define PCAP_DONT_INCLUDE_PCAP_BPF_H
@@ -78,6 +99,8 @@
 static int bpfloadedflag = 0;
 static int odmlockid = 0;
 
+static int bpf_load(char *errbuf);
+
 #else /* _AIX */
 
 #include <net/bpf.h>
@@ -85,6 +108,7 @@
 #endif /* _AIX */
 
 #include <ctype.h>
+#include <fcntl.h>
 #include <errno.h>
 #include <netdb.h>
 #include <stdio.h>
@@ -92,22 +116,680 @@
 #include <string.h>
 #include <unistd.h>
 
-#include "pcap-int.h"
+#ifdef HAVE_NET_IF_MEDIA_H
+# include <net/if_media.h>
+#endif
 
-#ifdef HAVE_DAG_API
-#include "pcap-dag.h"
-#endif /* HAVE_DAG_API */
+#include "pcap-int.h"
 
 #ifdef HAVE_OS_PROTO_H
 #include "os-proto.h"
 #endif
 
-#include "gencode.h"	/* for "no_optimize" */
+/*
+ * Later versions of NetBSD stick padding in front of FDDI frames
+ * to align the IP header on a 4-byte boundary.
+ */
+#if defined(__NetBSD__) && __NetBSD_Version__ > 106000000
+#define       PCAP_FDDIPAD 3
+#endif
 
+/*
+ * Private data for capturing on BPF devices.
+ */
+struct pcap_bpf {
+#ifdef PCAP_FDDIPAD
+	int fddipad;
+#endif
+
+#ifdef HAVE_ZEROCOPY_BPF
+	/*
+	 * Zero-copy read buffer -- for zero-copy BPF.  'buffer' above will
+	 * alternative between these two actual mmap'd buffers as required.
+	 * As there is a header on the front size of the mmap'd buffer, only
+	 * some of the buffer is exposed to libpcap as a whole via bufsize;
+	 * zbufsize is the true size.  zbuffer tracks the current zbuf
+	 * assocated with buffer so that it can be used to decide which the
+	 * next buffer to read will be.
+	 */
+	u_char *zbuf1, *zbuf2, *zbuffer;
+	u_int zbufsize;
+	u_int zerocopy;
+	u_int interrupted;
+	struct timespec firstsel;
+	/*
+	 * If there's currently a buffer being actively processed, then it is
+	 * referenced here; 'buffer' is also pointed at it, but offset by the
+	 * size of the header.
+	 */
+	struct bpf_zbuf_header *bzh;
+	int nonblock;		/* true if in nonblocking mode */
+#endif /* HAVE_ZEROCOPY_BPF */
+
+	char *device;		/* device name */
+	int filtering_in_kernel; /* using kernel filter */
+	int must_do_on_close;	/* stuff we must do when we close */
+};
+
+/*
+ * Stuff to do when we close.
+ */
+#define MUST_CLEAR_RFMON	0x00000001	/* clear rfmon (monitor) mode */
+
+#ifdef BIOCGDLTLIST
+# if (defined(HAVE_NET_IF_MEDIA_H) && defined(IFM_IEEE80211)) && !defined(__APPLE__)
+#define HAVE_BSD_IEEE80211
+# endif
+
+# if defined(__APPLE__) || defined(HAVE_BSD_IEEE80211)
+static int find_802_11(struct bpf_dltlist *);
+
+#  ifdef HAVE_BSD_IEEE80211
+static int monitor_mode(pcap_t *, int);
+#  endif
+
+#  if defined(__APPLE__)
+static void remove_en(pcap_t *);
+static void remove_802_11(pcap_t *);
+#  endif
+
+# endif /* defined(__APPLE__) || defined(HAVE_BSD_IEEE80211) */
+
+#endif /* BIOCGDLTLIST */
+
+#if defined(sun) && defined(LIFNAMSIZ) && defined(lifr_zoneid)
+#include <zone.h>
+#endif
+
+/*
+ * We include the OS's <net/bpf.h>, not our "pcap/bpf.h", so we probably
+ * don't get DLT_DOCSIS defined.
+ */
+#ifndef DLT_DOCSIS
+#define DLT_DOCSIS	143
+#endif
+
+/*
+ * On OS X, we don't even get any of the 802.11-plus-radio-header DLT_'s
+ * defined, even though some of them are used by various Airport drivers.
+ */
+#ifndef DLT_PRISM_HEADER
+#define DLT_PRISM_HEADER	119
+#endif
+#ifndef DLT_AIRONET_HEADER
+#define DLT_AIRONET_HEADER	120
+#endif
+#ifndef DLT_IEEE802_11_RADIO
+#define DLT_IEEE802_11_RADIO	127
+#endif
+#ifndef DLT_IEEE802_11_RADIO_AVS
+#define DLT_IEEE802_11_RADIO_AVS 163
+#endif
+
+static int pcap_can_set_rfmon_bpf(pcap_t *p);
+static int pcap_activate_bpf(pcap_t *p);
 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);
 
+/*
+ * For zerocopy bpf, the setnonblock/getnonblock routines need to modify
+ * pb->nonblock so we don't call select(2) if the pcap handle is in non-
+ * blocking mode.
+ */
+static int
+pcap_getnonblock_bpf(pcap_t *p, char *errbuf)
+{ 
+#ifdef HAVE_ZEROCOPY_BPF
+	struct pcap_bpf *pb = p->priv;
+
+	if (pb->zerocopy)
+		return (pb->nonblock);
+#endif
+	return (pcap_getnonblock_fd(p, errbuf));
+}
+
+static int
+pcap_setnonblock_bpf(pcap_t *p, int nonblock, char *errbuf)
+{   
+#ifdef HAVE_ZEROCOPY_BPF
+	struct pcap_bpf *pb = p->priv;
+
+	if (pb->zerocopy) {
+		pb->nonblock = nonblock;
+		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.
+ *
+ * pcap_next_zbuf_shm(): Check for a newly available shared memory buffer,
+ * and set up p->buffer and cc to reflect one if available.  Notice that if
+ * there was no prior buffer, we select zbuf1 as this will be the first
+ * buffer filled for a fresh BPF session.
+ */
+static int
+pcap_next_zbuf_shm(pcap_t *p, int *cc)
+{
+	struct pcap_bpf *pb = p->priv;
+	struct bpf_zbuf_header *bzh;
+
+	if (pb->zbuffer == pb->zbuf2 || pb->zbuffer == NULL) {
+		bzh = (struct bpf_zbuf_header *)pb->zbuf1;
+		if (bzh->bzh_user_gen !=
+		    atomic_load_acq_int(&bzh->bzh_kernel_gen)) {
+			pb->bzh = bzh;
+			pb->zbuffer = (u_char *)pb->zbuf1;
+			p->buffer = pb->zbuffer + sizeof(*bzh);
+			*cc = bzh->bzh_kernel_len;
+			return (1);
+		}
+	} else if (pb->zbuffer == pb->zbuf1) {
+		bzh = (struct bpf_zbuf_header *)pb->zbuf2;
+		if (bzh->bzh_user_gen !=
+		    atomic_load_acq_int(&bzh->bzh_kernel_gen)) {
+			pb->bzh = bzh;
+			pb->zbuffer = (u_char *)pb->zbuf2;
+  			p->buffer = pb->zbuffer + sizeof(*bzh);
+			*cc = bzh->bzh_kernel_len;
+			return (1);
+		}
+	}
+	*cc = 0;
+	return (0);
+}
+
+/*
+ * pcap_next_zbuf() -- Similar to pcap_next_zbuf_shm(), except wait using
+ * select() for data or a timeout, and possibly force rotation of the buffer
+ * in the event we time out or are in immediate mode.  Invoke the shared
+ * memory check before doing system calls in order to avoid doing avoidable
+ * work.
+ */
+static int
+pcap_next_zbuf(pcap_t *p, int *cc)
+{
+	struct pcap_bpf *pb = p->priv;
+	struct bpf_zbuf bz;
+	struct timeval tv;
+	struct timespec cur;
+	fd_set r_set;
+	int data, r;
+	int expire, tmout;
+
+#define TSTOMILLI(ts) (((ts)->tv_sec * 1000) + ((ts)->tv_nsec / 1000000))
+	/*
+	 * Start out by seeing whether anything is waiting by checking the
+	 * next shared memory buffer for data.
+	 */
+	data = pcap_next_zbuf_shm(p, cc);
+	if (data)
+		return (data);
+	/*
+	 * If a previous sleep was interrupted due to signal delivery, make
+	 * sure that the timeout gets adjusted accordingly.  This requires
+	 * that we analyze when the timeout should be been expired, and
+	 * subtract the current time from that.  If after this operation,
+	 * our timeout is less then or equal to zero, handle it like a
+	 * regular timeout.
+	 */
+	tmout = p->opt.timeout;
+	if (tmout)
+		(void) clock_gettime(CLOCK_MONOTONIC, &cur);
+	if (pb->interrupted && p->opt.timeout) {
+		expire = TSTOMILLI(&pb->firstsel) + p->opt.timeout;
+		tmout = expire - TSTOMILLI(&cur);
+#undef TSTOMILLI
+		if (tmout <= 0) {
+			pb->interrupted = 0;
+			data = pcap_next_zbuf_shm(p, cc);
+			if (data)
+				return (data);
+			if (ioctl(p->fd, BIOCROTZBUF, &bz) < 0) {
+				(void) snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				    "BIOCROTZBUF: %s", strerror(errno));
+				return (PCAP_ERROR);
+			}
+			return (pcap_next_zbuf_shm(p, cc));
+		}
+	}
+	/*
+	 * No data in the buffer, so must use select() to wait for data or
+	 * the next timeout.  Note that we only call select if the handle
+	 * is in blocking mode.
+	 */
+	if (!pb->nonblock) {
+		FD_ZERO(&r_set);
+		FD_SET(p->fd, &r_set);
+		if (tmout != 0) {
+			tv.tv_sec = tmout / 1000;
+			tv.tv_usec = (tmout * 1000) % 1000000;
+		}
+		r = select(p->fd + 1, &r_set, NULL, NULL,
+		    p->opt.timeout != 0 ? &tv : NULL);
+		if (r < 0 && errno == EINTR) {
+			if (!pb->interrupted && p->opt.timeout) {
+				pb->interrupted = 1;
+				pb->firstsel = cur;
+			}
+			return (0);
+		} else if (r < 0) {
+			(void) snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+			    "select: %s", strerror(errno));
+			return (PCAP_ERROR);
+		}
+	}
+	pb->interrupted = 0;
+	/*
+	 * Check again for data, which may exist now that we've either been
+	 * woken up as a result of data or timed out.  Try the "there's data"
+	 * case first since it doesn't require a system call.
+	 */
+	data = pcap_next_zbuf_shm(p, cc);
+	if (data)
+		return (data);
+	/*
+	 * Try forcing a buffer rotation to dislodge timed out or immediate
+	 * data.
+	 */
+	if (ioctl(p->fd, BIOCROTZBUF, &bz) < 0) {
+		(void) snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+		    "BIOCROTZBUF: %s", strerror(errno));
+		return (PCAP_ERROR);
+	}
+	return (pcap_next_zbuf_shm(p, cc));
+}
+
+/*
+ * Notify kernel that we are done with the buffer.  We don't reset zbuffer so
+ * that we know which buffer to use next time around.
+ */
+static int
+pcap_ack_zbuf(pcap_t *p)
+{
+	struct pcap_bpf *pb = p->priv;
+
+	atomic_store_rel_int(&pb->bzh->bzh_user_gen,
+	    pb->bzh->bzh_kernel_gen);
+	pb->bzh = NULL;
+	p->buffer = NULL;
+	return (0);
+}
+#endif /* HAVE_ZEROCOPY_BPF */
+
+pcap_t *
+pcap_create_interface(const char *device, char *ebuf)
+{
+	pcap_t *p;
+
+	p = pcap_create_common(device, ebuf, sizeof (struct pcap_bpf));
+	if (p == NULL)
+		return (NULL);
+
+	p->activate_op = pcap_activate_bpf;
+	p->can_set_rfmon_op = pcap_can_set_rfmon_bpf;
+	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)
+{
+	int fd;
+#ifdef HAVE_CLONING_BPF
+	static const char device[] = "/dev/bpf";
+#else
+	int n = 0;
+	char device[sizeof "/dev/bpf0000000000"];
+#endif
+
+#ifdef _AIX
+	/*
+	 * Load the bpf driver, if it isn't already loaded,
+	 * and create the BPF device entries, if they don't
+	 * already exist.
+	 */
+	if (bpf_load(p->errbuf) == PCAP_ERROR)
+		return (PCAP_ERROR);
+#endif
+
+#ifdef HAVE_CLONING_BPF
+	if ((fd = open(device, O_RDWR)) == -1 &&
+	    (errno != EACCES || (fd = open(device, O_RDONLY)) == -1)) {
+		if (errno == EACCES)
+			fd = PCAP_ERROR_PERM_DENIED;
+		else
+			fd = PCAP_ERROR;
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+		  "(cannot open device) %s: %s", device, pcap_strerror(errno));
+	}
+#else
+	/*
+	 * Go through all the minors and find one that isn't in use.
+	 */
+	do {
+		(void)snprintf(device, sizeof(device), "/dev/bpf%d", n++);
+		/*
+		 * Initially try a read/write open (to allow the inject
+		 * method to work).  If that fails due to permission
+		 * issues, fall back to read-only.  This allows a
+		 * non-root user to be granted specific access to pcap
+		 * capabilities via file permissions.
+		 *
+		 * XXX - we should have an API that has a flag that
+		 * controls whether to open read-only or read-write,
+		 * so that denial of permission to send (or inability
+		 * to send, if sending packets isn't supported on
+		 * the device in question) can be indicated at open
+		 * time.
+		 */
+		fd = open(device, O_RDWR);
+		if (fd == -1 && errno == EACCES)
+			fd = open(device, O_RDONLY);
+	} while (fd < 0 && errno == EBUSY);
+
+	/*
+	 * XXX better message for all minors used
+	 */
+	if (fd < 0) {
+		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;
+			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,
+			    "(cannot open BPF device) %s: %s", device,
+			    pcap_strerror(errno));
+			break;
+		}
+	}
+#endif
+
+	return (fd);
+}
+
+#ifdef BIOCGDLTLIST
+static int
+get_dlt_list(int fd, int v, struct bpf_dltlist *bdlp, char *ebuf)
+{
+	memset(bdlp, 0, sizeof(*bdlp));
+	if (ioctl(fd, BIOCGDLTLIST, (caddr_t)bdlp) == 0) {
+		u_int i;
+		int is_ethernet;
+
+		bdlp->bfl_list = (u_int *) malloc(sizeof(u_int) * (bdlp->bfl_len + 1));
+		if (bdlp->bfl_list == NULL) {
+			(void)snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s",
+			    pcap_strerror(errno));
+			return (PCAP_ERROR);
+		}
+
+		if (ioctl(fd, BIOCGDLTLIST, (caddr_t)bdlp) < 0) {
+			(void)snprintf(ebuf, PCAP_ERRBUF_SIZE,
+			    "BIOCGDLTLIST: %s", pcap_strerror(errno));
+			free(bdlp->bfl_list);
+			return (PCAP_ERROR);
+		}
+
+		/*
+		 * OK, for real Ethernet devices, add DLT_DOCSIS to the
+		 * list, so that an application can let you choose it,
+		 * in case you're capturing DOCSIS traffic that a Cisco
+		 * Cable Modem Termination System is putting out onto
+		 * an Ethernet (it doesn't put an Ethernet header onto
+		 * the wire, it puts raw DOCSIS frames out on the wire
+		 * inside the low-level Ethernet framing).
+		 *
+		 * A "real Ethernet device" is defined here as a device
+		 * that has a link-layer type of DLT_EN10MB and that has
+		 * no alternate link-layer types; that's done to exclude
+		 * 802.11 interfaces (which might or might not be the
+		 * 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
+#ifdef DLT_IPNET
+				    && bdlp->bfl_list[i] != DLT_IPNET
+#endif
+				    ) {
+					is_ethernet = 0;
+					break;
+				}
+			}
+			if (is_ethernet) {
+				/*
+				 * We reserved one more slot at the end of
+				 * the list.
+				 */
+				bdlp->bfl_list[bdlp->bfl_len] = DLT_DOCSIS;
+				bdlp->bfl_len++;
+			}
+		}
+	} else {
+		/*
+		 * EINVAL just means "we don't support this ioctl on
+		 * this device"; don't treat it as an error.
+		 */
+		if (errno != EINVAL) {
+			(void)snprintf(ebuf, PCAP_ERRBUF_SIZE,
+			    "BIOCGDLTLIST: %s", pcap_strerror(errno));
+			return (PCAP_ERROR);
+		}
+	}
+	return (0);
+}
+#endif
+
+static int
+pcap_can_set_rfmon_bpf(pcap_t *p)
+{
+#if defined(__APPLE__)
+	struct utsname osinfo;
+	struct ifreq ifr;
+	int fd;
+#ifdef BIOCGDLTLIST
+	struct bpf_dltlist bdl;
+#endif
+
+	/*
+	 * The joys of monitor mode on OS X.
+	 *
+	 * Prior to 10.4, it's not supported at all.
+	 *
+	 * In 10.4, if adapter enN supports monitor mode, there's a
+	 * wltN adapter corresponding to it; you open it, instead of
+	 * enN, to get monitor mode.  You get whatever link-layer
+	 * headers it supplies.
+	 *
+	 * In 10.5, and, we assume, later releases, if adapter enN
+	 * supports monitor mode, it offers, among its selectable
+	 * DLT_ values, values that let you get the 802.11 header;
+	 * selecting one of those values puts the adapter into monitor
+	 * mode (i.e., you can't get 802.11 headers except in monitor
+	 * mode, and you can't get Ethernet headers in monitor mode).
+	 */
+	if (uname(&osinfo) == -1) {
+		/*
+		 * Can't get the OS version; just say "no".
+		 */
+		return (0);
+	}
+	/*
+	 * We assume osinfo.sysname is "Darwin", because
+	 * __APPLE__ is defined.  We just check the version.
+	 */
+	if (osinfo.release[0] < '8' && osinfo.release[1] == '.') {
+		/*
+		 * 10.3 (Darwin 7.x) or earlier.
+		 * Monitor mode not supported.
+		 */
+		return (0);
+	}
+	if (osinfo.release[0] == '8' && osinfo.release[1] == '.') {
+		/*
+		 * 10.4 (Darwin 8.x).  s/en/wlt/, and check
+		 * whether the device exists.
+		 */
+		if (strncmp(p->opt.source, "en", 2) != 0) {
+			/*
+			 * Not an enN device; no monitor mode.
+			 */
+			return (0);
+		}
+		fd = socket(AF_INET, SOCK_DGRAM, 0);
+		if (fd == -1) {
+			(void)snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+			    "socket: %s", pcap_strerror(errno));
+			return (PCAP_ERROR);
+		}
+		strlcpy(ifr.ifr_name, "wlt", sizeof(ifr.ifr_name));
+		strlcat(ifr.ifr_name, p->opt.source + 2, sizeof(ifr.ifr_name));
+		if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifr) < 0) {
+			/*
+			 * No such device?
+			 */
+			close(fd);
+			return (0);
+		}
+		close(fd);
+		return (1);
+	}
+
+#ifdef BIOCGDLTLIST
+	/*
+	 * Everything else is 10.5 or later; for those,
+	 * we just open the enN device, and check whether
+	 * we have any 802.11 devices.
+	 *
+	 * First, open a BPF device.
+	 */
+	fd = bpf_open(p);
+	if (fd < 0)
+		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) {
+		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
+			 * saying we had a mysterious failure and
+			 * suggest that they report a problem to the
+			 * libpcap developers.
+			 */
+			close(fd);
+			return (PCAP_ERROR_IFACE_NOT_UP);
+
+		default:
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+			    "BIOCSETIF: %s: %s",
+			    p->opt.source, pcap_strerror(errno));
+			close(fd);
+			return (PCAP_ERROR);
+		}
+	}
+
+	/*
+	 * We know the default link type -- now determine all the DLTs
+	 * this interface supports.  If this fails with EINVAL, it's
+	 * not fatal; we just don't get to use the feature later.
+	 * (We don't care about DLT_DOCSIS, so we pass DLT_NULL
+	 * as the default DLT for this adapter.)
+	 */
+	if (get_dlt_list(fd, DLT_NULL, &bdl, p->errbuf) == PCAP_ERROR) {
+		close(fd);
+		return (PCAP_ERROR);
+	}
+	if (find_802_11(&bdl) != -1) {
+		/*
+		 * We have an 802.11 DLT, so we can set monitor mode.
+		 */
+		free(bdl.bfl_list);
+		close(fd);
+		return (1);
+	}
+	free(bdl.bfl_list);
+#endif /* BIOCGDLTLIST */
+	return (0);
+#elif defined(HAVE_BSD_IEEE80211)
+	int ret;
+
+	ret = monitor_mode(p, 0);
+	if (ret == PCAP_ERROR_RFMON_NOTSUP)
+		return (0);	/* not an error, just a "can't do" */
+	if (ret == 0)
+		return (1);	/* success */
+	return (ret);
+#else
+	return (0);
+#endif
+}
+
 static int
 pcap_stats_bpf(pcap_t *p, struct pcap_stat *ps)
 {
@@ -129,27 +811,30 @@
 	if (ioctl(p->fd, BIOCGSTATS, (caddr_t)&s) < 0) {
 		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCGSTATS: %s",
 		    pcap_strerror(errno));
-		return (-1);
+		return (PCAP_ERROR);
 	}
 
 	ps->ps_recv = s.bs_recv;
 	ps->ps_drop = s.bs_drop;
+	ps->ps_ifdrop = 0;
 	return (0);
 }
 
 static int
 pcap_read_bpf(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
 {
+	struct pcap_bpf *pb = p->priv;
 	int cc;
 	int n = 0;
 	register u_char *bp, *ep;
 	u_char *datap;
-	struct bpf_insn *fcode;
 #ifdef PCAP_FDDIPAD
 	register int pad;
 #endif
+#ifdef HAVE_ZEROCOPY_BPF
+	int i;
+#endif
 
-	fcode = p->md.use_bpf ? NULL : p->fcode.bf_insns;
  again:
 	/*
 	 * Has "pcap_breakloop()" been called?
@@ -157,15 +842,36 @@
 	if (p->break_loop) {
 		/*
 		 * Yes - clear the flag that indicates that it
-		 * has, and return -2 to indicate that we were
-		 * told to break out of the loop.
+		 * has, and return PCAP_ERROR_BREAK to indicate
+		 * that we were told to break out of the loop.
 		 */
 		p->break_loop = 0;
-		return (-2);
+		return (PCAP_ERROR_BREAK);
 	}
 	cc = p->cc;
 	if (p->cc == 0) {
-		cc = read(p->fd, (char *)p->buffer, p->bufsize);
+		/*
+		 * When reading without zero-copy from a file descriptor, we
+		 * use a single buffer and return a length of data in the
+		 * buffer.  With zero-copy, we update the p->buffer pointer
+		 * to point at whatever underlying buffer contains the next
+		 * data and update cc to reflect the data found in the
+		 * buffer.
+		 */
+#ifdef HAVE_ZEROCOPY_BPF
+		if (pb->zerocopy) {
+			if (p->buffer != NULL)
+				pcap_ack_zbuf(p);
+			i = pcap_next_zbuf(p, &cc);
+			if (i == 0)
+				goto again;
+			if (i < 0)
+				return (PCAP_ERROR);
+		} else
+#endif
+		{
+			cc = read(p->fd, (char *)p->buffer, p->bufsize);
+		}
 		if (cc < 0) {
 			/* Don't choke when we get ptraced */
 			switch (errno) {
@@ -180,16 +886,16 @@
 				 *
 				 * For some unknown reason the uiomove()
 				 * operation in the bpf kernel extension
-				 * used to copy the buffer into user 
+				 * used to copy the buffer into user
 				 * space sometimes returns EFAULT. I have
 				 * no idea why this is the case given that
-				 * a kernel debugger shows the user buffer 
-				 * is correct. This problem appears to 
-				 * be mostly mitigated by the memset of 
-				 * the buffer before it is first used. 
+				 * a kernel debugger shows the user buffer
+				 * is correct. This problem appears to
+				 * be mostly mitigated by the memset of
+				 * the buffer before it is first used.
 				 * Very strange.... Shaun Clowes
 				 *
-				 * In any case this means that we shouldn't 
+				 * In any case this means that we shouldn't
 				 * treat EFAULT as a fatal error; as we
 				 * don't have an API for returning
 				 * a "some packets were dropped since
@@ -197,11 +903,26 @@
 				 * we just ignore EFAULT and keep reading.
 				 */
 				goto again;
-#endif 
-  
+#endif
+
 			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.
@@ -218,7 +939,7 @@
 			}
 			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "read: %s",
 			    pcap_strerror(errno));
-			return (-1);
+			return (PCAP_ERROR);
 		}
 		bp = p->buffer;
 	} else
@@ -238,21 +959,36 @@
 		/*
 		 * Has "pcap_breakloop()" been called?
 		 * If so, return immediately - if we haven't read any
-		 * packets, clear the flag and return -2 to indicate
-		 * that we were told to break out of the loop, otherwise
-		 * leave the flag set, so that the *next* call will break
-		 * out of the loop without having read any packets, and
-		 * return the number of packets we've processed so far.
+		 * packets, clear the flag and return PCAP_ERROR_BREAK
+		 * to indicate that we were told to break out of the loop,
+		 * otherwise leave the flag set, so that the *next* call
+		 * will break out of the loop without having read any
+		 * packets, and return the number of packets we've
+		 * 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 (-2);
-			} else {
-				p->bp = bp;
-				p->cc = ep - bp;
+				return (PCAP_ERROR_BREAK);
+			} else
 				return (n);
-			}
 		}
 
 		caplen = bhp->bh_caplen;
@@ -260,7 +996,8 @@
 		datap = bp + hdrlen;
 		/*
 		 * Short-circuit evaluation: if using BPF filter
-		 * in kernel, no need to do it now.
+		 * in kernel, no need to do it now - we already know
+		 * the packet passed the filter.
 		 *
 #ifdef PCAP_FDDIPAD
 		 * Note: the filter code was generated assuming
@@ -270,8 +1007,8 @@
 		 * skipping that padding.
 #endif
 		 */
-		if (fcode == NULL ||
-		    bpf_filter(fcode, datap, bhp->bh_datalen, caplen)) {
+		if (pb->filtering_in_kernel ||
+		    bpf_filter(p->fcode.bf_insns, datap, bhp->bh_datalen, caplen)) {
 			struct pcap_pkthdr pkthdr;
 
 			pkthdr.ts.tv_sec = bhp->bh_tstamp.tv_sec;
@@ -300,9 +1037,14 @@
 #endif
 			(*callback)(user, &pkthdr, datap);
 			bp += BPF_WORDALIGN(caplen + hdrlen);
-			if (++n >= cnt && cnt > 0) {
+			if (++n >= cnt && !PACKET_COUNT_IS_UNLIMITED(cnt)) {
 				p->bp = bp;
 				p->cc = ep - bp;
+				/*
+				 * See comment above about p->cc < 0.
+				 */
+				if (p->cc < 0)
+					p->cc = 0;
 				return (n);
 			}
 		} else {
@@ -349,7 +1091,7 @@
 			(void)snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
 			    "send: can't turn off BIOCSHDRCMPLT: %s",
 			    pcap_strerror(errno));
-			return (-1);
+			return (PCAP_ERROR);
 		}
 
 		/*
@@ -361,13 +1103,13 @@
 	if (ret == -1) {
 		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "send: %s",
 		    pcap_strerror(errno));
-		return (-1);
+		return (PCAP_ERROR);
 	}
 	return (ret);
 }
 
 #ifdef _AIX
-static int 
+static int
 bpf_odminit(char *errbuf)
 {
 	char *errstr;
@@ -378,7 +1120,7 @@
 		snprintf(errbuf, PCAP_ERRBUF_SIZE,
 		    "bpf_load: odm_initialize failed: %s",
 		    errstr);
-		return (-1);
+		return (PCAP_ERROR);
 	}
 
 	if ((odmlockid = odm_lock("/etc/objrepos/config_lock", ODM_WAIT)) == -1) {
@@ -387,33 +1129,38 @@
 		snprintf(errbuf, PCAP_ERRBUF_SIZE,
 		    "bpf_load: odm_lock of /etc/objrepos/config_lock failed: %s",
 		    errstr);
-		return (-1);
+		(void)odm_terminate();
+		return (PCAP_ERROR);
 	}
 
 	return (0);
 }
 
-static int 
+static int
 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);
-		return (-1);
+		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);
-		return (-1);
+		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);
 	}
 
 	return (0);
@@ -438,14 +1185,15 @@
 	if (bpfloadedflag)
 		return (0);
 
-	if (bpf_odminit(errbuf) != 0)
-		return (-1);
+	if (bpf_odminit(errbuf) == PCAP_ERROR)
+		return (PCAP_ERROR);
 
 	major = genmajor(BPF_NAME);
 	if (major == -1) {
 		snprintf(errbuf, PCAP_ERRBUF_SIZE,
 		    "bpf_load: genmajor failed: %s", pcap_strerror(errno));
-		return (-1);
+		(void)bpf_odmcleanup(NULL);
+		return (PCAP_ERROR);
 	}
 
 	minors = getminor(major, &numminors, BPF_NAME);
@@ -455,19 +1203,20 @@
 			snprintf(errbuf, PCAP_ERRBUF_SIZE,
 			    "bpf_load: genminor failed: %s",
 			    pcap_strerror(errno));
-			return (-1);
+			(void)bpf_odmcleanup(NULL);
+			return (PCAP_ERROR);
 		}
 	}
 
-	if (bpf_odmcleanup(errbuf))
-		return (-1);
+	if (bpf_odmcleanup(errbuf) == PCAP_ERROR)
+		return (PCAP_ERROR);
 
 	rc = stat(BPF_NODE "0", &sbuf);
 	if (rc == -1 && errno != ENOENT) {
 		snprintf(errbuf, PCAP_ERRBUF_SIZE,
 		    "bpf_load: can't stat %s: %s",
 		    BPF_NODE "0", pcap_strerror(errno));
-		return (-1);
+		return (PCAP_ERROR);
 	}
 
 	if (rc == -1 || getmajor(sbuf.st_rdev) != major) {
@@ -478,7 +1227,7 @@
 				snprintf(errbuf, PCAP_ERRBUF_SIZE,
 				    "bpf_load: can't mknod %s: %s",
 				    buf, pcap_strerror(errno));
-				return (-1);
+				return (PCAP_ERROR);
 			}
 		}
 	}
@@ -494,7 +1243,7 @@
 			snprintf(errbuf, PCAP_ERRBUF_SIZE,
 			    "bpf_load: could not load driver: %s",
 			    strerror(errno));
-			return (-1);
+			return (PCAP_ERROR);
 		}
 	}
 
@@ -502,190 +1251,570 @@
 	cfg_km.cmd = CFG_INIT;
 	cfg_km.kmid = cfg_ld.kmid;
 	cfg_km.mdilen = sizeof(cfg_bpf);
-	cfg_km.mdiptr = (void *)&cfg_bpf; 
+	cfg_km.mdiptr = (void *)&cfg_bpf;
 	for (i = 0; i < BPF_MINORS; i++) {
 		cfg_bpf.devno = domakedev(major, i);
 		if (sysconfig(SYS_CFGKMOD, (void *)&cfg_km, sizeof(cfg_km)) == -1) {
 			snprintf(errbuf, PCAP_ERRBUF_SIZE,
 			    "bpf_load: could not configure driver: %s",
 			    strerror(errno));
-			return (-1);
+			return (PCAP_ERROR);
 		}
 	}
-	
+
 	bpfloadedflag = 1;
 
 	return (0);
 }
 #endif
 
-static inline int
-bpf_open(pcap_t *p, char *errbuf)
+/*
+ * Turn off rfmon mode if necessary.
+ */
+static void
+pcap_cleanup_bpf(pcap_t *p)
 {
-	int fd;
-#ifdef HAVE_CLONING_BPF
-	static const char device[] = "/dev/bpf";
-#else
-	int n = 0;
-	char device[sizeof "/dev/bpf0000000000"];
+	struct pcap_bpf *pb = p->priv;
+#ifdef HAVE_BSD_IEEE80211
+	int sock;
+	struct ifmediareq req;
+	struct ifreq ifr;
 #endif
 
-#ifdef _AIX
-	/*
-	 * Load the bpf driver, if it isn't already loaded,
-	 * and create the BPF device entries, if they don't
-	 * already exist.
-	 */
-	if (bpf_load(errbuf) == -1)
-		return (-1);
-#endif
-
-#ifdef HAVE_CLONING_BPF
-	if ((fd = open(device, O_RDWR)) == -1 &&
-	    (errno != EACCES || (fd = open(device, O_RDONLY)) == -1))
-		snprintf(errbuf, PCAP_ERRBUF_SIZE,
-		  "(cannot open device) %s: %s", device, pcap_strerror(errno));
-#else
-	/*
-	 * Go through all the minors and find one that isn't in use.
-	 */
-	do {
-		(void)snprintf(device, sizeof(device), "/dev/bpf%d", n++);
+	if (pb->must_do_on_close != 0) {
 		/*
-		 * Initially try a read/write open (to allow the inject
-		 * method to work).  If that fails due to permission
-		 * issues, fall back to read-only.  This allows a
-		 * non-root user to be granted specific access to pcap
-		 * capabilities via file permissions.
-		 *
-		 * XXX - we should have an API that has a flag that
-		 * controls whether to open read-only or read-write,
-		 * so that denial of permission to send (or inability
-		 * to send, if sending packets isn't supported on
-		 * the device in question) can be indicated at open
-		 * time.
+		 * There's something we have to do when closing this
+		 * pcap_t.
 		 */
-		fd = open(device, O_RDWR);
-		if (fd == -1 && errno == EACCES)
-			fd = open(device, O_RDONLY);
-	} while (fd < 0 && errno == EBUSY);
+#ifdef HAVE_BSD_IEEE80211
+		if (pb->must_do_on_close & MUST_CLEAR_RFMON) {
+			/*
+			 * We put the interface into rfmon mode;
+			 * take it out of rfmon mode.
+			 *
+			 * XXX - if somebody else wants it in rfmon
+			 * mode, this code cannot know that, so it'll take
+			 * it out of rfmon mode.
+			 */
+			sock = socket(AF_INET, SOCK_DGRAM, 0);
+			if (sock == -1) {
+				fprintf(stderr,
+				    "Can't restore interface flags (socket() failed: %s).\n"
+				    "Please adjust manually.\n",
+				    strerror(errno));
+			} else {
+				memset(&req, 0, sizeof(req));
+				strncpy(req.ifm_name, pb->device,
+				    sizeof(req.ifm_name));
+				if (ioctl(sock, SIOCGIFMEDIA, &req) < 0) {
+					fprintf(stderr,
+					    "Can't restore interface flags (SIOCGIFMEDIA failed: %s).\n"
+					    "Please adjust manually.\n",
+					    strerror(errno));
+				} else {
+					if (req.ifm_current & IFM_IEEE80211_MONITOR) {
+						/*
+						 * Rfmon mode is currently on;
+						 * turn it off.
+						 */
+						memset(&ifr, 0, sizeof(ifr));
+						(void)strncpy(ifr.ifr_name,
+						    pb->device,
+						    sizeof(ifr.ifr_name));
+						ifr.ifr_media =
+						    req.ifm_current & ~IFM_IEEE80211_MONITOR;
+						if (ioctl(sock, SIOCSIFMEDIA,
+						    &ifr) == -1) {
+							fprintf(stderr,
+							    "Can't restore interface flags (SIOCSIFMEDIA failed: %s).\n"
+							    "Please adjust manually.\n",
+							    strerror(errno));
+						}
+					}
+				}
+				close(sock);
+			}
+		}
+#endif /* HAVE_BSD_IEEE80211 */
 
-	/*
-	 * XXX better message for all minors used
-	 */
-	if (fd < 0)
-		snprintf(errbuf, PCAP_ERRBUF_SIZE, "(no devices found) %s: %s",
-		    device, pcap_strerror(errno));
+		/*
+		 * Take this pcap out of the list of pcaps for which we
+		 * have to take the interface out of some mode.
+		 */
+		pcap_remove_from_pcaps_to_close(p);
+		pb->must_do_on_close = 0;
+	}
+
+#ifdef HAVE_ZEROCOPY_BPF
+	if (pb->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 (pb->zbuf1 != MAP_FAILED && pb->zbuf1 != NULL)
+			(void) munmap(pb->zbuf1, pb->zbufsize);
+		if (pb->zbuf2 != MAP_FAILED && pb->zbuf2 != NULL)
+			(void) munmap(pb->zbuf2, pb->zbufsize);
+		p->buffer = NULL;
+	}
+#endif
+	if (pb->device != NULL) {
+		free(pb->device);
+		pb->device = NULL;
+	}
+	pcap_cleanup_live_common(p);
+}
+
+static int
+check_setif_failure(pcap_t *p, int error)
+{
+#ifdef __APPLE__
+	int fd;
+	struct ifreq ifr;
+	int err;
 #endif
 
-	return (fd);
+	if (error == ENXIO) {
+		/*
+		 * No such device exists.
+		 */
+#ifdef __APPLE__
+		if (p->opt.rfmon && strncmp(p->opt.source, "wlt", 3) == 0) {
+			/*
+			 * Monitor mode was requested, and we're trying
+			 * to open a "wltN" device.  Assume that this
+			 * is 10.4 and that we were asked to open an
+			 * "enN" device; if that device exists, return
+			 * "monitor mode not supported on the device".
+			 */
+			fd = socket(AF_INET, SOCK_DGRAM, 0);
+			if (fd != -1) {
+				strlcpy(ifr.ifr_name, "en",
+				    sizeof(ifr.ifr_name));
+				strlcat(ifr.ifr_name, p->opt.source + 3,
+				    sizeof(ifr.ifr_name));
+				if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifr) < 0) {
+					/*
+					 * We assume this failed because
+					 * the underlying device doesn't
+					 * exist.
+					 */
+					err = PCAP_ERROR_NO_SUCH_DEVICE;
+					snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+					    "SIOCGIFFLAGS on %s failed: %s",
+					    ifr.ifr_name, pcap_strerror(errno));
+				} else {
+					/*
+					 * The underlying "enN" device
+					 * exists, but there's no
+					 * corresponding "wltN" device;
+					 * that means that the "enN"
+					 * device doesn't support
+					 * monitor mode, probably because
+					 * it's an Ethernet device rather
+					 * than a wireless device.
+					 */
+					err = PCAP_ERROR_RFMON_NOTSUP;
+				}
+				close(fd);
+			} else {
+				/*
+				 * We can't find out whether there's
+				 * an underlying "enN" device, so
+				 * just report "no such device".
+				 */
+				err = PCAP_ERROR_NO_SUCH_DEVICE;
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				    "socket() failed: %s",
+				    pcap_strerror(errno));
+			}
+			return (err);
+		}
+#endif
+		/*
+		 * No such device.
+		 */
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSETIF failed: %s",
+		    pcap_strerror(errno));
+		return (PCAP_ERROR_NO_SUCH_DEVICE);
+	} else if (errno == ENETDOWN) {
+		/*
+		 * Return a "network down" indication, so that
+		 * the application can report that rather than
+		 * saying we had a mysterious failure and
+		 * suggest that they report a problem to the
+		 * libpcap developers.
+		 */
+		return (PCAP_ERROR_IFACE_NOT_UP);
+	} else {
+		/*
+		 * Some other error; fill in the error string, and
+		 * return PCAP_ERROR.
+		 */
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSETIF: %s: %s",
+		    p->opt.source, pcap_strerror(errno));
+		return (PCAP_ERROR);
+	}
 }
 
 /*
- * We include the OS's <net/bpf.h>, not our "pcap-bpf.h", so we probably
- * don't get DLT_DOCSIS defined.
+ * 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.
+ *
+ * However, on AIX 3.5, the larger buffer sized caused unrecoverable
+ * read failures under stress, so we leave it as 32K; yet another
+ * place where AIX's BPF is broken.
  */
-#ifndef DLT_DOCSIS
-#define DLT_DOCSIS	143
+#ifdef _AIX
+#define DEFAULT_BUFSIZE	32768
+#else
+#define DEFAULT_BUFSIZE	524288
 #endif
 
-pcap_t *
-pcap_open_live(const char *device, int snaplen, int promisc, int to_ms,
-    char *ebuf)
+static int
+pcap_activate_bpf(pcap_t *p)
 {
+	struct pcap_bpf *pb = p->priv;
+	int status = 0;
 	int fd;
+#ifdef LIFNAMSIZ
+	char *zonesep;
+	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;
+	char *wltdev = NULL;
+#endif
 #ifdef BIOCGDLTLIST
 	struct bpf_dltlist bdl;
+#if defined(__APPLE__) || defined(HAVE_BSD_IEEE80211)
+	int new_dlt;
 #endif
+#endif /* BIOCGDLTLIST */
 #if defined(BIOCGHDRCMPLT) && defined(BIOCSHDRCMPLT)
 	u_int spoof_eth_src = 1;
 #endif
 	u_int v;
-	pcap_t *p;
 	struct bpf_insn total_insn;
 	struct bpf_program total_prog;
 	struct utsname osinfo;
-
-#ifdef HAVE_DAG_API
-	if (strstr(device, "dag")) {
-		return dag_open_live(device, snaplen, promisc, to_ms, ebuf);
-	}
-#endif /* HAVE_DAG_API */
-
-#ifdef BIOCGDLTLIST
-	memset(&bdl, 0, sizeof(bdl));
+	int have_osinfo = 0;
+#ifdef HAVE_ZEROCOPY_BPF
+	struct bpf_zbuf bz;
+	u_int bufmode, zbufmax;
 #endif
 
-	p = (pcap_t *)malloc(sizeof(*p));
-	if (p == NULL) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s",
-		    pcap_strerror(errno));
-		return (NULL);
-	}
-	memset(p, 0, sizeof(*p));
-	fd = bpf_open(p, ebuf);
-	if (fd < 0)
+	fd = bpf_open(p);
+	if (fd < 0) {
+		status = fd;
 		goto bad;
+	}
 
 	p->fd = fd;
-	p->snapshot = snaplen;
 
 	if (ioctl(fd, BIOCVERSION, (caddr_t)&bv) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "BIOCVERSION: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCVERSION: %s",
 		    pcap_strerror(errno));
+		status = PCAP_ERROR;
 		goto bad;
 	}
 	if (bv.bv_major != BPF_MAJOR_VERSION ||
 	    bv.bv_minor < BPF_MINOR_VERSION) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE,
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
 		    "kernel bpf filter out of date");
+		status = PCAP_ERROR;
+		goto bad;
+	}
+
+#if defined(LIFNAMSIZ) && defined(ZONENAME_MAX) && defined(lifr_zoneid)
+	/*
+	 * Check if the given source network device has a '/' separated
+	 * zonename prefix string. The zonename prefixed source device
+	 * can be used by libpcap consumers to capture network traffic
+	 * in non-global zones from the global zone on Solaris 11 and
+	 * above. If the zonename prefix is present then we strip the
+	 * prefix and pass the zone ID as part of lifr_zoneid.
+	 */
+	if ((zonesep = strchr(p->opt.source, '/')) != NULL) {
+		char zonename[ZONENAME_MAX];
+		int  znamelen;
+		char *lnamep;
+
+		znamelen = zonesep - p->opt.source;
+		(void) strlcpy(zonename, p->opt.source, znamelen + 1);
+		lnamep = strdup(zonesep + 1);
+		ifr.lifr_zoneid = getzoneidbyname(zonename);
+		free(p->opt.source);
+		p->opt.source = lnamep;
+	}
+#endif
+
+	pb->device = strdup(p->opt.source);
+	if (pb->device == NULL) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "strdup: %s",
+		     pcap_strerror(errno));
+		status = PCAP_ERROR;
 		goto bad;
 	}
 
 	/*
-	 * 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.  If the default
-	 * is larger, don't make it smaller.
-	 *
-	 * XXX - there should be a user-accessible hook to set the
-	 * initial buffer size.
+	 * Attempt to find out the version of the OS on which we're running.
 	 */
-	if ((ioctl(fd, BIOCGBLEN, (caddr_t)&v) < 0) || v < 32768)
-		v = 32768;
-	for ( ; v != 0; v >>= 1) {
-		/* Ignore the return value - this is because the call fails
-		 * on BPF systems that don't have kernel malloc.  And if
-		 * the call fails, it's no big deal, we just continue to
-		 * use the standard buffer size.
-		 */
-		(void) ioctl(fd, BIOCSBLEN, (caddr_t)&v);
+	if (uname(&osinfo) == 0)
+		have_osinfo = 1;
 
-		(void)strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));
-		if (ioctl(fd, BIOCSETIF, (caddr_t)&ifr) >= 0)
-			break;	/* that size worked; we're done */
-
-		if (errno != ENOBUFS) {
-			snprintf(ebuf, PCAP_ERRBUF_SIZE, "BIOCSETIF: %s: %s",
-			    device, pcap_strerror(errno));
-			goto bad;
+#ifdef __APPLE__
+	/*
+	 * See comment in pcap_can_set_rfmon_bpf() for an explanation
+	 * of why we check the version number.
+	 */
+	if (p->opt.rfmon) {
+		if (have_osinfo) {
+			/*
+			 * We assume osinfo.sysname is "Darwin", because
+			 * __APPLE__ is defined.  We just check the version.
+			 */
+			if (osinfo.release[0] < '8' &&
+			    osinfo.release[1] == '.') {
+				/*
+				 * 10.3 (Darwin 7.x) or earlier.
+				 */
+				status = PCAP_ERROR_RFMON_NOTSUP;
+				goto bad;
+			}
+			if (osinfo.release[0] == '8' &&
+			    osinfo.release[1] == '.') {
+				/*
+				 * 10.4 (Darwin 8.x).  s/en/wlt/
+				 */
+				if (strncmp(p->opt.source, "en", 2) != 0) {
+					/*
+					 * Not an enN device; check
+					 * whether the device even exists.
+					 */
+					sockfd = socket(AF_INET, SOCK_DGRAM, 0);
+					if (sockfd != -1) {
+						strlcpy(ifrname,
+						    p->opt.source, ifnamsiz);
+						if (ioctl(sockfd, SIOCGIFFLAGS,
+						    (char *)&ifr) < 0) {
+							/*
+							 * We assume this
+							 * failed because
+							 * the underlying
+							 * device doesn't
+							 * exist.
+							 */
+							status = PCAP_ERROR_NO_SUCH_DEVICE;
+							snprintf(p->errbuf,
+							    PCAP_ERRBUF_SIZE,
+							    "SIOCGIFFLAGS failed: %s",
+							    pcap_strerror(errno));
+						} else
+							status = PCAP_ERROR_RFMON_NOTSUP;
+						close(sockfd);
+					} else {
+						/*
+						 * We can't find out whether
+						 * the device exists, so just
+						 * report "no such device".
+						 */
+						status = PCAP_ERROR_NO_SUCH_DEVICE;
+						snprintf(p->errbuf,
+						    PCAP_ERRBUF_SIZE,
+						    "socket() failed: %s",
+						    pcap_strerror(errno));
+					}
+					goto bad;
+				}
+				wltdev = malloc(strlen(p->opt.source) + 2);
+				if (wltdev == NULL) {
+					(void)snprintf(p->errbuf,
+					    PCAP_ERRBUF_SIZE, "malloc: %s",
+					    pcap_strerror(errno));
+					status = PCAP_ERROR;
+					goto bad;
+				}
+				strcpy(wltdev, "wlt");
+				strcat(wltdev, p->opt.source + 2);
+				free(p->opt.source);
+				p->opt.source = wltdev;
+			}
+			/*
+			 * Everything else is 10.5 or later; for those,
+			 * we just open the enN device, and set the DLT.
+			 */
 		}
 	}
+#endif /* __APPLE__ */
+#ifdef HAVE_ZEROCOPY_BPF
+	/*
+	 * If the BPF extension to set buffer mode is present, try setting
+	 * the mode to zero-copy.  If that fails, use regular buffering.  If
+	 * it succeeds but other setup fails, return an error to the user.
+	 */
+	bufmode = BPF_BUFMODE_ZBUF;
+	if (ioctl(fd, BIOCSETBUFMODE, (caddr_t)&bufmode) == 0) {
+		/*
+		 * We have zerocopy BPF; use it.
+		 */
+		pb->zerocopy = 1;
 
-	if (v == 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE,
-			 "BIOCSBLEN: %s: No buffer size worked", device);
-		goto bad;
+		/*
+		 * 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.
+		 * Then, if a buffer size was specified, use that, otherwise
+		 * query the default buffer size, which reflects kernel
+		 * policy for a desired default.  Round to the nearest page
+		 * size.
+		 */
+		if (ioctl(fd, BIOCGETZMAX, (caddr_t)&zbufmax) < 0) {
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCGETZMAX: %s",
+			    pcap_strerror(errno));
+			goto bad;
+		}
+
+		if (p->opt.buffer_size != 0) {
+			/*
+			 * A buffer size was explicitly specified; use it.
+			 */
+			v = p->opt.buffer_size;
+		} else {
+			if ((ioctl(fd, BIOCGBLEN, (caddr_t)&v) < 0) ||
+			    v < DEFAULT_BUFSIZE)
+				v = DEFAULT_BUFSIZE;
+		}
+#ifndef roundup
+#define roundup(x, y)   ((((x)+((y)-1))/(y))*(y))  /* to any y */
+#endif
+		pb->zbufsize = roundup(v, getpagesize());
+		if (pb->zbufsize > zbufmax)
+			pb->zbufsize = zbufmax;
+		pb->zbuf1 = mmap(NULL, pb->zbufsize, PROT_READ | PROT_WRITE,
+		    MAP_ANON, -1, 0);
+		pb->zbuf2 = mmap(NULL, pb->zbufsize, PROT_READ | PROT_WRITE,
+		    MAP_ANON, -1, 0);
+		if (pb->zbuf1 == MAP_FAILED || pb->zbuf2 == MAP_FAILED) {
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "mmap: %s",
+			    pcap_strerror(errno));
+			goto bad;
+		}
+		memset(&bz, 0, sizeof(bz)); /* bzero() deprecated, replaced with memset() */
+		bz.bz_bufa = pb->zbuf1;
+		bz.bz_bufb = pb->zbuf2;
+		bz.bz_buflen = pb->zbufsize;
+		if (ioctl(fd, BIOCSETZBUF, (caddr_t)&bz) < 0) {
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSETZBUF: %s",
+			    pcap_strerror(errno));
+			goto bad;
+		}
+		(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));
+			goto bad;
+		}
+		v = pb->zbufsize - sizeof(struct bpf_zbuf_header);
+	} else
+#endif
+	{
+		/*
+		 * We don't have zerocopy BPF.
+		 * Set the buffer size.
+		 */
+		if (p->opt.buffer_size != 0) {
+			/*
+			 * A buffer size was explicitly specified; use it.
+			 */
+			if (ioctl(fd, BIOCSBLEN,
+			    (caddr_t)&p->opt.buffer_size) < 0) {
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				    "BIOCSBLEN: %s: %s", p->opt.source,
+				    pcap_strerror(errno));
+				status = PCAP_ERROR;
+				goto bad;
+			}
+
+			/*
+			 * Now bind to the device.
+			 */
+			(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;
+			}
+		} else {
+			/*
+			 * No buffer size was explicitly specified.
+			 *
+			 * 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 < DEFAULT_BUFSIZE)
+				v = DEFAULT_BUFSIZE;
+			for ( ; v != 0; v >>= 1) {
+				/*
+				 * Ignore the return value - this is because the
+				 * call fails on BPF systems that don't have
+				 * kernel malloc.  And if the call fails, it's
+				 * no big deal, we just continue to use the
+				 * standard buffer size.
+				 */
+				(void) ioctl(fd, BIOCSBLEN, (caddr_t)&v);
+
+				(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) {
+					status = check_setif_failure(p, errno);
+					goto bad;
+				}
+			}
+
+			if (v == 0) {
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				    "BIOCSBLEN: %s: No buffer size worked",
+				    p->opt.source);
+				status = PCAP_ERROR;
+				goto bad;
+			}
+		}
 	}
 
 	/* Get the data link layer type. */
 	if (ioctl(fd, BIOCGDLT, (caddr_t)&v) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "BIOCGDLT: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCGDLT: %s",
 		    pcap_strerror(errno));
+		status = PCAP_ERROR;
 		goto bad;
 	}
+
 #ifdef _AIX
 	/*
 	 * AIX's BPF returns IFF_ types, not DLT_ types, in BIOCGDLT.
@@ -713,8 +1842,9 @@
 		/*
 		 * We don't know what to map this to yet.
 		 */
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "unknown interface type %u",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "unknown interface type %u",
 		    v);
+		status = PCAP_ERROR;
 		goto bad;
 	}
 #endif
@@ -739,13 +1869,6 @@
 		break;
 	}
 #endif
-#ifdef PCAP_FDDIPAD
-	if (v == DLT_FDDI)
-		p->fddipad = PCAP_FDDIPAD;
-	else
-		p->fddipad = 0;
-#endif
-	p->linktype = v;
 
 #ifdef BIOCGDLTLIST
 	/*
@@ -753,68 +1876,144 @@
 	 * this interface supports.  If this fails with EINVAL, it's
 	 * not fatal; we just don't get to use the feature later.
 	 */
-	if (ioctl(fd, BIOCGDLTLIST, (caddr_t)&bdl) == 0) {
-		u_int i;
-		int is_ethernet;
+	if (get_dlt_list(fd, v, &bdl, p->errbuf) == -1) {
+		status = PCAP_ERROR;
+		goto bad;
+	}
+	p->dlt_count = bdl.bfl_len;
+	p->dlt_list = bdl.bfl_list;
 
-		bdl.bfl_list = (u_int *) malloc(sizeof(u_int) * (bdl.bfl_len + 1));
-		if (bdl.bfl_list == NULL) {
-			(void)snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s",
-			    pcap_strerror(errno));
-			goto bad;
+#ifdef __APPLE__
+	/*
+	 * Monitor mode fun, continued.
+	 *
+	 * For 10.5 and, we're assuming, later releases, as noted above,
+	 * 802.1 adapters that support monitor mode offer both DLT_EN10MB,
+	 * DLT_IEEE802_11, and possibly some 802.11-plus-radio-information
+	 * DLT_ value.  Choosing one of the 802.11 DLT_ values will turn
+	 * monitor mode on.
+	 *
+	 * Therefore, if the user asked for monitor mode, we filter out
+	 * the DLT_EN10MB value, as you can't get that in monitor mode,
+	 * and, if the user didn't ask for monitor mode, we filter out
+	 * the 802.11 DLT_ values, because selecting those will turn
+	 * monitor mode on.  Then, for monitor mode, if an 802.11-plus-
+	 * radio DLT_ value is offered, we try to select that, otherwise
+	 * we try to select DLT_IEEE802_11.
+	 */
+	if (have_osinfo) {
+		if (isdigit((unsigned)osinfo.release[0]) &&
+		     (osinfo.release[0] == '9' ||
+		     isdigit((unsigned)osinfo.release[1]))) {
+			/*
+			 * 10.5 (Darwin 9.x), or later.
+			 */
+			new_dlt = find_802_11(&bdl);
+			if (new_dlt != -1) {
+				/*
+				 * We have at least one 802.11 DLT_ value,
+				 * so this is an 802.11 interface.
+				 * new_dlt is the best of the 802.11
+				 * DLT_ values in the list.
+				 */
+				if (p->opt.rfmon) {
+					/*
+					 * Our caller wants monitor mode.
+					 * Purge DLT_EN10MB from the list
+					 * of link-layer types, as selecting
+					 * it will keep monitor mode off.
+					 */
+					remove_en(p);
+
+					/*
+					 * If the new mode we want isn't
+					 * the default mode, attempt to
+					 * select the new mode.
+					 */
+					if (new_dlt != v) {
+						if (ioctl(p->fd, BIOCSDLT,
+						    &new_dlt) != -1) {
+							/*
+							 * We succeeded;
+							 * make this the
+							 * new DLT_ value.
+							 */
+							v = new_dlt;
+						}
+					}
+				} else {
+					/*
+					 * Our caller doesn't want
+					 * monitor mode.  Unless this
+					 * is being done by pcap_open_live(),
+					 * purge the 802.11 link-layer types
+					 * from the list, as selecting
+					 * one of them will turn monitor
+					 * mode on.
+					 */
+					if (!p->oldstyle)
+						remove_802_11(p);
+				}
+			} else {
+				if (p->opt.rfmon) {
+					/*
+					 * The caller requested monitor
+					 * mode, but we have no 802.11
+					 * link-layer types, so they
+					 * can't have it.
+					 */
+					status = PCAP_ERROR_RFMON_NOTSUP;
+					goto bad;
+				}
+			}
 		}
-
-		if (ioctl(fd, BIOCGDLTLIST, (caddr_t)&bdl) < 0) {
-			(void)snprintf(ebuf, PCAP_ERRBUF_SIZE,
-			    "BIOCGDLTLIST: %s", pcap_strerror(errno));
-			free(bdl.bfl_list);
+	}
+#elif defined(HAVE_BSD_IEEE80211)
+	/*
+	 * *BSD with the new 802.11 ioctls.
+	 * Do we want monitor mode?
+	 */
+	if (p->opt.rfmon) {
+		/*
+		 * Try to put the interface into monitor mode.
+		 */
+		status = monitor_mode(p, 1);
+		if (status != 0) {
+			/*
+			 * We failed.
+			 */
 			goto bad;
 		}
 
 		/*
-		 * OK, for real Ethernet devices, add DLT_DOCSIS to the
-		 * list, so that an application can let you choose it,
-		 * in case you're capturing DOCSIS traffic that a Cisco
-		 * Cable Modem Termination System is putting out onto
-		 * an Ethernet (it doesn't put an Ethernet header onto
-		 * the wire, it puts raw DOCSIS frames out on the wire
-		 * inside the low-level Ethernet framing).
-		 *
-		 * A "real Ethernet device" is defined here as a device
-		 * that has a link-layer type of DLT_EN10MB and that has
-		 * no alternate link-layer types; that's done to exclude
-		 * 802.11 interfaces (which might or might not be the
-		 * right thing to do, but I suspect it is - Ethernet <->
-		 * 802.11 bridges would probably badly mishandle frames
-		 * that don't have Ethernet headers).
+		 * We're in monitor mode.
+		 * Try to find the best 802.11 DLT_ value and, if we
+		 * succeed, try to switch to that mode if we're not
+		 * already in that mode.
 		 */
-		if (p->linktype == DLT_EN10MB) {
-			is_ethernet = 1;
-			for (i = 0; i < bdl.bfl_len; i++) {
-				if (bdl.bfl_list[i] != DLT_EN10MB) {
-					is_ethernet = 0;
-					break;
+		new_dlt = find_802_11(&bdl);
+		if (new_dlt != -1) {
+			/*
+			 * We have at least one 802.11 DLT_ value.
+			 * new_dlt is the best of the 802.11
+			 * DLT_ values in the list.
+			 *
+			 * If the new mode we want isn't the default mode,
+			 * attempt to select the new mode.
+			 */
+			if (new_dlt != v) {
+				if (ioctl(p->fd, BIOCSDLT, &new_dlt) != -1) {
+					/*
+					 * We succeeded; make this the
+					 * new DLT_ value.
+					 */
+					v = new_dlt;
 				}
 			}
-			if (is_ethernet) {
-				/*
-				 * We reserved one more slot at the end of
-				 * the list.
-				 */
-				bdl.bfl_list[bdl.bfl_len] = DLT_DOCSIS;
-				bdl.bfl_len++;
-			}
-		}
-		p->dlt_count = bdl.bfl_len;
-		p->dlt_list = bdl.bfl_list;
-	} else {
-		if (errno != EINVAL) {
-			(void)snprintf(ebuf, PCAP_ERRBUF_SIZE,
-			    "BIOCGDLTLIST: %s", pcap_strerror(errno));
-			goto bad;
 		}
 	}
-#endif
+#endif /* various platforms */
+#endif /* BIOCGDLTLIST */
 
 	/*
 	 * If this is an Ethernet device, and we don't have a DLT_ list,
@@ -824,7 +2023,7 @@
 	 * some other way of determining whether it's an Ethernet or 802.11
 	 * device.)
 	 */
-	if (p->linktype == DLT_EN10MB && p->dlt_count == 0) {
+	if (v == DLT_EN10MB && p->dlt_count == 0) {
 		p->dlt_list = (u_int *) malloc(sizeof(u_int) * 2);
 		/*
 		 * If that fails, just leave the list empty.
@@ -835,7 +2034,14 @@
 			p->dlt_count = 2;
 		}
 	}
-		
+#ifdef PCAP_FDDIPAD
+	if (v == DLT_FDDI)
+		p->fddipad = PCAP_FDDIPAD;
+	else
+#endif
+		p->fddipad = 0;
+	p->linktype = v;
+
 #if defined(BIOCGHDRCMPLT) && defined(BIOCSHDRCMPLT)
 	/*
 	 * Do a BIOCSHDRCMPLT, if defined, to turn that flag on, so
@@ -847,29 +2053,68 @@
 	 * BSDs - check CVS log for "bpf.c"?
 	 */
 	if (ioctl(fd, BIOCSHDRCMPLT, &spoof_eth_src) == -1) {
-		(void)snprintf(ebuf, PCAP_ERRBUF_SIZE,
+		(void)snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
 		    "BIOCSHDRCMPLT: %s", pcap_strerror(errno));
+		status = PCAP_ERROR;
 		goto bad;
 	}
 #endif
 	/* set timeout */
-	if (to_ms != 0) {
+#ifdef HAVE_ZEROCOPY_BPF
+	/*
+	 * In zero-copy mode, we just use the timeout in select().
+	 * XXX - what if we're in non-blocking mode and the *application*
+	 * is using select() or poll() or kqueues or....?
+	 */
+	if (p->opt.timeout && !pb->zerocopy) {
+#else
+	if (p->opt.timeout) {
+#endif
 		/*
 		 * 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 = to_ms / 1000;
-		to.tv_usec = (to_ms * 1000) % 1000000;
-		if (ioctl(p->fd, BIOCSRTIMEOUT, (caddr_t)&to) < 0) {
-			snprintf(ebuf, PCAP_ERRBUF_SIZE, "BIOCSRTIMEOUT: %s",
-			    pcap_strerror(errno));
-			goto bad;
+#ifdef HAVE_STRUCT_BPF_TIMEVAL
+		struct BPF_TIMEVAL bpf_to;
+
+		if (IOCPARM_LEN(BIOCSRTIMEOUT) != sizeof(struct timeval)) {
+			bpf_to.tv_sec = p->opt.timeout / 1000;
+			bpf_to.tv_usec = (p->opt.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->opt.timeout / 1000;
+			to.tv_usec = (p->opt.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
 #ifdef	BIOCIMMEDIATE
 	/*
 	 * Darren Reed notes that
@@ -881,76 +2126,73 @@
 	 *	is reducing things to only a few packets (i.e. one every
 	 *	second or so).
 	 *
-	 * so we turn BIOCIMMEDIATE mode on if this is AIX.
+	 * so we always turn BIOCIMMEDIATE mode on if this is AIX.
 	 *
-	 * We don't turn it on for other platforms, as that means we
-	 * get woken up for every packet, which may not be what we want;
-	 * in the Winter 1993 USENIX paper on BPF, they say:
+	 * For other platforms, we don't turn immediate mode on by default,
+	 * as that would mean we get woken up for every packet, which
+	 * probably isn't what you want for a packet sniffer.
 	 *
-	 *	Since a process might want to look at every packet on a
-	 *	network and the time between packets can be only a few
-	 *	microseconds, it is not possible to do a read system call
-	 *	per packet and BPF must collect the data from several
-	 *	packets and return it as a unit when the monitoring
-	 *	application does a read.
-	 *
-	 * which I infer is the reason for the timeout - it means we
-	 * wait that amount of time, in the hopes that more packets
-	 * will arrive and we'll get them all with one read.
-	 *
-	 * Setting BIOCIMMEDIATE mode on FreeBSD (and probably other
-	 * BSDs) causes the timeout to be ignored.
-	 *
-	 * On the other hand, some platforms (e.g., Linux) don't support
-	 * timeouts, they just hand stuff to you as soon as it arrives;
-	 * if that doesn't cause a problem on those platforms, it may
-	 * be OK to have BIOCIMMEDIATE mode on BSD as well.
-	 *
-	 * (Note, though, that applications may depend on the read
-	 * completing, even if no packets have arrived, when the timeout
-	 * expires, e.g. GUI applications that have to check for input
-	 * while waiting for packets to arrive; a non-zero timeout
-	 * prevents "select()" from working right on FreeBSD and
-	 * possibly other BSDs, as the timer doesn't start until a
-	 * "read()" is done, so the timer isn't in effect if the
-	 * application is blocked on a "select()", and the "select()"
-	 * doesn't get woken up for a BPF device until the buffer
-	 * fills up.)
+	 * We set immediate mode if the caller requested it by calling
+	 * pcap_set_immediate() before calling pcap_activate().
 	 */
-	v = 1;
-	if (ioctl(p->fd, BIOCIMMEDIATE, &v) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "BIOCIMMEDIATE: %s",
-		    pcap_strerror(errno));
+#ifndef _AIX
+	if (p->opt.immediate) {
+#endif /* _AIX */
+		v = 1;
+		if (ioctl(p->fd, BIOCIMMEDIATE, &v) < 0) {
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+			    "BIOCIMMEDIATE: %s", pcap_strerror(errno));
+			status = PCAP_ERROR;
+			goto bad;
+		}
+#ifndef _AIX
+	}
+#endif /* _AIX */
+#else /* BIOCIMMEDIATE */
+	if (p->opt.immediate) {
+		/*
+		 * We don't support immediate mode.  Fail.
+		 */
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "Immediate mode not supported");
+		status = PCAP_ERROR;
 		goto bad;
 	}
-#endif	/* BIOCIMMEDIATE */
-#endif	/* _AIX */
+#endif /* BIOCIMMEDIATE */
 
-	if (promisc) {
-		/* set promiscuous mode, okay if it fails */
+	if (p->opt.promisc) {
+		/* set promiscuous mode, just warn if it fails */
 		if (ioctl(p->fd, BIOCPROMISC, NULL) < 0) {
-			snprintf(ebuf, PCAP_ERRBUF_SIZE, "BIOCPROMISC: %s",
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCPROMISC: %s",
 			    pcap_strerror(errno));
+			status = PCAP_WARNING_PROMISC_NOTSUP;
 		}
 	}
 
 	if (ioctl(fd, BIOCGBLEN, (caddr_t)&v) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "BIOCGBLEN: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCGBLEN: %s",
 		    pcap_strerror(errno));
+		status = PCAP_ERROR;
 		goto bad;
 	}
 	p->bufsize = v;
+#ifdef HAVE_ZEROCOPY_BPF
+	if (!pb->zerocopy) {
+#endif
 	p->buffer = (u_char *)malloc(p->bufsize);
 	if (p->buffer == NULL) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "malloc: %s",
 		    pcap_strerror(errno));
+		status = PCAP_ERROR;
 		goto bad;
 	}
 #ifdef _AIX
-	/* For some strange reason this seems to prevent the EFAULT 
+	/* For some strange reason this seems to prevent the EFAULT
 	 * problems we have experienced from AIX BPF. */
 	memset(p->buffer, 0x0, p->bufsize);
 #endif
+#ifdef HAVE_ZEROCOPY_BPF
+	}
+#endif
 
 	/*
 	 * If there's no filter program installed, there's
@@ -964,13 +2206,14 @@
 	total_insn.code = (u_short)(BPF_RET | BPF_K);
 	total_insn.jt = 0;
 	total_insn.jf = 0;
-	total_insn.k = snaplen;
+	total_insn.k = p->snapshot;
 
 	total_prog.bf_len = 1;
 	total_prog.bf_insns = &total_insn;
 	if (ioctl(p->fd, BIOCSETF, (caddr_t)&total_prog) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "BIOCSETF: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSETF: %s",
 		    pcap_strerror(errno));
+		status = PCAP_ERROR;
 		goto bad;
 	}
 
@@ -1011,7 +2254,7 @@
 	 * XXX - what about AIX?
 	 */
 	p->selectable_fd = p->fd;	/* assume select() works until we know otherwise */
-	if (uname(&osinfo) == 0) {
+	if (have_osinfo) {
 		/*
 		 * We can check what OS this is.
 		 */
@@ -1027,48 +2270,343 @@
 	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->close_op = pcap_close_common;
+	p->cleanup_op = pcap_cleanup_bpf;
 
-	return (p);
+	return (status);
  bad:
-	(void)close(fd);
-	if (p->dlt_list != NULL)
-		free(p->dlt_list);
-	free(p);
-	return (NULL);
+	pcap_cleanup_bpf(p);
+	return (status);
 }
 
 int
 pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
 {
-#ifdef HAVE_DAG_API
-	if (dag_platform_finddevs(alldevsp, errbuf) < 0)
-		return (-1);
-#endif /* HAVE_DAG_API */
-
 	return (0);
 }
 
+#ifdef HAVE_BSD_IEEE80211
+static int
+monitor_mode(pcap_t *p, int set)
+{
+	struct pcap_bpf *pb = p->priv;
+	int sock;
+	struct ifmediareq req;
+	int *media_list;
+	int i;
+	int can_do;
+	struct ifreq ifr;
+
+	sock = socket(AF_INET, SOCK_DGRAM, 0);
+	if (sock == -1) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "can't open socket: %s",
+		    pcap_strerror(errno));
+		return (PCAP_ERROR);
+	}
+
+	memset(&req, 0, sizeof req);
+	strncpy(req.ifm_name, p->opt.source, sizeof req.ifm_name);
+
+	/*
+	 * Find out how many media types we have.
+	 */
+	if (ioctl(sock, SIOCGIFMEDIA, &req) < 0) {
+		/*
+		 * Can't get the media types.
+		 */
+		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);
+		}
+	}
+	if (req.ifm_count == 0) {
+		/*
+		 * No media types.
+		 */
+		close(sock);
+		return (PCAP_ERROR_RFMON_NOTSUP);
+	}
+
+	/*
+	 * Allocate a buffer to hold all the media types, and
+	 * get the media types.
+	 */
+	media_list = malloc(req.ifm_count * sizeof(int));
+	if (media_list == NULL) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "malloc: %s",
+		    pcap_strerror(errno));
+		close(sock);
+		return (PCAP_ERROR);
+	}
+	req.ifm_ulist = media_list;
+	if (ioctl(sock, SIOCGIFMEDIA, &req) < 0) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "SIOCGIFMEDIA: %s",
+		    pcap_strerror(errno));
+		free(media_list);
+		close(sock);
+		return (PCAP_ERROR);
+	}
+
+	/*
+	 * Look for an 802.11 "automatic" media type.
+	 * We assume that all 802.11 adapters have that media type,
+	 * and that it will carry the monitor mode supported flag.
+	 */
+	can_do = 0;
+	for (i = 0; i < req.ifm_count; i++) {
+		if (IFM_TYPE(media_list[i]) == IFM_IEEE80211
+		    && IFM_SUBTYPE(media_list[i]) == IFM_AUTO) {
+			/* OK, does it do monitor mode? */
+			if (media_list[i] & IFM_IEEE80211_MONITOR) {
+				can_do = 1;
+				break;
+			}
+		}
+	}
+	free(media_list);
+	if (!can_do) {
+		/*
+		 * This adapter doesn't support monitor mode.
+		 */
+		close(sock);
+		return (PCAP_ERROR_RFMON_NOTSUP);
+	}
+
+	if (set) {
+		/*
+		 * Don't just check whether we can enable monitor mode,
+		 * do so, if it's not already enabled.
+		 */
+		if ((req.ifm_current & IFM_IEEE80211_MONITOR) == 0) {
+			/*
+			 * Monitor mode isn't currently on, so turn it on,
+			 * and remember that we should turn it off when the
+			 * pcap_t is closed.
+			 */
+
+			/*
+			 * If we haven't already done so, arrange to have
+			 * "pcap_close_all()" called when we exit.
+			 */
+			if (!pcap_do_addexit(p)) {
+				/*
+				 * "atexit()" failed; don't put the interface
+				 * in monitor mode, just give up.
+				 */
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				     "atexit failed");
+				close(sock);
+				return (PCAP_ERROR);
+			}
+			memset(&ifr, 0, sizeof(ifr));
+			(void)strncpy(ifr.ifr_name, p->opt.source,
+			    sizeof(ifr.ifr_name));
+			ifr.ifr_media = req.ifm_current | IFM_IEEE80211_MONITOR;
+			if (ioctl(sock, SIOCSIFMEDIA, &ifr) == -1) {
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				     "SIOCSIFMEDIA: %s", pcap_strerror(errno));
+				close(sock);
+				return (PCAP_ERROR);
+			}
+
+			pb->must_do_on_close |= MUST_CLEAR_RFMON;
+
+			/*
+			 * Add this to the list of pcaps to close when we exit.
+			 */
+			pcap_add_to_pcaps_to_close(p);
+		}
+	}
+	return (0);
+}
+#endif /* HAVE_BSD_IEEE80211 */
+
+#if defined(BIOCGDLTLIST) && (defined(__APPLE__) || defined(HAVE_BSD_IEEE80211))
+/*
+ * Check whether we have any 802.11 link-layer types; return the best
+ * of the 802.11 link-layer types if we find one, and return -1
+ * otherwise.
+ *
+ * DLT_IEEE802_11_RADIO, with the radiotap header, is considered the
+ * best 802.11 link-layer type; any of the other 802.11-plus-radio
+ * headers are second-best; 802.11 with no radio information is
+ * the least good.
+ */
+static int
+find_802_11(struct bpf_dltlist *bdlp)
+{
+	int new_dlt;
+	int i;
+
+	/*
+	 * Scan the list of DLT_ values, looking for 802.11 values,
+	 * and, if we find any, choose the best of them.
+	 */
+	new_dlt = -1;
+	for (i = 0; i < bdlp->bfl_len; i++) {
+		switch (bdlp->bfl_list[i]) {
+
+		case DLT_IEEE802_11:
+			/*
+			 * 802.11, but no radio.
+			 *
+			 * Offer this, and select it as the new mode
+			 * unless we've already found an 802.11
+			 * header with radio information.
+			 */
+			if (new_dlt == -1)
+				new_dlt = bdlp->bfl_list[i];
+			break;
+
+		case DLT_PRISM_HEADER:
+		case DLT_AIRONET_HEADER:
+		case DLT_IEEE802_11_RADIO_AVS:
+			/*
+			 * 802.11 with radio, but not radiotap.
+			 *
+			 * Offer this, and select it as the new mode
+			 * unless we've already found the radiotap DLT_.
+			 */
+			if (new_dlt != DLT_IEEE802_11_RADIO)
+				new_dlt = bdlp->bfl_list[i];
+			break;
+
+		case DLT_IEEE802_11_RADIO:
+			/*
+			 * 802.11 with radiotap.
+			 *
+			 * Offer this, and select it as the new mode.
+			 */
+			new_dlt = bdlp->bfl_list[i];
+			break;
+
+		default:
+			/*
+			 * Not 802.11.
+			 */
+			break;
+		}
+	}
+
+	return (new_dlt);
+}
+#endif /* defined(BIOCGDLTLIST) && (defined(__APPLE__) || defined(HAVE_BSD_IEEE80211)) */
+
+#if defined(__APPLE__) && defined(BIOCGDLTLIST)
+/*
+ * 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)
+{
+	int i, j;
+
+	/*
+	 * Scan the list of DLT_ values and discard DLT_EN10MB.
+	 */
+	j = 0;
+	for (i = 0; i < p->dlt_count; i++) {
+		switch (p->dlt_list[i]) {
+
+		case DLT_EN10MB:
+			/*
+			 * Don't offer this one.
+			 */
+			continue;
+
+		default:
+			/*
+			 * Just copy this mode over.
+			 */
+			break;
+		}
+
+		/*
+		 * Copy this DLT_ value to its new position.
+		 */
+		p->dlt_list[j] = p->dlt_list[i];
+		j++;
+	}
+
+	/*
+	 * Set the DLT_ count to the number of entries we copied.
+	 */
+	p->dlt_count = j;
+}
+
+/*
+ * 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)
+{
+	int i, j;
+
+	/*
+	 * Scan the list of DLT_ values and discard 802.11 values.
+	 */
+	j = 0;
+	for (i = 0; i < p->dlt_count; i++) {
+		switch (p->dlt_list[i]) {
+
+		case DLT_IEEE802_11:
+		case DLT_PRISM_HEADER:
+		case DLT_AIRONET_HEADER:
+		case DLT_IEEE802_11_RADIO:
+		case DLT_IEEE802_11_RADIO_AVS:
+			/*
+			 * 802.11.  Don't offer this one.
+			 */
+			continue;
+
+		default:
+			/*
+			 * Just copy this mode over.
+			 */
+			break;
+		}
+
+		/*
+		 * Copy this DLT_ value to its new position.
+		 */
+		p->dlt_list[j] = p->dlt_list[i];
+		j++;
+	}
+
+	/*
+	 * Set the DLT_ count to the number of entries we copied.
+	 */
+	p->dlt_count = j;
+}
+#endif /* defined(__APPLE__) && defined(BIOCGDLTLIST) */
+
 static int
 pcap_setfilter_bpf(pcap_t *p, struct bpf_program *fp)
 {
-	/*
-	 * It looks that BPF code generated by gen_protochain() is not
-	 * compatible with some of kernel BPF code (for example BSD/OS 3.1).
-	 * Take a safer side for now.
-	 */
-	if (no_optimize) {
-		/*
-		 * XXX - what if we already have a filter in the kernel?
-		 */
-		if (install_bpf_program(p, fp) < 0)
-			return (-1);
-		p->md.use_bpf = 0;	/* filtering in userland */
-		return (0);
-	}
+	struct pcap_bpf *pb = p->priv;
 
 	/*
 	 * Free any user-mode filter we might happen to have installed.
@@ -1078,20 +2616,51 @@
 	/*
 	 * Try to install the kernel filter.
 	 */
-	if (ioctl(p->fd, BIOCSETF, (caddr_t)fp) < 0) {
+	if (ioctl(p->fd, BIOCSETF, (caddr_t)fp) == 0) {
+		/*
+		 * It worked.
+		 */
+		pb->filtering_in_kernel = 1;	/* filtering in the kernel */
+
+		/*
+		 * Discard any previously-received packets, as they might
+		 * have passed whatever filter was formerly in effect, but
+		 * might not pass this filter (BIOCSETF discards packets
+		 * buffered in the kernel, so you can lose packets in any
+		 * case).
+		 */
+		p->cc = 0;
+		return (0);
+	}
+
+	/*
+	 * We failed.
+	 *
+	 * If it failed with EINVAL, that's probably because the program
+	 * is invalid or too big.  Validate it ourselves; if we like it
+	 * (we currently allow backward branches, to support protochain),
+	 * run it in userland.  (There's no notion of "too big" for
+	 * userland.)
+	 *
+	 * Otherwise, just give up.
+	 * XXX - if the copy of the program into the kernel failed,
+	 * we will get EINVAL rather than, say, EFAULT on at least
+	 * some kernels.
+	 */
+	if (errno != EINVAL) {
 		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "BIOCSETF: %s",
 		    pcap_strerror(errno));
 		return (-1);
 	}
-	p->md.use_bpf = 1;	/* filtering in the kernel */
 
 	/*
-	 * Discard any previously-received packets, as they might have
-	 * passed whatever filter was formerly in effect, but might
-	 * not pass this filter (BIOCSETF discards packets buffered
-	 * in the kernel, so you can lose packets in any case).
+	 * install_bpf_program() validates the program.
+	 *
+	 * XXX - what if we already have a filter in the kernel?
 	 */
-	p->cc = 0;
+	if (install_bpf_program(p, fp) < 0)
+		return (-1);
+	pb->filtering_in_kernel = 0;	/* filtering in userland */
 	return (0);
 }
 
diff --git a/pcap-bpf.h b/pcap-bpf.h
index 62c493b..7b7e90a 100644
--- a/pcap-bpf.h
+++ b/pcap-bpf.h
@@ -35,800 +35,13 @@
  * 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.50 2007-04-01 21:43:55 guy Exp $ (LBL)
+ */
+
+/*
+ * For backwards compatibility.
  *
- * @(#) $Header: /tcpdump/master/libpcap/pcap-bpf.h,v 1.34.2.24 2007/09/19 02:52:12 guy Exp $ (LBL)
+ * Note to OS vendors: do NOT get rid of this file!  Some applications
+ * might expect to be able to include <pcap-bpf.h>.
  */
-
-/*
- * 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.
- *
- * XXX - should this all just be moved to "pcap.h"?
- */
-
-#ifndef BPF_MAJOR_VERSION
-
-#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. 
- */
-#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))
-
-#define BPF_MAXINSNS 512
-#define BPF_MAXBUFSIZE 0x8000
-#define BPF_MINBUFSIZE 32
-
-/*
- * Structure for "pcap_compile()", "pcap_setfilter()", etc..
- */
-struct bpf_program {
-	u_int bf_len;
-	struct bpf_insn *bf_insns;
-};
- 
-/*
- * Struct return by BIOCVERSION.  This represents the version number of 
- * the filter language described by the instruction encodings below.
- * bpf understands a program iff kernel_major == filter_major &&
- * kernel_minor >= filter_minor, that is, if the value returned by the
- * running kernel has the same major number and a minor number equal
- * equal to or less than the filter being downloaded.  Otherwise, the
- * results are undefined, meaning an error may be returned or packets
- * may be accepted haphazardly.
- * It has nothing to do with the source code version.
- */
-struct bpf_version {
-	u_short bv_major;
-	u_short bv_minor;
-};
-/* Current version number of filter architecture. */
-#define BPF_MAJOR_VERSION 1
-#define BPF_MINOR_VERSION 1
-
-/*
- * Data-link level type codes.
- *
- * Do *NOT* add new values to this list without asking
- * "tcpdump-workers@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).
- */
-
-/*
- * 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 types corresponding to DLT_ types that differ
- * between platforms; don't use those values for new DLT_ new types.
- */
-
-/*
- * 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@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>.
- */
-#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
-
-
-/*
- * The instruction encodings.
- */
-/* instruction classes */
-#define BPF_CLASS(code) ((code) & 0x07)
-#define		BPF_LD		0x00
-#define		BPF_LDX		0x01
-#define		BPF_ST		0x02
-#define		BPF_STX		0x03
-#define		BPF_ALU		0x04
-#define		BPF_JMP		0x05
-#define		BPF_RET		0x06
-#define		BPF_MISC	0x07
-
-/* ld/ldx fields */
-#define BPF_SIZE(code)	((code) & 0x18)
-#define		BPF_W		0x00
-#define		BPF_H		0x08
-#define		BPF_B		0x10
-#define BPF_MODE(code)	((code) & 0xe0)
-#define		BPF_IMM 	0x00
-#define		BPF_ABS		0x20
-#define		BPF_IND		0x40
-#define		BPF_MEM		0x60
-#define		BPF_LEN		0x80
-#define		BPF_MSH		0xa0
-
-/* alu/jmp fields */
-#define BPF_OP(code)	((code) & 0xf0)
-#define		BPF_ADD		0x00
-#define		BPF_SUB		0x10
-#define		BPF_MUL		0x20
-#define		BPF_DIV		0x30
-#define		BPF_OR		0x40
-#define		BPF_AND		0x50
-#define		BPF_LSH		0x60
-#define		BPF_RSH		0x70
-#define		BPF_NEG		0x80
-#define		BPF_JA		0x00
-#define		BPF_JEQ		0x10
-#define		BPF_JGT		0x20
-#define		BPF_JGE		0x30
-#define		BPF_JSET	0x40
-#define BPF_SRC(code)	((code) & 0x08)
-#define		BPF_K		0x00
-#define		BPF_X		0x08
-
-/* ret - BPF_K and BPF_X also apply */
-#define BPF_RVAL(code)	((code) & 0x18)
-#define		BPF_A		0x10
-
-/* misc */
-#define BPF_MISCOP(code) ((code) & 0xf8)
-#define		BPF_TAX		0x00
-#define		BPF_TXA		0x80
-
-/*
- * The instruction data structure.
- */
-struct bpf_insn {
-	u_short	code;
-	u_char 	jt;
-	u_char 	jf;
-	bpf_int32 k;
-};
-
-/*
- * Macros for insn array initializers.
- */
-#define BPF_STMT(code, k) { (u_short)(code), 0, 0, k }
-#define BPF_JUMP(code, k, jt, jf) { (u_short)(code), jt, jf, k }
-
-#if __STDC__ || defined(__cplusplus)
-extern int bpf_validate(struct bpf_insn *, int);
-extern u_int bpf_filter(struct bpf_insn *, u_char *, u_int, u_int);
-#else
-extern int bpf_validate();
-extern u_int bpf_filter();
-#endif
-
-/*
- * Number of scratch memory words (for BPF_LD|BPF_MEM and BPF_ST).
- */
-#define BPF_MEMWORDS 16
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+#include <pcap/bpf.h>
diff --git a/pcap-bt-linux.c b/pcap-bt-linux.c
new file mode 100644
index 0000000..6435bcf
--- /dev/null
+++ b/pcap-bt-linux.c
@@ -0,0 +1,415 @@
+/*
+ * Copyright (c) 2006 Paolo Abeni (Italy)
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+ * OWNER 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.
+ *
+ * Bluetooth sniffing API implementation for Linux platform
+ * By Paolo Abeni <paolo.abeni@email.it>
+ *
+ */
+#ifndef lint
+static const char rcsid[] _U_ =
+    "@(#) $Header: /tcpdump/master/libpcap/pcap-bt-linux.c,v 1.15 2008-07-01 07:05:54 guy Exp $ (LBL)";
+#endif
+ 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcap-int.h"
+#include "pcap-bt-linux.h"
+#include "pcap/bluetooth.h"
+
+#ifdef NEED_STRERROR_H
+#include "strerror.h"
+#endif
+
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/hci.h>
+
+#define BT_IFACE "bluetooth"
+#define BT_CTRL_SIZE 128
+
+/* forward declaration */
+static int bt_activate(pcap_t *);
+static int bt_read_linux(pcap_t *, int , pcap_handler , u_char *);
+static int bt_inject_linux(pcap_t *, const void *, size_t);
+static int bt_setdirection_linux(pcap_t *, pcap_direction_t);
+static int bt_stats_linux(pcap_t *, struct pcap_stat *);
+
+/*
+ * Private data for capturing on Linux Bluetooth devices.
+ */
+struct pcap_bt {
+	int dev_id;		/* device ID of device we're bound to */
+};
+
+int 
+bt_findalldevs(pcap_if_t **alldevsp, char *err_str)
+{
+	struct hci_dev_list_req *dev_list;
+	struct hci_dev_req *dev_req;
+	int i, sock;
+	int ret = 0;
+
+	sock  = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
+	if (sock < 0)
+	{
+		/* if bluetooth is not supported this this is not fatal*/ 
+		if (errno == EAFNOSUPPORT)
+			return 0;
+		snprintf(err_str, PCAP_ERRBUF_SIZE,
+		    "Can't open raw Bluetooth socket: %s", strerror(errno));
+		return -1;
+	}
+
+	dev_list = malloc(HCI_MAX_DEV * sizeof(*dev_req) + sizeof(*dev_list));
+	if (!dev_list) 
+	{
+		snprintf(err_str, PCAP_ERRBUF_SIZE, "Can't allocate %zu bytes for Bluetooth device list",
+			HCI_MAX_DEV * sizeof(*dev_req) + sizeof(*dev_list));
+		ret = -1;
+		goto done;
+	}
+
+	dev_list->dev_num = HCI_MAX_DEV;
+
+	if (ioctl(sock, HCIGETDEVLIST, (void *) dev_list) < 0) 
+	{
+		snprintf(err_str, PCAP_ERRBUF_SIZE,
+		    "Can't get Bluetooth device list via ioctl: %s",
+		    strerror(errno));
+		ret = -1;
+		goto free;
+	}
+
+	dev_req = dev_list->dev_req;
+	for (i = 0; i < dev_list->dev_num; i++, dev_req++) {
+		char dev_name[20], dev_descr[30];
+		
+		snprintf(dev_name, 20, BT_IFACE"%d", dev_req->dev_id);
+		snprintf(dev_descr, 30, "Bluetooth adapter number %d", i);
+			
+		if (pcap_add_if(alldevsp, dev_name, 0, 
+		       dev_descr, err_str) < 0)
+		{
+			ret = -1;
+			break;
+		}
+
+	}
+
+free:
+	free(dev_list);
+
+done:
+	close(sock);
+	return ret;
+}
+
+pcap_t *
+bt_create(const char *device, char *ebuf, int *is_ours)
+{
+	const char *cp;
+	char *cpend;
+	long devnum;
+	pcap_t *p;
+
+	/* Does this look like a Bluetooth device? */
+	cp = strrchr(device, '/');
+	if (cp == NULL)
+		cp = device;
+	/* Does it begin with BT_IFACE? */
+	if (strncmp(cp, BT_IFACE, sizeof BT_IFACE - 1) != 0) {
+		/* Nope, doesn't begin with BT_IFACE */
+		*is_ours = 0;
+		return NULL;
+	}
+	/* Yes - is BT_IFACE followed by a number? */
+	cp += sizeof BT_IFACE - 1;
+	devnum = strtol(cp, &cpend, 10);
+	if (cpend == cp || *cpend != '\0') {
+		/* Not followed by a number. */
+		*is_ours = 0;
+		return NULL;
+	}
+	if (devnum < 0) {
+		/* Followed by a non-valid number. */
+		*is_ours = 0;
+		return NULL;
+	}
+
+	/* OK, it's probably ours. */
+	*is_ours = 1;
+
+	p = pcap_create_common(device, ebuf, sizeof (struct pcap_bt));
+	if (p == NULL)
+		return (NULL);
+
+	p->activate_op = bt_activate;
+	return (p);
+}
+
+static int
+bt_activate(pcap_t* handle)
+{
+	struct pcap_bt *handlep = handle->priv;
+	struct sockaddr_hci addr;
+	int opt;
+	int		dev_id;
+	struct hci_filter	flt;
+	int err = PCAP_ERROR;
+
+	/* get bt interface id */
+	if (sscanf(handle->opt.source, BT_IFACE"%d", &dev_id) != 1)
+	{
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			"Can't get Bluetooth device index from %s", 
+			 handle->opt.source);
+		return PCAP_ERROR;
+	}
+
+	/* Initialize some components of the pcap structure. */
+	handle->bufsize = handle->snapshot+BT_CTRL_SIZE+sizeof(pcap_bluetooth_h4_header);
+	handle->offset = BT_CTRL_SIZE;
+	handle->linktype = DLT_BLUETOOTH_HCI_H4_WITH_PHDR;
+
+	handle->read_op = bt_read_linux;
+	handle->inject_op = bt_inject_linux;
+	handle->setfilter_op = install_bpf_program; /* no kernel filtering */
+	handle->setdirection_op = bt_setdirection_linux;
+	handle->set_datalink_op = NULL;	/* can't change data link type */
+	handle->getnonblock_op = pcap_getnonblock_fd;
+	handle->setnonblock_op = pcap_setnonblock_fd;
+	handle->stats_op = bt_stats_linux;
+	handlep->dev_id = dev_id;
+	
+	/* Create HCI socket */
+	handle->fd = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
+	if (handle->fd < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "Can't create raw socket: %s", strerror(errno));
+		return PCAP_ERROR;
+	}
+
+	handle->buffer = malloc(handle->bufsize);
+	if (!handle->buffer) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't allocate dump buffer: %s",
+			pcap_strerror(errno));
+		goto close_fail;
+	}
+
+	opt = 1;
+	if (setsockopt(handle->fd, SOL_HCI, HCI_DATA_DIR, &opt, sizeof(opt)) < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "Can't enable data direction info: %s", strerror(errno));
+		goto close_fail;
+	}
+
+	opt = 1;
+	if (setsockopt(handle->fd, SOL_HCI, HCI_TIME_STAMP, &opt, sizeof(opt)) < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "Can't enable time stamp: %s", strerror(errno));
+		goto close_fail;
+	}
+
+	/* Setup filter, do not call hci function to avoid dependence on 
+	 * external libs	*/
+	memset(&flt, 0, sizeof(flt));
+	memset((void *) &flt.type_mask, 0xff, sizeof(flt.type_mask));	
+	memset((void *) &flt.event_mask, 0xff, sizeof(flt.event_mask));
+	if (setsockopt(handle->fd, SOL_HCI, HCI_FILTER, &flt, sizeof(flt)) < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "Can't set filter: %s", strerror(errno));
+		goto close_fail;
+	}
+
+
+	/* Bind socket to the HCI device */
+	addr.hci_family = AF_BLUETOOTH;
+	addr.hci_dev = handlep->dev_id;
+#ifdef SOCKADDR_HCI_HAS_HCI_CHANNEL
+	addr.hci_channel = HCI_CHANNEL_RAW;
+#endif
+	if (bind(handle->fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "Can't attach to device %d: %s", handlep->dev_id,
+		    strerror(errno));
+		goto close_fail;
+	}
+
+	if (handle->opt.rfmon) {
+		/*
+		 * Monitor mode doesn't apply to Bluetooth devices.
+		 */
+		err = PCAP_ERROR_RFMON_NOTSUP;
+		goto close_fail;
+	}
+
+	if (handle->opt.buffer_size != 0) {
+		/*
+		 * Set the socket buffer size to the specified value.
+		 */
+		if (setsockopt(handle->fd, SOL_SOCKET, SO_RCVBUF,
+		    &handle->opt.buffer_size,
+		    sizeof(handle->opt.buffer_size)) == -1) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+				 "SO_RCVBUF: %s", pcap_strerror(errno));
+			goto close_fail;
+		}
+	}
+
+	handle->selectable_fd = handle->fd;
+	return 0;
+
+close_fail:
+	pcap_cleanup_live_common(handle);
+	return err;
+}
+
+static int
+bt_read_linux(pcap_t *handle, int max_packets, pcap_handler callback, u_char *user)
+{
+	struct cmsghdr *cmsg;
+	struct msghdr msg;
+	struct iovec  iv;
+	ssize_t ret;
+	struct pcap_pkthdr pkth;
+	pcap_bluetooth_h4_header* bthdr;
+
+	bthdr = (pcap_bluetooth_h4_header*) &handle->buffer[handle->offset];
+	iv.iov_base = &handle->buffer[handle->offset+sizeof(pcap_bluetooth_h4_header)];
+	iv.iov_len  = handle->snapshot;
+	
+	memset(&msg, 0, sizeof(msg));
+	msg.msg_iov = &iv;
+	msg.msg_iovlen = 1;
+	msg.msg_control = handle->buffer;
+	msg.msg_controllen = handle->offset;
+
+	/* ignore interrupt system call error */
+	do {
+		ret = recvmsg(handle->fd, &msg, 0);
+		if (handle->break_loop)
+		{
+			handle->break_loop = 0;
+			return -2;
+		}
+	} while ((ret == -1) && (errno == EINTR));
+
+	if (ret < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "Can't receive packet: %s", strerror(errno));
+		return -1;
+	}
+
+	pkth.caplen = ret;
+
+	/* get direction and timestamp*/ 
+	cmsg = CMSG_FIRSTHDR(&msg);
+	int in=0;
+	while (cmsg) {
+		switch (cmsg->cmsg_type) {
+			case HCI_CMSG_DIR:
+				memcpy(&in, CMSG_DATA(cmsg), sizeof in);
+				break;
+                      	case HCI_CMSG_TSTAMP:
+                      		memcpy(&pkth.ts, CMSG_DATA(cmsg),
+                      		    sizeof pkth.ts);
+				break;
+		}
+		cmsg = CMSG_NXTHDR(&msg, cmsg);
+	}
+	if ((in && (handle->direction == PCAP_D_OUT)) || 
+				((!in) && (handle->direction == PCAP_D_IN)))
+		return 0;
+
+	bthdr->direction = htonl(in != 0);
+	pkth.caplen+=sizeof(pcap_bluetooth_h4_header);
+	pkth.len = pkth.caplen;
+	if (handle->fcode.bf_insns == NULL ||
+	    bpf_filter(handle->fcode.bf_insns, &handle->buffer[handle->offset],
+	      pkth.len, pkth.caplen)) {
+		callback(user, &pkth, &handle->buffer[handle->offset]);
+		return 1;
+	}
+	return 0;	/* didn't pass filter */
+}
+
+static int
+bt_inject_linux(pcap_t *handle, const void *buf, size_t size)
+{
+	snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "inject not supported on "
+    		"bluetooth devices");
+	return (-1);
+}                           
+
+
+static int 
+bt_stats_linux(pcap_t *handle, struct pcap_stat *stats)
+{
+	struct pcap_bt *handlep = handle->priv;
+	int ret;
+	struct hci_dev_info dev_info;
+	struct hci_dev_stats * s = &dev_info.stat;
+	dev_info.dev_id = handlep->dev_id;
+	
+	/* ignore eintr */
+	do {
+		ret = ioctl(handle->fd, HCIGETDEVINFO, (void *)&dev_info);
+	} while ((ret == -1) && (errno == EINTR));
+	    
+	if (ret < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "Can't get stats via ioctl: %s", strerror(errno));
+		return (-1);
+		
+	}
+
+	/* we receive both rx and tx frames, so comulate all stats */	
+	stats->ps_recv = s->evt_rx + s->acl_rx + s->sco_rx + s->cmd_tx + 
+		s->acl_tx +s->sco_tx;
+	stats->ps_drop = s->err_rx + s->err_tx;
+	stats->ps_ifdrop = 0;
+	return 0;
+}
+
+static int 
+bt_setdirection_linux(pcap_t *p, pcap_direction_t d)
+{
+	p->direction = d;
+	return 0;
+}
diff --git a/pcap-bt-linux.h b/pcap-bt-linux.h
new file mode 100644
index 0000000..fbe8f48
--- /dev/null
+++ b/pcap-bt-linux.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2006 Paolo Abeni (Italy)
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+ * OWNER 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.
+ *
+ * Bluetooth sniffing API implementation for Linux platform
+ * By Paolo Abeni <paolo.abeni@email.it>
+ *
+ * @(#) $Header: /tcpdump/master/libpcap/pcap-bt-linux.h,v 1.5 2008-04-04 19:37:45 guy Exp $ (LBL)
+ */
+
+/*
+ * Prototypes for Bluetooth-related functions
+ */
+int bt_findalldevs(pcap_if_t **alldevsp, char *err_str);
+pcap_t *bt_create(const char *device, char *ebuf, int *is_ours);
diff --git a/pcap-can-linux.c b/pcap-can-linux.c
new file mode 100644
index 0000000..80fa41c
--- /dev/null
+++ b/pcap-can-linux.c
@@ -0,0 +1,319 @@
+/*
+ * Copyright (c) 2009 Felix Obenhuber
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+ * OWNER 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.
+ *
+ * SocketCan sniffing API implementation for Linux platform
+ * By Felix Obenhuber <felix@obenhuber.de>
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcap-int.h"
+#include "pcap-can-linux.h"
+
+#ifdef NEED_STRERROR_H
+#include "strerror.h"
+#endif
+
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <arpa/inet.h>
+
+#include <linux/can.h>
+#include <linux/can/raw.h>
+
+/* not yet defined anywhere */
+#ifndef PF_CAN
+#define PF_CAN 29
+#endif
+#ifndef AF_CAN
+#define AF_CAN PF_CAN
+#endif
+
+/* forward declaration */
+static int can_activate(pcap_t *);
+static int can_read_linux(pcap_t *, int , pcap_handler , u_char *);
+static int can_inject_linux(pcap_t *, const void *, size_t);
+static int can_setfilter_linux(pcap_t *, struct bpf_program *);
+static int can_setdirection_linux(pcap_t *, pcap_direction_t);
+static int can_stats_linux(pcap_t *, struct pcap_stat *);
+
+/*
+ * Private data for capturing on Linux CANbus devices.
+ */
+struct pcap_can {
+	int ifindex;		/* interface index of device we're bound to */
+};
+
+int
+can_findalldevs(pcap_if_t **devlistp, char *errbuf)
+{
+	/*
+	 * There are no platform-specific devices since each device
+	 * exists as a regular network interface.
+	 *
+	 * XXX - true?
+	 */
+	return 0;
+}
+
+pcap_t *
+can_create(const char *device, char *ebuf, int *is_ours)
+{
+	const char *cp;
+	char *cpend;
+	long devnum;
+	pcap_t* p;
+
+	/* Does this look like a CANbus device? */
+	cp = strrchr(device, '/');
+	if (cp == NULL)
+		cp = device;
+	/* Does it begin with "can" or "vcan"? */
+	if (strncmp(cp, "can", 3) == 0) {
+		/* Begins with "can" */
+		cp += 3;	/* skip past "can" */
+	} else if (strncmp(cp, "vcan", 4) == 0) {
+		/* Begins with "vcan" */
+		cp += 4;
+	} else {
+		/* Nope, doesn't begin with "can" or "vcan" */
+		*is_ours = 0;
+		return NULL;
+	}
+	/* Yes - is "can" or "vcan" followed by a number from 0? */
+	devnum = strtol(cp, &cpend, 10);
+	if (cpend == cp || *cpend != '\0') {
+		/* Not followed by a number. */
+		*is_ours = 0;
+		return NULL;
+	}
+	if (devnum < 0) {
+		/* Followed by a non-valid number. */
+		*is_ours = 0;
+		return NULL;
+	}
+
+	/* OK, it's probably ours. */
+	*is_ours = 1;
+
+	p = pcap_create_common(device, ebuf, sizeof (struct pcap_can));
+	if (p == NULL)
+		return (NULL);
+
+	p->activate_op = can_activate;
+	return (p);
+}
+
+
+static int
+can_activate(pcap_t* handle)
+{
+	struct pcap_can *handlep = handle->priv;
+	struct sockaddr_can addr;
+	struct ifreq ifr;
+
+	/* Initialize some components of the pcap structure. */
+	handle->bufsize = 24;
+	handle->offset = 8;
+	handle->linktype = DLT_CAN_SOCKETCAN;
+	handle->read_op = can_read_linux;
+	handle->inject_op = can_inject_linux;
+	handle->setfilter_op = can_setfilter_linux;
+	handle->setdirection_op = can_setdirection_linux;
+	handle->set_datalink_op = NULL;
+	handle->getnonblock_op = pcap_getnonblock_fd;
+	handle->setnonblock_op = pcap_setnonblock_fd;
+	handle->stats_op = can_stats_linux;
+
+	/* Create socket */
+	handle->fd = socket(PF_CAN, SOCK_RAW, CAN_RAW);
+	if (handle->fd < 0)
+	{
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't create raw socket %d:%s",
+			errno, strerror(errno));
+		return PCAP_ERROR;
+	}
+
+	/* get interface index */
+	memset(&ifr, 0, sizeof(ifr));
+	strncpy(ifr.ifr_name, handle->opt.source, sizeof(ifr.ifr_name));
+	if (ioctl(handle->fd, SIOCGIFINDEX, &ifr) < 0)
+	{
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+				"Unable to get interface index: %s",
+			pcap_strerror(errno));
+		pcap_cleanup_live_common(handle);
+		return PCAP_ERROR;
+	}
+	handlep->ifindex = ifr.ifr_ifindex;
+
+	/* allocate butter */
+	handle->buffer = malloc(handle->bufsize);
+	if (!handle->buffer)
+	{
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't allocate dump buffer: %s",
+			pcap_strerror(errno));
+		pcap_cleanup_live_common(handle);
+		return PCAP_ERROR;
+	}
+
+	/* Bind to the socket */
+	addr.can_family = AF_CAN;
+	addr.can_ifindex = handlep->ifindex;
+	if( bind( handle->fd, (struct sockaddr*)&addr, sizeof(addr) ) < 0  )
+	{
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't attach to device %d %d:%s",
+			handlep->ifindex, errno, strerror(errno));
+		pcap_cleanup_live_common(handle);
+		return PCAP_ERROR;
+	}
+
+	if (handle->opt.rfmon)
+	{
+		/* Monitor mode doesn't apply to CAN devices. */
+		pcap_cleanup_live_common(handle);
+		return PCAP_ERROR_RFMON_NOTSUP;
+	}
+
+	handle->selectable_fd = handle->fd;
+	return 0;
+
+}
+
+
+static int
+can_read_linux(pcap_t *handle, int max_packets, pcap_handler callback, u_char *user)
+{
+	struct msghdr msg;
+	struct pcap_pkthdr pkth;
+	struct iovec iv;
+	struct can_frame* cf;
+
+	iv.iov_base = &handle->buffer[handle->offset];
+	iv.iov_len = handle->snapshot;
+
+	memset(&msg, 0, sizeof(msg));
+	msg.msg_iov = &iv;
+	msg.msg_iovlen = 1;
+	msg.msg_control = handle->buffer;
+	msg.msg_controllen = handle->offset;
+
+	do
+	{
+		pkth.caplen = recvmsg(handle->fd, &msg, 0);
+		if (handle->break_loop)
+		{
+			handle->break_loop = 0;
+			return -2;
+		}
+	} while ((pkth.caplen == -1) && (errno == EINTR));
+
+	if (pkth.caplen < 0)
+	{
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't receive packet %d:%s",
+			errno, strerror(errno));
+		return -1;
+	}
+
+	/* adjust capture len according to frame len */
+	cf = (struct can_frame*)&handle->buffer[8];
+	pkth.caplen -= 8 - cf->can_dlc;
+	pkth.len = pkth.caplen;
+
+	cf->can_id = htonl( cf->can_id );
+
+	if( -1 == gettimeofday(&pkth.ts, NULL) )
+	{
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't get time of day %d:%s",
+			errno, strerror(errno));
+		return -1;
+	}
+
+	callback(user, &pkth, &handle->buffer[8]);
+
+	return 1;
+}
+
+
+static int
+can_inject_linux(pcap_t *handle, const void *buf, size_t size)
+{
+	/* not yet implemented */
+	snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "inject not supported on "
+		"can devices");
+	return (-1);
+}
+
+
+static int
+can_stats_linux(pcap_t *handle, struct pcap_stat *stats)
+{
+	/* not yet implemented */
+	stats->ps_recv = 0;			 /* number of packets received */
+	stats->ps_drop = 0;			 /* number of packets dropped */
+	stats->ps_ifdrop = 0;		 /* drops by interface -- only supported on some platforms */
+	return 0;
+}
+
+
+static int
+can_setfilter_linux(pcap_t *p, struct bpf_program *fp)
+{
+	/* not yet implemented */
+	return 0;
+}
+
+
+static int
+can_setdirection_linux(pcap_t *p, pcap_direction_t d)
+{
+	/* no support for PCAP_D_OUT */
+	if (d == PCAP_D_OUT)
+	{
+		snprintf(p->errbuf, sizeof(p->errbuf),
+			"Setting direction to PCAP_D_OUT is not supported on can");
+		return -1;
+	}
+
+	p->direction = d;
+
+	return 0;
+}
+
+
+/* eof */
diff --git a/pcap-can-linux.h b/pcap-can-linux.h
new file mode 100644
index 0000000..fe806ff
--- /dev/null
+++ b/pcap-can-linux.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2009 Felix Obenhuber
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+ * OWNER 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.
+ *
+ */
+
+/*
+ * Prototypes for SocketCAN related functions
+ */
+pcap_t* can_create(const char *device, char *ebuf, int *is_ours);
+int can_findalldevs(pcap_if_t **devlistp, char *errbuf);
diff --git a/pcap-canusb-linux.c b/pcap-canusb-linux.c
new file mode 100644
index 0000000..a72f469
--- /dev/null
+++ b/pcap-canusb-linux.c
@@ -0,0 +1,472 @@
+/*
+ * Copyright (c) 2009 Felix Obenhuber
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+ * OWNER 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.
+ *
+ * Sockettrace sniffing API implementation for Linux platform
+ * By Felix Obenhuber <felix@obenhuber.de>
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <libusb-1.0/libusb.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <pthread.h>
+
+#include "pcap-int.h"
+#include "pcap-canusb-linux.h"
+
+#define CANUSB_IFACE "canusb"
+
+#define CANUSB_VID 0x0403
+#define CANUSB_PID 0x8990
+
+#define USE_THREAD 1
+
+#if USE_THREAD == 0
+#include <signal.h>
+#endif
+
+
+/* forward declaration */
+static int canusb_activate(pcap_t *);
+static int canusb_read_linux(pcap_t *, int , pcap_handler , u_char *);
+static int canusb_inject_linux(pcap_t *, const void *, size_t);
+static int canusb_setfilter_linux(pcap_t *, struct bpf_program *);
+static int canusb_setdirection_linux(pcap_t *, pcap_direction_t);
+static int canusb_stats_linux(pcap_t *, struct pcap_stat *);
+
+struct CAN_Msg
+{
+    uint32_t timestamp;
+    uint32_t id;
+    uint32_t length;
+    uint8_t data[8];
+};
+
+/*
+ * Private data for capturing on Linux CANbus USB devices.
+ */
+struct pcap_canusb {
+    libusb_context *ctx;
+    libusb_device_handle *dev;
+    pthread_t worker;
+    int rdpipe, wrpipe;
+    volatile int loop;
+};
+
+int canusb_findalldevs(pcap_if_t **alldevsp, char *err_str)
+{
+    libusb_context *fdctx;
+    libusb_device** devs;
+    unsigned char sernum[65];
+    int cnt, i;
+    
+    if (libusb_init(&fdctx) != 0) {
+        /*
+         * XXX - if this doesn't just mean "no USB file system mounted",
+         * perhaps we should report a real error rather than just
+         * saying "no CANUSB devices".
+         */
+        return 0;
+    } 
+
+    cnt = libusb_get_device_list(fdctx,&devs);
+
+    for(i=0;i<cnt;i++)
+    {
+        int ret;
+        // Check if this device is interesting.
+        struct libusb_device_descriptor desc;
+        libusb_get_device_descriptor(devs[i],&desc);
+
+        if ((desc.idVendor != CANUSB_VID) || (desc.idProduct != CANUSB_PID)) 
+            continue; //It is not, check next device
+          
+        //It is!
+        libusb_device_handle *dh = NULL;
+
+        if ((ret = libusb_open(devs[i],&dh)) == 0)
+        {
+            char dev_name[30];
+            char dev_descr[50]; 
+            int n = libusb_get_string_descriptor_ascii(dh,desc.iSerialNumber,sernum,64);
+            sernum[n] = 0;
+
+            snprintf(dev_name, 30, CANUSB_IFACE"%s", sernum);
+            snprintf(dev_descr, 50, "CanUSB [%s]", sernum);
+            
+            libusb_close(dh);
+            
+            if (pcap_add_if(alldevsp, dev_name, 0, dev_descr, err_str) < 0)
+            {
+                libusb_free_device_list(devs,1);
+                libusb_exit(fdctx);
+                return -1;
+            }
+        }
+    }
+
+    libusb_free_device_list(devs,1);
+    libusb_exit(fdctx);
+    return 0;
+}
+
+static libusb_device_handle* canusb_opendevice(struct libusb_context *ctx, char* devserial)
+{
+    libusb_device** devs;
+    unsigned char serial[65];
+    int cnt,i,n;
+    
+    cnt = libusb_get_device_list(ctx,&devs);
+
+    for(i=0;i<cnt;i++)
+    {    
+        // Check if this device is interesting.
+        struct libusb_device_descriptor desc;
+        libusb_get_device_descriptor(devs[i],&desc);
+
+        if ((desc.idVendor != CANUSB_VID) || (desc.idProduct != CANUSB_PID))
+          continue;
+          
+        //Found one!
+        libusb_device_handle *dh = NULL;
+
+        if (libusb_open(devs[i],&dh) != 0) continue;
+
+        n = libusb_get_string_descriptor_ascii(dh,desc.iSerialNumber,serial,64);
+        serial[n] = 0;
+
+        if ((devserial) && (strcmp((char *)serial,devserial) != 0))
+        {
+            libusb_close(dh);
+            continue;
+        }
+
+        if ((libusb_kernel_driver_active(dh,0)) && (libusb_detach_kernel_driver(dh,0) != 0))
+        {
+            libusb_close(dh);
+            continue;
+        }
+
+        if (libusb_set_configuration(dh,1) != 0)
+        {
+            libusb_close(dh);
+            continue;
+        }
+
+        if (libusb_claim_interface(dh,0) != 0)
+        {
+            libusb_close(dh);
+            continue;
+        }
+        
+        //Fount it!
+        libusb_free_device_list(devs,1);        
+        return dh;
+    }
+
+    libusb_free_device_list(devs,1);
+    return NULL;
+}
+
+
+pcap_t *
+canusb_create(const char *device, char *ebuf, int *is_ours)
+{ 
+    const char *cp;
+    char *cpend;
+    long devnum;
+    pcap_t* p;
+    struct pcap_canusb *canusb;
+
+    /* Does this look like a DAG device? */
+    cp = strrchr(device, '/');
+    if (cp == NULL)
+        cp = device;
+    /* Does it begin with "canusb"? */
+    if (strncmp(cp, "canusb", 6) != 0) {
+        /* Nope, doesn't begin with "canusb" */
+        *is_ours = 0;
+        return NULL;
+    }
+    /* Yes - is "canusb" followed by a number? */
+    cp += 6;
+    devnum = strtol(cp, &cpend, 10);
+    if (cpend == cp || *cpend != '\0') {
+        /* Not followed by a number. */
+        *is_ours = 0;
+        return NULL;
+    }
+    if (devnum < 0) {
+        /* Followed by a non-valid number. */
+        *is_ours = 0;
+        return NULL;
+    }
+
+    /* OK, it's probably ours. */
+    *is_ours = 1;
+
+    p = pcap_create_common(device, ebuf, sizeof (struct pcap_canusb));
+    if (p == NULL)
+        return (NULL);
+
+    canusb = p->priv;
+    canusb->ctx = NULL;
+    canusb->dev = NULL;
+    canusb->rdpipe = -1;
+    canusb->wrpipe = -1;
+
+    p->activate_op = canusb_activate;
+
+    return (p);
+}
+
+
+static void* canusb_capture_thread(void *arg)
+{
+    struct pcap_canusb *canusb = arg;
+    int i;
+    struct 
+    {
+      uint8_t rxsz, txsz;
+    } status;
+  
+    fcntl(canusb->wrpipe, F_SETFL, O_NONBLOCK);  
+
+    while(canusb->loop)
+    {
+        int sz;
+        struct CAN_Msg msg;
+    
+        libusb_interrupt_transfer(canusb->dev, 0x81, (unsigned char*)&status, sizeof(status), &sz, 100);
+        //HACK!!!!! -> drop buffered data, read new one by reading twice.        
+        libusb_interrupt_transfer(canusb->dev, 0x81, (unsigned char*)&status, sizeof(status), &sz, 100);                                   
+
+        for(i = 0; i<status.rxsz; i++)
+        {
+            libusb_bulk_transfer(canusb->dev, 0x85, (unsigned char*)&msg, sizeof(msg), &sz, 100);      
+            write(canusb->wrpipe, &msg, sizeof(msg));
+        }
+
+    }
+  
+    return NULL;
+}
+
+static int canusb_startcapture(struct pcap_canusb* this)
+{
+    int pipefd[2];
+
+    if (pipe(pipefd) == -1)
+        return -1;
+
+    this->rdpipe = pipefd[0];
+    this->wrpipe = pipefd[1];
+
+    this->loop = 1;  
+    pthread_create(&this->worker, NULL, canusb_capture_thread, this);
+
+    return this->rdpipe;
+}
+
+static void canusb_clearbufs(struct pcap_canusb* this)
+{
+    unsigned char cmd[16];
+    int al;
+
+    cmd[0] = 1;  //Empty incoming buffer
+    cmd[1] = 1;  //Empty outgoing buffer
+    cmd[3] = 0;  //Not a write to serial number
+    memset(&cmd[4],0,16-4);
+        
+    libusb_interrupt_transfer(this->dev, 0x1,cmd,16,&al,100);
+}
+
+
+static void canusb_close(pcap_t* handle)
+{
+    struct pcap_canusb *canusb = handle->priv;
+
+    canusb->loop = 0;
+    pthread_join(canusb->worker, NULL);
+
+    if (canusb->dev)
+    {
+        libusb_close(canusb->dev);
+        canusb->dev = NULL;
+    }    
+    if (canusb->ctx)
+    {
+        libusb_exit(canusb->ctx);
+        canusb->ctx = NULL;
+    }
+}
+
+
+
+static int canusb_activate(pcap_t* handle)
+{
+    struct pcap_canusb *canusb = handle->priv;
+    char *serial;
+
+    if (libusb_init(&canusb->ctx) != 0) {
+        /*
+         * XXX - what causes this to fail?
+         */
+        snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "libusb_init() failed");  
+        return PCAP_ERROR;
+    } 
+
+    handle->read_op = canusb_read_linux;
+
+    handle->inject_op = canusb_inject_linux;
+    handle->setfilter_op = canusb_setfilter_linux;
+    handle->setdirection_op = canusb_setdirection_linux;
+    handle->getnonblock_op = pcap_getnonblock_fd;
+    handle->setnonblock_op = pcap_setnonblock_fd;
+    handle->stats_op = canusb_stats_linux;
+    handle->cleanup_op = canusb_close;
+
+    /* Initialize some components of the pcap structure. */
+    handle->bufsize = 32;
+    handle->offset = 8;
+    handle->linktype = DLT_CAN_SOCKETCAN;
+    handle->set_datalink_op = NULL;
+
+    serial = handle->opt.source + strlen(CANUSB_IFACE);
+
+    canusb->dev = canusb_opendevice(canusb->ctx, serial);
+    if (!canusb->dev)
+    {
+        libusb_exit(canusb->ctx);
+        snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't open USB Device");  
+        return PCAP_ERROR;
+    }
+
+    canusb_clearbufs(canusb);
+
+    handle->fd = canusb_startcapture(canusb);
+    handle->selectable_fd = handle->fd;
+
+    return 0;
+}
+
+
+
+
+static int
+canusb_read_linux(pcap_t *handle, int max_packets, pcap_handler callback, u_char *user)
+{
+    static struct timeval firstpacket = { -1, -1};
+    int i = 0;
+    struct CAN_Msg msg;
+    struct pcap_pkthdr pkth;
+  
+    while(i < max_packets)
+    {
+        int n;
+        usleep(10 * 1000);
+        n = read(handle->fd, &msg, sizeof(msg));
+        if (n <= 0)
+            break;
+        pkth.caplen = pkth.len = n;
+        pkth.caplen -= 4;
+        pkth.caplen -= 8 - msg.length;
+    
+        if ((firstpacket.tv_sec == -1) && (firstpacket.tv_usec == -1))
+            gettimeofday(&firstpacket, NULL);
+      
+        pkth.ts.tv_usec = firstpacket.tv_usec + (msg.timestamp % 100) * 10000;
+        pkth.ts.tv_sec = firstpacket.tv_usec + (msg.timestamp / 100);
+        if (pkth.ts.tv_usec > 1000000)
+        {
+            pkth.ts.tv_usec -= 1000000;
+            pkth.ts.tv_sec++;
+        }
+
+        callback(user, &pkth, (void*)&msg.id);
+        i++;
+    }
+  
+    return i;
+}
+
+
+static int
+canusb_inject_linux(pcap_t *handle, const void *buf, size_t size)
+{
+    /* not yet implemented */
+    snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "inject not supported on canusb devices");
+    return (-1);
+}
+
+
+static int
+canusb_stats_linux(pcap_t *handle, struct pcap_stat *stats)
+{
+    /* not yet implemented */
+    stats->ps_recv = 0;     /* number of packets received */
+    stats->ps_drop = 0;     /* number of packets dropped */
+    stats->ps_ifdrop = 0;   /* drops by interface -- only supported on some platforms */
+    return 0;
+}
+
+
+static int
+canusb_setfilter_linux(pcap_t *p, struct bpf_program *fp)
+{
+    /* not yet implemented */
+    return 0;
+}
+
+
+static int
+canusb_setdirection_linux(pcap_t *p, pcap_direction_t d)
+{
+    /* no support for PCAP_D_OUT */
+    if (d == PCAP_D_OUT)
+    {
+        snprintf(p->errbuf, sizeof(p->errbuf),
+            "Setting direction to PCAP_D_OUT is not supported on this interface");
+        return -1;
+    }
+
+    p->direction = d;
+
+    return 0;
+}
+
+
+/* eof */
diff --git a/pcap-canusb-linux.h b/pcap-canusb-linux.h
new file mode 100644
index 0000000..c8f3be1
--- /dev/null
+++ b/pcap-canusb-linux.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2009 Felix Obenhuber
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+ * OWNER 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.
+ *
+ */
+
+/*
+ * Prototypes for SocketCAN related functions
+ */
+pcap_t* canusb_create(const char *device, char *ebuf, int *is_ours);
+int canusb_findalldevs(pcap_if_t **pdevlist, char* errbuf);
+
diff --git a/pcap-common.c b/pcap-common.c
new file mode 100644
index 0000000..e8fc631
--- /dev/null
+++ b/pcap-common.c
@@ -0,0 +1,1298 @@
+/*
+ * 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/nflog.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_IEEE802_5	DLT_IEEE802	/* DLT_IEEE802 is used for 802.5 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_IEEE802_11_PRISM 119		/* 802.11 plus Prism II monitor mode radio metadata header */
+#define LINKTYPE_IEEE802_11_AIRONET 120		/* 802.11 plus FreeBSD Aironet driver radio metadata header */
+
+/*
+ * 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_RADIOTAP 127	/* 802.11 plus radiotap radio metadata 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
+ */
+#define LINKTYPE_IEEE802_11_AVS	163	/* 802.11 plus AVS radio metadata 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
+
+/*
+ * BACnet MS/TP frames.
+ */
+#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
+
+/*
+ * MPEG-2 transport stream (ISO 13818-1/ITU-T H.222.0).
+ *
+ * Requested by Guy Martin <gmsoft@tuxicoman.be>.
+ */
+#define LINKTYPE_MPEG_2_TS	243
+
+/*
+ * ng4T GmbH's UMTS Iub/Iur-over-ATM and Iub/Iur-over-IP format as
+ * used by their ng40 protocol tester.
+ *
+ * Requested by Jens Grimmer <jens.grimmer@ng4t.com>.
+ */
+#define LINKTYPE_NG40		244
+
+/*
+ * Pseudo-header giving adapter number and flags, followed by an NFC
+ * (Near-Field Communications) Logical Link Control Protocol (LLCP) PDU,
+ * as specified by NFC Forum Logical Link Control Protocol Technical
+ * Specification LLCP 1.1.
+ *
+ * Requested by Mike Wakerly <mikey@google.com>.
+ */
+#define LINKTYPE_NFC_LLCP	245
+
+/*
+ * pfsync output; DLT_PFSYNC is 18, which collides with DLT_CIP in
+ * SuSE 6.3, on OpenBSD, NetBSD, DragonFly BSD, and Mac OS X, and
+ * is 121, which collides with DLT_HHDLC, in FreeBSD.  We pick a
+ * shiny new link-layer header type value that doesn't collide with
+ * anything, in the hopes that future pfsync savefiles, if any,
+ * won't require special hacks to distinguish from other savefiles.
+ *
+ */
+#define LINKTYPE_PFSYNC		246
+
+/*
+ * Raw InfiniBand packets, starting with the Local Routing Header.
+ *
+ * Requested by Oren Kladnitsky <orenk@mellanox.com>.
+ */
+#define LINKTYPE_INFINIBAND	247
+
+/*
+ * SCTP, with no lower-level protocols (i.e., no IPv4 or IPv6).
+ *
+ * Requested by Michael Tuexen <Michael.Tuexen@lurchi.franken.de>.
+ */
+#define LINKTYPE_SCTP		248
+
+/*
+ * USB packets, beginning with a USBPcap header.
+ *
+ * Requested by Tomasz Mon <desowin@gmail.com>
+ */
+#define LINKTYPE_USBPCAP	249
+
+/*
+ * Schweitzer Engineering Laboratories "RTAC" product serial-line
+ * packets.
+ *
+ * Requested by Chris Bontje <chris_bontje@selinc.com>.
+ */
+#define DLT_RTAC_SERIAL		250
+
+/*
+ * Bluetooth Low Energy air interface link-layer packets.
+ *
+ * Requested by Mike Kershaw <dragorn@kismetwireless.net>.
+ */
+#define LINKTYPE_BLUETOOTH_LE_LL	251
+
+/*
+ * Link-layer header type for upper-protocol layer PDU saves from wireshark.
+ * 
+ * the actual contents are determined by two TAGs stored with each
+ * packet:
+ *   EXP_PDU_TAG_LINKTYPE          the link type (LINKTYPE_ value) of the
+ *				   original packet.
+ *
+ *   EXP_PDU_TAG_PROTO_NAME        the name of the wireshark dissector
+ * 				   that can make sense of the data stored.
+ */
+#define LINKTYPE_WIRESHARK_UPPER_PDU	252
+
+#define LINKTYPE_MATCHING_MAX	252		/* 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_IEEE802_5 },
+	{ DLT_ARCNET,		LINKTYPE_ARCNET_BSD },
+	{ DLT_SLIP,		LINKTYPE_SLIP },
+	{ DLT_PPP,		LINKTYPE_PPP },
+	{ DLT_FDDI,	 	LINKTYPE_FDDI },
+	{ DLT_SYMANTEC_FIREWALL, LINKTYPE_SYMANTEC_FIREWALL },
+
+	/*
+	 * 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_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 DLT_PFSYNC, whatever it might be, to LINKTYPE_PFSYNC.
+	 */
+	if (dlt == DLT_PFSYNC)
+		return (LINKTYPE_PFSYNC);
+
+	/*
+	 * 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 LINKTYPE_PFSYNC to DLT_PFSYNC, whatever it might be.
+	 * LINKTYPE_PFSYNC is in the matching range, to make sure
+	 * it's as safe from reuse as we can arrange, so we do
+	 * this test first.
+	 */
+	if (linktype == LINKTYPE_PFSYNC)
+		return (DLT_PFSYNC);
+
+	/*
+	 * 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 byte order of the host that wrote
+ * the file to this host's byte order.
+ */
+static 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++;
+		}
+	}
+}
+
+/*
+ * The DLT_NFLOG "packets" have a mixture of big-endian and host-byte-order
+ * data.  They begin with a fixed-length header with big-endian fields,
+ * followed by a set of TLVs, where the type and length are in host
+ * byte order but the values are either big-endian or are a raw byte
+ * sequence that's the same regardless of the host's byte order.
+ *
+ * When reading a DLT_NFLOG capture file, we need to convert the type
+ * and length values from the byte order of the host that wrote the
+ * file to the byte order of this host.
+ */
+static void
+swap_nflog_header(const struct pcap_pkthdr *hdr, u_char *buf)
+{
+	u_char *p = buf;
+	nflog_hdr_t *nfhdr = (nflog_hdr_t *)buf;
+	nflog_tlv_t *tlv;
+	u_int caplen = hdr->caplen;
+	u_int length = hdr->len;
+	u_int16_t size;
+
+	if (caplen < (int) sizeof(nflog_hdr_t) || length < (int) sizeof(nflog_hdr_t)) {
+		/* Not enough data to have any TLVs. */
+		return;
+	}
+
+	if (!(nfhdr->nflog_version) == 0) {
+		/* Unknown NFLOG version */
+		return;
+	}
+
+	length -= sizeof(nflog_hdr_t);
+	caplen -= sizeof(nflog_hdr_t);
+	p += sizeof(nflog_hdr_t);
+
+	while (caplen >= sizeof(nflog_tlv_t)) {
+		tlv = (nflog_tlv_t *) p;
+
+		/* Swap the type and length. */
+		tlv->tlv_type = SWAPSHORT(tlv->tlv_type);
+		tlv->tlv_length = SWAPSHORT(tlv->tlv_length);
+
+		/* Get the length of the TLV. */
+		size = tlv->tlv_length;
+		if (size % 4 != 0)
+			size += 4 - size % 4;
+
+		/* Is the TLV's length less than the minimum? */
+		if (size < sizeof(nflog_tlv_t)) {
+			/* Yes. Give up now. */
+			return;
+		}
+
+		/* Do we have enough data for the full TLV? */
+		if (caplen < size || length < size) {
+			/* No. */
+			return;
+		}
+
+		/* Skip over the TLV. */
+		length -= size;
+		caplen -= size;
+		p += size;
+	}
+}
+
+void
+swap_pseudo_headers(int linktype, struct pcap_pkthdr *hdr, u_char *data)
+{
+	/*
+	 * Convert pseudo-headers from the byte order of
+	 * the host on which the file was saved to our
+	 * byte order, as necessary.
+	 */
+	switch (linktype) {
+
+	case DLT_USB_LINUX:
+		swap_linux_usb_header(hdr, data, 0);
+		break;
+
+	case DLT_USB_LINUX_MMAPPED:
+		swap_linux_usb_header(hdr, data, 1);
+		break;
+
+	case DLT_NFLOG:
+		swap_nflog_header(hdr, data);
+		break;
+	}
+}
diff --git a/pcap-common.h b/pcap-common.h
new file mode 100644
index 0000000..6ac5bcd
--- /dev/null
+++ b/pcap-common.h
@@ -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_pseudo_headers(int linktype, struct pcap_pkthdr *hdr,
+    u_char *data);
diff --git a/pcap-config.1 b/pcap-config.1
new file mode 100644
index 0000000..021f450
--- /dev/null
+++ b/pcap-config.1
@@ -0,0 +1,74 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap-config.1,v 1.1 2008-09-23 18:04: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.
+.\" 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-CONFIG 1 "26 March 2009"
+.SH NAME
+pcap-config \- write libpcap compiler and linker flags to standard output
+.SH SYNOPSIS
+.na
+.B pcap-config
+[
+.B \-\-static
+]
+[
+.B \-\-cflags | \-\-libs | \-\-additional-libs
+]
+.ad
+.SH DESCRIPTION
+.LP
+When run with the
+.B \-\-cflags
+option,
+.I pcap-config
+writes to the standard output the
+.B \-I
+compiler flags required to include libpcap's header files.
+When run with the
+.B \-\-libs
+option,
+.I pcap-config
+writes to the standard output the
+.B \-L
+and
+.B \-l
+linker flags required to link with libpcap, including
+.B \-l
+flags for libraries required by libpcap.
+When run with the
+.B \-\-additional-libs
+option,
+.I pcap-config
+writes to the standard output the
+.B \-L
+and
+.B \-l
+flags for libraries required by libpcap, but not the
+.B \-lpcap
+flag to link with libpcap itself.
+.LP
+By default, it writes flags appropriate for compiling with a
+dynamically-linked version of libpcap; the
+.B \-\-static
+flag causes it to write flags appropriate for compiling with a
+statically-linked version of libpcap.
+.SH "SEE ALSO"
+pcap(3PCAP)
diff --git a/pcap-config.in b/pcap-config.in
new file mode 100644
index 0000000..206be3b
--- /dev/null
+++ b/pcap-config.in
@@ -0,0 +1,89 @@
+#! /bin/sh
+
+#
+# Script to give the appropriate compiler flags and linker flags
+# to use when building code that uses libpcap.
+#
+prefix="@prefix@"
+exec_prefix="@exec_prefix@"
+includedir="@includedir@"
+libdir="@libdir@"
+V_RPATH_OPT="@V_RPATH_OPT@"
+LIBS="@LIBS@"
+
+static=0
+show_cflags=0
+show_libs=0
+while [ "$#" != 0 ]
+do
+	case "$1" in
+
+	--static)
+		static=1
+		;;
+
+	--cflags)
+		show_cflags=1
+		;;
+
+	--libs)
+		show_libs=1
+		;;
+
+	--additional-libs)
+		show_additional_libs=1
+		;;
+	esac
+	shift
+done
+if [ "$V_RPATH_OPT" != "" ]
+then
+	#
+	# If libdir isn't /usr/lib, add it to the run-time linker path.
+	#
+	if [ "$libdir" != "/usr/lib" ]
+	then
+		RPATH=$V_RPATH_OPT$libdir
+	fi
+fi
+if [ "$static" = 1 ]
+then
+	#
+	# Include LIBS so that the flags include libraries containing
+	# routines that libpcap uses.
+	#
+	if [ "$show_cflags" = 1 -a "$show_libs" = 1 ]
+	then
+		echo "-I$includedir -L$libdir -lpcap $LIBS"
+	elif [ "$show_cflags" = 1 -a "$show_additional_libs" = 1 ]
+	then
+		echo "-I$includedir -L$libdir $LIBS"
+	elif [ "$show_cflags" = 1 ]
+	then
+		echo "-I$includedir"
+	elif [ "$show_libs" = 1 ]
+	then
+		echo "-L$libdir -lpcap $LIBS"
+	elif [ "$show_additional_libs" = 1 ]
+	then
+		echo "$LIBS"
+	fi
+else
+	#
+	# Omit LIBS - libpcap is assumed to be linked with those
+	# libraries, so there's no need to do so explicitly.
+	#
+	if [ "$show_cflags" = 1 -a "$show_libs" = 1 ]
+	then
+		echo "-I$includedir -L$libdir $RPATH -lpcap"
+	elif [ "$show_cflags" = 1 -a "$show_additional_libs" = 1 ]
+	then
+		echo "-I$includedir"
+	elif [ "$show_cflags" = 1 ]
+	then
+		echo "-I$includedir"
+	elif [ "$show_libs" = 1 ]
+	then
+		echo "-L$libdir $RPATH -lpcap"
+	fi
+fi
diff --git a/pcap-dag.c b/pcap-dag.c
index 3ef2508..70a6d6c 100644
--- a/pcap-dag.c
+++ b/pcap-dag.c
@@ -17,7 +17,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-	"@(#) $Header: /tcpdump/master/libpcap/pcap-dag.c,v 1.21.2.7 2007/06/22 06:43:58 guy Exp $ (LBL)";
+	"@(#) $Header: /tcpdump/master/libpcap/pcap-dag.c,v 1.39 2008-04-14 20:40:58 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -46,6 +46,17 @@
 #include "dagnew.h"
 #include "dagapi.h"
 
+#include "pcap-dag.h"
+
+/*
+ * DAG devices have names beginning with "dag", followed by a number
+ * from 0 to DAG_MAX_BOARDS, then optionally a colon and a stream number
+ * from 0 to DAG_STREAM_MAX.
+ */
+#ifndef DAG_MAX_BOARDS
+#define DAG_MAX_BOARDS 32
+#endif
+
 #define ATM_CELL_SIZE		52
 #define ATM_HDR_SIZE		4
 
@@ -68,6 +79,27 @@
 	unsigned short	vci;		/* VCI */
 };
 
+/*
+ * Private data for capturing on DAG devices.
+ */
+struct pcap_dag {
+	struct pcap_stat stat;
+#ifdef HAVE_DAG_STREAMS_API
+	u_char	*dag_mem_bottom;	/* DAG card current memory bottom pointer */
+	u_char	*dag_mem_top;	/* DAG card current memory top pointer */
+#else /* HAVE_DAG_STREAMS_API */
+	void	*dag_mem_base;	/* DAG card memory base address */
+	u_int	dag_mem_bottom;	/* DAG card current memory bottom offset */
+	u_int	dag_mem_top;	/* DAG card current memory top offset */
+#endif /* HAVE_DAG_STREAMS_API */
+	int	dag_fcs_bits;	/* Number of checksum bits from link layer */
+	int	dag_offset_flags; /* Flags to pass to dag_offset(). */
+	int	dag_stream;	/* DAG stream number */
+	int	dag_timeout;	/* timeout specified to pcap_open_live.
+				 * Same as in linux above, introduce
+				 * generally? */
+};
+
 typedef struct pcap_dag_node {
 	struct pcap_dag_node *next;
 	pcap_t *p;
@@ -80,16 +112,6 @@
 
 #define IS_BIGENDIAN() (*((unsigned char *)&endian_test_word))
 
-
-#ifdef DAG_ONLY
-/* This code is required when compiling for a DAG device only. */
-#include "pcap-dag.h"
-
-/* Replace dag function names with pcap equivalent. */
-#define dag_open_live pcap_open_live
-#define dag_platform_finddevs pcap_platform_finddevs
-#endif /* DAG_ONLY */
-
 #define MAX_DAG_PACKET 65536
 
 static unsigned char TempPkt[MAX_DAG_PACKET];
@@ -124,24 +146,30 @@
  */
 
 static void
-dag_platform_close(pcap_t *p)
+dag_platform_cleanup(pcap_t *p)
 {
-	
+	struct pcap_dag *pd;
+
 	if (p != NULL) {
+		pd = p->priv;
 #ifdef HAVE_DAG_STREAMS_API
-		if(dag_stop_stream(p->fd, p->md.dag_stream) < 0)
+		if(dag_stop_stream(p->fd, pd->dag_stream) < 0)
 			fprintf(stderr,"dag_stop_stream: %s\n", strerror(errno));
 		
-		if(dag_detach_stream(p->fd, p->md.dag_stream) < 0)
+		if(dag_detach_stream(p->fd, pd->dag_stream) < 0)
 			fprintf(stderr,"dag_detach_stream: %s\n", strerror(errno));
 #else
 		if(dag_stop(p->fd) < 0)
 			fprintf(stderr,"dag_stop: %s\n", strerror(errno));
 #endif /* HAVE_DAG_STREAMS_API */
-		if(dag_close(p->fd) < 0)
-			fprintf(stderr,"dag_close: %s\n", strerror(errno));
+		if(p->fd != -1) {
+			if(dag_close(p->fd) < 0)
+				fprintf(stderr,"dag_close: %s\n", strerror(errno));
+			p->fd = -1;
+		}
+		delete_pcap_dag(p);
+		pcap_cleanup_live_common(p);
 	}
-	delete_pcap_dag(p);
 	/* Note: don't need to call close(p->fd) here as dag_close(p->fd) does this. */
 }
 
@@ -150,7 +178,7 @@
 {
 	while (pcap_dags != NULL) {
 		if (pcap_dags->pid == getpid()) {
-			dag_platform_close(pcap_dags->p);
+			dag_platform_cleanup(pcap_dags->p);
 		} else {
 			delete_pcap_dag(pcap_dags->p);
 		}
@@ -180,6 +208,38 @@
 	return 0;
 }
 
+static unsigned int
+dag_erf_ext_header_count(uint8_t * erf, size_t len)
+{
+	uint32_t hdr_num = 0;
+	uint8_t  hdr_type;
+
+	/* basic sanity checks */
+	if ( erf == NULL )
+		return 0;
+	if ( len < 16 )
+		return 0;
+
+	/* check if we have any extension headers */
+	if ( (erf[8] & 0x80) == 0x00 )
+		return 0;
+
+	/* loop over the extension headers */
+	do {
+	
+		/* sanity check we have enough bytes */
+		if ( len < (24 + (hdr_num * 8)) )
+			return hdr_num;
+
+		/* get the header type */
+		hdr_type = erf[(16 + (hdr_num * 8))];
+		hdr_num++;
+
+	} while ( hdr_type & 0x80 );
+
+	return hdr_num;
+}
+
 /*
  *  Read at most max_packets from the capture stream and call the callback
  *  for each of them. Returns the number of packets handled, -1 if an
@@ -188,12 +248,14 @@
 static int
 dag_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
 {
+	struct pcap_dag *pd = p->priv;
 	unsigned int processed = 0;
-	int flags = p->md.dag_offset_flags;
+	int flags = pd->dag_offset_flags;
 	unsigned int nonblocking = flags & DAGF_NONBLOCK;
+	unsigned int num_ext_hdr = 0;
 
 	/* Get the next bufferful of packets (if necessary). */
-	while (p->md.dag_mem_top - p->md.dag_mem_bottom < dag_record_size) {
+	while (pd->dag_mem_top - pd->dag_mem_bottom < dag_record_size) {
  
 		/*
 		 * Has "pcap_breakloop()" been called?
@@ -220,21 +282,23 @@
 		 * If non-block is specified it will return immediately. The user
 		 * is then responsible for efficiency.
 		 */
-		p->md.dag_mem_top = dag_advance_stream(p->fd, p->md.dag_stream, &(p->md.dag_mem_bottom));
+		if ( NULL == (pd->dag_mem_top = dag_advance_stream(p->fd, pd->dag_stream, &(pd->dag_mem_bottom))) ) {
+		     return -1;
+		}
 #else
 		/* dag_offset does not support timeouts */
-		p->md.dag_mem_top = dag_offset(p->fd, &(p->md.dag_mem_bottom), flags);
+		pd->dag_mem_top = dag_offset(p->fd, &(pd->dag_mem_bottom), flags);
 #endif /* HAVE_DAG_STREAMS_API */
 
-		if (nonblocking && (p->md.dag_mem_top - p->md.dag_mem_bottom < dag_record_size))
+		if (nonblocking && (pd->dag_mem_top - pd->dag_mem_bottom < dag_record_size))
 		{
 			/* Pcap is configured to process only available packets, and there aren't any, return immediately. */
 			return 0;
 		}
 		
 		if(!nonblocking &&
-		   p->md.dag_timeout &&
-		   (p->md.dag_mem_top - p->md.dag_mem_bottom < dag_record_size))
+		   pd->dag_timeout &&
+		   (pd->dag_mem_top - pd->dag_mem_bottom < dag_record_size))
 		{
 			/* Blocking mode, but timeout set and no data has arrived, return anyway.*/
 			return 0;
@@ -243,19 +307,19 @@
 	}
 	
 	/* Process the packets. */
-	while (p->md.dag_mem_top - p->md.dag_mem_bottom >= dag_record_size) {
-
+	while (pd->dag_mem_top - pd->dag_mem_bottom >= dag_record_size) {
+		
 		unsigned short packet_len = 0;
 		int caplen = 0;
 		struct pcap_pkthdr	pcap_header;
-
+		
 #ifdef HAVE_DAG_STREAMS_API
-		dag_record_t *header = (dag_record_t *)(p->md.dag_mem_bottom);
+		dag_record_t *header = (dag_record_t *)(pd->dag_mem_bottom);
 #else
-		dag_record_t *header = (dag_record_t *)(p->md.dag_mem_base + p->md.dag_mem_bottom);
+		dag_record_t *header = (dag_record_t *)(pd->dag_mem_base + pd->dag_mem_bottom);
 #endif /* HAVE_DAG_STREAMS_API */
 
-		u_char *dp = ((u_char *)header) + dag_record_size;
+		u_char *dp = ((u_char *)header); /* + dag_record_size; */
 		unsigned short rlen;
  
 		/*
@@ -277,162 +341,214 @@
 			strncpy(p->errbuf, "dag_read: record too small", PCAP_ERRBUF_SIZE);
 			return -1;
 		}
-		p->md.dag_mem_bottom += rlen;
-
-		switch(header->type) {
-		case TYPE_ATM:
-#ifdef TYPE_AAL5
-		case TYPE_AAL5:
-			if (header->type == TYPE_AAL5) {
-				packet_len = ntohs(header->wlen);
-				caplen = rlen - dag_record_size;
-			}
-#endif
-#ifdef TYPE_MC_ATM
-		case TYPE_MC_ATM:
-			if (header->type == TYPE_MC_ATM) {
-				caplen = packet_len = ATM_CELL_SIZE;
-				dp+=4;
-			}
-#endif
-#ifdef TYPE_MC_AAL5
-		case TYPE_MC_AAL5:
-			if (header->type == TYPE_MC_AAL5) {
-				packet_len = ntohs(header->wlen);
-				caplen = rlen - dag_record_size - 4;
-				dp+=4;
-			}
-#endif
-			if (header->type == TYPE_ATM) {
-				caplen = packet_len = ATM_CELL_SIZE;
-			}
-			if (p->linktype == DLT_SUNATM) {
-				struct sunatm_hdr *sunatm = (struct sunatm_hdr *)dp;
-				unsigned long rawatm;
-					
-				rawatm = ntohl(*((unsigned long *)dp));
-				sunatm->vci = htons((rawatm >>  4) & 0xffff);
-				sunatm->vpi = (rawatm >> 20) & 0x00ff;
-				sunatm->flags = ((header->flags.iface & 1) ? 0x80 : 0x00) | 
-					((sunatm->vpi == 0 && sunatm->vci == htons(5)) ? 6 :
-					 ((sunatm->vpi == 0 && sunatm->vci == htons(16)) ? 5 : 
-					  ((dp[ATM_HDR_SIZE] == 0xaa &&
-					    dp[ATM_HDR_SIZE+1] == 0xaa &&
-					    dp[ATM_HDR_SIZE+2] == 0x03) ? 2 : 1)));
-
-			} else {
-				packet_len -= ATM_HDR_SIZE;
-				caplen -= ATM_HDR_SIZE;
-				dp += ATM_HDR_SIZE;
-			}
-			break;
-
-#ifdef TYPE_DSM_COLOR_ETH
-		case TYPE_DSM_COLOR_ETH:
-#endif
-#ifdef TYPE_COLOR_ETH
-		case TYPE_COLOR_ETH:
-#endif
-		case TYPE_ETH:
-			packet_len = ntohs(header->wlen);
-			packet_len -= (p->md.dag_fcs_bits >> 3);
-			caplen = rlen - dag_record_size - 2;
-			if (caplen > packet_len) {
-				caplen = packet_len;
-			}
-			dp += 2;
-			break;
-#ifdef TYPE_DSM_COLOR_HDLC_POS
-		case TYPE_DSM_COLOR_HDLC_POS:
-#endif
-#ifdef TYPE_COLOR_HDLC_POS
-		case TYPE_COLOR_HDLC_POS:
-#endif
-		case TYPE_HDLC_POS:
-			packet_len = ntohs(header->wlen);
-			packet_len -= (p->md.dag_fcs_bits >> 3);
-			caplen = rlen - dag_record_size;
-			if (caplen > packet_len) {
-				caplen = packet_len;
-			}
-			break;
-#ifdef TYPE_COLOR_MC_HDLC_POS
-		case TYPE_COLOR_MC_HDLC_POS:
-#endif
-#ifdef TYPE_MC_HDLC
-		case TYPE_MC_HDLC:
-			packet_len = ntohs(header->wlen);
-			packet_len -= (p->md.dag_fcs_bits >> 3);
-			caplen = rlen - dag_record_size - 4;
-			if (caplen > packet_len) {
-				caplen = packet_len;
-			}
-			/* jump the MC_HDLC_HEADER */
-			dp += 4;
-			if (p->linktype == DLT_MTP2_WITH_PHDR) {
-				/* Add the MTP2 Pseudo Header */
-				caplen += MTP2_HDR_LEN;
-				packet_len += MTP2_HDR_LEN;
-
-				TempPkt[MTP2_SENT_OFFSET] = 0;
-				TempPkt[MTP2_ANNEX_A_USED_OFFSET] = MTP2_ANNEX_A_USED_UNKNOWN;
-				*(TempPkt+MTP2_LINK_NUMBER_OFFSET) = ((header->rec.mc_hdlc.mc_header>>16)&0x01);
-				*(TempPkt+MTP2_LINK_NUMBER_OFFSET+1) = ((header->rec.mc_hdlc.mc_header>>24)&0xff);
-				memcpy(TempPkt+MTP2_HDR_LEN, dp, caplen);
-				dp = TempPkt;
-			}
-			break;
-#endif
-		default:
-			/* Unhandled ERF type.
-			 * Ignore rather than generating error
-			 */
-			continue;
-		}
- 
-		if (caplen > p->snapshot)
-			caplen = p->snapshot;
+		pd->dag_mem_bottom += rlen;
 
 		/* Count lost packets. */
-		switch(header->type) {
-#ifdef TYPE_COLOR_HDLC_POS
-			/* in this type the color value overwrites the lctr */
+		switch((header->type & 0x7f)) {
+			/* in these types the color value overwrites the lctr */
 		case TYPE_COLOR_HDLC_POS:
-			break;
-#endif
-#ifdef TYPE_COLOR_ETH
-			/* in this type the color value overwrites the lctr */
 		case TYPE_COLOR_ETH:
-			break;
-#endif
-#ifdef TYPE_DSM_COLOR_HDLC_POS
-			/* in this type the color value overwrites the lctr */
 		case TYPE_DSM_COLOR_HDLC_POS:
-			break;
-#endif
-#ifdef TYPE_DSM_COLOR_ETH
-			/* in this type the color value overwrites the lctr */
 		case TYPE_DSM_COLOR_ETH:
-			break;
-#endif
-#ifdef TYPE_COLOR_MC_HDLC_POS
 		case TYPE_COLOR_MC_HDLC_POS:
+		case TYPE_COLOR_HASH_ETH:
+		case TYPE_COLOR_HASH_POS:
 			break;
-#endif
 
 		default:
 			if (header->lctr) {
-				if (p->md.stat.ps_drop > (UINT_MAX - ntohs(header->lctr))) {
-					p->md.stat.ps_drop = UINT_MAX;
+				if (pd->stat.ps_drop > (UINT_MAX - ntohs(header->lctr))) {
+					pd->stat.ps_drop = UINT_MAX;
 				} else {
-					p->md.stat.ps_drop += ntohs(header->lctr);
+					pd->stat.ps_drop += ntohs(header->lctr);
 				}
 			}
 		}
+		
+		if ((header->type & 0x7f) == TYPE_PAD) {
+			continue;
+		}
+
+		num_ext_hdr = dag_erf_ext_header_count(dp, rlen);
+
+		/* ERF encapsulation */
+		/* The Extensible Record Format is not dropped for this kind of encapsulation, 
+		 * and will be handled as a pseudo header by the decoding application.
+		 * The information carried in the ERF header and in the optional subheader (if present)
+		 * could be merged with the libpcap information, to offer a better decoding.
+		 * The packet length is
+		 * o the length of the packet on the link (header->wlen),
+		 * o plus the length of the ERF header (dag_record_size), as the length of the 
+		 *   pseudo header will be adjusted during the decoding,
+		 * o plus the length of the optional subheader (if present).
+		 *
+		 * The capture length is header.rlen and the byte stuffing for alignment will be dropped
+		 * if the capture length is greater than the packet length.
+		 */
+		if (p->linktype == DLT_ERF) {
+			packet_len = ntohs(header->wlen) + dag_record_size;
+			caplen = rlen;
+			switch ((header->type & 0x7f)) {
+			case TYPE_MC_AAL5:
+			case TYPE_MC_ATM:
+			case TYPE_MC_HDLC:
+			case TYPE_MC_RAW_CHANNEL:
+			case TYPE_MC_RAW:
+			case TYPE_MC_AAL2:
+			case TYPE_COLOR_MC_HDLC_POS:
+				packet_len += 4; /* MC header */
+				break;
+
+			case TYPE_COLOR_HASH_ETH:
+			case TYPE_DSM_COLOR_ETH:
+			case TYPE_COLOR_ETH:
+			case TYPE_ETH:
+				packet_len += 2; /* ETH header */
+				break;
+			} /* switch type */
+
+			/* Include ERF extension headers */
+			packet_len += (8 * num_ext_hdr);
+
+			if (caplen > packet_len) {
+				caplen = packet_len;
+			}
+		} else {
+			/* Other kind of encapsulation according to the header Type */
+
+			/* Skip over generic ERF header */
+			dp += dag_record_size;
+			/* Skip over extension headers */
+			dp += 8 * num_ext_hdr;
+			
+			switch((header->type & 0x7f)) {
+			case TYPE_ATM:
+			case TYPE_AAL5:
+				if (header->type == TYPE_AAL5) {
+					packet_len = ntohs(header->wlen);
+					caplen = rlen - dag_record_size;
+				}
+			case TYPE_MC_ATM:
+				if (header->type == TYPE_MC_ATM) {
+					caplen = packet_len = ATM_CELL_SIZE;
+					dp+=4;
+				}
+			case TYPE_MC_AAL5:
+				if (header->type == TYPE_MC_AAL5) {
+					packet_len = ntohs(header->wlen);
+					caplen = rlen - dag_record_size - 4;
+					dp+=4;
+				}
+				if (header->type == TYPE_ATM) {
+					caplen = packet_len = ATM_CELL_SIZE;
+				}
+				if (p->linktype == DLT_SUNATM) {
+					struct sunatm_hdr *sunatm = (struct sunatm_hdr *)dp;
+					unsigned long rawatm;
+					
+					rawatm = ntohl(*((unsigned long *)dp));
+					sunatm->vci = htons((rawatm >>  4) & 0xffff);
+					sunatm->vpi = (rawatm >> 20) & 0x00ff;
+					sunatm->flags = ((header->flags.iface & 1) ? 0x80 : 0x00) | 
+						((sunatm->vpi == 0 && sunatm->vci == htons(5)) ? 6 :
+						 ((sunatm->vpi == 0 && sunatm->vci == htons(16)) ? 5 : 
+						  ((dp[ATM_HDR_SIZE] == 0xaa &&
+						    dp[ATM_HDR_SIZE+1] == 0xaa &&
+						    dp[ATM_HDR_SIZE+2] == 0x03) ? 2 : 1)));
+
+				} else {
+					packet_len -= ATM_HDR_SIZE;
+					caplen -= ATM_HDR_SIZE;
+					dp += ATM_HDR_SIZE;
+				}
+				break;
+
+			case TYPE_COLOR_HASH_ETH:
+			case TYPE_DSM_COLOR_ETH:
+			case TYPE_COLOR_ETH:
+			case TYPE_ETH:
+				packet_len = ntohs(header->wlen);
+				packet_len -= (pd->dag_fcs_bits >> 3);
+				caplen = rlen - dag_record_size - 2;
+				if (caplen > packet_len) {
+					caplen = packet_len;
+				}
+				dp += 2;
+				break;
+
+			case TYPE_COLOR_HASH_POS:
+			case TYPE_DSM_COLOR_HDLC_POS:
+			case TYPE_COLOR_HDLC_POS:
+			case TYPE_HDLC_POS:
+				packet_len = ntohs(header->wlen);
+				packet_len -= (pd->dag_fcs_bits >> 3);
+				caplen = rlen - dag_record_size;
+				if (caplen > packet_len) {
+					caplen = packet_len;
+				}
+				break;
+
+			case TYPE_COLOR_MC_HDLC_POS:
+			case TYPE_MC_HDLC:
+				packet_len = ntohs(header->wlen);
+				packet_len -= (pd->dag_fcs_bits >> 3);
+				caplen = rlen - dag_record_size - 4;
+				if (caplen > packet_len) {
+					caplen = packet_len;
+				}
+				/* jump the MC_HDLC_HEADER */
+				dp += 4;
+#ifdef DLT_MTP2_WITH_PHDR
+				if (p->linktype == DLT_MTP2_WITH_PHDR) {
+					/* Add the MTP2 Pseudo Header */
+					caplen += MTP2_HDR_LEN;
+					packet_len += MTP2_HDR_LEN;
+					
+					TempPkt[MTP2_SENT_OFFSET] = 0;
+					TempPkt[MTP2_ANNEX_A_USED_OFFSET] = MTP2_ANNEX_A_USED_UNKNOWN;
+					*(TempPkt+MTP2_LINK_NUMBER_OFFSET) = ((header->rec.mc_hdlc.mc_header>>16)&0x01);
+					*(TempPkt+MTP2_LINK_NUMBER_OFFSET+1) = ((header->rec.mc_hdlc.mc_header>>24)&0xff);
+					memcpy(TempPkt+MTP2_HDR_LEN, dp, caplen);
+					dp = TempPkt;
+				}
+#endif
+				break;
+
+			case TYPE_IPV4:
+			case TYPE_IPV6:
+				packet_len = ntohs(header->wlen);
+				caplen = rlen - dag_record_size;
+				if (caplen > packet_len) {
+					caplen = packet_len;
+				}
+				break;
+
+			/* These types have no matching 'native' DLT, but can be used with DLT_ERF above */
+			case TYPE_MC_RAW:
+			case TYPE_MC_RAW_CHANNEL:
+			case TYPE_IP_COUNTER:
+			case TYPE_TCP_FLOW_COUNTER:
+			case TYPE_INFINIBAND:
+			case TYPE_RAW_LINK:
+			case TYPE_INFINIBAND_LINK:
+			default:
+				/* Unhandled ERF type.
+				 * Ignore rather than generating error
+				 */
+				continue;
+			} /* switch type */
+
+			/* Skip over extension headers */
+			caplen -= (8 * num_ext_hdr);
+
+		} /* ERF encapsulation */
+		
+		if (caplen > p->snapshot)
+			caplen = p->snapshot;
 
 		/* Run the packet filter if there is one. */
 		if ((p->fcode.bf_insns == NULL) || bpf_filter(p->fcode.bf_insns, dp, packet_len, caplen)) {
-
+			
 			/* convert between timestamp formats */
 			register unsigned long long ts;
 				
@@ -456,14 +572,14 @@
 			pcap_header.len = packet_len;
 	
 			/* Count the packet. */
-			p->md.stat.ps_recv++;
+			pd->stat.ps_recv++;
 	
 			/* Call the user supplied callback function */
 			callback(user, &pcap_header, dp);
 	
 			/* Only count packets that pass the filter, for consistency with standard Linux behaviour. */
 			processed++;
-			if (processed == cnt)
+			if (processed == cnt && !PACKET_COUNT_IS_UNLIMITED(cnt))
 			{
 				/* Reached the user-specified limit. */
 				return cnt;
@@ -485,23 +601,25 @@
 /*
  *  Get a handle for a live capture from the given DAG device.  Passing a NULL
  *  device will result in a failure.  The promisc flag is ignored because DAG
- *  cards are always promiscuous.  The to_ms parameter is also ignored as it is
- *  not supported in hardware.
+ *  cards are always promiscuous.  The to_ms parameter is used in setting the
+ *  API polling parameters.
  *  
  *  snaplen is now also ignored, until we get per-stream slen support. Set
- *  slen with approprite DAG tool BEFORE pcap_open_live().
+ *  slen with approprite DAG tool BEFORE pcap_activate().
  *
  *  See also pcap(3).
  */
-pcap_t *
-dag_open_live(const char *device, int snaplen, int promisc, int to_ms, char *ebuf)
+static int dag_activate(pcap_t* handle)
 {
+	struct pcap_dag *handlep = handle->priv;
+#if 0
 	char conf[30]; /* dag configure string */
-	pcap_t *handle;
+#endif
 	char *s;
 	int n;
 	daginf_t* daginf;
 	char * newDev = NULL;
+	char * device = handle->opt.source;
 #ifdef HAVE_DAG_STREAMS_API
 	uint32_t mindata;
 	struct timeval maxwait;
@@ -509,44 +627,35 @@
 #endif
 
 	if (device == NULL) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "device is NULL: %s", pcap_strerror(errno));
-		return NULL;
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "device is NULL: %s", pcap_strerror(errno));
+		return -1;
 	}
-	/* Allocate a handle for this session. */
 
-	handle = malloc(sizeof(*handle));
-	if (handle == NULL) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc %s: %s", device, pcap_strerror(errno));
-		return NULL;
-	}
-	
 	/* Initialize some components of the pcap structure. */
-	
-	memset(handle, 0, sizeof(*handle));
 
 #ifdef HAVE_DAG_STREAMS_API
 	newDev = (char *)malloc(strlen(device) + 16);
 	if (newDev == NULL) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "Can't allocate string for device name: %s\n", pcap_strerror(errno));
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't allocate string for device name: %s\n", pcap_strerror(errno));
 		goto fail;
 	}
 	
 	/* Parse input name to get dag device and stream number if provided */
-	if (dag_parse_name(device, newDev, strlen(device) + 16, &handle->md.dag_stream) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "dag_parse_name: %s\n", pcap_strerror(errno));
+	if (dag_parse_name(device, newDev, strlen(device) + 16, &handlep->dag_stream) < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "dag_parse_name: %s\n", pcap_strerror(errno));
 		goto fail;
 	}
 	device = newDev;
 
-	if (handle->md.dag_stream%2) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "dag_parse_name: tx (even numbered) streams not supported for capture\n");
+	if (handlep->dag_stream%2) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "dag_parse_name: tx (even numbered) streams not supported for capture\n");
 		goto fail;
 	}
 #else
 	if (strncmp(device, "/dev/", 5) != 0) {
 		newDev = (char *)malloc(strlen(device) + 5);
 		if (newDev == NULL) {
-			snprintf(ebuf, PCAP_ERRBUF_SIZE, "Can't allocate string for device name: %s\n", pcap_strerror(errno));
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't allocate string for device name: %s\n", pcap_strerror(errno));
 			goto fail;
 		}
 		strcpy(newDev, "/dev/");
@@ -557,47 +666,54 @@
 
 	/* setup device parameters */
 	if((handle->fd = dag_open((char *)device)) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "dag_open %s: %s", device, pcap_strerror(errno));
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "dag_open %s: %s", device, pcap_strerror(errno));
 		goto fail;
 	}
 
 #ifdef HAVE_DAG_STREAMS_API
 	/* Open requested stream. Can fail if already locked or on error */
-	if (dag_attach_stream(handle->fd, handle->md.dag_stream, 0, 0) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "dag_attach_stream: %s\n", pcap_strerror(errno));
+	if (dag_attach_stream(handle->fd, handlep->dag_stream, 0, 0) < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "dag_attach_stream: %s\n", pcap_strerror(errno));
 		goto failclose;
 	}
 
 	/* Set up default poll parameters for stream
 	 * Can be overridden by pcap_set_nonblock()
 	 */
-	if (dag_get_stream_poll(handle->fd, handle->md.dag_stream,
+	if (dag_get_stream_poll(handle->fd, handlep->dag_stream,
 				&mindata, &maxwait, &poll) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "dag_get_stream_poll: %s\n", pcap_strerror(errno));
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "dag_get_stream_poll: %s\n", pcap_strerror(errno));
 		goto faildetach;
 	}
 	
-	/* Amount of data to collect in Bytes before calling callbacks.
-	 * Important for efficiency, but can introduce latency
-	 * at low packet rates if to_ms not set!
-	 */
-	mindata = 65536;
+	if (handle->opt.immediate) {
+		/* Call callback immediately.
+		 * XXX - is this the right way to handle this?
+		 */
+		mindata = 0;
+	} else {
+		/* Amount of data to collect in Bytes before calling callbacks.
+		 * Important for efficiency, but can introduce latency
+		 * at low packet rates if to_ms not set!
+		 */
+		mindata = 65536;
+	}
 
-	/* Obey to_ms if supplied. This is a good idea!
+	/* Obey opt.timeout (was to_ms) if supplied. This is a good idea!
 	 * Recommend 10-100ms. Calls will time out even if no data arrived.
 	 */
-	maxwait.tv_sec = to_ms/1000;
-	maxwait.tv_usec = (to_ms%1000) * 1000;
+	maxwait.tv_sec = handle->opt.timeout/1000;
+	maxwait.tv_usec = (handle->opt.timeout%1000) * 1000;
 
-	if (dag_set_stream_poll(handle->fd, handle->md.dag_stream,
+	if (dag_set_stream_poll(handle->fd, handlep->dag_stream,
 				mindata, &maxwait, &poll) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "dag_set_stream_poll: %s\n", pcap_strerror(errno));
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "dag_set_stream_poll: %s\n", pcap_strerror(errno));
 		goto faildetach;
 	}
 		
 #else
-	if((handle->md.dag_mem_base = dag_mmap(handle->fd)) == MAP_FAILED) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE,"dag_mmap %s: %s\n", device, pcap_strerror(errno));
+	if((handlep->dag_mem_base = dag_mmap(handle->fd)) == MAP_FAILED) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,"dag_mmap %s: %s\n", device, pcap_strerror(errno));
 		goto failclose;
 	}
 
@@ -611,28 +727,28 @@
 	/* set the card snap length to the specified snaplen parameter */
 	/* This is a really bad idea, as different cards have different
 	 * valid slen ranges. Should fix in Config API. */
-	if (snaplen == 0 || snaplen > MAX_DAG_SNAPLEN) {
-		snaplen = MAX_DAG_SNAPLEN;
+	if (handle->snapshot == 0 || handle->snapshot > MAX_DAG_SNAPLEN) {
+		handle->snapshot = MAX_DAG_SNAPLEN;
 	} else if (snaplen < MIN_DAG_SNAPLEN) {
-		snaplen = MIN_DAG_SNAPLEN;
+		handle->snapshot = MIN_DAG_SNAPLEN;
 	}
 	/* snap len has to be a multiple of 4 */
 	snprintf(conf, 30, "varlen slen=%d", (snaplen + 3) & ~3); 
 
 	if(dag_configure(handle->fd, conf) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE,"dag_configure %s: %s\n", device, pcap_strerror(errno));
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,"dag_configure %s: %s\n", device, pcap_strerror(errno));
 		goto faildetach;
 	}
 #endif	
 	
 #ifdef HAVE_DAG_STREAMS_API
-	if(dag_start_stream(handle->fd, handle->md.dag_stream) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "dag_start_stream %s: %s\n", device, pcap_strerror(errno));
+	if(dag_start_stream(handle->fd, handlep->dag_stream) < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "dag_start_stream %s: %s\n", device, pcap_strerror(errno));
 		goto faildetach;
 	}
 #else
 	if(dag_start(handle->fd) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "dag_start %s: %s\n", device, pcap_strerror(errno));
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "dag_start %s: %s\n", device, pcap_strerror(errno));
 		goto failclose;
 	}
 #endif /* HAVE_DAG_STREAMS_API */
@@ -642,42 +758,60 @@
 	 * initialized to zero on startup, it won't give you
 	 * a compiler warning if you make this mistake!
 	 */
-	handle->md.dag_mem_bottom = 0;
-	handle->md.dag_mem_top = 0;
-	handle->md.dag_fcs_bits = 32;
+	handlep->dag_mem_bottom = 0;
+	handlep->dag_mem_top = 0;
 
-	/* Query the card first for special cases. */
+	/*
+	 * Find out how many FCS bits we should strip.
+	 * First, query the card to see if it strips the FCS.
+	 */
 	daginf = dag_info(handle->fd);
-	if ((0x4200 == daginf->device_code) || (0x4230 == daginf->device_code))
-	{
+	if ((0x4200 == daginf->device_code) || (0x4230 == daginf->device_code))	{
 		/* DAG 4.2S and 4.23S already strip the FCS.  Stripping the final word again truncates the packet. */
-		handle->md.dag_fcs_bits = 0;
-	}
+		handlep->dag_fcs_bits = 0;
 
-	/* Then allow an environment variable to override. */
-	if ((s = getenv("ERF_FCS_BITS")) != NULL) {
-		if ((n = atoi(s)) == 0 || n == 16|| n == 32) {
-			handle->md.dag_fcs_bits = n;
-		} else {
-			snprintf(ebuf, PCAP_ERRBUF_SIZE,
-				"pcap_open_live %s: bad ERF_FCS_BITS value (%d) in environment\n", device, n);
-			goto failstop;
+		/* Note that no FCS will be supplied. */
+		handle->linktype_ext = LT_FCS_DATALINK_EXT(0);
+	} else {
+		/*
+		 * Start out assuming it's 32 bits.
+		 */
+		handlep->dag_fcs_bits = 32;
+
+		/* Allow an environment variable to override. */
+		if ((s = getenv("ERF_FCS_BITS")) != NULL) {
+			if ((n = atoi(s)) == 0 || n == 16 || n == 32) {
+				handlep->dag_fcs_bits = n;
+			} else {
+				snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+					"pcap_activate %s: bad ERF_FCS_BITS value (%d) in environment\n", device, n);
+				goto failstop;
+			}
+		}
+
+		/*
+		 * Did the user request that they not be stripped?
+		 */
+		if ((s = getenv("ERF_DONT_STRIP_FCS")) != NULL) {
+			/* Yes.  Note the number of bytes that will be
+			   supplied. */
+			handle->linktype_ext = LT_FCS_DATALINK_EXT(handlep->dag_fcs_bits/16);
+
+			/* And don't strip them. */
+			handlep->dag_fcs_bits = 0;
 		}
 	}
 
-	handle->snapshot	= snaplen;
-	handle->md.dag_timeout	= to_ms;
+	handlep->dag_timeout	= handle->opt.timeout;
 
 	handle->linktype = -1;
-	if (dag_get_datalink(handle) < 0) {
-		strcpy(ebuf, handle->errbuf);
+	if (dag_get_datalink(handle) < 0)
 		goto failstop;
-	}
 	
 	handle->bufsize = 0;
 
 	if (new_pcap_dag(handle) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "new_pcap_dag %s: %s\n", device, pcap_strerror(errno));
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "new_pcap_dag %s: %s\n", device, pcap_strerror(errno));
 		goto failstop;
 	}
 
@@ -698,105 +832,174 @@
 	handle->getnonblock_op = pcap_getnonblock_fd;
 	handle->setnonblock_op = dag_setnonblock;
 	handle->stats_op = dag_stats;
-	handle->close_op = dag_platform_close;
-	handle->md.stat.ps_drop = 0;
-	handle->md.stat.ps_recv = 0;
-	return handle;
+	handle->cleanup_op = dag_platform_cleanup;
+	handlep->stat.ps_drop = 0;
+	handlep->stat.ps_recv = 0;
+	handlep->stat.ps_ifdrop = 0;
+	return 0;
 
 #ifdef HAVE_DAG_STREAMS_API 
 failstop:
-	if (handle != NULL) {
-		if (dag_stop_stream(handle->fd, handle->md.dag_stream) < 0)
-			fprintf(stderr,"dag_stop_stream: %s\n", strerror(errno));
+	if (dag_stop_stream(handle->fd, handlep->dag_stream) < 0) {
+		fprintf(stderr,"dag_stop_stream: %s\n", strerror(errno));
 	}
 	
 faildetach:
-	if (handle != NULL) {
-		if (dag_detach_stream(handle->fd, handle->md.dag_stream) < 0)
-			fprintf(stderr,"dag_detach_stream: %s\n", strerror(errno));
-	}
-#else	
+	if (dag_detach_stream(handle->fd, handlep->dag_stream) < 0)
+		fprintf(stderr,"dag_detach_stream: %s\n", strerror(errno));
+#else
 failstop:
-	if (handle != NULL) {
-		if (dag_stop(p->fd) < 0)
-			fprintf(stderr,"dag_stop: %s\n", strerror(errno));
-	}
+	if (dag_stop(handle->fd) < 0)
+		fprintf(stderr,"dag_stop: %s\n", strerror(errno));
 #endif /* HAVE_DAG_STREAMS_API */
 	
 failclose:
-	if (handle != NULL) {
-		if (dag_close(handle->fd) < 0)
-			fprintf(stderr,"dag_close: %s\n", strerror(errno));
-	}
-	if (handle != NULL)
-		delete_pcap_dag(handle);
-	
+	if (dag_close(handle->fd) < 0)
+		fprintf(stderr,"dag_close: %s\n", strerror(errno));
+	delete_pcap_dag(handle);
+
 fail:
+	pcap_cleanup_live_common(handle);
 	if (newDev != NULL) {
 		free((char *)newDev);
 	}
-	if (handle != NULL) {
-		/*
-		 * Get rid of any link-layer type list we allocated.
-		 */
-		if (handle->dlt_list != NULL) {
-			free(handle->dlt_list);
-		}
-		free(handle);
-	}
 
-	return NULL;
+	return PCAP_ERROR;
+}
+
+pcap_t *dag_create(const char *device, char *ebuf, int *is_ours)
+{
+	const char *cp;
+	char *cpend;
+	long devnum;
+	pcap_t *p;
+#ifdef HAVE_DAG_STREAMS_API
+	long stream = 0;
+#endif
+
+	/* Does this look like a DAG device? */
+	cp = strrchr(device, '/');
+	if (cp == NULL)
+		cp = device;
+	/* Does it begin with "dag"? */
+	if (strncmp(cp, "dag", 3) != 0) {
+		/* Nope, doesn't begin with "dag" */
+		*is_ours = 0;
+		return NULL;
+	}
+	/* Yes - is "dag" followed by a number from 0 to DAG_MAX_BOARDS-1 */
+	cp += 3;
+	devnum = strtol(cp, &cpend, 10);
+#ifdef HAVE_DAG_STREAMS_API
+	if (*cpend == ':') {
+		/* Followed by a stream number. */
+		stream = strtol(++cpend, &cpend, 10);
+	}
+#endif
+	if (cpend == cp || *cpend != '\0') {
+		/* Not followed by a number. */
+		*is_ours = 0;
+		return NULL;
+	}
+	if (devnum < 0 || devnum >= DAG_MAX_BOARDS) {
+		/* Followed by a non-valid number. */
+		*is_ours = 0;
+		return NULL;
+	}
+#ifdef HAVE_DAG_STREAMS_API
+	if (stream <0 || stream >= DAG_STREAM_MAX) {
+		/* Followed by a non-valid stream number. */
+		*is_ours = 0;
+		return NULL;
+	}
+#endif
+
+	/* OK, it's probably ours. */
+	*is_ours = 1;
+
+	p = pcap_create_common(device, ebuf, sizeof (struct pcap_dag));
+	if (p == NULL)
+		return NULL;
+
+	p->activate_op = dag_activate;
+	return p;
 }
 
 static int
 dag_stats(pcap_t *p, struct pcap_stat *ps) {
+	struct pcap_dag *pd = p->priv;
+
 	/* This needs to be filled out correctly.  Hopefully a dagapi call will
 		 provide all necessary information.
 	*/
-	/*p->md.stat.ps_recv = 0;*/
-	/*p->md.stat.ps_drop = 0;*/
+	/*pd->stat.ps_recv = 0;*/
+	/*pd->stat.ps_drop = 0;*/
 	
-	*ps = p->md.stat;
+	*ps = pd->stat;
  
 	return 0;
 }
 
 /*
- * Simply submit all possible dag names as candidates.
- * pcap_add_if() internally tests each candidate with pcap_open_live(),
- * so any non-existent devices are dropped.
- * For 2.5 try all rx stream names as well.
+ * Previously we just generated a list of all possible names and let
+ * pcap_add_if() attempt to open each one, but with streams this adds up
+ * to 81 possibilities which is inefficient.
+ *
+ * Since we know more about the devices we can prune the tree here.
+ * pcap_add_if() will still retest each device but the total number of
+ * open attempts will still be much less than the naive approach.
  */
 int
-dag_platform_finddevs(pcap_if_t **devlistp, char *errbuf)
+dag_findalldevs(pcap_if_t **devlistp, char *errbuf)
 {
 	char name[12];	/* XXX - pick a size */
 	int ret = 0;
 	int c;
+	char dagname[DAGNAME_BUFSIZE];
+	int dagstream;
+	int dagfd;
 
-	/* Try all the DAGs 0-9 */
-	for (c = 0; c < 9; c++) {
+	/* Try all the DAGs 0-DAG_MAX_BOARDS */
+	for (c = 0; c < DAG_MAX_BOARDS; c++) {
 		snprintf(name, 12, "dag%d", c);
-		if (pcap_add_if(devlistp, name, 0, NULL, errbuf) == -1) {
-			/*
-			 * Failure.
-			 */
-			ret = -1;
-		}
-#ifdef HAVE_DAG_STREAMS_API
+		if (-1 == dag_parse_name(name, dagname, DAGNAME_BUFSIZE, &dagstream))
 		{
-			int stream;
-			for(stream=0;stream<16;stream+=2) {
-				snprintf(name,  10, "dag%d:%d", c, stream);
-				if (pcap_add_if(devlistp, name, 0, NULL, errbuf) == -1) {
-					/*
-					 * Failure.
-					 */
-					ret = -1;
-				}
-			}				
+			return -1;
 		}
+		if ( (dagfd = dag_open(dagname)) >= 0 ) {
+			if (pcap_add_if(devlistp, name, 0, NULL, errbuf) == -1) {
+				/*
+				 * Failure.
+				 */
+				ret = -1;
+			}
+#ifdef HAVE_DAG_STREAMS_API
+			{
+				int stream, rxstreams;
+				rxstreams = dag_rx_get_stream_count(dagfd);
+				for(stream=0;stream<DAG_STREAM_MAX;stream+=2) {
+					if (0 == dag_attach_stream(dagfd, stream, 0, 0)) {
+						dag_detach_stream(dagfd, stream);
+
+						snprintf(name,  10, "dag%d:%d", c, stream);
+						if (pcap_add_if(devlistp, name, 0, NULL, errbuf) == -1) {
+							/*
+							 * Failure.
+							 */
+							ret = -1;
+						}
+						
+						rxstreams--;
+						if(rxstreams <= 0) {
+							break;
+						}
+					}
+				}				
+			}
 #endif  /* HAVE_DAG_STREAMS_API */
+			dag_close(dagfd);
+		}
+
 	}
 	return (ret);
 }
@@ -822,8 +1025,6 @@
 	if (install_bpf_program(p, fp) < 0)
 		return -1;
 
-	p->md.use_bpf = 0;
-
 	return (0);
 }
 
@@ -838,11 +1039,13 @@
 static int
 dag_setnonblock(pcap_t *p, int nonblock, char *errbuf)
 {
+	struct pcap_dag *pd = p->priv;
+
 	/*
 	 * Set non-blocking mode on the FD.
 	 * XXX - is that necessary?  If not, don't bother calling it,
 	 * and have a "dag_getnonblock()" function that looks at
-	 * "p->md.dag_offset_flags".
+	 * "pd->dag_offset_flags".
 	 */
 	if (pcap_setnonblock_fd(p, nonblock, errbuf) < 0)
 		return (-1);
@@ -852,7 +1055,7 @@
 		struct timeval maxwait;
 		struct timeval poll;
 		
-		if (dag_get_stream_poll(p->fd, p->md.dag_stream,
+		if (dag_get_stream_poll(p->fd, pd->dag_stream,
 					&mindata, &maxwait, &poll) < 0) {
 			snprintf(errbuf, PCAP_ERRBUF_SIZE, "dag_get_stream_poll: %s\n", pcap_strerror(errno));
 			return -1;
@@ -867,7 +1070,7 @@
 		else
 			mindata = 65536;
 		
-		if (dag_set_stream_poll(p->fd, p->md.dag_stream,
+		if (dag_set_stream_poll(p->fd, pd->dag_stream,
 					mindata, &maxwait, &poll) < 0) {
 			snprintf(errbuf, PCAP_ERRBUF_SIZE, "dag_set_stream_poll: %s\n", pcap_strerror(errno));
 			return -1;
@@ -875,9 +1078,9 @@
 	}
 #endif /* HAVE_DAG_STREAMS_API */
 	if (nonblock) {
-		p->md.dag_offset_flags |= DAGF_NONBLOCK;
+		pd->dag_offset_flags |= DAGF_NONBLOCK;
 	} else {
-		p->md.dag_offset_flags &= ~DAGF_NONBLOCK;
+		pd->dag_offset_flags &= ~DAGF_NONBLOCK;
 	}
 	return (0);
 }
@@ -885,7 +1088,8 @@
 static int
 dag_get_datalink(pcap_t *p)
 {
-	int index=0;
+	struct pcap_dag *pd = p->priv;
+	int index=0, dlt_index=0;
 	uint8_t types[255];
 
 	memset(types, 0, 255);
@@ -897,7 +1101,16 @@
 
 	p->linktype = 0;
 
-#ifdef HAVE_DAG_GET_ERF_TYPES
+#ifdef HAVE_DAG_GET_STREAM_ERF_TYPES
+	/* Get list of possible ERF types for this card */
+	if (dag_get_stream_erf_types(p->fd, pd->dag_stream, types, 255) < 0) {
+		snprintf(p->errbuf, sizeof(p->errbuf), "dag_get_stream_erf_types: %s", pcap_strerror(errno));
+		return (-1);		
+	}
+	
+	while (types[index]) {
+
+#elif defined HAVE_DAG_GET_ERF_TYPES
 	/* Get list of possible ERF types for this card */
 	if (dag_get_erf_types(p->fd, types, 255) < 0) {
 		snprintf(p->errbuf, sizeof(p->errbuf), "dag_get_erf_types: %s", pcap_strerror(errno));
@@ -911,31 +1124,26 @@
 
 	{
 #endif
-		switch(types[index]) {
+		switch((types[index] & 0x7f)) {
 
 		case TYPE_HDLC_POS:
-#ifdef TYPE_COLOR_HDLC_POS
 		case TYPE_COLOR_HDLC_POS:
-#endif
-#ifdef TYPE_DSM_COLOR_HDLC_POS
 		case TYPE_DSM_COLOR_HDLC_POS:
-#endif
+		case TYPE_COLOR_HASH_POS:
+
 			if (p->dlt_list != NULL) {
-				p->dlt_list[index++] = DLT_CHDLC;
-				p->dlt_list[index++] = DLT_PPP_SERIAL;
-				p->dlt_list[index++] = DLT_FRELAY;
+				p->dlt_list[dlt_index++] = DLT_CHDLC;
+				p->dlt_list[dlt_index++] = DLT_PPP_SERIAL;
+				p->dlt_list[dlt_index++] = DLT_FRELAY;
 			}
 			if(!p->linktype)
 				p->linktype = DLT_CHDLC;
 			break;
 
 		case TYPE_ETH:
-#ifdef TYPE_COLOR_ETH
 		case TYPE_COLOR_ETH:
-#endif
-#ifdef TYPE_DSM_COLOR_ETH
 		case TYPE_DSM_COLOR_ETH:
-#endif
+		case TYPE_COLOR_HASH_ETH:
 			/*
 			 * This is (presumably) a real Ethernet capture; give it a
 			 * link-layer-type list with DLT_EN10MB and DLT_DOCSIS, so
@@ -947,61 +1155,68 @@
 			 * Ethernet framing).
 			 */
 			if (p->dlt_list != NULL) {
-				p->dlt_list[index++] = DLT_EN10MB;
-				p->dlt_list[index++] = DLT_DOCSIS;
+				p->dlt_list[dlt_index++] = DLT_EN10MB;
+				p->dlt_list[dlt_index++] = DLT_DOCSIS;
 			}
 			if(!p->linktype)
 				p->linktype = DLT_EN10MB;
 			break;
 
 		case TYPE_ATM: 
-#ifdef TYPE_AAL5
 		case TYPE_AAL5:
-#endif
-#ifdef TYPE_MC_ATM
 		case TYPE_MC_ATM:
-#endif
-#ifdef TYPE_MC_AAL5
 		case TYPE_MC_AAL5:
-#endif
 			if (p->dlt_list != NULL) {
-				p->dlt_list[index++] = DLT_ATM_RFC1483;
-				p->dlt_list[index++] = DLT_SUNATM;
+				p->dlt_list[dlt_index++] = DLT_ATM_RFC1483;
+				p->dlt_list[dlt_index++] = DLT_SUNATM;
 			}
 			if(!p->linktype)
 				p->linktype = DLT_ATM_RFC1483;
 			break;
 
-#ifdef TYPE_COLOR_MC_HDLC_POS
 		case TYPE_COLOR_MC_HDLC_POS:
-#endif
-#ifdef TYPE_MC_HDLC
 		case TYPE_MC_HDLC:
 			if (p->dlt_list != NULL) {
-				p->dlt_list[index++] = DLT_CHDLC;
-				p->dlt_list[index++] = DLT_PPP_SERIAL;
-				p->dlt_list[index++] = DLT_FRELAY;
-				p->dlt_list[index++] = DLT_MTP2;
-				p->dlt_list[index++] = DLT_MTP2_WITH_PHDR;
+				p->dlt_list[dlt_index++] = DLT_CHDLC;
+				p->dlt_list[dlt_index++] = DLT_PPP_SERIAL;
+				p->dlt_list[dlt_index++] = DLT_FRELAY;
+				p->dlt_list[dlt_index++] = DLT_MTP2;
+				p->dlt_list[dlt_index++] = DLT_MTP2_WITH_PHDR;
+				p->dlt_list[dlt_index++] = DLT_LAPD;
 			}
 			if(!p->linktype)
 				p->linktype = DLT_CHDLC;
 			break;
-#endif
 
-		case TYPE_LEGACY:
+		case TYPE_IPV4:
+		case TYPE_IPV6:
 			if(!p->linktype)
-				p->linktype = DLT_NULL;
+				p->linktype = DLT_RAW;
 			break;
 
+		case TYPE_LEGACY:
+		case TYPE_MC_RAW:
+		case TYPE_MC_RAW_CHANNEL:
+		case TYPE_IP_COUNTER:
+		case TYPE_TCP_FLOW_COUNTER:
+		case TYPE_INFINIBAND:
+		case TYPE_RAW_LINK:
+		case TYPE_INFINIBAND_LINK:
 		default:
-			snprintf(p->errbuf, sizeof(p->errbuf), "unknown DAG linktype %d", types[index]);
-			return (-1);
+			/* Libpcap cannot deal with these types yet */
+			/* Add no 'native' DLTs, but still covered by DLT_ERF */
+			break;
 
 		} /* switch */
+		index++;
 	}
 
-	p->dlt_count = index;
+	p->dlt_list[dlt_index++] = DLT_ERF;
+
+	p->dlt_count = dlt_index;
+
+	if(!p->linktype)
+		p->linktype = DLT_ERF;
 
 	return p->linktype;
 }
diff --git a/pcap-dag.h b/pcap-dag.h
index eff01d6..4751186 100644
--- a/pcap-dag.h
+++ b/pcap-dag.h
@@ -7,8 +7,102 @@
  *
  * Author: Richard Littin, Sean Irvine ({richard,sean}@reeltwo.com)
  *
- * @(#) $Header: /tcpdump/master/libpcap/pcap-dag.h,v 1.3.4.1 2005/07/07 06:56:04 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/pcap-dag.h,v 1.7 2008-04-04 19:37:45 guy Exp $ (LBL)
  */
 
-pcap_t *dag_open_live(const char *device, int snaplen, int promisc, int to_ms, char *ebuf);
-int dag_platform_finddevs(pcap_if_t **devlistp, char *errbuf);
+pcap_t *dag_create(const char *, char *, int *);
+int dag_findalldevs(pcap_if_t **devlistp, char *errbuf);
+
+#ifndef TYPE_AAL5
+#define TYPE_AAL5               4
+#endif
+
+#ifndef TYPE_MC_HDLC
+#define TYPE_MC_HDLC            5
+#endif
+
+#ifndef TYPE_MC_RAW
+#define TYPE_MC_RAW             6
+#endif
+
+#ifndef TYPE_MC_ATM
+#define TYPE_MC_ATM             7
+#endif
+
+#ifndef TYPE_MC_RAW_CHANNEL
+#define TYPE_MC_RAW_CHANNEL     8
+#endif
+
+#ifndef TYPE_MC_AAL5
+#define TYPE_MC_AAL5            9
+#endif
+
+#ifndef TYPE_COLOR_HDLC_POS
+#define TYPE_COLOR_HDLC_POS     10
+#endif
+
+#ifndef TYPE_COLOR_ETH
+#define TYPE_COLOR_ETH          11
+#endif
+
+#ifndef TYPE_MC_AAL2
+#define TYPE_MC_AAL2            12
+#endif
+
+#ifndef TYPE_IP_COUNTER
+#define TYPE_IP_COUNTER         13
+#endif
+
+#ifndef TYPE_TCP_FLOW_COUNTER
+#define TYPE_TCP_FLOW_COUNTER   14
+#endif
+
+#ifndef TYPE_DSM_COLOR_HDLC_POS
+#define TYPE_DSM_COLOR_HDLC_POS 15
+#endif
+
+#ifndef TYPE_DSM_COLOR_ETH
+#define TYPE_DSM_COLOR_ETH      16
+#endif
+
+#ifndef TYPE_COLOR_MC_HDLC_POS
+#define TYPE_COLOR_MC_HDLC_POS  17
+#endif
+
+#ifndef TYPE_AAL2
+#define TYPE_AAL2               18
+#endif
+
+#ifndef TYPE_COLOR_HASH_POS
+#define TYPE_COLOR_HASH_POS     19
+#endif
+
+#ifndef TYPE_COLOR_HASH_ETH
+#define TYPE_COLOR_HASH_ETH     20
+#endif
+
+#ifndef TYPE_INFINIBAND
+#define TYPE_INFINIBAND         21
+#endif
+
+#ifndef TYPE_IPV4
+#define TYPE_IPV4               22
+#endif
+
+#ifndef TYPE_IPV6
+#define TYPE_IPV6               23
+#endif
+
+#ifndef TYPE_RAW_LINK
+#define TYPE_RAW_LINK           24
+#endif
+
+#ifndef TYPE_INFINIBAND_LINK
+#define TYPE_INFINIBAND_LINK    25
+#endif
+
+
+
+#ifndef TYPE_PAD
+#define TYPE_PAD                48
+#endif
diff --git a/pcap-dbus.c b/pcap-dbus.c
new file mode 100644
index 0000000..c878353
--- /dev/null
+++ b/pcap-dbus.c
@@ -0,0 +1,279 @@
+/*
+ * Copyright (c) 2012 Jakub Zawadzki
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+ * OWNER 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+
+#include <time.h>
+#include <sys/time.h>
+
+#include <dbus/dbus.h>
+
+#include "pcap-int.h"
+#include "pcap-dbus.h"
+
+/*
+ * Private data for capturing on D-Bus.
+ */
+struct pcap_dbus {
+	DBusConnection *conn;
+	u_int	packets_read;	/* count of packets read */
+};
+
+static int
+dbus_read(pcap_t *handle, int max_packets, pcap_handler callback, u_char *user)
+{
+	struct pcap_dbus *handlep = handle->priv;
+
+	struct pcap_pkthdr pkth;
+	DBusMessage *message;
+
+	char *raw_msg;
+	int raw_msg_len;
+
+	int count = 0;
+
+	message = dbus_connection_pop_message(handlep->conn);
+
+	while (!message) {
+		// XXX handle->opt.timeout = timeout_ms;
+		if (!dbus_connection_read_write(handlep->conn, 100)) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Connection closed");
+			return -1;
+		}
+
+		if (handle->break_loop) {
+			handle->break_loop = 0;
+			return -2;
+		}
+
+		message = dbus_connection_pop_message(handlep->conn);
+	}
+
+	if (dbus_message_is_signal(message, DBUS_INTERFACE_LOCAL, "Disconnected")) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Disconnected");
+		return -1;
+	}
+
+	if (dbus_message_marshal(message, &raw_msg, &raw_msg_len)) {
+		pkth.caplen = pkth.len = raw_msg_len;
+		/* pkth.caplen = min (payload_len, handle->snapshot); */
+
+		gettimeofday(&pkth.ts, NULL);
+		if (handle->fcode.bf_insns == NULL ||
+		    bpf_filter(handle->fcode.bf_insns, (u_char *)raw_msg, pkth.len, pkth.caplen)) {
+			handlep->packets_read++;
+			callback(user, &pkth, (u_char *)raw_msg);
+			count++;
+		}
+
+		dbus_free(raw_msg);
+	}
+	return count;
+}
+
+static int
+dbus_write(pcap_t *handle, const void *buf, size_t size)
+{
+	/* XXX, not tested */
+	struct pcap_dbus *handlep = handle->priv;
+
+	DBusError error = DBUS_ERROR_INIT;
+	DBusMessage *msg;
+
+	if (!(msg = dbus_message_demarshal(buf, size, &error))) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "dbus_message_demarshal() failed: %s", error.message);
+		dbus_error_free(&error);
+		return -1;
+	}
+
+	dbus_connection_send(handlep->conn, msg, NULL);
+	dbus_connection_flush(handlep->conn);
+
+	dbus_message_unref(msg);
+	return 0;
+}                           
+
+static int
+dbus_stats(pcap_t *handle, struct pcap_stat *stats)
+{
+	struct pcap_dbus *handlep = handle->priv;
+
+	stats->ps_recv = handlep->packets_read;
+	stats->ps_drop = 0;
+	stats->ps_ifdrop = 0;
+	return 0;
+}
+
+static void
+dbus_cleanup(pcap_t *handle)
+{
+	struct pcap_dbus *handlep = handle->priv;
+
+	dbus_connection_unref(handlep->conn);
+
+	pcap_cleanup_live_common(handle);
+}
+
+static int
+dbus_activate(pcap_t *handle)
+{
+#define EAVESDROPPING_RULE "eavesdrop=true,"
+
+	static const char *rules[] = {
+		EAVESDROPPING_RULE "type='signal'",
+		EAVESDROPPING_RULE "type='method_call'",
+		EAVESDROPPING_RULE "type='method_return'",
+		EAVESDROPPING_RULE "type='error'",
+	};
+
+	#define N_RULES sizeof(rules)/sizeof(rules[0])
+
+	struct pcap_dbus *handlep = handle->priv;
+	const char *dev = handle->opt.source;
+
+	DBusError error = DBUS_ERROR_INIT;
+	int i;
+
+	if (strcmp(dev, "dbus-system") == 0) {
+		if (!(handlep->conn = dbus_bus_get(DBUS_BUS_SYSTEM, &error))) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Failed to get system bus: %s", error.message);
+			dbus_error_free(&error);
+			return PCAP_ERROR;
+		}
+
+	} else if (strcmp(dev, "dbus-session") == 0) {
+		if (!(handlep->conn = dbus_bus_get(DBUS_BUS_SESSION, &error))) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Failed to get session bus: %s", error.message);
+			dbus_error_free(&error);
+			return PCAP_ERROR;
+		}
+
+	} else if (strncmp(dev, "dbus://", 7) == 0) {
+		const char *addr = dev + 7;
+
+		if (!(handlep->conn = dbus_connection_open(addr, &error))) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Failed to open connection to: %s: %s", addr, error.message);
+			dbus_error_free(&error);
+			return PCAP_ERROR;
+		}
+
+		if (!dbus_bus_register(handlep->conn, &error)) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Failed to register bus %s: %s\n", addr, error.message);
+			dbus_error_free(&error);
+			return PCAP_ERROR;
+		}
+
+	} else {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't get bus address from %s", handle->opt.source);
+		return PCAP_ERROR;
+	}
+
+	/* Initialize some components of the pcap structure. */
+	handle->bufsize = 0;
+	handle->offset = 0;
+	handle->linktype = DLT_DBUS;
+	handle->read_op = dbus_read;
+	handle->inject_op = dbus_write;
+	handle->setfilter_op = install_bpf_program; /* XXX, later add support for dbus_bus_add_match() */
+	handle->setdirection_op = NULL;
+	handle->set_datalink_op = NULL;      /* can't change data link type */
+	handle->getnonblock_op = pcap_getnonblock_fd;
+	handle->setnonblock_op = pcap_setnonblock_fd;
+	handle->stats_op = dbus_stats;
+
+	handle->selectable_fd = handle->fd = -1;
+
+	if (handle->opt.rfmon) {
+		/*
+		 * Monitor mode doesn't apply to dbus connections.
+		 */
+		dbus_cleanup(handle);
+		return PCAP_ERROR_RFMON_NOTSUP;
+	}
+
+	/* dbus_connection_set_max_message_size(handlep->conn, handle->snapshot); */
+	if (handle->opt.buffer_size != 0)
+		dbus_connection_set_max_received_size(handlep->conn, handle->opt.buffer_size);
+
+	for (i = 0; i < N_RULES; i++) {
+		dbus_bus_add_match(handlep->conn, rules[i], &error);
+		if (dbus_error_is_set(&error)) {
+			dbus_error_free(&error);
+
+			/* try without eavesdrop */
+			dbus_bus_add_match(handlep->conn, rules[i] + strlen(EAVESDROPPING_RULE), &error);
+			if (dbus_error_is_set(&error)) {
+				snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Failed to add bus match: %s\n", error.message);
+				dbus_error_free(&error);
+				dbus_cleanup(handle);
+				return PCAP_ERROR;
+			}
+		}
+	}
+
+	return 0;
+}
+
+pcap_t *
+dbus_create(const char *device, char *ebuf, int *is_ours)
+{
+	pcap_t *p;
+
+	if (strcmp(device, "dbus-system") && 
+		strcmp(device, "dbus-session") && 
+		strncmp(device, "dbus://", 7))
+	{
+		*is_ours = 0;
+		return NULL;
+	}
+
+	*is_ours = 1;
+	p = pcap_create_common(device, ebuf, sizeof (struct pcap_dbus));
+	if (p == NULL)
+		return (NULL);
+
+	p->activate_op = dbus_activate;
+	return (p);
+}
+
+int 
+dbus_findalldevs(pcap_if_t **alldevsp, char *err_str)
+{
+	if (pcap_add_if(alldevsp, "dbus-system", 0, "D-Bus system bus", err_str) < 0)
+		return -1;
+	if (pcap_add_if(alldevsp, "dbus-session", 0, "D-Bus session bus", err_str) < 0)
+		return -1;
+	return 0;
+}
+
diff --git a/pcap-dbus.h b/pcap-dbus.h
new file mode 100644
index 0000000..67493cc
--- /dev/null
+++ b/pcap-dbus.h
@@ -0,0 +1,2 @@
+pcap_t *dbus_create(const char *, char *, int *);
+int dbus_findalldevs(pcap_if_t **devlistp, char *errbuf);
diff --git a/pcap-dlpi.c b/pcap-dlpi.c
index 8ea7850..8993134 100644
--- a/pcap-dlpi.c
+++ b/pcap-dlpi.c
@@ -22,7 +22,7 @@
  * University College London, and subsequently modified by
  * Guy Harris (guy@alum.mit.edu), Mark Pizzolato
  * <List-tcpdump-workers@subscriptions.pizzolato.net>,
- * and Mark C. Brown (mbrown@hp.com).
+ * Mark C. Brown (mbrown@hp.com), and Sagun Shakya <Sagun.Shakya@Sun.COM>.
  */
 
 /*
@@ -70,7 +70,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/pcap-dlpi.c,v 1.108.2.7 2006/04/04 05:33:02 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/pcap-dlpi.c,v 1.128 2008-12-02 16:20:23 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -121,6 +121,7 @@
 #endif
 
 #include "pcap-int.h"
+#include "dlpisubs.h"
 
 #ifdef HAVE_OS_PROTO_H
 #include "os-proto.h"
@@ -136,46 +137,23 @@
 
 #define	MAXDLBUF	8192
 
-#ifdef HAVE_SYS_BUFMOD_H
-
-/*
- * Size of a bufmod chunk to pass upstream; that appears to be the biggest
- * value to which you can set it, and setting it to that value (which
- * is bigger than what appears to be the Solaris default of 8192)
- * reduces the number of packet drops.
- */
-#define CHUNKSIZE	65536
-
-/*
- * Size of the buffer to allocate for packet data we read; it must be
- * large enough to hold a chunk.
- */
-#define PKTBUFSIZE	CHUNKSIZE
-
-#else /* HAVE_SYS_BUFMOD_H */
-
-/*
- * Size of the buffer to allocate for packet data we read; this is
- * what the value used to be - there's no particular reason why it
- * should be tied to MAXDLBUF, but we'll leave it as this for now.
- */
-#define PKTBUFSIZE	(MAXDLBUF * sizeof(bpf_u_int32))
-
-#endif
-
 /* Forwards */
 static char *split_dname(char *, int *, char *);
 static int dl_doattach(int, int, char *);
 #ifdef DL_HP_RAWDLS
 static int dl_dohpuxbind(int, char *);
 #endif
-static int dlattachreq(int, bpf_u_int32, char *);
+static int dlpromiscon(pcap_t *, bpf_u_int32);
 static int dlbindreq(int, bpf_u_int32, char *);
 static int dlbindack(int, char *, char *, int *);
-static int dlpromisconreq(int, bpf_u_int32, char *);
 static int dlokack(int, const char *, char *, char *);
 static int dlinforeq(int, char *);
 static int dlinfoack(int, char *, char *);
+
+#ifdef HAVE_DLPI_PASSIVE
+static void dlpassive(int, char *);
+#endif
+
 #ifdef DL_HP_RAWDLS
 static int dlrawdatareq(int, const u_char *, int);
 #endif
@@ -186,9 +164,6 @@
 static char *get_release(bpf_u_int32 *, bpf_u_int32 *, bpf_u_int32 *);
 #endif
 static int send_request(int, char *, int, char *, char *);
-#ifdef HAVE_SYS_BUFMOD_H
-static int strioctl(int, int, int, char *);
-#endif
 #ifdef HAVE_HPUX9
 static int dlpi_kread(int, off_t, void *, u_int, char *);
 #endif
@@ -196,42 +171,6 @@
 static int get_dlpi_ppa(int, const char *, int, char *);
 #endif
 
-static int
-pcap_stats_dlpi(pcap_t *p, struct pcap_stat *ps)
-{
-
-	/*
-	 * "ps_recv" counts packets handed to the filter, not packets
-	 * that passed the filter.  As filtering is done in userland,
-	 * this would not include packets dropped because we ran out
-	 * of buffer space; in order to make this more like other
-	 * platforms (Linux 2.4 and later, BSDs with BPF), where the
-	 * "packets received" count includes packets received but dropped
-	 * due to running out of buffer space, and to keep from confusing
-	 * applications that, for example, compute packet drop percentages,
-	 * we also make it count packets dropped by "bufmod" (otherwise we
-	 * might run the risk of the packet drop count being bigger than
-	 * the received-packet count).
-	 *
-	 * "ps_drop" counts packets dropped by "bufmod" because of
-	 * flow control requirements or resource exhaustion; it doesn't
-	 * count packets dropped by the interface driver, or packets
-	 * dropped upstream.  As filtering is done in userland, it counts
-	 * packets regardless of whether they would've passed the filter.
-	 *
-	 * These statistics don't include packets not yet read from
-	 * the kernel by libpcap, but they may include packets not
-	 * yet read from libpcap by the application.
-	 */
-	*ps = p->md.stat;
-
-	/*
-	 * Add in the drop count, as per the above comment.
-	 */
-	ps->ps_recv += ps->ps_drop;
-	return (0);
-}
-
 /* XXX Needed by HP-UX (at least) */
 static bpf_u_int32 ctlbuf[MAXDLBUF];
 static struct strbuf ctl = {
@@ -240,21 +179,19 @@
 	(char *)ctlbuf
 };
 
+/*
+ * Cast a buffer to "union DL_primitives" without provoking warnings
+ * from the compiler.
+ */
+#define MAKE_DL_PRIMITIVES(ptr)	((union DL_primitives *)(void *)(ptr))
+
 static int
 pcap_read_dlpi(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
 {
-	register int cc, n, caplen, origlen;
-	register u_char *bp, *ep, *pk;
-	register struct bpf_insn *fcode;
-#ifdef HAVE_SYS_BUFMOD_H
-	register struct sb_hdr *sbp;
-#ifdef LBL_ALIGN
-	struct sb_hdr sbhdr;
-#endif
-#endif
+	int cc;
+	u_char *bp;
 	int flags;
 	struct strbuf data;
-	struct pcap_pkthdr pkthdr;
 
 	flags = 0;
 	cc = p->cc;
@@ -302,79 +239,15 @@
 	} else
 		bp = p->bp;
 
-	/* Loop through packets */
-	fcode = p->fcode.bf_insns;
-	ep = bp + cc;
-	n = 0;
-#ifdef HAVE_SYS_BUFMOD_H
-	while (bp < ep) {
-		/*
-		 * Has "pcap_breakloop()" been called?
-		 * If so, return immediately - if we haven't read any
-		 * packets, clear the flag and return -2 to indicate
-		 * that we were told to break out of the loop, otherwise
-		 * leave the flag set, so that the *next* call will break
-		 * out of the loop without having read any packets, and
-		 * return the number of packets we've processed so far.
-		 */
-		if (p->break_loop) {
-			if (n == 0) {
-				p->break_loop = 0;
-				return (-2);
-			} else {
-				p->bp = bp;
-				p->cc = ep - bp;
-				return (n);
-			}
-		}
-#ifdef LBL_ALIGN
-		if ((long)bp & 3) {
-			sbp = &sbhdr;
-			memcpy(sbp, bp, sizeof(*sbp));
-		} else
-#endif
-			sbp = (struct sb_hdr *)bp;
-		p->md.stat.ps_drop = sbp->sbh_drops;
-		pk = bp + sizeof(*sbp);
-		bp += sbp->sbh_totlen;
-		origlen = sbp->sbh_origlen;
-		caplen = sbp->sbh_msglen;
-#else
-		origlen = cc;
-		caplen = min(p->snapshot, cc);
-		pk = bp;
-		bp += caplen;
-#endif
-		++p->md.stat.ps_recv;
-		if (bpf_filter(fcode, pk, origlen, caplen)) {
-#ifdef HAVE_SYS_BUFMOD_H
-			pkthdr.ts.tv_sec = sbp->sbh_timestamp.tv_sec;
-			pkthdr.ts.tv_usec = sbp->sbh_timestamp.tv_usec;
-#else
-			(void)gettimeofday(&pkthdr.ts, NULL);
-#endif
-			pkthdr.len = origlen;
-			pkthdr.caplen = caplen;
-			/* Insure caplen does not exceed snapshot */
-			if (pkthdr.caplen > p->snapshot)
-				pkthdr.caplen = p->snapshot;
-			(*callback)(user, &pkthdr, pk);
-			if (++n >= cnt && cnt >= 0) {
-				p->cc = ep - bp;
-				p->bp = bp;
-				return (n);
-			}
-		}
-#ifdef HAVE_SYS_BUFMOD_H
-	}
-#endif
-	p->cc = 0;
-	return (n);
+	return (pcap_process_pkts(p, callback, user, cnt, bp, cc));
 }
 
 static int
 pcap_inject_dlpi(pcap_t *p, const void *buf, size_t size)
 {
+#ifdef DL_HP_RAWDLS
+	struct pcap_dlpi *pd = p->priv;
+#endif
 	int ret;
 
 #if defined(DLIOCRAW)
@@ -385,12 +258,12 @@
 		return (-1);
 	}
 #elif defined(DL_HP_RAWDLS)
-	if (p->send_fd < 0) {
+	if (pd->send_fd < 0) {
 		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
 		    "send: Output FD couldn't be opened");
 		return (-1);
 	}
-	ret = dlrawdatareq(p->send_fd, buf, size);
+	ret = dlrawdatareq(pd->send_fd, buf, size);
 	if (ret == -1) {
 		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "send: %s",
 		    pcap_strerror(errno));
@@ -449,26 +322,33 @@
 #endif /* HAVE_SOLARIS */
 
 static void
-pcap_close_dlpi(pcap_t *p)
+pcap_cleanup_dlpi(pcap_t *p)
 {
-	pcap_close_common(p);
-	if (p->send_fd >= 0)
-		close(p->send_fd);
+#ifdef DL_HP_RAWDLS
+	struct pcap_dlpi *pd = p->priv;
+
+	if (pd->send_fd >= 0) {
+		close(pd->send_fd);
+		pd->send_fd = -1;
+	}
+#endif
+	pcap_cleanup_live_common(p);
 }
 
-pcap_t *
-pcap_open_live(const char *device, int snaplen, int promisc, int to_ms,
-    char *ebuf)
+static int
+pcap_activate_dlpi(pcap_t *p)
 {
+#ifdef DL_HP_RAWDLS
+	struct pcap_dlpi *pd = p->priv;
+#endif
 	register char *cp;
-	register pcap_t *p;
 	int ppa;
 #ifdef HAVE_SOLARIS
 	int isatm = 0;
 #endif
 	register dl_info_ack_t *infop;
 #ifdef HAVE_SYS_BUFMOD_H
-	bpf_u_int32 ss, chunksize;
+	bpf_u_int32 ss;
 #ifdef HAVE_SOLARIS
 	register char *release;
 	bpf_u_int32 osmajor, osminor, osmicro;
@@ -479,23 +359,15 @@
 #ifndef HAVE_DEV_DLPI
 	char dname2[100];
 #endif
-
-	p = (pcap_t *)malloc(sizeof(*p));
-	if (p == NULL) {
-		strlcpy(ebuf, pcap_strerror(errno), PCAP_ERRBUF_SIZE);
-		return (NULL);
-	}
-	memset(p, 0, sizeof(*p));
-	p->fd = -1;	/* indicate that it hasn't been opened yet */
-	p->send_fd = -1;
+	int status = PCAP_ERROR;
 
 #ifdef HAVE_DEV_DLPI
 	/*
 	** Remove any "/dev/" on the front of the device.
 	*/
-	cp = strrchr(device, '/');
+	cp = strrchr(p->opt.source, '/');
 	if (cp == NULL)
-		strlcpy(dname, device, sizeof(dname));
+		strlcpy(dname, p->opt.source, sizeof(dname));
 	else
 		strlcpy(dname, cp + 1, sizeof(dname));
 
@@ -503,9 +375,11 @@
 	 * Split the device name into a device type name and a unit number;
 	 * chop off the unit number, so "dname" is just a device type name.
 	 */
-	cp = split_dname(dname, &ppa, ebuf);
-	if (cp == NULL)
+	cp = split_dname(dname, &ppa, p->errbuf);
+	if (cp == NULL) {
+		status = PCAP_ERROR_NO_SUCH_DEVICE;
 		goto bad;
+	}
 	*cp = '\0';
 
 	/*
@@ -521,7 +395,9 @@
 	 */
 	cp = "/dev/dlpi";
 	if ((p->fd = open(cp, O_RDWR)) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE,
+		if (errno == EPERM || errno == EACCES)
+			status = PCAP_ERROR_PERM_DENIED;
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
 		    "%s: %s", cp, pcap_strerror(errno));
 		goto bad;
 	}
@@ -532,22 +408,24 @@
 	 * receiving packets on the same descriptor - you need separate
 	 * descriptors for sending and receiving, bound to different SAPs.
 	 *
-	 * If the open fails, we just leave -1 in "p->send_fd" and reject
+	 * If the open fails, we just leave -1 in "pd->send_fd" and reject
 	 * attempts to send packets, just as if, in pcap-bpf.c, we fail
 	 * to open the BPF device for reading and writing, we just try
 	 * to open it for reading only and, if that succeeds, just let
 	 * the send attempts fail.
 	 */
-	p->send_fd = open(cp, O_RDWR);
+	pd->send_fd = open(cp, O_RDWR);
 #endif
 
 	/*
 	 * Get a table of all PPAs for that device, and search that
 	 * table for the specified device type name and unit number.
 	 */
-	ppa = get_dlpi_ppa(p->fd, dname, ppa, ebuf);
-	if (ppa < 0)
+	ppa = get_dlpi_ppa(p->fd, dname, ppa, p->errbuf);
+	if (ppa < 0) {
+		status = ppa;
 		goto bad;
+	}
 #else
 	/*
 	 * If the device name begins with "/", assume it begins with
@@ -555,19 +433,21 @@
 	 * otherwise, concatenate the device directory name and the
 	 * device name.
 	 */
-	if (*device == '/')
-		strlcpy(dname, device, sizeof(dname));
+	if (*p->opt.source == '/')
+		strlcpy(dname, p->opt.source, sizeof(dname));
 	else
 		snprintf(dname, sizeof(dname), "%s/%s", PCAP_DEV_PREFIX,
-		    device);
+		    p->opt.source);
 
 	/*
 	 * Get the unit number, and a pointer to the end of the device
 	 * type name.
 	 */
-	cp = split_dname(dname, &ppa, ebuf);
-	if (cp == NULL)
+	cp = split_dname(dname, &ppa, p->errbuf);
+	if (cp == NULL) {
+		status = PCAP_ERROR_NO_SUCH_DEVICE;
 		goto bad;
+	}
 
 	/*
 	 * Make a copy of the device pathname, and then remove the unit
@@ -579,7 +459,9 @@
 	/* Try device without unit number */
 	if ((p->fd = open(dname, O_RDWR)) < 0) {
 		if (errno != ENOENT) {
-			snprintf(ebuf, PCAP_ERRBUF_SIZE, "%s: %s", dname,
+			if (errno == EPERM || errno == EACCES)
+				status = PCAP_ERROR_PERM_DENIED;
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "%s: %s", dname,
 			    pcap_strerror(errno));
 			goto bad;
 		}
@@ -587,10 +469,18 @@
 		/* Try again with unit number */
 		if ((p->fd = open(dname2, O_RDWR)) < 0) {
 			if (errno == ENOENT) {
+				status = PCAP_ERROR_NO_SUCH_DEVICE;
+
 				/*
-				 * We just report "No DLPI device found"
-				 * with the device name, so people don't
-				 * get confused and think, for example,
+				 * We provide an error message even
+				 * for this error, for diagnostic
+				 * purposes (so that, for example,
+				 * the app can show the message if the
+				 * user requests it).
+				 *
+				 * In it, we just report "No DLPI device
+				 * found" with the device name, so people
+				 * don't get confused and think, for example,
 				 * that if they can't capture on "lo0"
 				 * on Solaris the fix is to change libpcap
 				 * (or the application that uses it) to
@@ -602,10 +492,12 @@
 				 * for the loopback interface is just a
 				 * symptom of that inability.
 				 */
-				snprintf(ebuf, PCAP_ERRBUF_SIZE,
-				    "%s: No DLPI device found", device);
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				    "%s: No DLPI device found", p->opt.source);
 			} else {
-				snprintf(ebuf, PCAP_ERRBUF_SIZE, "%s: %s",
+				if (errno == EPERM || errno == EACCES)
+					status = PCAP_ERROR_PERM_DENIED;
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "%s: %s",
 				    dname2, pcap_strerror(errno));
 			}
 			goto bad;
@@ -615,30 +507,45 @@
 	}
 #endif
 
-	p->snapshot = snaplen;
-
 	/*
 	** Attach if "style 2" provider
 	*/
-	if (dlinforeq(p->fd, ebuf) < 0 ||
-	    dlinfoack(p->fd, (char *)buf, ebuf) < 0)
+	if (dlinforeq(p->fd, p->errbuf) < 0 ||
+	    dlinfoack(p->fd, (char *)buf, p->errbuf) < 0)
 		goto bad;
-	infop = &((union DL_primitives *)buf)->info_ack;
+	infop = &(MAKE_DL_PRIMITIVES(buf))->info_ack;
 #ifdef HAVE_SOLARIS
 	if (infop->dl_mac_type == DL_IPATM)
 		isatm = 1;
 #endif
 	if (infop->dl_provider_style == DL_STYLE2) {
-		if (dl_doattach(p->fd, ppa, ebuf) < 0)
+		status = dl_doattach(p->fd, ppa, p->errbuf);
+		if (status < 0)
 			goto bad;
 #ifdef DL_HP_RAWDLS
-		if (p->send_fd >= 0) {
-			if (dl_doattach(p->send_fd, ppa, ebuf) < 0)
+		if (pd->send_fd >= 0) {
+			if (dl_doattach(pd->send_fd, ppa, p->errbuf) < 0)
 				goto bad;
 		}
 #endif
 	}
 
+	if (p->opt.rfmon) {
+		/*
+		 * This device exists, but we don't support monitor mode
+		 * any platforms that support DLPI.
+		 */
+		status = PCAP_ERROR_RFMON_NOTSUP;
+		goto bad;
+	}
+
+#ifdef HAVE_DLPI_PASSIVE
+	/*
+	 * Enable Passive mode to be able to capture on aggregated link.
+	 * Not supported in all Solaris versions.
+	 */
+	dlpassive(p->fd, p->errbuf);
+#endif
 	/*
 	** Bind (defer if using HP-UX 9 or HP-UX 10.20 or later, totally
 	** skip if using SINIX)
@@ -663,23 +570,23 @@
 	** assume the SAP value in a DLPI bind is an LLC SAP for network
 	** types that use 802.2 LLC).
 	*/
-	if ((dlbindreq(p->fd, 1537, ebuf) < 0 &&
-	     dlbindreq(p->fd, 2, ebuf) < 0) ||
-	     dlbindack(p->fd, (char *)buf, ebuf, NULL) < 0)
+	if ((dlbindreq(p->fd, 1537, p->errbuf) < 0 &&
+	     dlbindreq(p->fd, 2, p->errbuf) < 0) ||
+	     dlbindack(p->fd, (char *)buf, p->errbuf, NULL) < 0)
 		goto bad;
 #elif defined(DL_HP_RAWDLS)
 	/*
 	** HP-UX 10.0x and 10.1x.
 	*/
-	if (dl_dohpuxbind(p->fd, ebuf) < 0)
+	if (dl_dohpuxbind(p->fd, p->errbuf) < 0)
 		goto bad;
-	if (p->send_fd >= 0) {
+	if (pd->send_fd >= 0) {
 		/*
 		** XXX - if this fails, just close send_fd and
 		** set it to -1, so that you can't send but can
 		** still receive?
 		*/
-		if (dl_dohpuxbind(p->send_fd, ebuf) < 0)
+		if (dl_dohpuxbind(pd->send_fd, p->errbuf) < 0)
 			goto bad;
 	}
 #else /* neither AIX nor HP-UX */
@@ -687,8 +594,8 @@
 	** Not Sinix, and neither AIX nor HP-UX - Solaris, and any other
 	** OS using DLPI.
 	**/
-	if (dlbindreq(p->fd, 0, ebuf) < 0 ||
-	    dlbindack(p->fd, (char *)buf, ebuf, NULL) < 0)
+	if (dlbindreq(p->fd, 0, p->errbuf) < 0 ||
+	    dlbindack(p->fd, (char *)buf, p->errbuf, NULL) < 0)
 		goto bad;
 #endif /* AIX vs. HP-UX vs. other */
 #endif /* !HP-UX 9 and !HP-UX 10.20 or later and !SINIX */
@@ -702,19 +609,22 @@
 		** help, and may break things.
 		*/
 		if (strioctl(p->fd, A_PROMISCON_REQ, 0, NULL) < 0) {
-			snprintf(ebuf, PCAP_ERRBUF_SIZE, "A_PROMISCON_REQ: %s",
-			    pcap_strerror(errno));
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+			    "A_PROMISCON_REQ: %s", pcap_strerror(errno));
 			goto bad;
 		}
 	} else
 #endif
-	if (promisc) {
+	if (p->opt.promisc) {
 		/*
 		** Enable promiscuous (not necessary on send FD)
 		*/
-		if (dlpromisconreq(p->fd, DL_PROMISC_PHYS, ebuf) < 0 ||
-		    dlokack(p->fd, "promisc_phys", (char *)buf, ebuf) < 0)
+		status = dlpromiscon(p, DL_PROMISC_PHYS);
+		if (status < 0) {
+			if (status == PCAP_ERROR_PERM_DENIED)
+				status = PCAP_ERROR_PROMISC_PERM_DENIED;
 			goto bad;
+		}
 
 		/*
 		** Try to enable multicast (you would have thought
@@ -722,10 +632,9 @@
 		** HP-UX or SINIX) (Not necessary on send FD)
 		*/
 #if !defined(__hpux) && !defined(sinix)
-		if (dlpromisconreq(p->fd, DL_PROMISC_MULTI, ebuf) < 0 ||
-		    dlokack(p->fd, "promisc_multi", (char *)buf, ebuf) < 0)
-			fprintf(stderr,
-			    "WARNING: DL_PROMISC_MULTI failed (%s)\n", ebuf);
+		status = dlpromiscon(p, DL_PROMISC_MULTI);
+		if (status < 0)
+			status = PCAP_WARNING;
 #endif
 	}
 	/*
@@ -734,21 +643,27 @@
 	** under SINIX) (Not necessary on send FD)
 	*/
 #ifndef sinix
-	if (
-#ifdef __hpux
-	    !promisc &&
+#if defined(__hpux)
+	/* HP-UX - only do this when not in promiscuous mode */
+	if (!p->opt.promisc) {
+#elif defined(HAVE_SOLARIS)
+	/* Solaris - don't do this on SunATM devices */
+	if (!isatm) {
+#else
+	/* Everything else (except for SINIX) - always do this */
+	{
 #endif
-#ifdef HAVE_SOLARIS
-	    !isatm &&
-#endif
-	    (dlpromisconreq(p->fd, DL_PROMISC_SAP, ebuf) < 0 ||
-	    dlokack(p->fd, "promisc_sap", (char *)buf, ebuf) < 0)) {
-		/* Not fatal if promisc since the DL_PROMISC_PHYS worked */
-		if (promisc)
-			fprintf(stderr,
-			    "WARNING: DL_PROMISC_SAP failed (%s)\n", ebuf);
-		else
-			goto bad;
+		status = dlpromiscon(p, DL_PROMISC_SAP);
+		if (status < 0) {
+			/*
+			 * Not fatal, since the DL_PROMISC_PHYS mode worked.
+			 * Report it as a warning, however.
+			 */
+			if (p->opt.promisc)
+				status = PCAP_WARNING;
+			else
+				goto bad;
+		}
 	}
 #endif /* sinix */
 
@@ -757,20 +672,20 @@
 	** promiscuous options.
 	*/
 #if defined(HAVE_HPUX9) || defined(HAVE_HPUX10_20_OR_LATER)
-	if (dl_dohpuxbind(p->fd, ebuf) < 0)
+	if (dl_dohpuxbind(p->fd, p->errbuf) < 0)
 		goto bad;
 	/*
 	** We don't set promiscuous mode on the send FD, but we'll defer
 	** binding it anyway, just to keep the HP-UX 9/10.20 or later
 	** code together.
 	*/
-	if (p->send_fd >= 0) {
+	if (pd->send_fd >= 0) {
 		/*
 		** XXX - if this fails, just close send_fd and
 		** set it to -1, so that you can't send but can
 		** still receive?
 		*/
-		if (dl_dohpuxbind(p->send_fd, ebuf) < 0)
+		if (dl_dohpuxbind(pd->send_fd, p->errbuf) < 0)
 			goto bad;
 	}
 #endif
@@ -780,63 +695,13 @@
 	** XXX - get SAP length and address length as well, for use
 	** when sending packets.
 	*/
-	if (dlinforeq(p->fd, ebuf) < 0 ||
-	    dlinfoack(p->fd, (char *)buf, ebuf) < 0)
+	if (dlinforeq(p->fd, p->errbuf) < 0 ||
+	    dlinfoack(p->fd, (char *)buf, p->errbuf) < 0)
 		goto bad;
 
-	infop = &((union DL_primitives *)buf)->info_ack;
-	switch (infop->dl_mac_type) {
-
-	case DL_CSMACD:
-	case DL_ETHER:
-		p->linktype = DLT_EN10MB;
-		p->offset = 2;
-		/*
-		 * This is (presumably) a real Ethernet capture; give it a
-		 * link-layer-type list with DLT_EN10MB and DLT_DOCSIS, so
-		 * that an application can let you choose it, in case you're
-		 * capturing DOCSIS traffic that a Cisco Cable Modem
-		 * Termination System is putting out onto an Ethernet (it
-		 * doesn't put an Ethernet header onto the wire, it puts raw
-		 * DOCSIS frames out on the wire inside the low-level
-		 * Ethernet framing).
-		 */
-		p->dlt_list = (u_int *) malloc(sizeof(u_int) * 2);
-		/*
-		 * If that fails, just leave the list empty.
-		 */
-		if (p->dlt_list != NULL) {
-			p->dlt_list[0] = DLT_EN10MB;
-			p->dlt_list[1] = DLT_DOCSIS;
-			p->dlt_count = 2;
-		}
-		break;
-
-	case DL_FDDI:
-		p->linktype = DLT_FDDI;
-		p->offset = 3;
-		break;
-
-	case DL_TPR:
-		/*
-		 * XXX - what about DL_TPB?  Is that Token Bus?
-		 */	
-		p->linktype = DLT_IEEE802;
-		p->offset = 2;
-		break;
-
-#ifdef HAVE_SOLARIS
-	case DL_IPATM:
-		p->linktype = DLT_SUNATM;
-		p->offset = 0;	/* works for LANE and LLC encapsulation */
-		break;
-#endif
-
-	default:
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "unknown mac type %lu",
-		    (unsigned long)infop->dl_mac_type);
+	infop = &(MAKE_DL_PRIMITIVES(buf))->info_ack;
+	if (pcap_process_mactype(p, infop->dl_mac_type) != 0)
 		goto bad;
-	}
 
 #ifdef	DLIOCRAW
 	/*
@@ -844,93 +709,56 @@
 	** header.
 	*/
 	if (strioctl(p->fd, DLIOCRAW, 0, NULL) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "DLIOCRAW: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "DLIOCRAW: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
 #endif
 
 #ifdef HAVE_SYS_BUFMOD_H
-	/*
-	** Another non standard call to get the data nicely buffered
-	*/
-	if (ioctl(p->fd, I_PUSH, "bufmod") != 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "I_PUSH bufmod: %s",
-		    pcap_strerror(errno));
-		goto bad;
-	}
+	ss = p->snapshot;
 
 	/*
-	** Now that the bufmod is pushed lets configure it.
-	**
 	** There is a bug in bufmod(7). When dealing with messages of
 	** less than snaplen size it strips data from the beginning not
 	** the end.
 	**
-	** This bug is supposed to be fixed in 5.3.2. Also, there is a
-	** patch available. Ask for bugid 1149065.
+	** This bug is fixed in 5.3.2. Also, there is a patch available.
+	** Ask for bugid 1149065.
 	*/
-	ss = snaplen;
 #ifdef HAVE_SOLARIS
 	release = get_release(&osmajor, &osminor, &osmicro);
 	if (osmajor == 5 && (osminor <= 2 || (osminor == 3 && osmicro < 2)) &&
 	    getenv("BUFMOD_FIXED") == NULL) {
-		fprintf(stderr,
-		"WARNING: bufmod is broken in SunOS %s; ignoring snaplen.\n",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+		"WARNING: bufmod is broken in SunOS %s; ignoring snaplen.",
 		    release);
 		ss = 0;
+		status = PCAP_WARNING;
 	}
 #endif
-	if (ss > 0 &&
-	    strioctl(p->fd, SBIOCSSNAP, sizeof(ss), (char *)&ss) != 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "SBIOCSSNAP: %s",
-		    pcap_strerror(errno));
+
+	/* Push and configure bufmod. */
+	if (pcap_conf_bufmod(p, ss) != 0)
 		goto bad;
-	}
-
-	/*
-	** Set up the bufmod timeout
-	*/
-	if (to_ms != 0) {
-		struct timeval to;
-
-		to.tv_sec = to_ms / 1000;
-		to.tv_usec = (to_ms * 1000) % 1000000;
-		if (strioctl(p->fd, SBIOCSTIME, sizeof(to), (char *)&to) != 0) {
-			snprintf(ebuf, PCAP_ERRBUF_SIZE, "SBIOCSTIME: %s",
-			    pcap_strerror(errno));
-			goto bad;
-		}
-	}
-
-	/*
-	** Set the chunk length.
-	*/
-	chunksize = CHUNKSIZE;
-	if (strioctl(p->fd, SBIOCSCHUNK, sizeof(chunksize), (char *)&chunksize)
-	    != 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "SBIOCSCHUNKP: %s",
-		    pcap_strerror(errno));
-		goto bad;
-	}
 #endif
 
 	/*
 	** As the last operation flush the read side.
 	*/
 	if (ioctl(p->fd, I_FLUSH, FLUSHR) != 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "FLUSHR: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "FLUSHR: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
 
-	/* Allocate data buffer */
-	p->bufsize = PKTBUFSIZE;
-	p->buffer = (u_char *)malloc(p->bufsize + p->offset);
-	if (p->buffer == NULL) {
-		strlcpy(ebuf, pcap_strerror(errno), PCAP_ERRBUF_SIZE);
+	/* Allocate data buffer. */
+	if (pcap_alloc_databuf(p) != 0)
 		goto bad;
-	}
+
+	/* Success - but perhaps with a warning */
+	if (status < 0)
+		status = 0;
 
 	/*
 	 * "p->fd" is an FD for a STREAMS device, so "select()" and
@@ -946,21 +774,12 @@
 	p->getnonblock_op = pcap_getnonblock_fd;
 	p->setnonblock_op = pcap_setnonblock_fd;
 	p->stats_op = pcap_stats_dlpi;
-	p->close_op = pcap_close_dlpi;
+	p->cleanup_op = pcap_cleanup_dlpi;
 
-	return (p);
+	return (status);
 bad:
-	if (p->fd >= 0)
-		close(p->fd);
-	if (p->send_fd >= 0)
-		close(p->send_fd);
-	/*
-	 * Get rid of any link-layer type list we allocated.
-	 */
-	if (p->dlt_list != NULL)
-		free(p->dlt_list);
-	free(p);
-	return (NULL);
+	pcap_cleanup_dlpi(p);
+	return (status);
 }
 
 /*
@@ -1015,11 +834,18 @@
 static int
 dl_doattach(int fd, int ppa, char *ebuf)
 {
+	dl_attach_req_t	req;
 	bpf_u_int32 buf[MAXDLBUF];
+	int err;
 
-	if (dlattachreq(fd, ppa, ebuf) < 0 ||
-	    dlokack(fd, "attach", (char *)buf, ebuf) < 0)
-		return (-1);
+	req.dl_primitive = DL_ATTACH_REQ;
+	req.dl_ppa = ppa;
+	if (send_request(fd, (char *)&req, sizeof(req), "attach", ebuf) < 0)
+		return (PCAP_ERROR);
+
+	err = dlokack(fd, "attach", (char *)buf, ebuf);
+	if (err < 0)
+		return (err);
 	return (0);
 }
 
@@ -1074,6 +900,27 @@
 }
 #endif
 
+#define STRINGIFY(n)	#n
+
+static int
+dlpromiscon(pcap_t *p, bpf_u_int32 level)
+{
+	dl_promiscon_req_t req;
+	bpf_u_int32 buf[MAXDLBUF];
+	int err;
+
+	req.dl_primitive = DL_PROMISCON_REQ;
+	req.dl_level = level;
+	if (send_request(p->fd, (char *)&req, sizeof(req), "promiscon",
+	    p->errbuf) < 0)
+		return (PCAP_ERROR);
+	err = dlokack(p->fd, "promiscon" STRINGIFY(level), (char *)buf,
+	    p->errbuf);
+	if (err < 0)
+		return (err);
+	return (0);
+}
+
 int
 pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
 {
@@ -1159,10 +1006,10 @@
 	if (getmsg(fd, &ctl, (struct strbuf*)NULL, &flags) < 0) {
 		snprintf(ebuf, PCAP_ERRBUF_SIZE, "recv_ack: %s getmsg: %s",
 		    what, pcap_strerror(errno));
-		return (-1);
+		return (PCAP_ERROR);
 	}
 
-	dlp = (union DL_primitives *) ctl.buf;
+	dlp = MAKE_DL_PRIMITIVES(ctl.buf);
 	switch (dlp->dl_primitive) {
 
 	case DL_INFO_ACK:
@@ -1183,27 +1030,34 @@
 			snprintf(ebuf, PCAP_ERRBUF_SIZE,
 			    "recv_ack: %s: UNIX error - %s",
 			    what, pcap_strerror(dlp->error_ack.dl_unix_errno));
+			if (dlp->error_ack.dl_unix_errno == EPERM ||
+			    dlp->error_ack.dl_unix_errno == EACCES)
+				return (PCAP_ERROR_PERM_DENIED);
 			break;
 
 		default:
 			snprintf(ebuf, PCAP_ERRBUF_SIZE, "recv_ack: %s: %s",
 			    what, dlstrerror(dlp->error_ack.dl_errno));
+			if (dlp->error_ack.dl_errno == DL_BADPPA)
+				return (PCAP_ERROR_NO_SUCH_DEVICE);
+			else if (dlp->error_ack.dl_errno == DL_ACCESS)
+				return (PCAP_ERROR_PERM_DENIED);
 			break;
 		}
-		return (-1);
+		return (PCAP_ERROR);
 
 	default:
 		snprintf(ebuf, PCAP_ERRBUF_SIZE,
 		    "recv_ack: %s: Unexpected primitive ack %s",
 		    what, dlprim(dlp->dl_primitive));
-		return (-1);
+		return (PCAP_ERROR);
 	}
 
 	if (ctl.len < size) {
 		snprintf(ebuf, PCAP_ERRBUF_SIZE,
 		    "recv_ack: %s: Ack too small (%d < %d)",
 		    what, ctl.len, size);
-		return (-1);
+		return (PCAP_ERROR);
 	}
 	return (ctl.len);
 }
@@ -1413,17 +1267,6 @@
 }
 
 static int
-dlattachreq(int fd, bpf_u_int32 ppa, char *ebuf)
-{
-	dl_attach_req_t	req;
-
-	req.dl_primitive = DL_ATTACH_REQ;
-	req.dl_ppa = ppa;
-
-	return (send_request(fd, (char *)&req, sizeof(req), "attach", ebuf));
-}
-
-static int
 dlbindreq(int fd, bpf_u_int32 sap, char *ebuf)
 {
 
@@ -1451,17 +1294,6 @@
 }
 
 static int
-dlpromisconreq(int fd, bpf_u_int32 level, char *ebuf)
-{
-	dl_promiscon_req_t req;
-
-	req.dl_primitive = DL_PROMISCON_REQ;
-	req.dl_level = level;
-
-	return (send_request(fd, (char *)&req, sizeof(req), "promiscon", ebuf));
-}
-
-static int
 dlokack(int fd, const char *what, char *bufp, char *ebuf)
 {
 
@@ -1486,6 +1318,24 @@
 	return (recv_ack(fd, DL_INFO_ACK_SIZE, "info", bufp, ebuf, NULL));
 }
 
+#ifdef HAVE_DLPI_PASSIVE
+/*
+ * Enable DLPI passive mode. We do not care if this request fails, as this
+ * indicates the underlying DLPI device does not support link aggregation.
+ */
+static void
+dlpassive(int fd, char *ebuf)
+{
+	dl_passive_req_t req;
+	bpf_u_int32 buf[MAXDLBUF];
+
+	req.dl_primitive = DL_PASSIVE_REQ;
+
+	if (send_request(fd, (char *)&req, sizeof(req), "dlpassive", ebuf) == 0)
+	    (void) dlokack(fd, "dlpassive", (char *)buf, ebuf);
+}
+#endif
+
 #ifdef DL_HP_RAWDLS
 /*
  * There's an ack *if* there's an error.
@@ -1498,7 +1348,7 @@
 	union DL_primitives *dlp;
 	int dlen;
 
-	dlp = (union DL_primitives*) buf;
+	dlp = MAKE_DL_PRIMITIVES(buf);
 
 	dlp->dl_primitive = DL_HP_RAWDATA_REQ;
 	dlen = DL_HP_RAWDATA_REQ_SIZE;
@@ -1522,26 +1372,6 @@
 }
 #endif /* DL_HP_RAWDLS */
 
-#ifdef HAVE_SYS_BUFMOD_H
-static int
-strioctl(int fd, int cmd, int len, char *dp)
-{
-	struct strioctl str;
-	int rc;
-
-	str.ic_cmd = cmd;
-	str.ic_timout = -1;
-	str.ic_len = len;
-	str.ic_dp = dp;
-	rc = ioctl(fd, I_STR, &str);
-
-	if (rc < 0)
-		return (rc);
-	else
-		return (str.ic_len);
-}
-#endif
-
 #if defined(HAVE_SOLARIS) && defined(HAVE_SYS_BUFMOD_H)
 static char *
 get_release(bpf_u_int32 *majorp, bpf_u_int32 *minorp, bpf_u_int32 *microp)
@@ -1631,7 +1461,7 @@
 
 	memset((char *)buf, 0, sizeof(buf));
 	if (send_request(fd, (char *)&req, sizeof(req), "hpppa", ebuf) < 0)
-		return (-1);
+		return (PCAP_ERROR);
 
 	ctl.maxlen = DL_HP_PPA_ACK_SIZE;
 	ctl.len = 0;
@@ -1654,7 +1484,7 @@
 	if (getmsg(fd, &ctl, (struct strbuf *)NULL, &flags) < 0) {
 		snprintf(ebuf, PCAP_ERRBUF_SIZE,
 		    "get_dlpi_ppa: hpppa getmsg: %s", pcap_strerror(errno));
-		return (-1);
+		return (PCAP_ERROR);
 	}
 
 	dlp = (dl_hp_ppa_ack_t *)ctl.buf;
@@ -1662,21 +1492,21 @@
 		snprintf(ebuf, PCAP_ERRBUF_SIZE,
 		    "get_dlpi_ppa: hpppa unexpected primitive ack 0x%x",
 		    (bpf_u_int32)dlp->dl_primitive);
-		return (-1);
+		return (PCAP_ERROR);
 	}
 
 	if (ctl.len < DL_HP_PPA_ACK_SIZE) {
 		snprintf(ebuf, PCAP_ERRBUF_SIZE,
 		    "get_dlpi_ppa: hpppa ack too small (%d < %lu)",
 		     ctl.len, (unsigned long)DL_HP_PPA_ACK_SIZE);
-		return (-1);
+		return (PCAP_ERROR);
 	}
 
 	/* allocate buffer */
 	if ((ppa_data_buf = (char *)malloc(dlp->dl_length)) == NULL) {
 		snprintf(ebuf, PCAP_ERRBUF_SIZE,
 		    "get_dlpi_ppa: hpppa malloc: %s", pcap_strerror(errno));
-		return (-1);
+		return (PCAP_ERROR);
 	}
 	ctl.maxlen = dlp->dl_length;
 	ctl.len = 0;
@@ -1686,14 +1516,14 @@
 		snprintf(ebuf, PCAP_ERRBUF_SIZE,
 		    "get_dlpi_ppa: hpppa getmsg: %s", pcap_strerror(errno));
 		free(ppa_data_buf);
-		return (-1);
+		return (PCAP_ERROR);
 	}
 	if (ctl.len < dlp->dl_length) {
 		snprintf(ebuf, PCAP_ERRBUF_SIZE,
-		    "get_dlpi_ppa: hpppa ack too small (%d < %d)",
-		    ctl.len, dlp->dl_length);
+		    "get_dlpi_ppa: hpppa ack too small (%d < %lu)",
+		    ctl.len, (unsigned long)dlp->dl_length);
 		free(ppa_data_buf);
-		return (-1);
+		return (PCAP_ERROR);
 	}
 
 	ap = (dl_hp_ppa_ack_t *)buf;
@@ -1750,7 +1580,7 @@
 		if (stat(dname, &statbuf) < 0) {
 			snprintf(ebuf, PCAP_ERRBUF_SIZE, "stat: %s: %s",
 			    dname, pcap_strerror(errno));
-			return (-1);
+			return (PCAP_ERROR);
 		}
 		majdev = major(statbuf.st_rdev);
 
@@ -1767,13 +1597,13 @@
 	if (i == ap->dl_count) {
 		snprintf(ebuf, PCAP_ERRBUF_SIZE,
 		    "can't find /dev/dlpi PPA for %s%d", device, unit);
-		return (-1);
+		return (PCAP_ERROR_NO_SUCH_DEVICE);
 	}
 	if (ip->dl_hdw_state == HDW_DEAD) {
 		snprintf(ebuf, PCAP_ERRBUF_SIZE,
 		    "%s%d: hardware state: DOWN\n", device, unit);
 		free(ppa_data_buf);
-		return (-1);
+		return (PCAP_ERROR);
 	}
 	ppa = ip->dl_ppa;
 	free(ppa_data_buf);
@@ -1871,3 +1701,24 @@
 	return (cc);
 }
 #endif
+
+pcap_t *
+pcap_create_interface(const char *device, char *ebuf)
+{
+	pcap_t *p;
+#ifdef DL_HP_RAWDLS
+	struct pcap_dlpi *pd;
+#endif
+
+	p = pcap_create_common(device, ebuf, sizeof (struct pcap_dlpi));
+	if (p == NULL)
+		return (NULL);
+
+#ifdef DL_HP_RAWDLS
+	pd = p->priv;
+	pd->send_fd = -1;	/* it hasn't been opened yet */
+#endif
+
+	p->activate_op = pcap_activate_dlpi;
+	return (p);
+}
diff --git a/pcap-dos.c b/pcap-dos.c
index 0700d6b..cecc73c 100644
--- a/pcap-dos.c
+++ b/pcap-dos.c
@@ -1,11 +1,11 @@
 /*
  *  This file is part of DOS-libpcap
- *  Ported to DOS/DOSX by G. Vanem <giva@bgnett.no>
+ *  Ported to DOS/DOSX by G. Vanem <gvanem@broadpark.no>
  *
  *  pcap-dos.c: Interface to PKTDRVR, NDIS2 and 32-bit pmode
  *              network drivers.
  *
- * @(#) $Header: /tcpdump/master/libpcap/pcap-dos.c,v 1.1.2.1 2005/05/03 18:54:35 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/pcap-dos.c,v 1.7 2008-04-22 17:16:30 guy Exp $ (LBL)
  */
 
 #include <stdio.h>
@@ -97,9 +97,10 @@
 
 static struct device *handle_to_device [20];
 
+static int  pcap_activate_dos (pcap_t *p);
 static int  pcap_read_dos (pcap_t *p, int cnt, pcap_handler callback,
                            u_char *data);
-static void pcap_close_dos (pcap_t *p);
+static void pcap_cleanup_dos (pcap_t *p);
 static int  pcap_stats_dos (pcap_t *p, struct pcap_stat *ps);
 static int  pcap_sendpacket_dos (pcap_t *p, const void *buf, size_t len);
 static int  pcap_setfilter_dos (pcap_t *p, struct bpf_program *fp);
@@ -143,58 +144,73 @@
 }
 
 /*
+ * Private data for capturing on MS-DOS.
+ */
+struct pcap_dos {
+	void (*wait_proc)(void); /*          call proc while waiting */
+	struct pcap_stat stat;
+};
+
+pcap_t *pcap_create_interface (const char *device, char *ebuf)
+{
+	pcap_t *p;
+
+	p = pcap_create_common(device, ebuf, sizeof (struct pcap_dos));
+	if (p == NULL)
+		return (NULL);
+
+	p->activate_op = pcap_activate_dos;
+	return (p);
+}
+
+/*
  * Open MAC-driver with name 'device_name' for live capture of
  * network packets.
  */
-pcap_t *pcap_open_live (const char *device_name, int snaplen, int promisc,
-                        int timeout_ms, char *errbuf)
+static int pcap_activate_dos (pcap_t *pcap)
 { 
-  struct pcap *pcap;
+  struct pcap_dos *pcapd = pcap->priv;
 
-  if (snaplen < ETH_MIN)
-      snaplen = ETH_MIN;
-
-  if (snaplen > ETH_MAX)   /* silently accept and truncate large MTUs */
-      snaplen = ETH_MAX;
-
-  pcap = calloc (sizeof(*pcap), 1);
-  if (!pcap)
-  {
-    strcpy (errbuf, "Not enough memory (pcap)");
-    return (NULL);
+  if (pcap->opt.rfmon) {
+    /*
+     * No monitor mode on DOS.
+     */
+    return (PCAP_ERROR_RFMON_NOTSUP);
   }
 
-  pcap->snapshot          = max (ETH_MIN+8, snaplen);
+  if (pcap->snapshot < ETH_MIN+8)
+      pcap->snapshot = ETH_MIN+8;
+
+  if (pcap->snapshot > ETH_MAX)   /* silently accept and truncate large MTUs */
+      pcap->snapshot = ETH_MAX;
+
   pcap->linktype          = DLT_EN10MB;  /* !! */
-  pcap->inter_packet_wait = timeout_ms;
-  pcap->close_op          = pcap_close_dos;
+  pcap->cleanup_op        = pcap_cleanup_dos;
   pcap->read_op           = pcap_read_dos;
   pcap->stats_op          = pcap_stats_dos;
   pcap->inject_op         = pcap_sendpacket_dos;
   pcap->setfilter_op      = pcap_setfilter_dos;
-	pcap->setdirection_op   = NULL; /* Not implemented.*/
+  pcap->setdirection_op   = NULL; /* Not implemented.*/
   pcap->fd                = ++ref_count;
 
   if (pcap->fd == 1)  /* first time we're called */
   {
-    if (!init_watt32(pcap, device_name, errbuf) ||
-        !first_init(device_name, errbuf, promisc))
+    if (!init_watt32(pcap, pcap->opt.source, pcap->errbuf) ||
+        !first_init(pcap->opt.source, pcap->errbuf, pcap->opt.promisc))
     {
-      free (pcap);
-      return (NULL);
+      return (PCAP_ERROR);
     } 
     atexit (close_driver);
   }
-  else if (stricmp(active_dev->name,device_name))
+  else if (stricmp(active_dev->name,pcap->opt.source))
   {
-    snprintf (errbuf, PCAP_ERRBUF_SIZE,
+    snprintf (pcap->errbuf, PCAP_ERRBUF_SIZE,
               "Cannot use different devices simultaneously "
-              "(`%s' vs. `%s')", active_dev->name, device_name);
-    free (pcap);
-    pcap = NULL;
+              "(`%s' vs. `%s')", active_dev->name, pcap->opt.source);
+    return (PCAP_ERROR);
   }
   handle_to_device [pcap->fd-1] = active_dev;
-  return (pcap);
+  return (0);
 }
 
 /*
@@ -204,16 +220,16 @@
 static int
 pcap_read_one (pcap_t *p, pcap_handler callback, u_char *data)
 {
+  struct pcap_dos *pd = p->priv;
   struct pcap_pkthdr pcap;
-  struct bpf_insn   *fcode = p->fcode.bf_insns;
-  struct timeval     now, expiry;
+  struct timeval     now, expiry = { 0,0 };
   BYTE  *rx_buf;
   int    rx_len = 0;
 
-  if (p->inter_packet_wait > 0)
+  if (p->opt.timeout > 0)
   {
     gettimeofday2 (&now, NULL);
-    expiry.tv_usec = now.tv_usec + 1000UL * p->inter_packet_wait;
+    expiry.tv_usec = now.tv_usec + 1000UL * p->opt.timeout;
     expiry.tv_sec  = now.tv_sec;
     while (expiry.tv_usec >= 1000000L)
     {
@@ -258,7 +274,7 @@
       pcap.len    = rx_len;
 
       if (callback &&
-          (!fcode || bpf_filter(fcode, rx_buf, pcap.len, pcap.caplen)))
+          (!p->fcode.bf_insns || bpf_filter(p->fcode.bf_insns, rx_buf, pcap.len, pcap.caplen)))
       {
         filter_count++;
 
@@ -282,10 +298,10 @@
       return (1);
     }
 
-    /* If not to wait for a packet or pcap_close() called from
+    /* If not to wait for a packet or pcap_cleanup_dos() called from
      * e.g. SIGINT handler, exit loop now.
      */
-    if (p->inter_packet_wait <= 0 || (volatile int)p->fd <= 0)
+    if (p->opt.timeout <= 0 || (volatile int)p->fd <= 0)
        break;
 
     gettimeofday2 (&now, NULL);
@@ -303,7 +319,7 @@
 
   if (rx_len < 0)            /* receive error */
   {
-    p->md.stat.ps_drop++;
+    pd->stat.ps_drop++;
 #ifdef USE_32BIT_DRIVERS
     if (pcap_pkt_debug > 1)
        printk ("pkt-err %s\n", pktInfo.error);
@@ -316,9 +332,10 @@
 static int
 pcap_read_dos (pcap_t *p, int cnt, pcap_handler callback, u_char *data)
 {
+  struct pcap_dos *pd = p->priv;
   int rc, num = 0;
 
-  while (num <= cnt || (cnt < 0))
+  while (num <= cnt || PACKET_COUNT_IS_UNLIMITED(cnt))
   {
     if (p->fd <= 0)
        return (-1);
@@ -338,6 +355,7 @@
 static int pcap_stats_dos (pcap_t *p, struct pcap_stat *ps)
 {
   struct net_device_stats *stats;
+  struct pcap_dos         *pd;
   struct device           *dev = p ? get_device(p->fd) : NULL;
 
   if (!dev)
@@ -354,12 +372,13 @@
 
   FLUSHK();
 
-  p->md.stat.ps_recv   = stats->rx_packets;
-  p->md.stat.ps_drop  += stats->rx_missed_errors;
-  p->md.stat.ps_ifdrop = stats->rx_dropped +  /* queue full */
+  pd = p->priv;
+  pd->stat.ps_recv   = stats->rx_packets;
+  pd->stat.ps_drop  += stats->rx_missed_errors;
+  pd->stat.ps_ifdrop = stats->rx_dropped +  /* queue full */
                          stats->rx_errors;    /* HW errors */
   if (ps)
-     *ps = p->md.stat;
+     *ps = pd->stat;
 
   return (0);
 }
@@ -421,12 +440,15 @@
 /*
  * Close pcap device. Not called for offline captures.
  */
-static void pcap_close_dos (pcap_t *p)
+static void pcap_cleanup_dos (pcap_t *p)
 {
+  struct pcap_dos *pd;
+
   if (p && !exc_occured)
   {
+    pd = p->priv;
     if (pcap_stats(p,NULL) < 0)
-       p->md.stat.ps_drop = 0;
+       pd->stat.ps_drop = 0;
     if (!get_device(p->fd))
        return;
 
@@ -477,7 +499,7 @@
 {
   if (!_watt_is_init)
   {
-    strcpy (errbuf, "pcap_open_offline() or pcap_open_live() must be "
+    strcpy (errbuf, "pcap_open_offline() or pcap_activate() must be "
                     "called first");
     return (-1);
   }
@@ -585,10 +607,12 @@
  */
 void pcap_set_wait (pcap_t *p, void (*yield)(void), int wait)
 {
+  struct pcap_dos *pd;
   if (p)
   {
-    p->wait_proc         = yield;
-    p->inter_packet_wait = wait;
+    pd                   = p->priv;
+    pd->wait_proc        = yield;
+    p->opt.timeout        = wait;
   }
 }
 
@@ -734,13 +758,13 @@
          fprintf (stderr, "Catching signal %d.\n", sig);
   }
   exc_occured = 1;
-  pcap_close_dos (NULL);
+  pcap_cleanup_dos (NULL);
 }
 #endif  /* __DJGPP__ */
 
 
 /*
- * Open the pcap device for the first client calling pcap_open_live()
+ * Open the pcap device for the first client calling pcap_activate()
  */
 static int first_init (const char *name, char *ebuf, int promisc)
 {
@@ -991,7 +1015,7 @@
  * Application config hooks to set various driver parameters.
  */
 
-static struct config_table debug_tab[] = {
+static const struct config_table debug_tab[] = {
             { "PKT.DEBUG",       ARG_ATOI,   &pcap_pkt_debug    },
             { "PKT.VECTOR",      ARG_ATOX_W, NULL               },
             { "NDIS.DEBUG",      ARG_ATOI,   NULL               },
diff --git a/pcap-dos.h b/pcap-dos.h
index c9737ba..f474437 100644
--- a/pcap-dos.h
+++ b/pcap-dos.h
@@ -2,7 +2,7 @@
  * Internal details for libpcap on DOS.
  * 32-bit targets: djgpp, Pharlap or DOS4GW.
  *
- * @(#) $Header: /tcpdump/master/libpcap/pcap-dos.h,v 1.1 2004/12/18 08:52:10 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/pcap-dos.h,v 1.1 2004-12-18 08:52:10 guy Exp $ (LBL)
  */
 
 #ifndef __PCAP_DOS_H
diff --git a/pcap-enet.c b/pcap-enet.c
index a484207..5ad921c 100644
--- a/pcap-enet.c
+++ b/pcap-enet.c
@@ -8,7 +8,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/pcap-enet.c,v 1.8 2003/11/15 23:24:02 guy Exp $";
+    "@(#) $Header: /tcpdump/master/libpcap/pcap-enet.c,v 1.9 2006-10-04 18:09:22 guy Exp $";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -22,7 +22,7 @@
 #include <sys/socket.h>
 
 #include <net/if.h>
-#include <pcap-bpf.h>
+#include <pcap/bpf.h>
 #include <net/enet.h>
 
 #include <netinet/in.h>
diff --git a/pcap-filter.manmisc.in b/pcap-filter.manmisc.in
new file mode 100644
index 0000000..5c11d5c
--- /dev/null
+++ b/pcap-filter.manmisc.in
@@ -0,0 +1,954 @@
+.\" @(#) $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.
+.\" 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-FILTER @MAN_MISC_INFO@ "6 January 2008"
+.SH NAME
+pcap-filter \- packet filter syntax
+.br
+.ad
+.SH DESCRIPTION
+.LP
+.B pcap_compile()
+is used to compile a string into a filter program.
+The resulting filter program can then be applied to
+some stream of packets to determine which packets will be supplied to
+.BR pcap_loop() ,
+.BR pcap_dispatch() ,
+.BR pcap_next() ,
+or
+.BR pcap_next_ex() .
+.LP
+The \fIfilter expression\fP consists of one or more
+.IR primitives .
+Primitives usually consist of an
+.I id
+(name or number) preceded by one or more qualifiers.
+There are three
+different kinds of qualifier:
+.IP \fItype\fP
+.I type
+qualifiers say what kind of thing the id name or number refers to.
+Possible types are
+.BR host ,
+.B net ,
+.B port
+and
+.BR portrange .
+E.g., `host foo', `net 128.3', `port 20', `portrange 6000-6008'.
+If there is no type
+qualifier,
+.B host
+is assumed.
+.IP \fIdir\fP
+.I dir
+qualifiers specify a particular transfer direction to and/or from
+.IR id .
+Possible directions are
+.BR src ,
+.BR dst ,
+.BR "src or dst" ,
+.BR "src and dst" ,
+.BR ra ,
+.BR ta ,
+.BR addr1 ,
+.BR addr2 ,
+.BR addr3 ,
+and
+.BR addr4 .
+E.g., `src foo', `dst net 128.3', `src or dst port ftp-data'.
+If
+there is no dir qualifier,
+.B "src or dst"
+is assumed.
+The
+.BR ra ,
+.BR ta ,
+.BR addr1 ,
+.BR addr2 ,
+.BR addr3 ,
+and
+.B addr4
+qualifiers are only valid for IEEE 802.11 Wireless LAN link layers.
+For some link layers, such as SLIP and the ``cooked'' Linux capture mode
+used for the ``any'' device and for some other device types, the
+.B inbound
+and
+.B outbound
+qualifiers can be used to specify a desired direction.
+.IP \fIproto\fP
+.I proto
+qualifiers restrict the match to a particular protocol.
+Possible
+protos are:
+.BR ether ,
+.BR fddi ,
+.BR tr ,
+.BR wlan ,
+.BR ip ,
+.BR ip6 ,
+.BR arp ,
+.BR rarp ,
+.BR decnet ,
+.B tcp
+and
+.BR udp .
+E.g., `ether src foo', `arp net 128.3', `tcp port 21', `udp portrange
+7000-7009', `wlan addr2 0:2:3:4:5:6'.
+If there is
+no proto qualifier, all protocols consistent with the type are
+assumed.
+E.g., `src foo' means `(ip or arp or rarp) src foo'
+(except the latter is not legal syntax), `net bar' means `(ip or
+arp or rarp) net bar' and `port 53' means `(tcp or udp) port 53'.
+.LP
+[`fddi' is actually an alias for `ether'; the parser treats them
+identically as meaning ``the data link level used on the specified
+network interface.''  FDDI headers contain Ethernet-like source
+and destination addresses, and often contain Ethernet-like packet
+types, so you can filter on these FDDI fields just as with the
+analogous Ethernet fields.
+FDDI headers also contain other fields,
+but you cannot name them explicitly in a filter expression.
+.LP
+Similarly, `tr' and `wlan' are aliases for `ether'; the previous
+paragraph's statements about FDDI headers also apply to Token Ring
+and 802.11 wireless LAN headers.  For 802.11 headers, the destination
+address is the DA field and the source address is the SA field; the
+BSSID, RA, and TA fields aren't tested.]
+.LP
+In addition to the above, there are some special `primitive' keywords
+that don't follow the pattern:
+.BR gateway ,
+.BR broadcast ,
+.BR less ,
+.B greater
+and arithmetic expressions.
+All of these are described below.
+.LP
+More complex filter expressions are built up by using the words
+.BR and ,
+.B or
+and
+.B not
+to combine primitives.
+E.g., `host foo and not port ftp and not port ftp-data'.
+To save typing, identical qualifier lists can be omitted.
+E.g.,
+`tcp dst port ftp or ftp-data or domain' is exactly the same as
+`tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain'.
+.LP
+Allowable primitives are:
+.IP "\fBdst host \fIhost\fR"
+True if the IPv4/v6 destination field of the packet is \fIhost\fP,
+which may be either an address or a name.
+.IP "\fBsrc host \fIhost\fR"
+True if the IPv4/v6 source field of the packet is \fIhost\fP.
+.IP "\fBhost \fIhost\fP"
+True if either the IPv4/v6 source or destination of the packet is \fIhost\fP.
+.IP
+Any of the above host expressions can be prepended with the keywords,
+\fBip\fP, \fBarp\fP, \fBrarp\fP, or \fBip6\fP as in:
+.in +.5i
+.nf
+\fBip host \fIhost\fR
+.fi
+.in -.5i
+which is equivalent to:
+.in +.5i
+.nf
+\fBether proto \fI\\ip\fB and host \fIhost\fR
+.fi
+.in -.5i
+If \fIhost\fR is a name with multiple IP addresses, each address will
+be checked for a match.
+.IP "\fBether dst \fIehost\fP"
+True if the Ethernet destination address is \fIehost\fP.
+\fIEhost\fP
+may be either a name from /etc/ethers or a number (see
+.IR ethers (3N)
+for numeric format).
+.IP "\fBether src \fIehost\fP"
+True if the Ethernet source address is \fIehost\fP.
+.IP "\fBether host \fIehost\fP"
+True if either the Ethernet source or destination address is \fIehost\fP.
+.IP "\fBgateway\fP \fIhost\fP"
+True if the packet used \fIhost\fP as a gateway.
+I.e., the Ethernet
+source or destination address was \fIhost\fP but neither the IP source
+nor the IP destination was \fIhost\fP.
+\fIHost\fP must be a name and
+must be found both by the machine's host-name-to-IP-address resolution
+mechanisms (host name file, DNS, NIS, etc.) and by the machine's
+host-name-to-Ethernet-address resolution mechanism (/etc/ethers, etc.).
+(An equivalent expression is
+.in +.5i
+.nf
+\fBether host \fIehost \fBand not host \fIhost\fR
+.fi
+.in -.5i
+which can be used with either names or numbers for \fIhost / ehost\fP.)
+This syntax does not work in IPv6-enabled configuration at this moment.
+.IP "\fBdst net \fInet\fR"
+True if the IPv4/v6 destination address of the packet has a network
+number of \fInet\fP.
+\fINet\fP may be either a name from the networks database
+(/etc/networks, etc.) or a network number.
+An IPv4 network number can be written as a dotted quad (e.g., 192.168.1.0),
+dotted triple (e.g., 192.168.1), dotted pair (e.g, 172.16), or single
+number (e.g., 10); the netmask is 255.255.255.255 for a dotted quad
+(which means that it's really a host match), 255.255.255.0 for a dotted
+triple, 255.255.0.0 for a dotted pair, or 255.0.0.0 for a single number.
+An IPv6 network number must be written out fully; the netmask is
+ff:ff:ff:ff:ff:ff:ff:ff, so IPv6 "network" matches are really always
+host matches, and a network match requires a netmask length.
+.IP "\fBsrc net \fInet\fR"
+True if the IPv4/v6 source address of the packet has a network
+number of \fInet\fP.
+.IP "\fBnet \fInet\fR"
+True if either the IPv4/v6 source or destination address of the packet has a network
+number of \fInet\fP.
+.IP "\fBnet \fInet\fR \fBmask \fInetmask\fR"
+True if the IPv4 address matches \fInet\fR with the specific \fInetmask\fR.
+May be qualified with \fBsrc\fR or \fBdst\fR.
+Note that this syntax is not valid for IPv6 \fInet\fR.
+.IP "\fBnet \fInet\fR/\fIlen\fR"
+True if the IPv4/v6 address matches \fInet\fR with a netmask \fIlen\fR
+bits wide.
+May be qualified with \fBsrc\fR or \fBdst\fR.
+.IP "\fBdst port \fIport\fR"
+True if the packet is ip/tcp, ip/udp, ip6/tcp or ip6/udp and has a
+destination port value of \fIport\fP.
+The \fIport\fP can be a number or a name used in /etc/services (see
+.IR tcp (4P)
+and
+.IR udp (4P)).
+If a name is used, both the port
+number and protocol are checked.
+If a number or ambiguous name is used,
+only the port number is checked (e.g., \fBdst port 513\fR will print both
+tcp/login traffic and udp/who traffic, and \fBport domain\fR will print
+both tcp/domain and udp/domain traffic).
+.IP "\fBsrc port \fIport\fR"
+True if the packet has a source port value of \fIport\fP.
+.IP "\fBport \fIport\fR"
+True if either the source or destination port of the packet is \fIport\fP.
+.IP "\fBdst portrange \fIport1\fB-\fIport2\fR"
+True if the packet is ip/tcp, ip/udp, ip6/tcp or ip6/udp and has a
+destination port value between \fIport1\fP and \fIport2\fP.
+.I port1
+and
+.I port2
+are interpreted in the same fashion as the
+.I port
+parameter for
+.BR port .
+.IP "\fBsrc portrange \fIport1\fB-\fIport2\fR"
+True if the packet has a source port value between \fIport1\fP and
+\fIport2\fP.
+.IP "\fBportrange \fIport1\fB-\fIport2\fR"
+True if either the source or destination port of the packet is between
+\fIport1\fP and \fIport2\fP.
+.IP
+Any of the above port or port range expressions can be prepended with
+the keywords, \fBtcp\fP or \fBudp\fP, as in:
+.in +.5i
+.nf
+\fBtcp src port \fIport\fR
+.fi
+.in -.5i
+which matches only tcp packets whose source port is \fIport\fP.
+.IP "\fBless \fIlength\fR"
+True if the packet has a length less than or equal to \fIlength\fP.
+This is equivalent to:
+.in +.5i
+.nf
+\fBlen <= \fIlength\fP.
+.fi
+.in -.5i
+.IP "\fBgreater \fIlength\fR"
+True if the packet has a length greater than or equal to \fIlength\fP.
+This is equivalent to:
+.in +.5i
+.nf
+\fBlen >= \fIlength\fP.
+.fi
+.in -.5i
+.IP "\fBip proto \fIprotocol\fR"
+True if the packet is an IPv4 packet (see
+.IR ip (4P))
+of protocol type \fIprotocol\fP.
+\fIProtocol\fP can be a number or one of the names
+\fBicmp\fP, \fBicmp6\fP, \fBigmp\fP, \fBigrp\fP, \fBpim\fP, \fBah\fP,
+\fBesp\fP, \fBvrrp\fP, \fBudp\fP, or \fBtcp\fP.
+Note that the identifiers \fBtcp\fP, \fBudp\fP, and \fBicmp\fP are also
+keywords and must be escaped via backslash (\\), which is \\\\ in the C-shell.
+Note that this primitive does not chase the protocol header chain.
+.IP "\fBip6 proto \fIprotocol\fR"
+True if the packet is an IPv6 packet of protocol type \fIprotocol\fP.
+Note that this primitive does not chase the protocol header chain.
+.IP "\fBproto \fIprotocol\fR"
+True if the packet is an IPv4 or IPv6 packet of protocol type
+\fIprotocol\fP.  Note that this primitive does not chase the protocol
+header chain.
+.IP  "\fBtcp\fR, \fBudp\fR, \fBicmp\fR"
+Abbreviations for:
+.in +.5i
+.nf
+\fBproto \fIp\fR\fB
+.fi
+.in -.5i
+where \fIp\fR is one of the above protocols.
+.IP "\fBip6 protochain \fIprotocol\fR"
+True if the packet is IPv6 packet,
+and contains protocol header with type \fIprotocol\fR
+in its protocol header chain.
+For example,
+.in +.5i
+.nf
+\fBip6 protochain 6\fR
+.fi
+.in -.5i
+matches any IPv6 packet with TCP protocol header in the protocol header chain.
+The packet may contain, for example,
+authentication header, routing header, or hop-by-hop option header,
+between IPv6 header and TCP header.
+The BPF code emitted by this primitive is complex and
+cannot be optimized by the BPF optimizer code, so this can be somewhat
+slow.
+.IP "\fBip protochain \fIprotocol\fR"
+Equivalent to \fBip6 protochain \fIprotocol\fR, but this is for IPv4.
+.IP "\fBprotochain \fIprotocol\fR"
+True if the packet is an IPv4 or IPv6 packet of protocol type
+\fIprotocol\fP.  Note that this primitive chases the protocol
+header chain.
+.IP "\fBether broadcast\fR"
+True if the packet is an Ethernet broadcast packet.
+The \fIether\fP
+keyword is optional.
+.IP "\fBip broadcast\fR"
+True if the packet is an IPv4 broadcast packet.
+It checks for both the all-zeroes and all-ones broadcast conventions,
+and looks up the subnet mask on the interface on which the capture is
+being done.
+.IP
+If the subnet mask of the interface on which the capture is being done
+is not available, either because the interface on which capture is being
+done has no netmask or because the capture is being done on the Linux
+"any" interface, which can capture on more than one interface, this
+check will not work correctly.
+.IP "\fBether multicast\fR"
+True if the packet is an Ethernet multicast packet.
+The \fBether\fP
+keyword is optional.
+This is shorthand for `\fBether[0] & 1 != 0\fP'.
+.IP "\fBip multicast\fR"
+True if the packet is an IPv4 multicast packet.
+.IP "\fBip6 multicast\fR"
+True if the packet is an IPv6 multicast packet.
+.IP  "\fBether proto \fIprotocol\fR"
+True if the packet is of ether type \fIprotocol\fR.
+\fIProtocol\fP can be a number or one of the names
+\fBip\fP, \fBip6\fP, \fBarp\fP, \fBrarp\fP, \fBatalk\fP, \fBaarp\fP,
+\fBdecnet\fP, \fBsca\fP, \fBlat\fP, \fBmopdl\fP, \fBmoprc\fP,
+\fBiso\fP, \fBstp\fP, \fBipx\fP, or \fBnetbeui\fP.
+Note these identifiers are also keywords
+and must be escaped via backslash (\\).
+.IP
+[In the case of FDDI (e.g., `\fBfddi protocol arp\fR'), Token Ring
+(e.g., `\fBtr protocol arp\fR'), and IEEE 802.11 wireless LANS (e.g.,
+`\fBwlan protocol arp\fR'), for most of those protocols, the
+protocol identification comes from the 802.2 Logical Link Control (LLC)
+header, which is usually layered on top of the FDDI, Token Ring, or
+802.11 header.
+.IP
+When filtering for most protocol identifiers on FDDI, Token Ring, or
+802.11, the filter checks only the protocol ID field of an LLC header
+in so-called SNAP format with an Organizational Unit Identifier (OUI) of
+0x000000, for encapsulated Ethernet; it doesn't check whether the packet
+is in SNAP format with an OUI of 0x000000.
+The exceptions are:
+.RS
+.TP
+\fBiso\fP
+the filter checks the DSAP (Destination Service Access Point) and
+SSAP (Source Service Access Point) fields of the LLC header;
+.TP
+\fBstp\fP and \fBnetbeui\fP
+the filter checks the DSAP of the LLC header;
+.TP
+\fBatalk\fP
+the filter checks for a SNAP-format packet with an OUI of 0x080007
+and the AppleTalk etype.
+.RE
+.IP
+In the case of Ethernet, the filter checks the Ethernet type field
+for most of those protocols.  The exceptions are:
+.RS
+.TP
+\fBiso\fP, \fBstp\fP, and \fBnetbeui\fP
+the filter checks for an 802.3 frame and then checks the LLC header as
+it does for FDDI, Token Ring, and 802.11;
+.TP
+\fBatalk\fP
+the filter checks both for the AppleTalk etype in an Ethernet frame and
+for a SNAP-format packet as it does for FDDI, Token Ring, and 802.11;
+.TP
+\fBaarp\fP
+the filter checks for the AppleTalk ARP etype in either an Ethernet
+frame or an 802.2 SNAP frame with an OUI of 0x000000;
+.TP
+\fBipx\fP
+the filter checks for the IPX etype in an Ethernet frame, the IPX
+DSAP in the LLC header, the 802.3-with-no-LLC-header encapsulation of
+IPX, and the IPX etype in a SNAP frame.
+.RE
+.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
+\fBether proto \fIp\fR
+.fi
+.in -.5i
+where \fIp\fR is one of the above protocols.
+.IP "\fBlat\fR, \fBmoprc\fR, \fBmopdl\fR"
+Abbreviations for:
+.in +.5i
+.nf
+\fBether proto \fIp\fR
+.fi
+.in -.5i
+where \fIp\fR is one of the above protocols.
+Note that not all applications using
+.BR pcap (3PCAP)
+currently know how to parse these protocols.
+.IP "\fBdecnet src \fIhost\fR"
+True if the DECNET source address is
+.IR host ,
+which may be an address of the form ``10.123'', or a DECNET host
+name.
+[DECNET host name support is only available on ULTRIX systems
+that are configured to run DECNET.]
+.IP "\fBdecnet dst \fIhost\fR"
+True if the DECNET destination address is
+.IR host .
+.IP "\fBdecnet host \fIhost\fR"
+True if either the DECNET source or destination address is
+.IR host .
+.IP "\fBifname \fIinterface\fR"
+True if the packet was logged as coming from the specified interface (applies
+only to packets logged by OpenBSD's or FreeBSD's
+.BR pf (4)).
+.IP "\fBon \fIinterface\fR"
+Synonymous with the
+.B ifname
+modifier.
+.IP "\fBrnr \fInum\fR"
+True if the packet was logged as matching the specified PF rule number
+(applies only to packets logged by OpenBSD's or FreeBSD's
+.BR pf (4)).
+.IP "\fBrulenum \fInum\fR"
+Synonymous with the
+.B rnr
+modifier.
+.IP "\fBreason \fIcode\fR"
+True if the packet was logged with the specified PF reason code.  The known
+codes are:
+.BR match ,
+.BR bad-offset ,
+.BR fragment ,
+.BR short ,
+.BR normalize ,
+and
+.B memory
+(applies only to packets logged by OpenBSD's or FreeBSD's
+.BR pf (4)).
+.IP "\fBrset \fIname\fR"
+True if the packet was logged as matching the specified PF ruleset
+name of an anchored ruleset (applies only to packets logged by OpenBSD's
+or FreeBSD's
+.BR pf (4)).
+.IP "\fBruleset \fIname\fR"
+Synonomous with the
+.B rset
+modifier.
+.IP "\fBsrnr \fInum\fR"
+True if the packet was logged as matching the specified PF rule number
+of an anchored ruleset (applies only to packets logged by OpenBSD's or
+FreeBSD's
+.BR pf (4)).
+.IP "\fBsubrulenum \fInum\fR"
+Synonomous with the
+.B srnr
+modifier.
+.IP "\fBaction \fIact\fR"
+True if PF took the specified action when the packet was logged.  Known actions
+are:
+.B pass
+and
+.B block
+and, with later versions of
+.BR pf (4)),
+.BR nat ,
+.BR rdr ,
+.B binat
+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 .
+.IP "\fBwlan addr2 \fIehost\fR"
+True if the second IEEE 802.11 address, if present, is
+.IR ehost .
+The second address field is used in all frames except for CTS (Clear To
+Send) and ACK (Acknowledgment) control frames.
+.IP "\fBwlan addr3 \fIehost\fR"
+True if the third IEEE 802.11 address, if present, is
+.IR ehost .
+The third address field is used in management and data frames, but not
+in control frames.
+.IP "\fBwlan addr4 \fIehost\fR"
+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 "\fBtype \fIwlan_type\fR"
+True if the IEEE 802.11 frame type matches the specified \fIwlan_type\fR.
+Valid \fIwlan_type\fRs are:
+\fBmgt\fP,
+\fBctl\fP
+and \fBdata\fP.
+.IP "\fBtype \fIwlan_type \fBsubtype \fIwlan_subtype\fR"
+True if the IEEE 802.11 frame type matches the specified \fIwlan_type\fR
+and frame subtype matches the specified \fIwlan_subtype\fR.
+.IP
+If the specified \fIwlan_type\fR is \fBmgt\fP,
+then valid \fIwlan_subtype\fRs are:
+\fBassoc-req\fP,
+\fBassoc-resp\fP,
+\fBreassoc-req\fP,
+\fBreassoc-resp\fP,
+\fBprobe-req\fP,
+\fBprobe-resp\fP,
+\fBbeacon\fP,
+\fBatim\fP,
+\fBdisassoc\fP,
+\fBauth\fP and
+\fBdeauth\fP.
+.IP
+If the specified \fIwlan_type\fR is \fBctl\fP,
+then valid \fIwlan_subtype\fRs are:
+\fBps-poll\fP,
+\fBrts\fP,
+\fBcts\fP,
+\fBack\fP,
+\fBcf-end\fP and
+\fBcf-end-ack\fP.
+.IP
+If the specified \fIwlan_type\fR is \fBdata\fP,
+then valid \fIwlan_subtype\fRs are:
+\fBdata\fP,
+\fBdata-cf-ack\fP,
+\fBdata-cf-poll\fP,
+\fBdata-cf-ack-poll\fP,
+\fBnull\fP,
+\fBcf-ack\fP,
+\fBcf-poll\fP,
+\fBcf-ack-poll\fP,
+\fBqos-data\fP,
+\fBqos-data-cf-ack\fP,
+\fBqos-data-cf-poll\fP,
+\fBqos-data-cf-ack-poll\fP,
+\fBqos\fP,
+\fBqos-cf-poll\fP and
+\fBqos-cf-ack-poll\fP.
+.IP "\fBsubtype \fIwlan_subtype\fR"
+True if the IEEE 802.11 frame subtype matches the specified \fIwlan_subtype\fR
+and frame has the type to which the specified \fIwlan_subtype\fR belongs.
+.IP "\fBdir \fIdir\fR"
+True if the IEEE 802.11 frame direction matches the specified
+.IR dir .
+Valid directions are:
+.BR nods ,
+.BR tods ,
+.BR fromds ,
+.BR dstods ,
+or a numeric value.
+.IP "\fBvlan \fI[vlan_id]\fR"
+True if the packet is an IEEE 802.1Q VLAN packet.
+If \fI[vlan_id]\fR is specified, only true if the packet has the specified
+\fIvlan_id\fR.
+Note that the first \fBvlan\fR keyword encountered in \fIexpression\fR
+changes the decoding offsets for the remainder of \fIexpression\fR on
+the assumption that the packet is a VLAN packet.  The \fBvlan
+\fI[vlan_id]\fR expression may be used more than once, to filter on VLAN
+hierarchies.  Each use of that expression increments the filter offsets
+by 4.
+.IP
+For example:
+.in +.5i
+.nf
+\fBvlan 100 && vlan 200\fR
+.fi
+.in -.5i
+filters on VLAN 200 encapsulated within VLAN 100, and
+.in +.5i
+.nf
+\fBvlan && vlan 300 && ip\fR
+.fi
+.in -.5i
+filters IPv4 protocols encapsulated in VLAN 300 encapsulated within any
+higher order VLAN.
+.IP "\fBmpls \fI[label_num]\fR"
+True if the packet is an MPLS packet.
+If \fI[label_num]\fR is specified, only true is the packet has the specified
+\fIlabel_num\fR.
+Note that the first \fBmpls\fR keyword encountered in \fIexpression\fR
+changes the decoding offsets for the remainder of \fIexpression\fR on
+the assumption that the packet is a MPLS-encapsulated IP packet.  The
+\fBmpls \fI[label_num]\fR expression may be used more than once, to
+filter on MPLS hierarchies.  Each use of that expression increments the
+filter offsets by 4. 
+.IP
+For example:
+.in +.5i
+.nf
+\fBmpls 100000 && mpls 1024\fR
+.fi
+.in -.5i
+filters packets with an outer label of 100000 and an inner label of
+1024, and
+.in +.5i
+.nf
+\fBmpls && mpls 1024 && host 192.9.200.1\fR
+.fi
+.in -.5i
+filters packets to or from 192.9.200.1 with an inner label of 1024 and
+any outer label.
+.IP \fBpppoed\fP
+True if the packet is a PPP-over-Ethernet Discovery packet (Ethernet
+type 0x8863).
+.IP "\fBpppoes \fI[session_id]\fR"
+True if the packet is a PPP-over-Ethernet Session packet (Ethernet
+type 0x8864).
+If \fI[session_id]\fR is specified, only true if the packet has the specified
+\fIsession_id\fR.
+Note that the first \fBpppoes\fR keyword encountered in \fIexpression\fR
+changes the decoding offsets for the remainder of \fIexpression\fR on
+the assumption that the packet is a PPPoE session packet.
+.IP
+For example:
+.in +.5i
+.nf
+\fBpppoes 0x27 && ip\fR
+.fi
+.in -.5i
+filters IPv4 protocols encapsulated in PPPoE session id 0x27.
+.IP "\fBiso proto \fIprotocol\fR"
+True if the packet is an OSI packet of protocol type \fIprotocol\fP.
+\fIProtocol\fP can be a number or one of the names
+\fBclnp\fP, \fBesis\fP, or \fBisis\fP.
+.IP "\fBclnp\fR, \fBesis\fR, \fBisis\fR"
+Abbreviations for:
+.in +.5i
+.nf
+\fBiso proto \fIp\fR
+.fi
+.in -.5i
+where \fIp\fR is one of the above protocols.
+.IP "\fBl1\fR, \fBl2\fR, \fBiih\fR, \fBlsp\fR, \fBsnp\fR, \fBcsnp\fR, \fBpsnp\fR"
+Abbreviations for IS-IS PDU types.
+.IP "\fBvpi\fP \fIn\fR"
+True if the packet is an ATM packet, for SunATM on Solaris, with a
+virtual path identifier of
+.IR n .
+.IP "\fBvci\fP \fIn\fR"
+True if the packet is an ATM packet, for SunATM on Solaris, with a
+virtual channel identifier of
+.IR n .
+.IP \fBlane\fP
+True if the packet is an ATM packet, for SunATM on Solaris, and is
+an ATM LANE packet.
+Note that the first \fBlane\fR keyword encountered in \fIexpression\fR
+changes the tests done in the remainder of \fIexpression\fR
+on the assumption that the packet is either a LANE emulated Ethernet
+packet or a LANE LE Control packet.  If \fBlane\fR isn't specified, the
+tests are done under the assumption that the packet is an
+LLC-encapsulated packet.
+.IP \fBllc\fP
+True if the packet is an ATM packet, for SunATM on Solaris, and is
+an LLC-encapsulated packet.
+.IP \fBoamf4s\fP
+True if the packet is an ATM packet, for SunATM on Solaris, and is
+a segment OAM F4 flow cell (VPI=0 & VCI=3).
+.IP \fBoamf4e\fP
+True if the packet is an ATM packet, for SunATM on Solaris, and is
+an end-to-end OAM F4 flow cell (VPI=0 & VCI=4).
+.IP \fBoamf4\fP
+True if the packet is an ATM packet, for SunATM on Solaris, and is
+a segment or end-to-end OAM F4 flow cell (VPI=0 & (VCI=3 | VCI=4)).
+.IP \fBoam\fP
+True if the packet is an ATM packet, for SunATM on Solaris, and is
+a segment or end-to-end OAM F4 flow cell (VPI=0 & (VCI=3 | VCI=4)).
+.IP \fBmetac\fP
+True if the packet is an ATM packet, for SunATM on Solaris, and is
+on a meta signaling circuit (VPI=0 & VCI=1).
+.IP \fBbcc\fP
+True if the packet is an ATM packet, for SunATM on Solaris, and is
+on a broadcast signaling circuit (VPI=0 & VCI=2).
+.IP \fBsc\fP
+True if the packet is an ATM packet, for SunATM on Solaris, and is
+on a signaling circuit (VPI=0 & VCI=5).
+.IP \fBilmic\fP
+True if the packet is an ATM packet, for SunATM on Solaris, and is
+on an ILMI circuit (VPI=0 & VCI=16).
+.IP \fBconnectmsg\fP
+True if the packet is an ATM packet, for SunATM on Solaris, and is
+on a signaling circuit and is a Q.2931 Setup, Call Proceeding, Connect,
+Connect Ack, Release, or Release Done message.
+.IP \fBmetaconnect\fP
+True if the packet is an ATM packet, for SunATM on Solaris, and is
+on a meta signaling circuit and is a Q.2931 Setup, Call Proceeding, Connect,
+Release, or Release Done message.
+.IP  "\fIexpr relop expr\fR"
+True if the relation holds, where \fIrelop\fR is one of >, <, >=, <=, =,
+!=, and \fIexpr\fR is an arithmetic expression composed of integer
+constants (expressed in standard C syntax), the normal binary operators
+[+, -, *, /, &, |, <<, >>], a length operator, and special packet data
+accessors.  Note that all comparisons are unsigned, so that, for example,
+0x80000000 and 0xffffffff are > 0.
+To access
+data inside the packet, use the following syntax:
+.in +.5i
+.nf
+\fIproto\fB [ \fIexpr\fB : \fIsize\fB ]\fR
+.fi
+.in -.5i
+\fIProto\fR is one of \fBether, fddi, tr, wlan, ppp, slip, link,
+ip, arp, rarp, tcp, udp, icmp, ip6\fR or \fBradio\fR, and
+indicates the protocol layer for the index operation.
+(\fBether, fddi, wlan, tr, ppp, slip\fR and \fBlink\fR all refer to the
+link layer. \fBradio\fR refers to the "radio header" added to some
+802.11 captures.)
+Note that \fItcp, udp\fR and other upper-layer protocol types only
+apply to IPv4, not IPv6 (this will be fixed in the future).
+The byte offset, relative to the indicated protocol layer, is
+given by \fIexpr\fR.
+\fISize\fR is optional and indicates the number of bytes in the
+field of interest; it can be either one, two, or four, and defaults to one.
+The length operator, indicated by the keyword \fBlen\fP, gives the
+length of the packet.
+
+For example, `\fBether[0] & 1 != 0\fP' catches all multicast traffic.
+The expression `\fBip[0] & 0xf != 5\fP'
+catches all IPv4 packets with options.
+The expression
+`\fBip[6:2] & 0x1fff = 0\fP'
+catches only unfragmented IPv4 datagrams and frag zero of fragmented
+IPv4 datagrams.
+This check is implicitly applied to the \fBtcp\fP and \fBudp\fP
+index operations.
+For instance, \fBtcp[0]\fP always means the first
+byte of the TCP \fIheader\fP, and never means the first byte of an
+intervening fragment.
+
+Some offsets and field values may be expressed as names rather than
+as numeric values.
+The following protocol header field offsets are
+available: \fBicmptype\fP (ICMP type field), \fBicmpcode\fP (ICMP
+code field), and \fBtcpflags\fP (TCP flags field).
+
+The following ICMP type field values are available: \fBicmp-echoreply\fP,
+\fBicmp-unreach\fP, \fBicmp-sourcequench\fP, \fBicmp-redirect\fP,
+\fBicmp-echo\fP, \fBicmp-routeradvert\fP, \fBicmp-routersolicit\fP,
+\fBicmp-timxceed\fP, \fBicmp-paramprob\fP, \fBicmp-tstamp\fP,
+\fBicmp-tstampreply\fP, \fBicmp-ireq\fP, \fBicmp-ireqreply\fP,
+\fBicmp-maskreq\fP, \fBicmp-maskreply\fP.
+
+The following TCP flags field values are available: \fBtcp-fin\fP,
+\fBtcp-syn\fP, \fBtcp-rst\fP, \fBtcp-push\fP,
+\fBtcp-ack\fP, \fBtcp-urg\fP.
+.LP
+Primitives may be combined using:
+.IP
+A parenthesized group of primitives and operators
+(parentheses are special to the Shell and must be escaped).
+.IP
+Negation (`\fB!\fP' or `\fBnot\fP').
+.IP
+Concatenation (`\fB&&\fP' or `\fBand\fP').
+.IP
+Alternation (`\fB||\fP' or `\fBor\fP').
+.LP
+Negation has highest precedence.
+Alternation and concatenation have equal precedence and associate
+left to right.
+Note that explicit \fBand\fR tokens, not juxtaposition,
+are now required for concatenation.
+.LP
+If an identifier is given without a keyword, the most recent keyword
+is assumed.
+For example,
+.in +.5i
+.nf
+\fBnot host vs and ace\fR
+.fi
+.in -.5i
+is short for
+.in +.5i
+.nf
+\fBnot host vs and host ace\fR
+.fi
+.in -.5i
+which should not be confused with
+.in +.5i
+.nf
+\fBnot ( host vs or ace )\fR
+.fi
+.in -.5i
+.SH EXAMPLES
+.LP
+To select all packets arriving at or departing from \fIsundown\fP:
+.RS
+.nf
+\fBhost sundown\fP
+.fi
+.RE
+.LP
+To select traffic between \fIhelios\fR and either \fIhot\fR or \fIace\fR:
+.RS
+.nf
+\fBhost helios and \\( hot or ace \\)\fP
+.fi
+.RE
+.LP
+To select all IP packets between \fIace\fR and any host except \fIhelios\fR:
+.RS
+.nf
+\fBip host ace and not helios\fP
+.fi
+.RE
+.LP
+To select all traffic between local hosts and hosts at Berkeley:
+.RS
+.nf
+.B
+net ucb-ether
+.fi
+.RE
+.LP
+To select all ftp traffic through internet gateway \fIsnup\fP:
+.RS
+.nf
+.B
+gateway snup and (port ftp or ftp-data)
+.fi
+.RE
+.LP
+To select traffic neither sourced from nor destined for local hosts
+(if you gateway to one other net, this stuff should never make it
+onto your local net).
+.RS
+.nf
+.B
+ip and not net \fIlocalnet\fP
+.fi
+.RE
+.LP
+To select the start and end packets (the SYN and FIN packets) of each
+TCP conversation that involves a non-local host.
+.RS
+.nf
+.B
+tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net \fIlocalnet\fP
+.fi
+.RE
+.LP
+To select all IPv4 HTTP packets to and from port 80, i.e. print only
+packets that contain data, not, for example, SYN and FIN packets and
+ACK-only packets.  (IPv6 is left as an exercise for the reader.)
+.RS
+.nf
+.B
+tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)
+.fi
+.RE
+.LP
+To select IP packets longer than 576 bytes sent through gateway \fIsnup\fP:
+.RS
+.nf
+.B
+gateway snup and ip[2:2] > 576
+.fi
+.RE
+.LP
+To select IP broadcast or multicast packets that were
+.I not
+sent via Ethernet broadcast or multicast:
+.RS
+.nf
+.B
+ether[0] & 1 = 0 and ip[16] >= 224
+.fi
+.RE
+.LP
+To select all ICMP packets that are not echo requests/replies (i.e., not
+ping packets):
+.RS
+.nf
+.B
+icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply
+.fi
+.RE
+.SH "SEE ALSO"
+pcap(3PCAP)
+.SH BUGS
+Please send problems, bugs, questions, desirable enhancements, etc. to:
+.LP
+.RS
+tcpdump-workers@lists.tcpdump.org
+.RE
+.LP
+Filter expressions on fields other than those in Token Ring headers will
+not correctly handle source-routed Token Ring packets.
+.LP
+Filter expressions on fields other than those in 802.11 headers will not
+correctly handle 802.11 data packets with both To DS and From DS set.
+.LP
+.BR "ip6 proto"
+should chase header chain, but at this moment it does not.
+.BR "ip6 protochain"
+is supplied for this behavior.
+.LP
+Arithmetic expression against transport layer headers, like \fBtcp[0]\fP,
+does not work against IPv6 packets.
+It only looks at IPv4 packets.
diff --git a/pcap-int.h b/pcap-int.h
index 3071c77..0c27ec7 100644
--- a/pcap-int.h
+++ b/pcap-int.h
@@ -30,20 +30,21 @@
  * 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.68.2.11 2007/06/22 06:43:58 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
-#define pcap_int_h
+#define	pcap_int_h
+
+#include <pcap/pcap.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#include <pcap.h>
-
 #ifdef WIN32
 #include <Packet32.h>
+extern CRITICAL_SECTION g_PcapCompileCriticalSection;
 #endif /* WIN32 */
 
 #ifdef MSDOS
@@ -51,6 +52,23 @@
 #include <io.h>
 #endif
 
+#if (defined(_MSC_VER) && (_MSC_VER <= 1200)) /* we are compiling with Visual Studio 6, that doesn't support the LL suffix*/
+
+/*
+ * Swap byte ordering of unsigned long long timestamp on a big endian
+ * machine.
+ */
+#define SWAPLL(ull)  ((ull & 0xff00000000000000) >> 56) | \
+                      ((ull & 0x00ff000000000000) >> 40) | \
+                      ((ull & 0x0000ff0000000000) >> 24) | \
+                      ((ull & 0x000000ff00000000) >> 8)  | \
+                      ((ull & 0x00000000ff000000) << 8)  | \
+                      ((ull & 0x0000000000ff0000) << 24) | \
+                      ((ull & 0x000000000000ff00) << 40) | \
+                      ((ull & 0x00000000000000ff) << 56)
+
+#else /* A recent Visual studio compiler or not VC */
+
 /*
  * Swap byte ordering of unsigned long long timestamp on a big endian
  * machine.
@@ -64,106 +82,60 @@
                       ((ull & 0x000000000000ff00LL) << 40) | \
                       ((ull & 0x00000000000000ffLL) << 56)
 
-/*
- * Savefile
- */
-typedef enum {
-	NOT_SWAPPED,
-	SWAPPED,
-	MAYBE_SWAPPED
-} swapped_type_t;
+#endif /* _MSC_VER */
 
-struct pcap_sf {
-	FILE *rfile;
-	int swapped;
-	int hdrsize;
-	swapped_type_t lengths_swapped;
-	int version_major;
-	int version_minor;
-	u_char *base;
+struct pcap_opt {
+	char	*source;
+	int	timeout;	/* timeout for buffering */
+	int	buffer_size;
+	int	promisc;
+	int	rfmon;		/* monitor mode */
+	int	immediate;	/* immediate mode - deliver packets as soon as they arrive */
+	int	tstamp_type;
+	int	tstamp_precision;
 };
 
-struct pcap_md {
-	struct pcap_stat stat;
-	/*XXX*/
-	int use_bpf;		/* using kernel filter */
-	u_long	TotPkts;	/* can't oflow for 79 hrs on ether */
-	u_long	TotAccepted;	/* count accepted by filter */
-	u_long	TotDrops;	/* count of dropped packets */
-	long	TotMissed;	/* missed by i/f during this run */
-	long	OrigMissed;	/* missed by i/f before this run */
-	char	*device;	/* device name */
-#ifdef linux
-	int	sock_packet;	/* using Linux 2.0 compatible interface */
-	int	timeout;	/* timeout specified to pcap_open_live */
-	int	clear_promisc;	/* must clear promiscuous mode when we close */
-	int	cooked;		/* using SOCK_DGRAM rather than SOCK_RAW */
-	int	ifindex;	/* interface index of device we're bound to */
-	int	lo_ifindex;	/* interface index of the loopback device */
-	struct pcap *next;	/* list of open promiscuous sock_packet pcaps */
-	u_int	packets_read;	/* count of packets read with recvfrom() */
+typedef int	(*activate_op_t)(pcap_t *);
+typedef int	(*can_set_rfmon_op_t)(pcap_t *);
+typedef int	(*read_op_t)(pcap_t *, int cnt, pcap_handler, u_char *);
+typedef int	(*inject_op_t)(pcap_t *, const void *, size_t);
+typedef int	(*setfilter_op_t)(pcap_t *, struct bpf_program *);
+typedef int	(*setdirection_op_t)(pcap_t *, pcap_direction_t);
+typedef int	(*set_datalink_op_t)(pcap_t *, int);
+typedef int	(*getnonblock_op_t)(pcap_t *, char *);
+typedef int	(*setnonblock_op_t)(pcap_t *, int, char *);
+typedef int	(*stats_op_t)(pcap_t *, struct pcap_stat *);
+#ifdef WIN32
+typedef int	(*setbuff_op_t)(pcap_t *, int);
+typedef int	(*setmode_op_t)(pcap_t *, int);
+typedef int	(*setmintocopy_op_t)(pcap_t *, int);
+typedef Adapter *(*getadapter_op_t)(pcap_t *);
 #endif
-
-#ifdef HAVE_DAG_API
-#ifdef HAVE_DAG_STREAMS_API
-	u_char	*dag_mem_bottom;	/* DAG card current memory bottom pointer */
-	u_char	*dag_mem_top;	/* DAG card current memory top pointer */
-#else
-	void	*dag_mem_base;	/* DAG card memory base address */
-	u_int	dag_mem_bottom;	/* DAG card current memory bottom offset */
-	u_int	dag_mem_top;	/* DAG card current memory top offset */
-#endif /* HAVE_DAG_STREAMS_API */
-	int	dag_fcs_bits;	/* Number of checksum bits from link layer */
-	int	dag_offset_flags; /* Flags to pass to dag_offset(). */
-	int	dag_stream;	/* DAG stream number */
-	int	dag_timeout;	/* timeout specified to pcap_open_live.
-				 * Same as in linux above, introduce
-				 * generally? */
-#endif /* HAVE_DAG_API */
-};
+typedef void	(*cleanup_op_t)(pcap_t *);
 
 /*
- * Ultrix, DEC OSF/1^H^H^H^H^H^H^H^H^HDigital UNIX^H^H^H^H^H^H^H^H^H^H^H^H
- * Tru64 UNIX, and some versions of NetBSD pad FDDI packets to make everything
- * line up on a nice boundary.
+ * We put all the stuff used in the read code path at the beginning,
+ * to try to keep it together in the same cache line or lines.
  */
-#ifdef __NetBSD__
-#include <sys/param.h>	/* needed to declare __NetBSD_Version__ */
-#endif
-
-#if defined(ultrix) || defined(__osf__) || (defined(__NetBSD__) && __NetBSD_Version__ > 106000000)
-#define       PCAP_FDDIPAD 3
-#endif
-
 struct pcap {
+	/*
+	 * Method to call to read packets on a live capture.
+	 */
+	read_op_t read_op;
+
+	/*
+	 * Method to call to read to read packets from a savefile.
+	 */
+	int (*next_packet_op)(pcap_t *, struct pcap_pkthdr *, u_char **);
+
 #ifdef WIN32
 	ADAPTER *adapter;
 	LPPACKET Packet;
-	int timeout;
 	int nonblock;
 #else
 	int fd;
 	int selectable_fd;
-	int send_fd;
 #endif /* WIN32 */
-	int snapshot;
-	int linktype;
-	int tzoff;		/* timezone offset */
-	int offset;		/* offset for proper alignment */
-
-	int break_loop;		/* flag set to force break from packet-reading loop */
-
-#ifdef PCAP_FDDIPAD
-	int fddipad;
-#endif
-
-#ifdef MSDOS
-        int inter_packet_wait;   /* offline: wait between packets */
-        void (*wait_proc)(void); /*          call proc while waiting */
-#endif
-
-	struct pcap_sf sf;
-	struct pcap_md md;
 
 	/*
 	 * Read buffer.
@@ -173,6 +145,34 @@
 	u_char *bp;
 	int cc;
 
+	int break_loop;		/* flag set to force break from packet-reading loop */
+
+	void *priv;		/* private data for methods */
+
+	int swapped;
+	FILE *rfile;		/* null if live capture, non-null if savefile */
+	int fddipad;
+	struct pcap *next;	/* list of open pcaps that need stuff cleared on close */
+
+	/*
+	 * File version number; meaningful only for a savefile, but we
+	 * keep it here so that apps that (mistakenly) ask for the
+	 * version numbers will get the same zero values that they
+	 * always did.
+	 */
+	int version_major;
+	int version_minor;
+
+	int snapshot;
+	int linktype;		/* Network linktype */
+	int linktype_ext;       /* Extended information stored in the linktype field of a file */
+	int tzoff;		/* timezone offset */
+	int offset;		/* offset for proper alignment */
+	int activated;		/* true if the capture is really started */
+	int oldstyle;		/* if we're opening with pcap_open_live() */
+
+	struct pcap_opt opt;
+
 	/*
 	 * Place holder for pcap_next().
 	 */
@@ -182,19 +182,6 @@
 	pcap_direction_t direction;
 
 	/*
-	 * Methods.
-	 */
-	int	(*read_op)(pcap_t *, int cnt, pcap_handler, u_char *);
-	int	(*inject_op)(pcap_t *, const void *, size_t);
-	int	(*setfilter_op)(pcap_t *, struct bpf_program *);
-	int	(*setdirection_op)(pcap_t *, pcap_direction_t);
-	int	(*set_datalink_op)(pcap_t *, int);
-	int	(*getnonblock_op)(pcap_t *, char *);
-	int	(*setnonblock_op)(pcap_t *, int, char *);
-	int	(*stats_op)(pcap_t *, struct pcap_stat *);
-	void	(*close_op)(pcap_t *);
-
-	/*
 	 * Placeholder for filter code if bpf not in kernel.
 	 */
 	struct bpf_program fcode;
@@ -202,8 +189,42 @@
 	char errbuf[PCAP_ERRBUF_SIZE + 1];
 	int dlt_count;
 	u_int *dlt_list;
+	int tstamp_type_count;
+	u_int *tstamp_type_list;
+	int tstamp_precision_count;
+	u_int *tstamp_precision_list;
 
 	struct pcap_pkthdr pcap_header;	/* This is needed for the pcap_next_ex() to work */
+
+	/*
+	 * More methods.
+	 */
+	activate_op_t activate_op;
+	can_set_rfmon_op_t can_set_rfmon_op;
+	inject_op_t inject_op;
+	setfilter_op_t setfilter_op;
+	setdirection_op_t setdirection_op;
+	set_datalink_op_t set_datalink_op;
+	getnonblock_op_t getnonblock_op;
+	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
+	 * driver.
+	 */
+	setbuff_op_t setbuff_op;
+	setmode_op_t setmode_op;
+	setmintocopy_op_t setmintocopy_op;
+	getadapter_op_t getadapter_op;
+#endif
+	cleanup_op_t cleanup_op;
 };
 
 /*
@@ -231,8 +252,8 @@
  *
  *	introduce a new structure for the new format;
  *
- *	send mail to "tcpdump-workers@tcpdump.org", requesting a new
- *	magic number for your new capture file format, and, when
+ *	send mail to "tcpdump-workers@lists.tcpdump.org", requesting
+ *	a new magic number for your new capture file format, and, when
  *	you get the new magic number, put it in "savefile.c";
  *
  *	use that magic number for save files with the changed record
@@ -242,9 +263,13 @@
  *	the old record header as well as files with the new record header
  *	(using the magic number to determine the header format).
  *
- * Then supply the changes to "patches@tcpdump.org", so that future
- * versions of libpcap and programs that use it (such as tcpdump) will
- * be able to read your new capture file format.
+ * Then supply the changes by forking the branch at
+ *
+ *	https://github.com/the-tcpdump-group/libpcap/issues
+ *
+ * and issuing a pull request, so that future versions of libpcap and
+ * programs that use it (such as tcpdump) will be able to read your new
+ * capture file format.
  */
 
 struct pcap_sf_pkthdr {
@@ -272,6 +297,16 @@
     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
@@ -302,6 +337,12 @@
 #endif
 
 /*
+ * Does the packet count argument to a module's read routine say
+ * "supply packets until you run out of packets"?
+ */
+#define PACKET_COUNT_IS_UNLIMITED(count)	((count) <= 0)
+
+/*
  * Routines that most pcap implementations can use for non-blocking mode.
  */
 #if !defined(WIN32) && !defined(MSDOS)
@@ -309,17 +350,39 @@
 int	pcap_setnonblock_fd(pcap_t *p, int, char *);
 #endif
 
-void	pcap_close_common(pcap_t *);
+/*
+ * Internal interfaces for "pcap_create()".
+ *
+ * "pcap_create_interface()" is the routine to do a pcap_create on
+ * a regular network interface.  There are multiple implementations
+ * of this, one for each platform type (Linux, BPF, DLPI, etc.),
+ * with the one used chosen by the configure script.
+ *
+ * "pcap_create_common()" allocates and fills in a pcap_t, for use
+ * by pcap_create routines.
+ */
+pcap_t	*pcap_create_interface(const char *, char *);
+pcap_t	*pcap_create_common(const char *, char *, size_t);
+int	pcap_do_addexit(pcap_t *);
+void	pcap_add_to_pcaps_to_close(pcap_t *);
+void	pcap_remove_from_pcaps_to_close(pcap_t *);
+void	pcap_cleanup_live_common(pcap_t *);
+int	pcap_not_initialized(pcap_t *);
+int	pcap_check_activated(pcap_t *);
 
 /*
  * Internal interfaces for "pcap_findalldevs()".
  *
- * "pcap_platform_finddevs()" is a platform-dependent routine to
- * add devices not found by the "standard" mechanisms (SIOCGIFCONF,
- * "getifaddrs()", etc..
+ * "pcap_findalldevs_interfaces()" finds interfaces using the
+ * "standard" mechanisms (SIOCGIFCONF, "getifaddrs()", etc.).
  *
- * "pcap_add_if()" adds an interface to the list of interfaces.
+ * "pcap_platform_finddevs()" is a platform-dependent routine to
+ * add devices not found by the "standard" mechanisms.
+ *
+ * "pcap_add_if()" adds an interface to the list of interfaces, for
+ * use by various "find interfaces" routines.
  */
+int	pcap_findalldevs_interfaces(pcap_if_t **, char *);
 int	pcap_platform_finddevs(pcap_if_t **, char *);
 int	add_addr_to_iflist(pcap_if_t **, const char *, u_int, struct sockaddr *,
 	    size_t, struct sockaddr *, size_t, struct sockaddr *, size_t,
@@ -329,6 +392,28 @@
 int	add_or_find_if(pcap_if_t **, pcap_if_t **, const char *, u_int,
 	    const char *, char *);
 
+/*
+ * Internal interfaces for "pcap_open_offline()".
+ *
+ * "pcap_open_offline_common()" allocates and fills in a pcap_t, for use
+ * by pcap_open_offline routines.
+ *
+ * "sf_cleanup()" closes the file handle associated with a pcap_t, if
+ * appropriate, and frees all data common to all modules for handling
+ * savefile types.
+ */
+pcap_t	*pcap_open_offline_common(char *ebuf, size_t size);
+void	sf_cleanup(pcap_t *p);
+
+/*
+ * Internal interfaces for both "pcap_create()" and routines that
+ * open savefiles.
+ *
+ * "pcap_oneshot()" is the standard one-shot callback for "pcap_next()"
+ * and "pcap_next_ex()".
+ */
+void	pcap_oneshot(u_char *, const struct pcap_pkthdr *, const u_char *);
+
 #ifdef WIN32
 char	*pcap_win32strerror(void);
 #endif
diff --git a/pcap-libdlpi.c b/pcap-libdlpi.c
new file mode 100644
index 0000000..5bc9374
--- /dev/null
+++ b/pcap-libdlpi.c
@@ -0,0 +1,410 @@
+/*
+ * 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.
+ *
+ * This code contributed by Sagun Shakya (sagun.shakya@sun.com)
+ */
+/*
+ * Packet capture routines for DLPI using libdlpi under SunOS 5.11.
+ */
+
+#ifndef lint
+static const char rcsid[] _U_ =
+	"@(#) $Header: /tcpdump/master/libpcap/pcap-libdlpi.c,v 1.6 2008-04-14 20:40:58 guy Exp $ (LBL)";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/bufmod.h>
+#include <sys/stream.h>
+#include <libdlpi.h>
+#include <errno.h>
+#include <memory.h>
+#include <stropts.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "pcap-int.h"
+#include "dlpisubs.h"
+
+/* Forwards. */
+static int dlpromiscon(pcap_t *, bpf_u_int32);
+static int pcap_read_libdlpi(pcap_t *, int, pcap_handler, u_char *);
+static int pcap_inject_libdlpi(pcap_t *, const void *, size_t);
+static void pcap_libdlpi_err(const char *, const char *, int, char *);
+static void pcap_cleanup_libdlpi(pcap_t *);
+
+/*
+ * list_interfaces() will list all the network links that are
+ * available on a system.
+ */
+static boolean_t list_interfaces(const char *, void *);
+
+typedef struct linknamelist {
+	char	linkname[DLPI_LINKNAME_MAX];
+	struct linknamelist *lnl_next;
+} linknamelist_t;
+
+typedef struct linkwalk {
+	linknamelist_t	*lw_list;
+	int		lw_err;
+} linkwalk_t;
+
+/*
+ * The caller of this function should free the memory allocated
+ * for each linknamelist_t "entry" allocated.
+ */
+static boolean_t
+list_interfaces(const char *linkname, void *arg)
+{
+	linkwalk_t	*lwp = arg;
+	linknamelist_t	*entry;
+
+	if ((entry = calloc(1, sizeof(linknamelist_t))) == NULL) {
+		lwp->lw_err = ENOMEM;
+		return (B_TRUE);
+	}
+	(void) strlcpy(entry->linkname, linkname, DLPI_LINKNAME_MAX);
+
+	if (lwp->lw_list == NULL) {
+		lwp->lw_list = entry;
+	} else {
+		entry->lnl_next = lwp->lw_list;
+		lwp->lw_list = entry;
+	}
+
+	return (B_FALSE);
+}
+
+static int
+pcap_activate_libdlpi(pcap_t *p)
+{
+	struct pcap_dlpi *pd = p->priv;
+	int retv;
+	dlpi_handle_t dh;
+	dlpi_info_t dlinfo;
+	int err = PCAP_ERROR;
+
+	/*
+	 * Enable Solaris raw and passive DLPI extensions;
+	 * dlpi_open() will not fail if the underlying link does not support
+	 * passive mode. See dlpi(7P) for details.
+	 */
+	retv = dlpi_open(p->opt.source, &dh, DLPI_RAW|DLPI_PASSIVE);
+	if (retv != DLPI_SUCCESS) {
+		if (retv == DLPI_ELINKNAMEINVAL || retv == DLPI_ENOLINK)
+			err = PCAP_ERROR_NO_SUCH_DEVICE;
+		else if (retv == DL_SYSERR &&
+		    (errno == EPERM || errno == EACCES))
+			err = PCAP_ERROR_PERM_DENIED;
+		pcap_libdlpi_err(p->opt.source, "dlpi_open", retv,
+		    p->errbuf);
+		return (err);
+	}
+	pd->dlpi_hd = dh;
+
+	if (p->opt.rfmon) {
+		/*
+		 * This device exists, but we don't support monitor mode
+		 * any platforms that support DLPI.
+		 */
+		err = PCAP_ERROR_RFMON_NOTSUP;
+		goto bad;
+	}
+
+	/* Bind with DLPI_ANY_SAP. */
+	if ((retv = dlpi_bind(pd->dlpi_hd, DLPI_ANY_SAP, 0)) != DLPI_SUCCESS) {
+		pcap_libdlpi_err(p->opt.source, "dlpi_bind", retv, p->errbuf);
+		goto bad;
+	}
+
+	/* Enable promiscuous mode. */
+	if (p->opt.promisc) {
+		err = dlpromiscon(p, DL_PROMISC_PHYS);
+		if (err < 0) {
+			/*
+			 * "You don't have permission to capture on
+			 * this device" and "you don't have permission
+			 * to capture in promiscuous mode on this
+			 * device" are different; let the user know,
+			 * so if they can't get permission to
+			 * capture in promiscuous mode, they can at
+			 * least try to capture in non-promiscuous
+			 * mode.
+			 *
+			 * XXX - you might have to capture in
+			 * promiscuous mode to see outgoing packets.
+			 */
+			if (err == PCAP_ERROR_PERM_DENIED)
+				err = PCAP_ERROR_PROMISC_PERM_DENIED;
+			goto bad;
+		}
+	} else {
+		/* Try to enable multicast. */
+		err = dlpromiscon(p, DL_PROMISC_MULTI);
+		if (err < 0)
+			goto bad;
+	}
+
+	/* Try to enable SAP promiscuity. */
+	err = dlpromiscon(p, DL_PROMISC_SAP);
+	if (err < 0) {
+		/*
+		 * Not fatal, since the DL_PROMISC_PHYS mode worked.
+		 * Report it as a warning, however.
+		 */
+		if (p->opt.promisc)
+			err = PCAP_WARNING;
+		else
+			goto bad;
+	}
+
+	/* Determine link type.  */
+	if ((retv = dlpi_info(pd->dlpi_hd, &dlinfo, 0)) != DLPI_SUCCESS) {
+		pcap_libdlpi_err(p->opt.source, "dlpi_info", retv, p->errbuf);
+		goto bad;
+	}
+
+	if (pcap_process_mactype(p, dlinfo.di_mactype) != 0)
+		goto bad;
+
+	p->fd = dlpi_fd(pd->dlpi_hd);
+
+	/* Push and configure bufmod. */
+	if (pcap_conf_bufmod(p, p->snapshot) != 0)
+		goto bad;
+
+	/*
+	 * Flush the read side.
+	 */
+	if (ioctl(p->fd, I_FLUSH, FLUSHR) != 0) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "FLUSHR: %s",
+		    pcap_strerror(errno));
+		goto bad;
+	}
+
+	/* Allocate data buffer. */
+	if (pcap_alloc_databuf(p) != 0)
+		goto bad;
+
+	/*
+	 * "p->fd" is a FD for a STREAMS device, so "select()" and
+	 * "poll()" should work on it.
+	 */
+	p->selectable_fd = p->fd;
+
+	p->read_op = pcap_read_libdlpi;
+	p->inject_op = pcap_inject_libdlpi;
+	p->setfilter_op = install_bpf_program;	/* No kernel filtering */
+	p->setdirection_op = NULL;	/* Not implemented */
+	p->set_datalink_op = NULL;	/* Can't change data link type */
+	p->getnonblock_op = pcap_getnonblock_fd;
+	p->setnonblock_op = pcap_setnonblock_fd;
+	p->stats_op = pcap_stats_dlpi;
+	p->cleanup_op = pcap_cleanup_libdlpi;
+
+	return (0);
+bad:
+	pcap_cleanup_libdlpi(p);
+	return (err);
+}
+
+#define STRINGIFY(n)	#n
+
+static int
+dlpromiscon(pcap_t *p, bpf_u_int32 level)
+{
+	struct pcap_dlpi *pd = p->priv;
+	int retv;
+	int err;
+
+	retv = dlpi_promiscon(pd->dlpi_hd, level);
+	if (retv != DLPI_SUCCESS) {
+		if (retv == DL_SYSERR &&
+		    (errno == EPERM || errno == EACCES))
+			err = PCAP_ERROR_PERM_DENIED;
+		else
+			err = PCAP_ERROR;
+		pcap_libdlpi_err(p->opt.source, "dlpi_promiscon" STRINGIFY(level),
+		    retv, p->errbuf);
+		return (err);
+	}
+	return (0);
+}
+
+/*
+ * In Solaris, the "standard" mechanism" i.e SIOCGLIFCONF will only find
+ * network links that are plumbed and are up. dlpi_walk(3DLPI) will find
+ * additional network links present in the system.
+ */
+int
+pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
+{
+	int retv = 0;
+
+	linknamelist_t	*entry, *next;
+	linkwalk_t	lw = {NULL, 0};
+	int 		save_errno;
+
+	/* dlpi_walk() for loopback will be added here. */
+
+	dlpi_walk(list_interfaces, &lw, 0);
+
+	if (lw.lw_err != 0) {
+		snprintf(errbuf, PCAP_ERRBUF_SIZE,
+		    "dlpi_walk: %s", pcap_strerror(lw.lw_err));
+		retv = -1;
+		goto done;
+	}
+
+	/* Add linkname if it does not exist on the list. */
+	for (entry = lw.lw_list; entry != NULL; entry = entry->lnl_next) {
+		if (pcap_add_if(alldevsp, entry->linkname, 0, NULL, errbuf) < 0)
+			retv = -1;
+	}
+done:
+	save_errno = errno;
+	for (entry = lw.lw_list; entry != NULL; entry = next) {
+		next = entry->lnl_next;
+		free(entry);
+	}
+	errno = save_errno;
+
+	return (retv);
+}
+
+/*
+ * Read data received on DLPI handle. Returns -2 if told to terminate, else
+ * returns the number of packets read.
+ */
+static int
+pcap_read_libdlpi(pcap_t *p, int count, pcap_handler callback, u_char *user)
+{
+	struct pcap_dlpi *pd = p->priv;
+	int len;
+	u_char *bufp;
+	size_t msglen;
+	int retv;
+
+	len = p->cc;
+	if (len != 0) {
+		bufp = p->bp;
+		goto process_pkts;
+	}
+	do {
+		/* Has "pcap_breakloop()" been called? */
+		if (p->break_loop) {
+			/*
+			 * Yes - clear the flag that indicates that it has,
+			 * and return -2 to indicate that we were told to
+			 * break out of the loop.
+			 */
+			p->break_loop = 0;
+			return (-2);
+		}
+
+		msglen = p->bufsize;
+		bufp = p->buffer + p->offset;
+
+		retv = dlpi_recv(pd->dlpi_hd, NULL, NULL, bufp,
+		    &msglen, -1, NULL);
+		if (retv != DLPI_SUCCESS) {
+			/*
+			 * This is most likely a call to terminate out of the
+			 * loop. So, do not return an error message, instead
+			 * check if "pcap_breakloop()" has been called above.
+			 */
+			if (retv == DL_SYSERR && errno == EINTR) {
+				len = 0;
+				continue;
+			}
+			pcap_libdlpi_err(dlpi_linkname(pd->dlpi_hd),
+			    "dlpi_recv", retv, p->errbuf);
+			return (-1);
+		}
+		len = msglen;
+	} while (len == 0);
+
+process_pkts:
+	return (pcap_process_pkts(p, callback, user, count, bufp, len));
+}
+
+static int
+pcap_inject_libdlpi(pcap_t *p, const void *buf, size_t size)
+{
+	struct pcap_dlpi *pd = p->priv;
+	int retv;
+
+	retv = dlpi_send(pd->dlpi_hd, NULL, 0, buf, size, NULL);
+	if (retv != DLPI_SUCCESS) {
+		pcap_libdlpi_err(dlpi_linkname(pd->dlpi_hd), "dlpi_send", retv,
+		    p->errbuf);
+		return (-1);
+	}
+	/*
+	 * dlpi_send(3DLPI) does not provide a way to return the number of
+	 * bytes sent on the wire. Based on the fact that DLPI_SUCCESS was
+	 * returned we are assuming 'size' bytes were sent.
+	 */
+	return (size);
+}
+
+/*
+ * Close dlpi handle.
+ */
+static void
+pcap_cleanup_libdlpi(pcap_t *p)
+{
+	struct pcap_dlpi *pd = p->priv;
+
+	if (pd->dlpi_hd != NULL) {
+		dlpi_close(pd->dlpi_hd);
+		pd->dlpi_hd = NULL;
+		p->fd = -1;
+	}
+	pcap_cleanup_live_common(p);
+}
+
+/*
+ * Write error message to buffer.
+ */
+static void
+pcap_libdlpi_err(const char *linkname, const char *func, int err, char *errbuf)
+{
+	snprintf(errbuf, PCAP_ERRBUF_SIZE, "libpcap: %s failed on %s: %s",
+	    func, linkname, dlpi_strerror(err));
+}
+
+pcap_t *
+pcap_create_interface(const char *device, char *ebuf)
+{
+	pcap_t *p;
+
+	p = pcap_create_common(device, ebuf, sizeof (struct pcap_dlpi));
+	if (p == NULL)
+		return (NULL);
+
+	p->activate_op = pcap_activate_libdlpi;
+	return (p);
+}
diff --git a/pcap-linktype.manmisc.in b/pcap-linktype.manmisc.in
new file mode 100644
index 0000000..8904387
--- /dev/null
+++ b/pcap-linktype.manmisc.in
@@ -0,0 +1,50 @@
+.\" @(#) $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.
+.\" 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-LINKTYPE @MAN_MISC_INFO@ "23 October 2008"
+.SH NAME
+pcap-linktype \- link-layer header types supported by libpcap
+.SH DESCRIPTION
+For a live capture or ``savefile'', libpcap supplies, as the return
+value of the
+.BR pcap_datalink (3PCAP)
+routine, a value that indicates the type of link-layer header at the
+beginning of the packets it provides.  This is not necessarily the type
+of link-layer header that the packets being captured have on the network
+from which they're being captured; for example, packets from an IEEE
+802.11 network might be provided by libpcap with Ethernet headers that
+the network adapter or the network adapter driver generates from the
+802.11 headers.  The names for those values begin with
+.BR DLT_ ,
+so they are sometimes called "DLT_ values".
+.PP
+The values stored in the link-layer header type field in the savefile
+header are, in most but not all cases, the same as the values returned
+by
+.BR pcap_datalink() .
+The names for those values begin with
+.BR LINKTYPE_ .
+.PP
+The link-layer header types supported by libpcap are described at
+http://www.tcpdump.org/linktypes.html.
+.SH SEE ALSO
+pcap_datalink(3PCAP)
diff --git a/pcap-linux.c b/pcap-linux.c
index ba9b125..dc42735 100644
--- a/pcap-linux.c
+++ b/pcap-linux.c
@@ -23,11 +23,53 @@
  *  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.
+ *
+ *  Modifications:     Added PACKET_MMAP support
+ *                     Paolo Abeni <paolo.abeni@email.it> 
+ *                     Added TPACKET_V3 support
+ *                     Gabor Tatarka <gabor.tatarka@ericsson.com>
+ *                     
+ *                     based on previous works of:
+ *                     Simon Patarin <patarin@cs.unibo.it>
+ *                     Phil Wood <cpw@lanl.gov>
+ *
+ * Monitor-mode support for mac80211 includes code taken from the iw
+ * command; the copyright notice for that code is
+ *
+ * Copyright (c) 2007, 2008	Johannes Berg
+ * Copyright (c) 2007		Andy Lutomirski
+ * Copyright (c) 2007		Mike Kershaw
+ * Copyright (c) 2008		Gábor Stefanik
+ *
+ * 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.
+ *
+ * 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.
  */
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/pcap-linux.c,v 1.110.2.14 2006/10/12 17:26:58 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/pcap-linux.c,v 1.164 2008-12-14 22:00:57 guy Exp $ (LBL)";
 #endif
 
 /*
@@ -73,33 +115,37 @@
  */
 
 
-#include <stdlib.h>
+#define _GNU_SOURCE
+
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include "pcap-int.h"
-#include "sll.h"
-
-#ifdef HAVE_DAG_API
-#include "pcap-dag.h"
-#endif /* HAVE_DAG_API */
-
-#ifdef HAVE_SEPTEL_API
-#include "pcap-septel.h"
-#endif /* HAVE_SEPTEL_API */
-	  
 #include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <string.h>
+#include <limits.h>
+#include <sys/stat.h>
 #include <sys/socket.h>
 #include <sys/ioctl.h>
 #include <sys/utsname.h>
-#include <net/if.h>
+#include <sys/mman.h>
+#include <linux/if.h>
+#include <linux/if_packet.h>
+#include <linux/sockios.h>
 #include <netinet/in.h>
 #include <linux/if_ether.h>
 #include <net/if_arp.h>
+#include <poll.h>
+#include <dirent.h>
+
+#include "pcap-int.h"
+#include "pcap/sll.h"
+#include "pcap/vlan.h"
 
 /*
  * If PF_PACKET is defined, we can use {SOCK_RAW,SOCK_DGRAM}/PF_PACKET
@@ -141,7 +187,26 @@
   */
 # ifdef PACKET_HOST
 #  define HAVE_PF_PACKET_SOCKETS
+#  ifdef PACKET_AUXDATA
+#   define HAVE_PACKET_AUXDATA
+#  endif /* PACKET_AUXDATA */
 # endif /* PACKET_HOST */
+
+
+ /* check for memory mapped access avaibility. We assume every needed 
+  * struct is defined if the macro TPACKET_HDRLEN is defined, because it
+  * uses many ring related structs and macros */
+# ifdef TPACKET_HDRLEN
+#  define HAVE_PACKET_RING
+#  ifdef TPACKET3_HDRLEN
+#   define HAVE_TPACKET3
+#  endif /* TPACKET3_HDRLEN */
+#  ifdef TPACKET2_HDRLEN
+#   define HAVE_TPACKET2
+#  else  /* TPACKET2_HDRLEN */
+#   define TPACKET_V1	0    /* Old kernel with only V1, so no TPACKET_Vn defined */
+#  endif /* TPACKET2_HDRLEN */
+# endif /* TPACKET_HDRLEN */
 #endif /* PF_PACKET */
 
 #ifdef SO_ATTACH_FILTER
@@ -149,7 +214,38 @@
 #include <linux/filter.h>
 #endif
 
-#ifndef __GLIBC__
+#ifdef HAVE_LINUX_NET_TSTAMP_H
+#include <linux/net_tstamp.h>
+#endif
+
+/*
+ * Got Wireless Extensions?
+ */
+#ifdef HAVE_LINUX_WIRELESS_H
+#include <linux/wireless.h>
+#endif /* HAVE_LINUX_WIRELESS_H */
+
+/*
+ * Got libnl?
+ */
+#ifdef HAVE_LIBNL
+#include <linux/nl80211.h>
+
+#include <netlink/genl/genl.h>
+#include <netlink/genl/family.h>
+#include <netlink/genl/ctrl.h>
+#include <netlink/msg.h>
+#include <netlink/attr.h>
+#endif /* HAVE_LIBNL */
+
+/*
+ * Got ethtool support?
+ */
+#ifdef HAVE_LINUX_ETHTOOL_H
+#include <linux/ethtool.h>
+#endif
+
+#ifndef HAVE_SOCKLEN_T
 typedef int		socklen_t;
 #endif
 
@@ -185,34 +281,118 @@
 #define BIGGER_THAN_ALL_MTUS	(64*1024)
 
 /*
- * Prototypes for internal functions
+ * Private data for capturing on Linux SOCK_PACKET or PF_PACKET sockets.
+ */
+struct pcap_linux {
+	u_int	packets_read;	/* count of packets read with recvfrom() */
+	long	proc_dropped;	/* packets reported dropped by /proc/net/dev */
+	struct pcap_stat stat;
+
+	char	*device;	/* device name */
+	int	filter_in_userland; /* must filter in userland */
+	int	blocks_to_filter_in_userland;
+	int	must_do_on_close; /* stuff we must do when we close */
+	int	timeout;	/* timeout for buffering */
+	int	sock_packet;	/* using Linux 2.0 compatible interface */
+	int	cooked;		/* using SOCK_DGRAM rather than SOCK_RAW */
+	int	ifindex;	/* interface index of device we're bound to */
+	int	lo_ifindex;	/* interface index of the loopback device */
+	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 */
+	int	vlan_offset;	/* offset at which to insert vlan tags; if -1, don't insert */
+	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 */
+#ifdef HAVE_TPACKET3
+	unsigned char *current_packet; /* Current packet within the TPACKET_V3 block. Move to next block if NULL. */
+	int packets_left; /* Unhandled packets left within the block from previous call to pcap_read_linux_mmap_v3 in case of TPACKET_V3. */
+#endif
+};
+
+/*
+ * Stuff to do when we close.
+ */
+#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 */
+
+/*
+ * Prototypes for internal functions and methods.
  */
 static void map_arphrd_to_dlt(pcap_t *, int, int);
-static int live_open_old(pcap_t *, const char *, int, int, char *);
-static int live_open_new(pcap_t *, const char *, int, int, char *);
+#ifdef HAVE_PF_PACKET_SOCKETS
+static short int map_packet_type_to_sll_type(short int);
+#endif
+static int pcap_activate_linux(pcap_t *);
+static int activate_old(pcap_t *);
+static int activate_new(pcap_t *);
+static int activate_mmap(pcap_t *, int *);
+static int pcap_can_set_rfmon_linux(pcap_t *);
 static int pcap_read_linux(pcap_t *, int, pcap_handler, u_char *);
 static int pcap_read_packet(pcap_t *, pcap_handler, u_char *);
 static int pcap_inject_linux(pcap_t *, const void *, size_t);
 static int pcap_stats_linux(pcap_t *, struct pcap_stat *);
 static int pcap_setfilter_linux(pcap_t *, struct bpf_program *);
 static int pcap_setdirection_linux(pcap_t *, pcap_direction_t);
-static void pcap_close_linux(pcap_t *);
+static int pcap_set_datalink_linux(pcap_t *, int);
+static void pcap_cleanup_linux(pcap_t *);
+
+union thdr {
+	struct tpacket_hdr		*h1;
+#ifdef HAVE_TPACKET2
+	struct tpacket2_hdr		*h2;
+#endif
+#ifdef HAVE_TPACKET3
+	struct tpacket_block_desc	*h3;
+#endif
+	void				*raw;
+};
+
+#ifdef HAVE_PACKET_RING
+#define RING_GET_FRAME(h) (((union thdr **)h->buffer)[h->offset])
+
+static void destroy_ring(pcap_t *handle);
+static int create_ring(pcap_t *handle, int *status);
+static int prepare_tpacket_socket(pcap_t *handle);
+static void pcap_cleanup_linux_mmap(pcap_t *);
+static int pcap_read_linux_mmap_v1(pcap_t *, int, pcap_handler , u_char *);
+#ifdef HAVE_TPACKET2
+static int pcap_read_linux_mmap_v2(pcap_t *, int, pcap_handler , u_char *);
+#endif
+#ifdef HAVE_TPACKET3
+static int pcap_read_linux_mmap_v3(pcap_t *, int, pcap_handler , u_char *);
+#endif
+static int pcap_setfilter_linux_mmap(pcap_t *, struct bpf_program *);
+static int pcap_setnonblock_mmap(pcap_t *p, int nonblock, char *errbuf);
+static int pcap_getnonblock_mmap(pcap_t *p, char *errbuf);
+static void pcap_oneshot_mmap(u_char *user, const struct pcap_pkthdr *h,
+    const u_char *bytes);
+#endif
 
 /*
  * Wrap some ioctl calls
  */
 #ifdef HAVE_PF_PACKET_SOCKETS
 static int	iface_get_id(int fd, const char *device, char *ebuf);
-#endif
+#endif /* HAVE_PF_PACKET_SOCKETS */
 static int	iface_get_mtu(int fd, const char *device, char *ebuf);
 static int 	iface_get_arptype(int fd, const char *device, char *ebuf);
 #ifdef HAVE_PF_PACKET_SOCKETS
 static int 	iface_bind(int fd, int ifindex, char *ebuf);
-#endif
+#ifdef IW_MODE_MONITOR
+static int	has_wext(int sock_fd, const char *device, char *ebuf);
+#endif /* IW_MODE_MONITOR */
+static int	enter_rfmon_mode(pcap_t *handle, int sock_fd,
+    const char *device);
+#endif /* HAVE_PF_PACKET_SOCKETS */
+static int	iface_get_offload(pcap_t *handle);
 static int 	iface_bind_old(int fd, const char *device, char *ebuf);
 
 #ifdef SO_ATTACH_FILTER
-static int	fix_program(pcap_t *handle, struct sock_fprog *fcode);
+static int	fix_program(pcap_t *handle, struct sock_fprog *fcode,
+    int is_mapped);
 static int	fix_offset(struct bpf_insn *p);
 static int	set_kernel_filter(pcap_t *handle, struct sock_fprog *fcode);
 static int	reset_kernel_filter(pcap_t *handle);
@@ -221,8 +401,829 @@
 	= BPF_STMT(BPF_RET | BPF_K, 0);
 static struct sock_fprog	total_fcode
 	= { 1, &total_insn };
+#endif /* SO_ATTACH_FILTER */
+
+pcap_t *
+pcap_create_interface(const char *device, char *ebuf)
+{
+	pcap_t *handle;
+
+	handle = pcap_create_common(device, ebuf, sizeof (struct pcap_linux));
+	if (handle == NULL)
+		return NULL;
+
+	handle->activate_op = pcap_activate_linux;
+	handle->can_set_rfmon_op = pcap_can_set_rfmon_linux;
+#if defined(HAVE_LINUX_NET_TSTAMP_H) && defined(PACKET_TIMESTAMP)
+	/*
+	 * We claim that we support:
+	 *
+	 *	software time stamps, with no details about their precision;
+	 *	hardware time stamps, synced to the host time;
+	 *	hardware time stamps, not synced to the host time.
+	 *
+	 * XXX - we can't ask a device whether it supports
+	 * hardware time stamps, so we just claim all devices do.
+	 */
+	handle->tstamp_type_count = 3;
+	handle->tstamp_type_list = malloc(3 * sizeof(u_int));
+	if (handle->tstamp_type_list == NULL) {
+		free(handle);
+		return NULL;
+	}
+	handle->tstamp_type_list[0] = PCAP_TSTAMP_HOST;
+	handle->tstamp_type_list[1] = PCAP_TSTAMP_ADAPTER;
+	handle->tstamp_type_list[2] = PCAP_TSTAMP_ADAPTER_UNSYNCED;
 #endif
 
+#if defined(SIOCGSTAMPNS) && defined(SO_TIMESTAMPNS)
+	/*
+	 * We claim that we support microsecond and nanosecond time
+	 * stamps.
+	 *
+	 * XXX - with adapter-supplied time stamps, can we choose
+	 * microsecond or nanosecond time stamps on arbitrary
+	 * adapters?
+	 */
+	handle->tstamp_precision_count = 2;
+	handle->tstamp_precision_list = malloc(2 * sizeof(u_int));
+	if (handle->tstamp_precision_list == NULL) {
+		if (handle->tstamp_type_list != NULL)
+			free(handle->tstamp_type_list);
+		free(handle);
+		return NULL;
+	}
+	handle->tstamp_precision_list[0] = PCAP_TSTAMP_PRECISION_MICRO;
+	handle->tstamp_precision_list[1] = PCAP_TSTAMP_PRECISION_NANO;
+#endif /* defined(SIOCGSTAMPNS) && defined(SO_TIMESTAMPNS) */
+
+	return handle;
+}
+
+#ifdef HAVE_LIBNL
+/*
+ * If interface {if} is a mac80211 driver, the file
+ * /sys/class/net/{if}/phy80211 is a symlink to
+ * /sys/class/ieee80211/{phydev}, for some {phydev}.
+ *
+ * On Fedora 9, with a 2.6.26.3-29 kernel, my Zydas stick, at
+ * least, has a "wmaster0" device and a "wlan0" device; the
+ * latter is the one with the IP address.  Both show up in
+ * "tcpdump -D" output.  Capturing on the wmaster0 device
+ * captures with 802.11 headers.
+ *
+ * airmon-ng searches through /sys/class/net for devices named
+ * monN, starting with mon0; as soon as one *doesn't* exist,
+ * it chooses that as the monitor device name.  If the "iw"
+ * command exists, it does "iw dev {if} interface add {monif}
+ * type monitor", where {monif} is the monitor device.  It
+ * then (sigh) sleeps .1 second, and then configures the
+ * device up.  Otherwise, if /sys/class/ieee80211/{phydev}/add_iface
+ * is a file, it writes {mondev}, without a newline, to that file,
+ * and again (sigh) sleeps .1 second, and then iwconfig's that
+ * device into monitor mode and configures it up.  Otherwise,
+ * you can't do monitor mode.
+ *
+ * All these devices are "glued" together by having the
+ * /sys/class/net/{device}/phy80211 links pointing to the same
+ * place, so, given a wmaster, wlan, or mon device, you can
+ * find the other devices by looking for devices with
+ * the same phy80211 link.
+ *
+ * To turn monitor mode off, delete the monitor interface,
+ * either with "iw dev {monif} interface del" or by sending
+ * {monif}, with no NL, down /sys/class/ieee80211/{phydev}/remove_iface
+ *
+ * Note: if you try to create a monitor device named "monN", and
+ * there's already a "monN" device, it fails, as least with
+ * the netlink interface (which is what iw uses), with a return
+ * value of -ENFILE.  (Return values are negative errnos.)  We
+ * could probably use that to find an unused device.
+ *
+ * Yes, you can have multiple monitor devices for a given
+ * physical device.
+*/
+
+/*
+ * Is this a mac80211 device?  If so, fill in the physical device path and
+ * return 1; if not, return 0.  On an error, fill in handle->errbuf and
+ * return PCAP_ERROR.
+ */
+static int
+get_mac80211_phydev(pcap_t *handle, const char *device, char *phydev_path,
+    size_t phydev_max_pathlen)
+{
+	char *pathstr;
+	ssize_t bytes_read;
+
+	/*
+	 * Generate the path string for the symlink to the physical device.
+	 */
+	if (asprintf(&pathstr, "/sys/class/net/%s/phy80211", device) == -1) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: Can't generate path name string for /sys/class/net device",
+		    device);
+		return PCAP_ERROR;
+	}
+	bytes_read = readlink(pathstr, phydev_path, phydev_max_pathlen);
+	if (bytes_read == -1) {
+		if (errno == ENOENT || errno == EINVAL) {
+			/*
+			 * Doesn't exist, or not a symlink; assume that
+			 * means it's not a mac80211 device.
+			 */
+			free(pathstr);
+			return 0;
+		}
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: Can't readlink %s: %s", device, pathstr,
+		    strerror(errno));
+		free(pathstr);
+		return PCAP_ERROR;
+	}
+	free(pathstr);
+	phydev_path[bytes_read] = '\0';
+	return 1;
+}
+
+#ifdef HAVE_LIBNL_SOCKETS
+#define get_nl_errmsg	nl_geterror
+#else
+/* libnl 2.x compatibility code */
+
+#define nl_sock nl_handle
+
+static inline struct nl_handle *
+nl_socket_alloc(void)
+{
+	return nl_handle_alloc();
+}
+
+static inline void
+nl_socket_free(struct nl_handle *h)
+{
+	nl_handle_destroy(h);
+}
+
+#define get_nl_errmsg	strerror
+
+static inline int
+__genl_ctrl_alloc_cache(struct nl_handle *h, struct nl_cache **cache)
+{
+	struct nl_cache *tmp = genl_ctrl_alloc_cache(h);
+	if (!tmp)
+		return -ENOMEM;
+	*cache = tmp;
+	return 0;
+}
+#define genl_ctrl_alloc_cache __genl_ctrl_alloc_cache
+#endif /* !HAVE_LIBNL_SOCKETS */
+
+struct nl80211_state {
+	struct nl_sock *nl_sock;
+	struct nl_cache *nl_cache;
+	struct genl_family *nl80211;
+};
+
+static int
+nl80211_init(pcap_t *handle, struct nl80211_state *state, const char *device)
+{
+	int err;
+
+	state->nl_sock = nl_socket_alloc();
+	if (!state->nl_sock) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: failed to allocate netlink handle", device);
+		return PCAP_ERROR;
+	}
+
+	if (genl_connect(state->nl_sock)) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: failed to connect to generic netlink", device);
+		goto out_handle_destroy;
+	}
+
+	err = genl_ctrl_alloc_cache(state->nl_sock, &state->nl_cache);
+	if (err < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: failed to allocate generic netlink cache: %s",
+		    device, get_nl_errmsg(-err));
+		goto out_handle_destroy;
+	}
+
+	state->nl80211 = genl_ctrl_search_by_name(state->nl_cache, "nl80211");
+	if (!state->nl80211) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: nl80211 not found", device);
+		goto out_cache_free;
+	}
+
+	return 0;
+
+out_cache_free:
+	nl_cache_free(state->nl_cache);
+out_handle_destroy:
+	nl_socket_free(state->nl_sock);
+	return PCAP_ERROR;
+}
+
+static void
+nl80211_cleanup(struct nl80211_state *state)
+{
+	genl_family_put(state->nl80211);
+	nl_cache_free(state->nl_cache);
+	nl_socket_free(state->nl_sock);
+}
+
+static int
+add_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state,
+    const char *device, const char *mondevice)
+{
+	int ifindex;
+	struct nl_msg *msg;
+	int err;
+
+	ifindex = iface_get_id(sock_fd, device, handle->errbuf);
+	if (ifindex == -1)
+		return PCAP_ERROR;
+
+	msg = nlmsg_alloc();
+	if (!msg) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: failed to allocate netlink msg", device);
+		return PCAP_ERROR;
+	}
+
+	genlmsg_put(msg, 0, 0, genl_family_get_id(state->nl80211), 0,
+		    0, NL80211_CMD_NEW_INTERFACE, 0);
+	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
+	NLA_PUT_STRING(msg, NL80211_ATTR_IFNAME, mondevice);
+	NLA_PUT_U32(msg, NL80211_ATTR_IFTYPE, NL80211_IFTYPE_MONITOR);
+
+	err = nl_send_auto_complete(state->nl_sock, msg);
+	if (err < 0) {
+#if defined HAVE_LIBNL_NLE
+		if (err == -NLE_FAILURE) {
+#else
+		if (err == -ENFILE) {
+#endif
+			/*
+			 * Device not available; our caller should just
+			 * keep trying.  (libnl 2.x maps ENFILE to
+			 * NLE_FAILURE; it can also map other errors
+			 * to that, but there's not much we can do
+			 * about that.)
+			 */
+			nlmsg_free(msg);
+			return 0;
+		} else {
+			/*
+			 * Real failure, not just "that device is not
+			 * available.
+			 */
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			    "%s: nl_send_auto_complete failed adding %s interface: %s",
+			    device, mondevice, get_nl_errmsg(-err));
+			nlmsg_free(msg);
+			return PCAP_ERROR;
+		}
+	}
+	err = nl_wait_for_ack(state->nl_sock);
+	if (err < 0) {
+#if defined HAVE_LIBNL_NLE
+		if (err == -NLE_FAILURE) {
+#else
+		if (err == -ENFILE) {
+#endif
+			/*
+			 * Device not available; our caller should just
+			 * keep trying.  (libnl 2.x maps ENFILE to
+			 * NLE_FAILURE; it can also map other errors
+			 * to that, but there's not much we can do
+			 * about that.)
+			 */
+			nlmsg_free(msg);
+			return 0;
+		} else {
+			/*
+			 * Real failure, not just "that device is not
+			 * available.
+			 */
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			    "%s: nl_wait_for_ack failed adding %s interface: %s",
+			    device, mondevice, get_nl_errmsg(-err));
+			nlmsg_free(msg);
+			return PCAP_ERROR;
+		}
+	}
+
+	/*
+	 * Success.
+	 */
+	nlmsg_free(msg);
+	return 1;
+
+nla_put_failure:
+	snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+	    "%s: nl_put failed adding %s interface",
+	    device, mondevice);
+	nlmsg_free(msg);
+	return PCAP_ERROR;
+}
+
+static int
+del_mon_if(pcap_t *handle, int sock_fd, struct nl80211_state *state,
+    const char *device, const char *mondevice)
+{
+	int ifindex;
+	struct nl_msg *msg;
+	int err;
+
+	ifindex = iface_get_id(sock_fd, mondevice, handle->errbuf);
+	if (ifindex == -1)
+		return PCAP_ERROR;
+
+	msg = nlmsg_alloc();
+	if (!msg) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: failed to allocate netlink msg", device);
+		return PCAP_ERROR;
+	}
+
+	genlmsg_put(msg, 0, 0, genl_family_get_id(state->nl80211), 0,
+		    0, NL80211_CMD_DEL_INTERFACE, 0);
+	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifindex);
+
+	err = nl_send_auto_complete(state->nl_sock, msg);
+	if (err < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: nl_send_auto_complete failed deleting %s interface: %s",
+		    device, mondevice, get_nl_errmsg(-err));
+		nlmsg_free(msg);
+		return PCAP_ERROR;
+	}
+	err = nl_wait_for_ack(state->nl_sock);
+	if (err < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: nl_wait_for_ack failed adding %s interface: %s",
+		    device, mondevice, get_nl_errmsg(-err));
+		nlmsg_free(msg);
+		return PCAP_ERROR;
+	}
+
+	/*
+	 * Success.
+	 */
+	nlmsg_free(msg);
+	return 1;
+
+nla_put_failure:
+	snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+	    "%s: nl_put failed deleting %s interface",
+	    device, mondevice);
+	nlmsg_free(msg);
+	return PCAP_ERROR;
+}
+
+static int
+enter_rfmon_mode_mac80211(pcap_t *handle, int sock_fd, const char *device)
+{
+	struct pcap_linux *handlep = handle->priv;
+	int ret;
+	char phydev_path[PATH_MAX+1];
+	struct nl80211_state nlstate;
+	struct ifreq ifr;
+	u_int n;
+
+	/*
+	 * Is this a mac80211 device?
+	 */
+	ret = get_mac80211_phydev(handle, device, phydev_path, PATH_MAX);
+	if (ret < 0)
+		return ret;	/* error */
+	if (ret == 0)
+		return 0;	/* no error, but not mac80211 device */
+
+	/*
+	 * XXX - is this already a monN device?
+	 * If so, we're done.
+	 * Is that determined by old Wireless Extensions ioctls?
+	 */
+
+	/*
+	 * OK, it's apparently a mac80211 device.
+	 * Try to find an unused monN device for it.
+	 */
+	ret = nl80211_init(handle, &nlstate, device);
+	if (ret != 0)
+		return ret;
+	for (n = 0; n < UINT_MAX; n++) {
+		/*
+		 * Try mon{n}.
+		 */
+		char mondevice[3+10+1];	/* mon{UINT_MAX}\0 */
+
+		snprintf(mondevice, sizeof mondevice, "mon%u", n);
+		ret = add_mon_if(handle, sock_fd, &nlstate, device, mondevice);
+		if (ret == 1) {
+			handlep->mondevice = strdup(mondevice);
+			goto added;
+		}
+		if (ret < 0) {
+			/*
+			 * Hard failure.  Just return ret; handle->errbuf
+			 * has already been set.
+			 */
+			nl80211_cleanup(&nlstate);
+			return ret;
+		}
+	}
+
+	snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+	    "%s: No free monN interfaces", device);
+	nl80211_cleanup(&nlstate);
+	return PCAP_ERROR;
+
+added:
+
+#if 0
+	/*
+	 * Sleep for .1 seconds.
+	 */
+	delay.tv_sec = 0;
+	delay.tv_nsec = 500000000;
+	nanosleep(&delay, NULL);
+#endif
+
+	/*
+	 * If we haven't already done so, arrange to have
+	 * "pcap_close_all()" called when we exit.
+	 */
+	if (!pcap_do_addexit(handle)) {
+		/*
+		 * "atexit()" failed; don't put the interface
+		 * in rfmon mode, just give up.
+		 */
+		return PCAP_ERROR_RFMON_NOTSUP;
+	}
+
+	/*
+	 * Now configure the monitor interface up.
+	 */
+	memset(&ifr, 0, sizeof(ifr));
+	strncpy(ifr.ifr_name, handlep->mondevice, sizeof(ifr.ifr_name));
+	if (ioctl(sock_fd, SIOCGIFFLAGS, &ifr) == -1) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: Can't get flags for %s: %s", device,
+		    handlep->mondevice, strerror(errno));
+		del_mon_if(handle, sock_fd, &nlstate, device,
+		    handlep->mondevice);
+		nl80211_cleanup(&nlstate);
+		return PCAP_ERROR;
+	}
+	ifr.ifr_flags |= IFF_UP|IFF_RUNNING;
+	if (ioctl(sock_fd, SIOCSIFFLAGS, &ifr) == -1) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: Can't set flags for %s: %s", device,
+		    handlep->mondevice, strerror(errno));
+		del_mon_if(handle, sock_fd, &nlstate, device,
+		    handlep->mondevice);
+		nl80211_cleanup(&nlstate);
+		return PCAP_ERROR;
+	}
+
+	/*
+	 * Success.  Clean up the libnl state.
+	 */
+	nl80211_cleanup(&nlstate);
+
+	/*
+	 * Note that we have to delete the monitor device when we close
+	 * the handle.
+	 */
+	handlep->must_do_on_close |= MUST_DELETE_MONIF;
+
+	/*
+	 * Add this to the list of pcaps to close when we exit.
+	 */
+	pcap_add_to_pcaps_to_close(handle);
+
+	return 1;
+}
+#endif /* HAVE_LIBNL */
+
+static int
+pcap_can_set_rfmon_linux(pcap_t *handle)
+{
+#ifdef HAVE_LIBNL
+	char phydev_path[PATH_MAX+1];
+	int ret;
+#endif
+#ifdef IW_MODE_MONITOR
+	int sock_fd;
+	struct iwreq ireq;
+#endif
+
+	if (strcmp(handle->opt.source, "any") == 0) {
+		/*
+		 * Monitor mode makes no sense on the "any" device.
+		 */
+		return 0;
+	}
+
+#ifdef HAVE_LIBNL
+	/*
+	 * Bleah.  There doesn't seem to be a way to ask a mac80211
+	 * device, through libnl, whether it supports monitor mode;
+	 * we'll just check whether the device appears to be a
+	 * mac80211 device and, if so, assume the device supports
+	 * monitor mode.
+	 *
+	 * wmaster devices don't appear to support the Wireless
+	 * Extensions, but we can create a mon device for a
+	 * wmaster device, so we don't bother checking whether
+	 * a mac80211 device supports the Wireless Extensions.
+	 */
+	ret = get_mac80211_phydev(handle, handle->opt.source, phydev_path,
+	    PATH_MAX);
+	if (ret < 0)
+		return ret;	/* error */
+	if (ret == 1)
+		return 1;	/* mac80211 device */
+#endif
+
+#ifdef IW_MODE_MONITOR
+	/*
+	 * Bleah.  There doesn't appear to be an ioctl to use to ask
+	 * whether a device supports monitor mode; we'll just do
+	 * SIOCGIWMODE and, if it succeeds, assume the device supports
+	 * monitor mode.
+	 *
+	 * Open a socket on which to attempt to get the mode.
+	 * (We assume that if we have Wireless Extensions support
+	 * we also have PF_PACKET support.)
+	 */
+	sock_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
+	if (sock_fd == -1) {
+		(void)snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "socket: %s", pcap_strerror(errno));
+		return PCAP_ERROR;
+	}
+
+	/*
+	 * Attempt to get the current mode.
+	 */
+	strncpy(ireq.ifr_ifrn.ifrn_name, handle->opt.source,
+	    sizeof ireq.ifr_ifrn.ifrn_name);
+	ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] = 0;
+	if (ioctl(sock_fd, SIOCGIWMODE, &ireq) != -1) {
+		/*
+		 * Well, we got the mode; assume we can set it.
+		 */
+		close(sock_fd);
+		return 1;
+	}
+	if (errno == ENODEV) {
+		/* The device doesn't even exist. */
+		(void)snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "SIOCGIWMODE failed: %s", pcap_strerror(errno));
+		close(sock_fd);
+		return PCAP_ERROR_NO_SUCH_DEVICE;
+	}
+	close(sock_fd);
+#endif
+	return 0;
+}
+
+/*
+ * Grabs the number of dropped packets by the interface from /proc/net/dev.
+ *
+ * XXX - what about /sys/class/net/{interface name}/rx_*?  There are
+ * individual devices giving, in ASCII, various rx_ and tx_ statistics.
+ *
+ * Or can we get them in binary form from netlink?
+ */
+static long int
+linux_if_drops(const char * if_name)
+{
+	char buffer[512];
+	char * bufptr;
+	FILE * file;
+	int field_to_convert = 3, if_name_sz = strlen(if_name);
+	long int dropped_pkts = 0;
+	
+	file = fopen("/proc/net/dev", "r");
+	if (!file)
+		return 0;
+
+	while (!dropped_pkts && fgets( buffer, sizeof(buffer), file ))
+	{
+		/* 	search for 'bytes' -- if its in there, then
+			that means we need to grab the fourth field. otherwise
+			grab the third field. */
+		if (field_to_convert != 4 && strstr(buffer, "bytes"))
+		{
+			field_to_convert = 4;
+			continue;
+		}
+	
+		/* find iface and make sure it actually matches -- space before the name and : after it */
+		if ((bufptr = strstr(buffer, if_name)) &&
+			(bufptr == buffer || *(bufptr-1) == ' ') &&
+			*(bufptr + if_name_sz) == ':')
+		{
+			bufptr = bufptr + if_name_sz + 1;
+
+			/* grab the nth field from it */
+			while( --field_to_convert && *bufptr != '\0')
+			{
+				while (*bufptr != '\0' && *(bufptr++) == ' ');
+				while (*bufptr != '\0' && *(bufptr++) != ' ');
+			}
+			
+			/* get rid of any final spaces */
+			while (*bufptr != '\0' && *bufptr == ' ') bufptr++;
+			
+			if (*bufptr != '\0')
+				dropped_pkts = strtol(bufptr, NULL, 10);
+
+			break;
+		}
+	}
+	
+	fclose(file);
+	return dropped_pkts;
+} 
+
+
+/*
+ * With older kernels promiscuous mode is kind of interesting because we
+ * have to reset the interface before exiting. The problem can't really
+ * be solved without some daemon taking care of managing usage counts.
+ * If we put the interface into promiscuous mode, we set a flag indicating
+ * that we must take it out of that mode when the interface is closed,
+ * and, when closing the interface, if that flag is set we take it out
+ * of promiscuous mode.
+ *
+ * Even with newer kernels, we have the same issue with rfmon mode.
+ */
+
+static void	pcap_cleanup_linux( pcap_t *handle )
+{
+	struct pcap_linux *handlep = handle->priv;
+	struct ifreq	ifr;
+#ifdef HAVE_LIBNL
+	struct nl80211_state nlstate;
+	int ret;
+#endif /* HAVE_LIBNL */
+#ifdef IW_MODE_MONITOR
+	int oldflags;
+	struct iwreq ireq;
+#endif /* IW_MODE_MONITOR */
+
+	if (handlep->must_do_on_close != 0) {
+		/*
+		 * There's something we have to do when closing this
+		 * pcap_t.
+		 */
+		if (handlep->must_do_on_close & MUST_CLEAR_PROMISC) {
+			/*
+			 * We put the interface into promiscuous mode;
+			 * take it out of promiscuous mode.
+			 *
+			 * XXX - if somebody else wants it in promiscuous
+			 * mode, this code cannot know that, so it'll take
+			 * it out of promiscuous mode.  That's not fixable
+			 * in 2.0[.x] kernels.
+			 */
+			memset(&ifr, 0, sizeof(ifr));
+			strncpy(ifr.ifr_name, handlep->device,
+			    sizeof(ifr.ifr_name));
+			if (ioctl(handle->fd, SIOCGIFFLAGS, &ifr) == -1) {
+				fprintf(stderr,
+				    "Can't restore interface %s flags (SIOCGIFFLAGS failed: %s).\n"
+				    "Please adjust manually.\n"
+				    "Hint: This can't happen with Linux >= 2.2.0.\n",
+				    handlep->device, strerror(errno));
+			} else {
+				if (ifr.ifr_flags & IFF_PROMISC) {
+					/*
+					 * Promiscuous mode is currently on;
+					 * turn it off.
+					 */
+					ifr.ifr_flags &= ~IFF_PROMISC;
+					if (ioctl(handle->fd, SIOCSIFFLAGS,
+					    &ifr) == -1) {
+						fprintf(stderr,
+						    "Can't restore interface %s flags (SIOCSIFFLAGS failed: %s).\n"
+						    "Please adjust manually.\n"
+						    "Hint: This can't happen with Linux >= 2.2.0.\n",
+						    handlep->device,
+						    strerror(errno));
+					}
+				}
+			}
+		}
+
+#ifdef HAVE_LIBNL
+		if (handlep->must_do_on_close & MUST_DELETE_MONIF) {
+			ret = nl80211_init(handle, &nlstate, handlep->device);
+			if (ret >= 0) {
+				ret = del_mon_if(handle, handle->fd, &nlstate,
+				    handlep->device, handlep->mondevice);
+				nl80211_cleanup(&nlstate);
+			}
+			if (ret < 0) {
+				fprintf(stderr,
+				    "Can't delete monitor interface %s (%s).\n"
+				    "Please delete manually.\n",
+				    handlep->mondevice, handle->errbuf);
+			}
+		}
+#endif /* HAVE_LIBNL */
+
+#ifdef IW_MODE_MONITOR
+		if (handlep->must_do_on_close & MUST_CLEAR_RFMON) {
+			/*
+			 * We put the interface into rfmon mode;
+			 * take it out of rfmon mode.
+			 *
+			 * XXX - if somebody else wants it in rfmon
+			 * mode, this code cannot know that, so it'll take
+			 * it out of rfmon mode.
+			 */
+
+			/*
+			 * First, take the interface down if it's up;
+			 * otherwise, we might get EBUSY.
+			 * If we get errors, just drive on and print
+			 * a warning if we can't restore the mode.
+			 */
+			oldflags = 0;
+			memset(&ifr, 0, sizeof(ifr));
+			strncpy(ifr.ifr_name, handlep->device,
+			    sizeof(ifr.ifr_name));
+			if (ioctl(handle->fd, SIOCGIFFLAGS, &ifr) != -1) {
+				if (ifr.ifr_flags & IFF_UP) {
+					oldflags = ifr.ifr_flags;
+					ifr.ifr_flags &= ~IFF_UP;
+					if (ioctl(handle->fd, SIOCSIFFLAGS, &ifr) == -1)
+						oldflags = 0;	/* didn't set, don't restore */
+				}
+			}
+
+			/*
+			 * Now restore the mode.
+			 */
+			strncpy(ireq.ifr_ifrn.ifrn_name, handlep->device,
+			    sizeof ireq.ifr_ifrn.ifrn_name);
+			ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1]
+			    = 0;
+			ireq.u.mode = handlep->oldmode;
+			if (ioctl(handle->fd, SIOCSIWMODE, &ireq) == -1) {
+				/*
+				 * Scientist, you've failed.
+				 */
+				fprintf(stderr,
+				    "Can't restore interface %s wireless mode (SIOCSIWMODE failed: %s).\n"
+				    "Please adjust manually.\n",
+				    handlep->device, strerror(errno));
+			}
+
+			/*
+			 * Now bring the interface back up if we brought
+			 * it down.
+			 */
+			if (oldflags != 0) {
+				ifr.ifr_flags = oldflags;
+				if (ioctl(handle->fd, SIOCSIFFLAGS, &ifr) == -1) {
+					fprintf(stderr,
+					    "Can't bring interface %s back up (SIOCSIFFLAGS failed: %s).\n"
+					    "Please adjust manually.\n",
+					    handlep->device, strerror(errno));
+				}
+			}
+		}
+#endif /* IW_MODE_MONITOR */
+
+		/*
+		 * Take this pcap out of the list of pcaps for which we
+		 * have to take the interface out of some mode.
+		 */
+		pcap_remove_from_pcaps_to_close(handle);
+	}
+
+	if (handlep->mondevice != NULL) {
+		free(handlep->mondevice);
+		handlep->mondevice = NULL;
+	}
+	if (handlep->device != NULL) {
+		free(handlep->device);
+		handlep->device = NULL;
+	}
+	pcap_cleanup_live_common(handle);
+}
+
 /*
  *  Get a handle for a live capture from the given device. You can
  *  pass NULL as device to get all packages (without link level
@@ -230,70 +1231,59 @@
  *  will be set to promiscous mode (XXX: I think this usage should
  *  be deprecated and functions be added to select that later allow
  *  modification of that values -- Torsten).
- *
- *  See also pcap(3).
  */
-pcap_t *
-pcap_open_live(const char *device, int snaplen, int promisc, int to_ms,
-    char *ebuf)
+static int
+pcap_activate_linux(pcap_t *handle)
 {
-	pcap_t		*handle;
-	int		mtu;
-	int		err;
-	int		live_open_ok = 0;
-	struct utsname	utsname;
+	struct pcap_linux *handlep = handle->priv;
+	const char	*device;
+	int		status = 0;
 
-#ifdef HAVE_DAG_API
-	if (strstr(device, "dag")) {
-		return dag_open_live(device, snaplen, promisc, to_ms, ebuf);
-	}
-#endif /* HAVE_DAG_API */
+	device = handle->opt.source;
 
-#ifdef HAVE_SEPTEL_API
-	if (strstr(device, "septel")) {
-		return septel_open_live(device, snaplen, promisc, to_ms, ebuf);
-	}
-#endif /* HAVE_SEPTEL_API */
-
-	/* Allocate a handle for this session. */
-
-	handle = malloc(sizeof(*handle));
-	if (handle == NULL) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s",
-			 pcap_strerror(errno));
-		return NULL;
-	}
-
-	/* Initialize some components of the pcap structure. */
-
-	memset(handle, 0, sizeof(*handle));
-	handle->snapshot	= snaplen;
-	handle->md.timeout	= to_ms;
+	handle->inject_op = pcap_inject_linux;
+	handle->setfilter_op = pcap_setfilter_linux;
+	handle->setdirection_op = pcap_setdirection_linux;
+	handle->set_datalink_op = pcap_set_datalink_linux;
+	handle->getnonblock_op = pcap_getnonblock_fd;
+	handle->setnonblock_op = pcap_setnonblock_fd;
+	handle->cleanup_op = pcap_cleanup_linux;
+	handle->read_op = pcap_read_linux;
+	handle->stats_op = pcap_stats_linux;
 
 	/*
-	 * NULL and "any" are special devices which give us the hint to
-	 * monitor all devices.
+	 * The "any" device is a special device which causes us not
+	 * to bind to a particular device and thus to look at all
+	 * devices.
 	 */
-	if (!device || strcmp(device, "any") == 0) {
-		device			= NULL;
-		handle->md.device	= strdup("any");
-		if (promisc) {
-			promisc = 0;
+	if (strcmp(device, "any") == 0) {
+		if (handle->opt.promisc) {
+			handle->opt.promisc = 0;
 			/* Just a warning. */
-			snprintf(ebuf, PCAP_ERRBUF_SIZE,
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
 			    "Promiscuous mode not supported on the \"any\" device");
+			status = PCAP_WARNING_PROMISC_NOTSUP;
 		}
-
-	} else
-		handle->md.device	= strdup(device);
-
-	if (handle->md.device == NULL) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "strdup: %s",
-			 pcap_strerror(errno) );
-		free(handle);
-		return NULL;
 	}
 
+	handlep->device	= strdup(device);
+	if (handlep->device == NULL) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "strdup: %s",
+			 pcap_strerror(errno) );
+		return PCAP_ERROR;
+	}
+	
+	/* copy timeout value */
+	handlep->timeout = handle->opt.timeout;
+
+	/*
+	 * If we're in promiscuous mode, then we probably want 
+	 * to see when the interface drops packets too, so get an
+	 * initial count from /proc/net/dev
+	 */
+	if (handle->opt.promisc)
+		handlep->proc_dropped = linux_if_drops(handlep->device);
+
 	/*
 	 * Current Linux kernels use the protocol family PF_PACKET to
 	 * allow direct access to all packets on the network while
@@ -303,119 +1293,87 @@
 	 * to be compatible with older kernels for a while so we are
 	 * trying both methods with the newer method preferred.
 	 */
-
-	if ((err = live_open_new(handle, device, promisc, to_ms, ebuf)) == 1)
-		live_open_ok = 1;
-	else if (err == 0) {
-		/* Non-fatal error; try old way */
-		if (live_open_old(handle, device, promisc, to_ms, ebuf))
-			live_open_ok = 1;
-	}
-	if (!live_open_ok) {
+	status = activate_new(handle);
+	if (status < 0) {
 		/*
-		 * Both methods to open the packet socket failed. Tidy
-		 * up and report our failure (ebuf is expected to be
-		 * set by the functions above).
+		 * Fatal error with the new way; just fail.
+		 * status has the error return; if it's PCAP_ERROR,
+		 * handle->errbuf has been set appropriately.
 		 */
+		goto fail;
+	}
+	if (status == 1) {
+		/*
+		 * Success.
+		 * Try to use memory-mapped access.
+		 */
+		switch (activate_mmap(handle, &status)) {
 
-		if (handle->md.device != NULL)
-			free(handle->md.device);
-		free(handle);
-		return NULL;
+		case 1:
+			/*
+			 * We succeeded.  status has been
+			 * set to the status to return,
+			 * which might be 0, or might be
+			 * a PCAP_WARNING_ value.
+			 */
+			return status;
+
+		case 0:
+			/*
+			 * Kernel doesn't support it - just continue
+			 * with non-memory-mapped access.
+			 */
+			break;
+
+		case -1:
+			/*
+			 * We failed to set up to use it, or the kernel
+			 * supports it, but we failed to enable it.
+			 * status has been set to the error status to
+			 * return and, if it's PCAP_ERROR, handle->errbuf
+			 * contains the error message.
+			 */
+			goto fail;
+		}
+	}
+	else if (status == 0) {
+		/* Non-fatal error; try old way */
+		if ((status = activate_old(handle)) != 1) {
+			/*
+			 * Both methods to open the packet socket failed.
+			 * Tidy up and report our failure (handle->errbuf
+			 * is expected to be set by the functions above).
+			 */
+			goto fail;
+		}
 	}
 
 	/*
-	 * Compute the buffer size.
-	 *
-	 * If we're using SOCK_PACKET, this might be a 2.0[.x] kernel,
-	 * and might require special handling - check.
+	 * We set up the socket, but not with memory-mapped access.
 	 */
-	if (handle->md.sock_packet && (uname(&utsname) < 0 ||
-	    strncmp(utsname.release, "2.0", 3) == 0)) {
+	status = 0;
+	if (handle->opt.buffer_size != 0) {
 		/*
-		 * We're using a SOCK_PACKET structure, and either
-		 * we couldn't find out what kernel release this is,
-		 * or it's a 2.0[.x] kernel.
-		 *
-		 * In the 2.0[.x] kernel, a "recvfrom()" on
-		 * a SOCK_PACKET socket, with MSG_TRUNC set, will
-		 * return the number of bytes read, so if we pass
-		 * a length based on the snapshot length, it'll
-		 * return the number of bytes from the packet
-		 * copied to userland, not the actual length
-		 * of the packet.
-		 *
-		 * This means that, for example, the IP dissector
-		 * in tcpdump will get handed a packet length less
-		 * than the length in the IP header, and will
-		 * complain about "truncated-ip".
-		 *
-		 * So we don't bother trying to copy from the
-		 * kernel only the bytes in which we're interested,
-		 * but instead copy them all, just as the older
-		 * versions of libpcap for Linux did.
-		 *
-		 * The buffer therefore needs to be big enough to
-		 * hold the largest packet we can get from this
-		 * device.  Unfortunately, we can't get the MRU
-		 * of the network; we can only get the MTU.  The
-		 * MTU may be too small, in which case a packet larger
-		 * than the buffer size will be truncated *and* we
-		 * won't get the actual packet size.
-		 *
-		 * However, if the snapshot length is larger than
-		 * the buffer size based on the MTU, we use the
-		 * snapshot length as the buffer size, instead;
-		 * this means that with a sufficiently large snapshot
-		 * length we won't artificially truncate packets
-		 * to the MTU-based size.
-		 *
-		 * This mess just one of many problems with packet
-		 * capture on 2.0[.x] kernels; you really want a
-		 * 2.2[.x] or later kernel if you want packet capture
-		 * to work well.
+		 * Set the socket buffer size to the specified value.
 		 */
-		mtu = iface_get_mtu(handle->fd, device, ebuf);
-		if (mtu == -1) {
-			pcap_close_linux(handle);
-			free(handle);
-			return NULL;
+		if (setsockopt(handle->fd, SOL_SOCKET, SO_RCVBUF,
+		    &handle->opt.buffer_size,
+		    sizeof(handle->opt.buffer_size)) == -1) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+				 "SO_RCVBUF: %s", pcap_strerror(errno));
+			status = PCAP_ERROR;
+			goto fail;
 		}
-		handle->bufsize = MAX_LINKHEADER_SIZE + mtu;
-		if (handle->bufsize < handle->snapshot)
-			handle->bufsize = handle->snapshot;
-	} else {
-		/*
-		 * This is a 2.2[.x] or later kernel (we know that
-		 * either because we're not using a SOCK_PACKET
-		 * socket - PF_PACKET is supported only in 2.2
-		 * and later kernels - or because we checked the
-		 * kernel version).
-		 *
-		 * We can safely pass "recvfrom()" a byte count
-		 * based on the snapshot length.
-		 *
-		 * If we're in cooked mode, make the snapshot length
-		 * large enough to hold a "cooked mode" header plus
-		 * 1 byte of packet data (so we don't pass a byte
-		 * count of 0 to "recvfrom()").
-		 */
-		if (handle->md.cooked) {
-			if (handle->snapshot < SLL_HDR_LEN + 1)
-				handle->snapshot = SLL_HDR_LEN + 1;
-		}
-		handle->bufsize = handle->snapshot;
 	}
 
 	/* Allocate the buffer */
 
 	handle->buffer	 = malloc(handle->bufsize + handle->offset);
 	if (!handle->buffer) {
-	        snprintf(ebuf, PCAP_ERRBUF_SIZE,
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
 			 "malloc: %s", pcap_strerror(errno));
-		pcap_close_linux(handle);
-		free(handle);
-		return NULL;
+		status = PCAP_ERROR;
+		goto fail;
 	}
 
 	/*
@@ -424,17 +1382,11 @@
 	 */
 	handle->selectable_fd = handle->fd;
 
-	handle->read_op = pcap_read_linux;
-	handle->inject_op = pcap_inject_linux;
-	handle->setfilter_op = pcap_setfilter_linux;
-	handle->setdirection_op = pcap_setdirection_linux;
-	handle->set_datalink_op = NULL;	/* can't change data link type */
-	handle->getnonblock_op = pcap_getnonblock_fd;
-	handle->setnonblock_op = pcap_setnonblock_fd;
-	handle->stats_op = pcap_stats_linux;
-	handle->close_op = pcap_close_linux;
+	return status;
 
-	return handle;
+fail:
+	pcap_cleanup_linux(handle);
+	return status;
 }
 
 /*
@@ -452,6 +1404,49 @@
 	return pcap_read_packet(handle, callback, user);
 }
 
+static int
+pcap_set_datalink_linux(pcap_t *handle, int dlt)
+{
+	handle->linktype = dlt;
+	return 0;
+}
+
+/*
+ * linux_check_direction()
+ *
+ * Do checks based on packet direction.
+ */
+static inline int
+linux_check_direction(const pcap_t *handle, const struct sockaddr_ll *sll)
+{
+	struct pcap_linux	*handlep = handle->priv;
+
+	if (sll->sll_pkttype == PACKET_OUTGOING) {
+		/*
+		 * Outgoing packet.
+		 * If this is from the loopback device, reject it;
+		 * we'll see the packet as an incoming packet as well,
+		 * and we don't want to see it twice.
+		 */
+		if (sll->sll_ifindex == handlep->lo_ifindex)
+			return 0;
+
+		/*
+		 * If the user only wants incoming packets, reject it.
+		 */
+		if (handle->direction == PCAP_D_IN)
+			return 0;
+	} else {
+		/*
+		 * Incoming packet.
+		 * If the user only wants outgoing packets, reject it.
+		 */
+		if (handle->direction == PCAP_D_OUT)
+			return 0;
+	}
+	return 1;
+}
+
 /*
  *  Read a packet from the socket calling the handler provided by
  *  the user. Returns the number of packets received or -1 if an
@@ -460,6 +1455,7 @@
 static int
 pcap_read_packet(pcap_t *handle, pcap_handler callback, u_char *userdata)
 {
+	struct pcap_linux	*handlep = handle->priv;
 	u_char			*bp;
 	int			offset;
 #ifdef HAVE_PF_PACKET_SOCKETS
@@ -468,7 +1464,17 @@
 #else
 	struct sockaddr		from;
 #endif
+#if defined(HAVE_PACKET_AUXDATA) && defined(HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI)
+	struct iovec		iov;
+	struct msghdr		msg;
+	struct cmsghdr		*cmsg;
+	union {
+		struct cmsghdr	cmsg;
+		char		buf[CMSG_SPACE(sizeof(struct tpacket_auxdata))];
+	} cmsg_buf;
+#else /* defined(HAVE_PACKET_AUXDATA) && defined(HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI) */
 	socklen_t		fromlen;
+#endif /* defined(HAVE_PACKET_AUXDATA) && defined(HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI) */
 	int			packet_len, caplen;
 	struct pcap_pkthdr	pcap_header;
 
@@ -477,7 +1483,7 @@
 	 * If this is a cooked device, leave extra room for a
 	 * fake packet header.
 	 */
-	if (handle->md.cooked)
+	if (handlep->cooked)
 		offset = SLL_HDR_LEN;
 	else
 		offset = 0;
@@ -489,43 +1495,90 @@
 	offset = 0;
 #endif
 
-	/* Receive a single packet from the kernel */
-
+	/*
+	 * Receive a single packet from the kernel.
+	 * We ignore EINTR, as that might just be due to a signal
+	 * being delivered - if the signal should interrupt the
+	 * loop, the signal handler should call pcap_breakloop()
+	 * to set handle->break_loop (we ignore it on other
+	 * platforms as well).
+	 * We also ignore ENETDOWN, so that we can continue to
+	 * capture traffic if the interface goes down and comes
+	 * back up again; comments in the kernel indicate that
+	 * we'll just block waiting for packets if we try to
+	 * receive from a socket that delivered ENETDOWN, and,
+	 * if we're using a memory-mapped buffer, we won't even
+	 * get notified of "network down" events.
+	 */
 	bp = handle->buffer + handle->offset;
+
+#if defined(HAVE_PACKET_AUXDATA) && defined(HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI)
+	msg.msg_name		= &from;
+	msg.msg_namelen		= sizeof(from);
+	msg.msg_iov		= &iov;
+	msg.msg_iovlen		= 1;
+	msg.msg_control		= &cmsg_buf;
+	msg.msg_controllen	= sizeof(cmsg_buf);
+	msg.msg_flags		= 0;
+
+	iov.iov_len		= handle->bufsize - offset;
+	iov.iov_base		= bp + offset;
+#endif /* defined(HAVE_PACKET_AUXDATA) && defined(HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI) */
+
 	do {
 		/*
 		 * Has "pcap_breakloop()" been called?
 		 */
 		if (handle->break_loop) {
 			/*
-			 * Yes - clear the flag that indicates that it
-			 * has, and return -2 as an indication that we
-			 * were told to break out of the loop.
+			 * Yes - clear the flag that indicates that it has,
+			 * and return PCAP_ERROR_BREAK as an indication that
+			 * we were told to break out of the loop.
 			 */
 			handle->break_loop = 0;
-			return -2;
+			return PCAP_ERROR_BREAK;
 		}
+
+#if defined(HAVE_PACKET_AUXDATA) && defined(HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI)
+		packet_len = recvmsg(handle->fd, &msg, MSG_TRUNC);
+#else /* defined(HAVE_PACKET_AUXDATA) && defined(HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI) */
 		fromlen = sizeof(from);
 		packet_len = recvfrom(
 			handle->fd, bp + offset,
 			handle->bufsize - offset, MSG_TRUNC,
 			(struct sockaddr *) &from, &fromlen);
+#endif /* defined(HAVE_PACKET_AUXDATA) && defined(HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI) */
 	} while (packet_len == -1 && errno == EINTR);
 
 	/* Check if an error occured */
 
 	if (packet_len == -1) {
-		if (errno == EAGAIN)
+		switch (errno) {
+
+		case EAGAIN:
 			return 0;	/* no packet there */
-		else {
-			snprintf(handle->errbuf, sizeof(handle->errbuf),
+
+		case ENETDOWN:
+			/*
+			 * 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 return that.
+			 */
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+				"The interface went down");
+			return PCAP_ERROR;
+
+		default:
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
 				 "recvfrom: %s", pcap_strerror(errno));
-			return -1;
+			return PCAP_ERROR;
 		}
 	}
 
 #ifdef HAVE_PF_PACKET_SOCKETS
-	if (!handle->md.sock_packet) {
+	if (!handlep->sock_packet) {
 		/*
 		 * Unfortunately, there is a window between socket() and
 		 * bind() where the kernel may queue packets from any
@@ -538,8 +1591,8 @@
 		 * filter support, and it's a bit more complicated.
 		 * It would save some instructions per packet, however.)
 		 */
-		if (handle->md.ifindex != -1 &&
-		    from.sll_ifindex != handle->md.ifindex)
+		if (handlep->ifindex != -1 &&
+		    from.sll_ifindex != handlep->ifindex)
 			return 0;
 
 		/*
@@ -548,29 +1601,8 @@
 		 * address returned for SOCK_PACKET is a "sockaddr_pkt"
 		 * which lacks the relevant packet type information.
 		 */
-		if (from.sll_pkttype == PACKET_OUTGOING) {
-			/*
-			 * Outgoing packet.
-			 * If this is from the loopback device, reject it;
-			 * we'll see the packet as an incoming packet as well,
-			 * and we don't want to see it twice.
-			 */
-			if (from.sll_ifindex == handle->md.lo_ifindex)
-				return 0;
-
-			/*
-			 * If the user only wants incoming packets, reject it.
-			 */
-			if (handle->direction == PCAP_D_IN)
-				return 0;
-		} else {
-			/*
-			 * Incoming packet.
-			 * If the user only wants outgoing packets, reject it.
-			 */
-			if (handle->direction == PCAP_D_OUT)
-				return 0;
-		}
+		if (!linux_check_direction(handle, &from))
+			return 0;
 	}
 #endif
 
@@ -578,7 +1610,7 @@
 	/*
 	 * If this is a cooked device, fill in the fake packet header.
 	 */
-	if (handle->md.cooked) {
+	if (handlep->cooked) {
 		/*
 		 * Add the length of the fake header to the length
 		 * of packet data we read.
@@ -586,42 +1618,7 @@
 		packet_len += SLL_HDR_LEN;
 
 		hdrp = (struct sll_header *)bp;
-
-		/*
-		 * Map the PACKET_ value to a LINUX_SLL_ value; we
-		 * want the same numerical value to be used in
-		 * the link-layer header even if the numerical values
-		 * for the PACKET_ #defines change, so that programs
-		 * that look at the packet type field will always be
-		 * able to handle DLT_LINUX_SLL captures.
-		 */
-		switch (from.sll_pkttype) {
-
-		case PACKET_HOST:
-			hdrp->sll_pkttype = htons(LINUX_SLL_HOST);
-			break;
-
-		case PACKET_BROADCAST:
-			hdrp->sll_pkttype = htons(LINUX_SLL_BROADCAST);
-			break;
-
-		case PACKET_MULTICAST:
-			hdrp->sll_pkttype = htons(LINUX_SLL_MULTICAST);
-			break;
-
-		case PACKET_OTHERHOST:
-			hdrp->sll_pkttype = htons(LINUX_SLL_OTHERHOST);
-			break;
-
-		case PACKET_OUTGOING:
-			hdrp->sll_pkttype = htons(LINUX_SLL_OUTGOING);
-			break;
-
-		default:
-			hdrp->sll_pkttype = -1;
-			break;
-		}
-
+		hdrp->sll_pkttype = map_packet_type_to_sll_type(from.sll_pkttype);
 		hdrp->sll_hatype = htons(from.sll_hatype);
 		hdrp->sll_halen = htons(from.sll_halen);
 		memcpy(hdrp->sll_addr, from.sll_addr,
@@ -630,7 +1627,45 @@
 		      from.sll_halen);
 		hdrp->sll_protocol = from.sll_protocol;
 	}
+
+#if defined(HAVE_PACKET_AUXDATA) && defined(HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI)
+	if (handlep->vlan_offset != -1) {
+		for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
+			struct tpacket_auxdata *aux;
+			unsigned int len;
+			struct vlan_tag *tag;
+
+			if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct tpacket_auxdata)) ||
+			    cmsg->cmsg_level != SOL_PACKET ||
+			    cmsg->cmsg_type != PACKET_AUXDATA)
+				continue;
+
+			aux = (struct tpacket_auxdata *)CMSG_DATA(cmsg);
+#if defined(TP_STATUS_VLAN_VALID)
+			if ((aux->tp_vlan_tci == 0) && !(aux->tp_status & TP_STATUS_VLAN_VALID))
+#else
+			if (aux->tp_vlan_tci == 0) /* this is ambigious but without the
+						TP_STATUS_VLAN_VALID flag, there is
+						nothing that we can do */
 #endif
+				continue;
+
+			len = packet_len > iov.iov_len ? iov.iov_len : packet_len;
+			if (len < (unsigned int) handlep->vlan_offset)
+				break;
+
+			bp -= VLAN_TAG_LEN;
+			memmove(bp, bp + VLAN_TAG_LEN, handlep->vlan_offset);
+
+			tag = (struct vlan_tag *)(bp + handlep->vlan_offset);
+			tag->vlan_tpid = htons(ETH_P_8021Q);
+			tag->vlan_tci = htons(aux->tp_vlan_tci);
+
+			packet_len += VLAN_TAG_LEN;
+		}
+	}
+#endif /* defined(HAVE_PACKET_AUXDATA) && defined(HAVE_LINUX_TPACKET_AUXDATA_TP_VLAN_TCI) */
+#endif /* HAVE_PF_PACKET_SOCKETS */
 
 	/*
 	 * XXX: According to the kernel source we should get the real
@@ -669,7 +1704,7 @@
 		caplen = handle->snapshot;
 
 	/* Run the packet filter if not using kernel filter */
-	if (!handle->md.use_bpf && handle->fcode.bf_insns) {
+	if (handlep->filter_in_userland && handle->fcode.bf_insns) {
 		if (bpf_filter(handle->fcode.bf_insns, bp,
 		                packet_len, caplen) == 0)
 		{
@@ -680,11 +1715,24 @@
 
 	/* Fill in our own header data */
 
-	if (ioctl(handle->fd, SIOCGSTAMP, &pcap_header.ts) == -1) {
-		snprintf(handle->errbuf, sizeof(handle->errbuf),
-			 "SIOCGSTAMP: %s", pcap_strerror(errno));
-		return -1;
-	}
+	/* get timestamp for this packet */
+#if defined(SIOCGSTAMPNS) && defined(SO_TIMESTAMPNS)
+	if (handle->opt.tstamp_precision == PCAP_TSTAMP_PRECISION_NANO) {
+		if (ioctl(handle->fd, SIOCGSTAMPNS, &pcap_header.ts) == -1) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+					"SIOCGSTAMPNS: %s", pcap_strerror(errno));
+			return PCAP_ERROR;
+		}
+        } else
+#endif
+	{
+		if (ioctl(handle->fd, SIOCGSTAMP, &pcap_header.ts) == -1) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+					"SIOCGSTAMP: %s", pcap_strerror(errno));
+			return PCAP_ERROR;
+		}
+        }
+
 	pcap_header.caplen	= caplen;
 	pcap_header.len		= packet_len;
 
@@ -721,17 +1769,18 @@
 	 * the count is more expensive than always testing a flag
 	 * in memory.
 	 *
-	 * We keep the count in "md.packets_read", and use that for
-	 * "ps_recv" if we can't get the statistics from the kernel.
+	 * We keep the count in "handlep->packets_read", and use that
+	 * for "ps_recv" if we can't get the statistics from the kernel.
 	 * We do that because, if we *can* get the statistics from
-	 * the kernel, we use "md.stat.ps_recv" and "md.stat.ps_drop"
-	 * as running counts, as reading the statistics from the
-	 * kernel resets the kernel statistics, and if we directly
-	 * increment "md.stat.ps_recv" here, that means it will
-	 * count packets *twice* on systems where we can get kernel
-	 * statistics - once here, and once in pcap_stats_linux().
+	 * the kernel, we use "handlep->stat.ps_recv" and
+	 * "handlep->stat.ps_drop" as running counts, as reading the
+	 * statistics from the kernel resets the kernel statistics,
+	 * and if we directly increment "handlep->stat.ps_recv" here,
+	 * that means it will count packets *twice* on systems where
+	 * we can get kernel statistics - once here, and once in
+	 * pcap_stats_linux().
 	 */
-	handle->md.packets_read++;
+	handlep->packets_read++;
 
 	/* Call the user supplied callback function */
 	callback(userdata, &pcap_header, bp);
@@ -742,12 +1791,13 @@
 static int
 pcap_inject_linux(pcap_t *handle, const void *buf, size_t size)
 {
+	struct pcap_linux *handlep = handle->priv;
 	int ret;
 
 #ifdef HAVE_PF_PACKET_SOCKETS
-	if (!handle->md.sock_packet) {
+	if (!handlep->sock_packet) {
 		/* PF_PACKET socket */
-		if (handle->md.ifindex == -1) {
+		if (handlep->ifindex == -1) {
 			/*
 			 * We don't support sending on the "any" device.
 			 */
@@ -757,7 +1807,7 @@
 			return (-1);
 		}
 
-		if (handle->md.cooked) {
+		if (handlep->cooked) {
 			/*
 			 * We don't support sending on the "any" device.
 			 *
@@ -793,10 +1843,41 @@
 static int
 pcap_stats_linux(pcap_t *handle, struct pcap_stat *stats)
 {
+	struct pcap_linux *handlep = handle->priv;
 #ifdef HAVE_TPACKET_STATS
+#ifdef HAVE_TPACKET3
+	/*
+	 * For sockets using TPACKET_V1 or TPACKET_V2, the extra
+	 * stuff at the end of a struct tpacket_stats_v3 will not
+	 * be filled in, and we don't look at it so this is OK even
+	 * for those sockets.  In addition, the PF_PACKET socket
+	 * code in the kernel only uses the length parameter to
+	 * compute how much data to copy out and to indicate how
+	 * much data was copied out, so it's OK to base it on the
+	 * size of a struct tpacket_stats.
+	 *
+	 * XXX - it's probably OK, in fact, to just use a
+	 * struct tpacket_stats for V3 sockets, as we don't
+	 * care about the tp_freeze_q_cnt stat.
+	 */
+	struct tpacket_stats_v3 kstats;
+#else /* HAVE_TPACKET3 */
 	struct tpacket_stats kstats;
+#endif /* HAVE_TPACKET3 */
 	socklen_t len = sizeof (struct tpacket_stats);
-#endif
+#endif /* HAVE_TPACKET_STATS */
+
+	long if_dropped = 0;
+	
+	/* 
+	 *	To fill in ps_ifdrop, we parse /proc/net/dev for the number
+	 */
+	if (handle->opt.promisc)
+	{
+		if_dropped = handlep->proc_dropped;
+		handlep->proc_dropped = linux_if_drops(handlep->device);
+		handlep->stat.ps_ifdrop += (handlep->proc_dropped - if_dropped);
+	}
 
 #ifdef HAVE_TPACKET_STATS
 	/*
@@ -818,6 +1899,8 @@
 		 *	dropped by the interface driver.  It counts only
 		 *	packets that passed the filter.
 		 *
+		 *	See above for ps_ifdrop. 
+		 *
 		 *	Both statistics include packets not yet read from
 		 *	the kernel by libpcap, and thus not yet seen by
 		 *	the application.
@@ -849,9 +1932,9 @@
 		 *    getsockopt(handle->fd, SOL_PACKET, PACKET_STATISTICS, ....
 		 * resets the counters to zero.
 		 */
-		handle->md.stat.ps_recv += kstats.tp_packets;
-		handle->md.stat.ps_drop += kstats.tp_drops;
-		*stats = handle->md.stat;
+		handlep->stat.ps_recv += kstats.tp_packets;
+		handlep->stat.ps_drop += kstats.tp_drops;
+		*stats = handlep->stat;
 		return 0;
 	}
 	else
@@ -881,20 +1964,359 @@
 	 *
 	 *	"ps_drop" is not supported.
 	 *
+	 *	"ps_ifdrop" is supported. It will return the number
+	 *	of drops the interface reports in /proc/net/dev,
+	 *	if that is available.
+	 *
 	 *	"ps_recv" doesn't include packets not yet read from
 	 *	the kernel by libpcap.
 	 *
 	 * We maintain the count of packets processed by libpcap in
-	 * "md.packets_read", for reasons described in the comment
+	 * "handlep->packets_read", for reasons described in the comment
 	 * at the end of pcap_read_packet().  We have no idea how many
-	 * packets were dropped.
+	 * packets were dropped by the kernel buffers -- but we know 
+	 * how many the interface dropped, so we can return that.
 	 */
-	stats->ps_recv = handle->md.packets_read;
+	 
+	stats->ps_recv = handlep->packets_read;
 	stats->ps_drop = 0;
+	stats->ps_ifdrop = handlep->stat.ps_ifdrop;
 	return 0;
 }
 
 /*
+ * Get from "/sys/class/net" all interfaces listed there; if they're
+ * already in the list of interfaces we have, that won't add another
+ * instance, but if they're not, that'll add them.
+ *
+ * We don't bother getting any addresses for them; it appears you can't
+ * use SIOCGIFADDR on Linux to get IPv6 addresses for interfaces, and,
+ * although some other types of addresses can be fetched with SIOCGIFADDR,
+ * we don't bother with them for now.
+ *
+ * We also don't fail if we couldn't open "/sys/class/net"; we just leave
+ * the list of interfaces as is, and return 0, so that we can try
+ * scanning /proc/net/dev.
+ */
+static int
+scan_sys_class_net(pcap_if_t **devlistp, char *errbuf)
+{
+	DIR *sys_class_net_d;
+	int fd;
+	struct dirent *ent;
+	char subsystem_path[PATH_MAX+1];
+	struct stat statb;
+	char *p;
+	char name[512];	/* XXX - pick a size */
+	char *q, *saveq;
+	struct ifreq ifrflags;
+	int ret = 1;
+
+	sys_class_net_d = opendir("/sys/class/net");
+	if (sys_class_net_d == NULL) {
+		/*
+		 * Don't fail if it doesn't exist at all.
+		 */
+		if (errno == ENOENT)
+			return (0);
+
+		/*
+		 * Fail if we got some other error.
+		 */
+		(void)snprintf(errbuf, PCAP_ERRBUF_SIZE,
+		    "Can't open /sys/class/net: %s", pcap_strerror(errno));
+		return (-1);
+	}
+
+	/*
+	 * Create a socket from which to fetch interface information.
+	 */
+	fd = socket(AF_INET, SOCK_DGRAM, 0);
+	if (fd < 0) {
+		(void)snprintf(errbuf, PCAP_ERRBUF_SIZE,
+		    "socket: %s", pcap_strerror(errno));
+		(void)closedir(sys_class_net_d);
+		return (-1);
+	}
+
+	for (;;) {
+		errno = 0;
+		ent = readdir(sys_class_net_d);
+		if (ent == NULL) {
+			/*
+			 * Error or EOF; if errno != 0, it's an error.
+			 */
+			break;
+		}
+
+		/*
+		 * Ignore "." and "..".
+		 */
+		if (strcmp(ent->d_name, ".") == 0 ||
+		    strcmp(ent->d_name, "..") == 0)
+			continue;
+
+		/*
+		 * Ignore plain files; they do not have subdirectories
+		 * and thus have no attributes.
+		 */
+		if (ent->d_type == DT_REG)
+			continue;
+
+		/*
+		 * Is there an "ifindex" file under that name?
+		 * (We don't care whether it's a directory or
+		 * a symlink; older kernels have directories
+		 * for devices, newer kernels have symlinks to
+		 * directories.)
+		 */
+		snprintf(subsystem_path, sizeof subsystem_path,
+		    "/sys/class/net/%s/ifindex", ent->d_name);
+		if (lstat(subsystem_path, &statb) != 0) {
+			/*
+			 * Stat failed.  Either there was an error
+			 * other than ENOENT, and we don't know if
+			 * this is an interface, or it's ENOENT,
+			 * and either some part of "/sys/class/net/{if}"
+			 * disappeared, in which case it probably means
+			 * the interface disappeared, or there's no
+			 * "ifindex" file, which means it's not a
+			 * network interface.
+			 */
+			continue;
+		}
+
+		/*
+		 * Get the interface name.
+		 */
+		p = &ent->d_name[0];
+		q = &name[0];
+		while (*p != '\0' && isascii(*p) && !isspace(*p)) {
+			if (*p == ':') {
+				/*
+				 * This could be the separator between a
+				 * name and an alias number, or it could be
+				 * the separator between a name with no
+				 * alias number and the next field.
+				 *
+				 * If there's a colon after digits, it
+				 * separates the name and the alias number,
+				 * otherwise it separates the name and the
+				 * next field.
+				 */
+				saveq = q;
+				while (isascii(*p) && isdigit(*p))
+					*q++ = *p++;
+				if (*p != ':') {
+					/*
+					 * That was the next field,
+					 * not the alias number.
+					 */
+					q = saveq;
+				}
+				break;
+			} else
+				*q++ = *p++;
+		}
+		*q = '\0';
+
+		/*
+		 * Get the flags for this interface, and skip it if
+		 * it's not up.
+		 */
+		strncpy(ifrflags.ifr_name, name, sizeof(ifrflags.ifr_name));
+		if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifrflags) < 0) {
+			if (errno == ENXIO || errno == ENODEV)
+				continue;
+			(void)snprintf(errbuf, PCAP_ERRBUF_SIZE,
+			    "SIOCGIFFLAGS: %.*s: %s",
+			    (int)sizeof(ifrflags.ifr_name),
+			    ifrflags.ifr_name,
+			    pcap_strerror(errno));
+			ret = -1;
+			break;
+		}
+		if (!(ifrflags.ifr_flags & IFF_UP))
+			continue;
+
+		/*
+		 * Add an entry for this interface, with no addresses.
+		 */
+		if (pcap_add_if(devlistp, name, ifrflags.ifr_flags, NULL,
+		    errbuf) == -1) {
+			/*
+			 * Failure.
+			 */
+			ret = -1;
+			break;
+		}
+	}
+	if (ret != -1) {
+		/*
+		 * Well, we didn't fail for any other reason; did we
+		 * fail due to an error reading the directory?
+		 */
+		if (errno != 0) {
+			(void)snprintf(errbuf, PCAP_ERRBUF_SIZE,
+			    "Error reading /sys/class/net: %s",
+			    pcap_strerror(errno));
+			ret = -1;
+		}
+	}
+
+	(void)close(fd);
+	(void)closedir(sys_class_net_d);
+	return (ret);
+}
+
+/*
+ * Get from "/proc/net/dev" all interfaces listed there; if they're
+ * already in the list of interfaces we have, that won't add another
+ * instance, but if they're not, that'll add them.
+ *
+ * See comments from scan_sys_class_net().
+ */
+static int
+scan_proc_net_dev(pcap_if_t **devlistp, char *errbuf)
+{
+	FILE *proc_net_f;
+	int fd;
+	char linebuf[512];
+	int linenum;
+	char *p;
+	char name[512];	/* XXX - pick a size */
+	char *q, *saveq;
+	struct ifreq ifrflags;
+	int ret = 0;
+
+	proc_net_f = fopen("/proc/net/dev", "r");
+	if (proc_net_f == NULL) {
+		/*
+		 * Don't fail if it doesn't exist at all.
+		 */
+		if (errno == ENOENT)
+			return (0);
+
+		/*
+		 * Fail if we got some other error.
+		 */
+		(void)snprintf(errbuf, PCAP_ERRBUF_SIZE,
+		    "Can't open /proc/net/dev: %s", pcap_strerror(errno));
+		return (-1);
+	}
+
+	/*
+	 * Create a socket from which to fetch interface information.
+	 */
+	fd = socket(AF_INET, SOCK_DGRAM, 0);
+	if (fd < 0) {
+		(void)snprintf(errbuf, PCAP_ERRBUF_SIZE,
+		    "socket: %s", pcap_strerror(errno));
+		(void)fclose(proc_net_f);
+		return (-1);
+	}
+
+	for (linenum = 1;
+	    fgets(linebuf, sizeof linebuf, proc_net_f) != NULL; linenum++) {
+		/*
+		 * Skip the first two lines - they're headers.
+		 */
+		if (linenum <= 2)
+			continue;
+
+		p = &linebuf[0];
+
+		/*
+		 * Skip leading white space.
+		 */
+		while (*p != '\0' && isascii(*p) && isspace(*p))
+			p++;
+		if (*p == '\0' || *p == '\n')
+			continue;	/* blank line */
+
+		/*
+		 * Get the interface name.
+		 */
+		q = &name[0];
+		while (*p != '\0' && isascii(*p) && !isspace(*p)) {
+			if (*p == ':') {
+				/*
+				 * This could be the separator between a
+				 * name and an alias number, or it could be
+				 * the separator between a name with no
+				 * alias number and the next field.
+				 *
+				 * If there's a colon after digits, it
+				 * separates the name and the alias number,
+				 * otherwise it separates the name and the
+				 * next field.
+				 */
+				saveq = q;
+				while (isascii(*p) && isdigit(*p))
+					*q++ = *p++;
+				if (*p != ':') {
+					/*
+					 * That was the next field,
+					 * not the alias number.
+					 */
+					q = saveq;
+				}
+				break;
+			} else
+				*q++ = *p++;
+		}
+		*q = '\0';
+
+		/*
+		 * Get the flags for this interface, and skip it if
+		 * it's not up.
+		 */
+		strncpy(ifrflags.ifr_name, name, sizeof(ifrflags.ifr_name));
+		if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifrflags) < 0) {
+			if (errno == ENXIO)
+				continue;
+			(void)snprintf(errbuf, PCAP_ERRBUF_SIZE,
+			    "SIOCGIFFLAGS: %.*s: %s",
+			    (int)sizeof(ifrflags.ifr_name),
+			    ifrflags.ifr_name,
+			    pcap_strerror(errno));
+			ret = -1;
+			break;
+		}
+		if (!(ifrflags.ifr_flags & IFF_UP))
+			continue;
+
+		/*
+		 * Add an entry for this interface, with no addresses.
+		 */
+		if (pcap_add_if(devlistp, name, ifrflags.ifr_flags, NULL,
+		    errbuf) == -1) {
+			/*
+			 * Failure.
+			 */
+			ret = -1;
+			break;
+		}
+	}
+	if (ret != -1) {
+		/*
+		 * Well, we didn't fail for any other reason; did we
+		 * fail due to an error reading the file?
+		 */
+		if (ferror(proc_net_f)) {
+			(void)snprintf(errbuf, PCAP_ERRBUF_SIZE,
+			    "Error reading /proc/net/dev: %s",
+			    pcap_strerror(errno));
+			ret = -1;
+		}
+	}
+
+	(void)close(fd);
+	(void)fclose(proc_net_f);
+	return (ret);
+}
+
+/*
  * Description string for the "any" device.
  */
 static const char any_descr[] = "Pseudo-device that captures on all interfaces";
@@ -902,19 +2324,33 @@
 int
 pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
 {
+	int ret;
+
+	/*
+	 * Read "/sys/class/net", and add to the list of interfaces all
+	 * interfaces listed there that we don't already have, because,
+	 * on Linux, SIOCGIFCONF reports only interfaces with IPv4 addresses,
+	 * and even getifaddrs() won't return information about
+	 * interfaces with no addresses, so you need to read "/sys/class/net"
+	 * to get the names of the rest of the interfaces.
+	 */
+	ret = scan_sys_class_net(alldevsp, errbuf);
+	if (ret == -1)
+		return (-1);	/* failed */
+	if (ret == 0) {
+		/*
+		 * No /sys/class/net; try reading /proc/net/dev instead.
+		 */
+		if (scan_proc_net_dev(alldevsp, errbuf) == -1)
+			return (-1);
+	}
+
+	/*
+	 * Add the "any" device.
+	 */
 	if (pcap_add_if(alldevsp, "any", 0, any_descr, errbuf) < 0)
 		return (-1);
 
-#ifdef HAVE_DAG_API
-	if (dag_platform_finddevs(alldevsp, errbuf) < 0)
-		return (-1);
-#endif /* HAVE_DAG_API */
-
-#ifdef HAVE_SEPTEL_API
-	if (septel_platform_finddevs(alldevsp, errbuf) < 0)
-		return (-1);
-#endif /* HAVE_SEPTEL_API */
-
 	return (0);
 }
 
@@ -922,8 +2358,10 @@
  *  Attach the given BPF code to the packet capture device.
  */
 static int
-pcap_setfilter_linux(pcap_t *handle, struct bpf_program *filter)
+pcap_setfilter_linux_common(pcap_t *handle, struct bpf_program *filter,
+    int is_mmapped)
 {
+	struct pcap_linux *handlep;
 #ifdef SO_ATTACH_FILTER
 	struct sock_fprog	fcode;
 	int			can_filter_in_kernel;
@@ -934,10 +2372,12 @@
 		return -1;
 	if (!filter) {
 	        strncpy(handle->errbuf, "setfilter: No filter specified",
-			sizeof(handle->errbuf));
+			PCAP_ERRBUF_SIZE);
 		return -1;
 	}
 
+	handlep = handle->priv;
+
 	/* Make our private copy of the filter */
 
 	if (install_bpf_program(handle, filter) < 0)
@@ -948,7 +2388,7 @@
 	 * Run user level packet filter by default. Will be overriden if
 	 * installing a kernel filter succeeds.
 	 */
-	handle->md.use_bpf = 0;
+	handlep->filter_in_userland = 1;
 
 	/* Install kernel level filter if possible */
 
@@ -975,13 +2415,13 @@
 		 *
 		 * Oh, and we also need to fix it up so that all "ret"
 		 * instructions with non-zero operands have 65535 as the
-		 * operand, and so that, if we're in cooked mode, all
-		 * memory-reference instructions use special magic offsets
-		 * in references to the link-layer header and assume that
-		 * the link-layer payload begins at 0; "fix_program()"
-		 * will do that.
+		 * operand if we're not capturing in memory-mapped modee,
+		 * and so that, if we're in cooked mode, all memory-reference
+		 * instructions use special magic offsets in references to
+		 * the link-layer header and assume that the link-layer
+		 * payload begins at 0; "fix_program()" will do that.
 		 */
-		switch (fix_program(handle, &fcode)) {
+		switch (fix_program(handle, &fcode, is_mmapped)) {
 
 		case -1:
 		default:
@@ -1009,11 +2449,38 @@
 		}
 	}
 
+	/*
+	 * NOTE: at this point, we've set both the "len" and "filter"
+	 * fields of "fcode".  As of the 2.6.32.4 kernel, at least,
+	 * those are the only members of the "sock_fprog" structure,
+	 * so we initialize every member of that structure.
+	 *
+	 * If there is anything in "fcode" that is not initialized,
+	 * it is either a field added in a later kernel, or it's
+	 * padding.
+	 *
+	 * If a new field is added, this code needs to be updated
+	 * to set it correctly.
+	 *
+	 * If there are no other fields, then:
+	 *
+	 *	if the Linux kernel looks at the padding, it's
+	 *	buggy;
+	 *
+	 *	if the Linux kernel doesn't look at the padding,
+	 *	then if some tool complains that we're passing
+	 *	uninitialized data to the kernel, then the tool
+	 *	is buggy and needs to understand that it's just
+	 *	padding.
+	 */
 	if (can_filter_in_kernel) {
 		if ((err = set_kernel_filter(handle, &fcode)) == 0)
 		{
-			/* Installation succeded - using kernel filter. */
-			handle->md.use_bpf = 1;
+			/*
+			 * Installation succeded - using kernel filter,
+			 * so userland filtering not needed.
+			 */
+			handlep->filter_in_userland = 0;
 		}
 		else if (err == -1)	/* Non-fatal error */
 		{
@@ -1038,7 +2505,7 @@
 	 * calling "pcap_setfilter()".  Otherwise, the kernel filter may
 	 * filter out packets that would pass the new userland filter.
 	 */
-	if (!handle->md.use_bpf)
+	if (handlep->filter_in_userland)
 		reset_kernel_filter(handle);
 
 	/*
@@ -1055,6 +2522,13 @@
 	return 0;
 }
 
+static int
+pcap_setfilter_linux(pcap_t *handle, struct bpf_program *filter)
+{
+	return pcap_setfilter_linux_common(handle, filter, 0);
+}
+
+
 /*
  * Set direction flag: Which packets do we accept on a forwarding
  * single device? IN, OUT or both?
@@ -1063,7 +2537,9 @@
 pcap_setdirection_linux(pcap_t *handle, pcap_direction_t d)
 {
 #ifdef HAVE_PF_PACKET_SOCKETS
-	if (!handle->md.sock_packet) {
+	struct pcap_linux *handlep = handle->priv;
+
+	if (!handlep->sock_packet) {
 		handle->direction = d;
 		return 0;
 	}
@@ -1072,11 +2548,46 @@
 	 * We're not using PF_PACKET sockets, so we can't determine
 	 * the direction of the packet.
 	 */
-	snprintf(handle->errbuf, sizeof(handle->errbuf),
+	snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
 	    "Setting direction is not supported on SOCK_PACKET sockets");
 	return -1;
 }
 
+#ifdef HAVE_PF_PACKET_SOCKETS
+/*
+ * Map the PACKET_ value to a LINUX_SLL_ value; we
+ * want the same numerical value to be used in
+ * the link-layer header even if the numerical values
+ * for the PACKET_ #defines change, so that programs
+ * that look at the packet type field will always be
+ * able to handle DLT_LINUX_SLL captures.
+ */
+static short int
+map_packet_type_to_sll_type(short int sll_pkttype)
+{
+	switch (sll_pkttype) {
+
+	case PACKET_HOST:
+		return htons(LINUX_SLL_HOST);
+
+	case PACKET_BROADCAST:
+		return htons(LINUX_SLL_BROADCAST);
+
+	case PACKET_MULTICAST:
+		return  htons(LINUX_SLL_MULTICAST);
+
+	case PACKET_OTHERHOST:
+		return htons(LINUX_SLL_OTHERHOST);
+
+	case PACKET_OUTGOING:
+		return htons(LINUX_SLL_OUTGOING);
+
+	default:
+		return -1;
+	}
+}
+#endif
+
 /*
  *  Linux uses the ARP hardware type to identify the type of an
  *  interface. pcap uses the DLT_xxx constants for this. This
@@ -1113,7 +2624,7 @@
 		 * XXX - are there any sorts of "fake Ethernet" that have
 		 * ARPHRD_ETHER but that *shouldn't offer DLT_DOCSIS as
 		 * a Cisco CMTS won't put traffic onto it or get traffic
-		 * bridged onto it?  ISDN is handled in "live_open_new()",
+		 * bridged onto it?  ISDN is handled in "activate_new()",
 		 * as we fall back on cooked mode there; are there any
 		 * others?
 		 */
@@ -1139,7 +2650,7 @@
 		break;
 
 	case ARPHRD_AX25:
-		handle->linktype = DLT_AX25;
+		handle->linktype = DLT_AX25_KISS;
 		break;
 
 	case ARPHRD_PRONET:
@@ -1149,6 +2660,12 @@
 	case ARPHRD_CHAOS:
 		handle->linktype = DLT_CHAOS;
 		break;
+#ifndef ARPHRD_CAN
+#define ARPHRD_CAN 280
+#endif
+	case ARPHRD_CAN:
+		handle->linktype = DLT_CAN_SOCKETCAN;
+		break;
 
 #ifndef ARPHRD_IEEE802_TR
 #define ARPHRD_IEEE802_TR 800	/* From Linux 2.4 */
@@ -1326,6 +2843,25 @@
 		handle->linktype = DLT_LTALK;
 		break;
 
+	case 18:
+		/*
+		 * RFC 4338 defines an encapsulation for IP and ARP
+		 * packets that's compatible with the RFC 2625
+		 * encapsulation, but that uses a different ARP
+		 * hardware type and hardware addresses.  That
+		 * ARP hardware type is 18; Linux doesn't define
+		 * any ARPHRD_ value as 18, but if it ever officially
+		 * supports RFC 4338-style IP-over-FC, it should define
+		 * one.
+		 *
+		 * For now, we map it to DLT_IP_OVER_FC, in the hopes
+		 * that this will encourage its use in the future,
+		 * should Linux ever officially support RFC 4338-style
+		 * IP-over-FC.
+		 */
+		handle->linktype = DLT_IP_OVER_FC;
+		break;
+
 #ifndef ARPHRD_FCPP
 #define ARPHRD_FCPP	784
 #endif
@@ -1343,11 +2879,62 @@
 #endif
 	case ARPHRD_FCFABRIC:
 		/*
-		 * We assume that those all mean RFC 2625 IP-over-
-		 * Fibre Channel, with the RFC 2625 header at
-		 * the beginning of the packet.
+		 * Back in 2002, Donald Lee at Cray wanted a DLT_ for
+		 * IP-over-FC:
+		 *
+		 *	http://www.mail-archive.com/tcpdump-workers@sandelman.ottawa.on.ca/msg01043.html
+		 *
+		 * and one was assigned.
+		 *
+		 * In a later private discussion (spun off from a message
+		 * on the ethereal-users list) on how to get that DLT_
+		 * value in libpcap on Linux, I ended up deciding that
+		 * the best thing to do would be to have him tweak the
+		 * driver to set the ARPHRD_ value to some ARPHRD_FCxx
+		 * type, and map all those types to DLT_IP_OVER_FC:
+		 *
+		 *	I've checked into the libpcap and tcpdump CVS tree
+		 *	support for DLT_IP_OVER_FC.  In order to use that,
+		 *	you'd have to modify your modified driver to return
+		 *	one of the ARPHRD_FCxxx types, in "fcLINUXfcp.c" -
+		 *	change it to set "dev->type" to ARPHRD_FCFABRIC, for
+		 *	example (the exact value doesn't matter, it can be
+		 *	any of ARPHRD_FCPP, ARPHRD_FCAL, ARPHRD_FCPL, or
+		 *	ARPHRD_FCFABRIC).
+		 *
+		 * 11 years later, Christian Svensson wanted to map
+		 * various ARPHRD_ values to DLT_FC_2 and
+		 * DLT_FC_2_WITH_FRAME_DELIMS for raw Fibre Channel
+		 * frames:
+		 *
+		 *	https://github.com/mcr/libpcap/pull/29
+		 *
+		 * There doesn't seem to be any network drivers that uses
+		 * any of the ARPHRD_FC* values for IP-over-FC, and
+		 * it's not exactly clear what the "Dummy types for non
+		 * ARP hardware" are supposed to mean (link-layer
+		 * header type?  Physical network type?), so it's
+		 * not exactly clear why the ARPHRD_FC* types exist
+		 * in the first place.
+		 *
+		 * For now, we map them to DLT_FC_2, and provide an
+		 * option of DLT_FC_2_WITH_FRAME_DELIMS, as well as
+		 * DLT_IP_OVER_FC just in case there's some old
+		 * driver out there that uses one of those types for
+		 * IP-over-FC on which somebody wants to capture
+		 * packets.
 		 */
-		handle->linktype = DLT_IP_OVER_FC;
+		handle->dlt_list = (u_int *) malloc(sizeof(u_int) * 2);
+		/*
+		 * If that fails, just leave the list empty.
+		 */
+		if (handle->dlt_list != NULL) {
+			handle->dlt_list[0] = DLT_FC_2;
+			handle->dlt_list[1] = DLT_FC_2_WITH_FRAME_DELIMS;
+			handle->dlt_list[2] = DLT_IP_OVER_FC;
+			handle->dlt_count = 3;
+		}
+		handle->linktype = DLT_FC_2;
 		break;
 
 #ifndef ARPHRD_IRDA
@@ -1358,7 +2945,7 @@
 		handle->linktype = DLT_LINUX_IRDA;
 		/* We need to save packet direction for IrDA decoding,
 		 * so let's use "Linux-cooked" mode. Jean II */
-		//handle->md.cooked = 1;
+		//handlep->cooked = 1;
 		break;
 
 	/* ARPHRD_LAPD is unofficial and randomly allocated, if reallocation
@@ -1371,6 +2958,24 @@
 		handle->linktype = DLT_LINUX_LAPD;
 		break;
 
+#ifndef ARPHRD_NONE
+#define ARPHRD_NONE	0xFFFE
+#endif
+	case ARPHRD_NONE:
+		/*
+		 * No link-layer header; packets are just IP
+		 * packets, so use DLT_RAW.
+		 */
+		handle->linktype = DLT_RAW;
+		break;
+
+#ifndef ARPHRD_IEEE802154
+#define ARPHRD_IEEE802154      804
+#endif
+       case ARPHRD_IEEE802154:
+               handle->linktype =  DLT_IEEE802_15_4_NOFCS;
+               break;
+
 	default:
 		handle->linktype = -1;
 		break;
@@ -1380,226 +2985,1660 @@
 /* ===== Functions to interface to the newer kernels ================== */
 
 /*
- *  Try to open a packet socket using the new kernel interface.
- *  Returns 0 on failure.
- *  FIXME: 0 uses to mean success (Sebastian)
+ * Try to open a packet socket using the new kernel PF_PACKET interface.
+ * Returns 1 on success, 0 on an error that means the new interface isn't
+ * present (so the old SOCK_PACKET interface should be tried), and a
+ * PCAP_ERROR_ value on an error that means that the old mechanism won't
+ * work either (so it shouldn't be tried).
  */
 static int
-live_open_new(pcap_t *handle, const char *device, int promisc,
-	      int to_ms, char *ebuf)
+activate_new(pcap_t *handle)
 {
 #ifdef HAVE_PF_PACKET_SOCKETS
+	struct pcap_linux *handlep = handle->priv;
+	const char		*device = handle->opt.source;
+	int			is_any_device = (strcmp(device, "any") == 0);
 	int			sock_fd = -1, arptype;
-	int			err;
-	int			fatal_err = 0;
+#ifdef HAVE_PACKET_AUXDATA
+	int			val;
+#endif
+	int			err = 0;
 	struct packet_mreq	mr;
 
-	/* One shot loop used for error handling - bail out with break */
+	/*
+	 * Open a socket with protocol family packet. If the
+	 * "any" device was specified, we open a SOCK_DGRAM
+	 * socket for the cooked interface, otherwise we first
+	 * try a SOCK_RAW socket for the raw interface.
+	 */
+	sock_fd = is_any_device ?
+		socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL)) :
+		socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
 
-	do {
-		/*
-		 * Open a socket with protocol family packet. If a device is
-		 * given we try to open it in raw mode otherwise we use
-		 * the cooked interface.
-		 */
-		sock_fd = device ?
-			socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
-		      : socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL));
-
-		if (sock_fd == -1) {
-			snprintf(ebuf, PCAP_ERRBUF_SIZE, "socket: %s",
-				 pcap_strerror(errno) );
-			break;
+	if (sock_fd == -1) {
+		if (errno == EINVAL || errno == EAFNOSUPPORT) {
+			/*
+			 * We don't support PF_PACKET/SOCK_whatever
+			 * sockets; try the old mechanism.
+			 */
+			return 0;
 		}
 
-		/* It seems the kernel supports the new interface. */
-		handle->md.sock_packet = 0;
-
-		/*
-		 * Get the interface index of the loopback device.
-		 * If the attempt fails, don't fail, just set the
-		 * "md.lo_ifindex" to -1.
-		 *
-		 * XXX - can there be more than one device that loops
-		 * packets back, i.e. devices other than "lo"?  If so,
-		 * we'd need to find them all, and have an array of
-		 * indices for them, and check all of them in
-		 * "pcap_read_packet()".
-		 */
-		handle->md.lo_ifindex = iface_get_id(sock_fd, "lo", ebuf);
-
-		/*
-		 * Default value for offset to align link-layer payload
-		 * on a 4-byte boundary.
-		 */
-		handle->offset	 = 0;
-
-		/*
-		 * What kind of frames do we have to deal with? Fall back
-		 * to cooked mode if we have an unknown interface type.
-		 */
-
-		if (device) {
-			/* Assume for now we don't need cooked mode. */
-			handle->md.cooked = 0;
-
-			arptype	= iface_get_arptype(sock_fd, device, ebuf);
-			if (arptype == -1) {
-				fatal_err = 1;
-				break;
-			}
-			map_arphrd_to_dlt(handle, arptype, 1);
-			if (handle->linktype == -1 ||
-			    handle->linktype == DLT_LINUX_SLL ||
-			    handle->linktype == DLT_LINUX_IRDA ||
-			    handle->linktype == DLT_LINUX_LAPD ||
-			    (handle->linktype == DLT_EN10MB &&
-			     (strncmp("isdn", device, 4) == 0 ||
-			      strncmp("isdY", device, 4) == 0))) {
-				/*
-				 * Unknown interface type (-1), or a
-				 * device we explicitly chose to run
-				 * in cooked mode (e.g., PPP devices),
-				 * or an ISDN device (whose link-layer
-				 * type we can only determine by using
-				 * APIs that may be different on different
-				 * kernels) - reopen in cooked mode.
-				 */
-				if (close(sock_fd) == -1) {
-					snprintf(ebuf, PCAP_ERRBUF_SIZE,
-						 "close: %s", pcap_strerror(errno));
-					break;
-				}
-				sock_fd = socket(PF_PACKET, SOCK_DGRAM,
-						 htons(ETH_P_ALL));
-				if (sock_fd == -1) {
-					snprintf(ebuf, PCAP_ERRBUF_SIZE,
-						 "socket: %s", pcap_strerror(errno));
-					break;
-				}
-				handle->md.cooked = 1;
-
-				/*
-				 * Get rid of any link-layer type list
-				 * we allocated - this only supports cooked
-				 * capture.
-				 */
-				if (handle->dlt_list != NULL) {
-					free(handle->dlt_list);
-					handle->dlt_list = NULL;
-					handle->dlt_count = 0;
-				}
-
-				if (handle->linktype == -1) {
-					/*
-					 * Warn that we're falling back on
-					 * cooked mode; we may want to
-					 * update "map_arphrd_to_dlt()"
-					 * to handle the new type.
-					 */
-					snprintf(ebuf, PCAP_ERRBUF_SIZE,
-						"arptype %d not "
-						"supported by libpcap - "
-						"falling back to cooked "
-						"socket",
-						arptype);
-				}
-				/* IrDA capture is not a real "cooked" capture,
-				 * it's IrLAP frames, not IP packets. */
-				if (handle->linktype != DLT_LINUX_IRDA &&
-			    		handle->linktype != DLT_LINUX_LAPD)
-					handle->linktype = DLT_LINUX_SLL;
-			}
-
-			handle->md.ifindex = iface_get_id(sock_fd, device, ebuf);
-			if (handle->md.ifindex == -1)
-				break;
-
-			if ((err = iface_bind(sock_fd, handle->md.ifindex,
-			    ebuf)) < 0) {
-				if (err == -2)
-					fatal_err = 1;
-				break;
-			}
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "socket: %s",
+			 pcap_strerror(errno) );
+		if (errno == EPERM || errno == EACCES) {
+			/*
+			 * You don't have permission to open the
+			 * socket.
+			 */
+			return PCAP_ERROR_PERM_DENIED;
 		} else {
 			/*
-			 * This is cooked mode.
+			 * Other error.
 			 */
-			handle->md.cooked = 1;
-			handle->linktype = DLT_LINUX_SLL;
+			return PCAP_ERROR;
+		}
+	}
+
+	/* It seems the kernel supports the new interface. */
+	handlep->sock_packet = 0;
+
+	/*
+	 * Get the interface index of the loopback device.
+	 * If the attempt fails, don't fail, just set the
+	 * "handlep->lo_ifindex" to -1.
+	 *
+	 * XXX - can there be more than one device that loops
+	 * packets back, i.e. devices other than "lo"?  If so,
+	 * we'd need to find them all, and have an array of
+	 * indices for them, and check all of them in
+	 * "pcap_read_packet()".
+	 */
+	handlep->lo_ifindex = iface_get_id(sock_fd, "lo", handle->errbuf);
+
+	/*
+	 * Default value for offset to align link-layer payload
+	 * on a 4-byte boundary.
+	 */
+	handle->offset	 = 0;
+
+	/*
+	 * What kind of frames do we have to deal with? Fall back
+	 * to cooked mode if we have an unknown interface type
+	 * or a type we know doesn't work well in raw mode.
+	 */
+	if (!is_any_device) {
+		/* Assume for now we don't need cooked mode. */
+		handlep->cooked = 0;
+
+		if (handle->opt.rfmon) {
+			/*
+			 * We were asked to turn on monitor mode.
+			 * Do so before we get the link-layer type,
+			 * because entering monitor mode could change
+			 * the link-layer type.
+			 */
+			err = enter_rfmon_mode(handle, sock_fd, device);
+			if (err < 0) {
+				/* Hard failure */
+				close(sock_fd);
+				return err;
+			}
+			if (err == 0) {
+				/*
+				 * Nothing worked for turning monitor mode
+				 * on.
+				 */
+				close(sock_fd);
+				return PCAP_ERROR_RFMON_NOTSUP;
+			}
 
 			/*
-			 * We're not bound to a device.
-			 * XXX - true?  Or true only if we're using
-			 * the "any" device?
-			 * For now, we're using this as an indication
-			 * that we can't transmit; stop doing that only
-			 * if we figure out how to transmit in cooked
-			 * mode.
+			 * Either monitor mode has been turned on for
+			 * the device, or we've been given a different
+			 * device to open for monitor mode.  If we've
+			 * been given a different device, use it.
 			 */
-			handle->md.ifindex = -1;
+			if (handlep->mondevice != NULL)
+				device = handlep->mondevice;
 		}
-
-		/*
-		 * Select promiscuous mode on if "promisc" is set.
-		 *
-		 * Do not turn allmulti mode on if we don't select
-		 * promiscuous mode - on some devices (e.g., Orinoco
-		 * wireless interfaces), allmulti mode isn't supported
-		 * and the driver implements it by turning promiscuous
-		 * mode on, and that screws up the operation of the
-		 * card as a normal networking interface, and on no
-		 * other platform I know of does starting a non-
-		 * promiscuous capture affect which multicast packets
-		 * are received by the interface.
-		 */
-
-		/*
-		 * Hmm, how can we set promiscuous mode on all interfaces?
-		 * I am not sure if that is possible at all.
-		 */
-
-		if (device && promisc) {
-			memset(&mr, 0, sizeof(mr));
-			mr.mr_ifindex = handle->md.ifindex;
-			mr.mr_type    = PACKET_MR_PROMISC;
-			if (setsockopt(sock_fd, SOL_PACKET,
-				PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) == -1)
-			{
-				snprintf(ebuf, PCAP_ERRBUF_SIZE,
-					"setsockopt: %s", pcap_strerror(errno));
-				break;
+		arptype	= iface_get_arptype(sock_fd, device, handle->errbuf);
+		if (arptype < 0) {
+			close(sock_fd);
+			return arptype;
+		}
+		map_arphrd_to_dlt(handle, arptype, 1);
+		if (handle->linktype == -1 ||
+		    handle->linktype == DLT_LINUX_SLL ||
+		    handle->linktype == DLT_LINUX_IRDA ||
+		    handle->linktype == DLT_LINUX_LAPD ||
+		    (handle->linktype == DLT_EN10MB &&
+		     (strncmp("isdn", device, 4) == 0 ||
+		      strncmp("isdY", device, 4) == 0))) {
+			/*
+			 * Unknown interface type (-1), or a
+			 * device we explicitly chose to run
+			 * in cooked mode (e.g., PPP devices),
+			 * or an ISDN device (whose link-layer
+			 * type we can only determine by using
+			 * APIs that may be different on different
+			 * kernels) - reopen in cooked mode.
+			 */
+			if (close(sock_fd) == -1) {
+				snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+					 "close: %s", pcap_strerror(errno));
+				return PCAP_ERROR;
 			}
+			sock_fd = socket(PF_PACKET, SOCK_DGRAM,
+			    htons(ETH_P_ALL));
+			if (sock_fd == -1) {
+				snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+				    "socket: %s", pcap_strerror(errno));
+				if (errno == EPERM || errno == EACCES) {
+					/*
+					 * You don't have permission to
+					 * open the socket.
+					 */
+					return PCAP_ERROR_PERM_DENIED;
+				} else {
+					/*
+					 * Other error.
+					 */
+					return PCAP_ERROR;
+				}
+			}
+			handlep->cooked = 1;
+
+			/*
+			 * Get rid of any link-layer type list
+			 * we allocated - this only supports cooked
+			 * capture.
+			 */
+			if (handle->dlt_list != NULL) {
+				free(handle->dlt_list);
+				handle->dlt_list = NULL;
+				handle->dlt_count = 0;
+			}
+
+			if (handle->linktype == -1) {
+				/*
+				 * Warn that we're falling back on
+				 * cooked mode; we may want to
+				 * update "map_arphrd_to_dlt()"
+				 * to handle the new type.
+				 */
+				snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+					"arptype %d not "
+					"supported by libpcap - "
+					"falling back to cooked "
+					"socket",
+					arptype);
+			}
+
+			/*
+			 * IrDA capture is not a real "cooked" capture,
+			 * it's IrLAP frames, not IP packets.  The
+			 * same applies to LAPD capture.
+			 */
+			if (handle->linktype != DLT_LINUX_IRDA &&
+			    handle->linktype != DLT_LINUX_LAPD)
+				handle->linktype = DLT_LINUX_SLL;
 		}
 
-		/* Save the socket FD in the pcap structure */
+		handlep->ifindex = iface_get_id(sock_fd, device,
+		    handle->errbuf);
+		if (handlep->ifindex == -1) {
+			close(sock_fd);
+			return PCAP_ERROR;
+		}
 
-		handle->fd 	 = sock_fd;
-
-		return 1;
-
-	} while(0);
-
-	if (sock_fd != -1)
-		close(sock_fd);
-
-	if (fatal_err) {
+		if ((err = iface_bind(sock_fd, handlep->ifindex,
+		    handle->errbuf)) != 1) {
+		    	close(sock_fd);
+			if (err < 0)
+				return err;
+			else
+				return 0;	/* try old mechanism */
+		}
+	} else {
 		/*
-		 * Get rid of any link-layer type list we allocated.
+		 * The "any" device.
 		 */
-		if (handle->dlt_list != NULL)
-			free(handle->dlt_list);
-		return -2;
-	} else
-		return 0;
-#else
+		if (handle->opt.rfmon) {
+			/*
+			 * It doesn't support monitor mode.
+			 */
+			return PCAP_ERROR_RFMON_NOTSUP;
+		}
+
+		/*
+		 * It uses cooked mode.
+		 */
+		handlep->cooked = 1;
+		handle->linktype = DLT_LINUX_SLL;
+
+		/*
+		 * We're not bound to a device.
+		 * For now, we're using this as an indication
+		 * that we can't transmit; stop doing that only
+		 * if we figure out how to transmit in cooked
+		 * mode.
+		 */
+		handlep->ifindex = -1;
+	}
+
+	/*
+	 * Select promiscuous mode on if "promisc" is set.
+	 *
+	 * Do not turn allmulti mode on if we don't select
+	 * promiscuous mode - on some devices (e.g., Orinoco
+	 * wireless interfaces), allmulti mode isn't supported
+	 * and the driver implements it by turning promiscuous
+	 * mode on, and that screws up the operation of the
+	 * card as a normal networking interface, and on no
+	 * other platform I know of does starting a non-
+	 * promiscuous capture affect which multicast packets
+	 * are received by the interface.
+	 */
+
+	/*
+	 * Hmm, how can we set promiscuous mode on all interfaces?
+	 * I am not sure if that is possible at all.  For now, we
+	 * silently ignore attempts to turn promiscuous mode on
+	 * for the "any" device (so you don't have to explicitly
+	 * disable it in programs such as tcpdump).
+	 */
+
+	if (!is_any_device && handle->opt.promisc) {
+		memset(&mr, 0, sizeof(mr));
+		mr.mr_ifindex = handlep->ifindex;
+		mr.mr_type    = PACKET_MR_PROMISC;
+		if (setsockopt(sock_fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP,
+		    &mr, sizeof(mr)) == -1) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+				"setsockopt: %s", pcap_strerror(errno));
+			close(sock_fd);
+			return PCAP_ERROR;
+		}
+	}
+
+	/* Enable auxillary data if supported and reserve room for
+	 * reconstructing VLAN headers. */
+#ifdef HAVE_PACKET_AUXDATA
+	val = 1;
+	if (setsockopt(sock_fd, SOL_PACKET, PACKET_AUXDATA, &val,
+		       sizeof(val)) == -1 && errno != ENOPROTOOPT) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			 "setsockopt: %s", pcap_strerror(errno));
+		close(sock_fd);
+		return PCAP_ERROR;
+	}
+	handle->offset += VLAN_TAG_LEN;
+#endif /* HAVE_PACKET_AUXDATA */
+
+	/*
+	 * This is a 2.2[.x] or later kernel (we know that
+	 * because we're not using a SOCK_PACKET socket -
+	 * PF_PACKET is supported only in 2.2 and later
+	 * kernels).
+	 *
+	 * We can safely pass "recvfrom()" a byte count
+	 * based on the snapshot length.
+	 *
+	 * If we're in cooked mode, make the snapshot length
+	 * large enough to hold a "cooked mode" header plus
+	 * 1 byte of packet data (so we don't pass a byte
+	 * count of 0 to "recvfrom()").
+	 */
+	if (handlep->cooked) {
+		if (handle->snapshot < SLL_HDR_LEN + 1)
+			handle->snapshot = SLL_HDR_LEN + 1;
+	}
+	handle->bufsize = handle->snapshot;
+
+	/*
+	 * Set the offset at which to insert VLAN tags.
+	 */
+	switch (handle->linktype) {
+
+	case DLT_EN10MB:
+		handlep->vlan_offset = 2 * ETH_ALEN;
+		break;
+
+	case DLT_LINUX_SLL:
+		handlep->vlan_offset = 14;
+		break;
+
+	default:
+		handlep->vlan_offset = -1; /* unknown */
+		break;
+	}
+
+	/* Save the socket FD in the pcap structure */
+	handle->fd = sock_fd;
+
+#if defined(SIOCGSTAMPNS) && defined(SO_TIMESTAMPNS)
+	if (handle->opt.tstamp_precision == PCAP_TSTAMP_PRECISION_NANO) {
+		int nsec_tstamps = 1;
+
+		if (setsockopt(handle->fd, SOL_SOCKET, SO_TIMESTAMPNS, &nsec_tstamps, sizeof(nsec_tstamps)) < 0) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "setsockopt: unable to set SO_TIMESTAMPNS");
+			return PCAP_ERROR;
+		}
+	}
+#endif /* defined(SIOCGSTAMPNS) && defined(SO_TIMESTAMPNS) */
+
+	return 1;
+#else /* HAVE_PF_PACKET_SOCKETS */
 	strncpy(ebuf,
 		"New packet capturing interface not supported by build "
 		"environment", PCAP_ERRBUF_SIZE);
 	return 0;
-#endif
+#endif /* HAVE_PF_PACKET_SOCKETS */
 }
 
+#ifdef HAVE_PACKET_RING
+/*
+ * Attempt to activate with memory-mapped access.
+ *
+ * On success, returns 1, and sets *status to 0 if there are no warnings
+ * or to a PCAP_WARNING_ code if there is a warning.
+ *
+ * On failure due to lack of support for memory-mapped capture, returns
+ * 0.
+ *
+ * On error, returns -1, and sets *status to the appropriate error code;
+ * if that is PCAP_ERROR, sets handle->errbuf to the appropriate message.
+ */
+static int 
+activate_mmap(pcap_t *handle, int *status)
+{
+	struct pcap_linux *handlep = handle->priv;
+	int ret;
+
+	/*
+	 * Attempt to allocate a buffer to hold the contents of one
+	 * packet, for use by the oneshot callback.
+	 */
+	handlep->oneshot_buffer = malloc(handle->snapshot);
+	if (handlep->oneshot_buffer == NULL) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			 "can't allocate oneshot buffer: %s",
+			 pcap_strerror(errno));
+		*status = PCAP_ERROR;
+		return -1;
+	}
+
+	if (handle->opt.buffer_size == 0) {
+		/* by default request 2M for the ring buffer */
+		handle->opt.buffer_size = 2*1024*1024;
+	}
+	ret = prepare_tpacket_socket(handle);
+	if (ret == -1) {
+		free(handlep->oneshot_buffer);
+		*status = PCAP_ERROR;
+		return ret;
+	}
+	ret = create_ring(handle, status);
+	if (ret == 0) {
+		/*
+		 * We don't support memory-mapped capture; our caller
+		 * will fall back on reading from the socket.
+		 */
+		free(handlep->oneshot_buffer);
+		return 0;
+	}
+	if (ret == -1) {
+		/*
+		 * Error attempting to enable memory-mapped capture;
+		 * fail.  create_ring() has set *status.
+		 */
+		free(handlep->oneshot_buffer);
+		return -1;
+	}
+
+	/*
+	 * Success.  *status has been set either to 0 if there are no
+	 * warnings or to a PCAP_WARNING_ value if there is a warning.
+	 *
+	 * Override some defaults and inherit the other fields from
+	 * activate_new.
+	 * handle->offset is used to get the current position into the rx ring.
+	 * handle->cc is used to store the ring size.
+	 */
+
+	switch (handlep->tp_version) {
+	case TPACKET_V1:
+		handle->read_op = pcap_read_linux_mmap_v1;
+		break;
+#ifdef HAVE_TPACKET2
+	case TPACKET_V2:
+		handle->read_op = pcap_read_linux_mmap_v2;
+		break;
+#endif
+#ifdef HAVE_TPACKET3
+	case TPACKET_V3:
+		handle->read_op = pcap_read_linux_mmap_v3;
+		break;
+#endif
+	}
+	handle->cleanup_op = pcap_cleanup_linux_mmap;
+	handle->setfilter_op = pcap_setfilter_linux_mmap;
+	handle->setnonblock_op = pcap_setnonblock_mmap;
+	handle->getnonblock_op = pcap_getnonblock_mmap;
+	handle->oneshot_callback = pcap_oneshot_mmap;
+	handle->selectable_fd = handle->fd;
+	return 1;
+}
+#else /* HAVE_PACKET_RING */
+static int 
+activate_mmap(pcap_t *handle _U_, int *status _U_)
+{
+	return 0;
+}
+#endif /* HAVE_PACKET_RING */
+
+#ifdef HAVE_PACKET_RING
+
+#if defined(HAVE_TPACKET2) || defined(HAVE_TPACKET3)
+/*
+ * Attempt to set the socket to the specified version of the memory-mapped
+ * header.
+ *
+ * Return 0 if we succeed; return 1 if we fail because that version isn't
+ * supported; return -1 on any other error, and set handle->errbuf.
+ */
+static int
+init_tpacket(pcap_t *handle, int version, const char *version_str)
+{
+	struct pcap_linux *handlep = handle->priv;
+	int val = version;
+	socklen_t len = sizeof(val);
+
+	/* Probe whether kernel supports the specified TPACKET version */
+	if (getsockopt(handle->fd, SOL_PACKET, PACKET_HDRLEN, &val, &len) < 0) {
+		if (errno == ENOPROTOOPT || errno == EINVAL)
+			return 1;	/* no */
+
+		/* Failed to even find out; this is a fatal error. */
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			"can't get %s header len on packet socket: %s",
+			version_str,
+			pcap_strerror(errno));
+		return -1;
+	}
+	handlep->tp_hdrlen = val;
+
+	val = version;
+	if (setsockopt(handle->fd, SOL_PACKET, PACKET_VERSION, &val,
+			   sizeof(val)) < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			"can't activate %s on packet socket: %s",
+			version_str,
+			pcap_strerror(errno));
+		return -1;
+	}
+	handlep->tp_version = version;
+
+	/* Reserve space for VLAN tag reconstruction */
+	val = VLAN_TAG_LEN;
+	if (setsockopt(handle->fd, SOL_PACKET, PACKET_RESERVE, &val,
+			   sizeof(val)) < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			"can't set up reserve on packet socket: %s",
+			pcap_strerror(errno));
+		return -1;
+	}
+
+	return 0;
+}
+#endif /* defined HAVE_TPACKET2 || defined HAVE_TPACKET3 */
+
+/*
+ * Attempt to set the socket to version 3 of the memory-mapped header and,
+ * if that fails because version 3 isn't supported, attempt to fall
+ * back to version 2.  If version 2 isn't supported, just leave it at
+ * version 1.
+ *
+ * Return 1 if we succeed or if we fail because neither version 2 nor 3 is
+ * supported; return -1 on any other error, and set handle->errbuf.
+ */
+static int
+prepare_tpacket_socket(pcap_t *handle)
+{
+	struct pcap_linux *handlep = handle->priv;
+#if defined(HAVE_TPACKET2) || defined(HAVE_TPACKET3)
+	int ret;
+#endif
+
+	handlep->tp_version = TPACKET_V1;
+	handlep->tp_hdrlen = sizeof(struct tpacket_hdr);
+
+#ifdef HAVE_TPACKET3
+	/*
+	 * The only mode in which buffering is done on PF_PACKET
+	 * sockets, so that packets might not be delivered
+	 * immediately, is TPACKET_V3 mode.
+	 *
+	 * The buffering cannot be disabled in that mode, so
+	 * if the user has requested immediate mode, we don't
+	 * use TPACKET_V3.
+	 */
+	if (handle->opt.immediate)
+		ret = 1; /* pretend TPACKET_V3 couldn't be set */
+	else
+		ret = init_tpacket(handle, TPACKET_V3, "TPACKET_V3");
+	if (-1 == ret) {
+		/* Error during setting up TPACKET_V3. */
+		return -1;
+	} else if (1 == ret) {
+		/* TPACKET_V3 not supported - fall back to TPACKET_V2. */
+#endif /* HAVE_TPACKET3 */
+
+#ifdef HAVE_TPACKET2
+		ret = init_tpacket(handle, TPACKET_V2, "TPACKET_V2");
+		if (-1 == ret) {
+			/* Error during setting up TPACKET_V2. */
+			return -1;
+		}
+#endif /* HAVE_TPACKET2 */
+
+#ifdef HAVE_TPACKET3
+	}
+#endif /* HAVE_TPACKET3 */
+
+	return 1;
+}
+
+/*
+ * Attempt to set up memory-mapped access.
+ *
+ * On success, returns 1, and sets *status to 0 if there are no warnings
+ * or to a PCAP_WARNING_ code if there is a warning.
+ *
+ * On failure due to lack of support for memory-mapped capture, returns
+ * 0.
+ *
+ * On error, returns -1, and sets *status to the appropriate error code;
+ * if that is PCAP_ERROR, sets handle->errbuf to the appropriate message.
+ */
+static int
+create_ring(pcap_t *handle, int *status)
+{
+	struct pcap_linux *handlep = handle->priv;
+	unsigned i, j, frames_per_block;
+#ifdef HAVE_TPACKET3
+	/*
+	 * For sockets using TPACKET_V1 or TPACKET_V2, the extra
+	 * stuff at the end of a struct tpacket_req3 will be
+	 * ignored, so this is OK even for those sockets.
+	 */
+	struct tpacket_req3 req;
+#else
+	struct tpacket_req req;
+#endif
+	socklen_t len;
+	unsigned int sk_type, tp_reserve, maclen, tp_hdrlen, netoff, macoff;
+	unsigned int frame_size;
+
+	/*
+	 * Start out assuming no warnings or errors.
+	 */
+	*status = 0;
+
+	switch (handlep->tp_version) {
+
+	case TPACKET_V1:
+#ifdef HAVE_TPACKET2
+	case TPACKET_V2:
+#endif
+		/* Note that with large snapshot length (say 64K, which is
+		 * the default for recent versions of tcpdump, the value that
+		 * "-s 0" has given for a long time with tcpdump, and the
+		 * default in Wireshark/TShark/dumpcap), if we use the snapshot
+		 * length to calculate the frame length, only a few frames
+		 * will be available in the ring even with pretty
+		 * large ring size (and a lot of memory will be unused).
+		 *
+		 * Ideally, we should choose a frame length based on the
+		 * minimum of the specified snapshot length and the maximum
+		 * packet size.  That's not as easy as it sounds; consider,
+		 * for example, an 802.11 interface in monitor mode, where
+		 * the frame would include a radiotap header, where the
+		 * maximum radiotap header length is device-dependent.
+		 *
+		 * So, for now, we just do this for Ethernet devices, where
+		 * there's no metadata header, and the link-layer header is
+		 * fixed length.  We can get the maximum packet size by
+		 * adding 18, the Ethernet header length plus the CRC length
+		 * (just in case we happen to get the CRC in the packet), to
+		 * the MTU of the interface; we fetch the MTU in the hopes
+		 * that it reflects support for jumbo frames.  (Even if the
+		 * interface is just being used for passive snooping, the
+		 * driver might set the size of buffers in the receive ring
+		 * based on the MTU, so that the MTU limits the maximum size
+		 * of packets that we can receive.)
+		 *
+		 * We don't do that if segmentation/fragmentation or receive
+		 * offload are enabled, so we don't get rudely surprised by
+		 * "packets" bigger than the MTU. */
+		frame_size = handle->snapshot;
+		if (handle->linktype == DLT_EN10MB) {
+			int mtu;
+			int offload;
+
+			offload = iface_get_offload(handle);
+			if (offload == -1) {
+				*status = PCAP_ERROR;
+				return -1;
+			}
+			if (!offload) {
+				mtu = iface_get_mtu(handle->fd, handle->opt.source,
+				    handle->errbuf);
+				if (mtu == -1) {
+					*status = PCAP_ERROR;
+					return -1;
+				}
+				if (frame_size > mtu + 18)
+					frame_size = mtu + 18;
+			}
+		}
+
+		/* NOTE: calculus matching those in tpacket_rcv()
+		 * in linux-2.6/net/packet/af_packet.c
+		 */
+		len = sizeof(sk_type);
+		if (getsockopt(handle->fd, SOL_SOCKET, SO_TYPE, &sk_type,
+		    &len) < 0) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			    "getsockopt: %s", pcap_strerror(errno));
+			*status = PCAP_ERROR;
+			return -1;
+		}
+#ifdef PACKET_RESERVE
+		len = sizeof(tp_reserve);
+		if (getsockopt(handle->fd, SOL_PACKET, PACKET_RESERVE,
+		    &tp_reserve, &len) < 0) {
+			if (errno != ENOPROTOOPT) {
+				/*
+				 * ENOPROTOOPT means "kernel doesn't support
+				 * PACKET_RESERVE", in which case we fall back
+				 * as best we can.
+				 */
+				snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+				    "getsockopt: %s", pcap_strerror(errno));
+				*status = PCAP_ERROR;
+				return -1;
+			}
+			tp_reserve = 0;	/* older kernel, reserve not supported */
+		}
+#else
+		tp_reserve = 0;	/* older kernel, reserve not supported */
+#endif
+		maclen = (sk_type == SOCK_DGRAM) ? 0 : MAX_LINKHEADER_SIZE;
+			/* XXX: in the kernel maclen is calculated from
+			 * LL_ALLOCATED_SPACE(dev) and vnet_hdr.hdr_len
+			 * in:  packet_snd()           in linux-2.6/net/packet/af_packet.c
+			 * then packet_alloc_skb()     in linux-2.6/net/packet/af_packet.c
+			 * then sock_alloc_send_pskb() in linux-2.6/net/core/sock.c
+			 * but I see no way to get those sizes in userspace,
+			 * like for instance with an ifreq ioctl();
+			 * the best thing I've found so far is MAX_HEADER in
+			 * the kernel part of linux-2.6/include/linux/netdevice.h
+			 * which goes up to 128+48=176; since pcap-linux.c
+			 * defines a MAX_LINKHEADER_SIZE of 256 which is
+			 * greater than that, let's use it.. maybe is it even
+			 * large enough to directly replace macoff..
+			 */
+		tp_hdrlen = TPACKET_ALIGN(handlep->tp_hdrlen) + sizeof(struct sockaddr_ll) ;
+		netoff = TPACKET_ALIGN(tp_hdrlen + (maclen < 16 ? 16 : maclen)) + tp_reserve;
+			/* NOTE: AFAICS tp_reserve may break the TPACKET_ALIGN
+			 * of netoff, which contradicts
+			 * linux-2.6/Documentation/networking/packet_mmap.txt
+			 * documenting that:
+			 * "- Gap, chosen so that packet data (Start+tp_net)
+			 * aligns to TPACKET_ALIGNMENT=16"
+			 */
+			/* NOTE: in linux-2.6/include/linux/skbuff.h:
+			 * "CPUs often take a performance hit
+			 *  when accessing unaligned memory locations"
+			 */
+		macoff = netoff - maclen;
+		req.tp_frame_size = TPACKET_ALIGN(macoff + frame_size);
+		req.tp_frame_nr = handle->opt.buffer_size/req.tp_frame_size;
+		break;
+
+#ifdef HAVE_TPACKET3
+	case TPACKET_V3:
+		/* The "frames" for this are actually buffers that
+		 * contain multiple variable-sized frames.
+		 *
+		 * We pick a "frame" size of 128K to leave enough
+		 * room for at least one reasonably-sized packet
+		 * in the "frame". */
+		req.tp_frame_size = 131072;
+		req.tp_frame_nr = handle->opt.buffer_size/req.tp_frame_size;
+		break;
+#endif
+	}
+
+	/* compute the minumum block size that will handle this frame. 
+	 * The block has to be page size aligned. 
+	 * The max block size allowed by the kernel is arch-dependent and 
+	 * it's not explicitly checked here. */
+	req.tp_block_size = getpagesize();
+	while (req.tp_block_size < req.tp_frame_size) 
+		req.tp_block_size <<= 1;
+
+	frames_per_block = req.tp_block_size/req.tp_frame_size;
+
+	/*
+	 * PACKET_TIMESTAMP was added after linux/net_tstamp.h was,
+	 * so we check for PACKET_TIMESTAMP.  We check for
+	 * linux/net_tstamp.h just in case a system somehow has
+	 * PACKET_TIMESTAMP but not linux/net_tstamp.h; that might
+	 * be unnecessary.
+	 *
+	 * SIOCSHWTSTAMP was introduced in the patch that introduced
+	 * linux/net_tstamp.h, so we don't bother checking whether
+	 * SIOCSHWTSTAMP is defined (if your Linux system has
+	 * linux/net_tstamp.h but doesn't define SIOCSHWTSTAMP, your
+	 * Linux system is badly broken).
+	 */
+#if defined(HAVE_LINUX_NET_TSTAMP_H) && defined(PACKET_TIMESTAMP)
+	/*
+	 * If we were told to do so, ask the kernel and the driver
+	 * to use hardware timestamps.
+	 *
+	 * Hardware timestamps are only supported with mmapped
+	 * captures.
+	 */
+	if (handle->opt.tstamp_type == PCAP_TSTAMP_ADAPTER ||
+	    handle->opt.tstamp_type == PCAP_TSTAMP_ADAPTER_UNSYNCED) {
+		struct hwtstamp_config hwconfig;
+		struct ifreq ifr;
+		int timesource;
+
+		/*
+		 * Ask for hardware time stamps on all packets,
+		 * including transmitted packets.
+		 */
+		memset(&hwconfig, 0, sizeof(hwconfig));
+		hwconfig.tx_type = HWTSTAMP_TX_ON;
+		hwconfig.rx_filter = HWTSTAMP_FILTER_ALL;
+
+		memset(&ifr, 0, sizeof(ifr));
+		strcpy(ifr.ifr_name, handle->opt.source);
+		ifr.ifr_data = (void *)&hwconfig;
+
+		if (ioctl(handle->fd, SIOCSHWTSTAMP, &ifr) < 0) {
+			switch (errno) {
+
+			case EPERM:
+				/*
+				 * Treat this as an error, as the
+				 * user should try to run this
+				 * with the appropriate privileges -
+				 * and, if they can't, shouldn't
+				 * try requesting hardware time stamps.
+				 */
+				*status = PCAP_ERROR_PERM_DENIED;
+				return -1;
+
+			case EOPNOTSUPP:
+				/*
+				 * Treat this as a warning, as the
+				 * only way to fix the warning is to
+				 * get an adapter that supports hardware
+				 * time stamps.  We'll just fall back
+				 * on the standard host time stamps.
+				 */
+				*status = PCAP_WARNING_TSTAMP_TYPE_NOTSUP;
+				break;
+
+			default:
+				snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+					"SIOCSHWTSTAMP failed: %s",
+					pcap_strerror(errno));
+				*status = PCAP_ERROR;
+				return -1;
+			}
+		} else {
+			/*
+			 * Well, that worked.  Now specify the type of
+			 * hardware time stamp we want for this
+			 * socket.
+			 */
+			if (handle->opt.tstamp_type == PCAP_TSTAMP_ADAPTER) {
+				/*
+				 * Hardware timestamp, synchronized
+				 * with the system clock.
+				 */
+				timesource = SOF_TIMESTAMPING_SYS_HARDWARE;
+			} else {
+				/*
+				 * PCAP_TSTAMP_ADAPTER_UNSYNCED - hardware
+				 * timestamp, not synchronized with the
+				 * system clock.
+				 */
+				timesource = SOF_TIMESTAMPING_RAW_HARDWARE;
+			}
+			if (setsockopt(handle->fd, SOL_PACKET, PACKET_TIMESTAMP,
+				(void *)&timesource, sizeof(timesource))) {
+				snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, 
+					"can't set PACKET_TIMESTAMP: %s", 
+					pcap_strerror(errno));
+				*status = PCAP_ERROR;
+				return -1;
+			}
+		}
+	}
+#endif /* HAVE_LINUX_NET_TSTAMP_H && PACKET_TIMESTAMP */
+
+	/* ask the kernel to create the ring */
+retry:
+	req.tp_block_nr = req.tp_frame_nr / frames_per_block;
+
+	/* req.tp_frame_nr is requested to match frames_per_block*req.tp_block_nr */
+	req.tp_frame_nr = req.tp_block_nr * frames_per_block;
+	
+#ifdef HAVE_TPACKET3
+	/* timeout value to retire block - use the configured buffering timeout, or default if <0. */
+	req.tp_retire_blk_tov = (handlep->timeout>=0)?handlep->timeout:0;
+	/* private data not used */
+	req.tp_sizeof_priv = 0;
+	/* Rx ring - feature request bits - none (rxhash will not be filled) */
+	req.tp_feature_req_word = 0;
+#endif
+
+	if (setsockopt(handle->fd, SOL_PACKET, PACKET_RX_RING,
+					(void *) &req, sizeof(req))) {
+		if ((errno == ENOMEM) && (req.tp_block_nr > 1)) {
+			/*
+			 * Memory failure; try to reduce the requested ring
+			 * size.
+			 *
+			 * We used to reduce this by half -- do 5% instead.
+			 * That may result in more iterations and a longer
+			 * startup, but the user will be much happier with
+			 * the resulting buffer size.
+			 */
+			if (req.tp_frame_nr < 20)
+				req.tp_frame_nr -= 1;
+			else
+				req.tp_frame_nr -= req.tp_frame_nr/20;
+			goto retry;
+		}
+		if (errno == ENOPROTOOPT) {
+			/*
+			 * We don't have ring buffer support in this kernel.
+			 */
+			return 0;
+		}
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "can't create rx ring on packet socket: %s",
+		    pcap_strerror(errno));
+		*status = PCAP_ERROR;
+		return -1;
+	}
+
+	/* memory map the rx ring */
+	handlep->mmapbuflen = req.tp_block_nr * req.tp_block_size;
+	handlep->mmapbuf = mmap(0, handlep->mmapbuflen,
+	    PROT_READ|PROT_WRITE, MAP_SHARED, handle->fd, 0);
+	if (handlep->mmapbuf == MAP_FAILED) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "can't mmap rx ring: %s", pcap_strerror(errno));
+
+		/* clear the allocated ring on error*/
+		destroy_ring(handle);
+		*status = PCAP_ERROR;
+		return -1;
+	}
+
+	/* allocate a ring for each frame header pointer*/
+	handle->cc = req.tp_frame_nr;
+	handle->buffer = malloc(handle->cc * sizeof(union thdr *));
+	if (!handle->buffer) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "can't allocate ring of frame headers: %s",
+		    pcap_strerror(errno));
+
+		destroy_ring(handle);
+		*status = PCAP_ERROR;
+		return -1;
+	}
+
+	/* fill the header ring with proper frame ptr*/
+	handle->offset = 0;
+	for (i=0; i<req.tp_block_nr; ++i) {
+		void *base = &handlep->mmapbuf[i*req.tp_block_size];
+		for (j=0; j<frames_per_block; ++j, ++handle->offset) {
+			RING_GET_FRAME(handle) = base;
+			base += req.tp_frame_size;
+		}
+	}
+
+	handle->bufsize = req.tp_frame_size;
+	handle->offset = 0;
+	return 1;
+}
+
+/* free all ring related resources*/
+static void
+destroy_ring(pcap_t *handle)
+{
+	struct pcap_linux *handlep = handle->priv;
+
+	/* tell the kernel to destroy the ring*/
+	struct tpacket_req req;
+	memset(&req, 0, sizeof(req));
+	setsockopt(handle->fd, SOL_PACKET, PACKET_RX_RING,
+				(void *) &req, sizeof(req));
+
+	/* if ring is mapped, unmap it*/
+	if (handlep->mmapbuf) {
+		/* do not test for mmap failure, as we can't recover from any error */
+		munmap(handlep->mmapbuf, handlep->mmapbuflen);
+		handlep->mmapbuf = NULL;
+	}
+}
+
+/*
+ * Special one-shot callback, used for pcap_next() and pcap_next_ex(),
+ * for Linux mmapped capture.
+ *
+ * The problem is that pcap_next() and pcap_next_ex() expect the packet
+ * data handed to the callback to be valid after the callback returns,
+ * but pcap_read_linux_mmap() has to release that packet as soon as
+ * the callback returns (otherwise, the kernel thinks there's still
+ * at least one unprocessed packet available in the ring, so a select()
+ * will immediately return indicating that there's data to process), so,
+ * in the callback, we have to make a copy of the packet.
+ *
+ * Yes, this means that, if the capture is using the ring buffer, using
+ * pcap_next() or pcap_next_ex() requires more copies than using
+ * pcap_loop() or pcap_dispatch().  If that bothers you, don't use
+ * pcap_next() or pcap_next_ex().
+ */
+static void
+pcap_oneshot_mmap(u_char *user, const struct pcap_pkthdr *h,
+    const u_char *bytes)
+{
+	struct oneshot_userdata *sp = (struct oneshot_userdata *)user;
+	pcap_t *handle = sp->pd;
+	struct pcap_linux *handlep = handle->priv;
+
+	*sp->hdr = *h;
+	memcpy(handlep->oneshot_buffer, bytes, h->caplen);
+	*sp->pkt = handlep->oneshot_buffer;
+}
+    
+static void
+pcap_cleanup_linux_mmap( pcap_t *handle )
+{
+	struct pcap_linux *handlep = handle->priv;
+
+	destroy_ring(handle);
+	if (handlep->oneshot_buffer != NULL) {
+		free(handlep->oneshot_buffer);
+		handlep->oneshot_buffer = NULL;
+	}
+	pcap_cleanup_linux(handle);
+}
+
+
+static int
+pcap_getnonblock_mmap(pcap_t *p, char *errbuf)
+{
+	struct pcap_linux *handlep = p->priv;
+
+	/* use negative value of timeout to indicate non blocking ops */
+	return (handlep->timeout<0);
+}
+
+static int
+pcap_setnonblock_mmap(pcap_t *p, int nonblock, char *errbuf)
+{
+	struct pcap_linux *handlep = p->priv;
+
+	/*
+	 * Map each value to their corresponding negation to
+	 * preserve the timeout value provided with pcap_set_timeout.
+	 */
+	if (nonblock) {
+		if (handlep->timeout >= 0) {
+			/*
+			 * Indicate that we're switching to
+			 * non-blocking mode.
+			 */
+			handlep->timeout = ~handlep->timeout;
+		}
+	} else {
+		if (handlep->timeout < 0) {
+			handlep->timeout = ~handlep->timeout;
+		}
+	}
+	return 0;
+}
+
+static inline union thdr *
+pcap_get_ring_frame(pcap_t *handle, int status)
+{
+	struct pcap_linux *handlep = handle->priv;
+	union thdr h;
+
+	h.raw = RING_GET_FRAME(handle);
+	switch (handlep->tp_version) {
+	case TPACKET_V1:
+		if (status != (h.h1->tp_status ? TP_STATUS_USER :
+						TP_STATUS_KERNEL))
+			return NULL;
+		break;
+#ifdef HAVE_TPACKET2
+	case TPACKET_V2:
+		if (status != (h.h2->tp_status ? TP_STATUS_USER :
+						TP_STATUS_KERNEL))
+			return NULL;
+		break;
+#endif
+#ifdef HAVE_TPACKET3
+	case TPACKET_V3:
+		if (status != (h.h3->hdr.bh1.block_status ? TP_STATUS_USER :
+						TP_STATUS_KERNEL))
+			return NULL;
+		break;
+#endif
+	}
+	return h.raw;
+}
+
+#ifndef POLLRDHUP
+#define POLLRDHUP 0
+#endif
+
+/* wait for frames availability.*/
+static int pcap_wait_for_frames_mmap(pcap_t *handle)
+{
+	if (!pcap_get_ring_frame(handle, TP_STATUS_USER)) {
+		struct pcap_linux *handlep = handle->priv;
+		int timeout;
+		char c;
+		struct pollfd pollinfo;
+		int ret;
+
+		pollinfo.fd = handle->fd;
+		pollinfo.events = POLLIN;
+
+		if (handlep->timeout == 0) {
+#ifdef HAVE_TPACKET3
+			/*
+			 * XXX - due to a set of (mis)features in the
+			 * TPACKET_V3 kernel code, blocking forever with
+			 * a TPACKET_V3 socket can, if few packets
+			 * are arriving and passing the socket filter,
+			 * cause most packets to be dropped.  See
+			 * libpcap issue #335 for the full painful
+			 * story.  The workaround is to have poll()
+			 * time out very quickly, so we grab the
+			 * frames handed to us, and return them to
+			 * the kernel, ASAP.
+			 *
+			 * If those issues are ever fixed, we might
+			 * want to check the kernel version and block
+			 * forever with TPACKET_V3 if we're running
+			 * with a kernel that has the fix.
+			 */
+			if (handlep->tp_version == TPACKET_V3)
+				timeout = 1;	/* don't block for very long */
+			else
+#endif
+				timeout = -1;	/* block forever */
+		} else if (handlep->timeout > 0)
+			timeout = handlep->timeout;	/* block for that amount of time */
+		else
+			timeout = 0;	/* non-blocking mode - poll to pick up errors */
+		do {
+			ret = poll(&pollinfo, 1, timeout);
+			if (ret < 0 && errno != EINTR) {
+				snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+					"can't poll on packet socket: %s",
+					pcap_strerror(errno));
+				return PCAP_ERROR;
+			} else if (ret > 0 &&
+				(pollinfo.revents & (POLLHUP|POLLRDHUP|POLLERR|POLLNVAL))) {
+				/*
+				 * There's some indication other than
+				 * "you can read on this descriptor" on
+				 * the descriptor.
+				 */
+				if (pollinfo.revents & (POLLHUP | POLLRDHUP)) {
+					snprintf(handle->errbuf,
+						PCAP_ERRBUF_SIZE,
+						"Hangup on packet socket");
+					return PCAP_ERROR;
+				}
+				if (pollinfo.revents & POLLERR) {
+					/*
+					 * A recv() will give us the
+					 * actual error code.
+					 *
+					 * XXX - make the socket non-blocking?
+					 */
+					if (recv(handle->fd, &c, sizeof c,
+						MSG_PEEK) != -1)
+						continue;	/* what, no error? */
+					if (errno == ENETDOWN) {
+						/*
+						 * 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 return
+						 * that.
+						 */
+						snprintf(handle->errbuf,
+							PCAP_ERRBUF_SIZE,
+							"The interface went down");
+					} else {
+						snprintf(handle->errbuf,
+							PCAP_ERRBUF_SIZE,
+							"Error condition on packet socket: %s",
+							strerror(errno));
+					}
+					return PCAP_ERROR;
+				}
+				if (pollinfo.revents & POLLNVAL) {
+					snprintf(handle->errbuf,
+						PCAP_ERRBUF_SIZE,
+						"Invalid polling request on packet socket");
+					return PCAP_ERROR;
+				}
+			}
+			/* check for break loop condition on interrupted syscall*/
+			if (handle->break_loop) {
+				handle->break_loop = 0;
+				return PCAP_ERROR_BREAK;
+			}
+		} while (ret < 0);
+	}
+	return 0;
+}
+
+/* handle a single memory mapped packet */
+static int pcap_handle_packet_mmap(
+		pcap_t *handle,
+		pcap_handler callback,
+		u_char *user,
+		unsigned char *frame,
+		unsigned int tp_len,
+		unsigned int tp_mac,
+		unsigned int tp_snaplen,
+		unsigned int tp_sec,
+		unsigned int tp_usec,
+		int tp_vlan_tci_valid,
+		__u16 tp_vlan_tci)
+{
+	struct pcap_linux *handlep = handle->priv;
+	unsigned char *bp;
+	struct sockaddr_ll *sll;
+	struct pcap_pkthdr pcaphdr;
+
+	/* perform sanity check on internal offset. */
+	if (tp_mac + tp_snaplen > handle->bufsize) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			"corrupted frame on kernel ring mac "
+			"offset %d + caplen %d > frame len %d",
+			tp_mac, tp_snaplen, handle->bufsize);
+		return -1;
+	}
+
+	/* run filter on received packet
+	 * If the kernel filtering is enabled we need to run the
+	 * filter until all the frames present into the ring
+	 * at filter creation time are processed.
+	 * In this case, blocks_to_filter_in_userland is used
+	 * as a counter for the packet we need to filter.
+	 * Note: alternatively it could be possible to stop applying
+	 * the filter when the ring became empty, but it can possibly
+	 * happen a lot later... */
+	bp = frame + tp_mac;
+	if (handlep->filter_in_userland && handle->fcode.bf_insns &&
+			(bpf_filter(handle->fcode.bf_insns, bp,
+				tp_len, tp_snaplen) == 0))
+		return 0;
+
+	sll = (void *)frame + TPACKET_ALIGN(handlep->tp_hdrlen);
+	if (!linux_check_direction(handle, sll))
+		return 0;
+
+	/* get required packet info from ring header */
+	pcaphdr.ts.tv_sec = tp_sec;
+	pcaphdr.ts.tv_usec = tp_usec;
+	pcaphdr.caplen = tp_snaplen;
+	pcaphdr.len = tp_len;
+
+	/* if required build in place the sll header*/
+	if (handlep->cooked) {
+		struct sll_header *hdrp;
+
+		/*
+		 * The kernel should have left us with enough
+		 * space for an sll header; back up the packet
+		 * data pointer into that space, as that'll be
+		 * the beginning of the packet we pass to the
+		 * callback.
+		 */
+		bp -= SLL_HDR_LEN;
+
+		/*/*
+		 * Let's make sure that's past the end of
+		 * the tpacket header, i.e. >=
+		 * ((u_char *)thdr + TPACKET_HDRLEN), so we
+		 * don't step on the header when we construct
+		 * the sll header.
+		 */
+		if (bp < (u_char *)frame +
+				   TPACKET_ALIGN(handlep->tp_hdrlen) +
+				   sizeof(struct sockaddr_ll)) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+				"cooked-mode frame doesn't have room for sll header");
+			return -1;
+		}
+
+		/*
+		 * OK, that worked; construct the sll header.
+		 */
+		hdrp = (struct sll_header *)bp;
+		hdrp->sll_pkttype = map_packet_type_to_sll_type(
+						sll->sll_pkttype);
+		hdrp->sll_hatype = htons(sll->sll_hatype);
+		hdrp->sll_halen = htons(sll->sll_halen);
+		memcpy(hdrp->sll_addr, sll->sll_addr, SLL_ADDRLEN);
+		hdrp->sll_protocol = sll->sll_protocol;
+
+		/* update packet len */
+		pcaphdr.caplen += SLL_HDR_LEN;
+		pcaphdr.len += SLL_HDR_LEN;
+	}
+
+#if defined(HAVE_TPACKET2) || defined(HAVE_TPACKET3)
+	if (tp_vlan_tci_valid &&
+		handlep->vlan_offset != -1 &&
+		tp_snaplen >= (unsigned int) handlep->vlan_offset)
+	{
+		struct vlan_tag *tag;
+
+		bp -= VLAN_TAG_LEN;
+		memmove(bp, bp + VLAN_TAG_LEN, handlep->vlan_offset);
+
+		tag = (struct vlan_tag *)(bp + handlep->vlan_offset);
+		tag->vlan_tpid = htons(ETH_P_8021Q);
+		tag->vlan_tci = htons(tp_vlan_tci);
+
+		pcaphdr.caplen += VLAN_TAG_LEN;
+		pcaphdr.len += VLAN_TAG_LEN;
+	}
+#endif
+
+	/*
+	 * The only way to tell the kernel to cut off the
+	 * packet at a snapshot length is with a filter program;
+	 * if there's no filter program, the kernel won't cut
+	 * the packet off.
+	 *
+	 * Trim the snapshot length to be no longer than the
+	 * specified snapshot length.
+	 */
+	if (pcaphdr.caplen > handle->snapshot)
+		pcaphdr.caplen = handle->snapshot;
+
+	/* pass the packet to the user */
+	callback(user, &pcaphdr, bp);
+
+	return 1;
+}
+
+static int
+pcap_read_linux_mmap_v1(pcap_t *handle, int max_packets, pcap_handler callback,
+		u_char *user)
+{
+	struct pcap_linux *handlep = handle->priv;
+	int pkts = 0;
+	int ret;
+
+	/* wait for frames availability.*/
+	ret = pcap_wait_for_frames_mmap(handle);
+	if (ret) {
+		return ret;
+	}
+
+	/* non-positive values of max_packets are used to require all
+	 * packets currently available in the ring */
+	while ((pkts < max_packets) || PACKET_COUNT_IS_UNLIMITED(max_packets)) {
+		union thdr h;
+
+		h.raw = pcap_get_ring_frame(handle, TP_STATUS_USER);
+		if (!h.raw)
+			break;
+
+		ret = pcap_handle_packet_mmap(
+				handle,
+				callback,
+				user,
+				h.raw,
+				h.h1->tp_len,
+				h.h1->tp_mac,
+				h.h1->tp_snaplen,
+				h.h1->tp_sec,
+				h.h1->tp_usec,
+				0,
+				0);
+		if (ret == 1) {
+			pkts++;
+			handlep->packets_read++;
+		} else if (ret < 0) {
+			return ret;
+		}
+
+		/*
+		 * Hand this block back to the kernel, and, if we're
+		 * counting blocks that need to be filtered in userland
+		 * after having been filtered by the kernel, count
+		 * the one we've just processed.
+		 */
+		h.h1->tp_status = TP_STATUS_KERNEL;
+		if (handlep->blocks_to_filter_in_userland > 0) {
+			handlep->blocks_to_filter_in_userland--;
+			if (handlep->blocks_to_filter_in_userland == 0) {
+				/*
+				 * No more blocks need to be filtered
+				 * in userland.
+				 */
+				handlep->filter_in_userland = 0;
+			}
+		}
+
+		/* next block */
+		if (++handle->offset >= handle->cc)
+			handle->offset = 0;
+
+		/* check for break loop condition*/
+		if (handle->break_loop) {
+			handle->break_loop = 0;
+			return PCAP_ERROR_BREAK;
+		}
+	}
+	return pkts;
+}
+
+#ifdef HAVE_TPACKET2
+static int
+pcap_read_linux_mmap_v2(pcap_t *handle, int max_packets, pcap_handler callback,
+		u_char *user)
+{
+	struct pcap_linux *handlep = handle->priv;
+	int pkts = 0;
+	int ret;
+
+	/* wait for frames availability.*/
+	ret = pcap_wait_for_frames_mmap(handle);
+	if (ret) {
+		return ret;
+	}
+
+	/* non-positive values of max_packets are used to require all
+	 * packets currently available in the ring */
+	while ((pkts < max_packets) || PACKET_COUNT_IS_UNLIMITED(max_packets)) {
+		union thdr h;
+
+		h.raw = pcap_get_ring_frame(handle, TP_STATUS_USER);
+		if (!h.raw)
+			break;
+
+		ret = pcap_handle_packet_mmap(
+				handle,
+				callback,
+				user,
+				h.raw,
+				h.h2->tp_len,
+				h.h2->tp_mac,
+				h.h2->tp_snaplen,
+				h.h2->tp_sec,
+				handle->opt.tstamp_precision == PCAP_TSTAMP_PRECISION_NANO ? h.h2->tp_nsec : h.h2->tp_nsec / 1000,
+#if defined(TP_STATUS_VLAN_VALID)
+				(h.h2->tp_vlan_tci || (h.h2->tp_status & TP_STATUS_VLAN_VALID)),
+#else
+				h.h2->tp_vlan_tci != 0,
+#endif
+				h.h2->tp_vlan_tci);
+		if (ret == 1) {
+			pkts++;
+			handlep->packets_read++;
+		} else if (ret < 0) {
+			return ret;
+		}
+
+		/*
+		 * Hand this block back to the kernel, and, if we're
+		 * counting blocks that need to be filtered in userland
+		 * after having been filtered by the kernel, count
+		 * the one we've just processed.
+		 */
+		h.h2->tp_status = TP_STATUS_KERNEL;
+		if (handlep->blocks_to_filter_in_userland > 0) {
+			handlep->blocks_to_filter_in_userland--;
+			if (handlep->blocks_to_filter_in_userland == 0) {
+				/*
+				 * No more blocks need to be filtered
+				 * in userland.
+				 */
+				handlep->filter_in_userland = 0;
+			}
+		}
+
+		/* next block */
+		if (++handle->offset >= handle->cc)
+			handle->offset = 0;
+
+		/* check for break loop condition*/
+		if (handle->break_loop) {
+			handle->break_loop = 0;
+			return PCAP_ERROR_BREAK;
+		}
+	}
+	return pkts;
+}
+#endif /* HAVE_TPACKET2 */
+
+#ifdef HAVE_TPACKET3
+static int
+pcap_read_linux_mmap_v3(pcap_t *handle, int max_packets, pcap_handler callback,
+		u_char *user)
+{
+	struct pcap_linux *handlep = handle->priv;
+	union thdr h;
+	int pkts = 0;
+	int ret;
+
+	if (handlep->current_packet == NULL) {
+		/* wait for frames availability.*/
+		ret = pcap_wait_for_frames_mmap(handle);
+		if (ret) {
+			return ret;
+		}
+	}
+	h.raw = pcap_get_ring_frame(handle, TP_STATUS_USER);
+	if (!h.raw)
+		return pkts;
+
+	/* non-positive values of max_packets are used to require all
+	 * packets currently available in the ring */
+	while ((pkts < max_packets) || PACKET_COUNT_IS_UNLIMITED(max_packets)) {
+		if (handlep->current_packet == NULL) {
+			h.raw = pcap_get_ring_frame(handle, TP_STATUS_USER);
+			if (!h.raw)
+				break;
+
+			handlep->current_packet = h.raw + h.h3->hdr.bh1.offset_to_first_pkt;
+			handlep->packets_left = h.h3->hdr.bh1.num_pkts;
+		}
+		int packets_to_read = handlep->packets_left;
+
+		if (!PACKET_COUNT_IS_UNLIMITED(max_packets) && packets_to_read > max_packets) {
+			packets_to_read = max_packets;
+		}
+
+		while(packets_to_read--) {
+			struct tpacket3_hdr* tp3_hdr = (struct tpacket3_hdr*) handlep->current_packet;
+			ret = pcap_handle_packet_mmap(
+					handle,
+					callback,
+					user,
+					handlep->current_packet,
+					tp3_hdr->tp_len,
+					tp3_hdr->tp_mac,
+					tp3_hdr->tp_snaplen,
+					tp3_hdr->tp_sec,
+					handle->opt.tstamp_precision == PCAP_TSTAMP_PRECISION_NANO ? tp3_hdr->tp_nsec : tp3_hdr->tp_nsec / 1000,
+#if defined(TP_STATUS_VLAN_VALID)
+					(tp3_hdr->hv1.tp_vlan_tci || (tp3_hdr->tp_status & TP_STATUS_VLAN_VALID)),
+#else
+					tp3_hdr->hv1.tp_vlan_tci != 0,
+#endif
+					tp3_hdr->hv1.tp_vlan_tci);
+			if (ret == 1) {
+				pkts++;
+				handlep->packets_read++;
+			} else if (ret < 0) {
+				handlep->current_packet = NULL;
+				return ret;
+			}
+			handlep->current_packet += tp3_hdr->tp_next_offset;
+			handlep->packets_left--;
+		}
+
+		if (handlep->packets_left <= 0) {
+			/*
+			 * Hand this block back to the kernel, and, if
+			 * we're counting blocks that need to be
+			 * filtered in userland after having been
+			 * filtered by the kernel, count the one we've
+			 * just processed.
+			 */
+			h.h3->hdr.bh1.block_status = TP_STATUS_KERNEL;
+			if (handlep->blocks_to_filter_in_userland > 0) {
+				handlep->blocks_to_filter_in_userland--;
+				if (handlep->blocks_to_filter_in_userland == 0) {
+					/*
+					 * No more blocks need to be filtered
+					 * in userland.
+					 */
+					handlep->filter_in_userland = 0;
+				}
+			}
+
+			/* next block */
+			if (++handle->offset >= handle->cc)
+				handle->offset = 0;
+
+			handlep->current_packet = NULL;
+		}
+
+		/* check for break loop condition*/
+		if (handle->break_loop) {
+			handle->break_loop = 0;
+			return PCAP_ERROR_BREAK;
+		}
+	}
+	return pkts;
+}
+#endif /* HAVE_TPACKET3 */
+
+static int 
+pcap_setfilter_linux_mmap(pcap_t *handle, struct bpf_program *filter)
+{
+	struct pcap_linux *handlep = handle->priv;
+	int n, offset;
+	int ret;
+
+	/*
+	 * Don't rewrite "ret" instructions; we don't need to, as
+	 * we're not reading packets with recvmsg(), and we don't
+	 * want to, as, by not rewriting them, the kernel can avoid
+	 * copying extra data.
+	 */
+	ret = pcap_setfilter_linux_common(handle, filter, 1);
+	if (ret < 0)
+		return ret;
+
+	/*
+	 * If we're filtering in userland, there's nothing to do;
+	 * the new filter will be used for the next packet.
+	 */
+	if (handlep->filter_in_userland)
+		return ret;
+
+	/*
+	 * We're filtering in the kernel; the packets present in
+	 * all blocks currently in the ring were already filtered
+	 * by the old filter, and so will need to be filtered in
+	 * userland by the new filter.
+	 *
+	 * Get an upper bound for the number of such blocks; first,
+	 * walk the ring backward and count the free blocks.
+	 */
+	offset = handle->offset;
+	if (--handle->offset < 0)
+		handle->offset = handle->cc - 1;
+	for (n=0; n < handle->cc; ++n) {
+		if (--handle->offset < 0)
+			handle->offset = handle->cc - 1;
+		if (!pcap_get_ring_frame(handle, TP_STATUS_KERNEL))
+			break;
+	}
+
+	/*
+	 * If we found free blocks, decrement the count of free
+	 * blocks by 1, just in case we lost a race with another
+	 * thread of control that was adding a packet while
+	 * we were counting and that had run the filter before
+	 * we changed it.
+	 *
+	 * XXX - could there be more than one block added in
+	 * this fashion?
+	 *
+	 * XXX - is there a way to avoid that race, e.g. somehow
+	 * wait for all packets that passed the old filter to
+	 * be added to the ring?
+	 */
+	if (n != 0)
+		n--;
+
+	/* be careful to not change current ring position */
+	handle->offset = offset;
+
+	/*
+	 * Set the count of blocks worth of packets to filter
+	 * in userland to the total number of blocks in the
+	 * ring minus the number of free blocks we found, and
+	 * turn on userland filtering.  (The count of blocks
+	 * worth of packets to filter in userland is guaranteed
+	 * not to be zero - n, above, couldn't be set to a
+	 * value > handle->cc, and if it were equal to
+	 * handle->cc, it wouldn't be zero, and thus would
+	 * be decremented to handle->cc - 1.)
+	 */
+	handlep->blocks_to_filter_in_userland = handle->cc - n;
+	handlep->filter_in_userland = 1;
+	return ret;
+}
+
+#endif /* HAVE_PACKET_RING */
+
+
 #ifdef HAVE_PF_PACKET_SOCKETS
 /*
  *  Return the index of the given device name. Fill ebuf and return
@@ -1624,6 +4663,8 @@
 
 /*
  *  Bind the socket associated with FD to the given device.
+ *  Return 1 on success, 0 if we should try a SOCK_PACKET socket,
+ *  or a PCAP_ERROR_ value on a hard error.
  */
 static int
 iface_bind(int fd, int ifindex, char *ebuf)
@@ -1638,9 +4679,20 @@
 	sll.sll_protocol	= htons(ETH_P_ALL);
 
 	if (bind(fd, (struct sockaddr *) &sll, sizeof(sll)) == -1) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE,
-			 "bind: %s", pcap_strerror(errno));
-		return -1;
+		if (errno == ENETDOWN) {
+			/*
+			 * Return a "network down" indication, so that
+			 * the application can report that rather than
+			 * saying we had a mysterious failure and
+			 * suggest that they report a problem to the
+			 * libpcap developers.
+			 */
+			return PCAP_ERROR_IFACE_NOT_UP;
+		} else {
+			snprintf(ebuf, PCAP_ERRBUF_SIZE,
+				 "bind: %s", pcap_strerror(errno));
+			return PCAP_ERROR;
+		}
 	}
 
 	/* Any pending errors, e.g., network is down? */
@@ -1648,251 +4700,1047 @@
 	if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &errlen) == -1) {
 		snprintf(ebuf, PCAP_ERRBUF_SIZE,
 			"getsockopt: %s", pcap_strerror(errno));
-		return -2;
+		return 0;
 	}
 
-	if (err > 0) {
+	if (err == ENETDOWN) {
+		/*
+		 * Return a "network down" indication, so that
+		 * the application can report that rather than
+		 * saying we had a mysterious failure and
+		 * suggest that they report a problem to the
+		 * libpcap developers.
+		 */
+		return PCAP_ERROR_IFACE_NOT_UP;
+	} else if (err > 0) {
 		snprintf(ebuf, PCAP_ERRBUF_SIZE,
 			"bind: %s", pcap_strerror(err));
-		return -2;
+		return 0;
 	}
 
+	return 1;
+}
+
+#ifdef IW_MODE_MONITOR
+/*
+ * Check whether the device supports the Wireless Extensions.
+ * Returns 1 if it does, 0 if it doesn't, PCAP_ERROR_NO_SUCH_DEVICE
+ * if the device doesn't even exist.
+ */
+static int
+has_wext(int sock_fd, const char *device, char *ebuf)
+{
+	struct iwreq ireq;
+
+	strncpy(ireq.ifr_ifrn.ifrn_name, device,
+	    sizeof ireq.ifr_ifrn.ifrn_name);
+	ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] = 0;
+	if (ioctl(sock_fd, SIOCGIWNAME, &ireq) >= 0)
+		return 1;	/* yes */
+	snprintf(ebuf, PCAP_ERRBUF_SIZE,
+	    "%s: SIOCGIWPRIV: %s", device, pcap_strerror(errno));
+	if (errno == ENODEV)
+		return PCAP_ERROR_NO_SUCH_DEVICE;
 	return 0;
 }
 
+/*
+ * Per me si va ne la citta dolente,
+ * Per me si va ne l'etterno dolore,
+ *	...
+ * Lasciate ogne speranza, voi ch'intrate.
+ *
+ * XXX - airmon-ng does special stuff with the Orinoco driver and the
+ * wlan-ng driver.
+ */
+typedef enum {
+	MONITOR_WEXT,
+	MONITOR_HOSTAP,
+	MONITOR_PRISM,
+	MONITOR_PRISM54,
+	MONITOR_ACX100,
+	MONITOR_RT2500,
+	MONITOR_RT2570,
+	MONITOR_RT73,
+	MONITOR_RTL8XXX
+} monitor_type;
+
+/*
+ * Use the Wireless Extensions, if we have them, to try to turn monitor mode
+ * on if it's not already on.
+ *
+ * Returns 1 on success, 0 if we don't support the Wireless Extensions
+ * on this device, or a PCAP_ERROR_ value if we do support them but
+ * we weren't able to turn monitor mode on.
+ */
+static int
+enter_rfmon_mode_wext(pcap_t *handle, int sock_fd, const char *device)
+{
+	/*
+	 * XXX - at least some adapters require non-Wireless Extensions
+	 * mechanisms to turn monitor mode on.
+	 *
+	 * Atheros cards might require that a separate "monitor virtual access
+	 * point" be created, with later versions of the madwifi driver.
+	 * airmon-ng does "wlanconfig ath create wlandev {if} wlanmode
+	 * monitor -bssid", which apparently spits out a line "athN"
+	 * where "athN" is the monitor mode device.  To leave monitor
+	 * mode, it destroys the monitor mode device.
+	 *
+	 * Some Intel Centrino adapters might require private ioctls to get
+	 * radio headers; the ipw2200 and ipw3945 drivers allow you to
+	 * configure a separate "rtapN" interface to capture in monitor
+	 * mode without preventing the adapter from operating normally.
+	 * (airmon-ng doesn't appear to use that, though.)
+	 *
+	 * It would be Truly Wonderful if mac80211 and nl80211 cleaned this
+	 * up, and if all drivers were converted to mac80211 drivers.
+	 *
+	 * If interface {if} is a mac80211 driver, the file
+	 * /sys/class/net/{if}/phy80211 is a symlink to
+	 * /sys/class/ieee80211/{phydev}, for some {phydev}.
+	 *
+	 * On Fedora 9, with a 2.6.26.3-29 kernel, my Zydas stick, at
+	 * least, has a "wmaster0" device and a "wlan0" device; the
+	 * latter is the one with the IP address.  Both show up in
+	 * "tcpdump -D" output.  Capturing on the wmaster0 device
+	 * captures with 802.11 headers.
+	 *
+	 * airmon-ng searches through /sys/class/net for devices named
+	 * monN, starting with mon0; as soon as one *doesn't* exist,
+	 * it chooses that as the monitor device name.  If the "iw"
+	 * command exists, it does "iw dev {if} interface add {monif}
+	 * type monitor", where {monif} is the monitor device.  It
+	 * then (sigh) sleeps .1 second, and then configures the
+	 * device up.  Otherwise, if /sys/class/ieee80211/{phydev}/add_iface
+	 * is a file, it writes {mondev}, without a newline, to that file,
+	 * and again (sigh) sleeps .1 second, and then iwconfig's that
+	 * device into monitor mode and configures it up.  Otherwise,
+	 * you can't do monitor mode.
+	 *
+	 * All these devices are "glued" together by having the
+	 * /sys/class/net/{device}/phy80211 links pointing to the same
+	 * place, so, given a wmaster, wlan, or mon device, you can
+	 * find the other devices by looking for devices with
+	 * the same phy80211 link.
+	 *
+	 * To turn monitor mode off, delete the monitor interface,
+	 * either with "iw dev {monif} interface del" or by sending
+	 * {monif}, with no NL, down /sys/class/ieee80211/{phydev}/remove_iface
+	 *
+	 * Note: if you try to create a monitor device named "monN", and
+	 * there's already a "monN" device, it fails, as least with
+	 * the netlink interface (which is what iw uses), with a return
+	 * value of -ENFILE.  (Return values are negative errnos.)  We
+	 * could probably use that to find an unused device.
+	 */
+	struct pcap_linux *handlep = handle->priv;
+	int err;
+	struct iwreq ireq;
+	struct iw_priv_args *priv;
+	monitor_type montype;
+	int i;
+	__u32 cmd;
+	struct ifreq ifr;
+	int oldflags;
+	int args[2];
+	int channel;
+
+	/*
+	 * Does this device *support* the Wireless Extensions?
+	 */
+	err = has_wext(sock_fd, device, handle->errbuf);
+	if (err <= 0)
+		return err;	/* either it doesn't or the device doesn't even exist */
+	/*
+	 * Start out assuming we have no private extensions to control
+	 * radio metadata.
+	 */
+	montype = MONITOR_WEXT;
+	cmd = 0;
+
+	/*
+	 * Try to get all the Wireless Extensions private ioctls
+	 * supported by this device.
+	 *
+	 * First, get the size of the buffer we need, by supplying no
+	 * buffer and a length of 0.  If the device supports private
+	 * ioctls, it should return E2BIG, with ireq.u.data.length set
+	 * to the length we need.  If it doesn't support them, it should
+	 * return EOPNOTSUPP.
+	 */
+	memset(&ireq, 0, sizeof ireq);
+	strncpy(ireq.ifr_ifrn.ifrn_name, device,
+	    sizeof ireq.ifr_ifrn.ifrn_name);
+	ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] = 0;
+	ireq.u.data.pointer = (void *)args;
+	ireq.u.data.length = 0;
+	ireq.u.data.flags = 0;
+	if (ioctl(sock_fd, SIOCGIWPRIV, &ireq) != -1) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: SIOCGIWPRIV with a zero-length buffer didn't fail!",
+		    device);
+		return PCAP_ERROR;
+	}
+	if (errno != EOPNOTSUPP) {
+		/*
+		 * OK, it's not as if there are no private ioctls.
+		 */
+		if (errno != E2BIG) {
+			/*
+			 * Failed.
+			 */
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			    "%s: SIOCGIWPRIV: %s", device,
+			    pcap_strerror(errno));
+			return PCAP_ERROR;
+		}
+
+		/*
+		 * OK, try to get the list of private ioctls.
+		 */
+		priv = malloc(ireq.u.data.length * sizeof (struct iw_priv_args));
+		if (priv == NULL) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			    "malloc: %s", pcap_strerror(errno));
+			return PCAP_ERROR;
+		}
+		ireq.u.data.pointer = (void *)priv;
+		if (ioctl(sock_fd, SIOCGIWPRIV, &ireq) == -1) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			    "%s: SIOCGIWPRIV: %s", device,
+			    pcap_strerror(errno));
+			free(priv);
+			return PCAP_ERROR;
+		}
+
+		/*
+		 * Look for private ioctls to turn monitor mode on or, if
+		 * monitor mode is on, to set the header type.
+		 */
+		for (i = 0; i < ireq.u.data.length; i++) {
+			if (strcmp(priv[i].name, "monitor_type") == 0) {
+				/*
+				 * Hostap driver, use this one.
+				 * Set monitor mode first.
+				 * You can set it to 0 to get DLT_IEEE80211,
+				 * 1 to get DLT_PRISM, 2 to get
+				 * DLT_IEEE80211_RADIO_AVS, and, with more
+				 * recent versions of the driver, 3 to get
+				 * DLT_IEEE80211_RADIO.
+				 */
+				if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT)
+					break;
+				if (!(priv[i].set_args & IW_PRIV_SIZE_FIXED))
+					break;
+				if ((priv[i].set_args & IW_PRIV_SIZE_MASK) != 1)
+					break;
+				montype = MONITOR_HOSTAP;
+				cmd = priv[i].cmd;
+				break;
+			}
+			if (strcmp(priv[i].name, "set_prismhdr") == 0) {
+				/*
+				 * Prism54 driver, use this one.
+				 * Set monitor mode first.
+				 * You can set it to 2 to get DLT_IEEE80211
+				 * or 3 or get DLT_PRISM.
+				 */
+				if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT)
+					break;
+				if (!(priv[i].set_args & IW_PRIV_SIZE_FIXED))
+					break;
+				if ((priv[i].set_args & IW_PRIV_SIZE_MASK) != 1)
+					break;
+				montype = MONITOR_PRISM54;
+				cmd = priv[i].cmd;
+				break;
+			}
+			if (strcmp(priv[i].name, "forceprismheader") == 0) {
+				/*
+				 * RT2570 driver, use this one.
+				 * Do this after turning monitor mode on.
+				 * You can set it to 1 to get DLT_PRISM or 2
+				 * to get DLT_IEEE80211.
+				 */
+				if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT)
+					break;
+				if (!(priv[i].set_args & IW_PRIV_SIZE_FIXED))
+					break;
+				if ((priv[i].set_args & IW_PRIV_SIZE_MASK) != 1)
+					break;
+				montype = MONITOR_RT2570;
+				cmd = priv[i].cmd;
+				break;
+			}
+			if (strcmp(priv[i].name, "forceprism") == 0) {
+				/*
+				 * RT73 driver, use this one.
+				 * Do this after turning monitor mode on.
+				 * Its argument is a *string*; you can
+				 * set it to "1" to get DLT_PRISM or "2"
+				 * to get DLT_IEEE80211.
+				 */
+				if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_CHAR)
+					break;
+				if (priv[i].set_args & IW_PRIV_SIZE_FIXED)
+					break;
+				montype = MONITOR_RT73;
+				cmd = priv[i].cmd;
+				break;
+			}
+			if (strcmp(priv[i].name, "prismhdr") == 0) {
+				/*
+				 * One of the RTL8xxx drivers, use this one.
+				 * It can only be done after monitor mode
+				 * has been turned on.  You can set it to 1
+				 * to get DLT_PRISM or 0 to get DLT_IEEE80211.
+				 */
+				if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT)
+					break;
+				if (!(priv[i].set_args & IW_PRIV_SIZE_FIXED))
+					break;
+				if ((priv[i].set_args & IW_PRIV_SIZE_MASK) != 1)
+					break;
+				montype = MONITOR_RTL8XXX;
+				cmd = priv[i].cmd;
+				break;
+			}
+			if (strcmp(priv[i].name, "rfmontx") == 0) {
+				/*
+				 * RT2500 or RT61 driver, use this one.
+				 * It has one one-byte parameter; set
+				 * u.data.length to 1 and u.data.pointer to
+				 * point to the parameter.
+				 * It doesn't itself turn monitor mode on.
+				 * You can set it to 1 to allow transmitting
+				 * in monitor mode(?) and get DLT_IEEE80211,
+				 * or set it to 0 to disallow transmitting in
+				 * monitor mode(?) and get DLT_PRISM.
+				 */
+				if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT)
+					break;
+				if ((priv[i].set_args & IW_PRIV_SIZE_MASK) != 2)
+					break;
+				montype = MONITOR_RT2500;
+				cmd = priv[i].cmd;
+				break;
+			}
+			if (strcmp(priv[i].name, "monitor") == 0) {
+				/*
+				 * Either ACX100 or hostap, use this one.
+				 * It turns monitor mode on.
+				 * If it takes two arguments, it's ACX100;
+				 * the first argument is 1 for DLT_PRISM
+				 * or 2 for DLT_IEEE80211, and the second
+				 * argument is the channel on which to
+				 * run.  If it takes one argument, it's
+				 * HostAP, and the argument is 2 for
+				 * DLT_IEEE80211 and 3 for DLT_PRISM.
+				 *
+				 * If we see this, we don't quit, as this
+				 * might be a version of the hostap driver
+				 * that also supports "monitor_type".
+				 */
+				if ((priv[i].set_args & IW_PRIV_TYPE_MASK) != IW_PRIV_TYPE_INT)
+					break;
+				if (!(priv[i].set_args & IW_PRIV_SIZE_FIXED))
+					break;
+				switch (priv[i].set_args & IW_PRIV_SIZE_MASK) {
+
+				case 1:
+					montype = MONITOR_PRISM;
+					cmd = priv[i].cmd;
+					break;
+
+				case 2:
+					montype = MONITOR_ACX100;
+					cmd = priv[i].cmd;
+					break;
+
+				default:
+					break;
+				}
+			}
+		}
+		free(priv);
+	}
+
+	/*
+	 * XXX - ipw3945?  islism?
+	 */
+
+	/*
+	 * Get the old mode.
+	 */
+	strncpy(ireq.ifr_ifrn.ifrn_name, device,
+	    sizeof ireq.ifr_ifrn.ifrn_name);
+	ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] = 0;
+	if (ioctl(sock_fd, SIOCGIWMODE, &ireq) == -1) {
+		/*
+		 * We probably won't be able to set the mode, either.
+		 */
+		return PCAP_ERROR_RFMON_NOTSUP;
+	}
+
+	/*
+	 * Is it currently in monitor mode?
+	 */
+	if (ireq.u.mode == IW_MODE_MONITOR) {
+		/*
+		 * Yes.  Just leave things as they are.
+		 * We don't offer multiple link-layer types, as
+		 * changing the link-layer type out from under
+		 * somebody else capturing in monitor mode would
+		 * be considered rude.
+		 */
+		return 1;
+	}
+	/*
+	 * No.  We have to put the adapter into rfmon mode.
+	 */
+
+	/*
+	 * If we haven't already done so, arrange to have
+	 * "pcap_close_all()" called when we exit.
+	 */
+	if (!pcap_do_addexit(handle)) {
+		/*
+		 * "atexit()" failed; don't put the interface
+		 * in rfmon mode, just give up.
+		 */
+		return PCAP_ERROR_RFMON_NOTSUP;
+	}
+
+	/*
+	 * Save the old mode.
+	 */
+	handlep->oldmode = ireq.u.mode;
+
+	/*
+	 * Put the adapter in rfmon mode.  How we do this depends
+	 * on whether we have a special private ioctl or not.
+	 */
+	if (montype == MONITOR_PRISM) {
+		/*
+		 * We have the "monitor" private ioctl, but none of
+		 * the other private ioctls.  Use this, and select
+		 * the Prism header.
+		 *
+		 * If it fails, just fall back on SIOCSIWMODE.
+		 */
+		memset(&ireq, 0, sizeof ireq);
+		strncpy(ireq.ifr_ifrn.ifrn_name, device,
+		    sizeof ireq.ifr_ifrn.ifrn_name);
+		ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] = 0;
+		ireq.u.data.length = 1;	/* 1 argument */
+		args[0] = 3;	/* request Prism header */
+		memcpy(ireq.u.name, args, sizeof (int));
+		if (ioctl(sock_fd, cmd, &ireq) != -1) {
+			/*
+			 * Success.
+			 * Note that we have to put the old mode back
+			 * when we close the device.
+			 */
+			handlep->must_do_on_close |= MUST_CLEAR_RFMON;
+
+			/*
+			 * Add this to the list of pcaps to close
+			 * when we exit.
+			 */
+			pcap_add_to_pcaps_to_close(handle);
+
+			return 1;
+		}
+
+		/*
+		 * Failure.  Fall back on SIOCSIWMODE.
+		 */
+	}
+
+	/*
+	 * First, take the interface down if it's up; otherwise, we
+	 * might get EBUSY.
+	 */
+	memset(&ifr, 0, sizeof(ifr));
+	strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));
+	if (ioctl(sock_fd, SIOCGIFFLAGS, &ifr) == -1) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: Can't get flags: %s", device, strerror(errno));
+		return PCAP_ERROR;
+	}
+	oldflags = 0;
+	if (ifr.ifr_flags & IFF_UP) {
+		oldflags = ifr.ifr_flags;
+		ifr.ifr_flags &= ~IFF_UP;
+		if (ioctl(sock_fd, SIOCSIFFLAGS, &ifr) == -1) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			    "%s: Can't set flags: %s", device, strerror(errno));
+			return PCAP_ERROR;
+		}
+	}
+
+	/*
+	 * Then turn monitor mode on.
+	 */
+	strncpy(ireq.ifr_ifrn.ifrn_name, device,
+	    sizeof ireq.ifr_ifrn.ifrn_name);
+	ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] = 0;
+	ireq.u.mode = IW_MODE_MONITOR;
+	if (ioctl(sock_fd, SIOCSIWMODE, &ireq) == -1) {
+		/*
+		 * Scientist, you've failed.
+		 * Bring the interface back up if we shut it down.
+		 */
+		ifr.ifr_flags = oldflags;
+		if (ioctl(sock_fd, SIOCSIFFLAGS, &ifr) == -1) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			    "%s: Can't set flags: %s", device, strerror(errno));
+			return PCAP_ERROR;
+		}
+		return PCAP_ERROR_RFMON_NOTSUP;
+	}
+
+	/*
+	 * XXX - airmon-ng does "iwconfig {if} key off" after setting
+	 * monitor mode and setting the channel, and then does
+	 * "iwconfig up".
+	 */
+
+	/*
+	 * Now select the appropriate radio header.
+	 */
+	switch (montype) {
+
+	case MONITOR_WEXT:
+		/*
+		 * We don't have any private ioctl to set the header.
+		 */
+		break;
+
+	case MONITOR_HOSTAP:
+		/*
+		 * Try to select the radiotap header.
+		 */
+		memset(&ireq, 0, sizeof ireq);
+		strncpy(ireq.ifr_ifrn.ifrn_name, device,
+		    sizeof ireq.ifr_ifrn.ifrn_name);
+		ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] = 0;
+		args[0] = 3;	/* request radiotap header */
+		memcpy(ireq.u.name, args, sizeof (int));
+		if (ioctl(sock_fd, cmd, &ireq) != -1)
+			break;	/* success */
+
+		/*
+		 * That failed.  Try to select the AVS header.
+		 */
+		memset(&ireq, 0, sizeof ireq);
+		strncpy(ireq.ifr_ifrn.ifrn_name, device,
+		    sizeof ireq.ifr_ifrn.ifrn_name);
+		ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] = 0;
+		args[0] = 2;	/* request AVS header */
+		memcpy(ireq.u.name, args, sizeof (int));
+		if (ioctl(sock_fd, cmd, &ireq) != -1)
+			break;	/* success */
+
+		/*
+		 * That failed.  Try to select the Prism header.
+		 */
+		memset(&ireq, 0, sizeof ireq);
+		strncpy(ireq.ifr_ifrn.ifrn_name, device,
+		    sizeof ireq.ifr_ifrn.ifrn_name);
+		ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] = 0;
+		args[0] = 1;	/* request Prism header */
+		memcpy(ireq.u.name, args, sizeof (int));
+		ioctl(sock_fd, cmd, &ireq);
+		break;
+
+	case MONITOR_PRISM:
+		/*
+		 * The private ioctl failed.
+		 */
+		break;
+
+	case MONITOR_PRISM54:
+		/*
+		 * Select the Prism header.
+		 */
+		memset(&ireq, 0, sizeof ireq);
+		strncpy(ireq.ifr_ifrn.ifrn_name, device,
+		    sizeof ireq.ifr_ifrn.ifrn_name);
+		ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] = 0;
+		args[0] = 3;	/* request Prism header */
+		memcpy(ireq.u.name, args, sizeof (int));
+		ioctl(sock_fd, cmd, &ireq);
+		break;
+
+	case MONITOR_ACX100:
+		/*
+		 * Get the current channel.
+		 */
+		memset(&ireq, 0, sizeof ireq);
+		strncpy(ireq.ifr_ifrn.ifrn_name, device,
+		    sizeof ireq.ifr_ifrn.ifrn_name);
+		ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] = 0;
+		if (ioctl(sock_fd, SIOCGIWFREQ, &ireq) == -1) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			    "%s: SIOCGIWFREQ: %s", device,
+			    pcap_strerror(errno));
+			return PCAP_ERROR;
+		}
+		channel = ireq.u.freq.m;
+
+		/*
+		 * Select the Prism header, and set the channel to the
+		 * current value.
+		 */
+		memset(&ireq, 0, sizeof ireq);
+		strncpy(ireq.ifr_ifrn.ifrn_name, device,
+		    sizeof ireq.ifr_ifrn.ifrn_name);
+		ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] = 0;
+		args[0] = 1;		/* request Prism header */
+		args[1] = channel;	/* set channel */
+		memcpy(ireq.u.name, args, 2*sizeof (int));
+		ioctl(sock_fd, cmd, &ireq);
+		break;
+
+	case MONITOR_RT2500:
+		/*
+		 * Disallow transmission - that turns on the
+		 * Prism header.
+		 */
+		memset(&ireq, 0, sizeof ireq);
+		strncpy(ireq.ifr_ifrn.ifrn_name, device,
+		    sizeof ireq.ifr_ifrn.ifrn_name);
+		ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] = 0;
+		args[0] = 0;	/* disallow transmitting */
+		memcpy(ireq.u.name, args, sizeof (int));
+		ioctl(sock_fd, cmd, &ireq);
+		break;
+
+	case MONITOR_RT2570:
+		/*
+		 * Force the Prism header.
+		 */
+		memset(&ireq, 0, sizeof ireq);
+		strncpy(ireq.ifr_ifrn.ifrn_name, device,
+		    sizeof ireq.ifr_ifrn.ifrn_name);
+		ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] = 0;
+		args[0] = 1;	/* request Prism header */
+		memcpy(ireq.u.name, args, sizeof (int));
+		ioctl(sock_fd, cmd, &ireq);
+		break;
+
+	case MONITOR_RT73:
+		/*
+		 * Force the Prism header.
+		 */
+		memset(&ireq, 0, sizeof ireq);
+		strncpy(ireq.ifr_ifrn.ifrn_name, device,
+		    sizeof ireq.ifr_ifrn.ifrn_name);
+		ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] = 0;
+		ireq.u.data.length = 1;	/* 1 argument */
+		ireq.u.data.pointer = "1";
+		ireq.u.data.flags = 0;
+		ioctl(sock_fd, cmd, &ireq);
+		break;
+
+	case MONITOR_RTL8XXX:
+		/*
+		 * Force the Prism header.
+		 */
+		memset(&ireq, 0, sizeof ireq);
+		strncpy(ireq.ifr_ifrn.ifrn_name, device,
+		    sizeof ireq.ifr_ifrn.ifrn_name);
+		ireq.ifr_ifrn.ifrn_name[sizeof ireq.ifr_ifrn.ifrn_name - 1] = 0;
+		args[0] = 1;	/* request Prism header */
+		memcpy(ireq.u.name, args, sizeof (int));
+		ioctl(sock_fd, cmd, &ireq);
+		break;
+	}
+
+	/*
+	 * Now bring the interface back up if we brought it down.
+	 */
+	if (oldflags != 0) {
+		ifr.ifr_flags = oldflags;
+		if (ioctl(sock_fd, SIOCSIFFLAGS, &ifr) == -1) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			    "%s: Can't set flags: %s", device, strerror(errno));
+
+			/*
+			 * At least try to restore the old mode on the
+			 * interface.
+			 */
+			if (ioctl(handle->fd, SIOCSIWMODE, &ireq) == -1) {
+				/*
+				 * Scientist, you've failed.
+				 */
+				fprintf(stderr,
+				    "Can't restore interface wireless mode (SIOCSIWMODE failed: %s).\n"
+				    "Please adjust manually.\n",
+				    strerror(errno));
+			}
+			return PCAP_ERROR;
+		}
+	}
+
+	/*
+	 * Note that we have to put the old mode back when we
+	 * close the device.
+	 */
+	handlep->must_do_on_close |= MUST_CLEAR_RFMON;
+
+	/*
+	 * Add this to the list of pcaps to close when we exit.
+	 */
+	pcap_add_to_pcaps_to_close(handle);
+
+	return 1;
+}
+#endif /* IW_MODE_MONITOR */
+
+/*
+ * Try various mechanisms to enter monitor mode.
+ */
+static int
+enter_rfmon_mode(pcap_t *handle, int sock_fd, const char *device)
+{
+#if defined(HAVE_LIBNL) || defined(IW_MODE_MONITOR)
+	int ret;
 #endif
 
+#ifdef HAVE_LIBNL
+	ret = enter_rfmon_mode_mac80211(handle, sock_fd, device);
+	if (ret < 0)
+		return ret;	/* error attempting to do so */
+	if (ret == 1)
+		return 1;	/* success */
+#endif /* HAVE_LIBNL */
+
+#ifdef IW_MODE_MONITOR
+	ret = enter_rfmon_mode_wext(handle, sock_fd, device);
+	if (ret < 0)
+		return ret;	/* error attempting to do so */
+	if (ret == 1)
+		return 1;	/* success */
+#endif /* IW_MODE_MONITOR */
+
+	/*
+	 * Either none of the mechanisms we know about work or none
+	 * of those mechanisms are available, so we can't do monitor
+	 * mode.
+	 */
+	return 0;
+}
+
+/*
+ * Find out if we have any form of fragmentation/reassembly offloading.
+ *
+ * We do so using SIOCETHTOOL checking for various types of offloading;
+ * if SIOCETHTOOL isn't defined, or we don't have any #defines for any
+ * of the types of offloading, there's nothing we can do to check, so
+ * we just say "no, we don't".
+ */
+#if defined(SIOCETHTOOL) && (defined(ETHTOOL_GTSO) || defined(ETHTOOL_GUFO) || defined(ETHTOOL_GGSO) || defined(ETHTOOL_GFLAGS) || defined(ETHTOOL_GGRO))
+static int
+iface_ethtool_ioctl(pcap_t *handle, int cmd, const char *cmdname)
+{
+	struct ifreq	ifr;
+	struct ethtool_value eval;
+
+	memset(&ifr, 0, sizeof(ifr));
+	strncpy(ifr.ifr_name, handle->opt.source, sizeof(ifr.ifr_name));
+	eval.cmd = cmd;
+	eval.data = 0;
+	ifr.ifr_data = (caddr_t)&eval;
+	if (ioctl(handle->fd, SIOCETHTOOL, &ifr) == -1) {
+		if (errno == EOPNOTSUPP || errno == EINVAL) {
+			/*
+			 * OK, let's just return 0, which, in our
+			 * case, either means "no, what we're asking
+			 * about is not enabled" or "all the flags
+			 * are clear (i.e., nothing is enabled)".
+			 */
+			return 0;
+		}
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: SIOETHTOOL(%s) ioctl failed: %s", handle->opt.source,
+		    cmdname, strerror(errno));
+		return -1;
+	}
+	return eval.data;	
+}
+
+static int
+iface_get_offload(pcap_t *handle)
+{
+	int ret;
+
+#ifdef ETHTOOL_GTSO
+	ret = iface_ethtool_ioctl(handle, ETHTOOL_GTSO, "ETHTOOL_GTSO");
+	if (ret == -1)
+		return -1;
+	if (ret)
+		return 1;	/* TCP segmentation offloading on */
+#endif
+
+#ifdef ETHTOOL_GUFO
+	ret = iface_ethtool_ioctl(handle, ETHTOOL_GUFO, "ETHTOOL_GUFO");
+	if (ret == -1)
+		return -1;
+	if (ret)
+		return 1;	/* UDP fragmentation offloading on */
+#endif
+
+#ifdef ETHTOOL_GGSO
+	/*
+	 * XXX - will this cause large unsegmented packets to be
+	 * handed to PF_PACKET sockets on transmission?  If not,
+	 * this need not be checked.
+	 */
+	ret = iface_ethtool_ioctl(handle, ETHTOOL_GGSO, "ETHTOOL_GGSO");
+	if (ret == -1)
+		return -1;
+	if (ret)
+		return 1;	/* generic segmentation offloading on */
+#endif
+
+#ifdef ETHTOOL_GFLAGS
+	ret = iface_ethtool_ioctl(handle, ETHTOOL_GFLAGS, "ETHTOOL_GFLAGS");
+	if (ret == -1)
+		return -1;
+	if (ret & ETH_FLAG_LRO)
+		return 1;	/* large receive offloading on */
+#endif
+
+#ifdef ETHTOOL_GGRO
+	/*
+	 * XXX - will this cause large reassembled packets to be
+	 * handed to PF_PACKET sockets on receipt?  If not,
+	 * this need not be checked.
+	 */
+	ret = iface_ethtool_ioctl(handle, ETHTOOL_GGRO, "ETHTOOL_GGRO");
+	if (ret == -1)
+		return -1;
+	if (ret)
+		return 1;	/* generic (large) receive offloading on */
+#endif
+
+	return 0;
+}
+#else /* SIOCETHTOOL */
+static int
+iface_get_offload(pcap_t *handle _U_)
+{
+	/*
+	 * XXX - do we need to get this information if we don't
+	 * have the ethtool ioctls?  If so, how do we do that?
+	 */
+	return 0;
+}
+#endif /* SIOCETHTOOL */
+
+#endif /* HAVE_PF_PACKET_SOCKETS */
 
 /* ===== Functions to interface to the older kernels ================== */
 
 /*
- * With older kernels promiscuous mode is kind of interesting because we
- * have to reset the interface before exiting. The problem can't really
- * be solved without some daemon taking care of managing usage counts.
- * If we put the interface into promiscuous mode, we set a flag indicating
- * that we must take it out of that mode when the interface is closed,
- * and, when closing the interface, if that flag is set we take it out
- * of promiscuous mode.
+ * Try to open a packet socket using the old kernel interface.
+ * Returns 1 on success and a PCAP_ERROR_ value on an error.
  */
-
-/*
- * List of pcaps for which we turned promiscuous mode on by hand.
- * If there are any such pcaps, we arrange to call "pcap_close_all()"
- * when we exit, and have it close all of them to turn promiscuous mode
- * off.
- */
-static struct pcap *pcaps_to_close;
-
-/*
- * TRUE if we've already called "atexit()" to cause "pcap_close_all()" to
- * be called on exit.
- */
-static int did_atexit;
-
-static void	pcap_close_all(void)
+static int
+activate_old(pcap_t *handle)
 {
-	struct pcap *handle;
-
-	while ((handle = pcaps_to_close) != NULL)
-		pcap_close(handle);
-}
-
-static void	pcap_close_linux( pcap_t *handle )
-{
-	struct pcap	*p, *prevp;
+	struct pcap_linux *handlep = handle->priv;
+	int		arptype;
 	struct ifreq	ifr;
+	const char	*device = handle->opt.source;
+	struct utsname	utsname;
+	int		mtu;
 
-	if (handle->md.clear_promisc) {
-		/*
-		 * We put the interface into promiscuous mode; take
-		 * it out of promiscuous mode.
-		 *
-		 * XXX - if somebody else wants it in promiscuous mode,
-		 * this code cannot know that, so it'll take it out
-		 * of promiscuous mode.  That's not fixable in 2.0[.x]
-		 * kernels.
-		 */
-		memset(&ifr, 0, sizeof(ifr));
-		strncpy(ifr.ifr_name, handle->md.device, sizeof(ifr.ifr_name));
-		if (ioctl(handle->fd, SIOCGIFFLAGS, &ifr) == -1) {
-			fprintf(stderr,
-			    "Can't restore interface flags (SIOCGIFFLAGS failed: %s).\n"
-			    "Please adjust manually.\n"
-			    "Hint: This can't happen with Linux >= 2.2.0.\n",
-			    strerror(errno));
+	/* Open the socket */
+
+	handle->fd = socket(PF_INET, SOCK_PACKET, htons(ETH_P_ALL));
+	if (handle->fd == -1) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			 "socket: %s", pcap_strerror(errno));
+		if (errno == EPERM || errno == EACCES) {
+			/*
+			 * You don't have permission to open the
+			 * socket.
+			 */
+			return PCAP_ERROR_PERM_DENIED;
 		} else {
-			if (ifr.ifr_flags & IFF_PROMISC) {
-				/*
-				 * Promiscuous mode is currently on; turn it
-				 * off.
-				 */
-				ifr.ifr_flags &= ~IFF_PROMISC;
-				if (ioctl(handle->fd, SIOCSIFFLAGS, &ifr) == -1) {
-					fprintf(stderr,
-					    "Can't restore interface flags (SIOCSIFFLAGS failed: %s).\n"
-					    "Please adjust manually.\n"
-					    "Hint: This can't happen with Linux >= 2.2.0.\n",
-					    strerror(errno));
-				}
-			}
-		}
-
-		/*
-		 * Take this pcap out of the list of pcaps for which we
-		 * have to take the interface out of promiscuous mode.
-		 */
-		for (p = pcaps_to_close, prevp = NULL; p != NULL;
-		    prevp = p, p = p->md.next) {
-			if (p == handle) {
-				/*
-				 * Found it.  Remove it from the list.
-				 */
-				if (prevp == NULL) {
-					/*
-					 * It was at the head of the list.
-					 */
-					pcaps_to_close = p->md.next;
-				} else {
-					/*
-					 * It was in the middle of the list.
-					 */
-					prevp->md.next = p->md.next;
-				}
-				break;
-			}
+			/*
+			 * Other error.
+			 */
+			return PCAP_ERROR;
 		}
 	}
 
-	if (handle->md.device != NULL)
-		free(handle->md.device);
-	handle->md.device = NULL;
-	pcap_close_common(handle);
-}
+	/* It worked - we are using the old interface */
+	handlep->sock_packet = 1;
 
-/*
- *  Try to open a packet socket using the old kernel interface.
- *  Returns 0 on failure.
- *  FIXME: 0 uses to mean success (Sebastian)
- */
-static int
-live_open_old(pcap_t *handle, const char *device, int promisc,
-	      int to_ms, char *ebuf)
-{
-	int		arptype;
-	struct ifreq	ifr;
+	/* ...which means we get the link-layer header. */
+	handlep->cooked = 0;
 
-	do {
-		/* Open the socket */
+	/* Bind to the given device */
 
-		handle->fd = socket(PF_INET, SOCK_PACKET, htons(ETH_P_ALL));
-		if (handle->fd == -1) {
-			snprintf(ebuf, PCAP_ERRBUF_SIZE,
-				 "socket: %s", pcap_strerror(errno));
-			break;
+	if (strcmp(device, "any") == 0) {
+		strncpy(handle->errbuf, "pcap_activate: The \"any\" device isn't supported on 2.0[.x]-kernel systems",
+			PCAP_ERRBUF_SIZE);
+		return PCAP_ERROR;
+	}
+	if (iface_bind_old(handle->fd, device, handle->errbuf) == -1)
+		return PCAP_ERROR;
+
+	/*
+	 * Try to get the link-layer type.
+	 */
+	arptype = iface_get_arptype(handle->fd, device, handle->errbuf);
+	if (arptype < 0)
+		return PCAP_ERROR;
+
+	/*
+	 * Try to find the DLT_ type corresponding to that
+	 * link-layer type.
+	 */
+	map_arphrd_to_dlt(handle, arptype, 0);
+	if (handle->linktype == -1) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			 "unknown arptype %d", arptype);
+		return PCAP_ERROR;
+	}
+
+	/* Go to promisc mode if requested */
+
+	if (handle->opt.promisc) {
+		memset(&ifr, 0, sizeof(ifr));
+		strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));
+		if (ioctl(handle->fd, SIOCGIFFLAGS, &ifr) == -1) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+				 "SIOCGIFFLAGS: %s", pcap_strerror(errno));
+			return PCAP_ERROR;
 		}
+		if ((ifr.ifr_flags & IFF_PROMISC) == 0) {
+			/*
+			 * Promiscuous mode isn't currently on,
+			 * so turn it on, and remember that
+			 * we should turn it off when the
+			 * pcap_t is closed.
+			 */
 
-		/* It worked - we are using the old interface */
-		handle->md.sock_packet = 1;
-
-		/* ...which means we get the link-layer header. */
-		handle->md.cooked = 0;
-
-		/* Bind to the given device */
-
-		if (!device) {
-		        strncpy(ebuf, "pcap_open_live: The \"any\" device isn't supported on 2.0[.x]-kernel systems",
-				PCAP_ERRBUF_SIZE);
-			break;
-		}
-		if (iface_bind_old(handle->fd, device, ebuf) == -1)
-			break;
-
-		/*
-		 * Try to get the link-layer type.
-		 */
-		arptype = iface_get_arptype(handle->fd, device, ebuf);
-		if (arptype == -1)
-			break;
-
-		/*
-		 * Try to find the DLT_ type corresponding to that
-		 * link-layer type.
-		 */
-		map_arphrd_to_dlt(handle, arptype, 0);
-		if (handle->linktype == -1) {
-			snprintf(ebuf, PCAP_ERRBUF_SIZE,
-				 "unknown arptype %d", arptype);
-			break;
-		}
-
-		/* Go to promisc mode if requested */
-
-		if (promisc) {
-			memset(&ifr, 0, sizeof(ifr));
-			strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));
-			if (ioctl(handle->fd, SIOCGIFFLAGS, &ifr) == -1) {
-				snprintf(ebuf, PCAP_ERRBUF_SIZE,
-					 "SIOCGIFFLAGS: %s", pcap_strerror(errno));
-				break;
+			/*
+			 * If we haven't already done so, arrange
+			 * to have "pcap_close_all()" called when
+			 * we exit.
+			 */
+			if (!pcap_do_addexit(handle)) {
+				/*
+				 * "atexit()" failed; don't put
+				 * the interface in promiscuous
+				 * mode, just give up.
+				 */
+				return PCAP_ERROR;
 			}
-			if ((ifr.ifr_flags & IFF_PROMISC) == 0) {
-				/*
-				 * Promiscuous mode isn't currently on,
-				 * so turn it on, and remember that
-				 * we should turn it off when the
-				 * pcap_t is closed.
-				 */
 
-				/*
-				 * If we haven't already done so, arrange
-				 * to have "pcap_close_all()" called when
-				 * we exit.
-				 */
-				if (!did_atexit) {
-					if (atexit(pcap_close_all) == -1) {
-						/*
-						 * "atexit()" failed; don't
-						 * put the interface in
-						 * promiscuous mode, just
-						 * give up.
-						 */
-						strncpy(ebuf, "atexit failed",
-							PCAP_ERRBUF_SIZE);
-						break;
-					}
-					did_atexit = 1;
-				}
-
-				ifr.ifr_flags |= IFF_PROMISC;
-				if (ioctl(handle->fd, SIOCSIFFLAGS, &ifr) == -1) {
-				        snprintf(ebuf, PCAP_ERRBUF_SIZE,
-						 "SIOCSIFFLAGS: %s",
-						 pcap_strerror(errno));
-					break;
-				}
-				handle->md.clear_promisc = 1;
-
-				/*
-				 * Add this to the list of pcaps
-				 * to close when we exit.
-				 */
-				handle->md.next = pcaps_to_close;
-				pcaps_to_close = handle;
+			ifr.ifr_flags |= IFF_PROMISC;
+			if (ioctl(handle->fd, SIOCSIFFLAGS, &ifr) == -1) {
+			        snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+					 "SIOCSIFFLAGS: %s",
+					 pcap_strerror(errno));
+				return PCAP_ERROR;
 			}
+			handlep->must_do_on_close |= MUST_CLEAR_PROMISC;
+
+			/*
+			 * Add this to the list of pcaps
+			 * to close when we exit.
+			 */
+			pcap_add_to_pcaps_to_close(handle);
 		}
+	}
 
+	/*
+	 * Compute the buffer size.
+	 *
+	 * We're using SOCK_PACKET, so this might be a 2.0[.x]
+	 * kernel, and might require special handling - check.
+	 */
+	if (uname(&utsname) < 0 ||
+	    strncmp(utsname.release, "2.0", 3) == 0) {
 		/*
-		 * Default value for offset to align link-layer payload
-		 * on a 4-byte boundary.
+		 * Either we couldn't find out what kernel release
+		 * this is, or it's a 2.0[.x] kernel.
+		 *
+		 * In the 2.0[.x] kernel, a "recvfrom()" on
+		 * a SOCK_PACKET socket, with MSG_TRUNC set, will
+		 * return the number of bytes read, so if we pass
+		 * a length based on the snapshot length, it'll
+		 * return the number of bytes from the packet
+		 * copied to userland, not the actual length
+		 * of the packet.
+		 *
+		 * This means that, for example, the IP dissector
+		 * in tcpdump will get handed a packet length less
+		 * than the length in the IP header, and will
+		 * complain about "truncated-ip".
+		 *
+		 * So we don't bother trying to copy from the
+		 * kernel only the bytes in which we're interested,
+		 * but instead copy them all, just as the older
+		 * versions of libpcap for Linux did.
+		 *
+		 * The buffer therefore needs to be big enough to
+		 * hold the largest packet we can get from this
+		 * device.  Unfortunately, we can't get the MRU
+		 * of the network; we can only get the MTU.  The
+		 * MTU may be too small, in which case a packet larger
+		 * than the buffer size will be truncated *and* we
+		 * won't get the actual packet size.
+		 *
+		 * However, if the snapshot length is larger than
+		 * the buffer size based on the MTU, we use the
+		 * snapshot length as the buffer size, instead;
+		 * this means that with a sufficiently large snapshot
+		 * length we won't artificially truncate packets
+		 * to the MTU-based size.
+		 *
+		 * This mess just one of many problems with packet
+		 * capture on 2.0[.x] kernels; you really want a
+		 * 2.2[.x] or later kernel if you want packet capture
+		 * to work well.
 		 */
-		handle->offset	 = 0;
+		mtu = iface_get_mtu(handle->fd, device, handle->errbuf);
+		if (mtu == -1)
+			return PCAP_ERROR;
+		handle->bufsize = MAX_LINKHEADER_SIZE + mtu;
+		if (handle->bufsize < handle->snapshot)
+			handle->bufsize = handle->snapshot;
+	} else {
+		/*
+		 * This is a 2.2[.x] or later kernel.
+		 *
+		 * We can safely pass "recvfrom()" a byte count
+		 * based on the snapshot length.
+		 */
+		handle->bufsize = handle->snapshot;
+	}
 
-		return 1;
+	/*
+	 * Default value for offset to align link-layer payload
+	 * on a 4-byte boundary.
+	 */
+	handle->offset	 = 0;
 
-	} while (0);
+	/*
+	 * SOCK_PACKET sockets don't supply information from
+	 * stripped VLAN tags.
+	 */
+	handlep->vlan_offset = -1; /* unknown */
 
-	pcap_close_linux(handle);
-	return 0;
+	return 1;
 }
 
 /*
@@ -1971,7 +5819,13 @@
 	if (ioctl(fd, SIOCGIFHWADDR, &ifr) == -1) {
 		snprintf(ebuf, PCAP_ERRBUF_SIZE,
 			 "SIOCGIFHWADDR: %s", pcap_strerror(errno));
-		return -1;
+		if (errno == ENODEV) {
+			/*
+			 * No such device.
+			 */
+			return PCAP_ERROR_NO_SUCH_DEVICE;
+		}
+		return PCAP_ERROR;
 	}
 
 	return ifr.ifr_hwaddr.sa_family;
@@ -1979,8 +5833,9 @@
 
 #ifdef SO_ATTACH_FILTER
 static int
-fix_program(pcap_t *handle, struct sock_fprog *fcode)
+fix_program(pcap_t *handle, struct sock_fprog *fcode, int is_mmapped)
 {
+	struct pcap_linux *handlep = handle->priv;
 	size_t prog_size;
 	register int i;
 	register struct bpf_insn *p;
@@ -1995,7 +5850,7 @@
 	len = handle->fcode.bf_len;
 	f = (struct bpf_insn *)malloc(prog_size);
 	if (f == NULL) {
-		snprintf(handle->errbuf, sizeof(handle->errbuf),
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
 			 "malloc: %s", pcap_strerror(errno));
 		return -1;
 	}
@@ -2012,26 +5867,33 @@
 
 		case BPF_RET:
 			/*
-			 * It's a return instruction; is the snapshot
-			 * length a constant, rather than the contents
-			 * of the accumulator?
+			 * It's a return instruction; are we capturing
+			 * in memory-mapped mode?
 			 */
-			if (BPF_MODE(p->code) == BPF_K) {
+			if (!is_mmapped) {
 				/*
-				 * Yes - if the value to be returned,
-				 * i.e. the snapshot length, is anything
-				 * other than 0, make it 65535, so that
-				 * the packet is truncated by "recvfrom()",
-				 * not by the filter.
-				 *
-				 * XXX - there's nothing we can easily do
-				 * if it's getting the value from the
-				 * accumulator; we'd have to insert
-				 * code to force non-zero values to be
-				 * 65535.
+				 * No; is the snapshot length a constant,
+				 * rather than the contents of the
+				 * accumulator?
 				 */
-				if (p->k != 0)
-					p->k = 65535;
+				if (BPF_MODE(p->code) == BPF_K) {
+					/*
+					 * Yes - if the value to be returned,
+					 * i.e. the snapshot length, is
+					 * anything other than 0, make it
+					 * 65535, so that the packet is
+					 * truncated by "recvfrom()",
+					 * not by the filter.
+					 *
+					 * XXX - there's nothing we can
+					 * easily do if it's getting the
+					 * value from the accumulator; we'd
+					 * have to insert code to force
+					 * non-zero values to be 65535.
+					 */
+					if (p->k != 0)
+						p->k = 65535;
+				}
 			}
 			break;
 
@@ -2049,7 +5911,7 @@
 				/*
 				 * Yes; are we in cooked mode?
 				 */
-				if (handle->md.cooked) {
+				if (handlep->cooked) {
 					/*
 					 * Yes, so we need to fix this
 					 * instruction.
@@ -2085,13 +5947,19 @@
 		 * header.
 		 */
 		p->k -= SLL_HDR_LEN;
+	} else if (p->k == 0) {
+		/*
+		 * It's the packet type field; map it to the special magic
+		 * kernel offset for that field.
+		 */
+		p->k = SKF_AD_OFF + SKF_AD_PKTTYPE;
 	} else if (p->k == 14) {
 		/*
 		 * It's the protocol field; map it to the special magic
 		 * kernel offset for that field.
 		 */
 		p->k = SKF_AD_OFF + SKF_AD_PROTOCOL;
-	} else {
+	} else if ((bpf_int32)(p->k) > 0) {
 		/*
 		 * It's within the header, but it's not one of those
 		 * fields; we can't do that in the kernel, so punt
@@ -2167,7 +6035,7 @@
 			if (save_errno != EAGAIN) {
 				/* Fatal error */
 				reset_kernel_filter(handle);
-				snprintf(handle->errbuf, sizeof(handle->errbuf),
+				snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
 				 "recv: %s", pcap_strerror(save_errno));
 				return -2;
 			}
diff --git a/pcap-namedb.h b/pcap-namedb.h
index acaabd9..d0b2231 100644
--- a/pcap-namedb.h
+++ b/pcap-namedb.h
@@ -30,60 +30,13 @@
  * 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.10.2.1 2005/04/19 04:26:08 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/pcap-namedb.h,v 1.13 2006-10-04 18:13:32 guy Exp $ (LBL)
  */
 
-#ifndef lib_pcap_namedb_h
-#define lib_pcap_namedb_h
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /*
- * As returned by the pcap_next_etherent()
- * XXX this stuff doesn't belong in this interface, but this
- * library already must do name to address translation, so
- * on systems that don't have support for /etc/ethers, we
- * export these hooks since they'll
+ * For backwards compatibility.
+ *
+ * Note to OS vendors: do NOT get rid of this file!  Some applications
+ * might expect to be able to include <pcap-namedb.h>.
  */
-struct pcap_etherent {
-	u_char addr[6];
-	char name[122];
-};
-#ifndef PCAP_ETHERS_FILE
-#define PCAP_ETHERS_FILE "/etc/ethers"
-#endif
-struct	pcap_etherent *pcap_next_etherent(FILE *);
-u_char *pcap_ether_hostton(const char*);
-u_char *pcap_ether_aton(const char *);
-
-bpf_u_int32 **pcap_nametoaddr(const char *);
-#ifdef INET6
-struct addrinfo *pcap_nametoaddrinfo(const char *);
-#endif
-bpf_u_int32 pcap_nametonetaddr(const char *);
-
-int	pcap_nametoport(const char *, int *, int *);
-int	pcap_nametoportrange(const char *, int *, int *, int *);
-int	pcap_nametoproto(const char *);
-int	pcap_nametoeproto(const char *);
-int	pcap_nametollc(const char *);
-/*
- * If a protocol is unknown, PROTO_UNDEF is returned.
- * Also, pcap_nametoport() returns the protocol along with the port number.
- * If there are ambiguous entried in /etc/services (i.e. domain
- * can be either tcp or udp) PROTO_UNDEF is returned.
- */
-#define PROTO_UNDEF		-1
-
-/* XXX move these to pcap-int.h? */
-int __pcap_atodn(const char *, bpf_u_int32 *);
-int __pcap_atoin(const char *, bpf_u_int32 *);
-u_short	__pcap_nametodnaddr(const char *);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+#include <pcap/namedb.h>
diff --git a/pcap-netfilter-linux.c b/pcap-netfilter-linux.c
new file mode 100644
index 0000000..aa8edbb
--- /dev/null
+++ b/pcap-netfilter-linux.c
@@ -0,0 +1,653 @@
+/*
+ * Copyright (c) 2011 Jakub Zawadzki
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+ * OWNER 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcap-int.h"
+
+#ifdef NEED_STRERROR_H
+#include "strerror.h"
+#endif
+
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+
+#include <time.h>
+#include <sys/time.h>
+#include <netinet/in.h>
+#include <linux/types.h>
+
+#include <linux/netlink.h>
+#include <linux/netfilter.h>
+#include <linux/netfilter/nfnetlink.h>
+#include <linux/netfilter/nfnetlink_log.h>
+#include <linux/netfilter/nfnetlink_queue.h>
+
+/* NOTE: if your program drops privilages after pcap_activate() it WON'T work with nfqueue.
+ *       It took me quite some time to debug ;/ 
+ *
+ *       Sending any data to nfnetlink socket requires CAP_NET_ADMIN privilages,
+ *       and in nfqueue we need to send verdict reply after recving packet.
+ *
+ *       In tcpdump you can disable dropping privilages with -Z root
+ */
+ 
+#include "pcap-netfilter-linux.h"
+
+#define HDR_LENGTH (NLMSG_LENGTH(NLMSG_ALIGN(sizeof(struct nfgenmsg))))
+
+#define NFLOG_IFACE "nflog"
+#define NFQUEUE_IFACE "nfqueue"
+
+typedef enum { OTHER = -1, NFLOG, NFQUEUE } nftype_t;
+
+/*
+ * Private data for capturing on Linux netfilter sockets.
+ */
+struct pcap_netfilter {
+	u_int	packets_read;	/* count of packets read with recvfrom() */
+};
+
+static int nfqueue_send_verdict(const pcap_t *handle, u_int16_t group_id, u_int32_t id, u_int32_t verdict);
+
+static int
+netfilter_read_linux(pcap_t *handle, int max_packets, pcap_handler callback, u_char *user)
+{
+	struct pcap_netfilter *handlep = handle->priv;
+	const unsigned char *buf;
+	int count = 0;
+	int len;
+
+	/* ignore interrupt system call error */
+	do {
+		len = recv(handle->fd, handle->buffer, handle->bufsize, 0);
+		if (handle->break_loop) {
+			handle->break_loop = 0;
+			return -2;
+		}
+	} while ((len == -1) && (errno == EINTR));
+
+	if (len < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't receive packet %d:%s", errno, pcap_strerror(errno));
+		return -1;
+	}
+
+	buf = handle->buffer;
+	while (len >= NLMSG_SPACE(0)) {
+		const struct nlmsghdr *nlh = (const struct nlmsghdr *) buf;
+		u_int32_t msg_len;
+		nftype_t type = OTHER;
+
+		if (nlh->nlmsg_len < sizeof(struct nlmsghdr) || len < nlh->nlmsg_len) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Message truncated: (got: %d) (nlmsg_len: %u)", len, nlh->nlmsg_len);
+			return -1;
+		}
+
+		if (NFNL_SUBSYS_ID(nlh->nlmsg_type) == NFNL_SUBSYS_ULOG && 
+			NFNL_MSG_TYPE(nlh->nlmsg_type) == NFULNL_MSG_PACKET) 
+				type = NFLOG;
+
+		if (NFNL_SUBSYS_ID(nlh->nlmsg_type) == NFNL_SUBSYS_QUEUE && 
+			NFNL_MSG_TYPE(nlh->nlmsg_type) == NFQNL_MSG_PACKET)
+				type = NFQUEUE;
+
+		if (type != OTHER) {
+			const unsigned char *payload = NULL;
+			struct pcap_pkthdr pkth;
+
+			const struct nfgenmsg *nfg;
+			int id = 0;
+
+			if (handle->linktype != DLT_NFLOG) {
+				const struct nfattr *payload_attr = NULL;
+
+				if (nlh->nlmsg_len < HDR_LENGTH) {
+					snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Malformed message: (nlmsg_len: %u)", nlh->nlmsg_len);
+					return -1;
+				}
+
+				nfg = NLMSG_DATA(nlh);
+				if (nlh->nlmsg_len > HDR_LENGTH) {
+					struct nfattr *attr = NFM_NFA(nfg);
+					int attr_len = nlh->nlmsg_len - NLMSG_ALIGN(HDR_LENGTH);
+
+					while (NFA_OK(attr, attr_len)) {
+						if (type == NFQUEUE) {
+							switch (NFA_TYPE(attr)) {
+								case NFQA_PACKET_HDR:
+									{
+										const struct nfqnl_msg_packet_hdr *pkt_hdr = (const struct nfqnl_msg_packet_hdr *) NFA_DATA(attr);
+
+										id = ntohl(pkt_hdr->packet_id);
+										break;
+									}
+								case NFQA_PAYLOAD:
+									payload_attr = attr;
+									break;
+							}
+
+						} else if (type == NFLOG) {
+							switch (NFA_TYPE(attr)) {
+								case NFULA_PAYLOAD:
+									payload_attr = attr;
+									break;
+							}
+						}
+						attr = NFA_NEXT(attr, attr_len);
+					}
+				}
+
+				if (payload_attr) {
+					payload = NFA_DATA(payload_attr);
+					pkth.len = pkth.caplen = NFA_PAYLOAD(payload_attr);
+				}
+
+			} else {
+				payload = NLMSG_DATA(nlh);
+				pkth.caplen = pkth.len = nlh->nlmsg_len-NLMSG_ALIGN(sizeof(struct nlmsghdr));
+			}
+
+			if (payload) {
+				/* pkth.caplen = min (payload_len, handle->snapshot); */
+
+				gettimeofday(&pkth.ts, NULL);
+				if (handle->fcode.bf_insns == NULL ||
+						bpf_filter(handle->fcode.bf_insns, payload, pkth.len, pkth.caplen)) 
+				{
+					handlep->packets_read++;
+					callback(user, &pkth, payload);
+					count++;
+				}
+			}
+
+			if (type == NFQUEUE) {
+				/* XXX, possible responses: NF_DROP, NF_ACCEPT, NF_STOLEN, NF_QUEUE, NF_REPEAT, NF_STOP */
+				nfqueue_send_verdict(handle, ntohs(nfg->res_id), id, NF_ACCEPT);
+			}
+		}
+
+		msg_len = NLMSG_ALIGN(nlh->nlmsg_len);
+		if (msg_len > len)
+			msg_len = len;
+
+		len -= msg_len;
+		buf += msg_len;
+	}
+	return count;
+}
+
+static int
+netfilter_set_datalink(pcap_t *handle, int dlt)
+{
+	handle->linktype = dlt;
+	return 0;
+}
+
+static int
+netfilter_stats_linux(pcap_t *handle, struct pcap_stat *stats)
+{
+	struct pcap_netfilter *handlep = handle->priv;
+
+	stats->ps_recv = handlep->packets_read;
+	stats->ps_drop = 0;
+	stats->ps_ifdrop = 0;
+	return 0;
+}
+
+static int
+netfilter_inject_linux(pcap_t *handle, const void *buf, size_t size)
+{
+	snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "inject not supported on netfilter devices");
+	return (-1);
+}                           
+
+struct my_nfattr {
+	u_int16_t nfa_len;
+	u_int16_t nfa_type;
+	void *data;
+};
+
+static int
+netfilter_send_config_msg(const pcap_t *handle, u_int16_t msg_type, int ack, u_int8_t family, u_int16_t res_id, const struct my_nfattr *mynfa)
+{
+	char buf[1024] __attribute__ ((aligned));
+
+	struct nlmsghdr *nlh = (struct nlmsghdr *) buf;
+	struct nfgenmsg *nfg = (struct nfgenmsg *) (buf + sizeof(struct nlmsghdr));
+
+	struct sockaddr_nl snl;
+	static unsigned int seq_id;
+	
+	if (!seq_id)
+		seq_id = time(NULL);
+	++seq_id;
+
+	nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct nfgenmsg));
+	nlh->nlmsg_type = msg_type;
+	nlh->nlmsg_flags = NLM_F_REQUEST | (ack ? NLM_F_ACK : 0);
+	nlh->nlmsg_pid = 0;	/* to kernel */
+	nlh->nlmsg_seq = seq_id;
+
+	nfg->nfgen_family = family;
+	nfg->version = NFNETLINK_V0;
+	nfg->res_id = htons(res_id);
+
+	if (mynfa) {
+		struct nfattr *nfa = (struct nfattr *) (buf + NLMSG_ALIGN(nlh->nlmsg_len));
+
+		nfa->nfa_type = mynfa->nfa_type;
+		nfa->nfa_len = NFA_LENGTH(mynfa->nfa_len);
+		memcpy(NFA_DATA(nfa), mynfa->data, mynfa->nfa_len);
+		nlh->nlmsg_len = NLMSG_ALIGN(nlh->nlmsg_len) + NFA_ALIGN(nfa->nfa_len);
+	}
+
+	memset(&snl, 0, sizeof(snl));
+	snl.nl_family = AF_NETLINK;
+
+	if (sendto(handle->fd, nlh, nlh->nlmsg_len, 0, (struct sockaddr *) &snl, sizeof(snl)) == -1)
+		return -1;
+
+	if (!ack)
+		return 0;
+
+	/* waiting for reply loop */
+	do {
+		socklen_t addrlen = sizeof(snl);
+		int len;
+
+		/* ignore interrupt system call error */
+		do {
+			len = recvfrom(handle->fd, buf, sizeof(buf), 0, (struct sockaddr *) &snl, &addrlen);
+		} while ((len == -1) && (errno == EINTR));
+
+		if (len <= 0)
+			return len;
+
+		if (addrlen != sizeof(snl) || snl.nl_family != AF_NETLINK) {
+			errno = EINVAL;
+			return -1;
+		}
+
+		nlh = (struct nlmsghdr *) buf;
+		if (snl.nl_pid != 0 || seq_id != nlh->nlmsg_seq)	/* if not from kernel or wrong sequence skip */
+			continue;
+
+		while (len >= NLMSG_SPACE(0) && NLMSG_OK(nlh, len)) {
+			if (nlh->nlmsg_type == NLMSG_ERROR || (nlh->nlmsg_type == NLMSG_DONE && nlh->nlmsg_flags & NLM_F_MULTI)) {
+				if (nlh->nlmsg_len < NLMSG_ALIGN(sizeof(struct nlmsgerr))) {
+					errno = EBADMSG;
+					return -1;
+				}
+				errno = -(*((int *)NLMSG_DATA(nlh)));
+				return (errno == 0) ? 0 : -1;
+			}
+			nlh = NLMSG_NEXT(nlh, len);
+		}
+	} while (1);
+
+	return -1; /* never here */
+}
+
+static int
+nflog_send_config_msg(const pcap_t *handle, u_int8_t family, u_int16_t group_id, const struct my_nfattr *mynfa)
+{
+	return netfilter_send_config_msg(handle, (NFNL_SUBSYS_ULOG << 8) | NFULNL_MSG_CONFIG, 1, family, group_id, mynfa);
+}
+
+static int
+nflog_send_config_cmd(const pcap_t *handle, u_int16_t group_id, u_int8_t cmd, u_int8_t family)
+{
+	struct nfulnl_msg_config_cmd msg;
+	struct my_nfattr nfa;
+
+	msg.command = cmd;
+
+	nfa.data = &msg;
+	nfa.nfa_type = NFULA_CFG_CMD;
+	nfa.nfa_len = sizeof(msg);
+
+	return nflog_send_config_msg(handle, family, group_id, &nfa);
+}
+
+static int 
+nflog_send_config_mode(const pcap_t *handle, u_int16_t group_id, u_int8_t copy_mode, u_int32_t copy_range)
+{
+	struct nfulnl_msg_config_mode msg;
+	struct my_nfattr nfa;
+
+	msg.copy_range = htonl(copy_range);
+	msg.copy_mode = copy_mode;
+
+	nfa.data = &msg;
+	nfa.nfa_type = NFULA_CFG_MODE;
+	nfa.nfa_len = sizeof(msg);
+
+	return nflog_send_config_msg(handle, AF_UNSPEC, group_id, &nfa);
+}
+
+static int
+nfqueue_send_verdict(const pcap_t *handle, u_int16_t group_id, u_int32_t id, u_int32_t verdict)
+{
+	struct nfqnl_msg_verdict_hdr msg;
+	struct my_nfattr nfa;
+
+	msg.id = htonl(id);
+	msg.verdict = htonl(verdict);
+
+	nfa.data = &msg;
+	nfa.nfa_type = NFQA_VERDICT_HDR;
+	nfa.nfa_len = sizeof(msg);
+
+	return netfilter_send_config_msg(handle, (NFNL_SUBSYS_QUEUE << 8) | NFQNL_MSG_VERDICT, 0, AF_UNSPEC, group_id, &nfa);
+}
+
+static int
+nfqueue_send_config_msg(const pcap_t *handle, u_int8_t family, u_int16_t group_id, const struct my_nfattr *mynfa)
+{
+	return netfilter_send_config_msg(handle, (NFNL_SUBSYS_QUEUE << 8) | NFQNL_MSG_CONFIG, 1, family, group_id, mynfa);
+}
+
+static int
+nfqueue_send_config_cmd(const pcap_t *handle, u_int16_t group_id, u_int8_t cmd, u_int16_t pf)
+{
+	struct nfqnl_msg_config_cmd msg;
+	struct my_nfattr nfa;
+
+	msg.command = cmd;
+	msg.pf = htons(pf);
+
+	nfa.data = &msg;
+	nfa.nfa_type = NFQA_CFG_CMD;
+	nfa.nfa_len = sizeof(msg);
+
+	return nfqueue_send_config_msg(handle, AF_UNSPEC, group_id, &nfa);
+}
+
+static int 
+nfqueue_send_config_mode(const pcap_t *handle, u_int16_t group_id, u_int8_t copy_mode, u_int32_t copy_range)
+{
+	struct nfqnl_msg_config_params msg;
+	struct my_nfattr nfa;
+
+	msg.copy_range = htonl(copy_range);
+	msg.copy_mode = copy_mode;
+
+	nfa.data = &msg;
+	nfa.nfa_type = NFQA_CFG_PARAMS;
+	nfa.nfa_len = sizeof(msg);
+
+	return nfqueue_send_config_msg(handle, AF_UNSPEC, group_id, &nfa);
+}
+
+static int
+netfilter_activate(pcap_t* handle)
+{
+	const char *dev = handle->opt.source;
+	unsigned short groups[32];
+	int group_count = 0;
+	nftype_t type = OTHER;
+	int i;
+
+ 	if (strncmp(dev, NFLOG_IFACE, strlen(NFLOG_IFACE)) == 0) {
+ 		dev += strlen(NFLOG_IFACE);
+		type = NFLOG;
+
+	} else if (strncmp(dev, NFQUEUE_IFACE, strlen(NFQUEUE_IFACE)) == 0) {
+		dev += strlen(NFQUEUE_IFACE);
+		type = NFQUEUE;
+	}
+ 
+	if (type != OTHER && *dev == ':') {
+		dev++;
+		while (*dev) {
+			long int group_id;
+			char *end_dev;
+
+			if (group_count == 32) {
+				snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+						"Maximum 32 netfilter groups! dev: %s", 
+						handle->opt.source);
+				return PCAP_ERROR;
+			}
+
+			group_id = strtol(dev, &end_dev, 0);
+			if (end_dev != dev) {
+				if (group_id < 0 || group_id > 65535) {
+					snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+							"Netfilter group range from 0 to 65535 (got %ld)",
+							group_id);
+					return PCAP_ERROR;
+				}
+
+				groups[group_count++] = (unsigned short) group_id;
+				dev = end_dev;
+			}
+			if (*dev != ',')
+				break;
+			dev++;
+		}
+	}
+
+	if (type == OTHER || *dev) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+				"Can't get netfilter group(s) index from %s", 
+				handle->opt.source);
+		return PCAP_ERROR;
+	}
+
+	/* if no groups, add default: 0 */
+	if (!group_count) {
+		groups[0] = 0;
+		group_count = 1;
+	}
+
+	/* Initialize some components of the pcap structure. */
+	handle->bufsize = 128 + handle->snapshot;
+	handle->offset = 0;
+	handle->read_op = netfilter_read_linux;
+	handle->inject_op = netfilter_inject_linux;
+	handle->setfilter_op = install_bpf_program; /* no kernel filtering */
+	handle->setdirection_op = NULL;
+	handle->set_datalink_op = netfilter_set_datalink;
+	handle->getnonblock_op = pcap_getnonblock_fd;
+	handle->setnonblock_op = pcap_setnonblock_fd;
+	handle->stats_op = netfilter_stats_linux;
+
+	/* Create netlink socket */
+	handle->fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_NETFILTER);
+	if (handle->fd < 0) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't create raw socket %d:%s", errno, pcap_strerror(errno));
+		return PCAP_ERROR;
+	}
+
+	if (type == NFLOG) {
+		handle->linktype = DLT_NFLOG;
+		handle->dlt_list = (u_int *) malloc(sizeof(u_int) * 2);
+		if (handle->dlt_list != NULL) {
+			handle->dlt_list[0] = DLT_NFLOG;
+			handle->dlt_list[1] = DLT_IPV4;
+			handle->dlt_count = 2;
+		}
+
+	} else
+		handle->linktype = DLT_IPV4;
+
+	handle->buffer = malloc(handle->bufsize);
+	if (!handle->buffer) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't allocate dump buffer: %s", pcap_strerror(errno));
+		goto close_fail;
+	}
+
+	if (type == NFLOG) {
+		if (nflog_send_config_cmd(handle, 0, NFULNL_CFG_CMD_PF_UNBIND, AF_INET) < 0) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "NFULNL_CFG_CMD_PF_UNBIND: %s", pcap_strerror(errno));
+			goto close_fail;
+		}
+
+		if (nflog_send_config_cmd(handle, 0, NFULNL_CFG_CMD_PF_BIND, AF_INET) < 0) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "NFULNL_CFG_CMD_PF_BIND: %s", pcap_strerror(errno));
+			goto close_fail;
+		}
+
+		/* Bind socket to the nflog groups */
+		for (i = 0; i < group_count; i++) {
+			if (nflog_send_config_cmd(handle, groups[i], NFULNL_CFG_CMD_BIND, AF_UNSPEC) < 0) {
+				snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't listen on group group index: %s", pcap_strerror(errno));
+				goto close_fail;
+			}
+
+			if (nflog_send_config_mode(handle, groups[i], NFULNL_COPY_PACKET, handle->snapshot) < 0) {
+				snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "NFULNL_COPY_PACKET: %s", pcap_strerror(errno));
+				goto close_fail;
+			}
+		}
+
+	} else {
+		if (nfqueue_send_config_cmd(handle, 0, NFQNL_CFG_CMD_PF_UNBIND, AF_INET) < 0) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "NFQNL_CFG_CMD_PF_UNBIND: %s", pcap_strerror(errno));
+			goto close_fail;
+		}
+
+		if (nfqueue_send_config_cmd(handle, 0, NFQNL_CFG_CMD_PF_BIND, AF_INET) < 0) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "NFQNL_CFG_CMD_PF_BIND: %s", pcap_strerror(errno));
+			goto close_fail;
+		}
+
+		/* Bind socket to the nfqueue groups */
+		for (i = 0; i < group_count; i++) {
+			if (nfqueue_send_config_cmd(handle, groups[i], NFQNL_CFG_CMD_BIND, AF_UNSPEC) < 0) {
+				snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't listen on group group index: %s", pcap_strerror(errno));
+				goto close_fail;
+			}
+
+			if (nfqueue_send_config_mode(handle, groups[i], NFQNL_COPY_PACKET, handle->snapshot) < 0) {
+				snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "NFQNL_COPY_PACKET: %s", pcap_strerror(errno));
+				goto close_fail;
+			}
+		}
+	}
+
+	if (handle->opt.rfmon) {
+		/*
+		 * Monitor mode doesn't apply to netfilter devices.
+		 */
+		pcap_cleanup_live_common(handle);
+		return PCAP_ERROR_RFMON_NOTSUP;
+	}
+
+	if (handle->opt.buffer_size != 0) {
+		/*
+		 * Set the socket buffer size to the specified value.
+		 */
+		if (setsockopt(handle->fd, SOL_SOCKET, SO_RCVBUF, &handle->opt.buffer_size, sizeof(handle->opt.buffer_size)) == -1) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "SO_RCVBUF: %s", pcap_strerror(errno));
+			goto close_fail;
+		}
+	}
+
+	handle->selectable_fd = handle->fd;
+	return 0;
+
+close_fail:
+	pcap_cleanup_live_common(handle);
+	return PCAP_ERROR;
+}
+
+pcap_t *
+netfilter_create(const char *device, char *ebuf, int *is_ours)
+{
+	const char *cp;
+	pcap_t *p;
+
+	/* Does this look like an netfilter device? */
+	cp = strrchr(device, '/');
+	if (cp == NULL)
+		cp = device;
+
+	/* Does it begin with NFLOG_IFACE or NFQUEUE_IFACE? */
+	if (strncmp(cp, NFLOG_IFACE, sizeof NFLOG_IFACE - 1) == 0)
+		cp += sizeof NFLOG_IFACE - 1;
+	else if (strncmp(cp, NFQUEUE_IFACE, sizeof NFQUEUE_IFACE - 1) == 0) 
+		cp += sizeof NFQUEUE_IFACE - 1;
+	else {
+		/* Nope, doesn't begin with NFLOG_IFACE nor NFQUEUE_IFACE */
+		*is_ours = 0;
+		return NULL;
+	}
+
+	/*
+	 * Yes - is that either the end of the name, or is it followed
+	 * by a colon?
+	 */
+	if (*cp != ':' && *cp != '\0') {
+		/* Nope */
+		*is_ours = 0;
+		return NULL;
+	}
+
+	/* OK, it's probably ours. */
+	*is_ours = 1;
+
+	p = pcap_create_common(device, ebuf, sizeof (struct pcap_netfilter));
+	if (p == NULL)
+		return (NULL);
+
+	p->activate_op = netfilter_activate;
+	return (p);
+}
+
+int 
+netfilter_findalldevs(pcap_if_t **alldevsp, char *err_str)
+{
+	int sock;
+	
+	sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_NETFILTER);
+	if (sock < 0) {
+		/* if netlink is not supported this is not fatal */
+		if (errno == EAFNOSUPPORT || errno == EPROTONOSUPPORT)
+			return 0;
+		snprintf(err_str, PCAP_ERRBUF_SIZE, "Can't open netlink socket %d:%s",
+			errno, pcap_strerror(errno));
+		return -1;
+	}
+	close(sock);
+
+	if (pcap_add_if(alldevsp, NFLOG_IFACE, 0, "Linux netfilter log (NFLOG) interface", err_str) < 0)
+		return -1;
+	if (pcap_add_if(alldevsp, NFQUEUE_IFACE, 0, "Linux netfilter queue (NFQUEUE) interface", err_str) < 0)
+		return -1;
+	return 0;
+}
diff --git a/pcap-netfilter-linux.h b/pcap-netfilter-linux.h
new file mode 100644
index 0000000..882a402
--- /dev/null
+++ b/pcap-netfilter-linux.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2011 Jakub Zawadzki
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+ * OWNER 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.
+ */
+
+/*
+ * Prototypes for netlink-related functions
+ */
+int netfilter_findalldevs(pcap_if_t **alldevsp, char *err_str);
+pcap_t *netfilter_create(const char *device, char *ebuf, int *is_ours);
diff --git a/pcap-nit.c b/pcap-nit.c
index 94c4528..40e640c 100644
--- a/pcap-nit.c
+++ b/pcap-nit.c
@@ -20,7 +20,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/pcap-nit.c,v 1.57.2.1 2005/05/03 18:54:37 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/pcap-nit.c,v 1.62 2008-04-14 20:40:58 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -71,9 +71,17 @@
 /* Forwards */
 static int nit_setflags(int, int, int, char *);
 
+/*
+ * Private data for capturing on NIT devices.
+ */
+struct pcap_nit {
+	struct pcap_stat stat;
+};
+
 static int
 pcap_stats_nit(pcap_t *p, struct pcap_stat *ps)
 {
+	struct pcap_nit *pn = p->priv;
 
 	/*
 	 * "ps_recv" counts packets handed to the filter, not packets
@@ -91,15 +99,15 @@
 	 * kernel by libpcap or packets not yet read from libpcap by the
 	 * application.
 	 */
-	*ps = p->md.stat;
+	*ps = pn->stat;
 	return (0);
 }
 
 static int
 pcap_read_nit(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
 {
+	struct pcap_nit *pn = p->priv;
 	register int cc, n;
-	register struct bpf_insn *fcode = p->fcode.bf_insns;
 	register u_char *bp, *cp, *ep;
 	register struct nit_hdr *nh;
 	register int caplen;
@@ -157,7 +165,7 @@
 		case NIT_NOMBUF:
 		case NIT_NOCLUSTER:
 		case NIT_NOSPACE:
-			p->md.stat.ps_drop = nh->nh_dropped;
+			pn->stat.ps_drop = nh->nh_dropped;
 			continue;
 
 		case NIT_SEQNO:
@@ -168,20 +176,20 @@
 			    "bad nit state %d", nh->nh_state);
 			return (-1);
 		}
-		++p->md.stat.ps_recv;
+		++pn->stat.ps_recv;
 		bp += ((sizeof(struct nit_hdr) + nh->nh_datalen +
 		    sizeof(int) - 1) & ~(sizeof(int) - 1));
 
 		caplen = nh->nh_wirelen;
 		if (caplen > p->snapshot)
 			caplen = p->snapshot;
-		if (bpf_filter(fcode, cp, nh->nh_wirelen, caplen)) {
+		if (bpf_filter(p->fcode.bf_insns, cp, nh->nh_wirelen, caplen)) {
 			struct pcap_pkthdr h;
 			h.ts = nh->nh_timestamp;
 			h.len = nh->nh_wirelen;
 			h.caplen = caplen;
 			(*callback)(user, &h, cp);
-			if (++n >= cnt && cnt >= 0) {
+			if (++n >= cnt && !PACKET_COUNT_IS_UNLIMITED(cnt)) {
 				p->cc = ep - bp;
 				p->bp = bp;
 				return (n);
@@ -210,79 +218,86 @@
 }                           
 
 static int
-nit_setflags(int fd, int promisc, int to_ms, char *ebuf)
+nit_setflags(pcap_t *p)
 {
 	struct nit_ioc nioc;
 
 	memset(&nioc, 0, sizeof(nioc));
-	nioc.nioc_bufspace = BUFSPACE;
-	nioc.nioc_chunksize = CHUNKSIZE;
 	nioc.nioc_typetomatch = NT_ALLTYPES;
 	nioc.nioc_snaplen = p->snapshot;
 	nioc.nioc_bufalign = sizeof(int);
 	nioc.nioc_bufoffset = 0;
 
-	if (to_ms != 0) {
-		nioc.nioc_flags |= NF_TIMEOUT;
-		nioc.nioc_timeout.tv_sec = to_ms / 1000;
-		nioc.nioc_timeout.tv_usec = (to_ms * 1000) % 1000000;
+	if (p->opt.buffer_size != 0)
+		nioc.nioc_bufspace = p->opt.buffer_size;
+	else {
+		/* Default buffer size */
+		nioc.nioc_bufspace = BUFSPACE;
 	}
-	if (promisc)
+
+	if (p->opt.immediate) {
+		/*
+		 * XXX - will this cause packets to be delivered immediately?
+		 * XXX - given that this is for SunOS prior to 4.0, do
+		 * we care?
+		 */
+		nioc.nioc_chunksize = 0;
+	} else
+		nioc.nioc_chunksize = CHUNKSIZE;
+	if (p->opt.timeout != 0) {
+		nioc.nioc_flags |= NF_TIMEOUT;
+		nioc.nioc_timeout.tv_sec = p->opt.timeout / 1000;
+		nioc.nioc_timeout.tv_usec = (p->opt.timeout * 1000) % 1000000;
+	}
+	if (p->opt.promisc)
 		nioc.nioc_flags |= NF_PROMISC;
 
-	if (ioctl(fd, SIOCSNIT, &nioc) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "SIOCSNIT: %s",
+	if (ioctl(p->fd, SIOCSNIT, &nioc) < 0) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "SIOCSNIT: %s",
 		    pcap_strerror(errno));
 		return (-1);
 	}
 	return (0);
 }
 
-static void
-pcap_close_nit(pcap_t *p)
-{
-	pcap_close_common(p);
-	if (p->device != NULL)
-		free(p->device);
-}
-
-pcap_t *
-pcap_open_live(const char *device, int snaplen, int promisc, int to_ms,
-    char *ebuf)
+static int
+pcap_activate_nit(pcap_t *p)
 {
 	int fd;
 	struct sockaddr_nit snit;
-	register pcap_t *p;
 
-	p = (pcap_t *)malloc(sizeof(*p));
-	if (p == NULL) {
-		strlcpy(ebuf, pcap_strerror(errno), PCAP_ERRBUF_SIZE);
-		return (NULL);
+	if (p->opt.rfmon) {
+		/*
+		 * No monitor mode on SunOS 3.x or earlier (no
+		 * Wi-Fi *devices* for the hardware that supported
+		 * them!).
+		 */
+		return (PCAP_ERROR_RFMON_NOTSUP);
 	}
 
-	if (snaplen < 96)
+	if (p->snapshot < 96)
 		/*
 		 * NIT requires a snapshot length of at least 96.
 		 */
-		snaplen = 96;
+		p->snapshot = 96;
 
 	memset(p, 0, sizeof(*p));
 	p->fd = fd = socket(AF_NIT, SOCK_RAW, NITPROTO_RAW);
 	if (fd < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE,
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
 		    "socket: %s", pcap_strerror(errno));
 		goto bad;
 	}
 	snit.snit_family = AF_NIT;
-	(void)strncpy(snit.snit_ifname, device, NITIFSIZ);
+	(void)strncpy(snit.snit_ifname, p->opt.source, NITIFSIZ);
 
 	if (bind(fd, (struct sockaddr *)&snit, sizeof(snit))) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE,
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
 		    "bind: %s: %s", snit.snit_ifname, pcap_strerror(errno));
 		goto bad;
 	}
-	p->snapshot = snaplen;
-	nit_setflags(p->fd, promisc, to_ms, ebuf);
+	if (nit_setflags(p) < 0)
+		goto bad;
 
 	/*
 	 * NIT supports only ethernets.
@@ -292,17 +307,7 @@
 	p->bufsize = BUFSPACE;
 	p->buffer = (u_char *)malloc(p->bufsize);
 	if (p->buffer == NULL) {
-		strlcpy(ebuf, pcap_strerror(errno), PCAP_ERRBUF_SIZE);
-		goto bad;
-	}
-
-	/*
-	 * We need the device name in order to send packets.
-	 */
-	p->device = strdup(device);
-	if (p->device == NULL) {
-		strlcpy(ebuf, pcap_strerror(errno), PCAP_ERRBUF_SIZE);
-		free(p->buffer);
+		strlcpy(p->errbuf, pcap_strerror(errno), PCAP_ERRBUF_SIZE);
 		goto bad;
 	}
 
@@ -339,14 +344,24 @@
 	p->getnonblock_op = pcap_getnonblock_fd;
 	p->setnonblock_op = pcap_setnonblock_fd;
 	p->stats_op = pcap_stats_nit;
-	p->close_op = pcap_close_nit;
 
-	return (p);
+	return (0);
  bad:
-	if (fd >= 0)
-		close(fd);
-	free(p);
-	return (NULL);
+	pcap_cleanup_live_common(p);
+	return (PCAP_ERROR);
+}
+
+pcap_t *
+pcap_create_interface(const char *device, char *ebuf)
+{
+	pcap_t *p;
+
+	p = pcap_create_common(device, ebuf, sizeof (struct pcap_nit));
+	if (p == NULL)
+		return (NULL);
+
+	p->activate_op = pcap_activate_nit;
+	return (p);
 }
 
 int
diff --git a/pcap-nit.h b/pcap-nit.h
deleted file mode 100644
index 52f5fc4..0000000
--- a/pcap-nit.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 1990, 1994
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Lawrence Berkeley Laboratory,
- * Berkeley, CA.  The name of the University may not 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 MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * @(#) $Header: /tcpdump/master/libpcap/pcap-nit.h,v 1.2.1.1 1999/10/07 23:46:40 mcr Exp $ (LBL)
- */
diff --git a/pcap-null.c b/pcap-null.c
index 06e3ab3..6737386 100644
--- a/pcap-null.c
+++ b/pcap-null.c
@@ -20,7 +20,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/pcap-null.c,v 1.21 2003/11/15 23:24:03 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/pcap-null.c,v 1.22 2008-04-04 19:37:45 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -40,8 +40,7 @@
 static char nosup[] = "live packet capture not supported on this system";
 
 pcap_t *
-pcap_open_live(const char *device, int snaplen, int promisc, int to_ms,
-    char *ebuf)
+pcap_create_interface(const char *device, char *ebuf)
 {
 	(void)strlcpy(ebuf, nosup, PCAP_ERRBUF_SIZE);
 	return (NULL);
diff --git a/pcap-pf.c b/pcap-pf.c
index e733540..8de6e58 100644
--- a/pcap-pf.c
+++ b/pcap-pf.c
@@ -24,7 +24,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/pcap-pf.c,v 1.91.2.2 2005/05/03 18:54:37 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/pcap-pf.c,v 1.97 2008-04-14 20:40:58 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -62,7 +62,7 @@
 #include <unistd.h>
 
 /*
- * Make "pcap.h" not include "pcap-bpf.h"; we are going to include the
+ * Make "pcap.h" not include "pcap/bpf.h"; we are going to include the
  * native OS version, as we need various BPF ioctls from it.
  */
 #define PCAP_DONT_INCLUDE_PCAP_BPF_H
@@ -74,6 +74,24 @@
 #include "os-proto.h"
 #endif
 
+/*
+ * FDDI packets are padded to make everything line up on a nice boundary.
+ */
+#define       PCAP_FDDIPAD 3
+
+/*
+ * Private data for capturing on Ultrix and DEC OSF/1^WDigital UNIX^W^W
+ * Tru64 UNIX packetfilter devices.
+ */
+struct pcap_pf {
+	int	filtering_in_kernel; /* using kernel filter */
+	u_long	TotPkts;	/* can't oflow for 79 hrs on ether */
+	u_long	TotAccepted;	/* count accepted by filter */
+	u_long	TotDrops;	/* count of dropped packets */
+	long	TotMissed;	/* missed by i/f during this run */
+	long	OrigMissed;	/* missed by i/f before this run */
+};
+
 static int pcap_setfilter_pf(pcap_t *, struct bpf_program *);
 
 /*
@@ -87,18 +105,15 @@
 static int
 pcap_read_pf(pcap_t *pc, int cnt, pcap_handler callback, u_char *user)
 {
+	struct pcap_pf *pf = pc->priv;
 	register u_char *p, *bp;
-	struct bpf_insn *fcode;
 	register int cc, n, buflen, inc;
 	register struct enstamp *sp;
 #ifdef LBL_ALIGN
 	struct enstamp stamp;
 #endif
-#ifdef PCAP_FDDIPAD
 	register int pad;
-#endif
 
-	fcode = pc->md.use_bpf ? NULL : pc->fcode.bf_insns;
  again:
 	cc = pc->cc;
 	if (cc == 0) {
@@ -128,9 +143,7 @@
 	 * Loop through each packet.
 	 */
 	n = 0;
-#ifdef PCAP_FDDIPAD
 	pad = pc->fddipad;
-#endif
 	while (cc > 0) {
 		/*
 		 * Has "pcap_breakloop()" been called?
@@ -179,41 +192,34 @@
 		inc = ENALIGN(buflen + sp->ens_stamplen);
 		cc -= inc;
 		bp += inc;
-		pc->md.TotPkts++;
-		pc->md.TotDrops += sp->ens_dropped;
-		pc->md.TotMissed = sp->ens_ifoverflows;
-		if (pc->md.OrigMissed < 0)
-			pc->md.OrigMissed = pc->md.TotMissed;
+		pf->TotPkts++;
+		pf->TotDrops += sp->ens_dropped;
+		pf->TotMissed = sp->ens_ifoverflows;
+		if (pf->OrigMissed < 0)
+			pf->OrigMissed = pf->TotMissed;
 
 		/*
 		 * Short-circuit evaluation: if using BPF filter
-		 * in kernel, no need to do it now.
+		 * in kernel, no need to do it now - we already know
+		 * the packet passed the filter.
 		 *
-#ifdef PCAP_FDDIPAD
 		 * Note: the filter code was generated assuming
 		 * that pc->fddipad was the amount of padding
 		 * before the header, as that's what's required
 		 * in the kernel, so we run the filter before
 		 * skipping that padding.
-#endif
 		 */
-		if (fcode == NULL ||
-		    bpf_filter(fcode, p, sp->ens_count, buflen)) {
+		if (pf->filtering_in_kernel ||
+		    bpf_filter(pc->fcode.bf_insns, p, sp->ens_count, buflen)) {
 			struct pcap_pkthdr h;
-			pc->md.TotAccepted++;
+			pf->TotAccepted++;
 			h.ts = sp->ens_tstamp;
-#ifdef PCAP_FDDIPAD
 			h.len = sp->ens_count - pad;
-#else
-			h.len = sp->ens_count;
-#endif
-#ifdef PCAP_FDDIPAD
 			p += pad;
 			buflen -= pad;
-#endif
 			h.caplen = buflen;
 			(*callback)(user, &h, p);
-			if (++n >= cnt && cnt > 0) {
+			if (++n >= cnt && !PACKET_COUNT_IS_UNLIMITED(cnt)) {
 				pc->cc = cc;
 				pc->bp = bp;
 				return (n);
@@ -241,6 +247,7 @@
 static int
 pcap_stats_pf(pcap_t *p, struct pcap_stat *ps)
 {
+	struct pcap_pf *pf = p->priv;
 
 	/*
 	 * If packet filtering is being done in the kernel:
@@ -278,37 +285,29 @@
 	 * the kernel by libpcap, but they may include packets not
 	 * yet read from libpcap by the application.
 	 */
-	ps->ps_recv = p->md.TotAccepted;
-	ps->ps_drop = p->md.TotDrops;
-	ps->ps_ifdrop = p->md.TotMissed - p->md.OrigMissed;
+	ps->ps_recv = pf->TotAccepted;
+	ps->ps_drop = pf->TotDrops;
+	ps->ps_ifdrop = pf->TotMissed - pf->OrigMissed;
 	return (0);
 }
 
 /*
- * We include the OS's <net/bpf.h>, not our "pcap-bpf.h", so we probably
+ * We include the OS's <net/bpf.h>, not our "pcap/bpf.h", so we probably
  * don't get DLT_DOCSIS defined.
  */
 #ifndef DLT_DOCSIS
 #define DLT_DOCSIS	143
 #endif
 
-pcap_t *
-pcap_open_live(const char *device, int snaplen, int promisc, int to_ms,
-    char *ebuf)
+static int
+pcap_activate_pf(pcap_t *p)
 {
-	pcap_t *p;
+	struct pcap_pf *pf = p->priv;
 	short enmode;
 	int backlog = -1;	/* request the most */
 	struct enfilter Filter;
 	struct endevp devparams;
 
-	p = (pcap_t *)malloc(sizeof(*p));
-	if (p == NULL) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE,
-		    "pcap_open_live: %s", pcap_strerror(errno));
-		return (0);
-	}
-	memset(p, 0, sizeof(*p));
 	/*
 	 * Initially try a read/write open (to allow the inject
 	 * method to work).  If that fails due to permission
@@ -328,21 +327,23 @@
 	 * "const char *" as its first argument.  That appears to be
 	 * the case, at least on Digital UNIX 4.0.
 	 */
-	p->fd = pfopen(device, O_RDWR);
+	p->fd = pfopen(p->opt.source, O_RDWR);
 	if (p->fd == -1 && errno == EACCES)
-		p->fd = pfopen(device, O_RDONLY);
+		p->fd = pfopen(p->opt.source, O_RDONLY);
 	if (p->fd < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "pf open: %s: %s\n\
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "pf open: %s: %s\n\
 your system may not be properly configured; see the packetfilter(4) man page\n",
-			device, pcap_strerror(errno));
+			p->opt.source, pcap_strerror(errno));
 		goto bad;
 	}
-	p->md.OrigMissed = -1;
-	enmode = ENTSTAMP|ENBATCH|ENNONEXCL;
-	if (promisc)
+	pf->OrigMissed = -1;
+	enmode = ENTSTAMP|ENNONEXCL;
+	if (!p->opt.immediate)
+		enmode |= ENBATCH;
+	if (p->opt.promisc)
 		enmode |= ENPROMISC;
 	if (ioctl(p->fd, EIOCMBIS, (caddr_t)&enmode) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "EIOCMBIS: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "EIOCMBIS: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
@@ -353,13 +354,13 @@
 #endif
 	/* set the backlog */
 	if (ioctl(p->fd, EIOCSETW, (caddr_t)&backlog) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "EIOCSETW: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "EIOCSETW: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
 	/* discover interface type */
 	if (ioctl(p->fd, EIOCDEVP, (caddr_t)&devparams) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "EIOCDEVP: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "EIOCDEVP: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
@@ -441,42 +442,39 @@
 		 * framing", there's not much we can do, as that
 		 * doesn't specify a particular type of header.
 		 */
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "unknown data-link type %u",
-		    devparams.end_dev_type);
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+		    "unknown data-link type %u", devparams.end_dev_type);
 		goto bad;
 	}
 	/* set truncation */
-#ifdef PCAP_FDDIPAD
 	if (p->linktype == DLT_FDDI) {
 		p->fddipad = PCAP_FDDIPAD;
 
 		/* packetfilter includes the padding in the snapshot */
-		snaplen += PCAP_FDDIPAD;
+		p->snapshot += PCAP_FDDIPAD;
 	} else
 		p->fddipad = 0;
-#endif
-	if (ioctl(p->fd, EIOCTRUNCATE, (caddr_t)&snaplen) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "EIOCTRUNCATE: %s",
+	if (ioctl(p->fd, EIOCTRUNCATE, (caddr_t)&p->snapshot) < 0) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "EIOCTRUNCATE: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
-	p->snapshot = snaplen;
 	/* accept all packets */
 	memset(&Filter, 0, sizeof(Filter));
 	Filter.enf_Priority = 37;	/* anything > 2 */
 	Filter.enf_FilterLen = 0;	/* means "always true" */
 	if (ioctl(p->fd, EIOCSETF, (caddr_t)&Filter) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "EIOCSETF: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "EIOCSETF: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
 
-	if (to_ms != 0) {
+	if (p->opt.timeout != 0) {
 		struct timeval timeout;
-		timeout.tv_sec = to_ms / 1000;
-		timeout.tv_usec = (to_ms * 1000) % 1000000;
+		timeout.tv_sec = p->opt.timeout / 1000;
+		timeout.tv_usec = (p->opt.timeout * 1000) % 1000000;
 		if (ioctl(p->fd, EIOCSRTIMEOUT, (caddr_t)&timeout) < 0) {
-			snprintf(ebuf, PCAP_ERRBUF_SIZE, "EIOCSRTIMEOUT: %s",
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "EIOCSRTIMEOUT: %s",
 				pcap_strerror(errno));
 			goto bad;
 		}
@@ -485,7 +483,7 @@
 	p->bufsize = BUFSPACE;
 	p->buffer = (u_char*)malloc(p->bufsize + p->offset);
 	if (p->buffer == NULL) {
-		strlcpy(ebuf, pcap_strerror(errno), PCAP_ERRBUF_SIZE);
+		strlcpy(p->errbuf, pcap_strerror(errno), PCAP_ERRBUF_SIZE);
 		goto bad;
 	}
 
@@ -502,19 +500,24 @@
 	p->getnonblock_op = pcap_getnonblock_fd;
 	p->setnonblock_op = pcap_setnonblock_fd;
 	p->stats_op = pcap_stats_pf;
-	p->close_op = pcap_close_common;
 
-	return (p);
+	return (0);
  bad:
-	if (p->fd >= 0)
-		close(p->fd);
-	/*
-	 * Get rid of any link-layer type list we allocated.
-	 */
-	if (p->dlt_list != NULL)
-		free(p->dlt_list);
-	free(p);
-	return (NULL);
+	pcap_cleanup_live_common(p);
+	return (PCAP_ERROR);
+}
+
+pcap_t *
+pcap_create_interface(const char *device, char *ebuf)
+{
+	pcap_t *p;
+
+	p = pcap_create_common(device, ebuf, sizeof (struct pcap_pf));
+	if (p == NULL)
+		return (NULL);
+
+	p->activate_op = pcap_activate_pf;
+	return (p);
 }
 
 int
@@ -526,6 +529,7 @@
 static int
 pcap_setfilter_pf(pcap_t *p, struct bpf_program *fp)
 {
+	struct pcap_pf *pf = p->priv;
 	struct bpf_version bv;
 
 	/*
@@ -567,7 +571,7 @@
 			 * a window to annoy the user.
 			 */
 			fprintf(stderr, "tcpdump: Using kernel BPF filter\n");
-			p->md.use_bpf = 1;
+			pf->filtering_in_kernel = 1;
 
 			/*
 			 * Discard any previously-received packets,
@@ -605,6 +609,6 @@
 	 * a warning of some sort.
 	 */
 	fprintf(stderr, "tcpdump: Filtering in user process\n");
-	p->md.use_bpf = 0;
+	pf->filtering_in_kernel = 0;
 	return (0);
 }
diff --git a/pcap-pf.h b/pcap-pf.h
deleted file mode 100644
index 60bea83..0000000
--- a/pcap-pf.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 1990, 1994
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Lawrence Berkeley Laboratory,
- * Berkeley, CA.  The name of the University may not 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 MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * @(#) $Header: /tcpdump/master/libpcap/pcap-pf.h,v 1.2.1.1 1999/10/07 23:46:40 mcr Exp $ (LBL)
- */
diff --git a/pcap-savefile.manfile.in b/pcap-savefile.manfile.in
new file mode 100644
index 0000000..c20e003
--- /dev/null
+++ b/pcap-savefile.manfile.in
@@ -0,0 +1,136 @@
+'\" t
+.\" @(#) $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.
+.\"
+.\" 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-SAVEFILE @MAN_FILE_FORMATS@ "21 October 2008"
+.SH NAME
+pcap-savefile \- libpcap savefile format
+.SH DESCRIPTION
+NOTE: applications and libraries should, if possible, use libpcap to
+read savefiles, rather than having their own code to read savefiles. 
+If, in the future, a new file format is supported by libpcap,
+applications and libraries using libpcap to read savefiles will be able
+to read the new format of savefiles, but applications and libraries
+using their own code to read savefiles will have to be changed to
+support the new file format.
+.PP
+``Savefiles'' read and written by libpcap and applications using libpcap
+start with a per-file header.  The format of the per-file header is:
+.RS
+.TS
+box;
+c s
+c | c
+c s.
+Magic number
+_
+Major version	Minor version
+_
+Time zone offset
+_
+Time stamp accuracy
+_
+Snapshot length
+_
+Link-layer header type
+.TE
+.RE
+.PP
+All fields in the per-file header are in the byte order of the host
+writing the file.  Normally, the first field in the per-file header is a
+4-byte magic number, with the value 0xa1b2c3d4.  The magic number, when
+read by a host with the same byte order as the host that wrote the file,
+will have the value 0xa1b2c3d4, and, when read by a host with the
+opposite byte order as the host that wrote the file, will have the value
+0xd4c3b2a1.  That allows software reading the file to determine whether
+the byte order of the host that wrote the file is the same as the byte
+order of the host on which the file is being read, and thus whether the
+values in the per-file and per-packet headers need to be byte-swapped.
+.PP
+If the magic number has the value 0xa1b23c4d (with the two nibbles of
+the two lower-order bytes of the magic number swapped), which would be
+read as 0xa1b23c4d by a host with the same byte order as the host that
+wrote the file and as 0x4d3cb2a1 by a host with the opposite byte order
+as the host that wrote the file, the file format is the same as for
+regular files, except that the time stamps for packets are given in
+seconds and nanoseconds rather than seconds and microseconds.
+.PP
+Following this are:
+.IP
+A 2-byte file format major version number; the current version number is
+2.
+.IP
+A 2-byte file format minor version number; the current version number is
+4.
+.IP
+A 4-byte time zone offset; this is always 0.
+.IP
+A 4-byte number giving the accuracy of time stamps in the file; this is
+always 0.
+.IP
+A 4-byte number giving the "snapshot length" of the capture; packets
+longer than the snapshot length are truncated to the snapshot length, so
+that, if the snapshot length is
+.IR N ,
+only the first
+.I N
+bytes of a packet longer than
+.I N
+bytes will be saved in the capture.
+.IP
+a 4-byte number giving the link-layer header type for packets in the
+capture; see
+.BR pcap-linktype (@MAN_MISC_INFO@)
+for the
+.B LINKTYPE_
+values that can appear in this field.
+.PP
+Following the per-file header are zero or more packets; each packet
+begins with a per-packet header, which is immediately followed by the
+raw packet data.  The format of the per-packet header is:
+.RS
+.TS
+box;
+c.
+Time stamp, seconds value
+_
+Time stamp, microseconds or nanoseconds value
+_
+Length of captured packet data
+_
+Un-truncated length of the packet data
+.TE
+.RE
+.PP
+All fields in the per-packet header are in the byte order of the host
+writing the file.  The per-packet header begins with a time stamp giving
+the approximate time the packet was captured; the time stamp consists of
+a 4-byte value, giving the time in seconds since January 1, 1970,
+00:00:00 UTC, followed by a 4-byte value, giving the time in
+microseconds or nanoseconds since that second, depending on the magic
+number in the file header.  Following that are a 4-byte value giving the
+number of bytes of captured data that follow the per-packet header and a
+4-byte value giving the number of bytes that would have been present had
+the packet not been truncated by the snapshot length.  The two lengths
+will be equal if the number of bytes of packet data are less than or
+equal to the snapshot length.
+.SH SEE ALSO
+pcap(3PCAP), pcap-linktype(@MAN_MISC_INFO@)
diff --git a/pcap-septel.c b/pcap-septel.c
index 5169ec0..4ca7a60 100644
--- a/pcap-septel.c
+++ b/pcap-septel.c
@@ -16,7 +16,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/pcap-septel.c,v 1.1.2.2 2005/06/21 01:03:23 guy Exp $";
+    "@(#) $Header: /tcpdump/master/libpcap/pcap-septel.c,v 1.4 2008-04-14 20:40:58 guy Exp $";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -38,33 +38,25 @@
 #include <sys/types.h>
 #include <unistd.h>
 
-#ifdef HAVE_SEPTEL_API
 #include <msg.h>
 #include <ss7_inc.h>
 #include <sysgct.h>
 #include <pack.h>
 #include <system.h>
-#endif /* HAVE_SEPTEL_API */
 
-#ifdef SEPTEL_ONLY
-/* This code is required when compiling for a Septel device only. */
 #include "pcap-septel.h"
 
-/* Replace dag function names with pcap equivalent. */
-#define septel_open_live pcap_open_live
-#define septel_platform_finddevs pcap_platform_finddevs
-#endif /* SEPTEL_ONLY */
-
 static int septel_setfilter(pcap_t *p, struct bpf_program *fp);
 static int septel_stats(pcap_t *p, struct pcap_stat *ps);
 static int septel_setnonblock(pcap_t *p, int nonblock, char *errbuf);
 
-static void septel_platform_close(pcap_t *p) {
-
+/*
+ * Private data for capturing on Septel devices.
+ */
+struct pcap_septel {
+	struct pcap_stat stat;
 }
 
-
-
 /*
  *  Read at most max_packets from the capture queue and call the callback
  *  for each of them. Returns the number of packets handled, -1 if an
@@ -72,6 +64,7 @@
  */
 static int septel_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user) {
 
+  struct pcap_septel *ps = p->priv;
   HDR *h;
   MSG *m;
   int processed = 0 ;
@@ -169,7 +162,7 @@
         pcap_header.len = packet_len;
 
         /* Count the packet. */
-        p->md.stat.ps_recv++;
+        ps->stat.ps_recv++;
 
         /* Call the user supplied callback function */
         callback(user, &pcap_header, dp);
@@ -199,28 +192,14 @@
 }
 
 /*
- *  Get a handle for a live capture from the given Septel device.  Always pass a NULL device
+ *  Activate a handle for a live capture from the given Septel device.  Always pass a NULL device
  *  The promisc flag is ignored because Septel cards have built-in tracing.
- *  The to_ms parameter is also ignored as it is
- *  not supported in hardware.
+ *  The timeout is also ignored as it is not supported in hardware.
  *
  *  See also pcap(3).
  */
-pcap_t *septel_open_live(const char *device, int snaplen, int promisc, int to_ms, char *ebuf) {
-  pcap_t *handle;
-
-  handle = malloc(sizeof(*handle));
-  if (handle == NULL) {
-    snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc %s: %s", device, pcap_strerror(errno));
-    return NULL;
-  }
-
-  /* Initialize some components of the pcap structure. */
-  
-  memset(handle, 0, sizeof(*handle));
-  
-  handle->snapshot = snaplen;
-
+static pcap_t *septel_activate(pcap_t* handle) {
+  /* Initialize some components of the pcap structure. */  
   handle->linktype = DLT_MTP2;
   
   handle->bufsize = 0;
@@ -237,30 +216,48 @@
   handle->getnonblock_op = pcap_getnonblock_fd;
   handle->setnonblock_op = septel_setnonblock;
   handle->stats_op = septel_stats;
-  handle->close_op = septel_platform_close;
 
-  return handle;
+  return 0;
+}
 
-fail:
-  if (handle != NULL) {
-    free(handle);
-  }
+pcap_t *septel_create(const char *device, char *ebuf, int *is_ours) {
+	const char *cp;
+	pcap_t *p;
 
-  return NULL;
+	/* Does this look like the Septel device? */
+	cp = strrchr(device, '/');
+	if (cp == NULL)
+		cp = device;
+	if (strcmp(cp, "septel") != 0) {
+		/* Nope, it's not "septel" */
+		*is_ours = 0;
+		return NULL;
+	}
+
+	/* OK, it's probably ours. */
+	*is_ours = 1;
+
+	p = pcap_create_common(device, ebuf, sizeof (struct pcap_septel));
+	if (p == NULL)
+		return NULL;
+
+	p->activate_op = septel_activate;
+	return p;
 }
 
 static int septel_stats(pcap_t *p, struct pcap_stat *ps) {
-  /*p->md.stat.ps_recv = 0;*/
-  /*p->md.stat.ps_drop = 0;*/
+  struct pcap_septel *handlep = p->priv;
+  /*handlep->stat.ps_recv = 0;*/
+  /*handlep->stat.ps_drop = 0;*/
   
-  *ps = p->md.stat;
+  *ps = handlep->stat;
  
   return 0;
 }
 
 
 int
-septel_platform_finddevs(pcap_if_t **devlistp, char *errbuf)
+septel_findalldevs(pcap_if_t **devlistp, char *errbuf)
 {
 unsigned char *p;
   const char description[512]= "Intel/Septel device";
@@ -294,8 +291,6 @@
     return -1;
   }
 
-  p->md.use_bpf = 0;
-
   return (0);
 }
 
@@ -303,5 +298,6 @@
 static int
 septel_setnonblock(pcap_t *p, int nonblock, char *errbuf)
 {
-  return (0);
+  fprintf(errbuf, PCAP_ERRBUF_SIZE, "Non-blocking mode not supported on Septel devices");
+  return (-1);
 }
diff --git a/pcap-septel.h b/pcap-septel.h
index 1de6377..b72f35b 100644
--- a/pcap-septel.h
+++ b/pcap-septel.h
@@ -8,8 +8,8 @@
  * Authors: Gilbert HOYEK (gil_hoyek@hotmail.com), Elias M. KHOURY
  * (+961 3 485343);
  *
- * @(#) $Header: /tcpdump/master/libpcap/pcap-septel.h,v 1.1.2.1 2005/06/20 21:30:19 guy Exp $
+ * @(#) $Header: /tcpdump/master/libpcap/pcap-septel.h,v 1.2 2008-04-04 19:37:45 guy Exp $
  */
 
-pcap_t *septel_open_live(const char *device, int snaplen, int promisc, int to_ms, char *ebuf);
-
+pcap_t *septel_create(const char *device, char *ebuf, int *is_ours);
+int septel_findalldevs(pcap_if_t **devlistp, char *errbuf);
diff --git a/pcap-sita.c b/pcap-sita.c
new file mode 100644
index 0000000..7ab801e
--- /dev/null
+++ b/pcap-sita.c
@@ -0,0 +1,1021 @@
+/*
+ *  pcap-sita.c: Packet capture interface additions for SITA ACN devices
+ *
+ *  Copyright (c) 2007 Fulko Hew, SITA INC Canada, Inc <fulko.hew@sita.aero>
+ *
+ *  License: BSD
+ *
+ *  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 names of the authors may not 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.
+ */
+
+ /* $Id: pcap-sita.c */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include "pcap-int.h"
+
+#include "pcap-sita.h"
+
+	/* non-configureable manifests follow */
+
+#define IOP_SNIFFER_PORT	49152			/* TCP port on the IOP used for 'distributed pcap' usage */
+#define MAX_LINE_SIZE		255				/* max size of a buffer/line in /etc/hosts we allow */
+#define MAX_CHASSIS			8				/* number of chassis in an ACN site */
+#define MAX_GEOSLOT			8				/* max number of access units in an ACN site */
+
+#define FIND			0
+#define LIVE			1
+
+typedef struct iface {
+	struct iface	*next;		/* a pointer to the next interface */
+	char		*name;		/* this interface's name */
+	char		*IOPname;	/* this interface's name on an IOP */
+	uint32_t	iftype;		/* the type of interface (DLT values) */
+} iface_t;
+
+typedef struct unit {
+	char			*ip;		/* this unit's IP address (as extracted from /etc/hosts) */
+	int			fd;		/* the connection to this unit (if it exists) */
+	int			find_fd;	/* a big kludge to avoid my programming limitations since I could have this unit open for findalldevs purposes */
+	int			first_time;	/* 0 = just opened via acn_open_live(),  ie. the first time, NZ = nth time */
+	struct sockaddr_in	*serv_addr;	/* the address control block for comms to this unit */
+	int			chassis;
+	int			geoslot;
+	iface_t			*iface;		/* a pointer to a linked list of interface structures */
+	char			*imsg;		/* a pointer to an inbound message */
+	int			len;		/* the current size of the inbound message */
+} unit_t;
+
+static unit_t		units[MAX_CHASSIS+1][MAX_GEOSLOT+1];	/* we use indexes of 1 through 8, but we reserve/waste index 0 */
+static fd_set		readfds;				/* a place to store the file descriptors for the connections to the IOPs */
+static int		max_fs;
+
+pcap_if_t		*acn_if_list;		/* pcap's list of available interfaces */
+
+static void dump_interface_list(void) {
+	pcap_if_t		*iff;
+	pcap_addr_t		*addr;
+	int			longest_name_len = 0;
+	char			*n, *d, *f;
+	int			if_number = 0;
+
+	iff = acn_if_list;
+	while (iff) {
+		if (iff->name && (strlen(iff->name) > longest_name_len)) longest_name_len = strlen(iff->name);
+		iff = iff->next;
+	}
+	iff = acn_if_list;
+	printf("Interface List:\n");
+	while (iff) {
+		n = (iff->name)							? iff->name			: "";
+		d = (iff->description)					? iff->description	: "";
+		f = (iff->flags == PCAP_IF_LOOPBACK)	? "L"				: "";
+		printf("%3d: %*s %s '%s'\n", if_number++, longest_name_len, n, f, d);
+		addr = iff->addresses;
+		while (addr) {
+			printf("%*s ", (5 + longest_name_len), "");		/* add some indentation */
+			printf("%15s  ", (addr->addr)		? inet_ntoa(((struct sockaddr_in *)addr->addr)->sin_addr)		: "");
+			printf("%15s  ", (addr->netmask)	? inet_ntoa(((struct sockaddr_in *)addr->netmask)->sin_addr)	: "");
+			printf("%15s  ", (addr->broadaddr)	? inet_ntoa(((struct sockaddr_in *)addr->broadaddr)->sin_addr)	: "");
+			printf("%15s  ", (addr->dstaddr)	? inet_ntoa(((struct sockaddr_in *)addr->dstaddr)->sin_addr)	: "");
+			printf("\n");
+			addr = addr->next;
+		}
+		iff = iff->next;
+	}
+}
+
+static void dump(unsigned char *ptr, int i, int indent) {
+	fprintf(stderr, "%*s", indent, " ");
+	for (; i > 0; i--) {
+		fprintf(stderr, "%2.2x ", *ptr++);
+	}
+	fprintf(stderr, "\n");
+}
+
+static void dump_interface_list_p(void) {
+	pcap_if_t		*iff;
+	pcap_addr_t		*addr;
+	int				if_number = 0;
+
+	iff = acn_if_list;
+	printf("Interface Pointer @ %p is %p:\n", &acn_if_list, iff);
+	while (iff) {
+		printf("%3d: %p %p next: %p\n", if_number++, iff->name, iff->description, iff->next);
+		dump((unsigned char *)iff, sizeof(pcap_if_t), 5);
+		addr = iff->addresses;
+		while (addr) {
+			printf("          %p %p %p %p, next: %p\n", addr->addr, addr->netmask, addr->broadaddr, addr->dstaddr, addr->next);
+			dump((unsigned char *)addr, sizeof(pcap_addr_t), 10);
+			addr = addr->next;
+		}
+		iff = iff->next;
+	}
+}
+
+static void dump_unit_table(void) {
+	int		chassis, geoslot;
+	iface_t	*p;
+
+	printf("%c:%c %s %s\n", 'C', 'S', "fd", "IP Address");
+	for (chassis = 0; chassis <= MAX_CHASSIS; chassis++) {
+		for (geoslot = 0; geoslot <= MAX_GEOSLOT; geoslot++) {
+			if (units[chassis][geoslot].ip != NULL)
+				printf("%d:%d %2d %s\n", chassis, geoslot, units[chassis][geoslot].fd, units[chassis][geoslot].ip);
+			p = units[chassis][geoslot].iface;
+			while (p) {
+				char *n = (p->name)			? p->name			: "";
+				char *i = (p->IOPname)		? p->IOPname		: "";
+				p = p->next;
+				printf("   %12s    -> %12s\n", i, n);
+			}
+		}
+	}
+}
+
+static int find_unit_by_fd(int fd, int *chassis, int *geoslot, unit_t **unit_ptr) {
+	int		c, s;
+
+	for (c = 0; c <= MAX_CHASSIS; c++) {
+		for (s = 0; s <= MAX_GEOSLOT; s++) {
+			if (units[c][s].fd == fd || units[c][s].find_fd == fd) {
+				if (chassis)	*chassis = c;
+				if (geoslot)	*geoslot = s;
+				if (unit_ptr)	*unit_ptr = &units[c][s];
+				return 1;
+			}
+		}
+	}
+	return 0;
+}
+
+static int read_client_nbytes(int fd, int count, unsigned char *buf) {
+	unit_t			*u;
+	int				chassis, geoslot;
+	int				len;
+
+	find_unit_by_fd(fd, &chassis, &geoslot, &u);
+	while (count) {
+		if ((len = recv(fd, buf, count, 0)) <= 0)	return -1;	/* read in whatever data was sent to us */
+		count -= len;	
+		buf += len;
+	}															/* till we have everything we are looking for */
+	return 0;
+}
+
+static void empty_unit_iface(unit_t *u) {
+	iface_t	*p, *cur;
+
+	cur = u->iface;
+	while (cur) {											/* loop over all the interface entries */
+		if (cur->name)			free(cur->name);			/* throwing away the contents if they exist */
+		if (cur->IOPname)		free(cur->IOPname);
+		p = cur->next;
+		free(cur);											/* then throw away the structure itself */
+		cur = p;
+	}
+	u->iface = 0;											/* and finally remember that there are no remaining structure */
+}
+
+static void empty_unit(int chassis, int geoslot) {
+	unit_t	*u = &units[chassis][geoslot];
+
+	empty_unit_iface(u);
+	if (u->imsg) {											/* then if an inbound message buffer exists */
+		u->imsg = (char *)realloc(u->imsg, 1);				/* and re-allocate the old large buffer into a new small one */
+		if (u->imsg == NULL) {	/* oops, realloc call failed */
+			fprintf(stderr, "Warning...call to realloc() failed, value of errno is %d\n", errno);
+		
+	}
+}
+
+static void empty_unit_table(void) {
+	int		chassis, geoslot;
+
+	for (chassis = 0; chassis <= MAX_CHASSIS; chassis++) {
+		for (geoslot = 0; geoslot <= MAX_GEOSLOT; geoslot++) {
+			if (units[chassis][geoslot].ip != NULL) {
+				free(units[chassis][geoslot].ip);			/* get rid of the malloc'ed space that holds the IP address */
+				units[chassis][geoslot].ip = 0;				/* then set the pointer to NULL */
+			}
+			empty_unit(chassis, geoslot);
+		}
+	}
+}
+
+static char *find_nth_interface_name(int n) {
+	int		chassis, geoslot;
+	iface_t	*p;
+	char	*last_name = 0;
+
+	if (n < 0) n = 0;												/* ensure we are working with a valid number */
+	for (chassis = 0; chassis <= MAX_CHASSIS; chassis++) {			/* scan the table... */
+		for (geoslot = 0; geoslot <= MAX_GEOSLOT; geoslot++) {
+			if (units[chassis][geoslot].ip != NULL) {
+				p = units[chassis][geoslot].iface;
+				while (p) {											/* and all interfaces... */
+					if (p->IOPname) last_name = p->name;			/* remembering the last name found */
+					if (n-- == 0) return last_name;					/* and if we hit the instance requested */
+					p = p->next;
+				}
+			}
+		}
+	}
+											/* if we couldn't fine the selected entry */
+	if (last_name)	return last_name;		/* ... but we did have at least one entry... return the last entry found */
+	return "";								/* ... but if there wasn't any entry... return an empty string instead */
+}
+
+int acn_parse_hosts_file(char *errbuf) {				/* returns: -1 = error, 0 = OK */
+	FILE	*fp;
+	char	buf[MAX_LINE_SIZE];
+	char	*ptr, *ptr2;
+	int		pos;
+	int		chassis, geoslot;
+	unit_t	*u;
+
+	empty_unit_table();
+	if ((fp = fopen("/etc/hosts", "r")) == NULL) {										/* try to open the hosts file and if it fails */
+		snprintf(errbuf, PCAP_ERRBUF_SIZE, "Cannot open '/etc/hosts' for reading.");	/* return the nohostsfile error response */
+		return -1;
+	}
+	while (fgets(buf, MAX_LINE_SIZE-1, fp)) {			/* while looping over the file */
+
+		pos = strcspn(buf, "#\n\r");					/* find the first comment character or EOL */
+		*(buf + pos) = '\0';							/* and clobber it and anything that follows it */
+
+		pos = strspn(buf, " \t");						/* then find the first non-white space */
+		if (pos == strlen(buf))							/* if there is nothing but white space on the line */
+			continue;									/* ignore that empty line */
+		ptr = buf + pos;								/* and skip over any of that leading whitespace */
+
+		if ((ptr2 = strstr(ptr, "_I_")) == NULL)		/* skip any lines that don't have names that look like they belong to IOPs */
+			continue;
+		if (*(ptr2 + 4) != '_')							/* and skip other lines that have names that don't look like ACN components */
+			continue;
+		*(ptr + strcspn(ptr, " \t")) = '\0';			/* null terminate the IP address so its a standalone string */
+
+		chassis = *(ptr2 + 3) - '0';					/* extract the chassis number */
+		geoslot = *(ptr2 + 5) - '0';					/* and geo-slot number */
+		if (chassis < 1 || chassis > MAX_CHASSIS ||
+			geoslot < 1 || geoslot > MAX_GEOSLOT) {		/* if the chassis and/or slot numbers appear to be bad... */
+			snprintf(errbuf, PCAP_ERRBUF_SIZE, "Invalid ACN name in '/etc/hosts'.");	/* warn the user */
+			continue;																	/* and ignore the entry */
+		}
+		if ((ptr2 = (char *)malloc(strlen(ptr) + 1)) == NULL) {
+			snprintf(errbuf, PCAP_ERRBUF_SIZE, "malloc: %s", pcap_strerror(errno));
+			continue;
+		}
+		strcpy(ptr2, ptr);								/* copy the IP address into our malloc'ed memory */
+		u = &units[chassis][geoslot];
+		u->ip = ptr2;									/* and remember the whole shebang */
+		u->chassis = chassis;
+		u->geoslot = geoslot;
+	}
+	fclose(fp);
+	if (*errbuf)	return -1;
+	else			return 0;
+}
+
+static int open_with_IOP(unit_t  *u, int flag) {
+	int					sockfd;
+	char				*ip;
+
+	if (u->serv_addr == NULL) {
+		u->serv_addr = malloc(sizeof(struct sockaddr_in));
+
+		/* since we called malloc(), lets check to see if we actually got the memory	*/
+		if (u->serv_addr == NULL) {	/* oops, we didn't get the memory requested	*/
+			fprintf(stderr, "malloc() request for u->serv_addr failed, value of errno is: %d\n", errno);
+			return 0;
+		}
+
+	}
+	ip = u->ip;
+	/* bzero() is deprecated, replaced with memset()	*/
+	memset((char *)u->serv_addr, 0, sizeof(struct sockaddr_in));
+	u->serv_addr->sin_family		= AF_INET;
+	u->serv_addr->sin_addr.s_addr	= inet_addr(ip);
+	u->serv_addr->sin_port			= htons(IOP_SNIFFER_PORT);
+
+	if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
+		fprintf(stderr, "pcap can't open a socket for connecting to IOP at %s\n", ip);
+		return 0;
+	}
+	if (connect(sockfd, (struct sockaddr *)u->serv_addr, sizeof(struct sockaddr_in)) < 0) {
+		fprintf(stderr, "pcap can't connect to IOP at %s\n", ip);
+		return 0;
+	}
+	if (flag == LIVE)	u->fd = sockfd;
+	else				u->find_fd = sockfd;
+	u->first_time = 0;
+	return sockfd;			/* return the non-zero file descriptor as a 'success' indicator */
+}
+
+static void close_with_IOP(int chassis, int geoslot, int flag) {
+	int		*id;
+
+	if (flag == LIVE)	id = &units[chassis][geoslot].fd;
+	else				id = &units[chassis][geoslot].find_fd;
+
+	if (*id) {										/* this was the last time, so... if we are connected... */
+		close(*id);									/* disconnect us */
+		*id = 0;									/* and forget that the descriptor exists because we are not open */
+	}
+}
+
+static void pcap_cleanup_acn(pcap_t *handle) {
+	int		chassis, geoslot;
+	unit_t	*u;
+
+	if (find_unit_by_fd(handle->fd, &chassis, &geoslot, &u) == 0)
+		return;
+	close_with_IOP(chassis, geoslot, LIVE);
+	if (u)
+		u->first_time = 0;
+	pcap_cleanup_live_common(handle);
+}
+
+static void send_to_fd(int fd, int len, unsigned char *str) {
+	int		nwritten;
+	int		chassis, geoslot;
+
+	while (len > 0) {
+		if ((nwritten = write(fd, str, len)) <= 0) {
+			find_unit_by_fd(fd, &chassis, &geoslot, NULL);
+			if (units[chassis][geoslot].fd == fd)			close_with_IOP(chassis, geoslot, LIVE);
+			else if (units[chassis][geoslot].find_fd == fd)	close_with_IOP(chassis, geoslot, FIND);
+			empty_unit(chassis, geoslot);
+			return;
+		}
+		len -= nwritten;
+		str += nwritten;
+	}
+}
+
+static void acn_freealldevs(void) {
+
+	pcap_if_t	*iff, *next_iff;
+	pcap_addr_t	*addr, *next_addr;
+
+	for (iff = acn_if_list; iff != NULL; iff = next_iff) {
+		next_iff = iff->next;
+		for (addr = iff->addresses; addr != NULL; addr = next_addr) {
+			next_addr = addr->next;
+			if (addr->addr)			free(addr->addr);
+			if (addr->netmask)		free(addr->netmask);
+			if (addr->broadaddr)	free(addr->broadaddr);
+			if (addr->dstaddr)		free(addr->dstaddr);
+			free(addr);
+		}
+		if (iff->name)			free(iff->name);
+		if (iff->description)	free(iff->description);
+		free(iff);
+	}
+}
+
+static void nonUnified_IOP_port_name(char *buf, size_t bufsize, const char *proto, unit_t *u) {
+
+	snprintf(buf, bufsize, "%s_%d_%d", proto, u->chassis, u->geoslot);
+}
+
+static void unified_IOP_port_name(char *buf, size_t bufsize, const char *proto, unit_t *u, int IOPportnum) {
+	int			portnum;
+
+	portnum = ((u->chassis - 1) * 64) + ((u->geoslot - 1) * 8) + IOPportnum + 1;
+	snprintf(buf, bufsize, "%s_%d", proto, portnum);
+}
+
+static char *translate_IOP_to_pcap_name(unit_t *u, char *IOPname, bpf_u_int32 iftype) {
+	iface_t		*iface_ptr, *iface;
+	char		*name;
+	char		buf[32];
+	char		*proto;
+	char		*port;
+	int			IOPportnum = 0;
+
+	iface = malloc(sizeof(iface_t));		/* get memory for a structure */
+	if (iface == NULL) {	/* oops, we didn't get the memory requested	*/
+		fprintf(stderr, "Error...couldn't allocate memory for interface structure...value of errno is: %d\n", errno);
+		return NULL;
+	}
+	memset((char *)iface, 0, sizeof(iface_t));	/* bzero is deprecated(), replaced with memset() */
+
+	iface->iftype = iftype;					/* remember the interface type of this interface */
+
+	name = malloc(strlen(IOPname) + 1);		/* get memory for the IOP's name */
+        if (name == NULL) {    /* oops, we didn't get the memory requested     */
+                fprintf(stderr, "Error...couldn't allocate memory for IOPname...value of errno is: %d\n", errno);
+                return NULL;
+        }
+
+	strcpy(name, IOPname);					/* and copy it in */
+	iface->IOPname = name;					/* and stick it into the structure */
+
+	if (strncmp(IOPname, "lo", 2) == 0) {
+		IOPportnum = atoi(&IOPname[2]);
+		switch (iftype) {
+			case DLT_EN10MB:
+				nonUnified_IOP_port_name(buf, sizeof buf, "lo", u);
+				break;
+			default:
+				unified_IOP_port_name(buf, sizeof buf, "???", u, IOPportnum);
+				break;
+		}
+	} else if (strncmp(IOPname, "eth", 3) == 0) {
+		IOPportnum = atoi(&IOPname[3]);
+		switch (iftype) {
+			case DLT_EN10MB:
+				nonUnified_IOP_port_name(buf, sizeof buf, "eth", u);
+				break;
+			default:
+				unified_IOP_port_name(buf, sizeof buf, "???", u, IOPportnum);
+				break;
+		}
+	} else if (strncmp(IOPname, "wan", 3) == 0) {
+		IOPportnum = atoi(&IOPname[3]);
+		switch (iftype) {
+			case DLT_SITA:
+				unified_IOP_port_name(buf, sizeof buf, "wan", u, IOPportnum);
+				break;
+			default:
+				unified_IOP_port_name(buf, sizeof buf, "???", u, IOPportnum);
+				break;
+		}
+	} else {
+		fprintf(stderr, "Error... invalid IOP name %s\n", IOPname);
+		return NULL;
+	}
+
+	name = malloc(strlen(buf) + 1);			/* get memory for that name */
+        if (name == NULL) {    /* oops, we didn't get the memory requested     */
+                fprintf(stderr, "Error...couldn't allocate memory for IOP port name...value of errno is: %d\n", errno);
+                return NULL;
+        }
+
+	strcpy(name, buf);						/* and copy it in */
+	iface->name = name;						/* and stick it into the structure */
+
+	if (u->iface == 0) {					/* if this is the first name */
+		u->iface = iface;					/* stick this entry at the head of the list */
+	} else {
+		iface_ptr = u->iface;
+		while (iface_ptr->next) {			/* othewise scan the list */
+			iface_ptr = iface_ptr->next;	/* till we're at the last entry */
+		}
+		iface_ptr->next = iface;			/* then tack this entry on the end of the list */
+	}
+	return iface->name;
+}
+
+static int if_sort(char *s1, char *s2) {
+	char	*s1_p2, *s2_p2;
+	char	str1[MAX_LINE_SIZE], str2[MAX_LINE_SIZE];
+	int		s1_p1_len, s2_p1_len;
+	int		retval;
+
+	if ((s1_p2 = strchr(s1, '_'))) {	/* if an underscore is found... */
+		s1_p1_len = s1_p2 - s1;			/* the prefix length is the difference in pointers */
+		s1_p2++;						/* the suffix actually starts _after_ the underscore */
+	} else {							/* otherwise... */
+		s1_p1_len = strlen(s1);			/* the prefix length is the length of the string itself */
+		s1_p2 = 0;						/* and there is no suffix */
+	}
+	if ((s2_p2 = strchr(s2, '_'))) {	/* now do the same for the second string */
+		s2_p1_len = s2_p2 - s2;
+		s2_p2++;
+	} else {
+		s2_p1_len = strlen(s2);
+		s2_p2 = 0;
+	}
+	strncpy(str1, s1, (s1_p1_len > sizeof(str1)) ? s1_p1_len : sizeof(str1));   *(str1 + s1_p1_len) = 0;
+	strncpy(str2, s2, (s2_p1_len > sizeof(str2)) ? s2_p1_len : sizeof(str2));   *(str2 + s2_p1_len) = 0;
+	retval = strcmp(str1, str2);
+	if (retval != 0) return retval;		/* if they are not identical, then we can quit now and return the indication */
+	return strcmp(s1_p2, s2_p2);		/* otherwise we return the result of comparing the 2nd half of the string */
+}
+
+static void sort_if_table(void) {
+	pcap_if_t	*p1, *p2, *prev, *temp;
+	int			has_swapped;
+
+	if (!acn_if_list) return;				/* nothing to do if the list is empty */
+
+	while (1) {
+		p1 = acn_if_list;					/* start at the head of the list */
+		prev = 0;
+		has_swapped = 0;
+		while ((p2 = p1->next)) {
+			if (if_sort(p1->name, p2->name) > 0) {
+				if (prev) {					/* we are swapping things that are _not_ at the head of the list */
+					temp = p2->next;
+					prev->next = p2;
+					p2->next = p1;
+					p1->next = temp;
+				} else {					/* special treatment if we are swapping with the head of the list */
+					temp = p2->next;
+					acn_if_list= p2;
+					p2->next = p1;
+					p1->next = temp;
+				}
+				p1 = p2;
+				prev = p1;
+				has_swapped = 1;
+			}
+			prev = p1;
+			p1 = p1->next;
+		}
+		if (has_swapped == 0)
+			return;
+	}	
+	return;
+}
+	
+static int process_client_data (char *errbuf) {								/* returns: -1 = error, 0 = OK */
+	int					chassis, geoslot;
+	unit_t				*u;
+	pcap_if_t			*iff, *prev_iff;
+	pcap_addr_t			*addr, *prev_addr;
+	char				*ptr;
+	int					address_count;
+	struct sockaddr_in	*s;
+	char				*newname;
+	bpf_u_int32				interfaceType;
+	unsigned char		flags;
+
+	prev_iff = 0;
+	for (chassis = 0; chassis <= MAX_CHASSIS; chassis++) {
+		for (geoslot = 0; geoslot <= MAX_GEOSLOT; geoslot++) {				/* now loop over all the devices */
+			u = &units[chassis][geoslot];
+			empty_unit_iface(u);
+			ptr = u->imsg;													/* point to the start of the msg for this IOP */
+			while (ptr < (u->imsg + u->len)) {
+				if ((iff = malloc(sizeof(pcap_if_t))) == NULL) {
+					snprintf(errbuf, PCAP_ERRBUF_SIZE, "malloc: %s", pcap_strerror(errno));
+					return -1;
+				}
+				memset((char *)iff, 0, sizeof(pcap_if_t)); /* bzero() is deprecated, replaced with memset() */
+				if (acn_if_list == 0)	acn_if_list = iff;					/* remember the head of the list */
+				if (prev_iff)			prev_iff->next = iff;				/* insert a forward link */
+
+				if (*ptr) {													/* if there is a count for the name */
+					if ((iff->name = malloc(*ptr + 1)) == NULL) {			/* get that amount of space */
+						snprintf(errbuf, PCAP_ERRBUF_SIZE, "malloc: %s", pcap_strerror(errno));
+						return -1;
+					}
+					memcpy(iff->name, (ptr + 1), *ptr);						/* copy the name into the malloc'ed space */
+					*(iff->name + *ptr) = 0;								/* and null terminate the string */
+					ptr += *ptr;											/* now move the pointer forwards by the length of the count plus the length of the string */
+				}
+				ptr++;
+
+				if (*ptr) {													/* if there is a count for the description */
+					if ((iff->description = malloc(*ptr + 1)) == NULL) {	/* get that amount of space */
+						snprintf(errbuf, PCAP_ERRBUF_SIZE, "malloc: %s", pcap_strerror(errno));
+						return -1;
+					}
+					memcpy(iff->description, (ptr + 1), *ptr);				/* copy the name into the malloc'ed space */
+					*(iff->description + *ptr) = 0;							/* and null terminate the string */
+					ptr += *ptr;											/* now move the pointer forwards by the length of the count plus the length of the string */
+				}
+				ptr++;
+
+				interfaceType = ntohl(*(bpf_u_int32 *)ptr);
+				ptr += 4;													/* skip over the interface type */
+
+				flags = *ptr++;
+				if (flags) iff->flags = PCAP_IF_LOOPBACK;					/* if this is a loopback style interface, lets mark it as such */
+
+				address_count = *ptr++;
+
+				prev_addr = 0;
+				while (address_count--) {
+					if ((addr = malloc(sizeof(pcap_addr_t))) == NULL) {
+						snprintf(errbuf, PCAP_ERRBUF_SIZE, "malloc: %s", pcap_strerror(errno));
+						return -1;
+					}
++					memset((char *)addr, 0, sizeof(pcap_addr_t)); /* bzero() is deprecated, replaced with memset() */
+					if (iff->addresses == 0) iff->addresses = addr;
+					if (prev_addr) prev_addr->next = addr;							/* insert a forward link */
+					if (*ptr) {														/* if there is a count for the address */
+						if ((s = malloc(sizeof(struct sockaddr_in))) == NULL) {		/* get that amount of space */
+							snprintf(errbuf, PCAP_ERRBUF_SIZE, "malloc: %s", pcap_strerror(errno));
+							return -1;
+						}
+						memset((char *)s, 0, sizeof(struct sockaddr_in)); /* bzero() is deprecated, replaced with memset() */
+						addr->addr = (struct sockaddr *)s;
+						s->sin_family		= AF_INET;
+						s->sin_addr.s_addr	= *(bpf_u_int32 *)(ptr + 1);			/* copy the address in */
+						ptr += *ptr;										/* now move the pointer forwards according to the specified length of the address */
+					}
+					ptr++;													/* then forwards one more for the 'length of the address' field */
+					if (*ptr) {												/* process any netmask */
+						if ((s = malloc(sizeof(struct sockaddr_in))) == NULL) {
+							snprintf(errbuf, PCAP_ERRBUF_SIZE, "malloc: %s", pcap_strerror(errno));
+							return -1;
+						}
+						/* bzero() is deprecated, replaced with memset() */
+						memset((char *)s, 0, sizeof(struct sockaddr_in));
+
+						addr->netmask = (struct sockaddr *)s;
+						s->sin_family		= AF_INET;
+						s->sin_addr.s_addr	= *(bpf_u_int32*)(ptr + 1);
+						ptr += *ptr;
+					}
+					ptr++;
+					if (*ptr) {												/* process any broadcast address */
+						if ((s = malloc(sizeof(struct sockaddr_in))) == NULL) {
+							snprintf(errbuf, PCAP_ERRBUF_SIZE, "malloc: %s", pcap_strerror(errno));
+							return -1;
+						}
+						/* bzero() is deprecated, replaced with memset() */
+						memset((char *)s, 0, sizeof(struct sockaddr_in));
+
+						addr->broadaddr = (struct sockaddr *)s;
+						s->sin_family		= AF_INET;
+						s->sin_addr.s_addr	= *(bpf_u_int32*)(ptr + 1);
+						ptr += *ptr;
+					}
+					ptr++;
+					if (*ptr) {												/* process any destination address */
+						if ((s = malloc(sizeof(struct sockaddr_in))) == NULL) {
+							snprintf(errbuf, PCAP_ERRBUF_SIZE, "malloc: %s", pcap_strerror(errno));
+							return -1;
+						}
+						/* bzero() is deprecated, replaced with memset() */
+						memset((char *)s, 0, sizeof(struct sockaddr_in));
+
+						addr->dstaddr = (struct sockaddr *)s;
+						s->sin_family		= AF_INET;
+						s->sin_addr.s_addr	= *(bpf_u_int32*)(ptr + 1);
+						ptr += *ptr;
+					}
+					ptr++;
+					prev_addr = addr;
+				}
+				prev_iff = iff;
+
+				newname = translate_IOP_to_pcap_name(u, iff->name, interfaceType);		/* add a translation entry and get a point to the mangled name */
+				if ((iff->name = realloc(iff->name, strlen(newname) + 1)) == NULL) {	/* we now re-write the name stored in the interface list */
+					snprintf(errbuf, PCAP_ERRBUF_SIZE, "realloc: %s", pcap_strerror(errno));
+					return -1;
+				}
+				strcpy(iff->name, newname);												/* to this new name */
+			}
+		}
+	}
+	return 0;
+}
+
+static int read_client_data (int fd) {
+	unsigned char	buf[256];
+	int				chassis, geoslot;
+	unit_t			*u;
+	int				len;
+
+	find_unit_by_fd(fd, &chassis, &geoslot, &u);
+
+	if ((len = recv(fd, buf, sizeof(buf), 0)) <= 0)	return 0;	/* read in whatever data was sent to us */
+
+	if ((u->imsg = realloc(u->imsg, (u->len + len))) == NULL)	/* extend the buffer for the new data */
+		return 0;
+	memcpy((u->imsg + u->len), buf, len);						/* append the new data */
+	u->len += len;
+	return 1;
+}
+
+static void wait_for_all_answers(void) {
+	int		retval;
+	struct	timeval tv;
+	int		fd;
+	int		chassis, geoslot;
+
+	tv.tv_sec = 2;
+	tv.tv_usec = 0;
+
+	while (1) {
+		int flag = 0;
+		fd_set working_set;
+
+		for (fd = 0; fd <= max_fs; fd++) {								/* scan the list of descriptors we may be listening to */
+			if (FD_ISSET(fd, &readfds)) flag = 1;						/* and see if there are any still set */
+		}
+		if (flag == 0) return;											/* we are done, when they are all gone */
+
+		memcpy(&working_set, &readfds, sizeof(readfds));				/* otherwise, we still have to listen for more stuff, till we timeout */
+		retval = select(max_fs + 1, &working_set, NULL, NULL, &tv);
+		if (retval == -1) {												/* an error occured !!!!! */
+			return;
+		} else if (retval == 0) {										/* timeout occured, so process what we've got sofar and return */
+			printf("timeout\n");
+			return;
+		} else {
+			for (fd = 0; fd <= max_fs; fd++) {							/* scan the list of things to do, and do them */
+				if (FD_ISSET(fd, &working_set)) {
+					if (read_client_data(fd) == 0) {					/* if the socket has closed */
+						FD_CLR(fd, &readfds);							/* and descriptors we listen to for errors */
+						find_unit_by_fd(fd, &chassis, &geoslot, NULL);
+						close_with_IOP(chassis, geoslot, FIND);			/* and close out connection to him */
+					}
+				}
+			}
+		}
+	}
+}
+
+static char *get_error_response(int fd, char *errbuf) {		/* return a pointer on error, NULL on no error */
+	char	byte;
+	int		len = 0;
+
+	while (1) {
+		recv(fd, &byte, 1, 0);							/* read another byte in */
+		if (errbuf && (len++ < PCAP_ERRBUF_SIZE)) {		/* and if there is still room in the buffer */
+			*errbuf++ = byte;							/* stick it in */
+			*errbuf = '\0';								/* ensure the string is null terminated just in case we might exceed the buffer's size */
+		}
+		if (byte == '\0') {
+			if (len > 1)	{ return errbuf;	}
+			else			{ return NULL;		}
+		}
+	}
+}
+
+int acn_findalldevs(char *errbuf) {								/* returns: -1 = error, 0 = OK */
+	int		chassis, geoslot;
+	unit_t	*u;
+
+	FD_ZERO(&readfds);
+	max_fs = 0;
+	for (chassis = 0; chassis <= MAX_CHASSIS; chassis++) {
+		for (geoslot = 0; geoslot <= MAX_GEOSLOT; geoslot++) {
+			u = &units[chassis][geoslot];
+			if (u->ip && (open_with_IOP(u, FIND))) {			/* connect to the remote IOP */
+				send_to_fd(u->find_fd, 1, (unsigned char *)"\0");
+				if (get_error_response(u->find_fd, errbuf))
+					close_with_IOP(chassis, geoslot, FIND);
+				else {
+					if (u->find_fd > max_fs)
+						max_fs = u->find_fd;								/* remember the highest number currently in use */
+					FD_SET(u->find_fd, &readfds);						/* we are going to want to read this guy's response to */
+					u->len = 0;
+					send_to_fd(u->find_fd, 1, (unsigned char *)"Q");		/* this interface query request */
+				}
+			}
+		}
+	}
+	wait_for_all_answers();
+	if (process_client_data(errbuf))
+		return -1;
+	sort_if_table();
+	return 0;
+}
+
+static int pcap_stats_acn(pcap_t *handle, struct pcap_stat *ps) {
+	unsigned char	buf[12];
+
+	send_to_fd(handle->fd, 1, (unsigned char *)"S");						/* send the get_stats command to the IOP */
+
+	if (read_client_nbytes(handle->fd, sizeof(buf), buf) == -1) return -1;	/* try reading the required bytes */
+
+	ps->ps_recv		= ntohl(*(uint32_t *)&buf[0]);							/* break the buffer into its three 32 bit components */
+	ps->ps_drop		= ntohl(*(uint32_t *)&buf[4]);
+	ps->ps_ifdrop	= ntohl(*(uint32_t *)&buf[8]);
+
+	return 0;
+}
+
+static int acn_open_live(const char *name, char *errbuf, int *linktype) {		/* returns 0 on error, else returns the file descriptor */
+	int			chassis, geoslot;
+	unit_t		*u;
+	iface_t		*p;
+	pcap_if_t	*alldevsp;
+
+	pcap_findalldevs_interfaces(&alldevsp, errbuf);
+	for (chassis = 0; chassis <= MAX_CHASSIS; chassis++) {										/* scan the table... */
+		for (geoslot = 0; geoslot <= MAX_GEOSLOT; geoslot++) {
+			u = &units[chassis][geoslot];
+			if (u->ip != NULL) {
+				p = u->iface;
+				while (p) {																		/* and all interfaces... */
+					if (p->IOPname && p->name && (strcmp(p->name, name) == 0)) {				/* and if we found the interface we want... */
+						*linktype = p->iftype;
+						open_with_IOP(u, LIVE);													/* start a connection with that IOP */
+						send_to_fd(u->fd, strlen(p->IOPname)+1, (unsigned char *)p->IOPname);	/* send the IOP's interface name, and a terminating null */
+						if (get_error_response(u->fd, errbuf)) {
+							return -1;
+						}
+						return u->fd;															/* and return that open descriptor */
+					}
+					p = p->next;
+				}
+			}
+		}
+	}
+	return -1;																				/* if the interface wasn't found, return an error */
+}
+
+static void acn_start_monitor(int fd, int snaplen, int timeout, int promiscuous, int direction) {
+	unsigned char	buf[8];
+	unit_t			*u;
+
+	//printf("acn_start_monitor()\n");				// fulko
+	find_unit_by_fd(fd, NULL, NULL, &u);
+	if (u->first_time == 0) {
+		buf[0]					= 'M';
+		*(uint32_t *)&buf[1]	= htonl(snaplen);
+		buf[5]					= timeout;
+		buf[6]					= promiscuous;
+		buf[7]					= direction;
+	//printf("acn_start_monitor() first time\n");				// fulko
+		send_to_fd(fd, 8, buf);								/* send the start monitor command with its parameters to the IOP */
+		u->first_time = 1;
+	}
+	//printf("acn_start_monitor() complete\n");				// fulko
+}
+
+static int pcap_inject_acn(pcap_t *p, const void *buf _U_, size_t size _U_) {
+	strlcpy(p->errbuf, "Sending packets isn't supported on ACN adapters",
+	    PCAP_ERRBUF_SIZE);
+	return (-1);
+}
+
+static int pcap_setfilter_acn(pcap_t *handle, struct bpf_program *bpf) {
+	int				fd = handle->fd;
+	int				count;
+	struct bpf_insn	*p;
+	uint16_t		shortInt;
+	uint32_t		longInt;
+
+	send_to_fd(fd, 1, (unsigned char *)"F");			/* BPF filter follows command */
+	count = bpf->bf_len;
+	longInt = htonl(count);
+	send_to_fd(fd, 4, (unsigned char *)&longInt);		/* send the instruction sequence count */
+	p = bpf->bf_insns;
+	while (count--) {									/* followed by the list of instructions */
+		shortInt = htons(p->code);
+		longInt = htonl(p->k);
+		send_to_fd(fd, 2, (unsigned char *)&shortInt);
+		send_to_fd(fd, 1, (unsigned char *)&p->jt);
+		send_to_fd(fd, 1, (unsigned char *)&p->jf);
+		send_to_fd(fd, 4, (unsigned char *)&longInt);
+		p++;
+	}
+	if (get_error_response(fd, NULL))
+		return -1;
+	return 0;
+}
+
+static int pcap_setdirection_acn(pcap_t *handle, pcap_direction_t d) {
+	snprintf(handle->errbuf, sizeof(handle->errbuf),
+	    "Setting direction is not supported on ACN adapters");
+	return -1;
+}
+
+static int acn_read_n_bytes_with_timeout(pcap_t *handle, int count) {
+	struct		timeval tv;
+	int			retval, fd;
+	fd_set		r_fds;
+	fd_set		w_fds;
+	u_char		*bp;
+	int			len = 0;
+	int			offset = 0;
+
+	tv.tv_sec = 5;
+	tv.tv_usec = 0;
+
+	fd = handle->fd;
+	FD_ZERO(&r_fds);
+	FD_SET(fd, &r_fds);
+	memcpy(&w_fds, &r_fds, sizeof(r_fds));
+	bp = handle->bp;
+	while (count) {
+		retval = select(fd + 1, &w_fds, NULL, NULL, &tv);
+		if (retval == -1) {											/* an error occured !!!!! */
+//			fprintf(stderr, "error during packet data read\n");
+			return -1;												/* but we need to return a good indication to prevent unneccessary popups */
+		} else if (retval == 0) {									/* timeout occured, so process what we've got sofar and return */
+//			fprintf(stderr, "timeout during packet data read\n");
+			return -1;
+		} else {
+			if ((len = recv(fd, (bp + offset), count, 0)) <= 0) {
+//				fprintf(stderr, "premature exit during packet data rx\n");
+				return -1;
+			}
+			count -= len;
+			offset += len;
+		}
+	}
+	return 0;
+}
+
+static int pcap_read_acn(pcap_t *handle, int max_packets, pcap_handler callback, u_char *user) {
+	#define HEADER_SIZE (4 * 4)
+	unsigned char		packet_header[HEADER_SIZE];
+	struct pcap_pkthdr	pcap_header;
+
+	//printf("pcap_read_acn()\n");			// fulko
+	acn_start_monitor(handle->fd, handle->snapshot, handle->opt.timeout, handle->opt.promisc, handle->direction);	/* maybe tell him to start monitoring */
+	//printf("pcap_read_acn() after start monitor\n");			// fulko
+
+	handle->bp = packet_header;
+	if (acn_read_n_bytes_with_timeout(handle, HEADER_SIZE) == -1) return 0;			/* try to read a packet header in so we can get the sizeof the packet data */
+
+	pcap_header.ts.tv_sec	= ntohl(*(uint32_t *)&packet_header[0]);				/* tv_sec */
+	pcap_header.ts.tv_usec	= ntohl(*(uint32_t *)&packet_header[4]);				/* tv_usec */
+	pcap_header.caplen		= ntohl(*(uint32_t *)&packet_header[8]);				/* caplen */
+	pcap_header.len			= ntohl(*(uint32_t *)&packet_header[12]);				/* len */
+
+	handle->bp = handle->buffer + handle->offset;									/* start off the receive pointer at the right spot */
+	if (acn_read_n_bytes_with_timeout(handle, pcap_header.caplen) == -1) return 0;	/* then try to read in the rest of the data */
+
+	callback(user, &pcap_header, handle->bp);										/* call the user supplied callback function */
+	return 1;
+}
+
+static int pcap_activate_sita(pcap_t *handle) {
+	int		fd;
+
+	if (handle->opt.rfmon) {
+		/*
+		 * No monitor mode on SITA devices (they're not Wi-Fi
+		 * devices).
+		 */
+		return PCAP_ERROR_RFMON_NOTSUP;
+	}
+
+	/* Initialize some components of the pcap structure. */
+
+	handle->inject_op = pcap_inject_acn;
+	handle->setfilter_op = pcap_setfilter_acn;
+	handle->setdirection_op = pcap_setdirection_acn;
+	handle->set_datalink_op = NULL;	/* can't change data link type */
+	handle->getnonblock_op = pcap_getnonblock_fd;
+	handle->setnonblock_op = pcap_setnonblock_fd;
+	handle->cleanup_op = pcap_cleanup_acn;
+	handle->read_op = pcap_read_acn;
+	handle->stats_op = pcap_stats_acn;
+
+	fd = acn_open_live(handle->opt.source, handle->errbuf,
+	    &handle->linktype);
+	if (fd == -1)
+		return PCAP_ERROR;
+	handle->fd = fd;
+	handle->bufsize = handle->snapshot;
+
+	/* Allocate the buffer */
+
+	handle->buffer	 = malloc(handle->bufsize + handle->offset);
+	if (!handle->buffer) {
+	        snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			 "malloc: %s", pcap_strerror(errno));
+		pcap_cleanup_acn(handle);
+		return PCAP_ERROR;
+	}
+
+	/*
+	 * "handle->fd" is a socket, so "select()" and "poll()"
+	 * should work on it.
+	 */
+	handle->selectable_fd = handle->fd;
+
+	return 0;
+}
+
+pcap_t *pcap_create_interface(const char *device, char *ebuf) {
+	pcap_t *p;
+
+	p = pcap_create_common(device, ebuf, 0);
+	if (p == NULL)
+		return (NULL);
+
+	p->activate_op = pcap_activate_sita;
+	return (p);
+}
diff --git a/pcap-sita.h b/pcap-sita.h
new file mode 100644
index 0000000..b232ee2
--- /dev/null
+++ b/pcap-sita.h
@@ -0,0 +1,10 @@
+/*
+ * pcap-sita.h: Packet capture interface for SITA WAN devices
+ *
+ * Authors: Fulko Hew (fulko.hew@sita.aero) (+1 905 6815570);
+ *
+ * @(#) $Header: /tcpdump/master/libpcap/pcap-sita.h
+ */
+
+extern int acn_parse_hosts_file(char *errbuf);
+extern int acn_findalldevs(char *errbuf);
diff --git a/pcap-sita.html b/pcap-sita.html
new file mode 100644
index 0000000..97408d8
--- /dev/null
+++ b/pcap-sita.html
@@ -0,0 +1,943 @@
+<HTML><HEAD>
+<STYLE type="text/css">
+<!--
+A { text-decoration:none }
+-->
+</STYLE>
+</HEAD>
+<BODY>
+
+<TABLE WIDTH=100%><TR>
+	<TD ALIGN=LEFT VALIGN=TOP>
+		<FONT SIZE=+0 FACE="COURIER"><B>A "Distributed Pcap" for<BR>Remote Monitoring LANs & WANs</B><BR>
+										(Design Notes for the SITA ACN device)</FONT>
+	</TD>
+	<TD ALIGN=RIGHT VALIGN=TOP>
+		Fulko Hew<BR>SITA INC Canada, Inc.<BR>Revised: October 2, 2007
+	</TD>
+</TR></TABLE>
+
+
+<H3>SUMMARY</H3>
+<UL>
+	<STRONG>Note:</STRONG> This document is part of the libpcap Git and was derived from 'pcap.3' (circa Aug/07).
+	<P>
+	The ACN provides a customized/distributed version of this library that alows SMPs to
+	interact with the various IOPs within the site providing a standard mechanism
+	to capture LAN and WAN message traffic.
+	<P>
+	<CENTER>
+		<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3 WIDTH=75%>
+			<TR>
+				<TH VALIGN=TOP>SMP</TH>
+				<TD VALIGN=TOP>The Supervisory Management Processor where Wireshark (or equivalent)
+								runs in conjuction with a libpcap front-end.</TD>
+			</TR>
+			<TR>
+				<TH VALIGN=TOP>IOP</TH>
+				<TD VALIGN=TOP>I/O Processors where the monitored ports exist in conjunction
+								with a custom device driver/libpcap back-end.</TD>
+			</TR>
+		</TABLE>
+	</CENTER>
+	<P>
+	Each IOP will be capable of supporting multiple connections from an SMP
+	enabling monitoring of more than one interface at a time, each through
+	its own seperate connection.  The IOP is responsible to ensure and report
+	an error if any attempt is made to monitor the same interface more than once.
+	<P>
+	There are three applications that will be supported by the ACN version of libpcap.
+	They each use a slightly different mode for looping/capturing and termination
+	as summarized in the following table:
+	<P>
+	<CENTER>
+	<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3>
+    	<TR><TH>Application</TH>	<TH>Capture</TH>	<TH>Termination</TH></TR>
+    	<TR><TH VALIGN=TOP NOWRAP>wireshark</TH>
+			<TD VALIGN=TOP>pcap_dispatch(all packets in one buffer of capture only)</TD>
+			<TD VALIGN=TOP>pcap_breakloop()</TD>
+		</TR>
+    	<TR><TH VALIGN=TOP NOWRAP>tshark</TH>
+			<TD VALIGN=TOP>pcap_dispatch(one buffer of capture only)</TD>
+			<TD VALIGN=TOP>Since a CTRL-C was used to terminate the application, pcap_breakloop() is never called.</TD>
+		</TR>
+    	<TR><TH VALIGN=TOP NOWRAP>tcpdump</TH>
+			<TD VALIGN=TOP>pcap_loop(all packets in the next buffer, and loop forever)</TD>
+			<TD VALIGN=TOP>pcap_breakloop()</TD>
+		</TR>
+	</TABLE>
+	</CENTER>
+	<P>
+	<B>Note: </B>In all cases, the termination of capturing is always (apparently) followed by
+	pcap_close().  Pcap_breakloop() is only used to stop/suspend looping/processing,
+	and upon close interpretation of the function definitions, it is possible to resume
+	capturing following a pcap_breakloop() without any re-initialization.
+	<P>
+	<H4>ACN Limitations</H4>
+	<OL>
+		<LI>Monitoring of backup IOPs is not currently supported.
+		<LI>Ethernet interfaces cannot be monitored in promiscuous mode.
+	</OL>
+
+</UL>
+
+<H3>ROUTINES</H3>
+<UL>
+		The following list of functions is the sub-set of Pcap functions that have been
+		altered/enhanced to support the ACN remote monitoring facility.  The remainder of the Pcap
+		functions continue to perform their duties un-altered.  Libpcap only supports this
+		mode of operation if it has been configured/compiled for SITA/ACN support.
+		<P>
+		<UL><FONT FACE=COURIER>
+			pcap_findalldevs<BR>
+			pcap_freealldevs<BR>
+			pcap_open_live<BR>
+			pcap_close<BR>
+			pcap_setfilter<BR>
+			pcap_dispatch<BR>
+			pcap_loop<BR>
+			pcap_next<BR>
+			pcap_next_ex<BR>
+			pcap_stats<BR>
+		</FONT></UL>
+
+	These subroutines have been modified for the ACN specific distributed and remote monitoring
+	ability perform the following basic functions.  More detail is provided in the
+	"SMP/IOP Inter-Process Communication Protocol" section.
+	<P>
+<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3>
+	<TR>
+		<TD VALIGN=TOP ROWSPAN=2><B>pcap_open_live()</B></TD>
+		<TD VALIGN=TOP>Used to obtain a packet capture descriptor to look at packets on the network.</TD>
+	</TR>
+	<TR><TD><TABLE BORDER=0 CELLSPACING=0 CELLPADDING=3 WIDTH=100%>
+		<TR><TH VALIGN=TOP NOWRAP>SMP -> IOP</TH>
+			<TD>
+			The SMP will open a connection to the selected IOP on its 'sniffer' port
+			to ensure it is available.  It sends a null terminated string identifying
+			the interface to be monitored.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>IOP -> SMP</TH>
+			<TD>
+			After any required processing is complete, the IOP will return a
+			null terminated string containing an error message if one occured.
+			If no error occured, a empty string is still returned.
+			Errors are:
+			<UL>
+			<LI>"Interface (xxx) does not exist."
+			<LI>"Interface (xxx) not configured."
+			<LI>"Interface (xxx) already being monitored."
+			</UL>
+			</TD>
+		</TR>
+	</TABLE></TD></TR>
+
+	<TR>
+		<TD VALIGN=TOP ROWSPAN=2><B>pcap_findalldevs()</B></TD>
+		<TD VALIGN=TOP>It constructs a list of network devices that can be opened with pcap_open_live().</TD>
+	</TR>
+	<TR><TD><TABLE BORDER=0 CELLSPACING=0 CELLPADDING=3 WIDTH=100%>
+		<TR><TH VALIGN=TOP NOWRAP>SMP</TH>
+			<TD>
+			It obtains a list of IOPs currently available (via /etc/hosts).
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>SMP -> IOP</TH>
+			<TD>
+			The SMP will sequentially open a connection to each IOP on its 'sniffer' port to ensure
+			the IOP is available.
+			It sends a null terminated empty interface ID followed by the query request command.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>IOP -> SMP</TH>
+			<TD>The IOP returns an error response and its list of devices.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>SMP -> IOP</TH>
+			<TD>
+			The SMP closes the TCP connection with each IOP.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>SMP</TH>
+			<TD>
+			The SMP adds the received information to its internal structure.
+			</TD>
+		</TR>
+	</TABLE></TD></TR>
+
+	<TR>
+		<TD VALIGN=TOP ROWSPAN=2><B>pcap_freealldevs()</B></TD>
+		<TD VALIGN=TOP>Used to free a list allocated by pcap_findalldevs().</TD>
+	</TR>
+	<TR><TD><TABLE BORDER=0 CELLSPACING=0 CELLPADDING=3 WIDTH=100%>
+		<TR><TH VALIGN=TOP NOWRAP>SMP</TH>
+			<TD>
+			The SMP frees the structure it built as a result of the previous
+			invocation of pcap_findalldevs().
+			</TD>
+		</TR>
+	</TABLE></TD></TR>
+
+	<TR>
+		<TD VALIGN=TOP ROWSPAN=2><B>pcap_dispatch()</B></TD>
+		<TD VALIGN=TOP>Used to collect and process packets.</TD>
+	</TR>
+	<TR><TD><TABLE BORDER=0 CELLSPACING=0 CELLPADDING=3 WIDTH=100%>
+		<TR><TH VALIGN=TOP NOWRAP>SMP -> IOP</TH>
+			<TD>
+			On the first invocation of pcap_dispatch(), pcap_loop(), or pcap_next(), or pcap_next_ex() following a pcap_open_live(),
+			the SMP will pass down the monitor start command and various parameters the IOP should use.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>IOP -> SMP</TH>
+			<TD>
+			The IOP now sends a stream of captured data.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>SMP</TH>
+			<TD>
+			The SMP will read the reverse channel of the connection between the SMP and the
+			IOP that provides the captured data (via 'p->read_op' which is 'pcap_read_linux()'
+			until the select() call returns a 'no more data' indication.
+			It will the process (at most) the next 'cnt' packets and invoke the specified
+			callback function for each packet processed.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>IOP</TH>
+			<TD>
+			The IOP continues to listen for additional commands as well as capturing and forwarding data to the SMP.
+			</TD>
+		</TR>
+	</TABLE></TD></TR>
+
+	<TR>
+		<TD VALIGN=TOP ROWSPAN=2><B>pcap_loop()</B></TD>
+		<TD VALIGN=TOP>
+				Is similar to pcap_dispatch() except it keeps reading packets until
+				the requested number of packets are processed or an error occurs.
+		</TD>
+	</TR>
+	<TR><TD><TABLE BORDER=0 CELLSPACING=0 CELLPADDING=3 WIDTH=100%>
+		<TR><TH VALIGN=TOP NOWRAP>SMP -> IOP</TH>
+			<TD>
+			On the first invocation of pcap_dispatch(), pcap_loop(), or pcap_next(), or pcap_next_ex() following a pcap_open_live(),
+			the SMP will pass down the monitor start command and various parameters the IOP should use.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>IOP -> SMP</TH>
+			<TD>
+			The IOP now sends a stream of captured data.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>SMP</TH>
+			<TD>
+			The SMP continuously reads the next packet from the reverse channel of the connection
+			between the SMP and the IOP that provides the captured data (via 'p->read_op'
+			which is 'pcap_read_linux()' until 'cnt' packets have been received.
+			The specified callback function will be invoked for each packet received.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>IOP</TH>
+			<TD>
+			The IOP continues to listen for additional commands as well as capturing and forwarding data to the SMP.
+			</TD>
+		</TR>
+	</TABLE></TD></TR>
+
+	<TR>
+		<TD VALIGN=TOP ROWSPAN=2><B>pcap_next()</B></TD>
+		<TD VALIGN=TOP>
+			It reads the next packet (by calling pcap_dispatch() with a count of 1)
+			and returns a pointer to the data in that packet.
+		</TD>
+	</TR>
+	<TR><TD><TABLE BORDER=0 CELLSPACING=0 CELLPADDING=3 WIDTH=100%>
+		<TR><TH VALIGN=TOP NOWRAP>SMP -> IOP</TH>
+			<TD>
+			On the first invocation of pcap_dispatch(), pcap_loop(), or pcap_next(), or pcap_next_ex() following a pcap_open_live(),
+			the SMP will pass down the monitor start command and various parameters the IOP should use.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>IOP -> SMP</TH>
+			<TD>
+			The IOP now sends a stream of captured data.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>SMP</TH>
+			<TD>
+			The SMP reads only the next packet from the reverse channel of the connection
+			between the SMP and the IOP that provides the captured data (via calling pcap_dispatch()
+			with a count of 1) and returns a pointer to that data by invoking an internal callback.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>IOP</TH>
+			<TD>
+			The IOP continues to listen for additional commands as well as capturing and forwarding data to the SMP.
+			</TD>
+		</TR>
+	</TABLE></TD></TR>
+
+	<TR>
+		<TD VALIGN=TOP ROWSPAN=2><B>pcap_next_ex()</B></TD>
+		<TD VALIGN=TOP>Reads the next packet and returns a success/failure indication.</TD>
+	</TR>
+	<TR><TD><TABLE BORDER=0 CELLSPACING=0 CELLPADDING=3 WIDTH=100%>
+		<TR><TH VALIGN=TOP NOWRAP>SMP -> IOP</TH>
+			<TD>
+			On the first invocation of pcap_dispatch(), pcap_loop(), or pcap_next(), or pcap_next_ex() following a pcap_open_live(),
+			the SMP will pass down the monitor start command and various parameters the IOP should use.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>IOP -> SMP</TH>
+			<TD>
+			The IOP now sends a stream of captured data.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>SMP</TH>
+			<TD>
+			The SMP reads only the next packet from the reverse channel of the connection
+			between the SMP and the IOP that provides the captured data (via calling pcap_dispatch()
+			with a count of 1) and returns seperate pointers to both the
+			packet header and packet data by invoking an internal callback.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>IOP</TH>
+			<TD>
+			The IOP continues to listen for additional commands as well as capturing and forwarding data to the SMP.
+			</TD>
+		</TR>
+	</TABLE></TD></TR>
+
+	<TR>
+		<TD VALIGN=TOP ROWSPAN=2><B>pcap_setfilter()</B></TD>
+        <TD VALIGN=TOP>Used to specify a filter program.</TD>
+	</TR>
+	<TR><TD><TABLE BORDER=0 CELLSPACING=0 CELLPADDING=3 WIDTH=100%>
+		<TR><TH VALIGN=TOP NOWRAP>SMP -> IOP</TH>
+			<TD>
+			The SMP sends a 'set filter' command followed by the BPF commands.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>IOP -> SMP</TH>
+			<TD>
+			The IOP returns a null terminated error string if it failed to accept the filter.
+			If no error occured, then a NULL terminated empty string is returned instead.
+			Errors are:
+			<UL>
+			<LI>"Invalid BPF."
+			<LI>"Insufficient resources for BPF."
+			</UL>
+			</TD>
+		</TR>
+	</TABLE></TD></TR>
+
+	<TR>
+		<TD VALIGN=TOP ROWSPAN=2><B>pcap_stats()</B></TD>
+        <TD VALIGN=TOP>Fills in a pcap_stat struct with packet statistics.</TD>
+	</TR>
+	<TR><TD><TABLE BORDER=0 CELLSPACING=0 CELLPADDING=3 WIDTH=100%>
+		<TR><TH VALIGN=TOP NOWRAP>SMP -> IOP</TH>
+			<TD>
+			The SMP sends a message to the IOP requesting its statistics.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>IOP -> SMP</TH>
+			<TD>
+			The IOP returns the statistics.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>SMP</TH>
+			<TD>
+			The SMP fills in the structure provided with the information retrieved from the IOP.
+			</TD>
+		</TR>
+	</TABLE></TD></TR>
+
+	<TR>
+		<TD VALIGN=TOP ROWSPAN=2><B>pcap_close()</B></TD>
+        <TD VALIGN=TOP>Closes the file and deallocates resources.</TD>
+	</TR>
+	<TR><TD><TABLE BORDER=0 CELLSPACING=0 CELLPADDING=3 WIDTH=100%>
+		<TR><TH VALIGN=TOP NOWRAP>SMP -> IOP</TH>
+			<TD>
+			The SMP closes the file descriptor, and if the descriptor is that of
+			the comminucation session with an IOP, it too is terminated.
+			</TD>
+		</TR>
+		<TR><TH VALIGN=TOP NOWRAP>IOP</TH>
+			<TD>
+			If the IOP detects that its communication session with an SMP
+			has closed, it will terminate any monitoring in progress,
+			release any resources and close its end of the session.
+			It will not maintain persistance of any information or prior mode of operation.
+			</TD>
+		</TR>
+	</TABLE></TD></TR>
+</TABLE>
+</UL>
+
+<P>
+<H3>SMP/IOP Inter-Process Communication Protocol</H3>
+
+<UL>
+	<LI><P>Communications between an SMP and an IOP consists of a TCP session
+			between an ephemeral port on the SMP and the well known port of 49152
+			(which is the first available port in the 'dynamic and/or private port'
+			range) on an IOP.
+	<LI><P>Following a TCP open operation the IOP receives a null terminated
+			'interface ID' string to determine the type of operation that follows:
+	<LI><P>Every command received by an IOP implies a 'stop trace/stop forwarding' operation must
+			occur before executing the received command.
+	<LI><P>A session is closed when the SMP closes the TCP session with the IOP.
+			Obviously monitoring and forwarding is also stopped at that time.
+
+	<B>Note: </B>All multi-octet entities are sent in network neutral order.
+	<P>
+
+	<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=5>
+		<TR><TH COLSPAN=3><HR WIDTH=100%></TH></TR>
+		<TR>
+			<TD VALIGN=TOP ROWSPAN=6>pcap_findalldevs()</TD>
+			<TD VALIGN=TOP ALIGN=CENTER NOWRAP>SMP -> IOP</TD>
+			<TD VALIGN=TOP>Open socket (to each IOP), and sends:
+				<P>
+				<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3>
+					<TR>
+					<TH VALIGN=TOP ALIGN=CENTER>Name/<BR>Purpose</TH>
+					<TH VALIGN=TOP ALIGN=CENTER NOWRAP>Size<BR>(in bytes)</TH>
+					<TH VALIGN=TOP ALIGN=CENTER>Description</TH>
+					</TR>
+					<TR>
+						<TD VALIGN=TOP>Interface ID</TD>
+						<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+						<TD VALIGN=TOP>A NULL to indicate an an empty 'interface ID'.</TD>
+					</TR>
+				</TABLE>
+			</TD>
+		</TR>
+		<TR>
+			<TD VALIGN=TOP ALIGN=CENTER NOWRAP>IOP -> SMP</TD>
+			<TD VALIGN=TOP>Send its (possibly empty) NULL terminated error response string.</TD>
+		</TR>
+		<TR>
+			<TD VALIGN=TOP ALIGN=CENTER NOWRAP>SMP -> IOP</TD>
+			<TD VALIGN=TOP>Sends the 'interface query request':
+				<P>
+				<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3>
+					<TR>
+					<TH VALIGN=TOP ALIGN=CENTER>Name/<BR>Purpose</TH>
+					<TH VALIGN=TOP ALIGN=CENTER NOWRAP>Size<BR>(in bytes)</TH>
+					<TH VALIGN=TOP ALIGN=CENTER>Description</TH>
+					</TR>
+					<TR>
+						<TD VALIGN=TOP>Interface ID</TD>
+						<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+						<TD VALIGN=TOP>A 'Q' (indicating 'interface query request').</TD>
+					</TR>
+				</TABLE>
+			</TD>
+		</TR>
+		<TR>
+			<TD VALIGN=TOP ALIGN=CENTER NOWRAP>IOP -> SMP</TD>
+			<TD VALIGN=TOP>The IOP returns a list of sequences of information as
+				defined by the return parameter of this function call (as shown in the following table).
+				Elements are specified by providing an unsigned byte preceeding the actual data that contains length information.
+				<P>
+				<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3>
+				<TR>
+					<TH VALIGN=TOP ALIGN=CENTER>Notes:</TH>
+					<TH VALIGN=TOP ALIGN=CENTER>Name/<BR>Purpose</TH>
+					<TH VALIGN=TOP ALIGN=CENTER NOWRAP>Size<BR>(in bytes)</TH>
+					<TH VALIGN=TOP ALIGN=CENTER>Description</TH>
+				</TR>
+				<TR>
+					<TD ROWSPAN=7>&nbsp;</TD>
+					<TD VALIGN=TOP ALIGN=RIGHT>length</TD>
+					<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+					<TD VALIGN=TOP>The number of octets in the name field that follows.</TD>
+				</TR>
+				<TR><TD VALIGN=TOP ALIGN=LEFT>Name</TD>
+					<TD VALIGN=TOP ALIGN=CENTER>1-255</TD>
+					<TD VALIGN=TOP>The name of the interface. The format of the name is an alphabetic string (indicating
+									the type of interface) followed by an optional numeric string (indicating the interface's
+									sequence number).
+									Sequence numbers (if needed) will begin at zero and progress monotonically upwards.
+									(i.e. 'eth0', 'lo', 'wan0', etc.)
+									<P>
+									For an IOP, the alphabetic string will be one of: 'eth', 'wan', and 'lo'
+									for Ethernet, WAN ports and the IP loopback device respectively.
+									An IOP currently supports: 'eth0', 'eth1', 'lo', 'wan0' ... 'wan7'.
+									<P>
+						<B>Note:</B> IOPs and ACNs will not currently support the concept of 'any' interface.</TD>
+				</TR>
+				<TR><TD VALIGN=TOP ALIGN=RIGHT>length</TD>
+					<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+					<TD VALIGN=TOP>The number of octets in the interface description field that follows.</TD>
+				</TR>
+				<TR><TD VALIGN=TOP ALIGN=LEFT>Interface Description</TD>
+					<TD VALIGN=TOP ALIGN=CENTER>0-255</TD>
+					<TD VALIGN=TOP>A description of the interface or it may be an empty string. (i.e. 'ALC')</TD>
+				</TR>
+				<TR><TD VALIGN=TOP ALIGN=LEFT>Interface Type</TD>
+					<TD VALIGN=TOP ALIGN=CENTER>4</TD>
+					<TD VALIGN=TOP>The type of interface as defined in the description for pcap_datalink() (in network neutral order).</TD>
+				</TR>
+				<TR><TD VALIGN=TOP ALIGN=LEFT>Loopback Flag</TD>
+					<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+					<TD VALIGN=TOP>1 = if the interface is a loopback interface, zero = otherwise.</TD>
+				</TR>
+				<TR><TD VALIGN=TOP ALIGN=RIGHT>count</TD>
+					<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+					<TD VALIGN=TOP># of address entries that follow.
+						Each entry is a series of bytes in network neutral order.
+						See the parameter definition above for more details.</TD>
+				</TR>
+				<TR>
+					<TD ALIGN=CENTER ROWSPAN=8 WIDTH=1%>Repeated 'count' number of times.</TD>
+					<TD VALIGN=TOP ALIGN=RIGHT>length</TD>
+					<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+					<TD VALIGN=TOP>The number of octets in the address field that follows.</TD>
+				</TR>
+				<TR><TD VALIGN=TOP ALIGN=LEFT>Address</TD>
+					<TD VALIGN=TOP ALIGN=CENTER>1-255</TD>
+					<TD VALIGN=TOP>The address of this interface (in network neutral order).</TD>
+				</TR>
+				<TR><TD VALIGN=TOP ALIGN=RIGHT>length</TD>
+					<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+					<TD VALIGN=TOP>The number of octets in the netmask field that follows.</TD>
+				</TR>
+				<TR><TD VALIGN=TOP ALIGN=LEFT>Network Mask</TD>
+					<TD VALIGN=TOP ALIGN=CENTER>0-255</TD>
+					<TD VALIGN=TOP>The network mask used on this interface (if applicable) (in network neutral order).</TD>
+				</TR>
+				<TR><TD VALIGN=TOP ALIGN=RIGHT>length</TD>
+					<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+					<TD VALIGN=TOP>The number of octets in the broadcast address field that follows.</TD>
+				</TR>
+				<TR><TD VALIGN=TOP ALIGN=LEFT>Broadcast Address</TD>
+					<TD VALIGN=TOP ALIGN=CENTER>0-255</TD>
+					<TD VALIGN=TOP>The broadcast address of this interface (if applicable) (in network neutral order).</TD>
+				</TR>
+				<TR><TD VALIGN=TOP ALIGN=RIGHT>length</TD>
+					<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+					<TD VALIGN=TOP>The number of octets in the destination address field that follows.</TD>
+				</TR>
+				<TR><TD VALIGN=TOP ALIGN=LEFT>Destination Address</TD>
+					<TD VALIGN=TOP ALIGN=CENTER>0-255</TD>
+					<TD VALIGN=TOP>The destination address of this interface (if applicable) (in network neutral order).</TD>
+				</TR>
+				</TABLE>
+		</TR>
+		<TR>
+			<TD VALIGN=TOP ALIGN=CENTER NOWRAP>SMP -> IOP</TD>
+			<TD VALIGN=TOP>Close the socket.</TD>
+		</TR>
+		<TR>
+			<TD VALIGN=TOP ALIGN=CENTER NOWRAP>IOP -> SMP</TD>
+			<TD VALIGN=TOP>Close the socket.</TD>
+		</TR>
+		<TR><TH COLSPAN=3><HR WIDTH=100%></TH></TR>
+		<TR>
+			<TD VALIGN=TOP ROWSPAN=2>pcap_open_live()</TD>
+			<TD VALIGN=TOP ALIGN=CENTER NOWRAP>SMP -> IOP</TD>
+			<TD VALIGN=TOP>Open socket, and sends:
+				<P>
+				<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3>
+					<TR>
+					<TH VALIGN=TOP ALIGN=CENTER>Name/<BR>Purpose</TH>
+					<TH VALIGN=TOP ALIGN=CENTER NOWRAP>Size<BR>(in bytes)</TH>
+					<TH VALIGN=TOP ALIGN=CENTER>Description</TH>
+					</TR>
+					<TR>
+						<TD VALIGN=TOP>Interface ID</TD>
+						<TD VALIGN=TOP ALIGN=CENTER>'n'</TD>
+						<TD VALIGN=TOP>'n' octets containing a NULL terminated interface name string.</TD>
+					</TR>
+				</TABLE>
+			</TD>
+		</TR>
+		<TR>
+			<TD VALIGN=TOP ALIGN=CENTER NOWRAP>IOP -> SMP</TD>
+			<TD VALIGN=TOP>Send its NULL terminated error response string.</TD>
+		</TR>
+		<TR><TH COLSPAN=3><HR WIDTH=100%></TH></TR>
+		<TR>
+			<TD VALIGN=TOP NOWRAP ROWSPAN=2>pcap_dispatch()<BR>pcap_loop()<BR>pcap_next()<BR>pcap_next_ex()</TD>
+			<TD VALIGN=TOP ALIGN=CENTER NOWRAP>SMP -> IOP</TD>
+			<TD VALIGN=TOP>On the first invocation following a pcap_open_live() or pcap_breakloop() additional information is sent:
+				<P>
+				<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3>
+					<TR>
+					<TH VALIGN=TOP ALIGN=CENTER>Name/<BR>Purpose</TH>
+					<TH VALIGN=TOP ALIGN=CENTER NOWRAP>Size<BR>(in bytes)</TH>
+					<TH VALIGN=TOP ALIGN=CENTER>Description</TH>
+					</TR>
+					<TR>
+						<TD VALIGN=TOP>command</TD>
+						<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+						<TD VALIGN=TOP>'M' (indicating 'monitor start')</TD>
+					</TR>
+					<TR>
+						<TD VALIGN=TOP>snaplen</TD>
+						<TD VALIGN=TOP ALIGN=CENTER>4</TD>
+						<TD VALIGN=TOP>snaplen</TD>
+					</TR>
+					<TR>
+						<TD VALIGN=TOP>timeout</TD>
+						<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+						<TD VALIGN=TOP>timeout value (in milliseconds)</TD>
+					</TR>
+					<TR>
+						<TD VALIGN=TOP>promiscuous</TD>
+						<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+						<TD VALIGN=TOP>A flag indicating that the interface being monitored show operate
+							in promiscuous mode. [off(0) / on(NZ)]</TD>
+					</TR>
+					<TR>
+						<TD VALIGN=TOP>direction</TD>
+						<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+						<TD VALIGN=TOP>A flag indicating the direction of traffic that should be captuted [both(0) / in(1) / out(2)]</TD>
+					</TR>
+				</TABLE>
+			</TD>
+		</TR>
+		<TR>
+			<TD VALIGN=TOP ALIGN=CENTER NOWRAP>IOP -> SMP</TD>
+			<TD VALIGN=TOP>Sends captured packets.</TD>
+		</TR>
+		<TR><TH COLSPAN=3><HR WIDTH=100%></TH></TR>
+		<TR>
+			<TD VALIGN=TOP ROWSPAN=2>pcap_setfilter()</TD>
+			<TD VALIGN=TOP ALIGN=CENTER NOWRAP>SMP -> IOP</TD>
+			<TD VALIGN=TOP>At any time, the SMP can issue a set filter command which contains
+							an indicator, a count of the number of statements in the filter,
+							followed by the sequence of filter commands represented as a sequence
+							of C-style structures.
+				<P>
+				<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3>
+					<TR>
+					<TH VALIGN=TOP ALIGN=CENTER>Name/<BR>Purpose</TH>
+					<TH VALIGN=TOP ALIGN=CENTER NOWRAP>Size<BR>(in bytes)</TH>
+					<TH VALIGN=TOP ALIGN=CENTER>Description</TH>
+					</TR>
+					<TR>
+						<TD VALIGN=TOP>command</TD>
+						<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+						<TD VALIGN=TOP>'F' (indicating 'filter')</TD>
+					</TR>
+					<TR>
+						<TD VALIGN=TOP>count</TD>
+						<TD VALIGN=TOP ALIGN=CENTER>4</TD>
+						<TD VALIGN=TOP>The number of command in the Berkeley Packet Filter that follow.</TD>
+					</TR>
+					<TR>
+						<TD VALIGN=TOP>BPF program</TD>
+						<TD VALIGN=TOP ALIGN=CENTER>'n'</TD>
+						<TD VALIGN=TOP>8 bytes of each command (repeated 'n' times).<BR>
+								 	Each command consists of that C-style structure which contains:
+							<P>
+							<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3>
+								<TR>
+								<TH VALIGN=TOP ALIGN=CENTER>Name/<BR>Purpose</TH>
+								<TH VALIGN=TOP ALIGN=CENTER NOWRAP>Size<BR>(in bytes)</TH>
+								<TH VALIGN=TOP ALIGN=CENTER>Description</TH>
+								</TR>
+								<TR>
+									<TD VALIGN=TOP>opcode</TD>
+									<TD VALIGN=TOP ALIGN=CENTER>2</TD>
+									<TD VALIGN=TOP>The command's opcode.</TD>
+								</TR>
+								<TR>
+									<TD VALIGN=TOP>'jt'</TD>
+									<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+									<TD VALIGN=TOP>The 'jump if true' program counter offset.</TD>
+								</TR>
+								<TR>
+									<TD VALIGN=TOP>'jf'</TD>
+									<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+									<TD VALIGN=TOP>The 'jump if false' program counter offset.</TD>
+								</TR>
+								<TR>
+									<TD VALIGN=TOP>'k'</TD>
+									<TD VALIGN=TOP ALIGN=CENTER>4</TD>
+									<TD VALIGN=TOP>The 'other' data field.</TD>
+								</TR>
+							</TABLE>
+							<P>
+							Refer to the bpf(4) man page for more details.
+						</TD>
+					</TR>
+				</TABLE>
+			</TD>
+		</TR>
+		<TR>
+			<TD VALIGN=TOP ALIGN=CENTER NOWRAP>IOP -> SMP</TD>
+			<TD VALIGN=TOP>In return the IOP will send its (possibly empty) NULL terminated error response string.</TD>
+		</TR>
+		<TR><TH COLSPAN=3><HR WIDTH=100%></TH></TR>
+		<TR>
+			<TD VALIGN=TOP ROWSPAN=2>pcap_stats()</TD>
+			<TD VALIGN=TOP ALIGN=CENTER NOWRAP>SMP -> IOP</TD>
+			<TD VALIGN=TOP>At any time, the SMP can issue a 'retrieve statistics' command which contains:<BR>
+				<P>
+				<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3>
+					<TR>
+					<TH VALIGN=TOP ALIGN=CENTER>Name/<BR>Purpose</TH>
+					<TH VALIGN=TOP ALIGN=CENTER NOWRAP>Size<BR>(in bytes)</TH>
+					<TH VALIGN=TOP ALIGN=CENTER>Description</TH>
+					</TR>
+					<TR>
+						<TD VALIGN=TOP>command</TD>
+						<TD VALIGN=TOP ALIGN=CENTER>1</TD>
+						<TD VALIGN=TOP>'S' (indicating 'request statistics')</TD>
+					</TR>
+				</TABLE>
+			</TD>
+		</TR>
+		<TR>
+			<TD VALIGN=TOP ALIGN=CENTER NOWRAP>IOP -> SMP</TD>
+			<TD VALIGN=TOP>In return the IOP will send:
+				<P>
+				<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3>
+					<TR>
+					<TH VALIGN=TOP ALIGN=CENTER>Name/<BR>Purpose</TH>
+					<TH VALIGN=TOP ALIGN=CENTER NOWRAP>Size<BR>(in bytes)</TH>
+					<TH VALIGN=TOP ALIGN=CENTER>Description</TH>
+					</TR>
+					<TR>
+						<TD VALIGN=TOP>ps_recv</TD>
+						<TD VALIGN=TOP ALIGN=CENTER>4</TD>
+						<TD VALIGN=TOP>The number of packets that passed the filter.</TD>
+					</TR>
+					<TR>
+						<TD VALIGN=TOP>ps_drop</TD>
+						<TD VALIGN=TOP ALIGN=CENTER>4</TD>
+						<TD VALIGN=TOP>The number of packets that were dropped because the input queue was full,
+							regardless of whether they passed the filter.</TD>
+					</TR>
+					<TR>
+						<TD VALIGN=TOP>ps_ifdrop</TD>
+						<TD VALIGN=TOP ALIGN=CENTER>4</TD>
+						<TD VALIGN=TOP>The number of packets dropped by the network inteface
+							(regardless of whether they would have passed the input filter).</TD>
+					</TR>
+				</TABLE>
+			</TD>
+		</TR>
+		<TR><TH COLSPAN=3><HR WIDTH=100%></TH></TR>
+		<TR>
+			<TD VALIGN=TOP ROWSPAN=1>pcap_close()</TD>
+			<TD VALIGN=TOP ALIGN=CENTER NOWRAP>SMP -> IOP</TD>
+			<TD VALIGN=TOP>At any time, the SMP can close the TCP session with the IOP.</TD>
+		</TR>
+		<TR><TH COLSPAN=3><HR WIDTH=100%></TH></TR>
+	</TABLE>
+</UL>
+
+<H3>Interface ID Naming Convention</H3>
+<UL>
+	Each interface within an IOP will be referred to uniquely.  Since an currently contains
+	8 monitorable WAN ports and a monitorable Ethernet port, the naming convention is:
+	<P>
+	<CENTER>
+	<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3>
+		<TR><TH>Interface #</TH>		<TH>Type</TH>					<TH>Name</TH></TR>
+		<TR><TD ALIGN=CENTER>1</TD>		<TD ALIGN=CENTER>WAN</TD>		<TD ALIGN=CENTER>wan0</TD></TR>
+		<TR><TD ALIGN=CENTER>2</TD>		<TD ALIGN=CENTER>WAN</TD>		<TD ALIGN=CENTER>wan1</TD></TR>
+		<TR><TD ALIGN=CENTER>3</TD>		<TD ALIGN=CENTER>WAN</TD>		<TD ALIGN=CENTER>wan2</TD></TR>
+		<TR><TD ALIGN=CENTER>4</TD>		<TD ALIGN=CENTER>WAN</TD>		<TD ALIGN=CENTER>wan3</TD></TR>
+		<TR><TD ALIGN=CENTER>5</TD>		<TD ALIGN=CENTER>WAN</TD>		<TD ALIGN=CENTER>wan4</TD></TR>
+		<TR><TD ALIGN=CENTER>6</TD>		<TD ALIGN=CENTER>WAN</TD>		<TD ALIGN=CENTER>wan5</TD></TR>
+		<TR><TD ALIGN=CENTER>7</TD>		<TD ALIGN=CENTER>WAN</TD>		<TD ALIGN=CENTER>wan6</TD></TR>
+		<TR><TD ALIGN=CENTER>8</TD>		<TD ALIGN=CENTER>WAN</TD>		<TD ALIGN=CENTER>wan7</TD></TR>
+		<TR><TD ALIGN=CENTER>9</TD>		<TD ALIGN=CENTER>Ethernet</TD>	<TD ALIGN=CENTER>eth0</TD></TR>
+		<TR><TD ALIGN=CENTER>10</TD>	<TD ALIGN=CENTER>Ethernet</TD>	<TD ALIGN=CENTER>eth1</TD></TR>
+	</TABLE>
+	</CENTER>
+</UL>
+
+<H3>Packet Trace Data Format</H3>
+<UL>
+	The format of the trace data that is sent to the SMP follows a portion of the libpcap file format
+	and is summarized here.  This format specifies the generic requirements needed to
+	be able to decode packets, but does not cover ACN specifics such as custom MAC addressing
+	and WAN protocol support.
+	<P>
+
+	Although a libpcap file begins with a global header followed by zero or
+	more records for each captured packet, trace data sent to the SMP does NOT begin with a global header.
+	A trace sequence looks like this:
+	<P>
+	<TABLE>
+		<TR>
+  			<TD STYLE="background-color: #c0FFc0">&nbsp;[Packet Header]&nbsp;</TD>
+  			<TD STYLE="background-color: #c0FFc0">&nbsp;[Packet Data]&nbsp;</TD>
+  			<TD STYLE="background-color: #c0c0FF">&nbsp;[Packet Header]&nbsp;</TD>
+  			<TD STYLE="background-color: #c0c0FF">&nbsp;[Packet Data]&nbsp;</TD>
+  			<TD STYLE="background-color: #e0c0c0">&nbsp;[Packet Header]&nbsp;</TD>
+  			<TD STYLE="background-color: #e0c0c0">&nbsp;[Packet Data]&nbsp;</TD>
+  			<TD>...</TD>
+		</TR>
+	</TABLE>
+
+<H4>Packet Header</H4>
+	<UL>
+		Each captured packet starts with a header that contains the following values
+		(in network neutral order):
+
+		<FONT SIZE=-1>
+		<PRE>
+ uint32 tv_sec;  /* timestamp seconds */
+ uint32 tv_usec; /* timestamp microseconds */
+ uint32 caplen;  /* number of octets in the following packet */
+ uint32 len;     /* original length of packet on the wire */
+		</PRE>
+		</FONT>
+
+		<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3>
+			<TR>
+				<TD VALIGN=TOP>tv_sec</TD>
+				<TD>The date and time when this packet was captured.
+					This value is in seconds since January 1, 1970 00:00:00 GMT;
+					this is also known as a UN*X time_t. You can use the ANSI C
+					<em>time()</em> function from <em>time.h</em> to get this value,
+					but you might use a more optimized way to get this timestamp value.
+					If this timestamp isn't based on GMT (UTC), use <em>thiszone</em>
+					from the global header for adjustments.</TD>
+			</TR>
+			<TR>
+				<TD VALIGN=TOP>tv_usec</TD>
+				<TD>The microseconds when this packet was captured, as an offset to <em>ts_sec</em>.
+					<B>Beware: </B>this value must never reach 1 second (1,000,000),
+					in this case <em>ts_sec</em> must be increased instead!</TD>
+			</TR>
+			<TR>
+				<TD VALIGN=TOP>caplen</TD>
+				<TD>The number of bytes actually provided in the capture record.
+					This value should never become larger than <em>len</em> or the
+					<em>snaplen</em> value specified during the capture.</TD>
+			</TR>
+			<TR>
+				<TD VALIGN=TOP>len</TD>
+				<TD>The length of the packet "on the wire" when it was captured.
+					If <em>caplen</em> and <em>len</em> differ, the actually
+					saved packet size was limited by the value of <em>snaplen</em> specified
+					during one of the capture directives such as pcap_dispatch().</TD>
+			</TR>
+		</TABLE>
+	</UL>
+
+<H4>Packet Data</H4>
+	<UL>
+	The actual packet data will immediately follow the packet header as a sequence of <em>caplen</em> octets.
+	Depending on the DLT encoding number assigned to the interface, the packet data will contain an additional
+	custom header used to convey WAN port related information.
+	</UL>
+
+<H4>ACN Custom Packet Header</H4>
+	<UL>
+	PCAP, Wireshark and Tcpdump enhancements have been added to the ACN to support
+	monitoring of its ports, however each of these facilities were focused on capturing
+	and displaying traffic from LAN interfaces.  The SITA extentions to these facilities
+	are used to also provide the ability to capture, filter, and display information from
+	an ACN's WAN ports.
+	<P>
+	Although each packet follows the standard libpcap format, since there are
+	two types of interfaces that can be monitored, the format of the data
+	packet varies slightly.
+	<P>
+	<UL TYPE=DISC>
+		<LI>For Ethernet (like) devices, the packet format is unchanged from the standard Pcap format.
+		<LI>For WAN devices, the packet contains a 5 byte header that preceeds the actual captured data
+			described by the following table:
+	</UL>
+	<P>
+	<CENTER>
+	<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3>
+	<TR>	<TH>Octet</TH>
+			<TH>Name</TH>
+			<TH>Mask/Value</TH>
+			<TH COLSPAN=2>Definition</TH>		</TR>
+
+	<TR>	<TH VALIGN=TOP ALIGN=CENTER ROWSPAN=3>0</TH>
+			<TH VALIGN=TOP ALIGN=CENTER ROWSPAN=3>Control / Status</TH>
+
+			<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxxxxxx0</FONT></TD>
+			<TD>Transmitted by capture device</TD>
+			<TD ROWSPAN=2 ALIGN=CENTER>(see 'Errors' octets)</TD>							</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxxxxxx1</FONT></TD>
+			<TD>Received by capture device</TD>												</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">1xxxxxxx</FONT></TD>
+			<TD COLSPAN=2>No buffer was available during capture of previous packet.</TD>	</TR>
+
+	<TR>	<TH VALIGN=TOP ALIGN=CENTER ROWSPAN=8>1</TH>
+			<TH VALIGN=TOP ALIGN=CENTER ROWSPAN=8>Signals</TH>
+
+			<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxxxxxx1</FONT></TD>	<TD COLSPAN=2>DSR asserted</TD>		</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxxxxx1x</FONT></TD>	<TD COLSPAN=2>DTR asserted</TD>		</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxxxx1xx</FONT></TD>	<TD COLSPAN=2>CTS asserted</TD>		</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxxx1xxx</FONT></TD>	<TD COLSPAN=2>RTS asserted</TD>		</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxx1xxxx</FONT></TD>	<TD COLSPAN=2>DCD asserted</TD>		</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xx1xxxxx</FONT></TD>	<TD COLSPAN=2>Undefined</TD>		</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">x1xxxxxx</FONT></TD>	<TD COLSPAN=2>Undefined</TD>		</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">1xxxxxxx</FONT></TD>	<TD COLSPAN=2>Undefined</TD>		</TR>
+
+	<TR>	<TH VALIGN=TOP ALIGN=CENTER ROWSPAN=9>2</TH>
+			<TH VALIGN=TOP ALIGN=CENTER ROWSPAN=9>Errors<BR>(octet 1)</TH>
+
+			<TH>&nbsp;</TH>															<TH>Tx</TH>						<TH>Rx</TH>				</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxxxxxx1</FONT></TD>	<TD>Underrun</TD>				<TD>Framing</TD>		</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxxxxx1x</FONT></TD>	<TD>CTS Lost</TD>				<TD>Parity</TD>			</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxxxx1xx</FONT></TD>	<TD>UART Error</TD>				<TD>Collision</TD>		</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxxx1xxx</FONT></TD>	<TD>Re-Tx Limit Reached</TD>	<TD>Long Frame</TD>		</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxx1xxxx</FONT></TD>	<TD>Undefined</TD>				<TD>Short Frame</TD>	</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xx1xxxxx</FONT></TD>	<TD>Undefined</TD>				<TD>Undefined</TD>		</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">x1xxxxxx</FONT></TD>	<TD>Undefined</TD>				<TD>Undefined</TD>		</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">1xxxxxxx</FONT></TD>	<TD>Undefined</TD>				<TD>Undefined</TD>		</TR>
+
+	<TR>	<TH VALIGN=TOP ALIGN=CENTER ROWSPAN=9>3</TH>
+			<TH VALIGN=TOP ALIGN=CENTER ROWSPAN=9>Errors<BR>(octet 2)</TH>
+
+			<TH>&nbsp;</TH>															<TH>Tx</TH>			<TH>Rx</TH>						</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxxxxxx1</FONT></TD>	<TD>Undefined</TD>	<TD>Non-Octet Aligned</TD>		</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxxxxx1x</FONT></TD>	<TD>Undefined</TD>	<TD>Abort Received</TD>			</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxxxx1xx</FONT></TD>	<TD>Undefined</TD>	<TD>CD Lost</TD>				</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxxx1xxx</FONT></TD>	<TD>Undefined</TD>	<TD>Digital PLL Error</TD>		</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xxx1xxxx</FONT></TD>	<TD>Undefined</TD>	<TD>Overrun</TD>				</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">xx1xxxxx</FONT></TD>	<TD>Undefined</TD>	<TD>Frame Length Violation</TD>	</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">x1xxxxxx</FONT></TD>	<TD>Undefined</TD>	<TD>CRC Error</TD>				</TR>
+	<TR>	<TD VALIGN=TOP ALIGN=CENTER><FONT FACE="COURIER">1xxxxxxx</FONT></TD>	<TD>Undefined</TD>	<TD>Break Received</TD>			</TR>
+
+	<TR>	<TH VALIGN=TOP ALIGN=CENTER ROWSPAN=12>4</TH>
+			<TH VALIGN=TOP ALIGN=CENTER>Protocol</TH>
+
+			<TD COLSPAN=3>
+				<CENTER>
+				<TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>
+					<TR VALIGN=BOTTOM><TD ALIGN=CENTER>0x01</TD>	<TD>-</TD>	<TD>LAPB (BOP)				<SUP>&nbsp;</SUP>	</TD>	</TR>
+					<TR VALIGN=BOTTOM><TD ALIGN=CENTER>0x02</TD>	<TD>-</TD>	<TD>Ethernet				<SUP>1</SUP>		</TD>	</TR>
+					<TR VALIGN=BOTTOM><TD ALIGN=CENTER>0x03</TD>	<TD>-</TD>	<TD>Async (Interrupt IO)	<SUP>&nbsp;</SUP>	</TD>	</TR>
+					<TR VALIGN=BOTTOM><TD ALIGN=CENTER>0x04</TD>	<TD>-</TD>	<TD>Async (Block IO)		<SUP>&nbsp;</SUP>	</TD>	</TR>
+					<TR VALIGN=BOTTOM><TD ALIGN=CENTER>0x05</TD>	<TD>-</TD>	<TD>IPARS					<SUP>&nbsp;</SUP>	</TD>	</TR>
+					<TR VALIGN=BOTTOM><TD ALIGN=CENTER>0x06</TD>	<TD>-</TD>	<TD>UTS						<SUP>&nbsp;</SUP>	</TD>	</TR>
+					<TR VALIGN=BOTTOM><TD ALIGN=CENTER>0x07</TD>	<TD>-</TD>	<TD>PPP (HDLC)				<SUP>&nbsp;</SUP>	</TD>	</TR>
+					<TR VALIGN=BOTTOM><TD ALIGN=CENTER>0x08</TD>	<TD>-</TD>	<TD>SDLC					<SUP>&nbsp;</SUP>	</TD>	</TR>
+					<TR VALIGN=BOTTOM><TD ALIGN=CENTER>0x09</TD>	<TD>-</TD>	<TD>Token Ring				<SUP>1</SUP>		</TD>	</TR>
+					<TR VALIGN=BOTTOM><TD ALIGN=CENTER>0x10</TD>	<TD>-</TD>	<TD>I2C						<SUP>&nbsp;</SUP>	</TD>	</TR>
+					<TR VALIGN=BOTTOM><TD ALIGN=CENTER>0x11</TD>	<TD>-</TD>	<TD>DPM Link				<SUP>&nbsp;</SUP>	</TD>	</TR>
+					<TR VALIGN=BOTTOM><TD ALIGN=CENTER>0x12</TD>	<TD>-</TD>	<TD>Frame Relay (BOP)		<SUP>&nbsp;</SUP>	</TD>	</TR>
+				</TABLE>
+				</CENTER>
+				<P>
+				<STRONG>Note 1:</STRONG>
+				Ethernet and Token Ring frames will never be sent as DLT_SITA (with the 5 octet header),
+				but will be sent as their corresponding DLT types instead.
+			</TD>
+	</TR>
+	</TABLE>
+	</CENTER>
+</UL>
+<P>
+</UL>
+</UL>
diff --git a/pcap-snf.c b/pcap-snf.c
new file mode 100644
index 0000000..ee6ffa4
--- /dev/null
+++ b/pcap-snf.c
@@ -0,0 +1,330 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/param.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include <ctype.h>
+#include <netinet/in.h>
+#include <sys/mman.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <snf.h>
+
+#include "pcap-int.h"
+#include "pcap-snf.h"
+
+/*
+ * Private data for capturing on SNF devices.
+ */
+struct pcap_snf {
+	snf_handle_t snf_handle; /* opaque device handle */
+	snf_ring_t   snf_ring;   /* opaque device ring handle */
+        int          snf_timeout;
+        int          snf_boardnum;
+};
+
+static int
+snf_set_datalink(pcap_t *p, int dlt)
+{
+	p->linktype = dlt;
+	return (0);
+}
+
+static int
+snf_pcap_stats(pcap_t *p, struct pcap_stat *ps)
+{
+	struct snf_ring_stats stats;
+	int rc;
+
+	if ((rc = snf_ring_getstats(ps->snf_ring, &stats))) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "snf_get_stats: %s",
+			 pcap_strerror(rc));
+		return -1;
+	}
+	ps->ps_recv = stats.ring_pkt_recv + stats.ring_pkt_overflow;
+	ps->ps_drop = stats.ring_pkt_overflow;
+	ps->ps_ifdrop = stats.nic_pkt_overflow + stats.nic_pkt_bad;
+	return 0;
+}
+
+static void
+snf_platform_cleanup(pcap_t *p)
+{
+	struct pcap_snf *ps = p->priv;
+
+	if (p == NULL)
+		return;
+
+	snf_ring_close(ps->snf_ring);
+	snf_close(ps->snf_handle);
+	pcap_cleanup_live_common(p);
+}
+
+static int
+snf_getnonblock(pcap_t *p, char *errbuf)
+{
+	struct pcap_snf *ps = p->priv;
+
+	return (ps->snf_timeout == 0);
+}
+
+static int
+snf_setnonblock(pcap_t *p, int nonblock, char *errbuf)
+{
+	struct pcap_snf *ps = p->priv;
+
+	if (nonblock)
+		ps->snf_timeout = 0;
+	else {
+		if (p->opt.timeout <= 0)
+			ps->snf_timeout = -1; /* forever */
+		else
+			ps->snf_timeout = p->opt.timeout;
+	}
+	return (0);
+}
+
+#define _NSEC_PER_SEC 1000000000
+
+static inline
+struct timeval
+snf_timestamp_to_timeval(const int64_t ts_nanosec)
+{
+	struct timeval tv;
+	int32_t rem;
+	if (ts_nanosec == 0)
+		return (struct timeval) { 0, 0 };
+	tv.tv_sec = ts_nanosec / _NSEC_PER_SEC;
+	tv.tv_usec = (ts_nanosec % _NSEC_PER_SEC) / 1000;
+	return tv;
+}
+
+static int
+snf_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
+{
+	struct pcap_snf *ps = p->priv;
+	struct pcap_pkthdr hdr;
+	int i, flags, err, caplen, n;
+	struct snf_recv_req req;
+
+	if (!p || cnt == 0)
+		return -1;
+
+	n = 0;
+	while (n < cnt || PACKET_COUNT_IS_UNLIMITED(cnt)) {
+		/*
+		 * Has "pcap_breakloop()" been called?
+		 */
+		if (p->break_loop) {
+			if (n == 0) {
+				p->break_loop = 0;
+				return (-2);
+			} else {
+				return (n);
+			}
+		}
+
+		err = snf_ring_recv(ps->snf_ring, ps->snf_timeout, &req);
+
+		if (err) {
+			if (err == EBUSY || err == EAGAIN)
+				return (0);
+			if (err == EINTR)
+				continue;
+			if (err != 0) {
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "snf_read: %s",
+				 	 pcap_strerror(err));
+				return -1;
+			}
+		}
+
+		caplen = req.length;
+		if (caplen > p->snapshot)
+			caplen = p->snapshot;
+
+		if ((p->fcode.bf_insns == NULL) ||
+		     bpf_filter(p->fcode.bf_insns, req.pkt_addr, req.length, caplen)) {
+			hdr.ts = snf_timestamp_to_timeval(req.timestamp);
+			hdr.caplen = caplen;
+			hdr.len = req.length;
+			callback(user, &hdr, req.pkt_addr);
+		}
+		n++;
+	}
+	return (n);
+}
+
+static int
+snf_setfilter(pcap_t *p, struct bpf_program *fp)
+{
+	if (!p)
+		return -1;
+	if (!fp) {
+		strncpy(p->errbuf, "setfilter: No filter specified",
+			sizeof(p->errbuf));
+		return -1;
+	}
+
+	/* Make our private copy of the filter */
+
+	if (install_bpf_program(p, fp) < 0)
+		return -1;
+
+	return (0);
+}
+
+static int
+snf_inject(pcap_t *p, const void *buf _U_, size_t size _U_)
+{
+	strlcpy(p->errbuf, "Sending packets isn't supported with snf",
+	    PCAP_ERRBUF_SIZE);
+	return (-1);
+}
+
+static int
+snf_activate(pcap_t* p)
+{
+	struct pcap_snf *ps = p->priv;
+	char *device = p->opt.source;
+	const char *nr = NULL;
+	int err;
+	int flags = 0;
+
+	if (device == NULL) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+			 "device is NULL: %s", pcap_strerror(errno));
+		return -1;
+	}
+
+	/* In Libpcap, we set pshared by default if NUM_RINGS is set to > 1.
+	 * Since libpcap isn't thread-safe */
+	if ((nr = getenv("SNF_NUM_RINGS")) && *nr && atoi(nr) > 1)
+		flags |= SNF_F_PSHARED;
+	else
+		nr = NULL;
+
+	err = snf_open(ps->snf_boardnum,
+			0, /* let SNF API parse SNF_NUM_RINGS, if set */
+			NULL, /* default RSS, or use SNF_RSS_FLAGS env */
+			0, /* default to SNF_DATARING_SIZE from env */
+			flags, /* may want pshared */
+			&ps->snf_handle);
+	if (err != 0) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+			 "snf_open failed: %s", pcap_strerror(err));
+		return -1;
+	}
+
+	err = snf_ring_open(ps->snf_handle, &ps->snf_ring);
+	if (err != 0) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+			 "snf_ring_open failed: %s", pcap_strerror(err));
+		return -1;
+	}
+
+	if (p->opt.timeout <= 0)
+		ps->snf_timeout = -1;
+	else
+		ps->snf_timeout = p->opt.timeout;
+
+	err = snf_start(ps->snf_handle);
+	if (err != 0) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+			 "snf_start failed: %s", pcap_strerror(err));
+		return -1;
+	}
+
+	/*
+	 * "select()" and "poll()" don't work on snf descriptors.
+	 */
+	p->selectable_fd = -1;
+	p->linktype = DLT_EN10MB;
+	p->read_op = snf_read;
+	p->inject_op = snf_inject;
+	p->setfilter_op = snf_setfilter;
+	p->setdirection_op = NULL; /* Not implemented.*/
+	p->set_datalink_op = snf_set_datalink;
+	p->getnonblock_op = snf_getnonblock;
+	p->setnonblock_op = snf_setnonblock;
+	p->stats_op = snf_pcap_stats;
+	p->cleanup_op = snf_platform_cleanup;
+	return 0;
+}
+
+int
+snf_findalldevs(pcap_if_t **devlistp, char *errbuf)
+{
+	/*
+	 * There are no platform-specific devices since each device
+	 * exists as a regular Ethernet device.
+	 */
+	return 0;
+}
+
+pcap_t *
+snf_create(const char *device, char *ebuf, int *is_ours)
+{
+	pcap_t *p;
+	int boardnum = -1;
+	struct snf_ifaddrs *ifaddrs, *ifa;
+	size_t devlen;
+	struct pcap_snf *ps;
+
+	if (snf_init(SNF_VERSION_API)) {
+		/* Can't initialize the API, so no SNF devices */
+		*is_ours = 0;
+		return NULL;
+	}
+
+	/*
+	 * Match a given interface name to our list of interface names, from
+	 * which we can obtain the intended board number
+	 */
+	if (snf_getifaddrs(&ifaddrs) || ifaddrs == NULL) {
+		/* Can't get SNF addresses */
+		*is_ours = 0;
+		return NULL;
+	}
+	devlen = strlen(device) + 1;
+	ifa = ifaddrs;
+	while (ifa) {
+		if (!strncmp(device, ifa->snf_ifa_name, devlen)) {
+			boardnum = ifa->snf_ifa_boardnum;
+			break;
+		}
+		ifa = ifa->snf_ifa_next;
+	}
+	snf_freeifaddrs(ifaddrs);
+
+	if (ifa == NULL) {
+		/*
+		 * If we can't find the device by name, support the name "snfX"
+		 * and "snf10gX" where X is the board number.
+		 */
+		if (sscanf(device, "snf10g%d", &boardnum) != 1 &&
+		    sscanf(device, "snf%d", &boardnum) != 1) {
+			/* Nope, not a supported name */
+			*is_ours = 0;
+			return NULL;
+		    }
+	}
+
+	/* OK, it's probably ours. */
+	*is_ours = 1;
+
+	p = pcap_create_common(device, ebuf, sizeof (struct pcap_snf));
+	if (p == NULL)
+		return NULL;
+	ps = p->priv;
+
+	p->activate_op = snf_activate;
+	ps->snf_boardnum = boardnum;
+	return p;
+}
diff --git a/pcap-snf.h b/pcap-snf.h
new file mode 100644
index 0000000..c9d7722
--- /dev/null
+++ b/pcap-snf.h
@@ -0,0 +1,2 @@
+pcap_t *snf_create(const char *, char *, int *);
+int snf_findalldevs(pcap_if_t **devlistp, char *errbuf);
diff --git a/pcap-snit.c b/pcap-snit.c
index 60abe64..12656b8 100644
--- a/pcap-snit.c
+++ b/pcap-snit.c
@@ -25,7 +25,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/pcap-snit.c,v 1.72.2.1 2005/05/03 18:54:38 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/pcap-snit.c,v 1.77 2008-04-14 20:40:58 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -84,9 +84,17 @@
 /* Forwards */
 static int nit_setflags(int, int, int, char *);
 
+/*
+ * Private data for capturing on STREAMS NIT devices.
+ */
+struct pcap_snit {
+	struct pcap_stat stat;
+};
+
 static int
 pcap_stats_snit(pcap_t *p, struct pcap_stat *ps)
 {
+	struct pcap_snit *psn = p->priv;
 
 	/*
 	 * "ps_recv" counts packets handed to the filter, not packets
@@ -105,15 +113,15 @@
 	 * kernel by libpcap or packets not yet read from libpcap by the
 	 * application.
 	 */
-	*ps = p->md.stat;
+	*ps = psn->stat;
 	return (0);
 }
 
 static int
 pcap_read_snit(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
 {
+	struct pcap_snit *psn = p->priv;
 	register int cc, n;
-	register struct bpf_insn *fcode = p->fcode.bf_insns;
 	register u_char *bp, *cp, *ep;
 	register struct nit_bufhdr *hdrp;
 	register struct nit_iftime *ntp;
@@ -161,7 +169,7 @@
 			}
 		}
 
-		++p->md.stat.ps_recv;
+		++psn->stat.ps_recv;
 		cp = bp;
 
 		/* get past NIT buffer  */
@@ -173,7 +181,7 @@
 		cp += sizeof(*ntp);
 
 		ndp = (struct nit_ifdrops *)cp;
-		p->md.stat.ps_drop = ndp->nh_drops;
+		psn->stat.ps_drop = ndp->nh_drops;
 		cp += sizeof *ndp;
 
 		/* get past packet len  */
@@ -187,13 +195,13 @@
 		if (caplen > p->snapshot)
 			caplen = p->snapshot;
 
-		if (bpf_filter(fcode, cp, nlp->nh_pktlen, caplen)) {
+		if (bpf_filter(p->fcode.bf_insns, cp, nlp->nh_pktlen, caplen)) {
 			struct pcap_pkthdr h;
 			h.ts = ntp->nh_timestamp;
 			h.len = nlp->nh_pktlen;
 			h.caplen = caplen;
 			(*callback)(user, &h, cp);
-			if (++n >= cnt && cnt >= 0) {
+			if (++n >= cnt && !PACKET_COUNT_IS_UNLIMITED(cnt)) {
 				p->cc = ep - bp;
 				p->bp = bp;
 				return (n);
@@ -228,63 +236,77 @@
 }
 
 static int
-nit_setflags(int fd, int promisc, int to_ms, char *ebuf)
+nit_setflags(pcap_t *p)
 {
 	bpf_u_int32 flags;
 	struct strioctl si;
+	u_int zero = 0;
 	struct timeval timeout;
 
+	if (p->opt.immediate) {
+		/*
+		 * Set the chunk size to zero, so that chunks get sent
+		 * up immediately.
+		 */
+		si.ic_cmd = NIOCSCHUNK;
+		si.ic_len = sizeof(zero);
+		si.ic_dp = (char *)&zero;
+		if (ioctl(p->fd, I_STR, (char *)&si) < 0) {
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCSCHUNK: %s",
+			    pcap_strerror(errno));
+			return (-1);
+		}
+	}
 	si.ic_timout = INFTIM;
-	if (to_ms != 0) {
-		timeout.tv_sec = to_ms / 1000;
-		timeout.tv_usec = (to_ms * 1000) % 1000000;
+	if (p->opt.timeout != 0) {
+		timeout.tv_sec = p->opt.timeout / 1000;
+		timeout.tv_usec = (p->opt.timeout * 1000) % 1000000;
 		si.ic_cmd = NIOCSTIME;
 		si.ic_len = sizeof(timeout);
 		si.ic_dp = (char *)&timeout;
-		if (ioctl(fd, I_STR, (char *)&si) < 0) {
-			snprintf(ebuf, PCAP_ERRBUF_SIZE, "NIOCSTIME: %s",
+		if (ioctl(p->fd, I_STR, (char *)&si) < 0) {
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCSTIME: %s",
 			    pcap_strerror(errno));
 			return (-1);
 		}
 	}
 	flags = NI_TIMESTAMP | NI_LEN | NI_DROPS;
-	if (promisc)
+	if (p->opt.promisc)
 		flags |= NI_PROMISC;
 	si.ic_cmd = NIOCSFLAGS;
 	si.ic_len = sizeof(flags);
 	si.ic_dp = (char *)&flags;
-	if (ioctl(fd, I_STR, (char *)&si) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "NIOCSFLAGS: %s",
+	if (ioctl(p->fd, I_STR, (char *)&si) < 0) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCSFLAGS: %s",
 		    pcap_strerror(errno));
 		return (-1);
 	}
 	return (0);
 }
 
-pcap_t *
-pcap_open_live(const char *device, int snaplen, int promisc, int to_ms,
-    char *ebuf)
+static int
+pcap_activate_snit(pcap_t *p)
 {
 	struct strioctl si;		/* struct for ioctl() */
 	struct ifreq ifr;		/* interface request struct */
 	int chunksize = CHUNKSIZE;
 	int fd;
 	static char dev[] = "/dev/nit";
-	register pcap_t *p;
 
-	p = (pcap_t *)malloc(sizeof(*p));
-	if (p == NULL) {
-		strlcpy(ebuf, pcap_strerror(errno), PCAP_ERRBUF_SIZE);
-		return (NULL);
+	if (p->opt.rfmon) {
+		/*
+		 * No monitor mode on SunOS 4.x (no Wi-Fi devices on
+		 * hardware supported by SunOS 4.x).
+		 */
+		return (PCAP_ERROR_RFMON_NOTSUP);
 	}
 
-	if (snaplen < 96)
+	if (p->snapshot < 96)
 		/*
 		 * NIT requires a snapshot length of at least 96.
 		 */
-		snaplen = 96;
+		p->snapshot = 96;
 
-	memset(p, 0, sizeof(*p));
 	/*
 	 * Initially try a read/write open (to allow the inject
 	 * method to work).  If that fails due to permission
@@ -303,19 +325,19 @@
 	if (fd < 0 && errno == EACCES)
 		p->fd = fd = open(dev, O_RDONLY);
 	if (fd < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "%s: %s", dev,
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "%s: %s", dev,
 		    pcap_strerror(errno));
 		goto bad;
 	}
 
 	/* arrange to get discrete messages from the STREAM and use NIT_BUF */
 	if (ioctl(fd, I_SRDOPT, (char *)RMSGD) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "I_SRDOPT: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "I_SRDOPT: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
 	if (ioctl(fd, I_PUSH, "nbuf") < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "push nbuf: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "push nbuf: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
@@ -325,34 +347,33 @@
 	si.ic_len = sizeof(chunksize);
 	si.ic_dp = (char *)&chunksize;
 	if (ioctl(fd, I_STR, (char *)&si) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "NIOCSCHUNK: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCSCHUNK: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
 
 	/* request the interface */
-	strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));
+	strncpy(ifr.ifr_name, p->opt.source, sizeof(ifr.ifr_name));
 	ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0';
 	si.ic_cmd = NIOCBIND;
 	si.ic_len = sizeof(ifr);
 	si.ic_dp = (char *)&ifr;
 	if (ioctl(fd, I_STR, (char *)&si) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "NIOCBIND: %s: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCBIND: %s: %s",
 			ifr.ifr_name, pcap_strerror(errno));
 		goto bad;
 	}
 
 	/* set the snapshot length */
 	si.ic_cmd = NIOCSSNAP;
-	si.ic_len = sizeof(snaplen);
-	si.ic_dp = (char *)&snaplen;
+	si.ic_len = sizeof(p->snapshot);
+	si.ic_dp = (char *)&p->snapshot;
 	if (ioctl(fd, I_STR, (char *)&si) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "NIOCSSNAP: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "NIOCSSNAP: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
-	p->snapshot = snaplen;
-	if (nit_setflags(p->fd, promisc, to_ms, ebuf) < 0)
+	if (nit_setflags(p) < 0)
 		goto bad;
 
 	(void)ioctl(fd, I_FLUSH, (char *)FLUSHR);
@@ -364,7 +385,7 @@
 	p->bufsize = BUFSPACE;
 	p->buffer = (u_char *)malloc(p->bufsize);
 	if (p->buffer == NULL) {
-		strlcpy(ebuf, pcap_strerror(errno), PCAP_ERRBUF_SIZE);
+		strlcpy(p->errbuf, pcap_strerror(errno), PCAP_ERRBUF_SIZE);
 		goto bad;
 	}
 
@@ -402,14 +423,24 @@
 	p->getnonblock_op = pcap_getnonblock_fd;
 	p->setnonblock_op = pcap_setnonblock_fd;
 	p->stats_op = pcap_stats_snit;
-	p->close_op = pcap_close_common;
 
-	return (p);
+	return (0);
  bad:
-	if (fd >= 0)
-		close(fd);
-	free(p);
-	return (NULL);
+	pcap_cleanup_live_common(p);
+	return (PCAP_ERROR);
+}
+
+pcap_t *
+pcap_create_interface(const char *device, char *ebuf)
+{
+	pcap_t *p;
+
+	p = pcap_create_common(device, ebuf, sizeof (struct pcap_snit));
+	if (p == NULL)
+		return (NULL);
+
+	p->activate_op = pcap_activate_snit;
+	return (p);
 }
 
 int
diff --git a/pcap-snoop.c b/pcap-snoop.c
index f6425f1..a49db87 100644
--- a/pcap-snoop.c
+++ b/pcap-snoop.c
@@ -20,7 +20,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/pcap-snoop.c,v 1.54.2.1 2005/05/03 18:54:38 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/pcap-snoop.c,v 1.59 2008-12-02 16:25:14 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -58,9 +58,17 @@
 #include "os-proto.h"
 #endif
 
+/*
+ * Private data for capturing on snoop devices.
+ */
+struct pcap_snoop {
+	struct pcap_stat stat;
+};
+
 static int
 pcap_read_snoop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
 {
+	struct pcap_snoop *psn = p->priv;
 	int cc;
 	register struct snoopheader *sh;
 	register u_int datalen;
@@ -124,7 +132,7 @@
 	if (p->fcode.bf_insns == NULL ||
 	    bpf_filter(p->fcode.bf_insns, cp, datalen, caplen)) {
 		struct pcap_pkthdr h;
-		++p->md.stat.ps_recv;
+		++psn->stat.ps_recv;
 		h.ts.tv_sec = sh->snoop_timestamp.tv_sec;
 		h.ts.tv_usec = sh->snoop_timestamp.tv_usec;
 		h.len = datalen;
@@ -156,6 +164,7 @@
 static int
 pcap_stats_snoop(pcap_t *p, struct pcap_stat *ps)
 {
+	struct pcap_snoop *psn = p->priv;
 	register struct rawstats *rs;
 	struct rawstats rawstats;
 
@@ -180,7 +189,7 @@
 	 * rather than just this socket?  If not, why does it have
 	 * both Snoop and Drain statistics?
 	 */
-	p->md.stat.ps_drop =
+	psn->stat.ps_drop =
 	    rs->rs_snoop.ss_ifdrops + rs->rs_snoop.ss_sbdrops +
 	    rs->rs_drain.ds_ifdrops + rs->rs_drain.ds_sbdrops;
 
@@ -189,14 +198,13 @@
 	 * As filtering is done in userland, this does not include
 	 * packets dropped because we ran out of buffer space.
 	 */
-	*ps = p->md.stat;
+	*ps = psn->stat;
 	return (0);
 }
 
 /* XXX can't disable promiscuous */
-pcap_t *
-pcap_open_live(const char *device, int snaplen, int promisc, int to_ms,
-    char *ebuf)
+static int
+pcap_activate_snoop(pcap_t *p)
 {
 	int fd;
 	struct sockaddr_raw sr;
@@ -204,55 +212,50 @@
 	u_int v;
 	int ll_hdrlen;
 	int snooplen;
-	pcap_t *p;
 	struct ifreq ifr;
 
-	p = (pcap_t *)malloc(sizeof(*p));
-	if (p == NULL) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s",
-		    pcap_strerror(errno));
-		return (NULL);
-	}
-	memset(p, 0, sizeof(*p));
 	fd = socket(PF_RAW, SOCK_RAW, RAWPROTO_SNOOP);
 	if (fd < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "snoop socket: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "snoop socket: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
 	p->fd = fd;
 	memset(&sr, 0, sizeof(sr));
 	sr.sr_family = AF_RAW;
-	(void)strncpy(sr.sr_ifname, device, sizeof(sr.sr_ifname));
+	(void)strncpy(sr.sr_ifname, p->opt.source, sizeof(sr.sr_ifname));
 	if (bind(fd, (struct sockaddr *)&sr, sizeof(sr))) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "snoop bind: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "snoop bind: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
 	memset(&sf, 0, sizeof(sf));
 	if (ioctl(fd, SIOCADDSNOOP, &sf) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "SIOCADDSNOOP: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "SIOCADDSNOOP: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
-	v = 64 * 1024;
+	if (p->opt.buffer_size != 0)
+		v = p->opt.buffer_size;
+	else
+		v = 64 * 1024;	/* default to 64K buffer size */
 	(void)setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *)&v, sizeof(v));
 	/*
 	 * XXX hack - map device name to link layer type
 	 */
-	if (strncmp("et", device, 2) == 0 ||	/* Challenge 10 Mbit */
-	    strncmp("ec", device, 2) == 0 ||	/* Indigo/Indy 10 Mbit,
-						   O2 10/100 */
-	    strncmp("ef", device, 2) == 0 ||	/* O200/2000 10/100 Mbit */
-	    strncmp("eg", device, 2) == 0 ||	/* Octane/O2xxx/O3xxx Gigabit */
-	    strncmp("gfe", device, 3) == 0 ||	/* GIO 100 Mbit */
-	    strncmp("fxp", device, 3) == 0 ||	/* Challenge VME Enet */
-	    strncmp("ep", device, 2) == 0 ||	/* Challenge 8x10 Mbit EPLEX */
-	    strncmp("vfe", device, 3) == 0 ||	/* Challenge VME 100Mbit */
-	    strncmp("fa", device, 2) == 0 ||
-	    strncmp("qaa", device, 3) == 0 ||
-	    strncmp("cip", device, 3) == 0 ||
-	    strncmp("el", device, 2) == 0) {
+	if (strncmp("et", p->opt.source, 2) == 0 ||	/* Challenge 10 Mbit */
+	    strncmp("ec", p->opt.source, 2) == 0 ||	/* Indigo/Indy 10 Mbit,
+							   O2 10/100 */
+	    strncmp("ef", p->opt.source, 2) == 0 ||	/* O200/2000 10/100 Mbit */
+	    strncmp("eg", p->opt.source, 2) == 0 ||	/* Octane/O2xxx/O3xxx Gigabit */
+	    strncmp("gfe", p->opt.source, 3) == 0 ||	/* GIO 100 Mbit */
+	    strncmp("fxp", p->opt.source, 3) == 0 ||	/* Challenge VME Enet */
+	    strncmp("ep", p->opt.source, 2) == 0 ||	/* Challenge 8x10 Mbit EPLEX */
+	    strncmp("vfe", p->opt.source, 3) == 0 ||	/* Challenge VME 100Mbit */
+	    strncmp("fa", p->opt.source, 2) == 0 ||
+	    strncmp("qaa", p->opt.source, 3) == 0 ||
+	    strncmp("cip", p->opt.source, 3) == 0 ||
+	    strncmp("el", p->opt.source, 2) == 0) {
 		p->linktype = DLT_EN10MB;
 		p->offset = RAW_HDRPAD(sizeof(struct ether_header));
 		ll_hdrlen = sizeof(struct ether_header);
@@ -285,29 +288,38 @@
 			p->dlt_list[1] = DLT_DOCSIS;
 			p->dlt_count = 2;
 		}
-	} else if (strncmp("ipg", device, 3) == 0 ||
-		   strncmp("rns", device, 3) == 0 ||	/* O2/200/2000 FDDI */
-		   strncmp("xpi", device, 3) == 0) {
+	} else if (strncmp("ipg", p->opt.source, 3) == 0 ||
+		   strncmp("rns", p->opt.source, 3) == 0 ||	/* O2/200/2000 FDDI */
+		   strncmp("xpi", p->opt.source, 3) == 0) {
 		p->linktype = DLT_FDDI;
 		p->offset = 3;				/* XXX yeah? */
 		ll_hdrlen = 13;
-	} else if (strncmp("ppp", device, 3) == 0) {
+	} else if (strncmp("ppp", p->opt.source, 3) == 0) {
 		p->linktype = DLT_RAW;
 		ll_hdrlen = 0;	/* DLT_RAW meaning "no PPP header, just the IP packet"? */
-	} else if (strncmp("qfa", device, 3) == 0) {
+	} else if (strncmp("qfa", p->opt.source, 3) == 0) {
 		p->linktype = DLT_IP_OVER_FC;
 		ll_hdrlen = 24;
-	} else if (strncmp("pl", device, 2) == 0) {
+	} else if (strncmp("pl", p->opt.source, 2) == 0) {
 		p->linktype = DLT_RAW;
 		ll_hdrlen = 0;	/* Cray UNICOS/mp pseudo link */
-	} else if (strncmp("lo", device, 2) == 0) {
+	} else if (strncmp("lo", p->opt.source, 2) == 0) {
 		p->linktype = DLT_NULL;
 		ll_hdrlen = 4;
 	} else {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE,
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
 		    "snoop: unknown physical layer type");
 		goto bad;
 	}
+
+	if (p->opt.rfmon) {
+		/*
+		 * No monitor mode on Irix (no Wi-Fi devices on
+		 * hardware supported by Irix).
+		 */
+		return (PCAP_ERROR_RFMON_NOTSUP);
+	}
+
 #ifdef SIOCGIFMTU
 	/*
 	 * XXX - IRIX appears to give you an error if you try to set the
@@ -315,9 +327,9 @@
 	 * the MTU first and, if that succeeds, trim the snap length
 	 * to be no greater than the MTU.
 	 */
-	(void)strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));
+	(void)strncpy(ifr.ifr_name, p->opt.source, sizeof(ifr.ifr_name));
 	if (ioctl(fd, SIOCGIFMTU, (char *)&ifr) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "SIOCGIFMTU: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "SIOCGIFMTU: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
@@ -338,8 +350,8 @@
 #ifndef ifr_mtu
 #define ifr_mtu	ifr_metric
 #endif
-	if (snaplen > ifr.ifr_mtu + ll_hdrlen)
-		snaplen = ifr.ifr_mtu + ll_hdrlen;
+	if (p->snapshot > ifr.ifr_mtu + ll_hdrlen)
+		p->snapshot = ifr.ifr_mtu + ll_hdrlen;
 #endif
 
 	/*
@@ -347,18 +359,17 @@
 	 * payload bytes to capture - it doesn't count link-layer
 	 * header bytes.
 	 */
-	snooplen = snaplen - ll_hdrlen;
+	snooplen = p->snapshot - ll_hdrlen;
 	if (snooplen < 0)
 		snooplen = 0;
 	if (ioctl(fd, SIOCSNOOPLEN, &snooplen) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "SIOCSNOOPLEN: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "SIOCSNOOPLEN: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
-	p->snapshot = snaplen;
 	v = 1;
 	if (ioctl(fd, SIOCSNOOPING, &v) < 0) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "SIOCSNOOPING: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "SIOCSNOOPING: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
@@ -366,7 +377,7 @@
 	p->bufsize = 4096;				/* XXX */
 	p->buffer = (u_char *)malloc(p->bufsize);
 	if (p->buffer == NULL) {
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s",
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "malloc: %s",
 		    pcap_strerror(errno));
 		goto bad;
 	}
@@ -384,18 +395,24 @@
 	p->getnonblock_op = pcap_getnonblock_fd;
 	p->setnonblock_op = pcap_setnonblock_fd;
 	p->stats_op = pcap_stats_snoop;
-	p->close_op = pcap_close_common;
 
-	return (p);
+	return (0);
  bad:
-	(void)close(fd);
-	/*
-	 * Get rid of any link-layer type list we allocated.
-	 */
-	if (p->dlt_list != NULL)
-		free(p->dlt_list);
-	free(p);
-	return (NULL);
+	pcap_cleanup_live_common(p);
+	return (PCAP_ERROR);
+}
+
+pcap_t *
+pcap_create_interface(const char *device, char *ebuf)
+{
+	pcap_t *p;
+
+	p = pcap_create_common(device, ebuf, sizeof (struct pcap_snoop));
+	if (p == NULL)
+		return (NULL);
+
+	p->activate_op = pcap_activate_snoop;
+	return (p);
 }
 
 int
diff --git a/pcap-stdinc.h b/pcap-stdinc.h
index 1281024..f1c736e 100644
--- a/pcap-stdinc.h
+++ b/pcap-stdinc.h
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2002 - 2003
- * NetGroup, Politecnico di Torino (Italy)
+ * Copyright (c) 2002 - 2005 NetGroup, Politecnico di Torino (Italy)
+ * Copyright (c) 2005 - 2009 CACE Technologies, Inc. Davis (California)
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -28,14 +28,10 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
+ * @(#) $Header: /tcpdump/master/libpcap/pcap-stdinc.h,v 1.10.2.1 2008-10-06 15:38:39 gianluca Exp $ (LBL)
  */
-
-#define SIZEOF_CHAR 1
-#define SIZEOF_SHORT 2
-#define SIZEOF_INT 4
-#ifndef _MSC_EXTENSIONS
-#define SIZEOF_LONG_LONG 8
-#endif
+#ifndef pcap_stdinc_h
+#define pcap_stdinc_h
 
 /*
  * Avoids a compiler warning in case this was already defined      
@@ -59,6 +55,35 @@
 
 #define caddr_t char*
 
+#if _MSC_VER < 1500
 #define snprintf _snprintf
 #define vsnprintf _vsnprintf
+#define strdup _strdup
+#endif
+
 #define inline __inline 
+
+#ifdef __MINGW32__
+#include <stdint.h>
+#else /*__MINGW32__*/
+/* MSVC compiler */
+#ifndef _UINTPTR_T_DEFINED
+#ifdef  _WIN64
+typedef unsigned __int64    uintptr_t;
+#else
+typedef _W64 unsigned int   uintptr_t;
+#endif
+#define _UINTPTR_T_DEFINED
+#endif
+
+#ifndef _INTPTR_T_DEFINED
+#ifdef  _WIN64
+typedef __int64    intptr_t;
+#else
+typedef _W64 int   intptr_t;
+#endif
+#define _INTPTR_T_DEFINED
+#endif 
+
+#endif /*__MINGW32__*/
+#endif /* pcap_stdinc_h */
diff --git a/pcap-tstamp.manmisc.in b/pcap-tstamp.manmisc.in
new file mode 100644
index 0000000..2cd32c6
--- /dev/null
+++ b/pcap-tstamp.manmisc.in
@@ -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)
diff --git a/pcap-usb-linux.c b/pcap-usb-linux.c
new file mode 100644
index 0000000..f0892a7
--- /dev/null
+++ b/pcap-usb-linux.c
@@ -0,0 +1,932 @@
+/*
+ * Copyright (c) 2006 Paolo Abeni (Italy)
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+ * OWNER 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.
+ *
+ * USB sniffing API implementation for Linux platform
+ * By Paolo Abeni <paolo.abeni@email.it>
+ * Modifications: Kris Katterjohn <katterjohn@gmail.com>
+ *
+ */
+#ifndef lint
+static const char rcsid[] _U_ =
+    "@(#) $Header: /tcpdump/master/libpcap/pcap-usb-linux.c,v 1.33 2008-12-23 21:38:50 guy Exp $ (LBL)";
+#endif
+ 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcap-int.h"
+#include "pcap-usb-linux.h"
+#include "pcap/usb.h"
+
+#ifdef NEED_STRERROR_H
+#include "strerror.h"
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <dirent.h>
+#include <byteswap.h>
+#include <netinet/in.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#ifdef HAVE_LINUX_USBDEVICE_FS_H
+/*
+ * We might need <linux/compiler.h> to define __user for
+ * <linux/usbdevice_fs.h>.
+ */
+#ifdef HAVE_LINUX_COMPILER_H
+#include <linux/compiler.h>
+#endif /* HAVE_LINUX_COMPILER_H */
+#include <linux/usbdevice_fs.h>
+#endif /* HAVE_LINUX_USBDEVICE_FS_H */
+
+#define USB_IFACE "usbmon"
+#define USB_TEXT_DIR_OLD "/sys/kernel/debug/usbmon"
+#define USB_TEXT_DIR "/sys/kernel/debug/usb/usbmon"
+#define SYS_USB_BUS_DIR "/sys/bus/usb/devices"
+#define PROC_USB_BUS_DIR "/proc/bus/usb"
+#define USB_LINE_LEN 4096
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define htols(s) s
+#define htoll(l) l
+#define htol64(ll) ll
+#else
+#define htols(s) bswap_16(s)
+#define htoll(l) bswap_32(l)
+#define htol64(ll) bswap_64(ll)
+#endif
+
+struct mon_bin_stats {
+	u_int32_t queued;
+	u_int32_t dropped;
+};
+
+struct mon_bin_get {
+	pcap_usb_header *hdr;
+	void *data;
+	size_t data_len;   /* Length of data (can be zero) */
+};
+
+struct mon_bin_mfetch {
+	int32_t *offvec;   /* Vector of events fetched */
+	int32_t nfetch;    /* Number of events to fetch (out: fetched) */
+	int32_t nflush;    /* Number of events to flush */
+};
+
+#define MON_IOC_MAGIC 0x92
+
+#define MON_IOCQ_URB_LEN _IO(MON_IOC_MAGIC, 1)
+#define MON_IOCX_URB  _IOWR(MON_IOC_MAGIC, 2, struct mon_bin_hdr)
+#define MON_IOCG_STATS _IOR(MON_IOC_MAGIC, 3, struct mon_bin_stats)
+#define MON_IOCT_RING_SIZE _IO(MON_IOC_MAGIC, 4)
+#define MON_IOCQ_RING_SIZE _IO(MON_IOC_MAGIC, 5)
+#define MON_IOCX_GET   _IOW(MON_IOC_MAGIC, 6, struct mon_bin_get)
+#define MON_IOCX_MFETCH _IOWR(MON_IOC_MAGIC, 7, struct mon_bin_mfetch)
+#define MON_IOCH_MFLUSH _IO(MON_IOC_MAGIC, 8)
+
+#define MON_BIN_SETUP 	0x1 /* setup hdr is present*/
+#define MON_BIN_SETUP_ZERO 	0x2 /* setup buffer is not available */
+#define MON_BIN_DATA_ZERO 	0x4 /* data buffer is not available */
+#define MON_BIN_ERROR 	0x8
+
+/*
+ * Private data for capturing on Linux USB.
+ */
+struct pcap_usb_linux {
+	u_char *mmapbuf;	/* memory-mapped region pointer */
+	size_t mmapbuflen;	/* size of region */
+	int bus_index;
+	u_int packets_read;
+};
+
+/* forward declaration */
+static int usb_activate(pcap_t *);
+static int usb_stats_linux(pcap_t *, struct pcap_stat *);
+static int usb_stats_linux_bin(pcap_t *, struct pcap_stat *);
+static int usb_read_linux(pcap_t *, int , pcap_handler , u_char *);
+static int usb_read_linux_bin(pcap_t *, int , pcap_handler , u_char *);
+static int usb_read_linux_mmap(pcap_t *, int , pcap_handler , u_char *);
+static int usb_inject_linux(pcap_t *, const void *, size_t);
+static int usb_setdirection_linux(pcap_t *, pcap_direction_t);
+static void usb_cleanup_linux_mmap(pcap_t *);
+
+/* facility to add an USB device to the device list*/
+static int 
+usb_dev_add(pcap_if_t** alldevsp, int n, char *err_str)
+{
+	char dev_name[10];
+	char dev_descr[30]; 
+	snprintf(dev_name, 10, USB_IFACE"%d", n);
+	snprintf(dev_descr, 30, "USB bus number %d", n);
+
+	if (pcap_add_if(alldevsp, dev_name, 0, 
+	    dev_descr, err_str) < 0)
+		return -1;
+	return 0; 
+}
+
+int 
+usb_findalldevs(pcap_if_t **alldevsp, char *err_str)
+{
+	struct dirent* data;
+	int ret = 0;
+	DIR* dir;
+	int n;
+	char* name;
+	size_t len;
+
+	/* try scanning sysfs usb bus directory */
+	dir = opendir(SYS_USB_BUS_DIR);
+	if (dir != NULL) {
+		while ((ret == 0) && ((data = readdir(dir)) != 0)) {
+			name = data->d_name;
+
+			if (strncmp(name, "usb", 3) != 0)
+				continue;
+
+			if (sscanf(&name[3], "%d", &n) == 0) 
+				continue;
+
+			ret = usb_dev_add(alldevsp, n, err_str);
+		}
+
+		closedir(dir);
+		return ret;
+	}
+
+	/* that didn't work; try scanning procfs usb bus directory */
+	dir = opendir(PROC_USB_BUS_DIR);
+	if (dir != NULL) {
+		while ((ret == 0) && ((data = readdir(dir)) != 0)) {
+			name = data->d_name;
+			len = strlen(name);
+
+			/* if this file name does not end with a number it's not of our interest */
+			if ((len < 1) || !isdigit(name[--len]))
+				continue;
+			while (isdigit(name[--len]));
+			if (sscanf(&name[len+1], "%d", &n) != 1) 
+				continue;
+
+			ret = usb_dev_add(alldevsp, n, err_str);
+		}
+
+		closedir(dir);
+		return ret;
+	}
+
+	/* neither of them worked */
+	return 0;
+}
+
+static 
+int usb_mmap(pcap_t* handle)
+{
+	struct pcap_usb_linux *handlep = handle->priv;
+	int len = ioctl(handle->fd, MON_IOCQ_RING_SIZE);
+	if (len < 0) 
+		return 0;
+
+	handlep->mmapbuflen = len;
+	handlep->mmapbuf = mmap(0, handlep->mmapbuflen, PROT_READ,
+	    MAP_SHARED, handle->fd, 0);
+	return handlep->mmapbuf != MAP_FAILED;
+}
+
+#define CTRL_TIMEOUT    (5*1000)        /* milliseconds */
+
+#define USB_DIR_IN		0x80
+#define USB_TYPE_STANDARD	0x00
+#define USB_RECIP_DEVICE	0x00
+
+#define USB_REQ_GET_DESCRIPTOR	6
+
+#define USB_DT_DEVICE		1
+
+/* probe the descriptors of the devices attached to the bus */
+/* the descriptors will end up in the captured packet stream */
+/* and be decoded by external apps like wireshark */
+/* without these identifying probes packet data can't be fully decoded */
+static void
+probe_devices(int bus)
+{
+	struct usbdevfs_ctrltransfer ctrl;
+	struct dirent* data;
+	int ret = 0;
+	char buf[40];
+	DIR* dir;
+
+	/* scan usb bus directories for device nodes */
+	snprintf(buf, sizeof(buf), "/dev/bus/usb/%03d", bus);
+	dir = opendir(buf);
+	if (!dir)
+		return;
+
+	while ((ret >= 0) && ((data = readdir(dir)) != 0)) {
+		int fd;
+		char* name = data->d_name;
+
+		if (name[0] == '.')
+			continue;
+
+		snprintf(buf, sizeof(buf), "/dev/bus/usb/%03d/%s", bus, data->d_name);
+		
+		fd = open(buf, O_RDWR);
+		if (fd == -1)
+			continue;
+
+		/*
+		 * Sigh.  Different kernels have different member names
+		 * for this structure.
+		 */
+#ifdef HAVE_USBDEVFS_CTRLTRANSFER_BREQUESTTYPE
+		ctrl.bRequestType = USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE;
+		ctrl.bRequest = USB_REQ_GET_DESCRIPTOR;
+		ctrl.wValue = USB_DT_DEVICE << 8;
+		ctrl.wIndex = 0;
+ 		ctrl.wLength = sizeof(buf);
+#else
+		ctrl.requesttype = USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE;
+		ctrl.request = USB_REQ_GET_DESCRIPTOR;
+		ctrl.value = USB_DT_DEVICE << 8;
+		ctrl.index = 0;
+ 		ctrl.length = sizeof(buf);
+#endif
+		ctrl.data = buf;
+		ctrl.timeout = CTRL_TIMEOUT;
+
+		ret = ioctl(fd, USBDEVFS_CONTROL, &ctrl);
+
+		close(fd);
+	}
+	closedir(dir);
+}
+
+pcap_t *
+usb_create(const char *device, char *ebuf, int *is_ours)
+{
+	const char *cp;
+	char *cpend;
+	long devnum;
+	pcap_t *p;
+
+	/* Does this look like a USB monitoring device? */
+	cp = strrchr(device, '/');
+	if (cp == NULL)
+		cp = device;
+	/* Does it begin with USB_IFACE? */
+	if (strncmp(cp, USB_IFACE, sizeof USB_IFACE - 1) != 0) {
+		/* Nope, doesn't begin with USB_IFACE */
+		*is_ours = 0;
+		return NULL;
+	}
+	/* Yes - is USB_IFACE followed by a number? */
+	cp += sizeof USB_IFACE - 1;
+	devnum = strtol(cp, &cpend, 10);
+	if (cpend == cp || *cpend != '\0') {
+		/* Not followed by a number. */
+		*is_ours = 0;
+		return NULL;
+	}
+	if (devnum < 0) {
+		/* Followed by a non-valid number. */
+		*is_ours = 0;
+		return NULL;
+	}
+
+	/* OK, it's probably ours. */
+	*is_ours = 1;
+
+	p = pcap_create_common(device, ebuf, sizeof (struct pcap_usb_linux));
+	if (p == NULL)
+		return (NULL);
+
+	p->activate_op = usb_activate;
+	return (p);
+}
+
+static int
+usb_activate(pcap_t* handle)
+{
+	struct pcap_usb_linux *handlep = handle->priv;
+	char 		full_path[USB_LINE_LEN];
+
+	/* Initialize some components of the pcap structure. */
+	handle->bufsize = handle->snapshot;
+	handle->offset = 0;
+	handle->linktype = DLT_USB_LINUX;
+
+	handle->inject_op = usb_inject_linux;
+	handle->setfilter_op = install_bpf_program; /* no kernel filtering */
+	handle->setdirection_op = usb_setdirection_linux;
+	handle->set_datalink_op = NULL;	/* can't change data link type */
+	handle->getnonblock_op = pcap_getnonblock_fd;
+	handle->setnonblock_op = pcap_setnonblock_fd;
+
+	/*get usb bus index from device name */
+	if (sscanf(handle->opt.source, USB_IFACE"%d", &handlep->bus_index) != 1)
+	{
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			"Can't get USB bus index from %s", handle->opt.source);
+		return PCAP_ERROR;
+	}
+
+	/*now select the read method: try to open binary interface */
+	snprintf(full_path, USB_LINE_LEN, LINUX_USB_MON_DEV"%d", handlep->bus_index);  
+	handle->fd = open(full_path, O_RDONLY, 0);
+	if (handle->fd >= 0)
+	{
+		if (handle->opt.rfmon) {
+			/*
+			 * Monitor mode doesn't apply to USB devices.
+			 */
+			close(handle->fd);
+			return PCAP_ERROR_RFMON_NOTSUP;
+		}
+
+		/* binary api is available, try to use fast mmap access */
+		if (usb_mmap(handle)) {
+			handle->linktype = DLT_USB_LINUX_MMAPPED;
+			handle->stats_op = usb_stats_linux_bin;
+			handle->read_op = usb_read_linux_mmap;
+			handle->cleanup_op = usb_cleanup_linux_mmap;
+			probe_devices(handlep->bus_index);
+
+			/*
+			 * "handle->fd" is a real file, so "select()" and
+			 * "poll()" work on it.
+			 */
+			handle->selectable_fd = handle->fd;
+			return 0;
+		}
+
+		/* can't mmap, use plain binary interface access */
+		handle->stats_op = usb_stats_linux_bin;
+		handle->read_op = usb_read_linux_bin;
+		probe_devices(handlep->bus_index);
+	}
+	else {
+		/*Binary interface not available, try open text interface */
+		snprintf(full_path, USB_LINE_LEN, USB_TEXT_DIR"/%dt", handlep->bus_index);  
+		handle->fd = open(full_path, O_RDONLY, 0);
+		if (handle->fd < 0)
+		{
+			if (errno == ENOENT)
+			{
+				/*
+				 * Not found at the new location; try
+				 * the old location.
+				 */
+				snprintf(full_path, USB_LINE_LEN, USB_TEXT_DIR_OLD"/%dt", handlep->bus_index);  
+				handle->fd = open(full_path, O_RDONLY, 0);
+			}
+			if (handle->fd < 0) {
+				/* no more fallback, give it up*/
+				snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+					"Can't open USB bus file %s: %s", full_path, strerror(errno));
+				return PCAP_ERROR;
+			}
+		}
+
+		if (handle->opt.rfmon) {
+			/*
+			 * Monitor mode doesn't apply to USB devices.
+			 */
+			close(handle->fd);
+			return PCAP_ERROR_RFMON_NOTSUP;
+		}
+
+		handle->stats_op = usb_stats_linux;
+		handle->read_op = usb_read_linux;
+	}
+
+	/*
+	 * "handle->fd" is a real file, so "select()" and "poll()"
+	 * work on it.
+	 */
+	handle->selectable_fd = handle->fd;
+
+	/* for plain binary access and text access we need to allocate the read
+	 * buffer */
+	handle->buffer = malloc(handle->bufsize);
+	if (!handle->buffer) {
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			 "malloc: %s", pcap_strerror(errno));
+		close(handle->fd);
+		return PCAP_ERROR;
+	}
+	return 0;
+}
+
+static inline int 
+ascii_to_int(char c)
+{
+	return c < 'A' ? c- '0': ((c<'a') ? c - 'A' + 10: c-'a'+10);
+}
+
+/*
+ * see <linux-kernel-source>/Documentation/usb/usbmon.txt and 
+ * <linux-kernel-source>/drivers/usb/mon/mon_text.c for urb string 
+ * format description
+ */
+static int
+usb_read_linux(pcap_t *handle, int max_packets, pcap_handler callback, u_char *user)
+{
+	/* see:
+	* /usr/src/linux/Documentation/usb/usbmon.txt 
+	* for message format
+	*/
+	struct pcap_usb_linux *handlep = handle->priv;
+	unsigned timestamp;
+	int tag, cnt, ep_num, dev_addr, dummy, ret, urb_len, data_len;
+	char etype, pipeid1, pipeid2, status[16], urb_tag, line[USB_LINE_LEN];
+	char *string = line;
+	u_char * rawdata = handle->buffer;
+	struct pcap_pkthdr pkth;
+	pcap_usb_header* uhdr = (pcap_usb_header*)handle->buffer;
+	u_char urb_transfer=0;
+	int incoming=0;
+
+	/* ignore interrupt system call errors */
+	do {
+		ret = read(handle->fd, line, USB_LINE_LEN - 1);
+		if (handle->break_loop)
+		{
+			handle->break_loop = 0;
+			return -2;
+		}
+	} while ((ret == -1) && (errno == EINTR));
+	if (ret < 0)
+	{
+		if (errno == EAGAIN)
+			return 0;	/* no data there */
+
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "Can't read from fd %d: %s", handle->fd, strerror(errno));
+		return -1;
+	}
+
+	/* read urb header; %n argument may increment return value, but it's 
+	* not mandatory, so does not count on it*/
+	string[ret] = 0;
+	ret = sscanf(string, "%x %d %c %c%c:%d:%d %s%n", &tag, &timestamp, &etype, 
+		&pipeid1, &pipeid2, &dev_addr, &ep_num, status, 
+		&cnt);
+	if (ret < 8)
+	{
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "Can't parse USB bus message '%s', too few tokens (expected 8 got %d)",
+		    string, ret);
+		return -1;
+	}
+	uhdr->id = tag;
+	uhdr->device_address = dev_addr;
+	uhdr->bus_id = handlep->bus_index;
+	uhdr->status = 0;
+	string += cnt;
+
+	/* don't use usbmon provided timestamp, since it have low precision*/
+	if (gettimeofday(&pkth.ts, NULL) < 0) 
+	{
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			"Can't get timestamp for message '%s' %d:%s", 
+			string, errno, strerror(errno));
+		return -1;
+	}
+	uhdr->ts_sec = pkth.ts.tv_sec;
+	uhdr->ts_usec = pkth.ts.tv_usec;
+
+	/* parse endpoint information */
+	if (pipeid1 == 'C')
+		urb_transfer = URB_CONTROL;
+	else if (pipeid1 == 'Z')
+		urb_transfer = URB_ISOCHRONOUS;
+	else if (pipeid1 == 'I')
+		urb_transfer = URB_INTERRUPT;
+	else if (pipeid1 == 'B')
+		urb_transfer = URB_BULK;
+	if (pipeid2 == 'i') {
+		ep_num |= URB_TRANSFER_IN;
+		incoming = 1;
+	}
+	if (etype == 'C')
+		incoming = !incoming;
+
+	/* direction check*/
+	if (incoming)
+	{
+		if (handle->direction == PCAP_D_OUT)
+			return 0;
+	}
+	else
+		if (handle->direction == PCAP_D_IN)
+			return 0;
+	uhdr->event_type = etype;
+	uhdr->transfer_type = urb_transfer;
+	uhdr->endpoint_number = ep_num;
+	pkth.caplen = sizeof(pcap_usb_header);
+	rawdata += sizeof(pcap_usb_header);
+
+	/* check if this is a setup packet */
+	ret = sscanf(status, "%d", &dummy);
+	if (ret != 1)
+	{
+		/* this a setup packet, setup data can be filled with underscore if
+		* usbmon has not been able to read them, so we must parse this fields as 
+		* strings */
+		pcap_usb_setup* shdr;
+		char str1[3], str2[3], str3[5], str4[5], str5[5];
+		ret = sscanf(string, "%s %s %s %s %s%n", str1, str2, str3, str4, 
+		str5, &cnt);
+		if (ret < 5)
+		{
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+				"Can't parse USB bus message '%s', too few tokens (expected 5 got %d)",
+				string, ret);
+			return -1;
+		}
+		string += cnt;
+
+		/* try to convert to corresponding integer */
+		shdr = &uhdr->setup;
+		shdr->bmRequestType = strtoul(str1, 0, 16);
+		shdr->bRequest = strtoul(str2, 0, 16);
+		shdr->wValue = htols(strtoul(str3, 0, 16));
+		shdr->wIndex = htols(strtoul(str4, 0, 16));
+		shdr->wLength = htols(strtoul(str5, 0, 16));
+
+		uhdr->setup_flag = 0;
+	}
+	else 
+		uhdr->setup_flag = 1;
+
+	/* read urb data */
+	ret = sscanf(string, " %d%n", &urb_len, &cnt);
+	if (ret < 1)
+	{
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		  "Can't parse urb length from '%s'", string);
+		return -1;
+	}
+	string += cnt;
+
+	/* urb tag is not present if urb length is 0, so we can stop here 
+	 * text parsing */
+	pkth.len = urb_len+pkth.caplen;
+	uhdr->urb_len = urb_len;
+	uhdr->data_flag = 1;
+	data_len = 0;
+	if (uhdr->urb_len == 0)
+		goto got;
+
+	/* check for data presence; data is present if and only if urb tag is '=' */
+	if (sscanf(string, " %c", &urb_tag) != 1)
+	{
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			"Can't parse urb tag from '%s'", string);
+		return -1;
+	}
+
+	if (urb_tag != '=') 
+		goto got;
+
+	/* skip urb tag and following space */
+	string += 3;
+
+	/* if we reach this point we got some urb data*/
+	uhdr->data_flag = 0;
+
+	/* read all urb data; if urb length is greater then the usbmon internal 
+	 * buffer length used by the kernel to spool the URB, we get only
+	 * a partial information.
+	 * At least until linux 2.6.17 there is no way to set usbmon intenal buffer
+	 * length and default value is 130. */
+	while ((string[0] != 0) && (string[1] != 0) && (pkth.caplen < handle->snapshot))
+	{
+		rawdata[0] = ascii_to_int(string[0]) * 16 + ascii_to_int(string[1]);
+		rawdata++;
+		string+=2;
+		if (string[0] == ' ')
+			string++;
+		pkth.caplen++;
+		data_len++;
+	}
+
+got:
+	uhdr->data_len = data_len;
+	if (pkth.caplen > handle->snapshot)
+		pkth.caplen = handle->snapshot;
+
+	if (handle->fcode.bf_insns == NULL ||
+	    bpf_filter(handle->fcode.bf_insns, handle->buffer,
+	      pkth.len, pkth.caplen)) {
+		handlep->packets_read++;
+		callback(user, &pkth, handle->buffer);
+		return 1;
+	}
+	return 0;	/* didn't pass filter */
+}
+
+static int
+usb_inject_linux(pcap_t *handle, const void *buf, size_t size)
+{
+	snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "inject not supported on "
+		"USB devices");
+	return (-1);
+}
+
+static int 
+usb_stats_linux(pcap_t *handle, struct pcap_stat *stats)
+{
+	struct pcap_usb_linux *handlep = handle->priv;
+	int dummy, ret, consumed, cnt;
+	char string[USB_LINE_LEN];
+	char token[USB_LINE_LEN];
+	char * ptr = string;
+	int fd;
+
+	snprintf(string, USB_LINE_LEN, USB_TEXT_DIR"/%ds", handlep->bus_index);
+	fd = open(string, O_RDONLY, 0);
+	if (fd < 0)
+	{
+		if (errno == ENOENT)
+		{
+			/*
+			 * Not found at the new location; try the old
+			 * location.
+			 */
+			snprintf(string, USB_LINE_LEN, USB_TEXT_DIR_OLD"/%ds", handlep->bus_index);
+			fd = open(string, O_RDONLY, 0);
+		}
+		if (fd < 0) {
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+				"Can't open USB stats file %s: %s", 
+				string, strerror(errno));
+			return -1;
+		}
+	}
+
+	/* read stats line */
+	do {
+		ret = read(fd, string, USB_LINE_LEN-1);
+	} while ((ret == -1) && (errno == EINTR));
+	close(fd);
+
+	if (ret < 0)
+	{
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			"Can't read stats from fd %d ", fd);
+		return -1;
+	}
+	string[ret] = 0;
+
+	/* extract info on dropped urbs */
+	for (consumed=0; consumed < ret; ) {
+		/* from the sscanf man page: 
+ 		 * The C standard says: "Execution of a %n directive does 
+ 		 * not increment the assignment count returned at the completion
+		 * of  execution" but the Corrigendum seems to contradict this.
+		 * Do not make any assumptions on the effect of %n conversions 
+		 * on the return value and explicitly check for cnt assignmet*/
+		int ntok;
+
+		cnt = -1;
+		ntok = sscanf(ptr, "%s%n", token, &cnt);
+		if ((ntok < 1) || (cnt < 0))
+			break;
+		consumed += cnt;
+		ptr += cnt;
+		if (strcmp(token, "nreaders") == 0)
+			ret = sscanf(ptr, "%d", &stats->ps_drop);
+		else 
+			ret = sscanf(ptr, "%d", &dummy);
+		if (ntok != 1)
+			break;
+		consumed += cnt;
+		ptr += cnt;
+	}
+
+	stats->ps_recv = handlep->packets_read;
+	stats->ps_ifdrop = 0;
+	return 0;
+}
+
+static int 
+usb_setdirection_linux(pcap_t *p, pcap_direction_t d)
+{
+	p->direction = d;
+	return 0;
+}
+
+
+static int 
+usb_stats_linux_bin(pcap_t *handle, struct pcap_stat *stats)
+{
+	struct pcap_usb_linux *handlep = handle->priv;
+	int ret;
+	struct mon_bin_stats st;
+	ret = ioctl(handle->fd, MON_IOCG_STATS, &st);
+	if (ret < 0)
+	{
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			"Can't read stats from fd %d:%s ", handle->fd, strerror(errno));
+		return -1;
+	}
+
+	stats->ps_recv = handlep->packets_read + st.queued;
+	stats->ps_drop = st.dropped;
+	stats->ps_ifdrop = 0;
+	return 0;
+}
+
+/*
+ * see <linux-kernel-source>/Documentation/usb/usbmon.txt and 
+ * <linux-kernel-source>/drivers/usb/mon/mon_bin.c binary ABI
+ */
+static int
+usb_read_linux_bin(pcap_t *handle, int max_packets, pcap_handler callback, u_char *user)
+{
+	struct pcap_usb_linux *handlep = handle->priv;
+	struct mon_bin_get info;
+	int ret;
+	struct pcap_pkthdr pkth;
+	int clen = handle->snapshot - sizeof(pcap_usb_header);
+
+	/* the usb header is going to be part of 'packet' data*/
+	info.hdr = (pcap_usb_header*) handle->buffer;
+	info.data = handle->buffer + sizeof(pcap_usb_header);
+	info.data_len = clen;
+
+	/* ignore interrupt system call errors */
+	do {
+		ret = ioctl(handle->fd, MON_IOCX_GET, &info);
+		if (handle->break_loop)
+		{
+			handle->break_loop = 0;
+			return -2;
+		}
+	} while ((ret == -1) && (errno == EINTR));
+	if (ret < 0)
+	{
+		if (errno == EAGAIN)
+			return 0;	/* no data there */
+
+		snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+		    "Can't read from fd %d: %s", handle->fd, strerror(errno));
+		return -1;
+	}
+
+	/* we can get less that than really captured from kernel, depending on
+	 * snaplen, so adjust header accordingly */
+	if (info.hdr->data_len < clen)
+		clen = info.hdr->data_len;
+	info.hdr->data_len = clen;
+	pkth.caplen = clen + sizeof(pcap_usb_header);
+	pkth.len = info.hdr->data_len + sizeof(pcap_usb_header);
+	pkth.ts.tv_sec = info.hdr->ts_sec;
+	pkth.ts.tv_usec = info.hdr->ts_usec;
+
+	if (handle->fcode.bf_insns == NULL ||
+	    bpf_filter(handle->fcode.bf_insns, handle->buffer,
+	      pkth.len, pkth.caplen)) {
+		handlep->packets_read++;
+		callback(user, &pkth, handle->buffer);
+		return 1;
+	}
+
+	return 0;	/* didn't pass filter */
+}
+
+/*
+ * see <linux-kernel-source>/Documentation/usb/usbmon.txt and 
+ * <linux-kernel-source>/drivers/usb/mon/mon_bin.c binary ABI
+ */
+#define VEC_SIZE 32
+static int
+usb_read_linux_mmap(pcap_t *handle, int max_packets, pcap_handler callback, u_char *user)
+{
+	struct pcap_usb_linux *handlep = handle->priv;
+	struct mon_bin_mfetch fetch;
+	int32_t vec[VEC_SIZE];
+	struct pcap_pkthdr pkth;
+	pcap_usb_header* hdr;
+	int nflush = 0;
+	int packets = 0;
+	int clen, max_clen;
+
+	max_clen = handle->snapshot - sizeof(pcap_usb_header);
+
+	for (;;) {
+		int i, ret;
+		int limit = max_packets - packets;
+		if (limit <= 0)
+			limit = VEC_SIZE;
+		if (limit > VEC_SIZE)
+			limit = VEC_SIZE;
+
+		/* try to fetch as many events as possible*/
+		fetch.offvec = vec;
+		fetch.nfetch = limit;
+		fetch.nflush = nflush;
+		/* ignore interrupt system call errors */
+		do {
+			ret = ioctl(handle->fd, MON_IOCX_MFETCH, &fetch);
+			if (handle->break_loop)
+			{
+				handle->break_loop = 0;
+				return -2;
+			}
+		} while ((ret == -1) && (errno == EINTR));
+		if (ret < 0)
+		{
+			if (errno == EAGAIN)
+				return 0;	/* no data there */
+
+			snprintf(handle->errbuf, PCAP_ERRBUF_SIZE,
+			    "Can't mfetch fd %d: %s", handle->fd, strerror(errno));
+			return -1;
+		}
+
+		/* keep track of processed events, we will flush them later */
+		nflush = fetch.nfetch;
+		for (i=0; i<fetch.nfetch; ++i) {
+			/* discard filler */
+			hdr = (pcap_usb_header*) &handlep->mmapbuf[vec[i]];
+			if (hdr->event_type == '@') 
+				continue;
+
+			/* we can get less that than really captured from kernel, depending on
+	 		* snaplen, so adjust header accordingly */
+			clen = max_clen;
+			if (hdr->data_len < clen)
+				clen = hdr->data_len;
+
+			/* get packet info from header*/
+			pkth.caplen = clen + sizeof(pcap_usb_header_mmapped);
+			pkth.len = hdr->data_len + sizeof(pcap_usb_header_mmapped);
+			pkth.ts.tv_sec = hdr->ts_sec;
+			pkth.ts.tv_usec = hdr->ts_usec;
+
+			if (handle->fcode.bf_insns == NULL ||
+			    bpf_filter(handle->fcode.bf_insns, (u_char*) hdr,
+			      pkth.len, pkth.caplen)) {
+				handlep->packets_read++;
+				callback(user, &pkth, (u_char*) hdr);
+				packets++;
+			}
+		}
+
+		/* with max_packets specifying "unlimited" we stop afer the first chunk*/
+		if (PACKET_COUNT_IS_UNLIMITED(max_packets) || (packets == max_packets))
+			break;
+	}
+
+	/* flush pending events*/
+	ioctl(handle->fd, MON_IOCH_MFLUSH, nflush);
+	return packets;
+}
+
+static void
+usb_cleanup_linux_mmap(pcap_t* handle)
+{
+	struct pcap_usb_linux *handlep = handle->priv;
+
+	/* if we have a memory-mapped buffer, unmap it */
+	if (handlep->mmapbuf != NULL) {
+		munmap(handlep->mmapbuf, handlep->mmapbuflen);
+		handlep->mmapbuf = NULL;
+	}
+	pcap_cleanup_live_common(handle);
+}
diff --git a/pcap-usb-linux.h b/pcap-usb-linux.h
new file mode 100644
index 0000000..d64386d
--- /dev/null
+++ b/pcap-usb-linux.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2006 Paolo Abeni (Italy)
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+ * OWNER 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.
+ *
+ * USB sniffing API implementation for Linux platform
+ * By Paolo Abeni <paolo.abeni@email.it>
+ *
+ * @(#) $Header: /tcpdump/master/libpcap/pcap-usb-linux.h,v 1.5 2008-04-04 19:37:45 guy Exp $ (LBL)
+ */
+
+/*
+ * Prototypes for USB-related functions
+ */
+int usb_findalldevs(pcap_if_t **alldevsp, char *err_str);
+pcap_t *usb_create(const char *device, char *ebuf, int *is_ours);
diff --git a/pcap-win32.c b/pcap-win32.c
index 435da66..87b3fc6 100644
--- a/pcap-win32.c
+++ b/pcap-win32.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 1999 - 2005 NetGroup, Politecnico di Torino (Italy)
- * Copyright (c) 2005 - 2007 CACE Technologies, Davis (California)
+ * Copyright (c) 2005 - 2008 CACE Technologies, Davis (California)
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -33,12 +33,21 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/pcap-win32.c,v 1.25.2.7 2007/06/14 22:07:14 gianluca Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/pcap-win32.c,v 1.42 2008-05-21 22:15:25 gianluca Exp $ (LBL)";
 #endif
 
 #include <pcap-int.h>
 #include <Packet32.h>
-#include <Ntddndis.h>
+#ifdef __MINGW32__
+#ifdef __MINGW64__
+#include <ntddndis.h>
+#else  /*__MINGW64__*/
+#include <ddk/ntddndis.h>
+#include <ddk/ndis.h>
+#endif /*__MINGW64__*/
+#else /*__MINGW32__*/
+#include <ntddndis.h>
+#endif /*__MINGW32__*/
 #ifdef HAVE_DAG_API
 #include <dagnew.h>
 #include <dagapi.h>
@@ -53,13 +62,27 @@
 static int pcap_getnonblock_win32(pcap_t *, char *);
 static int pcap_setnonblock_win32(pcap_t *, int, char *);
 
-#define	PcapBufSize 256000	/*dimension of the buffer in the pcap_t structure*/
-#define	SIZE_BUF 1000000
+/*dimension of the buffer in the pcap_t structure*/
+#define	WIN32_DEFAULT_USER_BUFFER_SIZE 256000
+
+/*dimension of the buffer in the kernel driver NPF */
+#define	WIN32_DEFAULT_KERNEL_BUFFER_SIZE 1000000
 
 /* Equivalent to ntohs(), but a lot faster under Windows */
 #define SWAPS(_X) ((_X & 0xff) << 8) | (_X >> 8)
 
 /*
+ * Private data for capturing on WinPcap devices.
+ */
+struct pcap_win {
+	int nonblock;
+
+#ifdef HAVE_DAG_API
+	int	dag_fcs_bits;	/* Number of checksum bits from link layer */
+#endif
+};
+
+/*
  * Header that the WinPcap driver associates to the packets.
  * Once was in bpf.h
  */
@@ -71,6 +94,22 @@
 					   plus alignment padding) */
 };
 
+CRITICAL_SECTION g_PcapCompileCriticalSection;
+
+BOOL WINAPI DllMain(
+  HANDLE hinstDLL,
+  DWORD dwReason,
+  LPVOID lpvReserved
+)
+{
+	if (dwReason == DLL_PROCESS_ATTACH)
+	{
+		InitializeCriticalSection(&g_PcapCompileCriticalSection);
+	}
+
+	return TRUE;
+}
+
 /* Start winsock */
 int 
 wsockinit()
@@ -100,6 +139,50 @@
 	return 0;
 }
 
+/* Set the dimension of the kernel-level capture buffer */
+static int
+pcap_setbuff_win32(pcap_t *p, int dim)
+{
+	if(PacketSetBuff(p->adapter,dim)==FALSE)
+	{
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "driver error: not enough memory to allocate the kernel buffer");
+		return -1;
+	}
+	return 0;
+}
+
+/* Set the driver working mode */
+static int
+pcap_setmode_win32(pcap_t *p, int mode)
+{
+	if(PacketSetMode(p->adapter,mode)==FALSE)
+	{
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "driver error: working mode not recognized");
+		return -1;
+	}
+
+	return 0;
+}
+
+/*set the minimum amount of data that will release a read call*/
+static int
+pcap_setmintocopy_win32(pcap_t *p, int size)
+{
+	if(PacketSetMinToCopy(p->adapter, size)==FALSE)
+	{
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "driver error: unable to set the requested mintocopy size");
+		return -1;
+	}
+	return 0;
+}
+
+/*return the Adapter for a pcap_t*/
+static Adapter *
+pcap_getadapter_win32(pcap_t *p)
+{
+	return p->adapter;
+}
+
 static int
 pcap_read_win32_npf(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
 {
@@ -172,8 +255,8 @@
 		 * XXX A bpf_hdr matches a pcap_pkthdr.
 		 */
 		(*callback)(user, (struct pcap_pkthdr*)bp, bp + hdrlen);
-		bp += BPF_WORDALIGN(caplen + hdrlen);
-		if (++n >= cnt && cnt > 0) {
+		bp += Packet_WORDALIGN(caplen + hdrlen);
+		if (++n >= cnt && !PACKET_COUNT_IS_UNLIMITED(cnt)) {
 			p->bp = bp;
 			p->cc = ep - bp;
 			return (n);
@@ -188,6 +271,7 @@
 static int
 pcap_read_win32_dag(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
 {
+	struct pcap_win *pw = p->priv;
 	u_char *dp = NULL;
 	int	packet_len = 0, caplen = 0;
 	struct pcap_pkthdr	pcap_header;
@@ -230,7 +314,7 @@
 			break;
 
 		/* Increase the number of captured packets */
-		p->md.stat.ps_recv++;
+		pw->stat.ps_recv++;
 		
 		/* Find the beginning of the packet */
 		dp = ((u_char *)header) + dag_record_size;
@@ -247,7 +331,7 @@
 
 		case TYPE_ETH:
 			swt = SWAPS(header->wlen);
-			packet_len = swt - (p->md.dag_fcs_bits);
+			packet_len = swt - (pw->dag_fcs_bits);
 			caplen = erf_record_len - dag_record_size - 2;
 			if (caplen > packet_len)
 			{
@@ -259,7 +343,7 @@
 		
 		case TYPE_HDLC_POS:
 			swt = SWAPS(header->wlen);
-			packet_len = swt - (p->md.dag_fcs_bits);
+			packet_len = swt - (pw->dag_fcs_bits);
 			caplen = erf_record_len - dag_record_size;
 			if (caplen > packet_len)
 			{
@@ -332,7 +416,7 @@
 		header = (dag_record_t*)((char*)header + erf_record_len);
 
 		/* Stop if the number of packets requested by user has been reached*/
-		if (++n >= cnt && cnt > 0) 
+		if (++n >= cnt && !PACKET_COUNT_IS_UNLIMITED(cnt)) 
 		{
 			p->bp = (char*)header;
 			p->cc = endofbuf - (char*)header;
@@ -376,9 +460,8 @@
 }
 
 static void
-pcap_close_win32(pcap_t *p)
+pcap_cleanup_win32(pcap_t *p)
 {
-	pcap_close_common(p);
 	if (p->adapter != NULL) {
 		PacketCloseAdapter(p->adapter);
 		p->adapter = NULL;
@@ -387,41 +470,40 @@
 		PacketFreePacket(p->Packet);
 		p->Packet = NULL;
 	}
+	pcap_cleanup_live_common(p);
 }
 
-pcap_t *
-pcap_open_live(const char *device, int snaplen, int promisc, int to_ms,
-    char *ebuf)
+static int
+pcap_activate_win32(pcap_t *p)
 {
-	register pcap_t *p;
+	struct pcap_win *pw = p->priv;
 	NetType type;
 
+	if (p->opt.rfmon) {
+		/*
+		 * No monitor mode on Windows.  It could be done on
+		 * Vista with drivers that support the native 802.11
+		 * mechanism and monitor mode.
+		 */
+		return (PCAP_ERROR_RFMON_NOTSUP);
+	}
+
 	/* Init WinSock */
 	wsockinit();
 
-	p = (pcap_t *)malloc(sizeof(*p));
-	if (p == NULL) 
-	{
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s", pcap_strerror(errno));
-		return (NULL);
-	}
-	memset(p, 0, sizeof(*p));
-	p->adapter=NULL;
-
-	p->adapter = PacketOpenAdapter((char*)device);
+	p->adapter = PacketOpenAdapter(p->opt.source);
 	
 	if (p->adapter == NULL)
 	{
-		free(p);
 		/* Adapter detected but we are not able to open it. Return failure. */
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "Error opening adapter: %s", pcap_win32strerror());
-		return NULL;
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "Error opening adapter: %s", pcap_win32strerror());
+		return PCAP_ERROR;
 	}
 	
 	/*get network type*/
 	if(PacketGetNetType (p->adapter,&type) == FALSE)
 	{
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "Cannot determine the network type: %s", pcap_win32strerror());
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "Cannot determine the network type: %s", pcap_win32strerror());
 		goto bad;
 	}
 	
@@ -505,12 +587,12 @@
 	}
 
 	/* Set promiscuous mode */
-	if (promisc) 
+	if (p->opt.promisc) 
 	{
 
 		if (PacketSetHwFilter(p->adapter,NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE)
 		{
-			snprintf(ebuf, PCAP_ERRBUF_SIZE, "failed to set hardware filter to promiscuous mode");
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "failed to set hardware filter to promiscuous mode");
 			goto bad;
 		}
 	}
@@ -518,21 +600,18 @@
 	{
 		if (PacketSetHwFilter(p->adapter,NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE)
 		{
-			snprintf(ebuf, PCAP_ERRBUF_SIZE, "failed to set hardware filter to non-promiscuous mode");
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "failed to set hardware filter to non-promiscuous mode");
 			goto bad;
 		}
 	}
 
 	/* Set the buffer size */
-	p->bufsize = PcapBufSize;
-
-	/* Store the timeout. Used by pcap_setnonblock() */
-	p->timeout= to_ms;
+	p->bufsize = WIN32_DEFAULT_USER_BUFFER_SIZE;
 
 	/* allocate Packet structure used during the capture */
 	if((p->Packet = PacketAllocatePacket())==NULL)
 	{
-		snprintf(ebuf, PCAP_ERRBUF_SIZE, "failed to allocate the PACKET structure");
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "failed to allocate the PACKET structure");
 		goto bad;
 	}
 
@@ -541,30 +620,45 @@
 	/* 
 	 * Traditional Adapter 
 	 */
+		/*
+		 * If the buffer size wasn't explicitly set, default to
+		 * WIN32_DEFAULT_USER_BUFFER_SIZE.
+		 */
+	 	if (p->opt.buffer_size == 0)
+	 		p->opt.buffer_size = WIN32_DEFAULT_KERNEL_BUFFER_SIZE;
+
+		if(PacketSetBuff(p->adapter,p->opt.buffer_size)==FALSE)
+		{
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "driver error: not enough memory to allocate the kernel buffer");
+			goto bad;
+		}
 		
-		p->buffer = (u_char *)malloc(PcapBufSize);
+		p->buffer = (u_char *)malloc(p->bufsize);
 		if (p->buffer == NULL) 
 		{
-			snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s", pcap_strerror(errno));
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "malloc: %s", pcap_strerror(errno));
 			goto bad;
 		}
 		
 		PacketInitPacket(p->Packet,(BYTE*)p->buffer,p->bufsize);
 		
-		p->snapshot = snaplen;
-		
-		/* allocate the standard buffer in the driver */
-		if(PacketSetBuff( p->adapter, SIZE_BUF)==FALSE)
+		if (p-opt.immediate)
 		{
-			snprintf(ebuf, PCAP_ERRBUF_SIZE,"driver error: not enough memory to allocate the kernel buffer\n");
-			goto bad;
+			/* tell the driver to copy the buffer as soon as data arrives */
+			if(PacketSetMinToCopy(p->adapter,0)==FALSE)
+			{
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,"Error calling PacketSetMinToCopy: %s", pcap_win32strerror());
+				goto bad;
+			}
 		}
-		
-		/* tell the driver to copy the buffer only if it contains at least 16K */
-		if(PacketSetMinToCopy(p->adapter,16000)==FALSE)
+		else
 		{
-			snprintf(ebuf, PCAP_ERRBUF_SIZE,"Error calling PacketSetMinToCopy: %s\n", pcap_win32strerror());
-			goto bad;
+			/* tell the driver to copy the buffer only if it contains at least 16K */
+			if(PacketSetMinToCopy(p->adapter,16000)==FALSE)
+			{
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,"Error calling PacketSetMinToCopy: %s", pcap_win32strerror());
+				goto bad;
+			}
 		}
 	}
 	else
@@ -582,7 +676,7 @@
 		
 		snprintf(keyname, sizeof(keyname), "%s\\CardParams\\%s", 
 			"SYSTEM\\CurrentControlSet\\Services\\DAG",
-			strstr(_strlwr((char*)device), "dag"));
+			strstr(_strlwr(p->opt.source), "dag"));
 		do
 		{
 			status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyname, 0, KEY_READ, &dagkey);
@@ -610,13 +704,13 @@
 		
 		/* Set the length of the FCS associated to any packet. This value 
 		 * will be subtracted to the packet length */
-		p->md.dag_fcs_bits = p->adapter->DagFcsLen;
+		pw->dag_fcs_bits = p->adapter->DagFcsLen;
 	}
 #else
 	goto bad;
 #endif /* HAVE_DAG_API */
 	
-	PacketSetReadTimeout(p->adapter, to_ms);
+	PacketSetReadTimeout(p->adapter, p->opt.timeout);
 	
 #ifdef HAVE_DAG_API
 	if(p->adapter->Flags & INFO_FLAG_DAG_CARD)
@@ -641,25 +735,61 @@
 	p->getnonblock_op = pcap_getnonblock_win32;
 	p->setnonblock_op = pcap_setnonblock_win32;
 	p->stats_op = pcap_stats_win32;
-	p->close_op = pcap_close_win32;
+	p->setbuff_op = pcap_setbuff_win32;
+	p->setmode_op = pcap_setmode_win32;
+	p->setmintocopy_op = pcap_setmintocopy_win32;
+	p->getadapter_op = pcap_getadapter_win32;
+	p->cleanup_op = pcap_cleanup_win32;
 
-	return (p);
+	return (0);
 bad:
-	if (p->adapter)
-	    PacketCloseAdapter(p->adapter);
-	if (p->buffer != NULL)
-		free(p->buffer);
-	if(p->Packet)
-		PacketFreePacket(p->Packet);
-	/*
-	 * Get rid of any link-layer type list we allocated.
-	 */
-	if (p->dlt_list != NULL)
-		free(p->dlt_list);
-	free(p);
-	return (NULL);
+	pcap_cleanup_win32(p);
+	return (PCAP_ERROR);
 }
 
+pcap_t *
+pcap_create_interface(const char *device, char *ebuf)
+{
+	pcap_t *p;
+
+	if (strlen(device) == 1)
+	{
+		/*
+		 * It's probably a unicode string
+		 * Convert to ascii and pass it to pcap_create_common
+		 *
+		 * This wonderful hack is needed because pcap_lookupdev still returns
+		 * unicode strings, and it's used by windump when no device is specified
+		 * in the command line
+		 */
+		size_t length;
+		char* deviceAscii;
+
+		length = wcslen((wchar_t*)device);
+
+		deviceAscii = (char*)malloc(length + 1);
+
+		if (deviceAscii == NULL)
+		{
+			snprintf(ebuf, PCAP_ERRBUF_SIZE, "Malloc failed");
+			return NULL;
+		}
+
+		snprintf(deviceAscii, length + 1, "%ws", (wchar_t*)device);
+		p = pcap_create_common(deviceAscii, ebuf, sizeof (struct pcap_win));
+		free(deviceAscii);
+	}
+	else
+	{
+		p = pcap_create_common(device, ebuf, sizeof (struct pcap_win));
+	}
+
+	if (p == NULL)
+		return (NULL);
+
+	p->activate_op = pcap_activate_win32;
+	return (p);
+}
 
 static int
 pcap_setfilter_win32_npf(pcap_t *p, struct bpf_program *fp)
@@ -704,25 +834,26 @@
 		return -1;
 	}
 	
-	p->md.use_bpf = 0;
-	
 	return (0);
 }
 
 static int
 pcap_getnonblock_win32(pcap_t *p, char *errbuf)
 {
+	struct pcap_win *pw = p->priv;
+
 	/*
 	 * XXX - if there were a PacketGetReadTimeout() call, we
 	 * would use it, and return 1 if the timeout is -1
 	 * and 0 otherwise.
 	 */
-	return (p->nonblock);
+	return (pw->nonblock);
 }
 
 static int
 pcap_setnonblock_win32(pcap_t *p, int nonblock, char *errbuf)
 {
+	struct pcap_win *pw = p->priv;
 	int newtimeout;
 
 	if (nonblock) {
@@ -736,68 +867,20 @@
 		 * (Note that this may be -1, in which case we're not
 		 * really leaving non-blocking mode.)
 		 */
-		newtimeout = p->timeout;
+		newtimeout = p->opt.timeout;
 	}
 	if (!PacketSetReadTimeout(p->adapter, newtimeout)) {
-		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+		snprintf(errbuf, PCAP_ERRBUF_SIZE,
 		    "PacketSetReadTimeout: %s", pcap_win32strerror());
 		return (-1);
 	}
-	p->nonblock = (newtimeout == -1);
+	pw->nonblock = (newtimeout == -1);
 	return (0);
 }
 
-/* Set the driver working mode */
-int 
-pcap_setmode(pcap_t *p, int mode){
-	
-	if (p->adapter==NULL)
-	{
-		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "impossible to set mode while reading from a file");
-		return -1;
-	}
-
-	if(PacketSetMode(p->adapter,mode)==FALSE)
-	{
-		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "driver error: working mode not recognized");
-		return -1;
-	}
-
-	return 0;
-}
-
-/* Set the dimension of the kernel-level capture buffer */
-int 
-pcap_setbuff(pcap_t *p, int dim)
+/*platform-dependent routine to add devices other than NDIS interfaces*/
+int
+pcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
 {
-	if (p->adapter==NULL)
-	{
-		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "The kernel buffer size cannot be set while reading from a file");
-		return -1;
-	}
-	
-	if(PacketSetBuff(p->adapter,dim)==FALSE)
-	{
-		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "driver error: not enough memory to allocate the kernel buffer");
-		return -1;
-	}
-	return 0;
-}
-
-/*set the minimum amount of data that will release a read call*/
-int 
-pcap_setmintocopy(pcap_t *p, int size)
-{
-	if (p->adapter==NULL)
-	{
-		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "Impossible to set the mintocopy parameter on an offline capture");
-		return -1;
-	}	
-
-	if(PacketSetMinToCopy(p->adapter, size)==FALSE)
-	{
-		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "driver error: unable to set the requested mintocopy size");
-		return -1;
-	}
-	return 0;
+	return (0);
 }
diff --git a/pcap.3 b/pcap.3
deleted file mode 100644
index 94b1f6a..0000000
--- a/pcap.3
+++ /dev/null
@@ -1,1312 +0,0 @@
-.\" @(#) $Header: /tcpdump/master/libpcap/pcap.3,v 1.64.2.11 2007/06/11 09:52:05 guy Exp $
-.\"
-.\" Copyright (c) 1994, 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.
-.\"
-.TH PCAP 3 "27 February 2004"
-.SH NAME
-pcap \- Packet Capture library
-.SH SYNOPSIS
-.nf
-.ft B
-#include <pcap.h>
-.ft
-.LP
-.nf
-.ft B
-char errbuf[PCAP_ERRBUF_SIZE];
-.ft
-.LP
-.ft B
-pcap_t *pcap_open_live(const char *device, int snaplen,
-.ti +8
-int promisc, int to_ms, char *errbuf)
-pcap_t *pcap_open_dead(int linktype, int snaplen)
-pcap_t *pcap_open_offline(const char *fname, char *errbuf)
-pcap_t *pcap_fopen_offline(FILE *fp, char *errbuf)
-pcap_dumper_t *pcap_dump_open(pcap_t *p, const char *fname)
-pcap_dumper_t *pcap_dump_fopen(pcap_t *p, FILE *fp)
-.ft
-.LP
-.ft B
-int pcap_setnonblock(pcap_t *p, int nonblock, char *errbuf);
-int pcap_getnonblock(pcap_t *p, char *errbuf);
-.ft
-.LP
-.ft B
-int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)
-void pcap_freealldevs(pcap_if_t *alldevs)
-char *pcap_lookupdev(char *errbuf)
-int pcap_lookupnet(const char *device, bpf_u_int32 *netp,
-.ti +8
-bpf_u_int32 *maskp, char *errbuf)
-.ft
-.LP
-.ft B
-typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h,
-.ti +8
-			     const u_char *bytes);
-.ft B
-int pcap_dispatch(pcap_t *p, int cnt,
-.ti +8
-pcap_handler callback, u_char *user)
-int pcap_loop(pcap_t *p, int cnt,
-.ti +8
-pcap_handler callback, u_char *user)
-void pcap_dump(u_char *user, struct pcap_pkthdr *h,
-.ti +8
-u_char *sp)
-.ft
-.LP
-.ft B
-int pcap_compile(pcap_t *p, struct bpf_program *fp,
-.ti +8
-const char *str, int optimize, bpf_u_int32 netmask)
-int pcap_setfilter(pcap_t *p, struct bpf_program *fp)
-void pcap_freecode(struct bpf_program *)
-int pcap_setdirection(pcap_t *p, pcap_direction_t d)
-.ft
-.LP
-.ft B
-const u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)
-int pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header,
-.ti +8
-const u_char **pkt_data)
-.ft
-.LP
-.ft B
-void pcap_breakloop(pcap_t *)
-.ft
-.LP
-.ft B
-int pcap_inject(pcap_t *p, const void *buf, size_t size)
-int pcap_sendpacket(pcap_t *p, const u_char *buf, int size)
-.ft
-.LP
-.ft B
-int pcap_datalink(pcap_t *p)
-int pcap_list_datalinks(pcap_t *p, int **dlt_buf);
-int pcap_set_datalink(pcap_t *p, int dlt);
-int pcap_datalink_name_to_val(const char *name);
-const char *pcap_datalink_val_to_name(int dlt);
-const char *pcap_datalink_val_to_description(int dlt);
-int pcap_snapshot(pcap_t *p)
-int pcap_is_swapped(pcap_t *p)
-int pcap_major_version(pcap_t *p)
-int pcap_minor_version(pcap_t *p)
-int pcap_stats(pcap_t *p, struct pcap_stat *ps)
-FILE *pcap_file(pcap_t *p)
-int pcap_fileno(pcap_t *p)
-int pcap_get_selectable_fd(pcap_t *p);
-void pcap_perror(pcap_t *p, char *prefix)
-char *pcap_geterr(pcap_t *p)
-const char *pcap_strerror(int error)
-const char *pcap_lib_version(void)
-.ft
-.LP
-.ft B
-void pcap_close(pcap_t *p)
-int pcap_dump_flush(pcap_dumper_t *p)
-long pcap_dump_ftell(pcap_dumper_t *p)
-FILE *pcap_dump_file(pcap_dumper_t *p)
-void pcap_dump_close(pcap_dumper_t *p)
-.ft
-.fi
-.SH DESCRIPTION
-The Packet Capture library
-provides a high level interface to packet capture systems. All packets
-on the network, even those destined for other hosts, are accessible
-through this mechanism.
-.PP
-.SH ROUTINES
-NOTE:
-.I errbuf
-in
-.BR pcap_open_live() ,
-.BR pcap_open_dead() ,
-.BR pcap_open_offline() ,
-.BR pcap_fopen_offline() ,
-.BR pcap_setnonblock() ,
-.BR pcap_getnonblock() ,
-.BR pcap_findalldevs() ,
-.BR pcap_lookupdev() ,
-and
-.B pcap_lookupnet()
-is assumed to be able to hold at least
-.B PCAP_ERRBUF_SIZE
-chars.
-.PP
-.B pcap_open_live()
-is used to obtain a packet capture descriptor to look
-at packets on the network.
-.I device
-is a string that specifies the network device to open; on Linux systems
-with 2.2 or later kernels, a
-.I device
-argument of "any" or
-.B NULL
-can be used to capture packets from all interfaces.
-.I snaplen
-specifies the maximum number of bytes to capture.  If this value is less
-than the size of a packet that is captured, only the first
-.I snaplen
-bytes of that packet will be captured and provided as packet data.  A
-value of 65535 should be sufficient, on most if not all networks, to
-capture all the data available from the packet.
-.I promisc
-specifies if the interface is to be put into promiscuous mode.
-(Note that even if this parameter is false, the interface
-could well be in promiscuous mode for some other reason.)  For now, this
-doesn't work on the "any" device; if an argument of "any" or NULL is
-supplied, the
-.I promisc
-flag is ignored.
-.I to_ms
-specifies the read timeout in milliseconds.  The read timeout is used to
-arrange that the read not necessarily return immediately when a packet
-is seen, but that it wait for some amount of time to allow more packets
-to arrive and to read multiple packets from the OS kernel in one
-operation.  Not all platforms support a read timeout; on platforms that
-don't, the read timeout is ignored.  A zero value for
-.IR to_ms ,
-on platforms that support a read timeout,
-will cause a read to wait forever to allow enough packets to
-arrive, with no timeout.
-.I errbuf
-is used to return error or warning text.  It will be set to error text when
-.B pcap_open_live()
-fails and returns
-.BR NULL .
-.I errbuf
-may also be set to warning text when
-.B pcap_open_live()
-succeds; to detect this case the caller should store a zero-length string in
-.I errbuf
-before calling
-.B pcap_open_live()
-and display the warning to the user if
-.I errbuf
-is no longer a zero-length string.
-.PP
-.B pcap_open_dead()
-is used for creating a
-.B pcap_t
-structure to use when calling the other functions in libpcap.  It is
-typically used when just using libpcap for compiling BPF code.
-.PP
-.B pcap_open_offline()
-is called to open a ``savefile'' for reading.
-.I fname
-specifies the name of the file to open. The file has
-the same format as those used by
-.B tcpdump(1)
-and
-.BR tcpslice(1) .
-The name "-" in a synonym for
-.BR stdin .
-Alternatively, you may call
-.B pcap_fopen_offline()
-to read dumped data from an existing open stream
-.IR fp .
-Note that on Windows, that stream should be opened in binary mode.
-.I errbuf
-is used to return error text and is only set when
-.B pcap_open_offline()
-or
-.B pcap_fopen_offline()
-fails and returns
-.BR NULL .
-.PP
-.B pcap_dump_open()
-is called to open a ``savefile'' for writing. The name "-" in a synonym
-for
-.BR stdout .
-.B NULL
-is returned on failure.
-.I p
-is a
-.I pcap
-struct as returned by
-.B pcap_open_offline()
-or
-.BR pcap_open_live() .
-.I fname
-specifies the name of the file to open. Alternatively, you may call
-.B pcap_dump_fopen()
-to write data to an existing open stream
-.IR fp .
-Note that on Windows, that stream should be opened in binary mode.
-If
-.B NULL
-is returned,
-.B pcap_geterr()
-can be used to get the error text.
-.PP
-.PP
-.B pcap_setnonblock()
-puts a capture descriptor, opened with
-.BR pcap_open_live() ,
-into ``non-blocking'' mode, or takes it out of ``non-blocking'' mode,
-depending on whether the
-.I nonblock
-argument is non-zero or zero.  It has no effect on ``savefiles''.
-If there is an error, \-1 is returned and
-.I errbuf
-is filled in with an appropriate error message; otherwise, 0 is
-returned.
-In
-``non-blocking'' mode, an attempt to read from the capture descriptor
-with
-.B pcap_dispatch()
-will, if no packets are currently available to be read, return 0
-immediately rather than blocking waiting for packets to arrive.
-.B pcap_loop()
-and
-.B pcap_next()
-will not work in ``non-blocking'' mode.
-.PP
-.B pcap_getnonblock()
-returns the current ``non-blocking'' state of the capture descriptor; it
-always returns 0 on ``savefiles''.
-If there is an error, \-1 is returned and
-.I errbuf
-is filled in with an appropriate error message.
-.PP
-.B pcap_findalldevs()
-constructs a list of network devices that can be opened with
-.BR pcap_open_live() .
-(Note that there may be network devices that cannot be opened with
-.BR pcap_open_live()
-by the
-process calling
-.BR pcap_findalldevs() ,
-because, for example, that process might not have sufficient privileges
-to open them for capturing; if so, those devices will not appear on the
-list.)
-.I alldevsp
-is set to point to the first element of the list; each element of the
-list is of type
-.BR pcap_if_t ,
-and has the following members:
-.RS
-.TP
-.B next
-if not
-.BR NULL ,
-a pointer to the next element in the list;
-.B NULL
-for the last element of the list
-.TP
-.B name
-a pointer to a string giving a name for the device to pass to
-.B pcap_open_live()
-.TP
-.B description
-if not
-.BR NULL ,
-a pointer to a string giving a human-readable description of the device
-.TP
-.B addresses
-a pointer to the first element of a list of addresses for the interface
-.TP
-.B flags
-interface flags:
-.RS
-.TP
-.B PCAP_IF_LOOPBACK
-set if the interface is a loopback interface
-.RE
-.RE
-.PP
-Each element of the list of addresses is of type
-.BR pcap_addr_t ,
-and has the following members:
-.RS
-.TP
-.B next
-if not
-.BR NULL ,
-a pointer to the next element in the list;
-.B NULL
-for the last element of the list
-.TP
-.B addr
-a pointer to a
-.B "struct sockaddr"
-containing an address
-.TP
-.B netmask
-if not
-.BR NULL ,
-a pointer to a
-.B "struct sockaddr"
-that contains the netmask corresponding to the address pointed to by
-.B addr
-.TP
-.B broadaddr
-if not
-.BR NULL ,
-a pointer to a
-.B "struct sockaddr"
-that contains the broadcast address corresponding to the address pointed
-to by
-.BR addr ;
-may be null if the interface doesn't support broadcasts
-.TP
-.B dstaddr
-if not
-.BR NULL ,
-a pointer to a
-.B "struct sockaddr"
-that contains the destination address corresponding to the address pointed
-to by
-.BR addr ;
-may be null if the interface isn't a point-to-point interface
-.RE
-.PP
-Note that not all the addresses in the list of addresses are
-necessarily IPv4 or IPv6 addresses - you must check the
-.B sa_family
-member of the
-.B "struct sockaddr"
-before interpreting the contents of the address.
-.PP
-.B \-1
-is returned on failure, in which case
-.B errbuf
-is filled in with an appropriate error message;
-.B 0
-is returned on success.
-.PP
-.B pcap_freealldevs()
-is used to free a list allocated by
-.BR pcap_findalldevs() .
-.PP
-.B pcap_lookupdev()
-returns a pointer to a network device suitable for use with
-.B pcap_open_live()
-and
-.BR pcap_lookupnet() .
-If there is an error,
-.B NULL
-is returned and
-.I errbuf
-is filled in with an appropriate error message.
-.PP
-.B pcap_lookupnet()
-is used to determine the network number and mask
-associated with the network device
-.BR device .
-Both
-.I netp
-and
-.I maskp
-are
-.I bpf_u_int32
-pointers.
-A return of \-1 indicates an error in which case
-.I errbuf
-is filled in with an appropriate error message.
-.PP
-.B pcap_dispatch()
-is used to collect and process packets.
-.I cnt
-specifies the maximum number of packets to process before returning.
-This is not a minimum number; when reading a live capture, only one
-bufferful of packets is read at a time, so fewer than
-.I cnt
-packets may be processed. A
-.I cnt
-of \-1 processes all the packets received in one buffer when reading a
-live capture, or all the packets in the file when reading a
-``savefile''.
-.I callback
-specifies a routine to be called with three arguments:
-a
-.I u_char
-pointer which is passed in from
-.BR pcap_dispatch() ,
-a
-.I const struct pcap_pkthdr
-pointer to a structure with the following members:
-.RS
-.TP
-.B ts
-a
-.I struct timeval
-containing the time when the packet was captured
-.TP
-.B caplen
-a
-.I bpf_u_int32
-giving the number of bytes of the packet that are available from the
-capture
-.TP
-.B len
-a
-.I bpf_u_int32
-giving the length of the packet, in bytes (which might be more than the
-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
-and a
-.I const u_char
-pointer to the first
-.B caplen
-(as given in the
-.I struct pcap_pkthdr
-a pointer to which is passed to the callback routine)
-bytes of data from the packet (which won't necessarily be the entire
-packet; to capture the entire packet, you will have to provide a value
-for
-.I snaplen
-in your call to
-.B pcap_open_live()
-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).
-.PP
-The number of packets read is returned.
-0 is returned if no packets were read from a live capture (if, for
-example, they were discarded because they didn't pass the packet filter,
-or if, on platforms that support a read timeout that starts before any
-packets arrive, the timeout expires before any packets arrive, or if the
-file descriptor for the capture device is in non-blocking mode and no
-packets were available to be read) or if no more packets are available
-in a ``savefile.'' A return of \-1 indicates
-an error in which case
-.B pcap_perror()
-or
-.B pcap_geterr()
-may be used to display the error text.
-A return of \-2 indicates that the loop terminated due to a call to
-.B pcap_breakloop()
-before any packets were processed.
-.ft B
-If your application uses pcap_breakloop(),
-make sure that you explicitly check for \-1 and \-2, rather than just
-checking for a return value < 0.
-.ft R
-.PP
-.BR NOTE :
-when reading a live capture,
-.B pcap_dispatch()
-will not necessarily return when the read times out; on some platforms,
-the read timeout isn't supported, and, on other platforms, the timer
-doesn't start until at least one packet arrives.  This means that the
-read timeout should
-.B NOT
-be used in, for example, an interactive application, to allow the packet
-capture loop to ``poll'' for user input periodically, as there's no
-guarantee that
-.B pcap_dispatch()
-will return after the timeout expires.
-.PP
-.B pcap_loop()
-is similar to
-.B pcap_dispatch()
-except it keeps reading packets until
-.I cnt
-packets are processed or an error occurs.
-It does
-.B not
-return when live read timeouts occur.
-Rather, specifying a non-zero read timeout to
-.B pcap_open_live()
-and then calling
-.B pcap_dispatch()
-allows the reception and processing of any packets that arrive when the
-timeout occurs.
-A negative
-.I cnt
-causes
-.B pcap_loop()
-to loop forever (or at least until an error occurs).  \-1 is returned on
-an error; 0 is returned if
-.I cnt
-is exhausted; \-2 is returned if the loop terminated due to a call to
-.B pcap_breakloop()
-before any packets were processed.
-.ft B
-If your application uses pcap_breakloop(),
-make sure that you explicitly check for \-1 and \-2, rather than just
-checking for a return value < 0.
-.ft R
-.PP
-.B pcap_next()
-reads the next packet (by calling
-.B pcap_dispatch()
-with a
-.I cnt
-of 1) and returns a
-.I u_char
-pointer to the data in that packet.  (The
-.I pcap_pkthdr
-struct for that packet is not supplied.)
-.B NULL
-is returned if an error occured, or if no packets were read from a live
-capture (if, for example, they were discarded because they didn't pass
-the packet filter, or if, on platforms that support a read timeout that
-starts before any packets arrive, the timeout expires before any packets
-arrive, or if the file descriptor for the capture device is in
-non-blocking mode and no packets were available to be read), or if no
-more packets are available in a ``savefile.''  Unfortunately, there is
-no way to determine whether an error occured or not.
-.PP
-.B pcap_next_ex()
-reads the next packet and returns a success/failure indication:
-.RS
-.TP
-1
-the packet was read without problems
-.TP
-0
-packets are being read from a live capture, and the timeout expired
-.TP
-\-1
-an error occurred while reading the packet
-.TP
-\-2
-packets are being read from a ``savefile'', and there are no more
-packets to read from the savefile.
-.RE
-.PP
-If the packet was read without problems, the pointer pointed to by the
-.I pkt_header
-argument is set to point to the
-.I pcap_pkthdr
-struct for the packet, and the
-pointer pointed to by the
-.I pkt_data
-argument is set to point to the data in the packet.
-.PP
-.B pcap_breakloop()
-sets a flag that will force
-.B pcap_dispatch()
-or
-.B pcap_loop()
-to return rather than looping; they will return the number of packets
-that have been processed so far, or \-2 if no packets have been
-processed so far.
-.PP
-This routine is safe to use inside a signal handler on UNIX or a console
-control handler on Windows, as it merely sets a flag that is checked
-within the loop.
-.PP
-The flag is checked in loops reading packets from the OS - a signal by
-itself will not necessarily terminate those loops - as well as in loops
-processing a set of packets returned by the OS.
-.ft B
-Note that if you are catching signals on UNIX systems that support
-restarting system calls after a signal, and calling pcap_breakloop()
-in the signal handler, you must specify, when catching those signals,
-that system calls should NOT be restarted by that signal.  Otherwise,
-if the signal interrupted a call reading packets in a live capture,
-when your signal handler returns after calling pcap_breakloop(), the
-call will be restarted, and the loop will not terminate until more
-packets arrive and the call completes.
-.PP
-Note also that, in a multi-threaded application, if one thread is
-blocked in
-.BR pcap_dispatch() ,
-.BR pcap_loop() ,
-.BR pcap_next() ,
-or
-.BR pcap_next_ex() ,
-a call to
-.B pcap_breakloop()
-in a different thread will not unblock that thread; you will need to use
-whatever mechanism the OS provides for breaking a thread out of blocking
-calls in order to unblock the thread, such as thread cancellation in
-systems that support POSIX threads.
-.ft R
-.PP
-Note that
-.B pcap_next()
-will, on some platforms, loop reading packets from the OS; that loop
-will not necessarily be terminated by a signal, so
-.B pcap_breakloop()
-should be used to terminate packet processing even if
-.B pcap_next()
-is being used.
-.PP
-.B pcap_breakloop()
-does not guarantee that no further packets will be processed by
-.B pcap_dispatch()
-or
-.B pcap_loop()
-after it is called; at most one more packet might be processed.
-.PP
-If \-2 is returned from
-.B pcap_dispatch()
-or
-.BR pcap_loop() ,
-the flag is cleared, so a subsequent call will resume reading packets. 
-If a positive number is returned, the flag is not cleared, so a
-subsequent call will return \-2 and clear the flag.
-.PP
-.B pcap_inject()
-sends a raw packet through the network interface;
-.I buf
-points to the data of the packet, including the link-layer header, and
-.I size
-is the number of bytes in the packet.
-It returns the number of bytes written on success.  A return of \-1
-indicates an error in which case
-.B pcap_perror()
-or
-.B pcap_geterr()
-may be used to display the error text.
-Note that, even if you successfully open the network interface, you
-might not have permission to send packets on it, or it might not support
-sending packets; as
-.I pcap_open_live()
-doesn't have a flag to indicate whether to open for capturing, sending,
-or capturing and sending, you cannot request an open that supports
-sending and be notified at open time whether sending will be possible.
-Note also that some devices might not support sending packets.
-.PP
-Note that, on some platforms, the link-layer header of the packet that's
-sent might not be the same as the link-layer header of the packet
-supplied to
-.BR pcap_inject() ,
-as the source link-layer address, if the header contains such an
-address, might be changed to be the address assigned to the interface on
-which the packet it sent, if the platform doesn't support sending
-completely raw and unchanged packets.  Even worse, some drivers on some
-platforms might change the link-layer type field to whatever value
-libpcap used when attaching to the device, even on platforms that
-.I do
-nominally support sending completely raw and unchanged packets.
-.PP
-.B pcap_sendpacket()
-is like
-.BR pcap_inject() ,
-but it returns 0 on success and \-1 on failure.
-.RB ( pcap_inject()
-comes from OpenBSD;
-.B pcap_sendpacket()
-comes from WinPcap.  Both are provided for compatibility.)
-.PP
-.B pcap_dump()
-outputs a packet to the ``savefile'' opened with
-.BR pcap_dump_open() .
-Note that its calling arguments are suitable for use with
-.B pcap_dispatch()
-or
-.BR pcap_loop() .
-If called directly, the 
-.I user
-parameter is of type 
-.I pcap_dumper_t
-as returned by
-.BR pcap_dump_open() .
-.PP
-.B pcap_compile()
-is used to compile the string
-.I str
-into a filter program.
-.I program
-is a pointer to a
-.I bpf_program
-struct and is filled in by
-.BR pcap_compile() .
-.I optimize
-controls whether optimization on the resulting code is performed.
-.I netmask
-specifies the IPv4 netmask of the network on which packets are being
-captured; it is used only when checking for IPv4 broadcast addresses in
-the filter program.  If the netmask of the network on which packets are
-being captured isn't known to the program, or if packets are being
-captured on the Linux "any" pseudo-interface that can capture on more
-than one network, a value of 0 can be supplied; tests for IPv4 broadcast
-addreses won't be done correctly, but all other tests in the filter
-program will be OK.  A return of \-1 indicates an error in which case
-.BR pcap_geterr()
-may be used to display the error text.
-.PP
-.B pcap_compile_nopcap()
-is similar to
-.B pcap_compile()
-except that instead of passing a pcap structure, one passes the
-snaplen and linktype explicitly.  It is intended to be used for
-compiling filters for direct BPF usage, without necessarily having
-called
-.BR pcap_open() .
-A return of \-1 indicates an error; the error text is unavailable.
-.RB ( pcap_compile_nopcap()
-is a wrapper around
-.BR pcap_open_dead() ,
-.BR pcap_compile() ,
-and
-.BR pcap_close() ;
-the latter three routines can be used directly in order to get the error
-text for a compilation error.)
-.B
-.PP
-.B pcap_setfilter()
-is used to specify a filter program.
-.I fp
-is a pointer to a
-.I bpf_program
-struct, usually the result of a call to
-.BR pcap_compile() .
-.B \-1
-is returned on failure, in which case
-.BR pcap_geterr()
-may be used to display the error text;
-.B 0
-is returned on success.
-.PP
-.B pcap_freecode()
-is used to free up allocated memory pointed to by a
-.I bpf_program
-struct generated by
-.B pcap_compile()
-when that BPF program is no longer needed, for example after it
-has been made the filter program for a pcap structure by a call to
-.BR pcap_setfilter() .
-.PP
-.B pcap_setdirection()
-is used to specify a direction that packets will be captured.
-.I pcap_direction_t 
-is one of the constants
-.BR PCAP_D_IN ,
-.B PCAP_D_OUT
-or 
-.BR PCAP_D_INOUT .
-.B PCAP_D_IN
-will only capture packets received by the device,
-.B PCAP_D_OUT
-will only capture packets sent by the device and
-.B PCAP_D_INOUT
-will capture packets received by or sent by the device.
-.B PCAP_D_INOUT
-is the default setting if this function is not called.  This isn't
-necessarily supported on all platforms; some platforms might return an
-error, and some other platforms might not support
-.BR PCAP_D_OUT .
-This operation is not supported if a ``savefile'' is being read.
-.B \-1
-is returned on failure,
-.B 0
-is returned on success.
-.PP
-.B pcap_datalink()
-returns the link layer type; link layer types it can return include:
-.PP
-.RS 5
-.TP 5
-.B DLT_NULL
-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
-.B DLT_EN10MB
-Ethernet (10Mb, 100Mb, 1000Mb, and up)
-.TP 5
-.B DLT_IEEE802
-IEEE 802.5 Token Ring
-.TP 5
-.B DLT_ARCNET
-ARCNET
-.TP 5
-.B DLT_SLIP
-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
-.B DLT_PPP
-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
-.B DLT_FDDI
-FDDI
-.TP 5
-.B DLT_ATM_RFC1483
-RFC 1483 LLC/SNAP-encapsulated ATM; the packet begins with an IEEE 802.2
-LLC header.
-.TP 5
-.B DLT_RAW
-raw IP; the packet begins with an IP header.
-.TP 5
-.B DLT_PPP_SERIAL
-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
-.B DLT_PPP_ETHER
-PPPoE; the packet begins with a PPPoE header, as per RFC 2516.
-.TP 5
-.B DLT_C_HDLC
-Cisco PPP with HDLC framing, as per section 4.3.1 of RFC 1547.
-.TP 5
-.B DLT_IEEE802_11
-IEEE 802.11 wireless LAN
-.TP 5
-.B DLT_FRELAY
-Frame Relay
-.TP 5
-.B DLT_LOOP
-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
-.B DLT_LINUX_SLL
-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
-.B DLT_LTALK
-Apple LocalTalk; the packet begins with an AppleTalk LLAP header.
-.TP 5
-.B DLT_PFLOG
-OpenBSD pflog; the link layer header contains, in order:
-.RS 10
-.LP
-a 1-byte header length, in host byte order;
-.LP
-a 4-byte PF_ value, in host byte order;
-.LP
-a 2-byte action code, in network byte order, which is one of:
-.RS 5
-.TP 5
-0
-passed
-.TP 5
-1
-dropped
-.TP 5
-2
-scrubbed
-.RE
-.LP
-a 2-byte reason code, in network byte order, which is one of:
-.RS 5
-.TP 5
-0
-match
-.TP 5
-1
-bad offset
-.TP 5
-2
-fragment
-.TP 5
-3
-short
-.TP 5
-4
-normalize
-.TP 5
-5
-memory
-.RE
-.LP
-a 16-character interface name;
-.LP
-a 16-character ruleset name (only meaningful if subrule is set);
-.LP
-a 4-byte rule number, in network byte order;
-.LP
-a 4-byte subrule number, in network byte order;
-.LP
-a 1-byte direction, in network byte order, which is one of:
-.RS 5
-.TP 5
-0
-incoming or outgoing
-.TP 5
-1
-incoming
-.TP 5
-2
-outgoing
-.RE
-.RE
-.TP 5
-.B DLT_PRISM_HEADER
-Prism monitor mode information followed by an 802.11 header.
-.TP 5
-.B DLT_IP_OVER_FC
-RFC 2625 IP-over-Fibre Channel, with the link-layer header being the
-Network_Header as described in that RFC.
-.TP 5
-.B DLT_SUNATM
-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
-.B DLT_IEEE802_11_RADIO
-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
-.B DLT_ARCNET_LINUX
-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
-.B DLT_LINUX_IRDA
-Linux-IrDA packets, with a
-.B DLT_LINUX_SLL
-header followed by the IrLAP header.
-.TP 5
-.B DLT_LINUX_LAPD
-LAPD (Q.921) frames, with a
-.B DLT_LINUX_SLL
-header captured via vISDN.
-.RE
-.PP
-.B pcap_list_datalinks()
-is used to get a list of the supported data link types of the interface
-associated with the pcap descriptor.
-.B pcap_list_datalinks()
-allocates an array to hold the list and sets
-.IR *dlt_buf .
-The caller is responsible for freeing the array.
-.B \-1
-is returned on failure;
-otherwise, the number of data link types in the array is returned.
-.PP
-.B pcap_set_datalink()
-is used to set the current data link type of the pcap descriptor
-to the type specified by
-.IR dlt .
-.B \-1
-is returned on failure.
-.PP
-.B pcap_datalink_name_to_val()
-translates a data link type name, which is a
-.B DLT_
-name with the
-.B DLT_
-removed, to the corresponding data link type value.  The translation
-is case-insensitive.  
-.B \-1
-is returned on failure.
-.PP
-.B pcap_datalink_val_to_name()
-translates a data link type value to the corresponding data link type
-name.  NULL is returned on failure.
-.PP
-.B pcap_datalink_val_to_description()
-translates a data link type value to a short description of that data
-link type.  NULL is returned on failure.
-.PP
-.B pcap_snapshot()
-returns the snapshot length specified when
-.B pcap_open_live()
-was called.
-.PP
-.B pcap_is_swapped()
-returns true if the current ``savefile'' uses a different byte order
-than the current system.
-.PP
-.B pcap_major_version()
-returns the major number of the file format of the savefile;
-.B pcap_minor_version()
-returns the minor number of the file format of the savefile.  The
-version number is stored in the header of the savefile.
-.PP
-.B pcap_file()
-returns the standard I/O stream of the ``savefile,'' if a ``savefile''
-was opened with
-.BR pcap_open_offline() ,
-or NULL, if a network device was opened with
-.BR pcap_open_live() .
-.PP
-.B pcap_stats()
-returns 0 and fills in the
-.B pcap_stat
-structure pointed to by its second argument.  The values represent
-packet statistics from the start of the run to the time of the call.  If
-there is an error or the underlying packet capture doesn't support
-packet statistics, \-1 is returned and the error text can be obtained
-with
-.B pcap_perror()
-or
-.BR pcap_geterr() .
-.B pcap_stats()
-is supported only on live captures, not on ``savefiles''; no statistics
-are stored in ``savefiles'', so no statistics are available when reading
-from a ``savefile''.
-.PP
-.B pcap_fileno()
-returns the file descriptor number from which captured packets are read,
-if a network device was opened with
-.BR pcap_open_live() ,
-or \-1, if a ``savefile'' was opened with
-.BR pcap_open_offline() .
-.PP
-.B pcap_get_selectable_fd()
-returns, on UNIX, a file descriptor number for a file descriptor on
-which one can
-do a
-.B select()
-or
-.B poll()
-to wait for it to be possible to read packets without blocking, if such
-a descriptor exists, or \-1, if no such descriptor exists.  Some network
-devices opened with
-.B pcap_open_live()
-do not support
-.B select()
-or
-.B poll()
-(for example, regular network devices on FreeBSD 4.3 and 4.4, and Endace
-DAG devices), so \-1 is returned for those devices.
-.PP
-Note that on most versions of most BSDs (including Mac OS X)
-.B select()
-and
-.B poll()
-do not work correctly on BPF devices;
-.B pcap_get_selectable_fd()
-will return a file descriptor on most of those versions (the exceptions
-being FreeBSD 4.3 and 4.4), a simple
-.B select()
-or
-.B poll()
-will not return even after a timeout specified in
-.B pcap_open_live()
-expires.  To work around this, an application that uses
-.B select()
-or
-.B poll()
-to wait for packets to arrive must put the
-.B pcap_t
-in non-blocking mode, and must arrange that the
-.B select()
-or
-.B poll()
-have a timeout less than or equal to the timeout specified in
-.BR pcap_open_live() ,
-and must try to read packets after that timeout expires, regardless of
-whether
-.B select()
-or
-.B poll()
-indicated that the file descriptor for the
-.B pcap_t
-is ready to be read or not.  (That workaround will not work in FreeBSD
-4.3 and later; however, in FreeBSD 4.6 and later,
-.B select()
-and
-.B poll()
-work correctly on BPF devices, so the workaround isn't necessary,
-although it does no harm.)
-.PP
-.B pcap_get_selectable_fd()
-is not available on Windows.
-.PP
-.B pcap_perror()
-prints the text of the last pcap library error on
-.BR stderr ,
-prefixed by
-.IR prefix .
-.PP
-.B pcap_geterr()
-returns the error text pertaining to the last pcap library error.
-.BR NOTE :
-the pointer it returns will no longer point to a valid error message
-string after the
-.B pcap_t
-passed to it is closed; you must use or copy the string before closing
-the
-.BR pcap_t .
-.PP
-.B pcap_strerror()
-is provided in case
-.BR strerror (1)
-isn't available.
-.PP
-.B pcap_lib_version()
-returns a pointer to a string giving information about the version of
-the libpcap library being used; note that it contains more information
-than just a version number.
-.PP
-.B pcap_close()
-closes the files associated with
-.I p
-and deallocates resources.
-.PP
-.B pcap_dump_file()
-returns the standard I/O stream of the ``savefile'' opened by
-.BR pcap_dump_open().
-.PP
-.B pcap_dump_flush()
-flushes the output buffer to the ``savefile,'' so that any packets
-written with
-.B pcap_dump()
-but not yet written to the ``savefile'' will be written.
-.B \-1
-is returned on error, 0 on success.
-.PP
-.B pcap_dump_ftell()
-returns the current file position for the ``savefile'', representing the
-number of bytes written by
-.B pcap_dump_open()
-and
-.BR pcap_dump() .
-.B \-1
-is returned on error.
-.PP
-.B pcap_dump_close()
-closes the ``savefile.''
-.PP
-.SH SEE ALSO
-tcpdump(1), tcpslice(1)
-.SH AUTHORS
-The original authors are:
-.LP
-Van Jacobson,
-Craig Leres and
-Steven McCanne, all of the
-Lawrence Berkeley National Laboratory, University of California, Berkeley, CA.
-.LP
-The current version is available from "The Tcpdump Group"'s Web site at
-.LP
-.RS
-.I http://www.tcpdump.org/
-.RE
-.SH BUGS
-Please send problems, bugs, questions, desirable enhancements, etc. to:
-.LP
-.RS
-tcpdump-workers@tcpdump.org
-.RE
-.LP
-Please send source code contributions, etc. to:
-.LP
-.RS
-patches@tcpdump.org
-.RE
diff --git a/pcap.3pcap.in b/pcap.3pcap.in
new file mode 100644
index 0000000..1408deb
--- /dev/null
+++ b/pcap.3pcap.in
@@ -0,0 +1,909 @@
+.\" @(#) $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.
+.\"
+.\" 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 3PCAP "1 July 2013"
+.SH NAME
+pcap \- Packet Capture library
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.LP
+.ft B
+.ft
+.fi
+.SH DESCRIPTION
+The Packet Capture library
+provides a high level interface to packet capture systems. All packets
+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''.
+.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 ().
+.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
+.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"
+If, when capturing, you capture the entire contents of the packet, that
+requires more CPU time to copy the packet to your application, more disk
+and possibly network bandwidth to write the packet data to a file, and
+more disk space to save the packet.  If you don't need the entire
+contents of the packet - for example, if you are only interested in the
+TCP headers of packets - you can set the "snapshot length" for the
+capture to an appropriate value.  If the snapshot length is set to
+.IR snaplen ,
+and
+.I snaplen
+is less
+than the size of a packet that is captured, only the first
+.I snaplen
+bytes of that packet will be captured and provided as packet data.
+.IP
+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 ().
+.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
+packets passing through the switch are sent, a network adapter receives
+all packets on the LAN, including unicast or multicast packets not sent
+to a network address that the network adapter isn't configured to
+recognize.
+.IP
+Normally, the adapter will discard those packets; however, many network
+adapters support "promiscuous mode", which is a mode in which all
+packets, even if they are not sent to an address that the adapter
+recognizes, are provided to the host.  This is useful for passively
+capturing traffic between two or more other hosts for analysis.
+.IP
+Note that even if an application does not set promiscuous mode, the
+adapter could well be in promiscuous mode for some other reason.
+.IP
+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 ().
+.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
+associated.  It might also supply only data frames, not management or
+control frames, and might not provide the 802.11 header or radio
+information pseudo-header for those frames.
+.IP
+In "monitor mode", sometimes also called "rfmon mode" (for "Radio
+Frequency MONitor"), the adapter will supply all frames that it
+receives, with 802.11 headers, and might supply a pseudo-header with
+radio information about the frame as well.
+.IP
+Note that in monitor mode the adapter might disassociate from the
+network with which it's associated, so that you will not be able to use
+any wireless networks with that adapter.  This could prevent accessing
+files on a network server, or resolving host names or network addresses,
+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 (),
+and
+.BR pcap_can_set_rfmon ()
+can be used to determine whether an adapter can be put into monitor
+mode.
+.IP "read timeout"
+If, when capturing, packets are delivered as soon as they arrive, the
+application capturing the packets will be woken up for each packet as it
+arrives, and might have to make one or more calls to the operating
+system to fetch each packet.
+.IP
+If, instead, packets are not delivered as soon as they arrive, but are
+delivered after a short delay (called a "read timeout"), more than one
+packet can be accumulated before the packets are delivered, so that a
+single wakeup would be done for multiple packets, and each set of calls
+made to the operating system would supply multiple packets, rather than
+a single packet.  This reduces the per-packet CPU overhead if packets
+are arriving at a high rate, increasing the number of packets per second
+that can be captured.
+.IP
+The read timeout is required so that an application won't wait for the
+operating system's capture buffer to fill up before packets are
+delivered; if packets are arriving slowly, that wait could take an
+arbitrarily long period of time.
+.IP
+Not all platforms support a read timeout; on platforms that
+don't, the read timeout is ignored.  A zero value for the timeout,
+on platforms that support a read timeout, has platform-dependent
+behavior that could cause a read to wait for an unlimited amount
+of time until the capture buffer fills up or could cause a read timeout
+of 1 millisecond to be used.  We recommend that a value of zero not be
+used.
+.IP
+.BR NOTE :
+the read timeout cannot be used to cause calls that read
+packets to return within a limited period of time, because, on some
+platforms, the read timeout isn't supported, and, on other platforms,
+the timer doesn't start until at least one packet arrives.  This means
+that the read timeout should
+.B NOT
+be used, for example, in an interactive application to allow the packet
+capture loop to ``poll'' for user input periodically, as there's no
+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 ().
+.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
+some platforms, the buffer's size can be set; a size that's too small
+could mean that, if too many packets are being captured and the snapshot
+length doesn't limit the amount of data that's buffered, packets could
+be dropped if the buffer fills up before the application can read
+packets from it, while a size that's too large could use more
+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 ().
+.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:
+.TP
+.B Under SunOS 3.x or 4.x with NIT or BPF:
+You must have read access to
+.I /dev/nit
+or
+.IR /dev/bpf* .
+.TP
+.B Under Solaris with DLPI:
+You must have read/write access to the network pseudo device, e.g.
+.IR /dev/le .
+On at least some versions of Solaris, however, this is not sufficient to
+allow
+.I tcpdump
+to capture in promiscuous mode; on those versions of Solaris, you must
+be root, or the application capturing packets
+must be installed setuid to root, in order to capture in promiscuous
+mode.  Note that, on many (perhaps all) interfaces, if you don't capture
+in promiscuous mode, you will not see any outgoing packets, so a capture
+not done in promiscuous mode may not be very useful.
+.IP
+In newer versions of Solaris, you must have been given the
+.B net_rawaccess
+privilege; this is both necessary and sufficient to give you access to the
+network pseudo-device - there is no need to change the privileges on
+that device.  A user can be given that privilege by, for example, adding
+that privilege to the user's
+.B defaultpriv
+key with the
+.B usermod (1M)
+command.
+.TP
+.B Under HP-UX with DLPI:
+You must be root or the application capturing packets must be installed
+setuid to root.
+.TP
+.B Under IRIX with snoop:
+You must be root or the application capturing packets must be installed
+setuid to root.
+.TP
+.B Under Linux:
+You must be root or the application capturing packets must be installed
+setuid to root (unless your distribution has a kernel
+that supports capability bits such as CAP_NET_RAW and code to allow
+those capability bits to be given to particular accounts and to cause
+those bits to be set on a user's initial processes when they log in, in
+which case you  must have CAP_NET_RAW in order to capture and
+CAP_NET_ADMIN to enumerate network devices with, for example, the
+.B \-D
+flag).
+.TP
+.B Under ULTRIX and Digital UNIX/Tru64 UNIX:
+Any user may capture network traffic.
+However, no user (not even the super-user) can capture in promiscuous
+mode on an interface unless the super-user has enabled promiscuous-mode
+operation on that interface using
+.IR pfconfig (8),
+and no user (not even the super-user) can capture unicast traffic
+received by or sent by the machine on an interface unless the super-user
+has enabled copy-all-mode operation on that interface using
+.IR pfconfig ,
+so
+.I useful
+packet capture on an interface probably requires that either
+promiscuous-mode or copy-all-mode operation, or both modes of
+operation, be enabled on that interface.
+.TP
+.B Under BSD (this includes Mac OS X):
+You must have read access to
+.I /dev/bpf*
+on systems that don't have a cloning BPF device, or to
+.I /dev/bpf
+on systems that do.
+On BSDs with a devfs (this includes Mac OS X), this might involve more
+than just having somebody with super-user access setting the ownership
+or permissions on the BPF devices - it might involve configuring devfs
+to set the ownership or permissions every time the system is booted,
+if the system even supports that; if it doesn't support that, you might
+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
+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
+Do
+.B NOT
+assume that the packets for a given capture or ``savefile`` will have
+any given link-layer header type, such as
+.B DLT_EN10MB
+for Ethernet.  For example, the "any" device on Linux will have a
+link-layer header type of
+.B DLT_LINUX_SLL
+even if all devices on the system at the time the "any" device is opened
+have some other data link type, such as
+.B DLT_EN10MB
+for Ethernet.
+.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
+.BR pcap_dispatch ()
+or
+.BR pcap_loop (),
+which process one or more packets, calling a callback routine for each
+packet, or with
+.BR pcap_next ()
+or
+.BR pcap_next_ex (),
+which return the next packet.
+The callback for
+.BR pcap_dispatch ()
+and
+.BR pcap_loop ()
+is supplied a pointer to a
+.IR "struct pcap_pkthdr" ,
+which includes the following members:
+.RS
+.TP
+.B ts
+a
+.I struct timeval
+containing the time when the packet was captured
+.TP
+.B caplen
+a
+.I bpf_u_int32
+giving the number of bytes of the packet that are available from the
+capture
+.TP
+.B len
+a
+.I bpf_u_int32
+giving the length of the packet, in bytes (which might be more than the
+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
+The callback is also supplied a
+.I const u_char
+pointer to the first
+.B caplen
+(as given in the
+.I struct pcap_pkthdr
+mentioned above)
+bytes of data from the packet.  This won't necessarily be the entire
+packet; to capture the entire packet, you will have to provide a value
+for
+.I snaplen
+in your call to
+.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.
+.PP
+.BR pcap_next ()
+is passed an argument that points to a
+.I struct pcap_pkthdr
+structure, and fills it in with the time stamp and length values for the
+packet.  It returns a
+.I const u_char
+to the first
+.B caplen
+bytes of the packet on success, and NULL on error.
+.PP
+.BR pcap_next_ex ()
+is passed two pointer arguments, one of which points to a
+.IR struct pcap_pkthdr *
+and one of which points to a 
+.IR "const u_char" *.
+It sets the first pointer to point to a
+.I struct pcap_pkthdr
+structure with the time stamp and length values for the packet, and sets
+the second pointer to point to the first
+.B caplen
+bytes of the packet.
+.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
+.B pcap.h
+header file was not in a
+.B pcap
+directory on most platforms; if you are writing an application that must
+work on versions of libpcap prior to 1.0, include
+.BR <pcap.h> ,
+which will include
+.B <pcap/pcap.h>
+for you, rather than including
+.BR <pcap/pcap.h> .
+.PP
+.BR pcap_create ()
+and
+.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
+.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
+.BR pcap_create ()
+and
+.BR pcap_activate (),
+use an
+.BR autoconf (1)
+script or some other configuration script to check whether the libpcap
+1.0 APIs are available and use them only if they are.
+.SH SEE ALSO
+autoconf(1), tcpdump(1), tcpslice(1), pcap-filter(@MAN_MISC_INFO@), pfconfig(8),
+usermod(1M)
+.SH AUTHORS
+The original authors of libpcap are:
+.LP
+Van Jacobson,
+Craig Leres and
+Steven McCanne, all of the
+Lawrence Berkeley National Laboratory, University of California, Berkeley, CA.
+.LP
+The current version is available from "The Tcpdump Group"'s Web site at
+.LP
+.RS
+.I http://www.tcpdump.org/
+.RE
+.SH BUGS
+Please send problems, bugs, questions, desirable enhancements, etc. to:
+.LP
+.RS
+tcpdump-workers@lists.tcpdump.org
+.RE
diff --git a/pcap.c b/pcap.c
index 0822e1a..6b16cea 100644
--- a/pcap.c
+++ b/pcap.c
@@ -33,7 +33,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/pcap.c,v 1.88.2.19 2007/09/19 02:50:52 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 @@
 #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>
@@ -66,114 +74,171 @@
 #include "pcap-int.h"
 
 #ifdef HAVE_DAG_API
-#include <dagnew.h>
-#include <dagapi.h>
+#include "pcap-dag.h"
+#endif /* HAVE_DAG_API */
+
+#ifdef HAVE_SEPTEL_API
+#include "pcap-septel.h"
+#endif /* HAVE_SEPTEL_API */
+
+#ifdef HAVE_SNF_API
+#include "pcap-snf.h"
+#endif /* HAVE_SNF_API */
+
+#ifdef PCAP_SUPPORT_USB
+#include "pcap-usb-linux.h"
 #endif
 
-int
-pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
-{
+#ifdef PCAP_SUPPORT_BT
+#include "pcap-bt-linux.h"
+#endif
 
-	return p->read_op(p, cnt, callback, user);
+#ifdef PCAP_SUPPORT_CAN
+#include "pcap-can-linux.h"
+#endif
+
+#ifdef PCAP_SUPPORT_CANUSB
+#include "pcap-canusb-linux.h"
+#endif
+
+#ifdef PCAP_SUPPORT_NETFILTER
+#include "pcap-netfilter-linux.h"
+#endif
+
+#ifdef PCAP_SUPPORT_DBUS
+#include "pcap-dbus.h"
+#endif
+
+int 
+pcap_not_initialized(pcap_t *pcap _U_)
+{
+	/* this means 'not initialized' */
+	return (PCAP_ERROR_NOT_ACTIVATED);
+}
+
+#ifdef WIN32
+Adapter *
+pcap_no_adapter(pcap_t *pcap _U_)
+{
+	return (NULL);
+}
+#endif
+
+/*
+ * Returns 1 if rfmon mode can be set on the pcap_t, 0 if it can't,
+ * a PCAP_ERROR value on an error.
+ */
+int
+pcap_can_set_rfmon(pcap_t *p)
+{
+	return (p->can_set_rfmon_op(p));
 }
 
 /*
- * XXX - is this necessary?
+ * For systems where rfmon mode is never supported.
+ */
+static int
+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_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
+pcap_list_tstamp_types(pcap_t *p, int **tstamp_typesp)
 {
-
-	return p->read_op(p, cnt, callback, user);
-}
-
-int
-pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
-{
-	register int n;
-
-	for (;;) {
-		if (p->sf.rfile != NULL) {
-			/*
-			 * 0 means EOF, so don't loop if we get 0.
-			 */
-			n = pcap_offline_read(p, cnt, callback, user);
-		} else {
-			/*
-			 * XXX keep reading until we get something
-			 * (or an error occurs)
-			 */
-			do {
-				n = p->read_op(p, cnt, callback, user);
-			} while (n == 0);
+	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);
 		}
-		if (n <= 0)
-			return (n);
-		if (cnt > 0) {
-			cnt -= n;
-			if (cnt <= 0)
-				return (0);
-		}
+		(void)memcpy(*tstamp_typesp, p->tstamp_type_list,
+		    sizeof(**tstamp_typesp) * p->tstamp_type_count);
 	}
+	return (p->tstamp_type_count);
 }
 
-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)
+/*
+ * 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)
 {
-	struct singleton *sp = (struct singleton *)userData;
+	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.
+ */
+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;
+	*sp->pkt = pkt;
 }
 
 const u_char *
 pcap_next(pcap_t *p, struct pcap_pkthdr *h)
 {
-	struct singleton s;
+	struct oneshot_userdata s;
+	const u_char *pkt;
 
 	s.hdr = h;
-	if (pcap_dispatch(p, 1, pcap_oneshot, (u_char*)&s) <= 0)
+	s.pkt = &pkt;
+	s.pd = p;
+	if (pcap_dispatch(p, 1, p->oneshot_callback, (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;
+	return (pkt);
 }
 
 int 
 pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header,
     const u_char **pkt_data)
 {
-	struct pkt_for_fakecallback s;
+	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) {
+	if (p->rfile != NULL) {
 		int status;
 
 		/* We are on an offline capture */
-		status = pcap_offline_read(p, 1, pcap_fakecallback,
+		status = pcap_offline_read(p, 1, p->oneshot_callback,
 		    (u_char *)&s);
 
 		/*
@@ -203,7 +268,602 @@
 	 * 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));
+	return (p->read_op(p, 1, p->oneshot_callback, (u_char *)&s));
+}
+
+#if defined(DAG_ONLY)
+int
+pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)
+{
+	return (dag_findalldevs(alldevsp, errbuf));
+}
+
+pcap_t *
+pcap_create(const char *source, char *errbuf)
+{
+	return (dag_create(source, errbuf));
+}
+#elif defined(SEPTEL_ONLY)
+int
+pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)
+{
+	return (septel_findalldevs(alldevsp, errbuf));
+}
+
+pcap_t *
+pcap_create(const char *source, char *errbuf)
+{
+	return (septel_create(source, errbuf));
+}
+#elif defined(SNF_ONLY)
+int
+pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)
+{
+	return (snf_findalldevs(alldevsp, errbuf));
+}
+
+pcap_t *
+pcap_create(const char *source, char *errbuf)
+{
+	return (snf_create(source, errbuf));
+}
+#else /* regular pcap */
+struct capture_source_type {
+	int (*findalldevs_op)(pcap_if_t **, char *);
+	pcap_t *(*create_op)(const char *, char *, int *);
+} capture_source_types[] = {
+#ifdef HAVE_DAG_API
+	{ dag_findalldevs, dag_create },
+#endif
+#ifdef HAVE_SEPTEL_API
+	{ septel_findalldevs, septel_create },
+#endif
+#ifdef HAVE_SNF_API
+	{ snf_findalldevs, snf_create },
+#endif
+#ifdef PCAP_SUPPORT_BT
+	{ bt_findalldevs, bt_create },
+#endif
+#if PCAP_SUPPORT_CANUSB
+	{ canusb_findalldevs, canusb_create },
+#endif
+#ifdef PCAP_SUPPORT_CAN
+	{ can_findalldevs, can_create },
+#endif
+#ifdef PCAP_SUPPORT_USB
+	{ usb_findalldevs, usb_create },
+#endif
+#ifdef PCAP_SUPPORT_NETFILTER
+	{ netfilter_findalldevs, netfilter_create },
+#endif
+#ifdef PCAP_SUPPORT_DBUS
+	{ dbus_findalldevs, dbus_create },
+#endif
+	{ NULL, NULL }
+};
+
+/*
+ * Get a list of all capture sources that are up and that we can open.
+ * Returns -1 on error, 0 otherwise.
+ * The list, as returned through "alldevsp", may be null if no interfaces
+ * were up and could be opened.
+ */
+int
+pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)
+{
+	size_t i;
+
+	/*
+	 * Get the list of regular interfaces first.
+	 */ 
+	if (pcap_findalldevs_interfaces(alldevsp, errbuf) == -1)
+		return (-1);	/* failure */
+
+	/*
+	 * Add any interfaces that need a platform-specific mechanism
+	 * to find.
+	 */
+	if (pcap_platform_finddevs(alldevsp, errbuf) == -1) {
+		/*
+		 * We had an error; free the list we've been
+		 * constructing.
+		 */
+		if (*alldevsp != NULL) {
+			pcap_freealldevs(*alldevsp);
+			*alldevsp = NULL;
+		}
+		return (-1);
+	}
+
+	/*
+	 * Ask each of the non-local-network-interface capture
+	 * source types what interfaces they have.
+	 */
+	for (i = 0; capture_source_types[i].findalldevs_op != NULL; i++) {
+		if (capture_source_types[i].findalldevs_op(alldevsp, errbuf) == -1) {
+			/*
+			 * We had an error; free the list we've been
+			 * constructing.
+			 */
+			if (*alldevsp != NULL) {
+				pcap_freealldevs(*alldevsp);
+				*alldevsp = NULL;
+			}
+			return (-1);
+		}
+	}
+	return (0);
+}
+
+pcap_t *
+pcap_create(const char *source, char *errbuf)
+{
+	size_t i;
+	int is_theirs;
+	pcap_t *p;
+
+	/*
+	 * A null source name is equivalent to the "any" device -
+	 * which might not be supported on this platform, but
+	 * this means that you'll get a "not supported" error
+	 * rather than, say, a crash when we try to dereference
+	 * the null pointer.
+	 */
+	if (source == NULL)
+		source = "any";
+
+	/*
+	 * Try each of the non-local-network-interface capture
+	 * source types until we find one that works for this
+	 * device or run out of types.
+	 */
+	for (i = 0; capture_source_types[i].create_op != NULL; i++) {
+		is_theirs = 0;
+		p = capture_source_types[i].create_op(source, errbuf, &is_theirs);
+		if (is_theirs) {
+			/*
+			 * The device name refers to a device of the
+			 * type in question; either it succeeded,
+			 * in which case p refers to a pcap_t to
+			 * later activate for the device, or it
+			 * failed, in which case p is null and we
+			 * should return that to report the failure
+			 * to create.
+			 */
+			return (p);
+		}
+	}
+
+	/*
+	 * OK, try it as a regular network interface.
+	 */
+	return (pcap_create_interface(source, errbuf));
+}
+#endif
+
+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;
+	p->getadapter_op = pcap_no_adapter;
+#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-shot callback can
+	 * be used for pcap_next()/pcap_next_ex().
+	 */
+	p->oneshot_callback = pcap_oneshot;
+}
+
+static pcap_t *
+pcap_alloc_pcap_t(char *ebuf, size_t size)
+{
+	char *chunk;
+	pcap_t *p;
+
+	/*
+	 * Allocate a chunk of memory big enough for a pcap_t
+	 * plus a structure following it of size "size".  The
+	 * structure following it is a private data structure
+	 * for the routines that handle this pcap_t.
+	 */
+	chunk = malloc(sizeof (pcap_t) + size);
+	if (chunk == NULL) {
+		snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s",
+		    pcap_strerror(errno));
+		return (NULL);
+	}
+	memset(chunk, 0, sizeof (pcap_t) + size);
+
+	/*
+	 * Get a pointer to the pcap_t at the beginning.
+	 */
+	p = (pcap_t *)chunk;
+
+#ifndef WIN32
+	p->fd = -1;	/* not opened yet */
+	p->selectable_fd = -1;
+#endif 
+
+	if (size == 0) {
+		/* No private data was requested. */
+		p->priv = NULL;
+	} else {
+		/*
+		 * Set the pointer to the private data; that's the structure
+		 * of size "size" following the pcap_t.
+		 */
+		p->priv = (void *)(chunk + sizeof (pcap_t));
+	}
+
+	return (p);
+}
+
+pcap_t *
+pcap_create_common(const char *source, char *ebuf, size_t size)
+{
+	pcap_t *p;
+
+	p = pcap_alloc_pcap_t(ebuf, size);
+	if (p == NULL)
+		return (NULL);
+
+	p->opt.source = strdup(source);
+	if (p->opt.source == NULL) {
+		snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s",
+		    pcap_strerror(errno));
+		free(p);
+		return (NULL);
+	}
+
+	/*
+	 * Default to "can't set rfmon mode"; if it's supported by
+	 * 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;
+
+	initialize_ops(p);
+
+	/* put in some defaults*/
+ 	pcap_set_snaplen(p, 65535);	/* max packet size */
+	p->opt.timeout = 0;		/* no timeout specified */
+	p->opt.buffer_size = 0;		/* use the platform's default */
+	p->opt.promisc = 0;
+	p->opt.rfmon = 0;
+	p->opt.immediate = 0;
+	p->opt.tstamp_type = -1;	/* default to not setting time stamp type */
+	p->opt.tstamp_precision = PCAP_TSTAMP_PRECISION_MICRO;
+	return (p);
+}
+
+int
+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 (0);
+}
+
+int
+pcap_set_snaplen(pcap_t *p, int snaplen)
+{
+	if (pcap_check_activated(p))
+		return (PCAP_ERROR_ACTIVATED);
+	p->snapshot = snaplen;
+	return (0);
+}
+
+int
+pcap_set_promisc(pcap_t *p, int promisc)
+{
+	if (pcap_check_activated(p))
+		return (PCAP_ERROR_ACTIVATED);
+	p->opt.promisc = promisc;
+	return (0);
+}
+
+int
+pcap_set_rfmon(pcap_t *p, int rfmon)
+{
+	if (pcap_check_activated(p))
+		return (PCAP_ERROR_ACTIVATED);
+	p->opt.rfmon = rfmon;
+	return (0);
+}
+
+int
+pcap_set_timeout(pcap_t *p, int timeout_ms)
+{
+	if (pcap_check_activated(p))
+		return (PCAP_ERROR_ACTIVATED);
+	p->opt.timeout = timeout_ms;
+	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 only support PCAP_TSTAMP_HOST;
+	 * the default time stamp type is PCAP_TSTAMP_HOST.
+	 */
+	if (p->tstamp_type_count == 0) {
+		if (tstamp_type == PCAP_TSTAMP_HOST) {
+			p->opt.tstamp_type = tstamp_type;
+			return (0);
+		}
+	} else {
+		/*
+		 * 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);
+			}
+		}
+	}
+
+	/*
+	 * We don't support this type of time stamp.
+	 */
+	return (PCAP_WARNING_TSTAMP_TYPE_NOTSUP);
+}
+
+int
+pcap_set_immediate_mode(pcap_t *p, int immediate)
+{
+	if (pcap_check_activated(p))
+		return (PCAP_ERROR_ACTIVATED);
+	p->opt.immediate = immediate;
+	return (0);
+}
+
+int
+pcap_set_buffer_size(pcap_t *p, int buffer_size)
+{
+	if (pcap_check_activated(p))
+		return (PCAP_ERROR_ACTIVATED);
+	p->opt.buffer_size = buffer_size;
+	return (0);
+}
+
+int
+pcap_set_tstamp_precision(pcap_t *p, int tstamp_precision)
+{
+	int i;
+
+	if (pcap_check_activated(p))
+		return (PCAP_ERROR_ACTIVATED);
+
+	/*
+	 * If p->tstamp_precision_count is 0, we only support setting
+	 * the time stamp precision to microsecond precision; every
+	 * pcap module *MUST* support microsecond precision, even if
+	 * it does so by converting the native precision to
+	 * microseconds.
+	 */
+	if (p->tstamp_precision_count == 0) {
+		if (tstamp_precision == PCAP_TSTAMP_PRECISION_MICRO) {
+			p->opt.tstamp_precision = tstamp_precision;
+			return (0);
+		}
+	} else {
+		/*
+		 * Check whether we claim to support this precision of
+		 * time stamp.
+		 */
+		for (i = 0; i < p->tstamp_precision_count; i++) {
+			if (p->tstamp_precision_list[i] == tstamp_precision) {
+				/*
+				 * Yes.
+				 */
+				p->opt.tstamp_precision = tstamp_precision;
+				return (0);
+			}
+		}
+	}
+
+	/*
+	 * We don't support this time stamp precision.
+	 */
+	return (PCAP_ERROR_TSTAMP_PRECISION_NOTSUP);
+}
+
+int
+pcap_get_tstamp_precision(pcap_t *p)
+{
+        return (p->opt.tstamp_precision);
+}
+
+int
+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);
+}
+
+pcap_t *
+pcap_open_live(const char *source, int snaplen, int promisc, int to_ms, char *errbuf)
+{
+	pcap_t *p;
+	int status;
+
+	p = pcap_create(source, errbuf);
+	if (p == NULL)
+		return (NULL);
+	status = pcap_set_snaplen(p, snaplen);
+	if (status < 0)
+		goto fail;
+	status = pcap_set_promisc(p, promisc);
+	if (status < 0)
+		goto fail;
+	status = pcap_set_timeout(p, to_ms);
+	if (status < 0)
+		goto fail;
+	/*
+	 * Mark this as opened with pcap_open_live(), so that, for
+	 * example, we show the full list of DLT_ values, rather
+	 * than just the ones that are compatible with capturing
+	 * when not in monitor mode.  That allows existing applications
+	 * to work the way they used to work, but allows new applications
+	 * that know about the new open API to, for example, find out the
+	 * DLT_ values that they can select without changing whether
+	 * the adapter is in monitor mode or not.
+	 */
+	p->oldstyle = 1;
+	status = pcap_activate(p);
+	if (status < 0)
+		goto fail;
+	return (p);
+fail:
+	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));
+	pcap_close(p);
+	return (NULL);
+}
+
+pcap_t *
+pcap_open_offline_common(char *ebuf, size_t size)
+{
+	pcap_t *p;
+
+	p = pcap_alloc_pcap_t(ebuf, size);
+	if (p == NULL)
+		return (NULL);
+
+	p->opt.tstamp_precision = PCAP_TSTAMP_PRECISION_MICRO;
+	p->opt.source = strdup("(savefile)");
+	if (p->opt.source == NULL) {
+		snprintf(ebuf, PCAP_ERRBUF_SIZE, "malloc: %s",
+		    pcap_strerror(errno));
+		free(p);
+		return (NULL);
+	}
+
+	return (p);
+}
+
+int
+pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
+{
+	return (p->read_op(p, cnt, callback, user));
+}
+
+/*
+ * XXX - is this necessary?
+ */
+int
+pcap_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
+{
+
+	return (p->read_op(p, cnt, callback, user));
+}
+
+int
+pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
+{
+	register int n;
+
+	for (;;) {
+		if (p->rfile != NULL) {
+			/*
+			 * 0 means EOF, so don't loop if we get 0.
+			 */
+			n = pcap_offline_read(p, cnt, callback, user);
+		} else {
+			/*
+			 * XXX keep reading until we get something
+			 * (or an error occurs)
+			 */
+			do {
+				n = p->read_op(p, cnt, callback, user);
+			} while (n == 0);
+		}
+		if (n <= 0)
+			return (n);
+		if (!PACKET_COUNT_IS_UNLIMITED(cnt)) {
+			cnt -= n;
+			if (cnt <= 0)
+				return (0);
+		}
+	}
 }
 
 /*
@@ -218,12 +878,24 @@
 int
 pcap_datalink(pcap_t *p)
 {
+	if (!p->activated)
+		return (PCAP_ERROR_NOT_ACTIVATED);
 	return (p->linktype);
 }
 
 int
+pcap_datalink_ext(pcap_t *p)
+{
+	if (!p->activated)
+		return (PCAP_ERROR_NOT_ACTIVATED);
+	return (p->linktype_ext);
+}
+
+int
 pcap_list_datalinks(pcap_t *p, int **dlt_buffer)
 {
+	if (!p->activated)
+		return (PCAP_ERROR_NOT_ACTIVATED);
 	if (p->dlt_count == 0) {
 		/*
 		 * We couldn't fetch the list of DLTs, which means
@@ -235,7 +907,7 @@
 		if (*dlt_buffer == NULL) {
 			(void)snprintf(p->errbuf, sizeof(p->errbuf),
 			    "malloc: %s", pcap_strerror(errno));
-			return (-1);
+			return (PCAP_ERROR);
 		}
 		**dlt_buffer = p->linktype;
 		return (1);
@@ -244,7 +916,7 @@
 		if (*dlt_buffer == NULL) {
 			(void)snprintf(p->errbuf, sizeof(p->errbuf),
 			    "malloc: %s", pcap_strerror(errno));
-			return (-1);
+			return (PCAP_ERROR);
 		}
 		(void)memcpy(*dlt_buffer, p->dlt_list,
 		    sizeof(**dlt_buffer) * p->dlt_count);
@@ -252,6 +924,23 @@
 	}
 }
 
+/*
+ * 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_datalinks() routine to free up the list
+ * allocated by pcap_list_datalinks(), even though it's just a wrapper
+ * around free().
+ */
+void
+pcap_free_datalinks(int *dlt_list)
+{
+	free(dlt_list);
+}
+
 int
 pcap_set_datalink(pcap_t *p, int dlt)
 {
@@ -314,83 +1003,6 @@
 	return (-1);
 }
 
-struct dlt_choice {
-	const char *name;
-	const char *description;
-	int	dlt;
-};
-
-#define DLT_CHOICE(code, description) { #code, description, code }
-#define DLT_CHOICE_SENTINEL { NULL, NULL, 0 }
-
-static struct dlt_choice dlt_choices[] = {
-	DLT_CHOICE(DLT_NULL, "BSD loopback"),
-	DLT_CHOICE(DLT_EN10MB, "Ethernet"),
-	DLT_CHOICE(DLT_IEEE802, "Token ring"),
-	DLT_CHOICE(DLT_ARCNET, "ARCNET"),
-	DLT_CHOICE(DLT_SLIP, "SLIP"),
-	DLT_CHOICE(DLT_PPP, "PPP"),
-	DLT_CHOICE(DLT_FDDI, "FDDI"),
-	DLT_CHOICE(DLT_ATM_RFC1483, "RFC 1483 LLC-encapsulated ATM"),
-	DLT_CHOICE(DLT_RAW, "Raw IP"),
-	DLT_CHOICE(DLT_SLIP_BSDOS, "BSD/OS SLIP"),
-	DLT_CHOICE(DLT_PPP_BSDOS, "BSD/OS PPP"),
-	DLT_CHOICE(DLT_ATM_CLIP, "Linux Classical IP-over-ATM"),
-	DLT_CHOICE(DLT_PPP_SERIAL, "PPP over serial"),
-	DLT_CHOICE(DLT_PPP_ETHER, "PPPoE"),
-	DLT_CHOICE(DLT_C_HDLC, "Cisco HDLC"),
-	DLT_CHOICE(DLT_IEEE802_11, "802.11"),
-	DLT_CHOICE(DLT_FRELAY, "Frame Relay"),
-	DLT_CHOICE(DLT_LOOP, "OpenBSD loopback"),
-	DLT_CHOICE(DLT_ENC, "OpenBSD encapsulated IP"),
-	DLT_CHOICE(DLT_LINUX_SLL, "Linux cooked"),
-	DLT_CHOICE(DLT_LTALK, "Localtalk"),
-	DLT_CHOICE(DLT_PFLOG, "OpenBSD pflog file"),
-	DLT_CHOICE(DLT_PRISM_HEADER, "802.11 plus Prism header"),
-	DLT_CHOICE(DLT_IP_OVER_FC, "RFC 2625 IP-over-Fibre Channel"),
-	DLT_CHOICE(DLT_SUNATM, "Sun raw ATM"),
-	DLT_CHOICE(DLT_IEEE802_11_RADIO, "802.11 plus BSD radio information header"),
-	DLT_CHOICE(DLT_APPLE_IP_OVER_IEEE1394, "Apple IP-over-IEEE 1394"),
-	DLT_CHOICE(DLT_ARCNET_LINUX, "Linux ARCNET"),
-	DLT_CHOICE(DLT_DOCSIS, "DOCSIS"),
-	DLT_CHOICE(DLT_LINUX_IRDA, "Linux IrDA"),
-	DLT_CHOICE(DLT_LINUX_LAPD, "Linux vISDN LAPD"),
-	DLT_CHOICE(DLT_IEEE802_11_RADIO_AVS, "802.11 plus AVS radio information header"),
-        DLT_CHOICE(DLT_SYMANTEC_FIREWALL, "Symantec Firewall"),
-        DLT_CHOICE(DLT_JUNIPER_ATM1, "Juniper ATM1 PIC"),
-        DLT_CHOICE(DLT_JUNIPER_ATM2, "Juniper ATM2 PIC"),
-        DLT_CHOICE(DLT_JUNIPER_MLPPP, "Juniper Multi-Link PPP"),
-	DLT_CHOICE(DLT_PPP_PPPD, "PPP for pppd, with direction flag"),
-	DLT_CHOICE(DLT_JUNIPER_PPPOE, "Juniper PPPoE"),
-	DLT_CHOICE(DLT_JUNIPER_PPPOE_ATM, "Juniper PPPoE/ATM"),
-	DLT_CHOICE(DLT_GPRS_LLC, "GPRS LLC"),
-	DLT_CHOICE(DLT_GPF_T, "GPF-T"),
-	DLT_CHOICE(DLT_GPF_F, "GPF-F"),
-	DLT_CHOICE(DLT_JUNIPER_PIC_PEER, "Juniper PIC Peer"),
-	DLT_CHOICE(DLT_JUNIPER_MLFR, "Juniper Multi-Link Frame Relay"),
-	DLT_CHOICE(DLT_ERF_ETH,	"Ethernet with Endace ERF header"),
-	DLT_CHOICE(DLT_ERF_POS, "Packet-over-SONET with Endace ERF header"),
-        DLT_CHOICE(DLT_JUNIPER_GGSN, "Juniper GGSN PIC"),
-        DLT_CHOICE(DLT_JUNIPER_ES, "Juniper Encryption Services PIC"),
-        DLT_CHOICE(DLT_JUNIPER_MONITOR, "Juniper Passive Monitor PIC"),
-        DLT_CHOICE(DLT_JUNIPER_SERVICES, "Juniper Advanced Services PIC"),
-	DLT_CHOICE(DLT_JUNIPER_MFR, "Juniper FRF.16 Frame Relay"),
-	DLT_CHOICE(DLT_JUNIPER_ETHER, "Juniper Ethernet"),
-	DLT_CHOICE(DLT_JUNIPER_PPP, "Juniper PPP"),
-	DLT_CHOICE(DLT_JUNIPER_FRELAY, "Juniper Frame Relay"),
-	DLT_CHOICE(DLT_JUNIPER_CHDLC, "Juniper C-HDLC"),
-	DLT_CHOICE(DLT_MFR, "FRF.16 Frame Relay"),
-	DLT_CHOICE(DLT_JUNIPER_VP, "Juniper Voice PIC"),
-	DLT_CHOICE(DLT_MTP2, "SS7 MTP2"),
-	DLT_CHOICE(DLT_A429, "Arinc 429"),
-	DLT_CHOICE(DLT_A653_ICM, "Arinc 653 Interpartition Communication"),
-	DLT_CHOICE(DLT_USB, "USB"),
-	DLT_CHOICE(DLT_BLUETOOTH_HCI_H4, "Bluetooth HCI UART transport layer"),
-	DLT_CHOICE(DLT_CAN20B, "Controller Area Network (CAN) v. 2.0B"),
-	DLT_CHOICE(DLT_MTP2_WITH_PHDR, "SS7 MTP2 with Pseudo-header"),
-	DLT_CHOICE_SENTINEL
-};
-
 /*
  * This array is designed for mapping upper and lower case letter
  * together for a case independent comparison.  The mappings are
@@ -476,6 +1088,124 @@
 	return (cm[*us1] - cm[*--us2]);
 }
 
+struct dlt_choice {
+	const char *name;
+	const char *description;
+	int	dlt;
+};
+
+#define DLT_CHOICE(code, description) { #code, description, code }
+#define DLT_CHOICE_SENTINEL { NULL, NULL, 0 }
+
+static struct dlt_choice dlt_choices[] = {
+	DLT_CHOICE(DLT_NULL, "BSD loopback"),
+	DLT_CHOICE(DLT_EN10MB, "Ethernet"),
+	DLT_CHOICE(DLT_IEEE802, "Token ring"),
+	DLT_CHOICE(DLT_ARCNET, "BSD ARCNET"),
+	DLT_CHOICE(DLT_SLIP, "SLIP"),
+	DLT_CHOICE(DLT_PPP, "PPP"),
+	DLT_CHOICE(DLT_FDDI, "FDDI"),
+	DLT_CHOICE(DLT_ATM_RFC1483, "RFC 1483 LLC-encapsulated ATM"),
+	DLT_CHOICE(DLT_RAW, "Raw IP"),
+	DLT_CHOICE(DLT_SLIP_BSDOS, "BSD/OS SLIP"),
+	DLT_CHOICE(DLT_PPP_BSDOS, "BSD/OS PPP"),
+	DLT_CHOICE(DLT_ATM_CLIP, "Linux Classical IP-over-ATM"),
+	DLT_CHOICE(DLT_PPP_SERIAL, "PPP over serial"),
+	DLT_CHOICE(DLT_PPP_ETHER, "PPPoE"),
+        DLT_CHOICE(DLT_SYMANTEC_FIREWALL, "Symantec Firewall"),
+	DLT_CHOICE(DLT_C_HDLC, "Cisco HDLC"),
+	DLT_CHOICE(DLT_IEEE802_11, "802.11"),
+	DLT_CHOICE(DLT_FRELAY, "Frame Relay"),
+	DLT_CHOICE(DLT_LOOP, "OpenBSD loopback"),
+	DLT_CHOICE(DLT_ENC, "OpenBSD encapsulated IP"),
+	DLT_CHOICE(DLT_LINUX_SLL, "Linux cooked"),
+	DLT_CHOICE(DLT_LTALK, "Localtalk"),
+	DLT_CHOICE(DLT_PFLOG, "OpenBSD pflog file"),
+	DLT_CHOICE(DLT_PFSYNC, "Packet filter state syncing"),
+	DLT_CHOICE(DLT_PRISM_HEADER, "802.11 plus Prism header"),
+	DLT_CHOICE(DLT_IP_OVER_FC, "RFC 2625 IP-over-Fibre Channel"),
+	DLT_CHOICE(DLT_SUNATM, "Sun raw ATM"),
+	DLT_CHOICE(DLT_IEEE802_11_RADIO, "802.11 plus radiotap header"),
+	DLT_CHOICE(DLT_ARCNET_LINUX, "Linux ARCNET"),
+        DLT_CHOICE(DLT_JUNIPER_MLPPP, "Juniper Multi-Link PPP"),
+	DLT_CHOICE(DLT_JUNIPER_MLFR, "Juniper Multi-Link Frame Relay"),
+        DLT_CHOICE(DLT_JUNIPER_ES, "Juniper Encryption Services PIC"),
+        DLT_CHOICE(DLT_JUNIPER_GGSN, "Juniper GGSN PIC"),
+	DLT_CHOICE(DLT_JUNIPER_MFR, "Juniper FRF.16 Frame Relay"),
+        DLT_CHOICE(DLT_JUNIPER_ATM2, "Juniper ATM2 PIC"),
+        DLT_CHOICE(DLT_JUNIPER_SERVICES, "Juniper Advanced Services PIC"),
+        DLT_CHOICE(DLT_JUNIPER_ATM1, "Juniper ATM1 PIC"),
+	DLT_CHOICE(DLT_APPLE_IP_OVER_IEEE1394, "Apple IP-over-IEEE 1394"),
+	DLT_CHOICE(DLT_MTP2_WITH_PHDR, "SS7 MTP2 with Pseudo-header"),
+	DLT_CHOICE(DLT_MTP2, "SS7 MTP2"),
+	DLT_CHOICE(DLT_MTP3, "SS7 MTP3"),
+	DLT_CHOICE(DLT_SCCP, "SS7 SCCP"),
+	DLT_CHOICE(DLT_DOCSIS, "DOCSIS"),
+	DLT_CHOICE(DLT_LINUX_IRDA, "Linux IrDA"),
+	DLT_CHOICE(DLT_IEEE802_11_RADIO_AVS, "802.11 plus AVS radio information header"),
+        DLT_CHOICE(DLT_JUNIPER_MONITOR, "Juniper Passive Monitor PIC"),
+	DLT_CHOICE(DLT_BACNET_MS_TP, "BACnet MS/TP"),
+	DLT_CHOICE(DLT_PPP_PPPD, "PPP for pppd, with direction flag"),
+	DLT_CHOICE(DLT_JUNIPER_PPPOE, "Juniper PPPoE"),
+	DLT_CHOICE(DLT_JUNIPER_PPPOE_ATM, "Juniper PPPoE/ATM"),
+	DLT_CHOICE(DLT_GPRS_LLC, "GPRS LLC"),
+	DLT_CHOICE(DLT_GPF_T, "GPF-T"),
+	DLT_CHOICE(DLT_GPF_F, "GPF-F"),
+	DLT_CHOICE(DLT_JUNIPER_PIC_PEER, "Juniper PIC Peer"),
+	DLT_CHOICE(DLT_ERF_ETH,	"Ethernet with Endace ERF header"),
+	DLT_CHOICE(DLT_ERF_POS, "Packet-over-SONET with Endace ERF header"),
+	DLT_CHOICE(DLT_LINUX_LAPD, "Linux vISDN LAPD"),
+	DLT_CHOICE(DLT_JUNIPER_ETHER, "Juniper Ethernet"),
+	DLT_CHOICE(DLT_JUNIPER_PPP, "Juniper PPP"),
+	DLT_CHOICE(DLT_JUNIPER_FRELAY, "Juniper Frame Relay"),
+	DLT_CHOICE(DLT_JUNIPER_CHDLC, "Juniper C-HDLC"),
+	DLT_CHOICE(DLT_MFR, "FRF.16 Frame Relay"),
+	DLT_CHOICE(DLT_JUNIPER_VP, "Juniper Voice PIC"),
+	DLT_CHOICE(DLT_A429, "Arinc 429"),
+	DLT_CHOICE(DLT_A653_ICM, "Arinc 653 Interpartition Communication"),
+	DLT_CHOICE(DLT_USB, "USB"),
+	DLT_CHOICE(DLT_BLUETOOTH_HCI_H4, "Bluetooth HCI UART transport layer"),
+	DLT_CHOICE(DLT_IEEE802_16_MAC_CPS, "IEEE 802.16 MAC Common Part Sublayer"),
+	DLT_CHOICE(DLT_USB_LINUX, "USB with Linux header"),
+	DLT_CHOICE(DLT_CAN20B, "Controller Area Network (CAN) v. 2.0B"),
+	DLT_CHOICE(DLT_IEEE802_15_4_LINUX, "IEEE 802.15.4 with Linux padding"),
+	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 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"),
+	DLT_CHOICE(DLT_IPMB, "IPMB"),
+	DLT_CHOICE(DLT_JUNIPER_ST, "Juniper Secure Tunnel"),
+	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(DLT_DBUS, "D-Bus"),
+	DLT_CHOICE_SENTINEL
+};
+
 int
 pcap_datalink_name_to_val(const char *name)
 {
@@ -513,34 +1243,93 @@
 	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)
 {
+	if (!p->activated)
+		return (PCAP_ERROR_NOT_ACTIVATED);
 	return (p->snapshot);
 }
 
 int
 pcap_is_swapped(pcap_t *p)
 {
-	return (p->sf.swapped);
+	if (!p->activated)
+		return (PCAP_ERROR_NOT_ACTIVATED);
+	return (p->swapped);
 }
 
 int
 pcap_major_version(pcap_t *p)
 {
-	return (p->sf.version_major);
+	if (!p->activated)
+		return (PCAP_ERROR_NOT_ACTIVATED);
+	return (p->version_major);
 }
 
 int
 pcap_minor_version(pcap_t *p)
 {
-	return (p->sf.version_minor);
+	if (!p->activated)
+		return (PCAP_ERROR_NOT_ACTIVATED);
+	return (p->version_minor);
 }
 
 FILE *
 pcap_file(pcap_t *p)
 {
-	return (p->sf.rfile);
+	return (p->rfile);
 }
 
 int
@@ -552,7 +1341,7 @@
 	if (p->adapter != NULL)
 		return ((int)(DWORD)p->adapter->hFile);
 	else
-		return (-1);
+		return (PCAP_ERROR);
 #endif
 }
 
@@ -579,7 +1368,18 @@
 int
 pcap_getnonblock(pcap_t *p, char *errbuf)
 {
-	return p->getnonblock_op(p, errbuf);
+	int ret;
+
+	ret = p->getnonblock_op(p, errbuf);
+	if (ret == -1) {
+		/*
+		 * In case somebody depended on the bug wherein
+		 * the error message was put into p->errbuf
+		 * by pcap_getnonblock_fd().
+		 */
+		strlcpy(p->errbuf, errbuf, PCAP_ERRBUF_SIZE);
+	}
+	return (ret);
 }
 
 /*
@@ -597,7 +1397,7 @@
 
 	fdflags = fcntl(p->fd, F_GETFL, 0);
 	if (fdflags == -1) {
-		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "F_GETFL: %s",
+		snprintf(errbuf, PCAP_ERRBUF_SIZE, "F_GETFL: %s",
 		    pcap_strerror(errno));
 		return (-1);
 	}
@@ -611,7 +1411,18 @@
 int
 pcap_setnonblock(pcap_t *p, int nonblock, char *errbuf)
 {
-	return p->setnonblock_op(p, nonblock, errbuf);
+	int ret;
+
+	ret = p->setnonblock_op(p, nonblock, errbuf);
+	if (ret == -1) {
+		/*
+		 * In case somebody depended on the bug wherein
+		 * the error message was put into p->errbuf
+		 * by pcap_setnonblock_fd().
+		 */
+		strlcpy(p->errbuf, errbuf, PCAP_ERRBUF_SIZE);
+	}
+	return (ret);
 }
 
 #if !defined(WIN32) && !defined(MSDOS)
@@ -628,7 +1439,7 @@
 
 	fdflags = fcntl(p->fd, F_GETFL, 0);
 	if (fdflags == -1) {
-		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "F_GETFL: %s",
+		snprintf(errbuf, PCAP_ERRBUF_SIZE, "F_GETFL: %s",
 		    pcap_strerror(errno));
 		return (-1);
 	}
@@ -637,7 +1448,7 @@
 	else
 		fdflags &= ~O_NONBLOCK;
 	if (fcntl(p->fd, F_SETFL, fdflags) == -1) {
-		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "F_SETFL: %s",
+		snprintf(errbuf, PCAP_ERRBUF_SIZE, "F_SETFL: %s",
 		    pcap_strerror(errno));
 		return (-1);
 	}
@@ -679,6 +1490,65 @@
 #endif
 
 /*
+ * Generate error strings for PCAP_ERROR_ and PCAP_WARNING_ values.
+ */
+const char *
+pcap_statustostr(int errnum)
+{
+	static char ebuf[15+10+1];
+
+	switch (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");
+
+	case PCAP_ERROR:
+		return("Generic error");
+
+	case PCAP_ERROR_BREAK:
+		return("Loop terminated by pcap_breakloop");
+
+	case PCAP_ERROR_NOT_ACTIVATED:
+		return("The pcap_t has not been activated");
+
+	case PCAP_ERROR_ACTIVATED:
+		return ("The setting can't be changed after the pcap_t is activated");
+
+	case PCAP_ERROR_NO_SUCH_DEVICE:
+		return ("No such device exists");
+
+	case PCAP_ERROR_RFMON_NOTSUP:
+		return ("That device doesn't support monitor mode");
+
+	case PCAP_ERROR_NOT_RFMON:
+		return ("That operation is supported only in monitor mode");
+
+	case PCAP_ERROR_PERM_DENIED:
+		return ("You don't have permission to capture on that device");
+
+	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");
+
+	case PCAP_ERROR_TSTAMP_PRECISION_NOTSUP:
+		return ("That device doesn't support that time stamp precision");
+	}
+	(void)snprintf(ebuf, sizeof ebuf, "Unknown error: %d", errnum);
+	return(ebuf);
+}
+
+/*
  * Not all systems have strerror().
  */
 const char *
@@ -689,7 +1559,7 @@
 #else
 	extern int sys_nerr;
 	extern const char *const sys_errlist[];
-	static char ebuf[20];
+	static char ebuf[15+10+1];
 
 	if ((unsigned int)errnum < sys_nerr)
 		return ((char *)sys_errlist[errnum]);
@@ -701,7 +1571,7 @@
 int
 pcap_setfilter(pcap_t *p, struct bpf_program *fp)
 {
-	return p->setfilter_op(p, fp);
+	return (p->setfilter_op(p, fp));
 }
 
 /*
@@ -716,15 +1586,15 @@
 	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
@@ -735,37 +1605,220 @@
 	return (-1);
 }
 
-void
-pcap_close_common(pcap_t *p)
+#ifdef WIN32
+int
+pcap_setbuff(pcap_t *p, int dim)
 {
-	if (p->buffer != NULL)
+	return (p->setbuff_op(p, dim));
+}
+
+static int
+pcap_setbuff_dead(pcap_t *p, int dim)
+{
+	snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+	    "The kernel buffer size cannot be set on a pcap_open_dead pcap_t");
+	return (-1);
+}
+
+int
+pcap_setmode(pcap_t *p, int mode)
+{
+	return (p->setmode_op(p, mode));
+}
+
+static int
+pcap_setmode_dead(pcap_t *p, int mode)
+{
+	snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+	    "impossible to set mode on a pcap_open_dead pcap_t");
+	return (-1);
+}
+
+int
+pcap_setmintocopy(pcap_t *p, int size)
+{
+	return (p->setmintocopy_op(p, size));
+}
+
+Adapter *
+pcap_get_adapter(pcap_t *p)
+{
+	return (p->getadapter_op(p));
+}
+
+static int
+pcap_setmintocopy_dead(pcap_t *p, int size)
+{
+	snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+	    "The mintocopy parameter cannot be set on a pcap_open_dead pcap_t");
+	return (-1);
+}
+#endif
+
+/*
+ * On some platforms, we need to clean up promiscuous or monitor mode
+ * when we close a device - and we want that to happen even if the
+ * application just exits without explicitl closing devices.
+ * On those platforms, we need to register a "close all the pcaps"
+ * routine to be called when we exit, and need to maintain a list of
+ * pcaps that need to be closed to clean up modes.
+ *
+ * XXX - not thread-safe.
+ */
+
+/*
+ * List of pcaps on which we've done something that needs to be
+ * cleaned up.
+ * If there are any such pcaps, we arrange to call "pcap_close_all()"
+ * when we exit, and have it close all of them.
+ */
+static struct pcap *pcaps_to_close;
+
+/*
+ * TRUE if we've already called "atexit()" to cause "pcap_close_all()" to
+ * be called on exit.
+ */
+static int did_atexit;
+
+static void
+pcap_close_all(void)
+{
+	struct pcap *handle;
+
+	while ((handle = pcaps_to_close) != NULL)
+		pcap_close(handle);
+}
+
+int
+pcap_do_addexit(pcap_t *p)
+{
+	/*
+	 * If we haven't already done so, arrange to have
+	 * "pcap_close_all()" called when we exit.
+	 */
+	if (!did_atexit) {
+		if (atexit(pcap_close_all) == -1) {
+			/*
+			 * "atexit()" failed; let our caller know.
+			 */
+			strncpy(p->errbuf, "atexit failed",
+			    PCAP_ERRBUF_SIZE);
+			return (0);
+		}
+		did_atexit = 1;
+	}
+	return (1);
+}
+
+void
+pcap_add_to_pcaps_to_close(pcap_t *p)
+{
+	p->next = pcaps_to_close;
+	pcaps_to_close = p;
+}
+
+void
+pcap_remove_from_pcaps_to_close(pcap_t *p)
+{
+	pcap_t *pc, *prevpc;
+
+	for (pc = pcaps_to_close, prevpc = NULL; pc != NULL;
+	    prevpc = pc, pc = pc->next) {
+		if (pc == p) {
+			/*
+			 * Found it.  Remove it from the list.
+			 */
+			if (prevpc == NULL) {
+				/*
+				 * It was at the head of the list.
+				 */
+				pcaps_to_close = pc->next;
+			} else {
+				/*
+				 * It was in the middle of the list.
+				 */
+				prevpc->next = pc->next;
+			}
+			break;
+		}
+	}
+}
+
+void
+pcap_cleanup_live_common(pcap_t *p)
+{
+	if (p->buffer != NULL) {
 		free(p->buffer);
+		p->buffer = NULL;
+	}
+	if (p->dlt_list != NULL) {
+		free(p->dlt_list);
+		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;
+	}
+	if (p->tstamp_precision_list != NULL) {
+		free(p->tstamp_precision_list);
+		p->tstamp_precision_list = NULL;
+		p->tstamp_precision_count = 0;
+	}
+	pcap_freecode(&p->fcode);
 #if !defined(WIN32) && !defined(MSDOS)
-	if (p->fd >= 0)
+	if (p->fd >= 0) {
 		close(p->fd);
+		p->fd = -1;
+	}
+	p->selectable_fd = -1;
 #endif
 }
 
 static void
-pcap_close_dead(pcap_t *p _U_)
+pcap_cleanup_dead(pcap_t *p _U_)
 {
 	/* Nothing to do. */
 }
 
 pcap_t *
-pcap_open_dead(int linktype, int snaplen)
+pcap_open_dead_with_tstamp_precision(int linktype, int snaplen, u_int precision)
 {
 	pcap_t *p;
 
+	switch (precision) {
+
+	case PCAP_TSTAMP_PRECISION_MICRO:
+	case PCAP_TSTAMP_PRECISION_NANO:
+		break;
+
+	default:
+		return NULL;
+	}
 	p = malloc(sizeof(*p));
 	if (p == NULL)
 		return NULL;
 	memset (p, 0, sizeof(*p));
 	p->snapshot = snaplen;
 	p->linktype = linktype;
+	p->opt.tstamp_precision = precision;
 	p->stats_op = pcap_stats_dead;
-	p->close_op = pcap_close_dead;
-	return p;
+#ifdef WIN32
+	p->setbuff_op = pcap_setbuff_dead;
+	p->setmode_op = pcap_setmode_dead;
+	p->setmintocopy_op = pcap_setmintocopy_dead;
+#endif
+	p->cleanup_op = pcap_cleanup_dead;
+	p->activated = 1;
+	return (p);
+}
+
+pcap_t *
+pcap_open_dead(int linktype, int snaplen)
+{
+	return (pcap_open_dead_with_tstamp_precision(linktype, snaplen,
+	    PCAP_TSTAMP_PRECISION_MICRO));
 }
 
 /*
@@ -795,14 +1848,31 @@
 void
 pcap_close(pcap_t *p)
 {
-	p->close_op(p);
-	if (p->dlt_list != NULL)
-		free(p->dlt_list);
-	pcap_freecode(&p->fcode);
+	if (p->opt.source != NULL)
+		free(p->opt.source);
+	p->cleanup_op(p);
 	free(p);
 }
 
 /*
+ * Given a BPF program, a pcap_pkthdr structure for a packet, and the raw
+ * data for the packet, check whether the packet passes the filter.
+ * Returns the return value of the filter program, which will be zero if
+ * the packet doesn't pass and non-zero if the packet does pass.
+ */
+int
+pcap_offline_filter(const struct bpf_program *fp, const struct pcap_pkthdr *h,
+    const u_char *pkt)
+{
+	const struct bpf_insn *fcode = fp->bf_insns;
+
+	if (fcode != NULL) 
+		return (bpf_filter(fcode, pkt, h->len, h->caplen));
+	else
+		return (0);
+}
+
+/*
  * We make the version string static, and return a pointer to it, rather
  * than exporting the version string directly.  On at least some UNIXes,
  * if you import data from a shared library into an program, the data is
@@ -817,7 +1887,7 @@
 #ifdef HAVE_VERSION_H
 #include "version.h"
 #else
-static const char pcap_version_string[] = "libpcap version 0.9.8";
+static const char pcap_version_string[] = "libpcap version 1.x.y";
 #endif
 
 #ifdef WIN32
@@ -856,6 +1926,8 @@
 			    strlen(pcap_version_string);
 			full_pcap_version_string =
 			    malloc(full_pcap_version_string_len);
+			if (full_pcap_version_string == NULL)
+				return (NULL);
 			sprintf(full_pcap_version_string,
 			    pcap_version_string_fmt, wpcap_version_string,
 			    pcap_version_string);
@@ -873,7 +1945,8 @@
 			    strlen(packet_version_string) +
 			    strlen(pcap_version_string);
 			full_pcap_version_string = malloc(full_pcap_version_string_len);
-
+			if (full_pcap_version_string == NULL)
+				return (NULL);
 			sprintf(full_pcap_version_string,
 			    pcap_version_string_packet_dll_fmt,
 			    wpcap_version_string, packet_version_string,
@@ -902,6 +1975,8 @@
 		    sizeof dospfx + strlen(pcap_version_string);
 		full_pcap_version_string =
 		    malloc(full_pcap_version_string_len);
+		if (full_pcap_version_string == NULL)
+			return (NULL);
 		strcpy(full_pcap_version_string, dospfx);
 		strcat(full_pcap_version_string, pcap_version_string);
 	}
diff --git a/pcap.h b/pcap.h
index 9c8767e..490a4bf 100644
--- a/pcap.h
+++ b/pcap.h
@@ -1,4 +1,3 @@
-/* -*- Mode: c; tab-width: 8; indent-tabs-mode: 1; c-basic-offset: 8; -*- */
 /*
  * Copyright (c) 1993, 1994, 1995, 1996, 1997
  *	The Regents of the University of California.  All rights reserved.
@@ -31,294 +30,16 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/pcap.h,v 1.52.2.7 2007/06/11 09:52:05 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/pcap.h,v 1.59 2006-10-04 18:09:22 guy Exp $ (LBL)
  */
 
-#ifndef lib_pcap_h
-#define lib_pcap_h
-
-#if defined(WIN32)
-  #include <pcap-stdinc.h>
-#elif defined(MSDOS)
-  #include <sys/types.h>
-  #include <sys/socket.h>  /* u_int, u_char etc. */
-#else /* UN*X */
-  #include <sys/types.h>
-  #include <sys/time.h>
-#endif /* WIN32/MSDOS/UN*X */
-
-#ifndef PCAP_DONT_INCLUDE_PCAP_BPF_H
-#include <pcap-bpf.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define PCAP_VERSION_MAJOR 2
-#define PCAP_VERSION_MINOR 4
-
-#define PCAP_ERRBUF_SIZE 256
-
 /*
- * Compatibility for systems that have a bpf.h that
- * predates the bpf typedefs for 64-bit support.
- */
-#if BPF_RELEASE - 0 < 199406
-typedef	int bpf_int32;
-typedef	u_int bpf_u_int32;
-#endif
-
-typedef struct pcap pcap_t;
-typedef struct pcap_dumper pcap_dumper_t;
-typedef struct pcap_if pcap_if_t;
-typedef struct pcap_addr pcap_addr_t;
-
-/*
- * The first record in the file contains saved values for some
- * of the flags used in the printout phases of tcpdump.
- * Many fields here are 32 bit ints so compilers won't insert unwanted
- * padding; these files need to be interchangeable across architectures.
+ * For backwards compatibility.
  *
- * Do not change the layout of this structure, in any way (this includes
- * changes that only affect the length of fields in this structure).
- *
- * Also, do not change the interpretation of any of the members of this
- * structure, in any way (this includes using values other than
- * LINKTYPE_ values, as defined in "savefile.c", in the "linktype"
- * field).
- *
- * Instead:
- *
- *	introduce a new structure for the new format, if the layout
- *	of the structure changed;
- *
- *	send mail to "tcpdump-workers@tcpdump.org", requesting a new
- *	magic number for your new capture file format, and, when
- *	you get the new magic number, put it in "savefile.c";
- *
- *	use that magic number for save files with the changed file
- *	header;
- *
- *	make the code in "savefile.c" capable of reading files with
- *	the old file header as well as files with the new file header
- *	(using the magic number to determine the header format).
- *
- * Then supply the changes to "patches@tcpdump.org", so that future
- * versions of libpcap and programs that use it (such as tcpdump) will
- * be able to read your new capture file format.
+ * Note to OS vendors: do NOT get rid of this file!  Many applications
+ * expect to be able to include <pcap.h>, and at least some of them
+ * go through contortions in their configure scripts to try to detect
+ * OSes that have "helpfully" moved pcap.h to <pcap/pcap.h> without
+ * leaving behind a <pcap.h> file.
  */
-struct pcap_file_header {
-	bpf_u_int32 magic;
-	u_short version_major;
-	u_short version_minor;
-	bpf_int32 thiszone;	/* gmt to local correction */
-	bpf_u_int32 sigfigs;	/* accuracy of timestamps */
-	bpf_u_int32 snaplen;	/* max length saved portion of each pkt */
-	bpf_u_int32 linktype;	/* data link type (LINKTYPE_*) */
-};
-
-typedef enum {
-       PCAP_D_INOUT = 0,
-       PCAP_D_IN,
-       PCAP_D_OUT
-} pcap_direction_t;
-
-/*
- * Generic per-packet information, as supplied by libpcap.
- *
- * The time stamp can and should be a "struct timeval", regardless of
- * whether your system supports 32-bit tv_sec in "struct timeval",
- * 64-bit tv_sec in "struct timeval", or both if it supports both 32-bit
- * and 64-bit applications.  The on-disk format of savefiles uses 32-bit
- * tv_sec (and tv_usec); this structure is irrelevant to that.  32-bit
- * and 64-bit versions of libpcap, even if they're on the same platform,
- * should supply the appropriate version of "struct timeval", even if
- * that's not what the underlying packet capture mechanism supplies.
- */
-struct pcap_pkthdr {
-	struct timeval ts;	/* time stamp */
-	bpf_u_int32 caplen;	/* length of portion present */
-	bpf_u_int32 len;	/* length this packet (off wire) */
-};
-
-/*
- * As returned by the pcap_stats()
- */
-struct pcap_stat {
-	u_int ps_recv;		/* number of packets received */
-	u_int ps_drop;		/* number of packets dropped */
-	u_int ps_ifdrop;	/* drops by interface XXX not yet supported */
-#ifdef WIN32
-	u_int bs_capt;		/* number of packets that reach the application */
-#endif /* WIN32 */
-};
-
-#ifdef MSDOS
-/*
- * As returned by the pcap_stats_ex()
- */
-struct pcap_stat_ex {
-       u_long  rx_packets;        /* total packets received       */
-       u_long  tx_packets;        /* total packets transmitted    */
-       u_long  rx_bytes;          /* total bytes received         */
-       u_long  tx_bytes;          /* total bytes transmitted      */
-       u_long  rx_errors;         /* bad packets received         */
-       u_long  tx_errors;         /* packet transmit problems     */
-       u_long  rx_dropped;        /* no space in Rx buffers       */
-       u_long  tx_dropped;        /* no space available for Tx    */
-       u_long  multicast;         /* multicast packets received   */
-       u_long  collisions;
-
-       /* detailed rx_errors: */
-       u_long  rx_length_errors;
-       u_long  rx_over_errors;    /* receiver ring buff overflow  */
-       u_long  rx_crc_errors;     /* recv'd pkt with crc error    */
-       u_long  rx_frame_errors;   /* recv'd frame alignment error */
-       u_long  rx_fifo_errors;    /* recv'r fifo overrun          */
-       u_long  rx_missed_errors;  /* recv'r missed packet         */
-
-       /* detailed tx_errors */
-       u_long  tx_aborted_errors;
-       u_long  tx_carrier_errors;
-       u_long  tx_fifo_errors;
-       u_long  tx_heartbeat_errors;
-       u_long  tx_window_errors;
-     };
-#endif
-
-/*
- * Item in a list of interfaces.
- */
-struct pcap_if {
-	struct pcap_if *next;
-	char *name;		/* name to hand to "pcap_open_live()" */
-	char *description;	/* textual description of interface, or NULL */
-	struct pcap_addr *addresses;
-	bpf_u_int32 flags;	/* PCAP_IF_ interface flags */
-};
-
-#define PCAP_IF_LOOPBACK	0x00000001	/* interface is loopback */
-
-/*
- * Representation of an interface address.
- */
-struct pcap_addr {
-	struct pcap_addr *next;
-	struct sockaddr *addr;		/* address */
-	struct sockaddr *netmask;	/* netmask for that address */
-	struct sockaddr *broadaddr;	/* broadcast address for that address */
-	struct sockaddr *dstaddr;	/* P2P destination address for that address */
-};
-
-typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,
-			     const u_char *);
-
-char	*pcap_lookupdev(char *);
-int	pcap_lookupnet(const char *, bpf_u_int32 *, bpf_u_int32 *, char *);
-pcap_t	*pcap_open_live(const char *, int, int, int, char *);
-pcap_t	*pcap_open_dead(int, int);
-pcap_t	*pcap_open_offline(const char *, char *);
-pcap_t	*pcap_fopen_offline(FILE *, char *);
-void	pcap_close(pcap_t *);
-int	pcap_loop(pcap_t *, int, pcap_handler, u_char *);
-int	pcap_dispatch(pcap_t *, int, pcap_handler, u_char *);
-const u_char*
-	pcap_next(pcap_t *, struct pcap_pkthdr *);
-int 	pcap_next_ex(pcap_t *, struct pcap_pkthdr **, const u_char **);
-void	pcap_breakloop(pcap_t *);
-int	pcap_stats(pcap_t *, struct pcap_stat *);
-int	pcap_setfilter(pcap_t *, struct bpf_program *);
-int 	pcap_setdirection(pcap_t *, pcap_direction_t);
-int	pcap_getnonblock(pcap_t *, char *);
-int	pcap_setnonblock(pcap_t *, int, char *);
-void	pcap_perror(pcap_t *, char *);
-int	pcap_inject(pcap_t *, const void *, size_t);
-int	pcap_sendpacket(pcap_t *, const u_char *, int);
-const char *pcap_strerror(int);
-char	*pcap_geterr(pcap_t *);
-int	pcap_compile(pcap_t *, struct bpf_program *, const char *, int,
-	    bpf_u_int32);
-int	pcap_compile_nopcap(int, int, struct bpf_program *,
-	    const char *, int, bpf_u_int32);
-void	pcap_freecode(struct bpf_program *);
-int	pcap_datalink(pcap_t *);
-int	pcap_list_datalinks(pcap_t *, int **);
-int	pcap_set_datalink(pcap_t *, int);
-int	pcap_datalink_name_to_val(const char *);
-const char *pcap_datalink_val_to_name(int);
-const char *pcap_datalink_val_to_description(int);
-int	pcap_snapshot(pcap_t *);
-int	pcap_is_swapped(pcap_t *);
-int	pcap_major_version(pcap_t *);
-int	pcap_minor_version(pcap_t *);
-
-/* XXX */
-FILE	*pcap_file(pcap_t *);
-int	pcap_fileno(pcap_t *);
-
-pcap_dumper_t *pcap_dump_open(pcap_t *, const char *);
-pcap_dumper_t *pcap_dump_fopen(pcap_t *, FILE *fp);
-FILE	*pcap_dump_file(pcap_dumper_t *);
-long	pcap_dump_ftell(pcap_dumper_t *);
-int	pcap_dump_flush(pcap_dumper_t *);
-void	pcap_dump_close(pcap_dumper_t *);
-void	pcap_dump(u_char *, const struct pcap_pkthdr *, const u_char *);
-
-int	pcap_findalldevs(pcap_if_t **, char *);
-void	pcap_freealldevs(pcap_if_t *);
-
-const char *pcap_lib_version(void);
-
-/* XXX this guy lives in the bpf tree */
-u_int	bpf_filter(struct bpf_insn *, u_char *, u_int, u_int);
-int	bpf_validate(struct bpf_insn *f, int len);
-char	*bpf_image(struct bpf_insn *, int);
-void	bpf_dump(struct bpf_program *, int);
-
-#if defined(WIN32)
-
-/*
- * Win32 definitions
- */
-
-int pcap_setbuff(pcap_t *p, int dim);
-int pcap_setmode(pcap_t *p, int mode);
-int pcap_setmintocopy(pcap_t *p, int size);
-
-#ifdef WPCAP
-/* Include file with the wpcap-specific extensions */
-#include <Win32-Extensions.h>
-#endif /* WPCAP */
-
-#define MODE_CAPT 0
-#define MODE_STAT 1
-#define MODE_MON 2
-
-#elif defined(MSDOS)
-
-/*
- * MS-DOS definitions
- */
-
-int  pcap_stats_ex (pcap_t *, struct pcap_stat_ex *);
-void pcap_set_wait (pcap_t *p, void (*yield)(void), int wait);
-u_long pcap_mac_packets (void);
-
-#else /* UN*X */
-
-/*
- * UN*X definitions
- */
-
-int	pcap_get_selectable_fd(pcap_t *);
-
-#endif /* WIN32/MSDOS/UN*X */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
+#include <pcap/pcap.h>
diff --git a/pcap/bluetooth.h b/pcap/bluetooth.h
new file mode 100644
index 0000000..813bea3
--- /dev/null
+++ b/pcap/bluetooth.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2006 Paolo Abeni (Italy)
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+ * OWNER 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.
+ *
+ * bluetooth data struct
+ * By Paolo Abeni <paolo.abeni@email.it>
+ *
+ * @(#) $Header: /tcpdump/master/libpcap/pcap/bluetooth.h,v 1.1 2007-09-22 02:10:17 guy Exp $
+ */
+ 
+#ifndef _PCAP_BLUETOOTH_STRUCTS_H__
+#define _PCAP_BLUETOOTH_STRUCTS_H__
+
+/*
+ * Header prepended libpcap to each bluetooth h:4 frame.
+ * fields are in network byte order
+ */
+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/pcap/bpf.h b/pcap/bpf.h
new file mode 100644
index 0000000..ad36eb6
--- /dev/null
+++ b/pcap/bpf.h
@@ -0,0 +1,1338 @@
+/*-
+ * 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 was used for DLT_PFLOG in OpenBSD; it no longer is.
+ *
+ * It was DLT_LANE8023 in SuSE 6.3, so we defined LINKTYPE_PFLOG
+ * as 117 so that pflog captures would use a link-layer header type
+ * value that didn't collide with any other values.  On all
+ * platforms other than OpenBSD, we defined DLT_PFLOG as 117,
+ * and we mapped between LINKTYPE_PFLOG and DLT_PFLOG.
+ *
+ * OpenBSD eventually switched to using 117 for DLT_PFLOG as well.
+ *
+ * Don't use 17 for anything else.
+ */
+
+/*
+ * 18 is used for DLT_PFSYNC in OpenBSD, NetBSD, DragonFly BSD and
+ * Mac OS X; don't use it for anything else.  (FreeBSD uses 121,
+ * which collides with DLT_HHDLC, even though it doesn't use 18
+ * for anything and doesn't appear to have ever used it for anything.)
+ *
+ * We define it as 18 on those platforms; it is, unfortunately, used
+ * for DLT_CIP in Suse 6.3, so we don't define it as DLT_PFSYNC
+ * in general.  As the packet format for it, like that for
+ * DLT_PFLOG, is not only OS-dependent but OS-version-dependent,
+ * we don't support printing it in tcpdump except on OSes that
+ * have the relevant header files, so it's not that useful on
+ * other platforms.
+ */
+#if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__APPLE__)
+#define DLT_PFSYNC	18
+#endif
+
+#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.
+ */
+#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
+
+/*
+ * Sigh.
+ *
+ * This was reserved for Siemens HiPath HDLC on 2002-01-25, as
+ * requested by Tomas Kukosa.
+ *
+ * On 2004-02-25, a FreeBSD checkin to sys/net/bpf.h was made that
+ * assigned 121 as DLT_PFSYNC.  Its libpcap does DLT_ <-> LINKTYPE_
+ * mapping, so it probably supports capturing on the pfsync device
+ * but not saving the captured data to a pcap file.
+ *
+ * OpenBSD, from which pf came, however, uses 18 for DLT_PFSYNC;
+ * their libpcap does no DLT_ <-> LINKTYPE_ mapping, so it would
+ * use 18 in pcap files as well.
+ *
+ * NetBSD and DragonFly BSD also use 18 for DLT_PFSYNC; their
+ * libpcaps do DLT_ <-> LINKTYPE_ mapping, and neither has an entry
+ * for DLT_PFSYNC, so it might not be able to write out dump files
+ * with 18 as the link-layer header type.  (Earlier versions might
+ * not have done mapping, in which case they'd work the same way
+ * OpenBSD does.)
+ *
+ * Mac OS X defines it as 18, but doesn't appear to use it as of
+ * Mac OS X 10.7.3.  Its libpcap does DLT_ <-> LINKTYPE_ mapping.
+ *
+ * We'll define DLT_PFSYNC as 121 on FreeBSD and define it as 18 on
+ * all other platforms.  We'll define DLT_HHDLC as 121 on everything
+ * except for FreeBSD; anybody who wants to compile, on FreeBSD, code
+ * that uses DLT_HHDLC is out of luck.
+ *
+ * We'll define LINKTYPE_PFSYNC as 18, *even on FreeBSD*, and map
+ * it, so that savefiles won't use 121 for PFSYNC - they'll all
+ * use 18.  Code that uses pcap_datalink() to determine the link-layer
+ * header type of a savefile won't, when built and run on FreeBSD,
+ * be able to distinguish between LINKTYPE_PFSYNC and LINKTYPE_HHDLC
+ * capture files; code that doesn't, such as the code in Wireshark,
+ * will be able to distinguish between them.
+ */
+#ifdef __FreeBSD__
+#define DLT_PFSYNC		121
+#else
+#define DLT_HHDLC		121
+#endif
+
+/*
+ * 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
+
+/*
+ * BACnet MS/TP frames.
+ */
+#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
+
+/*
+ * MPEG-2 transport stream (ISO 13818-1/ITU-T H.222.0).
+ *
+ * Requested by Guy Martin <gmsoft@tuxicoman.be>.
+ */
+#define DLT_MPEG_2_TS		243
+
+/*
+ * ng4T GmbH's UMTS Iub/Iur-over-ATM and Iub/Iur-over-IP format as
+ * used by their ng40 protocol tester.
+ *
+ * Requested by Jens Grimmer <jens.grimmer@ng4t.com>.
+ */
+#define DLT_NG40		244
+
+/*
+ * Pseudo-header giving adapter number and flags, followed by an NFC
+ * (Near-Field Communications) Logical Link Control Protocol (LLCP) PDU,
+ * as specified by NFC Forum Logical Link Control Protocol Technical
+ * Specification LLCP 1.1.
+ *
+ * Requested by Mike Wakerly <mikey@google.com>.
+ */
+#define DLT_NFC_LLCP		245
+
+/*
+ * 245 is used as LINKTYPE_PFSYNC; do not use it for any other purpose.
+ *
+ * DLT_PFSYNC has different values on different platforms, and all of
+ * them collide with something used elsewhere.  On platforms that
+ * don't already define it, define it as 245.
+ */
+#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__DragonFly__) && !defined(__APPLE__)
+#define DLT_PFSYNC		246
+#endif
+
+/*
+ * Raw InfiniBand packets, starting with the Local Routing Header.
+ *
+ * Requested by Oren Kladnitsky <orenk@mellanox.com>.
+ */
+#define DLT_INFINIBAND		247
+
+/*
+ * SCTP, with no lower-level protocols (i.e., no IPv4 or IPv6).
+ *
+ * Requested by Michael Tuexen <Michael.Tuexen@lurchi.franken.de>.
+ */
+#define DLT_SCTP		248
+
+/*
+ * USB packets, beginning with a USBPcap header.
+ *
+ * Requested by Tomasz Mon <desowin@gmail.com>
+ */
+#define DLT_USBPCAP		249
+
+/*
+ * Schweitzer Engineering Laboratories "RTAC" product serial-line
+ * packets.
+ *
+ * Requested by Chris Bontje <chris_bontje@selinc.com>.
+ */
+#define DLT_RTAC_SERIAL		250
+
+/*
+ * Bluetooth Low Energy air interface link-layer packets.
+ *
+ * Requested by Mike Kershaw <dragorn@kismetwireless.net>.
+ */
+#define DLT_BLUETOOTH_LE_LL	251
+
+/*
+ * DLT type for upper-protocol layer PDU saves from wireshark.
+ * 
+ * the actual contents are determined by two TAGs stored with each
+ * packet:
+ *   EXP_PDU_TAG_LINKTYPE          the link type (LINKTYPE_ value) of the
+ *				   original packet.
+ *
+ *   EXP_PDU_TAG_PROTO_NAME        the name of the wireshark dissector
+ * 				   that can make sense of the data stored.
+ */
+#define DLT_WIRESHARK_UPPER_PDU	252
+
+#define DLT_MATCHING_MAX	252	/* 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		BPF_LD		0x00
+#define		BPF_LDX		0x01
+#define		BPF_ST		0x02
+#define		BPF_STX		0x03
+#define		BPF_ALU		0x04
+#define		BPF_JMP		0x05
+#define		BPF_RET		0x06
+#define		BPF_MISC	0x07
+
+/* ld/ldx fields */
+#define BPF_SIZE(code)	((code) & 0x18)
+#define		BPF_W		0x00
+#define		BPF_H		0x08
+#define		BPF_B		0x10
+#define BPF_MODE(code)	((code) & 0xe0)
+#define		BPF_IMM 	0x00
+#define		BPF_ABS		0x20
+#define		BPF_IND		0x40
+#define		BPF_MEM		0x60
+#define		BPF_LEN		0x80
+#define		BPF_MSH		0xa0
+
+/* alu/jmp fields */
+#define BPF_OP(code)	((code) & 0xf0)
+#define		BPF_ADD		0x00
+#define		BPF_SUB		0x10
+#define		BPF_MUL		0x20
+#define		BPF_DIV		0x30
+#define		BPF_OR		0x40
+#define		BPF_AND		0x50
+#define		BPF_LSH		0x60
+#define		BPF_RSH		0x70
+#define		BPF_NEG		0x80
+#define		BPF_JA		0x00
+#define		BPF_JEQ		0x10
+#define		BPF_JGT		0x20
+#define		BPF_JGE		0x30
+#define		BPF_JSET	0x40
+#define BPF_SRC(code)	((code) & 0x08)
+#define		BPF_K		0x00
+#define		BPF_X		0x08
+
+/* ret - BPF_K and BPF_X also apply */
+#define BPF_RVAL(code)	((code) & 0x18)
+#define		BPF_A		0x10
+
+/* misc */
+#define BPF_MISCOP(code) ((code) & 0xf8)
+#define		BPF_TAX		0x00
+#define		BPF_TXA		0x80
+
+/*
+ * The instruction data structure.
+ */
+struct bpf_insn {
+	u_short	code;
+	u_char 	jt;
+	u_char 	jf;
+	bpf_u_int32 k;
+};
+
+/*
+ * Macros for insn array initializers.
+ */
+#define BPF_STMT(code, k) { (u_short)(code), 0, 0, k }
+#define BPF_JUMP(code, k, jt, jf) { (u_short)(code), jt, jf, k }
+
+#if __STDC__ || defined(__cplusplus)
+extern int bpf_validate(const struct bpf_insn *, int);
+extern u_int bpf_filter(const struct bpf_insn *, const u_char *, u_int, u_int);
+#else
+extern int bpf_validate();
+extern u_int bpf_filter();
+#endif
+
+/*
+ * Number of scratch memory words (for BPF_LD|BPF_MEM and BPF_ST).
+ */
+#define BPF_MEMWORDS 16
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !defined(_NET_BPF_H_) && !defined(_BPF_H_) && !defined(_H_BPF) && !defined(lib_pcap_bpf_h) */
diff --git a/pcap/ipnet.h b/pcap/ipnet.h
new file mode 100644
index 0000000..5330847
--- /dev/null
+++ b/pcap/ipnet.h
@@ -0,0 +1,43 @@
+/*-
+ * 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.
+ */
+
+#define	IPH_AF_INET	2		/* Matches Solaris's AF_INET */
+#define	IPH_AF_INET6	26		/* Matches Solaris's AF_INET6 */
+
+#define	IPNET_OUTBOUND		1
+#define	IPNET_INBOUND		2
diff --git a/pcap/namedb.h b/pcap/namedb.h
new file mode 100644
index 0000000..e314557
--- /dev/null
+++ b/pcap/namedb.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 1994, 1996
+ *	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 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 Computer Systems
+ *	Engineering Group at Lawrence Berkeley Laboratory.
+ * 4. Neither the name of the University nor of the Laboratory 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.
+ *
+ * @(#) $Header: /tcpdump/master/libpcap/pcap/namedb.h,v 1.1 2006-10-04 18:09:22 guy Exp $ (LBL)
+ */
+
+#ifndef lib_pcap_namedb_h
+#define lib_pcap_namedb_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * As returned by the pcap_next_etherent()
+ * XXX this stuff doesn't belong in this interface, but this
+ * library already must do name to address translation, so
+ * on systems that don't have support for /etc/ethers, we
+ * export these hooks since they'll
+ */
+struct pcap_etherent {
+	u_char addr[6];
+	char name[122];
+};
+#ifndef PCAP_ETHERS_FILE
+#define PCAP_ETHERS_FILE "/etc/ethers"
+#endif
+struct	pcap_etherent *pcap_next_etherent(FILE *);
+u_char *pcap_ether_hostton(const char*);
+u_char *pcap_ether_aton(const char *);
+
+bpf_u_int32 **pcap_nametoaddr(const char *);
+#ifdef INET6
+struct addrinfo *pcap_nametoaddrinfo(const char *);
+#endif
+bpf_u_int32 pcap_nametonetaddr(const char *);
+
+int	pcap_nametoport(const char *, int *, int *);
+int	pcap_nametoportrange(const char *, int *, int *, int *);
+int	pcap_nametoproto(const char *);
+int	pcap_nametoeproto(const char *);
+int	pcap_nametollc(const char *);
+/*
+ * If a protocol is unknown, PROTO_UNDEF is returned.
+ * Also, pcap_nametoport() returns the protocol along with the port number.
+ * If there are ambiguous entried in /etc/services (i.e. domain
+ * can be either tcp or udp) PROTO_UNDEF is returned.
+ */
+#define PROTO_UNDEF		-1
+
+/* XXX move these to pcap-int.h? */
+int __pcap_atodn(const char *, bpf_u_int32 *);
+int __pcap_atoin(const char *, bpf_u_int32 *);
+u_short	__pcap_nametodnaddr(const char *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/pcap/nflog.h b/pcap/nflog.h
new file mode 100644
index 0000000..388dd0c
--- /dev/null
+++ b/pcap/nflog.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2013, Petar Alilovic,
+ * Faculty of Electrical Engineering and Computing, University of Zagreb
+ * All rights reserved
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ *	 this list of conditions and the following disclaimer.
+ * * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ */
+
+#ifndef _PCAP_NFLOG_H__
+#define _PCAP_NFLOG_H__
+
+/*
+ * Structure of an NFLOG header and TLV parts, as described at
+ * http://www.tcpdump.org/linktypes/LINKTYPE_NFLOG.html
+ *
+ * The NFLOG header is big-endian.
+ *
+ * The TLV length and type are in host byte order.  The value is either
+ * big-endian or is an array of bytes in some externally-specified byte
+ * order (text string, link-layer address, link-layer header, packet
+ * data, etc.).
+ */
+typedef struct nflog_hdr {
+	u_int8_t	nflog_family;		/* address family */
+	u_int8_t	nflog_version;		/* version */
+	u_int16_t	nflog_rid;		/* resource ID */
+} nflog_hdr_t;
+
+typedef struct nflog_tlv {
+	u_int16_t	tlv_length;		/* tlv length */
+	u_int16_t	tlv_type;		/* tlv type */
+	/* value follows this */
+} nflog_tlv_t;
+
+typedef struct nflog_packet_hdr {
+	u_int16_t	hw_protocol;	/* hw protocol */
+	u_int8_t	hook;		/* netfilter hook */
+	u_int8_t	pad;		/* padding to 32 bits */
+} nflog_packet_hdr_t;
+
+typedef struct nflog_hwaddr {
+	u_int16_t	hw_addrlen;	/* address length */
+	u_int16_t	pad;		/* padding to 32-bit boundary */
+	u_int8_t	hw_addr[8];	/* address, up to 8 bytes */
+} nflog_hwaddr_t;
+
+typedef struct nflog_timestamp {
+	u_int64_t	sec;
+	u_int64_t	usec;
+} nflog_timestamp_t;
+
+/*
+ * TLV types.
+ */
+#define NFULA_PACKET_HDR		1	/* nflog_packet_hdr_t */
+#define NFULA_MARK			2	/* packet mark from skbuff */
+#define NFULA_TIMESTAMP			3	/* nflog_timestamp_t for skbuff's time stamp */
+#define NFULA_IFINDEX_INDEV		4	/* ifindex of device on which packet received (possibly bridge group) */
+#define NFULA_IFINDEX_OUTDEV		5	/* ifindex of device on which packet transmitted (possibly bridge group) */
+#define NFULA_IFINDEX_PHYSINDEV		6	/* ifindex of physical device on which packet received (not bridge group) */
+#define NFULA_IFINDEX_PHYSOUTDEV	7	/* ifindex of physical device on which packet transmitted (not bridge group) */
+#define NFULA_HWADDR			8	/* nflog_hwaddr_t for hardware address */
+#define NFULA_PAYLOAD			9	/* packet payload */
+#define NFULA_PREFIX			10	/* text string - null-terminated, count includes NUL */
+#define NFULA_UID			11	/* UID owning socket on which packet was sent/received */
+#define NFULA_SEQ			12	/* sequence number of packets on this NFLOG socket */
+#define NFULA_SEQ_GLOBAL		13	/* sequence number of pakets on all NFLOG sockets */
+#define NFULA_GID			14	/* GID owning socket on which packet was sent/received */
+#define NFULA_HWTYPE			15	/* ARPHRD_ type of skbuff's device */
+#define NFULA_HWHEADER			16	/* skbuff's MAC-layer header */
+#define NFULA_HWLEN			17	/* length of skbuff's MAC-layer header */
+
+#endif
diff --git a/pcap/pcap.h b/pcap/pcap.h
new file mode 100644
index 0000000..f2dd2d6
--- /dev/null
+++ b/pcap/pcap.h
@@ -0,0 +1,484 @@
+/* -*- Mode: c; tab-width: 8; indent-tabs-mode: 1; c-basic-offset: 8; -*- */
+/*
+ * 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 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 Computer Systems
+ *	Engineering Group at Lawrence Berkeley Laboratory.
+ * 4. Neither the name of the University nor of the Laboratory 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.
+ *
+ * @(#) $Header: /tcpdump/master/libpcap/pcap/pcap.h,v 1.15 2008-10-06 15:27:32 gianluca Exp $ (LBL)
+ */
+
+#ifndef lib_pcap_pcap_h
+#define lib_pcap_pcap_h
+
+#if defined(WIN32)
+  #include <pcap-stdinc.h>
+#elif defined(MSDOS)
+  #include <sys/types.h>
+  #include <sys/socket.h>  /* u_int, u_char etc. */
+#else /* UN*X */
+  #include <sys/types.h>
+  #include <sys/time.h>
+#endif /* WIN32/MSDOS/UN*X */
+
+#ifndef PCAP_DONT_INCLUDE_PCAP_BPF_H
+#include <pcap/bpf.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Version number of the current version of the pcap file format.
+ *
+ * NOTE: this is *NOT* the version number of the libpcap library.
+ * To fetch the version information for the version of libpcap
+ * you're using, use pcap_lib_version().
+ */
+#define PCAP_VERSION_MAJOR 2
+#define PCAP_VERSION_MINOR 4
+
+#define PCAP_ERRBUF_SIZE 256
+
+/*
+ * Compatibility for systems that have a bpf.h that
+ * predates the bpf typedefs for 64-bit support.
+ */
+#if BPF_RELEASE - 0 < 199406
+typedef	int bpf_int32;
+typedef	u_int bpf_u_int32;
+#endif
+
+typedef struct pcap pcap_t;
+typedef struct pcap_dumper pcap_dumper_t;
+typedef struct pcap_if pcap_if_t;
+typedef struct pcap_addr pcap_addr_t;
+
+/*
+ * The first record in the file contains saved values for some
+ * of the flags used in the printout phases of tcpdump.
+ * Many fields here are 32 bit ints so compilers won't insert unwanted
+ * padding; these files need to be interchangeable across architectures.
+ *
+ * Do not change the layout of this structure, in any way (this includes
+ * changes that only affect the length of fields in this structure).
+ *
+ * Also, do not change the interpretation of any of the members of this
+ * structure, in any way (this includes using values other than
+ * LINKTYPE_ values, as defined in "savefile.c", in the "linktype"
+ * field).
+ *
+ * Instead:
+ *
+ *	introduce a new structure for the new format, if the layout
+ *	of the structure changed;
+ *
+ *	send mail to "tcpdump-workers@lists.tcpdump.org", requesting
+ *	a new magic number for your new capture file format, and, when
+ *	you get the new magic number, put it in "savefile.c";
+ *
+ *	use that magic number for save files with the changed file
+ *	header;
+ *
+ *	make the code in "savefile.c" capable of reading files with
+ *	the old file header as well as files with the new file header
+ *	(using the magic number to determine the header format).
+ *
+ * Then supply the changes by forking the branch at
+ *
+ *	https://github.com/the-tcpdump-group/libpcap/issues
+ *
+ * and issuing a pull request, so that future versions of libpcap and
+ * programs that use it (such as tcpdump) will be able to read your new
+ * capture file format.
+ */
+struct pcap_file_header {
+	bpf_u_int32 magic;
+	u_short version_major;
+	u_short version_minor;
+	bpf_int32 thiszone;	/* gmt to local correction */
+	bpf_u_int32 sigfigs;	/* accuracy of timestamps */
+	bpf_u_int32 snaplen;	/* max length saved portion of each pkt */
+	bpf_u_int32 linktype;	/* data link type (LINKTYPE_*) */
+};
+
+/*
+ * Macros for the value returned by pcap_datalink_ext().
+ * 
+ * If LT_FCS_LENGTH_PRESENT(x) is true, the LT_FCS_LENGTH(x) macro
+ * gives the FCS length of packets in the capture.
+ */
+#define LT_FCS_LENGTH_PRESENT(x)	((x) & 0x04000000)
+#define LT_FCS_LENGTH(x)		(((x) & 0xF0000000) >> 28)
+#define LT_FCS_DATALINK_EXT(x)		((((x) & 0xF) << 28) | 0x04000000)
+
+typedef enum {
+       PCAP_D_INOUT = 0,
+       PCAP_D_IN,
+       PCAP_D_OUT
+} pcap_direction_t;
+
+/*
+ * Generic per-packet information, as supplied by libpcap.
+ *
+ * The time stamp can and should be a "struct timeval", regardless of
+ * whether your system supports 32-bit tv_sec in "struct timeval",
+ * 64-bit tv_sec in "struct timeval", or both if it supports both 32-bit
+ * and 64-bit applications.  The on-disk format of savefiles uses 32-bit
+ * tv_sec (and tv_usec); this structure is irrelevant to that.  32-bit
+ * and 64-bit versions of libpcap, even if they're on the same platform,
+ * should supply the appropriate version of "struct timeval", even if
+ * that's not what the underlying packet capture mechanism supplies.
+ */
+struct pcap_pkthdr {
+	struct timeval ts;	/* time stamp */
+	bpf_u_int32 caplen;	/* length of portion present */
+	bpf_u_int32 len;	/* length this packet (off wire) */
+};
+
+/*
+ * As returned by the pcap_stats()
+ */
+struct pcap_stat {
+	u_int ps_recv;		/* number of packets received */
+	u_int ps_drop;		/* number of packets dropped */
+	u_int ps_ifdrop;	/* drops by interface -- only supported on some platforms */
+#ifdef WIN32
+	u_int bs_capt;		/* number of packets that reach the application */
+#endif /* WIN32 */
+};
+
+#ifdef MSDOS
+/*
+ * As returned by the pcap_stats_ex()
+ */
+struct pcap_stat_ex {
+       u_long  rx_packets;        /* total packets received       */
+       u_long  tx_packets;        /* total packets transmitted    */
+       u_long  rx_bytes;          /* total bytes received         */
+       u_long  tx_bytes;          /* total bytes transmitted      */
+       u_long  rx_errors;         /* bad packets received         */
+       u_long  tx_errors;         /* packet transmit problems     */
+       u_long  rx_dropped;        /* no space in Rx buffers       */
+       u_long  tx_dropped;        /* no space available for Tx    */
+       u_long  multicast;         /* multicast packets received   */
+       u_long  collisions;
+
+       /* detailed rx_errors: */
+       u_long  rx_length_errors;
+       u_long  rx_over_errors;    /* receiver ring buff overflow  */
+       u_long  rx_crc_errors;     /* recv'd pkt with crc error    */
+       u_long  rx_frame_errors;   /* recv'd frame alignment error */
+       u_long  rx_fifo_errors;    /* recv'r fifo overrun          */
+       u_long  rx_missed_errors;  /* recv'r missed packet         */
+
+       /* detailed tx_errors */
+       u_long  tx_aborted_errors;
+       u_long  tx_carrier_errors;
+       u_long  tx_fifo_errors;
+       u_long  tx_heartbeat_errors;
+       u_long  tx_window_errors;
+     };
+#endif
+
+/*
+ * Item in a list of interfaces.
+ */
+struct pcap_if {
+	struct pcap_if *next;
+	char *name;		/* name to hand to "pcap_open_live()" */
+	char *description;	/* textual description of interface, or NULL */
+	struct pcap_addr *addresses;
+	bpf_u_int32 flags;	/* PCAP_IF_ interface flags */
+};
+
+#define PCAP_IF_LOOPBACK	0x00000001	/* interface is loopback */
+
+/*
+ * Representation of an interface address.
+ */
+struct pcap_addr {
+	struct pcap_addr *next;
+	struct sockaddr *addr;		/* address */
+	struct sockaddr *netmask;	/* netmask for that address */
+	struct sockaddr *broadaddr;	/* broadcast address for that address */
+	struct sockaddr *dstaddr;	/* P2P destination address for that address */
+};
+
+typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,
+			     const u_char *);
+
+/*
+ * Error codes for the pcap API.
+ * These will all be negative, so you can check for the success or
+ * failure of a call that returns these codes by checking for a
+ * negative value.
+ */
+#define PCAP_ERROR			-1	/* generic error code */
+#define PCAP_ERROR_BREAK		-2	/* loop terminated by pcap_breakloop */
+#define PCAP_ERROR_NOT_ACTIVATED	-3	/* the capture needs to be activated */
+#define PCAP_ERROR_ACTIVATED		-4	/* the operation can't be performed on already activated captures */
+#define PCAP_ERROR_NO_SUCH_DEVICE	-5	/* no such device exists */
+#define PCAP_ERROR_RFMON_NOTSUP		-6	/* this device doesn't support rfmon (monitor) mode */
+#define PCAP_ERROR_NOT_RFMON		-7	/* operation supported only in monitor mode */
+#define PCAP_ERROR_PERM_DENIED		-8	/* no permission to open the device */
+#define PCAP_ERROR_IFACE_NOT_UP		-9	/* interface isn't up */
+#define PCAP_ERROR_CANTSET_TSTAMP_TYPE	-10	/* this device doesn't support setting the time stamp type */
+#define PCAP_ERROR_PROMISC_PERM_DENIED	-11	/* you don't have permission to capture in promiscuous mode */
+#define PCAP_ERROR_TSTAMP_PRECISION_NOTSUP -12  /* the requested time stamp precision is not supported */
+
+/*
+ * Warning codes for the pcap API.
+ * These will all be positive and non-zero, so they won't look like
+ * errors.
+ */
+#define PCAP_WARNING			1	/* generic warning code */
+#define PCAP_WARNING_PROMISC_NOTSUP	2	/* this device doesn't support promiscuous mode */
+#define PCAP_WARNING_TSTAMP_TYPE_NOTSUP	3	/* the requested time stamp type is not supported */
+
+/*
+ * Value to pass to pcap_compile() as the netmask if you don't know what
+ * the netmask is.
+ */
+#define PCAP_NETMASK_UNKNOWN	0xffffffff
+
+char	*pcap_lookupdev(char *);
+int	pcap_lookupnet(const char *, bpf_u_int32 *, bpf_u_int32 *, char *);
+
+pcap_t	*pcap_create(const char *, char *);
+int	pcap_set_snaplen(pcap_t *, int);
+int	pcap_set_promisc(pcap_t *, int);
+int	pcap_can_set_rfmon(pcap_t *);
+int	pcap_set_rfmon(pcap_t *, int);
+int	pcap_set_timeout(pcap_t *, int);
+int	pcap_set_tstamp_type(pcap_t *, int);
+int	pcap_set_immediate_mode(pcap_t *, int);
+int	pcap_set_buffer_size(pcap_t *, int);
+int	pcap_set_tstamp_precision(pcap_t *, int);
+int	pcap_get_tstamp_precision(pcap_t *);
+int	pcap_activate(pcap_t *);
+
+int	pcap_list_tstamp_types(pcap_t *, int **);
+void	pcap_free_tstamp_types(int *);
+int	pcap_tstamp_type_name_to_val(const char *);
+const char *pcap_tstamp_type_val_to_name(int);
+const char *pcap_tstamp_type_val_to_description(int);
+
+/*
+ * Time stamp types.
+ * Not all systems and interfaces will necessarily support all of these.
+ *
+ * A system that supports PCAP_TSTAMP_HOST is offering time stamps
+ * provided by the host machine, rather than by the capture device,
+ * but not committing to any characteristics of the time stamp;
+ * it will not offer any of the PCAP_TSTAMP_HOST_ subtypes.
+ *
+ * PCAP_TSTAMP_HOST_LOWPREC is a time stamp, provided by the host machine,
+ * that's low-precision but relatively cheap to fetch; it's normally done
+ * using the system clock, so it's normally synchronized with times you'd
+ * fetch from system calls.
+ *
+ * PCAP_TSTAMP_HOST_HIPREC is a time stamp, provided by the host machine,
+ * that's high-precision; it might be more expensive to fetch.  It might
+ * or might not be synchronized with the system clock, and might have
+ * problems with time stamps for packets received on different CPUs,
+ * depending on the platform.
+ *
+ * PCAP_TSTAMP_ADAPTER is a high-precision time stamp supplied by the
+ * capture device; it's synchronized with the system clock.
+ *
+ * PCAP_TSTAMP_ADAPTER_UNSYNCED is a high-precision time stamp supplied by
+ * the capture device; it's not synchronized with the system clock.
+ *
+ * Note that time stamps synchronized with the system clock can go
+ * backwards, as the system clock can go backwards.  If a clock is
+ * not in sync with the system clock, that could be because the
+ * system clock isn't keeping accurate time, because the other
+ * clock isn't keeping accurate time, or both.
+ *
+ * Note that host-provided time stamps generally correspond to the
+ * time when the time-stamping code sees the packet; this could
+ * be some unknown amount of time after the first or last bit of
+ * the packet is received by the network adapter, due to batching
+ * of interrupts for packet arrival, queueing delays, etc..
+ */
+#define PCAP_TSTAMP_HOST		0	/* host-provided, unknown characteristics */
+#define PCAP_TSTAMP_HOST_LOWPREC	1	/* host-provided, low precision */
+#define PCAP_TSTAMP_HOST_HIPREC		2	/* host-provided, high precision */
+#define PCAP_TSTAMP_ADAPTER		3	/* device-provided, synced with the system clock */
+#define PCAP_TSTAMP_ADAPTER_UNSYNCED	4	/* device-provided, not synced with the system clock */
+
+/*
+ * Time stamp resolution types.
+ * Not all systems and interfaces will necessarily support all of these
+ * resolutions when doing live captures; all of them can be requested
+ * when reading a savefile.
+ */
+#define PCAP_TSTAMP_PRECISION_MICRO	0	/* use timestamps with microsecond precision, default */
+#define PCAP_TSTAMP_PRECISION_NANO	1	/* use timestamps with nanosecond precision */
+
+pcap_t	*pcap_open_live(const char *, int, int, int, char *);
+pcap_t	*pcap_open_dead(int, int);
+pcap_t	*pcap_open_dead_with_tstamp_precision(int, int, u_int);
+pcap_t	*pcap_open_offline_with_tstamp_precision(const char *, u_int, char *);
+pcap_t	*pcap_open_offline(const char *, char *);
+#if defined(WIN32)
+pcap_t  *pcap_hopen_offline_with_tstamp_precision(intptr_t, u_int, char *);
+pcap_t  *pcap_hopen_offline(intptr_t, char *);
+#if !defined(LIBPCAP_EXPORTS)
+#define pcap_fopen_offline_with_tstamp_precision(f,p,b) \
+	pcap_hopen_offline_with_tstamp_precision(_get_osfhandle(_fileno(f)), p, b)
+#define pcap_fopen_offline(f,b) \
+	pcap_hopen_offline(_get_osfhandle(_fileno(f)), b)
+#else /*LIBPCAP_EXPORTS*/
+static pcap_t *pcap_fopen_offline_with_tstamp_precision(FILE *, u_int, char *);
+static pcap_t *pcap_fopen_offline(FILE *, char *);
+#endif
+#else /*WIN32*/
+pcap_t	*pcap_fopen_offline_with_tstamp_precision(FILE *, u_int, char *);
+pcap_t	*pcap_fopen_offline(FILE *, char *);
+#endif /*WIN32*/
+
+void	pcap_close(pcap_t *);
+int	pcap_loop(pcap_t *, int, pcap_handler, u_char *);
+int	pcap_dispatch(pcap_t *, int, pcap_handler, u_char *);
+const u_char*
+	pcap_next(pcap_t *, struct pcap_pkthdr *);
+int 	pcap_next_ex(pcap_t *, struct pcap_pkthdr **, const u_char **);
+void	pcap_breakloop(pcap_t *);
+int	pcap_stats(pcap_t *, struct pcap_stat *);
+int	pcap_setfilter(pcap_t *, struct bpf_program *);
+int 	pcap_setdirection(pcap_t *, pcap_direction_t);
+int	pcap_getnonblock(pcap_t *, char *);
+int	pcap_setnonblock(pcap_t *, int, char *);
+int	pcap_inject(pcap_t *, const void *, size_t);
+int	pcap_sendpacket(pcap_t *, const u_char *, int);
+const char *pcap_statustostr(int);
+const char *pcap_strerror(int);
+char	*pcap_geterr(pcap_t *);
+void	pcap_perror(pcap_t *, char *);
+int	pcap_compile(pcap_t *, struct bpf_program *, const char *, int,
+	    bpf_u_int32);
+int	pcap_compile_nopcap(int, int, struct bpf_program *,
+	    const char *, int, bpf_u_int32);
+void	pcap_freecode(struct bpf_program *);
+int	pcap_offline_filter(const struct bpf_program *,
+	    const struct pcap_pkthdr *, const u_char *);
+int	pcap_datalink(pcap_t *);
+int	pcap_datalink_ext(pcap_t *);
+int	pcap_list_datalinks(pcap_t *, int **);
+int	pcap_set_datalink(pcap_t *, int);
+void	pcap_free_datalinks(int *);
+int	pcap_datalink_name_to_val(const char *);
+const char *pcap_datalink_val_to_name(int);
+const char *pcap_datalink_val_to_description(int);
+int	pcap_snapshot(pcap_t *);
+int	pcap_is_swapped(pcap_t *);
+int	pcap_major_version(pcap_t *);
+int	pcap_minor_version(pcap_t *);
+
+/* XXX */
+FILE	*pcap_file(pcap_t *);
+int	pcap_fileno(pcap_t *);
+
+pcap_dumper_t *pcap_dump_open(pcap_t *, const char *);
+pcap_dumper_t *pcap_dump_fopen(pcap_t *, FILE *fp);
+FILE	*pcap_dump_file(pcap_dumper_t *);
+long	pcap_dump_ftell(pcap_dumper_t *);
+int	pcap_dump_flush(pcap_dumper_t *);
+void	pcap_dump_close(pcap_dumper_t *);
+void	pcap_dump(u_char *, const struct pcap_pkthdr *, const u_char *);
+
+int	pcap_findalldevs(pcap_if_t **, char *);
+void	pcap_freealldevs(pcap_if_t *);
+
+const char *pcap_lib_version(void);
+
+/*
+ * On at least some versions of NetBSD, we don't want to declare
+ * bpf_filter() here, as it's also be declared in <net/bpf.h>, with a
+ * different signature, but, on other BSD-flavored UN*Xes, it's not
+ * declared in <net/bpf.h>, so we *do* want to declare it here, so it's
+ * declared when we build pcap-bpf.c.
+ */
+#ifndef __NetBSD__
+u_int	bpf_filter(const struct bpf_insn *, const u_char *, u_int, u_int);
+#endif
+int	bpf_validate(const struct bpf_insn *f, int len);
+char	*bpf_image(const struct bpf_insn *, int);
+void	bpf_dump(const struct bpf_program *, int);
+
+#if defined(WIN32)
+
+/*
+ * Win32 definitions
+ */
+
+int pcap_setbuff(pcap_t *p, int dim);
+int pcap_setmode(pcap_t *p, int mode);
+int pcap_setmintocopy(pcap_t *p, int size);
+Adapter *pcap_get_adapter(pcap_t *p);
+
+#ifdef WPCAP
+/* Include file with the wpcap-specific extensions */
+#include <Win32-Extensions.h>
+#endif /* WPCAP */
+
+#define MODE_CAPT 0
+#define MODE_STAT 1
+#define MODE_MON 2
+
+#elif defined(MSDOS)
+
+/*
+ * MS-DOS definitions
+ */
+
+int  pcap_stats_ex (pcap_t *, struct pcap_stat_ex *);
+void pcap_set_wait (pcap_t *p, void (*yield)(void), int wait);
+u_long pcap_mac_packets (void);
+
+#else /* UN*X */
+
+/*
+ * UN*X definitions
+ */
+
+int	pcap_get_selectable_fd(pcap_t *);
+
+#endif /* WIN32/MSDOS/UN*X */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* lib_pcap_pcap_h */
diff --git a/sll.h b/pcap/sll.h
similarity index 94%
rename from sll.h
rename to pcap/sll.h
index 85a3a9d..7ad811d 100644
--- a/sll.h
+++ b/pcap/sll.h
@@ -35,7 +35,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/sll.h,v 1.7 2002/06/11 17:04:48 itojun Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/pcap/sll.h,v 1.3 2008-05-30 01:35:33 guy Exp $ (LBL)
  */
 
 /*
@@ -64,8 +64,8 @@
  * DO NOT change the layout of this structure, or change any of the
  * LINUX_SLL_ values below.  If you must change the link-layer header
  * for a "cooked" Linux capture, introduce a new DLT_ type (ask
- * "tcpdump-workers@tcpdump.org" for one, so that you don't give it a
- * value that collides with a value already being used), and use the
+ * "tcpdump-workers@lists.tcpdump.org" for one, so that you don't give it
+ * a value that collides with a value already being used), and use the
  * new header in captures of that type, so that programs that can
  * handle DLT_LINUX_SLL captures will continue to handle them correctly
  * without any change, and so that capture files with different headers
@@ -73,6 +73,9 @@
  * packets in them.
  */
 
+#ifndef lib_pcap_sll_h
+#define lib_pcap_sll_h
+
 /*
  * A DLT_LINUX_SLL fake link-layer header.
  */
@@ -122,3 +125,5 @@
  */
 #define LINUX_SLL_P_802_3	0x0001	/* Novell 802.3 frames without 802.2 LLC header */
 #define LINUX_SLL_P_802_2	0x0004	/* 802.2 frames (not D/I/X Ethernet) */
+
+#endif
diff --git a/pcap/usb.h b/pcap/usb.h
new file mode 100644
index 0000000..aa35122
--- /dev/null
+++ b/pcap/usb.h
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2006 Paolo Abeni (Italy)
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
+ * OWNER 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.
+ *
+ * Basic USB data struct
+ * By Paolo Abeni <paolo.abeni@email.it>
+ *
+ * @(#) $Header: /tcpdump/master/libpcap/pcap/usb.h,v 1.9 2008-12-23 20:13:29 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 Control S-type 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;
+
+/*
+ * Information from the URB for Isochronous transfers.
+ */
+typedef struct _iso_rec {
+	int32_t	error_count;
+	int32_t	numdesc;
+} iso_rec;
+
+/*
+ * Header prepended by linux kernel to each event.
+ * Appears at the front of each packet in DLT_USB_LINUX captures.
+ */
+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;
+
+/*
+ * Header prepended by linux kernel to each event for the 2.6.31
+ * and later kernels; for the 2.6.21 through 2.6.30 kernels, the
+ * "iso_rec" information, and the fields starting with "interval"
+ * are zeroed-out padding fields.
+ *
+ * Appears at the front of each packet in DLT_USB_LINUX_MMAPPED captures.
+ */
+typedef struct _usb_header_mmapped {
+	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*/
+	union {
+		pcap_usb_setup setup;
+		iso_rec iso;
+	} s;
+	int32_t	interval;	/* for Interrupt and Isochronous events */
+	int32_t start_frame;	/* for Isochronous events */
+	u_int32_t xfer_flags;	/* copy of URB's transfer flags */
+	u_int32_t ndesc;	/* number of isochronous descriptors */
+} pcap_usb_header_mmapped;
+
+/*
+ * Isochronous descriptors; for isochronous transfers there might be
+ * one or more of these at the beginning of the packet data.  The
+ * number of descriptors is given by the "ndesc" field in the header;
+ * as indicated, in older kernels that don't put the descriptors at
+ * the beginning of the packet, that field is zeroed out, so that field
+ * can be trusted even in captures from older kernels.
+ */
+typedef struct _usb_isodesc {
+	int32_t		status;
+	u_int32_t	offset;
+	u_int32_t	len;
+	u_int8_t	pad[4];
+} usb_isodesc;
+
+#endif
diff --git a/pcap/vlan.h b/pcap/vlan.h
new file mode 100644
index 0000000..41aa8c7
--- /dev/null
+++ b/pcap/vlan.h
@@ -0,0 +1,46 @@
+/*-
+ * Copyright (c) 1990, 1991, 1992, 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 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.
+ *
+ * @(#) $Header: /tcpdump/master/libpcap/pcap/vlan.h,v 1.1 2008-08-06 07:45:00 guy Exp $
+ */
+
+#ifndef lib_pcap_vlan_h
+#define lib_pcap_vlan_h
+
+struct vlan_tag {
+	u_int16_t	vlan_tpid;		/* ETH_P_8021Q */
+	u_int16_t	vlan_tci;		/* VLAN TCI */
+};
+
+#define VLAN_TAG_LEN	4
+
+#endif
diff --git a/pcap1.h b/pcap1.h
index 08d0c5a..2cb532f 100644
--- a/pcap1.h
+++ b/pcap1.h
@@ -31,7 +31,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * @(#) $Header: /tcpdump/master/libpcap/pcap1.h,v 1.2 2004/03/30 14:42:50 mcr Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/pcap1.h,v 1.5 2008-05-30 01:43:21 guy Exp $ (LBL)
  */
 
 #ifndef lib_pcap_h
@@ -45,7 +45,7 @@
 #endif /* WIN32 */
 
 #ifndef PCAP_DONT_INCLUDE_PCAP_BPF_H
-#include <pcap-bpf.h>
+#include <pcap/bpf.h>
 #endif
 
 #include <stdio.h>
@@ -92,8 +92,8 @@
  *	introduce a new structure for the new format, if the layout
  *	of the structure changed;
  *
- *	send mail to "tcpdump-workers@tcpdump.org", requesting a new
- *	magic number for your new capture file format, and, when
+ *	send mail to "tcpdump-workers@lists.tcpdump.org", requesting
+ *	a new magic number for your new capture file format, and, when
  *	you get the new magic number, put it in "savefile.c";
  *
  *	use that magic number for save files with the changed file
@@ -103,9 +103,13 @@
  *	the old file header as well as files with the new file header
  *	(using the magic number to determine the header format).
  *
- * Then supply the changes to "patches@tcpdump.org", so that future
- * versions of libpcap and programs that use it (such as tcpdump) will
- * be able to read your new capture file format.
+ * Then supply the changes by forking the branch at
+ *
+ *	https://github.com/the-tcpdump-group/libpcap/issues
+ *
+ * and issuing a pull request, so that future versions of libpcap and
+ * programs that use it (such as tcpdump) will be able to read your new
+ * capture file format.
  */
 
 enum pcap1_info_types {
diff --git a/pcap_activate.3pcap b/pcap_activate.3pcap
new file mode 100644
index 0000000..f963d35
--- /dev/null
+++ b/pcap_activate.3pcap
@@ -0,0 +1,97 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_activate.3pcap,v 1.5 2008-07-01 08:02:33 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_ACTIVATE 3PCAP "5 April 2008"
+.SH NAME
+pcap_activate \- activate a capture handle
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_activate(pcap_t *p);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_activate()
+is used to activate a packet capture handle to look
+at packets on the network, with the options that were set on the handle
+being in effect.
+.SH RETURN VALUE
+.B pcap_activate()
+returns 0 on success without warnings,
+.B PCAP_WARNING_PROMISC_NOTSUP
+on success on a device that doesn't support promiscuous mode if
+promiscuous mode was requested,
+.B PCAP_WARNING_TSTAMP_TYPE_NOTSUP
+on success if the time stamp type specified in a previous
+.B pcap_set_tstamp_type()
+call isn't supported by the capture source (the time stamp type is
+left as the default),
+.B PCAP_WARNING
+on success with any other warning,
+.B PCAP_ERROR_ACTIVATED
+if the handle has already been activated,
+.B PCAP_ERROR_NO_SUCH_DEVICE
+if the capture source specified when the handle was created doesn't
+exist,
+.B PCAP_ERROR_PERM_DENIED
+if the process doesn't have permission to open the capture source,
+.B PCAP_ERROR_PROMISC_PERM_DENIED
+if the process has permission to open the capture source but doesn't
+have permission to put it into promiscuous mode,
+.B PCAP_ERROR_RFMON_NOTSUP
+if monitor mode was specified but the capture source doesn't support
+monitor mode,
+.B PCAP_ERROR_IFACE_NOT_UP
+if the capture source is not up, and
+.B PCAP_ERROR
+if another error occurred.
+If
+.B PCAP_WARNING
+or
+.B PCAP_ERROR
+is returned,
+.B pcap_geterr()
+or
+.B pcap_perror()
+may be called with
+.I p
+as an argument to fetch or display a message describing the warning or
+error.
+If
+.BR PCAP_WARNING_PROMISC_NOTSUP ,
+.BR PCAP_ERROR_NO_SUCH_DEVICE ,
+or
+.B PCAP_ERROR_PERM_DENIED
+is returned,
+.B pcap_geterr()
+or
+.B pcap_perror()
+may be called with
+.I p
+as an argument to fetch or display an message giving additional details
+about the problem that might be useful for debugging the problem if it's
+unexpected.
+.SH SEE ALSO
+pcap(3PCAP)
diff --git a/pcap_breakloop.3pcap b/pcap_breakloop.3pcap
new file mode 100644
index 0000000..e437af8
--- /dev/null
+++ b/pcap_breakloop.3pcap
@@ -0,0 +1,100 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_breakloop.3pcap,v 1.3 2008-04-06 02:53:21 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_BREAKLOOP 3PCAP "5 April 2008"
+.SH NAME
+pcap_breakloop \- force a pcap_dispatch() or pcap_loop() call to return
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+void pcap_breakloop(pcap_t *);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_breakloop()
+sets a flag that will force
+.B pcap_dispatch()
+or
+.B pcap_loop()
+to return rather than looping; they will return the number of packets
+that have been processed so far, or \-2 if no packets have been
+processed so far.
+.PP
+This routine is safe to use inside a signal handler on UNIX or a console
+control handler on Windows, as it merely sets a flag that is checked
+within the loop.
+.PP
+The flag is checked in loops reading packets from the OS - a signal by
+itself will not necessarily terminate those loops - as well as in loops
+processing a set of packets returned by the OS.
+.ft B
+Note that if you are catching signals on UNIX systems that support
+restarting system calls after a signal, and calling pcap_breakloop()
+in the signal handler, you must specify, when catching those signals,
+that system calls should NOT be restarted by that signal.  Otherwise,
+if the signal interrupted a call reading packets in a live capture,
+when your signal handler returns after calling pcap_breakloop(), the
+call will be restarted, and the loop will not terminate until more
+packets arrive and the call completes.
+.ft R
+.PP
+.ft B
+Note also that, in a multi-threaded application, if one thread is
+blocked in pcap_dispatch(), pcap_loop(), pcap_next(), or pcap_next_ex(),
+a call to pcap_breakloop() in a different thread will not unblock that
+thread; you will need to use whatever mechanism the OS provides for
+breaking a thread out of blocking calls in order to unblock the thread,
+such as thread cancellation in systems that support POSIX threads.
+.ft R
+.PP
+Note that
+.B pcap_next()
+and
+.B pcap_next_ex()
+will, on some platforms, loop reading packets from the OS; that loop
+will not necessarily be terminated by a signal, so
+.B pcap_breakloop()
+should be used to terminate packet processing even if
+.B pcap_next()
+or
+.B pcap_next_ex()
+is being used.
+.PP
+.B pcap_breakloop()
+does not guarantee that no further packets will be processed by
+.B pcap_dispatch()
+or
+.B pcap_loop()
+after it is called; at most one more packet might be processed.
+.PP
+If \-2 is returned from
+.B pcap_dispatch()
+or
+.BR pcap_loop() ,
+the flag is cleared, so a subsequent call will resume reading packets. 
+If a positive number is returned, the flag is not cleared, so a
+subsequent call will return \-2 and clear the flag.
+.SH SEE ALSO
+pcap(3PCAP), pcap_loop(3PCAP), pcap_next_ex(3PCAP)
diff --git a/pcap_can_set_rfmon.3pcap b/pcap_can_set_rfmon.3pcap
new file mode 100644
index 0000000..00b92a4
--- /dev/null
+++ b/pcap_can_set_rfmon.3pcap
@@ -0,0 +1,64 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_can_set_rfmon.3pcap,v 1.1 2008-04-06 02:53:21 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_CAN_SET_RFMON 3PCAP "18 May 2010"
+.SH NAME
+pcap_can_set_rfmon \- check whether monitor mode can be set for a
+not-yet-activated capture handle
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.LP
+.ft B
+int pcap_can_set_rfmon(pcap_t *p);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_can_set_rfmon()
+checks whether monitor mode could be set on a capture handle when
+the handle is activated.
+.SH RETURN VALUE
+.B pcap_can_set_rfmon()
+returns 0 if monitor mode could not be set,
+1 if monitor mode could be set,
+.B PCAP_ERROR_NO_SUCH_DEVICE
+if the capture source specified when the handle was created doesn't
+exist,
+.B PCAP_ERROR_PERM_DENIED
+if the process doesn't have permission to check whether monitor mode
+could be supported,
+.B PCAP_ERROR_ACTIVATED
+if called on a capture handle that has been activated, or
+.B PCAP_ERROR
+if an error occurred.
+If
+.B PCAP_ERROR
+is returned,
+.B pcap_geterr()
+or
+.B pcap_perror()
+may be called with
+.I p
+as an argument to fetch or display the error text.
+.SH SEE ALSO
+pcap(3PCAP), pcap_create(3PCAP), pcap_activate(3PCAP),
+pcap_set_rfmon(3PCAP)
diff --git a/pcap_close.3pcap b/pcap_close.3pcap
new file mode 100644
index 0000000..810664d
--- /dev/null
+++ b/pcap_close.3pcap
@@ -0,0 +1,41 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_close.3pcap,v 1.3 2008-04-06 02:53:21 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_CLOSE 3PCAP "5 April 2008"
+.SH NAME
+pcap_close \- close a capture device or savefile
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+void pcap_close(pcap_t *p);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_close()
+closes the files associated with
+.I p
+and deallocates resources.
+.SH SEE ALSO
+pcap(3PCAP)
diff --git a/pcap_compile.3pcap.in b/pcap_compile.3pcap.in
new file mode 100644
index 0000000..7dbdad5
--- /dev/null
+++ b/pcap_compile.3pcap.in
@@ -0,0 +1,72 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_compile.3pcap.in,v 1.1 2008-10-21 07:33:02 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_COMPILE 3PCAP "5 April 2008"
+.SH NAME
+pcap_compile \- compile a filter expression
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_compile(pcap_t *p, struct bpf_program *fp,
+.ti +8
+const char *str, int optimize, bpf_u_int32 netmask);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_compile()
+is used to compile the string
+.I str
+into a filter program.  See
+.BR pcap-filter (@MAN_MISC_INFO@)
+for the syntax of that string.
+.I program
+is a pointer to a
+.I bpf_program
+struct and is filled in by
+.BR pcap_compile() .
+.I optimize
+controls whether optimization on the resulting code is performed.
+.I netmask
+specifies the IPv4 netmask of the network on which packets are being
+captured; it is used only when checking for IPv4 broadcast addresses in
+the filter program.  If the netmask of the network on which packets are
+being captured isn't known to the program, or if packets are being
+captured on the Linux "any" pseudo-interface that can capture on more
+than one network, a value of PCAP_NETMASK_UNKNOWN can be supplied; tests
+for IPv4 broadcast addresses will fail to compile, but all other tests in
+the filter program will be OK.
+.SH RETURN VALUE
+.B pcap_compile()
+returns 0 on success and \-1 on failure.
+If \-1 is returned,
+.B pcap_geterr()
+or
+.B pcap_perror()
+may be called with
+.I p
+as an argument to fetch or display the error text.
+.SH SEE ALSO
+pcap(3PCAP), pcap_setfilter(3PCAP), pcap_freecode(3PCAP),
+pcap_geterr(3PCAP), pcap-filter(@MAN_MISC_INFO@)
diff --git a/pcap_create.3pcap b/pcap_create.3pcap
new file mode 100644
index 0000000..153f9fd
--- /dev/null
+++ b/pcap_create.3pcap
@@ -0,0 +1,74 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_create.3pcap,v 1.1 2008-04-06 02:53:21 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_CREATE 3PCAP "5 April 2008"
+.SH NAME
+pcap_create \- create a live capture handle
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.nf
+.ft B
+char errbuf[PCAP_ERRBUF_SIZE];
+.ft
+.LP
+.ft B
+pcap_t *pcap_create(const char *source, char *errbuf);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_create()
+is used to create a packet capture handle to look
+at packets on the network.
+.I source
+is a string that specifies the network device to open; on Linux systems
+with 2.2 or later kernels, a
+.I source
+argument of "any" or
+.B NULL
+can be used to capture packets from all interfaces.
+.PP
+The returned handle must be activated with
+.B pcap_activate()
+before packets can be captured
+with it; options for the capture, such as promiscuous mode, can be set
+on the handle before activating it.
+.SH RETURN VALUE
+.B pcap_create()
+returns a
+.I pcap_t *
+on success and
+.B NULL
+on failure.
+If
+.B NULL
+is returned,
+.I errbuf
+is filled in with an appropriate error message.
+.I errbuf
+is assumed to be able to hold at least
+.B PCAP_ERRBUF_SIZE
+chars.
+.SH SEE ALSO
+pcap(3PCAP), pcap_activate(3PCAP)
diff --git a/pcap_datalink.3pcap.in b/pcap_datalink.3pcap.in
new file mode 100644
index 0000000..51d5d66
--- /dev/null
+++ b/pcap_datalink.3pcap.in
@@ -0,0 +1,70 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_datalink.3pcap.in,v 1.1 2008-10-21 07:33:02 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_DATALINK 3PCAP "22 August 2010"
+.SH NAME
+pcap_datalink \- get the link-layer header type
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_datalink(pcap_t *p);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_datalink()
+returns the link-layer header type for the live capture or ``savefile''
+specified by
+.IR p .
+.PP
+It must not be called on a pcap descriptor created by
+.B pcap_create()
+that has not yet been activated by
+.BR pcap_activate() .
+.PP
+.I http://www.tcpdump.org/linktypes.html
+lists the values
+.B pcap_datalink()
+can return and describes the packet formats that
+correspond to those values.
+.PP
+Do
+.B NOT
+assume that the packets for a given capture or ``savefile`` will have
+any given link-layer header type, such as
+.B DLT_EN10MB
+for Ethernet.  For example, the "any" device on Linux will have a
+link-layer header type of
+.B DLT_LINUX_SLL
+even if all devices on the system at the time the "any" device is opened
+have some other data link type, such as
+.B DLT_EN10MB
+for Ethernet.
+.SH RETURN VALUE
+.B pcap_datalink()
+returns the link-layer header type on success and
+.B PCAP_ERROR_NOT_ACTIVATED
+if called on a capture handle that has been created but not activated.
+.SH SEE ALSO
+pcap(3PCAP), pcap-linktype(@MAN_MISC_INFO@)
diff --git a/pcap_datalink_name_to_val.3pcap b/pcap_datalink_name_to_val.3pcap
new file mode 100644
index 0000000..9c8e18a
--- /dev/null
+++ b/pcap_datalink_name_to_val.3pcap
@@ -0,0 +1,48 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_datalink_name_to_val.3pcap,v 1.3 2008-04-06 02:53:21 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_DATALINK_NAME_TO_VAL 3PCAP "22 August 2010"
+.SH NAME
+pcap_datalink_name_to_val \- get the link-layer header type value
+corresponding to a header type name
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_datalink_name_to_val(const char *name);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_datalink_name_to_val()
+translates a link-layer header type name, which is a
+.B DLT_
+name with the
+.B DLT_
+removed, to the corresponding link-layer header type value.  The
+translation is case-insensitive.
+.SH RETURN VALUE
+.B pcap_datalink_name_to_val()
+returns 0 on success and \-1 on failure.
+.SH SEE ALSO
+pcap(3PCAP)
diff --git a/pcap_datalink_val_to_name.3pcap b/pcap_datalink_val_to_name.3pcap
new file mode 100644
index 0000000..5acba77
--- /dev/null
+++ b/pcap_datalink_val_to_name.3pcap
@@ -0,0 +1,48 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_datalink_val_to_name.3pcap,v 1.3 2008-12-24 21:45:25 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_DATALINK_VAL_TO_NAME 3PCAP "22 August 2010"
+.SH NAME
+pcap_datalink_val_to_name, pcap_datalink_val_to_description \- get a
+name or description for a link-layer header type value
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap.h>
+.ft
+.LP
+.ft B
+const char *pcap_datalink_val_to_name(int dlt);
+const char *pcap_datalink_val_to_description(int dlt);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_datalink_val_to_name()
+translates a link-layer header type value to the corresponding
+link-layer header type name.
+.B NULL
+is returned on failure.
+.PP
+.B pcap_datalink_val_to_description()
+translates a link-layer header type value to a short description of that
+link-layer header type.
+.B NULL
+is returned on failure.
diff --git a/pcap_dump.3pcap b/pcap_dump.3pcap
new file mode 100644
index 0000000..1ccd82a
--- /dev/null
+++ b/pcap_dump.3pcap
@@ -0,0 +1,53 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_dump.3pcap,v 1.3 2008-04-06 02:53:21 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_DUMP 3PCAP "5 April 2008"
+.SH NAME
+pcap_dump \- write a packet to a capture file
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+void pcap_dump(u_char *user, struct pcap_pkthdr *h,
+.ti +8
+u_char *sp);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_dump()
+outputs a packet to the ``savefile'' opened with
+.BR pcap_dump_open() .
+Note that its calling arguments are suitable for use with
+.B pcap_dispatch()
+or
+.BR pcap_loop() .
+If called directly, the 
+.I user
+parameter is of type 
+.B pcap_dumper_t
+as returned by
+.BR pcap_dump_open() .
+.SH SEE ALSO
+pcap(3PCAP), pcap_dump_open(3PCAP), pcap_dispatch(3PCAP),
+pcap_loop(3PCAP)
diff --git a/pcap_dump_close.3pcap b/pcap_dump_close.3pcap
new file mode 100644
index 0000000..4ed820b
--- /dev/null
+++ b/pcap_dump_close.3pcap
@@ -0,0 +1,39 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_dump_close.3pcap,v 1.3 2008-04-06 02:53:21 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_DUMP_CLOSE 3PCAP "5 April 2008"
+.SH NAME
+pcap_dump_close \- close a savefile being written to
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+void pcap_dump_close(pcap_dumper_t *p);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_dump_close()
+closes the ``savefile.''
+.SH SEE ALSO
+pcap(3PCAP), pcap_dump_open(3PCAP), pcap_dump(3PCAP)
diff --git a/pcap_dump_file.3pcap b/pcap_dump_file.3pcap
new file mode 100644
index 0000000..9e51a2a
--- /dev/null
+++ b/pcap_dump_file.3pcap
@@ -0,0 +1,40 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_dump_file.3pcap,v 1.3 2008-04-06 02:53:21 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_DUMP_FILE 3PCAP "5 April 2008"
+.SH NAME
+pcap_dump_file \- get the standard I/O stream for a savefile being written
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+FILE *pcap_dump_file(pcap_dumper_t *p);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_dump_file()
+returns the standard I/O stream of the ``savefile'' opened by
+.BR pcap_dump_open() .
+.SH SEE ALSO
+pcap(3PCAP)
diff --git a/pcap_dump_flush.3pcap b/pcap_dump_flush.3pcap
new file mode 100644
index 0000000..b553883
--- /dev/null
+++ b/pcap_dump_flush.3pcap
@@ -0,0 +1,45 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_dump_flush.3pcap,v 1.3 2008-04-06 02:53:21 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_DUMP_FLUSH 3PCAP "5 April 2008"
+.SH NAME
+pcap_dump_flush \- flush to a savefile packets dumped
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_dump_flush(pcap_dumper_t *p);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_dump_flush()
+flushes the output buffer to the ``savefile,'' so that any packets
+written with
+.B pcap_dump()
+but not yet written to the ``savefile'' will be written.
+.SH RETURN VALUE
+.B pcap_dump_flush()
+returns 0 on success and \-1 on failure.
+.SH SEE ALSO
+pcap(3PCAP), pcap_dump_open(3PCAP), pcap_dump(3PCAP)
diff --git a/pcap_dump_ftell.3pcap b/pcap_dump_ftell.3pcap
new file mode 100644
index 0000000..1d0f96f
--- /dev/null
+++ b/pcap_dump_ftell.3pcap
@@ -0,0 +1,44 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_dump_ftell.3pcap,v 1.3 2008-04-06 02:53:21 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_DUMP_FTELL 3PCAP "5 April 2008"
+.SH NAME
+pcap_dump_ftell \- get the current file offset for a savefile being written
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+long pcap_dump_ftell(pcap_dumper_t *p);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_dump_ftell()
+returns the current file position for the ``savefile'', representing the
+number of bytes written by
+.B pcap_dump_open()
+and
+.BR pcap_dump() .
+\-1 is returned on error.
+.SH SEE ALSO
+pcap(3PCAP), pcap_dump_open(3PCAP), pcap_dump(3PCAP)
diff --git a/pcap_dump_open.3pcap.in b/pcap_dump_open.3pcap.in
new file mode 100644
index 0000000..2a5dc9d
--- /dev/null
+++ b/pcap_dump_open.3pcap.in
@@ -0,0 +1,87 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_dump_open.3pcap.in,v 1.1 2008-10-23 05:56:59 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_DUMP_OPEN 3PCAP "5 April 2008"
+.SH NAME
+pcap_dump_open, pcap_dump_fopen \- open a file to which to write packets
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.nf
+.LP
+.ft B
+pcap_dumper_t *pcap_dump_open(pcap_t *p, const char *fname);
+pcap_dumper_t *pcap_dump_fopen(pcap_t *p, FILE *fp);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_dump_open()
+is called to open a ``savefile'' for writing.
+.I fname
+specifies the name of the file to open. The file will have
+the same format as those used by
+.BR tcpdump (1)
+and
+.BR tcpslice (1).
+The name "-" in a synonym
+for
+.BR stdout .
+.PP
+.B pcap_dump_fopen()
+is called to write data to an existing open stream
+.IR fp .
+Note that on Windows, that stream should be opened in binary mode.
+.PP
+.I p
+is a capture or ``savefile'' handle returned by an earlier call to
+.B pcap_create()
+and activated by an earlier call to
+.BR pcap_activate() ,
+or returned by an earlier call to
+.BR pcap_open_offline() ,
+.BR pcap_open_live() ,
+or
+.BR pcap_open_dead() .
+The link-layer type and snapshot length from
+.I p
+are used as the link-layer type and snapshot length of the output file.
+.SH RETURN VALUES
+A pointer to a
+.B pcap_dumper_t
+structure to use in subsequent
+.B pcap_dump()
+and
+.B pcap_dump_close()
+calls is returned on success.
+.B NULL
+is returned on failure.
+If
+.B NULL
+is returned,
+.B pcap_geterr(\fIp\fB)
+can be used to get the error text.
+.SH SEE ALSO
+pcap(3PCAP), pcap_create(3PCAP), pcap_activate(3PCAP),
+pcap_open_offline(3PCAP), pcap_open_live(3PCAP), pcap_open_dead(3PCAP),
+pcap_dump(3PCAP), pcap_dump_close(3PCAP), pcap_geterr(3PCAP),
+pcap-savefile(@MAN_FILE_FORMATS@)
diff --git a/pcap_file.3pcap b/pcap_file.3pcap
new file mode 100644
index 0000000..1471ab6
--- /dev/null
+++ b/pcap_file.3pcap
@@ -0,0 +1,59 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_file.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_FILE 3PCAP "5 April 2008"
+.SH NAME
+pcap_file \- get the standard I/O stream for a savefile being read
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+FILE *pcap_file(pcap_t *p);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_file()
+returns the standard I/O stream of the ``savefile,'' if a ``savefile''
+was opened with
+.BR pcap_open_offline() ,
+or NULL, if a network device was opened with
+.B pcap_create()
+and
+.BR pcap_activate() ,
+or with
+.BR pcap_open_live() .
+.PP
+Note that the Packet Capture library is usually built with large file
+support, so the standard I/O stream of the ``savefile'' might refer to
+a file larger than 2 gigabytes; applications that use
+.B pcap_file()
+should, if possible, use calls that support large files on the return
+value of
+.B pcap_file()
+or the value returned by
+.B fileno()
+when passed the return value of
+.BR pcap_file() .
+.SH SEE ALSO
+pcap(3PCAP), pcap_open_offline(3PCAP)
diff --git a/pcap_fileno.3pcap b/pcap_fileno.3pcap
new file mode 100644
index 0000000..723733e
--- /dev/null
+++ b/pcap_fileno.3pcap
@@ -0,0 +1,68 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_fileno.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_FILENO 3PCAP "5 April 2008"
+.SH NAME
+pcap_fileno \- get the file descriptor for a live capture
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_fileno(pcap_t *p);
+.ft
+.fi
+.SH DESCRIPTION
+If
+.I p
+refers to a network device that was opened for a live capture using
+a combination of
+.B pcap_create()
+and
+.BR pcap_activate() ,
+or using
+.BR pcap_open_live() ,
+.B pcap_fileno()
+returns the file descriptor from which captured packets are read.
+.LP
+If
+.I p
+refers to a ``savefile'' that was opened using functions such as
+.BR pcap_open_offline()
+or
+.BR pcap_fopen_offline() ,
+a ``dead''
+.B pcap_t
+opened using
+.BR pcap_open_dead() ,
+or a
+.B pcap_t
+that was created with
+.B pcap_create()
+but that has not yet been activated with
+.BR pcap_activate() ,
+it returns \-1.
+.SH SEE ALSO
+pcap(3PCAP), pcap_create(3PCAP), pcap_activate(3PCAP),
+pcap_open_live(3PCAP), pcap_open_offline(3PCAP),
+pcap_fopen_offline(3PCAP), pcap_open_dead(3PCAP)
diff --git a/pcap_findalldevs.3pcap b/pcap_findalldevs.3pcap
new file mode 100644
index 0000000..2e56d09
--- /dev/null
+++ b/pcap_findalldevs.3pcap
@@ -0,0 +1,186 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_findalldevs.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_FINDALLDEVS 3PCAP "22 August 2010"
+.SH NAME
+pcap_findalldevs, pcap_freealldevs \- get a list of capture devices, and
+free that list
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.nf
+.ft B
+char errbuf[PCAP_ERRBUF_SIZE];
+.ft
+.LP
+.ft B
+int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf);
+void pcap_freealldevs(pcap_if_t *alldevs);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_findalldevs()
+constructs a list of network devices that can be opened with
+.B pcap_create()
+and
+.B pcap_activate()
+or with
+.BR pcap_open_live() .
+(Note that there may be network devices that cannot be opened by the
+process calling
+.BR pcap_findalldevs() ,
+because, for example, that process does not have sufficient privileges
+to open them for capturing; if so, those devices will not appear on the
+list.)
+If
+.B pcap_findalldevs()
+succeeds, the pointer pointed to by
+.I alldevsp
+is set to point to the first element of the list, or to
+.B NULL
+if no devices were found (this is considered success).
+Each element of the list is of type
+.BR pcap_if_t ,
+and has the following members:
+.RS
+.TP
+.B next
+if not
+.BR NULL ,
+a pointer to the next element in the list;
+.B NULL
+for the last element of the list
+.TP
+.B name
+a pointer to a string giving a name for the device to pass to
+.B pcap_open_live()
+.TP
+.B description
+if not
+.BR NULL ,
+a pointer to a string giving a human-readable description of the device
+.TP
+.B addresses
+a pointer to the first element of a list of network addresses for the
+device,
+or
+.B NULL
+if the device has no addresses
+.TP
+.B flags
+device flags:
+.RS
+.TP
+.B PCAP_IF_LOOPBACK
+set if the device is a loopback interface
+.RE
+.RE
+.PP
+Each element of the list of addresses is of type
+.BR pcap_addr_t ,
+and has the following members:
+.RS
+.TP
+.B next
+if not
+.BR NULL ,
+a pointer to the next element in the list;
+.B NULL
+for the last element of the list
+.TP
+.B addr
+a pointer to a
+.B "struct sockaddr"
+containing an address
+.TP
+.B netmask
+if not
+.BR NULL ,
+a pointer to a
+.B "struct sockaddr"
+that contains the netmask corresponding to the address pointed to by
+.B addr
+.TP
+.B broadaddr
+if not
+.BR NULL ,
+a pointer to a
+.B "struct sockaddr"
+that contains the broadcast address corresponding to the address pointed
+to by
+.BR addr ;
+may be null if the device doesn't support broadcasts
+.TP
+.B dstaddr
+if not
+.BR NULL ,
+a pointer to a
+.B "struct sockaddr"
+that contains the destination address corresponding to the address pointed
+to by
+.BR addr ;
+may be null if the device isn't a point-to-point interface
+.RE
+.PP
+Note that the addresses in the list of addresses might be IPv4
+addresses, IPv6 addresses, or some other type of addresses, so you must
+check the
+.B sa_family
+member of the
+.B "struct sockaddr"
+before interpreting the contents of the address; do not assume that the
+addresses are all IPv4 addresses, or even all IPv4 or IPv6 addresses.
+IPv4 addresses have the value
+.BR AF_INET ,
+IPv6 addresses have the value
+.B AF_INET6
+(which older operating systems that don't support IPv6 might not
+define), and other addresses have other values.  Whether other addresses
+are returned, and what types they might have is platform-dependent.
+For IPv4 addresses, the
+.B "struct sockaddr"
+pointer can be interpreted as if it pointed to a
+.BR "struct sockaddr_in" ;
+for IPv6 addresses, it can be interpreted as if it pointed to a
+.BR "struct sockaddr_in6".
+.PP
+The list of devices must be freed with
+.BR pcap_freealldevs() ,
+whch frees the list pointed to by
+.IR alldevs .
+.SH RETURN VALUE
+.B pcap_findalldevs()
+returns 0 on success and \-1 on failure; as indicated, finding no
+devices is considered success, rather than failure, so 0 will be
+returned in that case.
+If \-1 is returned,
+.I errbuf
+is filled in with an appropriate error message.
+.I errbuf
+is assumed to be able to hold at least
+.B PCAP_ERRBUF_SIZE
+chars.
+.SH SEE ALSO
+pcap(3PCAP), pcap_create(3PCAP), pcap_activate(3PCAP),
+pcap_open_live(3PCAP)
diff --git a/pcap_freecode.3pcap b/pcap_freecode.3pcap
new file mode 100644
index 0000000..31b4f89
--- /dev/null
+++ b/pcap_freecode.3pcap
@@ -0,0 +1,45 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_freecode.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_FREECODE 3PCAP "5 April 2008"
+.SH NAME
+pcap_freecode \- free a BPF program
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+void pcap_freecode(struct bpf_program *);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_freecode()
+is used to free up allocated memory pointed to by a
+.I bpf_program
+struct generated by
+.B pcap_compile()
+when that BPF program is no longer needed, for example after it
+has been made the filter program for a pcap structure by a call to
+.BR pcap_setfilter() .
+.SH SEE ALSO
+pcap(3PCAP), pcap_compile(3PCAP), pcap_setfilter(3PCAP)
diff --git a/pcap_get_selectable_fd.3pcap b/pcap_get_selectable_fd.3pcap
new file mode 100644
index 0000000..ae33dbb
--- /dev/null
+++ b/pcap_get_selectable_fd.3pcap
@@ -0,0 +1,129 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_get_selectable_fd.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_GET_SELECTABLE_FD 3PCAP "5 April 2008"
+.SH NAME
+pcap_get_selectable_fd \- get a file descriptor on which a select() can
+be done for a live capture
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_get_selectable_fd(pcap_t *p);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_get_selectable_fd()
+returns, on UNIX, a file descriptor number for a file descriptor on
+which one can
+do a
+.B select()
+or
+.B poll()
+to wait for it to be possible to read packets without blocking, if such
+a descriptor exists, or \-1, if no such descriptor exists.  Some network
+devices opened with
+.B pcap_create()
+and
+.BR pcap_activate() ,
+or with
+.BR pcap_open_live() ,
+do not support
+.B select()
+or
+.B poll()
+(for example, regular network devices on FreeBSD 4.3 and 4.4, and Endace
+DAG devices), so \-1 is returned for those devices.
+.PP
+Note that in:
+.IP
+FreeBSD prior to FreeBSD 4.6;
+.IP
+NetBSD prior to NetBSD 3.0;
+.IP
+OpenBSD prior to OpenBSD 2.4;
+.IP
+Mac OS X prior to Mac OS X 10.7;
+.PP
+.B select()
+and
+.B poll()
+do not work correctly on BPF devices;
+.B pcap_get_selectable_fd()
+will return a file descriptor on most of those versions (the exceptions
+being FreeBSD 4.3 and 4.4), but a simple
+.B select()
+or
+.B poll()
+will not indicate that the descriptor is readable until a full buffer's
+worth of packets is received, even if the read timeout expires before
+then.  To work around this, an application that uses
+.B select()
+or
+.B poll()
+to wait for packets to arrive must put the
+.B pcap_t
+in non-blocking mode, and must arrange that the
+.B select()
+or
+.B poll()
+have a timeout less than or equal to the read timeout,
+and must try to read packets after that timeout expires, regardless of
+whether
+.B select()
+or
+.B poll()
+indicated that the file descriptor for the
+.B pcap_t
+is ready to be read or not.  (That workaround will not work in FreeBSD
+4.3 and later; however, in FreeBSD 4.6 and later,
+.B select()
+and
+.B poll()
+work correctly on BPF devices, so the workaround isn't necessary,
+although it does no harm.)
+.PP
+Note also that
+.B poll()
+doesn't work on character special files, including BPF devices, in Mac
+OS X 10.4 and 10.5, so, while
+.B select()
+can be used on the descriptor returned by
+.BR pcap_get_selectable_fd() ,
+.B poll()
+cannot be used on it those versions of Mac OS X.  Kqueues also don't
+work on that descriptor.
+.BR poll() ,
+but not kqueues, work on that descriptor in Mac OS X releases prior to
+10.4;
+.B poll()
+and kqueues work on that descriptor in Mac OS X 10.6 and later.
+.PP
+.B pcap_get_selectable_fd()
+is not available on Windows.
+.SH RETURN VALUE
+A selectable file descriptor is returned if one exists; otherwise, \-1
+is returned.
+.SH SEE ALSO
+pcap(3PCAP), select(2), poll(2)
diff --git a/pcap_get_tstamp_precision.3pcap.in b/pcap_get_tstamp_precision.3pcap.in
new file mode 100644
index 0000000..656c142
--- /dev/null
+++ b/pcap_get_tstamp_precision.3pcap.in
@@ -0,0 +1,52 @@
+.\"Copyright (c) 2013, Michal Sekletar
+.\"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 names of the authors may not 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_GET_TSTAMP_PRECISION 3PCAP "27 August 2013"
+.SH NAME
+pcap_get_tstamp_precision \- get the time stamp precision returned in
+captures
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_get_tstamp_precision(pcap_t *p);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_get_tstamp_precision()
+returns the precision of the time stamp returned in packet captures on the pcap
+descriptor.
+.SH RETURN VALUE
+.B pcap_get_tstamp_precision()
+returns
+.B PCAP_TSTAMP_PRECISION_MICRO
+or
+.BR PCAP_TSTAMP_PRECISION_NANO ,
+which indicates
+that pcap captures contains time stamps in microseconds or nanoseconds
+respectively.
+.SH SEE ALSO
+pcap(3PCAP),
+pcap_set_tstamp_precision(3PCAP),
+pcap-tstamp(@MAN_MISC_INFO@)
diff --git a/pcap_geterr.3pcap b/pcap_geterr.3pcap
new file mode 100644
index 0000000..1a4ea34
--- /dev/null
+++ b/pcap_geterr.3pcap
@@ -0,0 +1,53 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_geterr.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_GETERR 3PCAP "5 April 2008"
+.SH NAME
+pcap_geterr, pcap_perror \- get or print libpcap error message text
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+char *pcap_geterr(pcap_t *p);
+void pcap_perror(pcap_t *p, char *prefix);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_geterr()
+returns the error text pertaining to the last pcap library error.
+.BR NOTE :
+the pointer it returns will no longer point to a valid error message
+string after the
+.B pcap_t
+passed to it is closed; you must use or copy the string before closing
+the
+.BR pcap_t .
+.PP
+.B pcap_perror()
+prints the text of the last pcap library error on
+.BR stderr ,
+prefixed by
+.IR prefix .
+.SH SEE ALSO
+pcap(3PCAP)
diff --git a/pcap_inject.3pcap b/pcap_inject.3pcap
new file mode 100644
index 0000000..79a3eea
--- /dev/null
+++ b/pcap_inject.3pcap
@@ -0,0 +1,90 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_inject.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_INJECT 3PCAP "5 April 2008"
+.SH NAME
+pcap_inject, pcap_sendpacket \- transmit a packet
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_inject(pcap_t *p, const void *buf, size_t size);
+int pcap_sendpacket(pcap_t *p, const u_char *buf, int size);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_inject()
+sends a raw packet through the network interface;
+.I buf
+points to the data of the packet, including the link-layer header, and
+.I size
+is the number of bytes in the packet.
+.PP
+Note that, even if you successfully open the network interface, you
+might not have permission to send packets on it, or it might not support
+sending packets; as
+.I pcap_open_live()
+doesn't have a flag to indicate whether to open for capturing, sending,
+or capturing and sending, you cannot request an open that supports
+sending and be notified at open time whether sending will be possible.
+Note also that some devices might not support sending packets.
+.PP
+Note that, on some platforms, the link-layer header of the packet that's
+sent might not be the same as the link-layer header of the packet
+supplied to
+.BR pcap_inject() ,
+as the source link-layer address, if the header contains such an
+address, might be changed to be the address assigned to the interface on
+which the packet it sent, if the platform doesn't support sending
+completely raw and unchanged packets.  Even worse, some drivers on some
+platforms might change the link-layer type field to whatever value
+libpcap used when attaching to the device, even on platforms that
+.I do
+nominally support sending completely raw and unchanged packets.
+.PP
+.B pcap_sendpacket()
+is like
+.BR pcap_inject() ,
+but it returns 0 on success, rather than returning the number of bytes
+written.
+.RB ( pcap_inject()
+comes from OpenBSD;
+.B pcap_sendpacket()
+comes from WinPcap.  Both are provided for compatibility.)
+.SH RETURN VALUE
+.B pcap_inject()
+returns the number of bytes written on success and \-1 on failure.
+.PP
+.B pcap_sendpacket()
+returns 0 on success and \-1 on failure.
+.PP
+If \-1 is returned,
+.B pcap_geterr()
+or
+.B pcap_perror()
+may be called with
+.I p
+as an argument to fetch or display the error text.
+.SH SEE ALSO
+pcap(3PCAP), pcap_geterr(3PCAP)
diff --git a/pcap_is_swapped.3pcap b/pcap_is_swapped.3pcap
new file mode 100644
index 0000000..29646d1
--- /dev/null
+++ b/pcap_is_swapped.3pcap
@@ -0,0 +1,53 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_is_swapped.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_IS_SWAPPED 3PCAP "5 April 2008"
+.SH NAME
+pcap_is_swapped \- find out whether a savefile has the native byte order
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_is_swapped(pcap_t *p);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_is_swapped()
+returns true (1) if
+.I p
+refers to a ``savefile'' that uses a different byte order
+than the current system.  For a live capture, it always returns false
+(0).
+.PP
+It must not be called on a pcap descriptor created by
+.B pcap_create()
+that has not yet been activated by
+.BR pcap_activate() .
+.SH RETURN VALUE
+.B pcap_datalink()
+returns true (1) or false (0) on success and
+.B PCAP_ERROR_NOT_ACTIVATED
+if called on a capture handle that has been created but not activated.
+.SH SEE ALSO
+pcap(3PCAP)
diff --git a/pcap_lib_version.3pcap b/pcap_lib_version.3pcap
new file mode 100644
index 0000000..7b39be1
--- /dev/null
+++ b/pcap_lib_version.3pcap
@@ -0,0 +1,41 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_lib_version.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_LIB_VERSION 3PCAP "5 April 2008"
+.SH NAME
+pcap_lib_version \- get the version information for libpcap
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+const char *pcap_lib_version(void);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_lib_version()
+returns a pointer to a string giving information about the version of
+the libpcap library being used; note that it contains more information
+than just a version number.
+.SH SEE ALSO
+pcap(3PCAP)
diff --git a/pcap_list_datalinks.3pcap.in b/pcap_list_datalinks.3pcap.in
new file mode 100644
index 0000000..9dfb342
--- /dev/null
+++ b/pcap_list_datalinks.3pcap.in
@@ -0,0 +1,75 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_list_datalinks.3pcap.in,v 1.1 2008-10-21 07:33:02 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_LIST_DATALINKS 3PCAP "22 August 2010"
+.SH NAME
+pcap_list_datalinks, pcap_free_datalinks \- get a list of link-layer header
+types supported by a capture device, and free that list
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_list_datalinks(pcap_t *p, int **dlt_buf);
+void pcap_free_datalinks(int *dlt_list);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_list_datalinks()
+is used to get a list of the supported link-layer header types of the
+interface associated with the pcap descriptor.
+.B pcap_list_datalinks()
+allocates an array to hold the list and sets
+.IR *dlt_buf 
+to point to that array.
+.LP
+The caller is responsible for freeing the array with
+.BR pcap_free_datalinks() ,
+which frees the list of link-layer header types pointed to by
+.IR dlt_list .
+.LP
+It must not be called on a pcap descriptor created by
+.B pcap_create()
+that has not yet been activated by
+.BR pcap_activate() .
+.SH RETURN VALUE
+.B pcap_list_datalinks()
+returns the number of link-layer header types in the array on success,
+.B PCAP_ERROR_NOT_ACTIVATED
+if called on a capture handle that has been created but not activated,
+and
+.B PCAP_ERROR
+(\-1) on other errors.
+If
+.B PCAP_ERROR
+is returned,
+.B pcap_geterr()
+or
+.B pcap_perror()
+may be called with
+.I p
+as an argument to fetch or display the error text.
+.SH SEE ALSO
+pcap(3PCAP), pcap_geterr(3PCAP),
+pcap_datalink_val_to_name(3PCAP),
+pcap-linktype(@MAN_MISC_INFO@)
diff --git a/pcap_list_tstamp_types.3pcap.in b/pcap_list_tstamp_types.3pcap.in
new file mode 100644
index 0000000..66d3d66
--- /dev/null
+++ b/pcap_list_tstamp_types.3pcap.in
@@ -0,0 +1,70 @@
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_LIST_TSTAMP_TYPES 3PCAP "21 August 2010"
+.SH NAME
+pcap_list_tstamp_types, pcap_free_tstamp_types \- get a list of time
+stamp types supported by a capture device, and free that list
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_list_tstamp_types(pcap_t *p, int **tstamp_typesp);
+void pcap_free_tstamp_types(int *tstamp_types);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_list_tstamp_types()
+is used to get a list of the supported time stamp types of the interface
+associated with the pcap descriptor.
+.B pcap_list_tstamp_types()
+allocates an array to hold the list and sets
+.I *tstamp_typesp
+to point to the array.
+See
+.BR pcap-tstamp (@MAN_MISC_INFO@)
+for a list of all the time stamp types.
+.PP
+The caller is responsible for freeing the array with
+.BR pcap_free_tstamp_types() ,
+which frees the list pointed to by
+.IR tstamp_types .
+.SH RETURN VALUE
+.B pcap_list_tstamp_types()
+returns the number of time stamp types in the array on success and
+.B PCAP_ERROR
+on failure.
+A return value of zero means that you cannot specify a time stamp type;
+you are limited to the capture device's default time stamp type.
+If
+.B PCAP_ERROR
+is returned,
+.B pcap_geterr()
+or
+.B pcap_perror()
+may be called with
+.I p
+as an argument to fetch or display the error text.
+.SH SEE ALSO
+pcap(3PCAP), pcap_geterr(3PCAP), pcap_tstamp_type_val_to_name(3PCAP),
+pcap-tstamp(@MAN_MISC_INFO@)
diff --git a/pcap_lookupdev.3pcap b/pcap_lookupdev.3pcap
new file mode 100644
index 0000000..8b23cb8
--- /dev/null
+++ b/pcap_lookupdev.3pcap
@@ -0,0 +1,62 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_lookupdev.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_LOOKUPDEV 3PCAP "5 April 2008"
+.SH NAME
+pcap_lookupdev \- find the default device on which to capture
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.nf
+.ft B
+char errbuf[PCAP_ERRBUF_SIZE];
+.ft
+.LP
+.ft B
+char *pcap_lookupdev(char *errbuf);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_lookupdev()
+returns a pointer to a string giving the name of a network device
+suitable for use with
+.B pcap_create()
+and
+.BR pcap_activate() ,
+or with
+.BR pcap_open_live() ,
+and with
+.BR pcap_lookupnet() .
+If there is an error,
+.B NULL
+is returned and
+.I errbuf
+is filled in with an appropriate error message.
+.I errbuf
+is assumed to be able to hold at least
+.B PCAP_ERRBUF_SIZE
+chars.
+.SH SEE ALSO
+pcap(3PCAP), pcap_create(3PCAP), pcap_activate(3PCAP),
+pcap_open_live(3PCAP), pcap_lookupnet(3PCAP)
diff --git a/pcap_lookupnet.3pcap b/pcap_lookupnet.3pcap
new file mode 100644
index 0000000..75c82cf
--- /dev/null
+++ b/pcap_lookupnet.3pcap
@@ -0,0 +1,65 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_lookupnet.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_LOOKUPNET 3PCAP "5 April 2008"
+.SH NAME
+pcap_lookupnet \- find the IPv4 network number and netmask for a device
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.nf
+.ft B
+char errbuf[PCAP_ERRBUF_SIZE];
+.ft
+.LP
+.ft B
+int pcap_lookupnet(const char *device, bpf_u_int32 *netp,
+.ti +8
+bpf_u_int32 *maskp, char *errbuf);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_lookupnet()
+is used to determine the IPv4 network number and mask
+associated with the network device
+.IR device .
+Both
+.I netp
+and
+.I maskp
+are
+.I bpf_u_int32
+pointers.
+.SH RETURN VALUE
+.B pcap_lookupnet()
+returns 0 on success and \-1 on failure.
+If \-1 is returned,
+.I errbuf
+is filled in with an appropriate error message.
+.I errbuf
+is assumed to be able to hold at least
+.B PCAP_ERRBUF_SIZE
+chars.
+.SH SEE ALSO
+pcap(3PCAP)
diff --git a/pcap_loop.3pcap b/pcap_loop.3pcap
new file mode 100644
index 0000000..c2ba33c
--- /dev/null
+++ b/pcap_loop.3pcap
@@ -0,0 +1,194 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_loop.3pcap,v 1.4 2008-12-25 02:01:32 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_LOOP 3PCAP "24 December 2008"
+.SH NAME
+pcap_loop, pcap_dispatch \- process packets from a live capture or savefile
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h,
+.ti +8
+			     const u_char *bytes);
+.ft
+.LP
+.ft B
+int pcap_loop(pcap_t *p, int cnt,
+.ti +8
+pcap_handler callback, u_char *user);
+int pcap_dispatch(pcap_t *p, int cnt,
+.ti +8
+pcap_handler callback, u_char *user);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_loop()
+processes packets from a live capture or ``savefile'' until
+.I cnt
+packets are processed, the end of the ``savefile'' is
+reached when reading from a ``savefile'',
+.B pcap_breakloop()
+is called, or an error occurs.
+It does
+.B not
+return when live read timeouts occur.
+A value of \-1 or 0 for
+.I cnt
+is equivalent to infinity, so that packets are processed until another
+ending condition occurs.
+.PP
+.B pcap_dispatch()
+processes packets from a live capture or ``savefile'' until
+.I cnt
+packets are processed, the end of the current bufferful of packets is
+reached when doing a live capture, the end of the ``savefile'' is
+reached when reading from a ``savefile'',
+.B pcap_breakloop()
+is called, or an error occurs.
+Thus, when doing a live capture,
+.I cnt
+is the maximum number of packets to process before returning, but is not
+a minimum number; when reading a live capture, only one
+bufferful of packets is read at a time, so fewer than
+.I cnt
+packets may be processed. A value of \-1 or 0 for
+.I cnt
+causes all the packets received in one buffer to be processed when
+reading a live capture, and causes all the packets in the file to be
+processed when reading a ``savefile''.
+.PP
+.ft B
+(In older versions of libpcap, the behavior when
+\fIcnt\fP
+was 0 was undefined; different platforms and devices behaved
+differently, so code that must work with older versions of libpcap
+should use \-1, not 0, as the value of
+\fIcnt\fP.)
+.ft R
+.PP
+.I callback
+specifies a
+.I pcap_handler
+routine to be called with three arguments:
+a
+.I u_char
+pointer which is passed in the
+.I user
+argument to
+.B pcap_loop()
+or
+.BR pcap_dispatch() ,
+a
+.I const struct pcap_pkthdr
+pointer pointing to the packet time stamp and lengths, and a
+.I const u_char
+pointer to the first
+.B caplen
+(as given in the
+.I struct pcap_pkthdr
+a pointer to which is passed to the callback routine)
+bytes of data from the packet.  The
+.I struct pcap_pkthdr
+and the packet data are not to be freed by the callback routine, and are
+not guaranteed to be valid after the callback routine returns; if the
+code needs them to be valid after the callback, it must make a copy of
+them.
+.PP
+The bytes of data from the packet begin with a link-layer header.  The
+format of the link-layer header is indicated by the return value of the
+.B pcap_datalink()
+routine when handed the
+.B pcap_t
+value also passed to
+.B pcap_loop()
+or
+.BR pcap_dispatch() .
+.I http://www.tcpdump.org/linktypes.html
+lists the values
+.B pcap_datalink()
+can return and describes the packet formats that
+correspond to those values.  The value it returns will be valid for all
+packets received unless and until
+.B pcap_set_datalink()
+is called; after a successful call to
+.BR pcap_set_datalink() ,
+all subsequent packets will have a link-layer header of the type
+specified by the link-layer header type value passed to
+.BR pcap_set_datalink() .
+.PP
+Do
+.B NOT
+assume that the packets for a given capture or ``savefile`` will have
+any given link-layer header type, such as
+.B DLT_EN10MB
+for Ethernet.  For example, the "any" device on Linux will have a
+link-layer header type of
+.B DLT_LINUX_SLL
+even if all devices on the system at the time the "any" device is opened
+have some other data link type, such as
+.B DLT_EN10MB
+for Ethernet.
+.SH RETURN VALUE
+.B pcap_loop()
+returns 0 if
+.I cnt
+is exhausted or if, when reading from a ``savefile'', no more packets
+are available.  It returns \-1 if an error occurs or \-2 if the loop
+terminated due to a call to
+.B pcap_breakloop()
+before any packets were processed.
+It does
+.B not
+return when live read timeouts occur; instead, it attempts to read more
+packets.
+.PP
+.B pcap_dispatch()
+returns the number of packets processed on success; this can be 0 if no
+packets were read from a live capture (if, for example, they were
+discarded because they didn't pass the packet filter, or if, on
+platforms that support a read timeout that starts before any packets
+arrive, the timeout expires before any packets arrive, or if the file
+descriptor for the capture device is in non-blocking mode and no packets
+were available to be read) or if no more packets are available in a
+``savefile.''  It returns \-1 if an error occurs or \-2 if the loop
+terminated due to a call to
+.B pcap_breakloop()
+before any packets were processed.
+.ft B
+If your application uses pcap_breakloop(),
+make sure that you explicitly check for \-1 and \-2, rather than just
+checking for a return value < 0.
+.ft R
+.PP
+If \-1 is returned,
+.B pcap_geterr()
+or
+.B pcap_perror()
+may be called with
+.I p
+as an argument to fetch or display the error text.
+.SH SEE ALSO
+pcap(3PCAP), pcap_geterr(3PCAP), pcap_breakloop(3PCAP),
+pcap_datalink(3PCAP)
diff --git a/pcap_major_version.3pcap b/pcap_major_version.3pcap
new file mode 100644
index 0000000..31903dc
--- /dev/null
+++ b/pcap_major_version.3pcap
@@ -0,0 +1,56 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_major_version.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_MAJOR_VERSION 3PCAP "5 April 2008"
+.SH NAME
+pcap_major_version, pcap_minor_version \- get the version number of a savefile
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_major_version(pcap_t *p);
+int pcap_minor_version(pcap_t *p);
+.ft
+.fi
+.SH DESCRIPTION
+If
+.I p
+refers to a ``savefile'',
+.B pcap_major_version()
+returns the major number of the file format of the ``savefile'' and
+.B pcap_minor_version()
+returns the minor number of the file format of the ``savefile''.  The
+version number is stored in the ``savefile''; note that the meaning of
+its values depends on the type of ``savefile'' (for example, pcap or
+pcap-NG).
+.PP
+If
+.I p
+refers to a live capture, the values returned by
+.B pcap_major_version()
+and
+.B pcap_minor_version()
+are not meaningful.
+.SH SEE ALSO
+pcap(3PCAP)
diff --git a/pcap_next_ex.3pcap b/pcap_next_ex.3pcap
new file mode 100644
index 0000000..c4e467e
--- /dev/null
+++ b/pcap_next_ex.3pcap
@@ -0,0 +1,143 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_next_ex.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_NEXT_EX 3PCAP "5 April 2008"
+.SH NAME
+pcap_next_ex, pcap_next \- read the next packet from a pcap_t
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header,
+.ti +8
+const u_char **pkt_data);
+const u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_next_ex()
+reads the next packet and returns a success/failure indication.
+If the packet was read without problems, the pointer pointed to by the
+.I pkt_header
+argument is set to point to the
+.I pcap_pkthdr
+struct for the packet, and the
+pointer pointed to by the
+.I pkt_data
+argument is set to point to the data in the packet.  The
+.I struct pcap_pkthdr
+and the packet data are not to be freed by the caller, and are not
+guaranteed to be valid after the next call to
+.BR pcap_next_ex() ,
+.BR pcap_next() ,
+.BR pcap_loop() ,
+or
+.BR pcap_dispatch() ;
+if the code needs them to remain valid, it must make a copy of them.
+.PP
+.B pcap_next()
+reads the next packet (by calling
+.B pcap_dispatch()
+with a
+.I cnt
+of 1) and returns a
+.I u_char
+pointer to the data in that packet.  The
+packet data is not to be freed by the caller, and is not
+guaranteed to be valid after the next call to
+.BR pcap_next_ex() ,
+.BR pcap_next() ,
+.BR pcap_loop() ,
+or
+.BR pcap_dispatch() ;
+if the code needs it to remain valid, it must make a copy of it.
+The
+.I pcap_pkthdr
+structure pointed to by
+.I h
+is filled in with the appropriate values for the packet.
+.PP
+The bytes of data from the packet begin with a link-layer header.  The
+format of the link-layer header is indicated by the return value of the
+.B pcap_datalink()
+routine when handed the
+.B pcap_t
+value also passed to
+.B pcap_loop()
+or
+.BR pcap_dispatch() .
+.I http://www.tcpdump.org/linktypes.html
+lists the values
+.B pcap_datalink()
+can return and describes the packet formats that
+correspond to those values.  The value it returns will be valid for all
+packets received unless and until
+.B pcap_set_datalink()
+is called; after a successful call to
+.BR pcap_set_datalink() ,
+all subsequent packets will have a link-layer header of the type
+specified by the link-layer header type value passed to
+.BR pcap_set_datalink() .
+.PP
+Do
+.B NOT
+assume that the packets for a given capture or ``savefile`` will have
+any given link-layer header type, such as
+.B DLT_EN10MB
+for Ethernet.  For example, the "any" device on Linux will have a
+link-layer header type of
+.B DLT_LINUX_SLL
+even if all devices on the system at the time the "any" device is opened
+have some other data link type, such as
+.B DLT_EN10MB
+for Ethernet.
+.SH RETURN VALUE
+.B pcap_next_ex()
+returns 1 if the packet was read without problems, 0
+if packets are being read from a live capture and the timeout expired,
+\-1 if an error occurred while reading the packet, and \-2 if
+packets are being read from a ``savefile'' and there are no more
+packets to read from the savefile.
+If \-1 is returned,
+.B pcap_geterr()
+or
+.B pcap_perror()
+may be called with
+.I p
+as an argument to fetch or display the error text.
+.PP
+.B pcap_next()
+returns a pointer to the packet data on success, and returns
+.B NULL
+if an error occurred, or if no packets were read from a live
+capture (if, for example, they were discarded because they didn't pass
+the packet filter, or if, on platforms that support a read timeout that
+starts before any packets arrive, the timeout expires before any packets
+arrive, or if the file descriptor for the capture device is in
+non-blocking mode and no packets were available to be read), or if no
+more packets are available in a ``savefile.''  Unfortunately, there is
+no way to determine whether an error occurred or not.
+.SH SEE ALSO
+pcap(3PCAP), pcap_geterr(3PCAP), pcap_dispatch(3PCAP),
+pcap_datalink(3PCAP)
diff --git a/pcap_offline_filter.3pcap b/pcap_offline_filter.3pcap
new file mode 100644
index 0000000..3f11022
--- /dev/null
+++ b/pcap_offline_filter.3pcap
@@ -0,0 +1,57 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_offline_filter.3pcap,v 1.1 2008-05-13 15:19:56 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_OFFLINE_FILTER 3PCAP "13 May 2008"
+.SH NAME
+pcap_offline_filter \- check whether a filter matches a packet
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_offline_filter(const struct bpf_program *fp,
+.ti +8
+const struct pcap_pkthdr *h, const u_char *pkt)
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_offline_filter()
+checks whether a filter matches a packet.
+.I fp
+is a pointer to a
+.I bpf_program
+struct, usually the result of a call to
+.BR pcap_compile() .
+.I h
+points to the
+.I pcap_pkthdr
+structure for the packet, and
+.I pkt
+points to the data in the packet.
+.SH RETURN VALUE
+.B pcap_offline_filter()
+returns the return value of the filter program.  This will be zero if
+the packet doesn't match the filter and non-zero if the packet matches
+the filter.
+.SH SEE ALSO
+pcap(3PCAP), pcap_compile(3PCAP)
diff --git a/pcap_open_dead.3pcap.in b/pcap_open_dead.3pcap.in
new file mode 100644
index 0000000..812946b
--- /dev/null
+++ b/pcap_open_dead.3pcap.in
@@ -0,0 +1,81 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_open_dead.3pcap.in,v 1.1 2008-10-21 07:33:02 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_OPEN_DEAD 3PCAP "1 July 2013"
+.SH NAME
+pcap_open_dead, pcap_open_dead_with_tstamp_precision \- open a fake
+pcap_t for compiling filters or opening a capture for output
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+pcap_t *pcap_open_dead(int linktype, int snaplen);
+pcap_t *pcap_open_dead_with_tstamp_precision(int linktype, int snaplen,
+    u_int precision);
+.ft
+.fi
+.SH DESCRIPTION
+.PP
+.B pcap_open_dead()
+and
+.B pcap_open_dead_with_tstamp_precision()
+are used for creating a
+.B pcap_t
+structure to use when calling the other functions in libpcap.  It is
+typically used when just using libpcap for compiling BPF code; it can
+also be used if using
+.BR pcap_dump_open() ,
+.BR pcap_dump() ,
+and
+.B pcap_dump_close()
+to write a savefile if there is no
+.B pcap_t
+that supplies the packets to be written.
+.PP
+.I linktype
+specifies the link-layer type for the
+.BR pcap_t .
+.PP
+.I snaplen
+specifies the snapshot length for the
+.BR pcap_t .
+.PP
+When
+.BR pcap_open_dead_with_tstamp_precision() ,
+is used to create a
+.B pcap_t
+for use with
+.BR pcap_dump_open() ,
+.I precision
+specifies the time stamp precision for packets;
+.B PCAP_TSTAMP_PRECISION_MICRO
+should be specified if the packets to be written have time stamps in
+seconds and microseconds, and
+.B PCAP_TSTAMP_PRECISION_NANO
+should be specified if the packets to be written have time stamps in
+seconds and nanoseconds.  Its value does not affect
+.BR pcap_compile() .
+.SH SEE ALSO
+pcap(3PCAP), pcap_compile(3PCAP), pcap_dump_open(3PCAP),
+pcap-linktype(@MAN_MISC_INFO@)
diff --git a/pcap_open_live.3pcap b/pcap_open_live.3pcap
new file mode 100644
index 0000000..0889a2a
--- /dev/null
+++ b/pcap_open_live.3pcap
@@ -0,0 +1,89 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_open_live.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_OPEN_LIVE 3PCAP "5 April 2008"
+.SH NAME
+pcap_open_live \- open a device for capturing
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.nf
+.ft B
+char errbuf[PCAP_ERRBUF_SIZE];
+.ft
+.LP
+.ft B
+pcap_t *pcap_open_live(const char *device, int snaplen,
+.ti +8
+int promisc, int to_ms, char *errbuf);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_open_live()
+is used to obtain a packet capture handle to look
+at packets on the network.
+.I device
+is a string that specifies the network device to open; on Linux systems
+with 2.2 or later kernels, a
+.I device
+argument of "any" or
+.B NULL
+can be used to capture packets from all interfaces.
+.PP
+.I snaplen
+specifies the snapshot length to be set on the handle.
+.PP
+.I promisc
+specifies if the interface is to be put into promiscuous mode.
+.PP
+.I to_ms
+specifies the read timeout in milliseconds.
+.SH RETURN VALUE
+.B pcap_open_live()
+returns a
+.I pcap_t *
+on success and
+.B NULL
+on failure.
+If
+.B NULL
+is returned,
+.I errbuf
+is filled in with an appropriate error message.
+.I errbuf
+may also be set to warning text when
+.B pcap_open_live()
+succeeds; to detect this case the caller should store a zero-length string in
+.I errbuf
+before calling
+.B pcap_open_live()
+and display the warning to the user if
+.I errbuf
+is no longer a zero-length string.
+.I errbuf
+is assumed to be able to hold at least
+.B PCAP_ERRBUF_SIZE
+chars.
+.SH SEE ALSO
+pcap(3PCAP), pcap_create(3PCAP), pcap_activate(3PCAP)
diff --git a/pcap_open_offline.3pcap.in b/pcap_open_offline.3pcap.in
new file mode 100644
index 0000000..d38608d
--- /dev/null
+++ b/pcap_open_offline.3pcap.in
@@ -0,0 +1,111 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_open_offline.3pcap.in,v 1.1 2008-10-23 05:56:59 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_OPEN_OFFLINE 3PCAP "1 July 2013"
+.SH NAME
+pcap_open_offline, pcap_open_offline_with_tstamp_precision,
+pcap_fopen_offline, pcap_fopen_offline_with_tstamp_precision \- open a saved capture file for reading
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.nf
+.ft B
+char errbuf[PCAP_ERRBUF_SIZE];
+.ft
+.LP
+.ft B
+pcap_t *pcap_open_offline(const char *fname, char *errbuf);
+pcap_t *pcap_open_offline_with_tstamp_precision(const char *fname,
+    u_int precision, char *errbuf);
+pcap_t *pcap_fopen_offline(FILE *fp, char *errbuf);
+pcap_t *pcap_fopen_offline_with_tstamp_precision(FILE *fp,
+    u_int precision, char *errbuf);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_open_offline()
+and
+.B pcap_open_offline_with_tstamp_precision()
+are called to open a ``savefile'' for reading.
+.PP
+.I fname
+specifies the name of the file to open. The file can have the pcap file
+format as described in
+.BR pcap-savefile (@MAN_FILE_FORMATS@),
+which is the file format used by, among other programs,
+.BR tcpdump (1)
+and
+.BR tcpslice (1),
+or can have the pcap-ng file format, although not all pcap-ng files can
+be read.
+The name "-" in a synonym for
+.BR stdin .
+.PP
+.B pcap_open_offline_with_tstamp_precision()
+takes an additional
+.I precision
+argument specifying the time stamp precision desired;
+if
+.B PCAP_TSTAMP_PRECISION_MICRO
+is specified, packet time stamps will be supplied in seconds and
+microseconds,
+and if
+.B PCAP_TSTAMP_PRECISION_NANO
+is specified, packet time stamps will be supplied in seconds and
+nanoseconds.  If the time stamps in the file do not have the same
+precision as the requested precision, they will be scaled up or down as
+necessary before being supplied.
+.PP
+Alternatively, you may call
+.B pcap_fopen_offline()
+or
+.B pcap_fopen_offline_with_tstamp_precision()
+to read dumped data from an existing open stream
+.IR fp .
+.B pcap_fopen_offline_with_tstamp_precision() takes an additional
+.I precision
+argument as described above.
+Note that on Windows, that stream should be opened in binary mode.
+.SH RETURN VALUE
+.BR pcap_open_offline() ,
+.BR pcap_open_offline_with_tstamp_precision() ,
+.BR pcap_fopen_offline() ,
+and
+.B pcap_fopen_offline_with_tstamp_precision()
+return a
+.I pcap_t *
+on success and
+.B NULL
+on failure.
+If
+.B NULL
+is returned,
+.I errbuf
+is filled in with an appropriate error message.
+.I errbuf
+is assumed to be able to hold at least
+.B PCAP_ERRBUF_SIZE
+chars.
+.SH SEE ALSO
+pcap(3PCAP), pcap-savefile(@MAN_FILE_FORMATS@)
diff --git a/pcap_set_buffer_size.3pcap b/pcap_set_buffer_size.3pcap
new file mode 100644
index 0000000..060e923
--- /dev/null
+++ b/pcap_set_buffer_size.3pcap
@@ -0,0 +1,47 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_set_buffer_size.3pcap,v 1.1 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_SET_BUFFER_SIZE 3PCAP "5 April 2008"
+.SH NAME
+pcap_set_buffer_size \- set the buffer size for a not-yet-activated
+capture handle
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.LP
+.ft B
+int pcap_set_buffer_size(pcap_t *p, int buffer_size);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_set_buffer_size()
+sets the buffer size that will be used on a capture handle when
+the handle is activated to
+.IR buffer_size ,
+which is in units of bytes.
+.SH RETURN VALUE
+.B pcap_set_buffer_size()
+returns 0 on success or
+.B PCAP_ERROR_ACTIVATED
+if called on a capture handle that has been activated.
+.SH SEE ALSO
+pcap(3PCAP), pcap_create(3PCAP), pcap_activate(3PCAP)
diff --git a/pcap_set_datalink.3pcap b/pcap_set_datalink.3pcap
new file mode 100644
index 0000000..9af32d0
--- /dev/null
+++ b/pcap_set_datalink.3pcap
@@ -0,0 +1,53 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_set_datalink.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_SET_DATALINK 3PCAP "22 August 2010"
+.SH NAME
+pcap_set_datalink \- set the link-layer header type to be used by a
+capture device
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_set_datalink(pcap_t *p, int dlt);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_set_datalink()
+is used to set the current link-layer header type of the pcap descriptor
+to the type specified by
+.IR dlt .
+.SH RETURN VALUE
+.B pcap_set_datalink()
+returns 0 on success and \-1 on failure.
+If \-1 is returned,
+.B pcap_geterr()
+or
+.B pcap_perror()
+may be called with
+.I p
+as an argument to fetch or display the error text.
+.SH SEE ALSO
+pcap(3PCAP), pcap_geterr(3PCAP),
+pcap_datalink_name_to_val(3PCAP)
diff --git a/pcap_set_immediate_mode.3pcap b/pcap_set_immediate_mode.3pcap
new file mode 100644
index 0000000..87ec98b
--- /dev/null
+++ b/pcap_set_immediate_mode.3pcap
@@ -0,0 +1,47 @@
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_SET_IMMEDIATE_MODE 3PCAP "8 May 2013"
+.SH NAME
+pcap_set_immediate_mode \- set immediate mode for a not-yet-activated capture
+handle
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.LP
+.ft B
+int pcap_set_immediate_mode(pcap_t *p, int immediate_mode);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_set_immediate_mode()
+sets whether immediate mode should be set on a capture handle when
+the handle is activated.
+If
+.I immediate_mode
+is non-zero, immediate mode will be set, otherwise it will not be set.
+.SH RETURN VALUE
+.B pcap_set_immediate_mode()
+returns 0 on success or
+.B PCAP_ERROR_ACTIVATED
+if called on a capture handle that has been activated.
+.SH SEE ALSO
+pcap(3PCAP), pcap_create(3PCAP), pcap_activate(3PCAP)
diff --git a/pcap_set_promisc.3pcap b/pcap_set_promisc.3pcap
new file mode 100644
index 0000000..382260c
--- /dev/null
+++ b/pcap_set_promisc.3pcap
@@ -0,0 +1,48 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_set_promisc.3pcap,v 1.1 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_SET_PROMISC 3PCAP "5 April 2008"
+.SH NAME
+pcap_set_promisc \- set promiscuous mode for a not-yet-activated
+capture handle
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.LP
+.ft B
+int pcap_set_promisc(pcap_t *p, int promisc);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_set_promisc()
+sets whether promiscuous mode should be set on a capture handle when
+the handle is activated.
+If
+.I promisc
+is non-zero, promiscuous mode will be set, otherwise it will not be set.
+.SH RETURN VALUE
+.B pcap_set_promisc()
+returns 0 on success or
+.B PCAP_ERROR_ACTIVATED
+if called on a capture handle that has been activated.
+.SH SEE ALSO
+pcap(3PCAP), pcap_create(3PCAP), pcap_activate(3PCAP)
diff --git a/pcap_set_rfmon.3pcap b/pcap_set_rfmon.3pcap
new file mode 100644
index 0000000..ee73556
--- /dev/null
+++ b/pcap_set_rfmon.3pcap
@@ -0,0 +1,49 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_set_rfmon.3pcap,v 1.1 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_SET_RFMON 3PCAP "5 April 2008"
+.SH NAME
+pcap_set_rfmon \- set monitor mode for a not-yet-activated capture
+handle
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.LP
+.ft B
+int pcap_set_rfmon(pcap_t *p, int rfmon);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_set_rfmon()
+sets whether monitor mode should be set on a capture handle when
+the handle is activated.
+If
+.I rfmon
+is non-zero, monitor mode will be set, otherwise it will not be set.
+.SH RETURN VALUE
+.B pcap_set_rfmon()
+returns 0 on success or
+.B PCAP_ERROR_ACTIVATED
+if called on a capture handle that has been activated.
+.SH SEE ALSO
+pcap(3PCAP), pcap_create(3PCAP), pcap_activate(3PCAP),
+pcap_can_set_rfmon(3PCAP)
diff --git a/pcap_set_snaplen.3pcap b/pcap_set_snaplen.3pcap
new file mode 100644
index 0000000..74195d9
--- /dev/null
+++ b/pcap_set_snaplen.3pcap
@@ -0,0 +1,46 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_set_snaplen.3pcap,v 1.1 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_SET_SNAPLEN 3PCAP "5 April 2008"
+.SH NAME
+pcap_set_snaplen \- set the snapshot length for a not-yet-activated
+capture handle
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.LP
+.ft B
+int pcap_set_snaplen(pcap_t *p, int snaplen);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_set_snaplen()
+sets the snapshot length to be used on a capture handle when the handle
+is activated to
+.IR snaplen .
+.SH RETURN VALUE
+.B pcap_set_snaplen()
+returns 0 on success or
+.B PCAP_ERROR_ACTIVATED
+if called on a capture handle that has been activated.
+.SH SEE ALSO
+pcap(3PCAP), pcap_create(3PCAP), pcap_activate(3PCAP)
diff --git a/pcap_set_timeout.3pcap b/pcap_set_timeout.3pcap
new file mode 100644
index 0000000..0b66f21
--- /dev/null
+++ b/pcap_set_timeout.3pcap
@@ -0,0 +1,50 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_set_timeout.3pcap,v 1.1 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_SET_TIMEOUT 3PCAP "5 April 2008"
+.SH NAME
+pcap_set_timeout \- set the read timeout for a not-yet-activated
+capture handle
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.LP
+.ft B
+int pcap_set_timeout(pcap_t *p, int to_ms);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_set_timeout()
+sets the read timeout that will be used on a capture handle when
+the handle is activated to
+.IR to_ms ,
+which is in units of milliseconds.
+.LP
+The behavior, if the timeout isn't specified, is undefined.  We
+recommend always setting the timeout to a non-zero value.
+.SH RETURN VALUE
+.B pcap_set_timeout()
+returns 0 on success or
+.B PCAP_ERROR_ACTIVATED
+if called on a capture handle that has been activated.
+.SH SEE ALSO
+pcap(3PCAP), pcap_create(3PCAP), pcap_activate(3PCAP)
diff --git a/pcap_set_tstamp_precision.3pcap.in b/pcap_set_tstamp_precision.3pcap.in
new file mode 100644
index 0000000..053a4c6
--- /dev/null
+++ b/pcap_set_tstamp_precision.3pcap.in
@@ -0,0 +1,61 @@
+.\"Copyright (c) 2013, Michal Sekletar
+.\"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 names of the authors may not 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_SET_TSTAMP_PRECISION 3PCAP "27 August 2013"
+.SH NAME
+pcap_set_tstamp_precision \- set the time stamp precision returned in
+captures
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_set_tstamp_precision(pcap_t *p, int tstamp_precision);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_set_tstamp_precision()
+sets the precision of the time stamp desired for packets captured on the pcap
+descriptor to the type specified by
+.IR tstamp_precision .
+It must be called on a pcap descriptor created by
+.B pcap_create()
+that has not yet been activated by
+.BR pcap_activate() .
+Two time stamp precisions are supported, microseconds and nanoseconds. One can
+use options
+.B PCAP_TSTAMP_PRECISION_MICRO and
+.B PCAP_TSTAMP_PRECISION_NANO
+to request desired precision. By default, time stamps are in microseconds.
+.SH RETURN VALUE
+.B pcap_set_tstamp_type()
+returns 0 on success if the specified time stamp precision is expected to be
+supported by the operating system,
+.B PCAP_ERROR_TSTAMP_PRECISION_NOTSUP
+if operating system does not support requested time stamp precision,
+.B PCAP_ERROR_ACTIVATED
+if called on a capture handle that has been activated.
+.SH SEE ALSO
+pcap(3PCAP),
+pcap_get_tstamp_precision(3PCAP),
+pcap-tstamp(@MAN_MISC_INFO@)
diff --git a/pcap_set_tstamp_type.3pcap.in b/pcap_set_tstamp_type.3pcap.in
new file mode 100644
index 0000000..261c315
--- /dev/null
+++ b/pcap_set_tstamp_type.3pcap.in
@@ -0,0 +1,65 @@
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_SET_TSTAMP_TYPE 3PCAP "21 August 2010"
+.SH NAME
+pcap_set_tstamp_type \- set the time stamp type to be used by a
+capture device
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_set_tstamp_type(pcap_t *p, int tstamp_type);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_set_tstamp_type()
+sets the the type of time stamp desired for packets captured on the pcap
+descriptor to the type specified by
+.IR tstamp_type .
+It must be called on a pcap descriptor created by
+.B pcap_create()
+that has not yet been activated by
+.BR pcap_activate() .
+.B pcap_list_tstamp_types()
+will give a list of the time stamp types supported by a given capture
+device.
+See
+.BR pcap-tstamp (@MAN_MISC_INFO@)
+for a list of all the time stamp types.
+.SH RETURN VALUE
+.B pcap_set_tstamp_type()
+returns 0 on success if the specified time stamp type is expected to be
+supported by the capture device,
+.B PCAP_WARNING_TSTAMP_TYPE_NOTSUP
+on success if the specified time stamp type is not supported by the
+capture device,
+.B PCAP_ERROR_ACTIVATED
+if called on a capture handle that has been activated, and
+.B PCAP_ERROR_CANTSET_TSTAMP_TYPE
+if the capture device doesn't support setting the time stamp type.
+.SH SEE ALSO
+pcap(3PCAP),
+pcap_list_tstamp_types(3PCAP),
+pcap_tstamp_type_name_to_val(3PCAP),
+pcap-tstamp(@MAN_MISC_INFO@)
diff --git a/pcap_setdirection.3pcap b/pcap_setdirection.3pcap
new file mode 100644
index 0000000..bd0fb25
--- /dev/null
+++ b/pcap_setdirection.3pcap
@@ -0,0 +1,71 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_setdirection.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_SETDIRECTION 3PCAP "5 April 2008"
+.SH NAME
+pcap_setdirection \- set the direction for which packets will be captured
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_setdirection(pcap_t *p, pcap_direction_t d);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_setdirection()
+is used to specify a direction that packets will be captured.
+.I d
+is one of the constants
+.BR PCAP_D_IN ,
+.B PCAP_D_OUT
+or 
+.BR PCAP_D_INOUT .
+.B PCAP_D_IN
+will only capture packets received by the device,
+.B PCAP_D_OUT
+will only capture packets sent by the device and
+.B PCAP_D_INOUT
+will capture packets received by or sent by the device.
+.B PCAP_D_INOUT
+is the default setting if this function is not called.
+.PP
+.B pcap_setdirection()
+isn't necessarily fully supported on all platforms; some platforms might
+return an error for all values, and some other platforms might not
+support
+.BR PCAP_D_OUT .
+.PP
+This operation is not supported if a ``savefile'' is being read.
+.SH RETURN VALUE
+.B pcap_setdirection()
+returns 0 on success and \-1 on failure.
+If \-1 is returned,
+.B pcap_geterr()
+or
+.B pcap_perror()
+may be called with
+.I p
+as an argument to fetch or display the error text.
+.SH SEE ALSO
+pcap(3PCAP), pcap_geterr(3PCAP)
diff --git a/pcap_setfilter.3pcap b/pcap_setfilter.3pcap
new file mode 100644
index 0000000..89d5da7
--- /dev/null
+++ b/pcap_setfilter.3pcap
@@ -0,0 +1,54 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_setfilter.3pcap,v 1.4 2008-05-13 15:19:56 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_SETFILTER 3PCAP "5 April 2008"
+.SH NAME
+pcap_setfilter \- set the filter
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_setfilter(pcap_t *p, struct bpf_program *fp);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_setfilter()
+is used to specify a filter program.
+.I fp
+is a pointer to a
+.I bpf_program
+struct, usually the result of a call to
+.BR pcap_compile() .
+.SH RETURN VALUE
+.B pcap_setfilter()
+returns 0 on success and \-1 on failure.
+If \-1 is returned,
+.B pcap_geterr()
+or
+.B pcap_perror()
+may be called with
+.I p
+as an argument to fetch or display the error text.
+.SH SEE ALSO
+pcap(3PCAP), pcap_compile(3PCAP), pcap_geterr(3PCAP)
diff --git a/pcap_setnonblock.3pcap b/pcap_setnonblock.3pcap
new file mode 100644
index 0000000..b00fce1
--- /dev/null
+++ b/pcap_setnonblock.3pcap
@@ -0,0 +1,75 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_setnonblock.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_SETNONBLOCK 3PCAP "5 April 2008"
+.SH NAME
+pcap_setnonblock, pcap_getnonblock \- set or get the state of
+non-blocking mode on a capture device
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.nf
+.ft B
+char errbuf[PCAP_ERRBUF_SIZE];
+.ft
+.LP
+.ft B
+int pcap_setnonblock(pcap_t *p, int nonblock, char *errbuf);
+int pcap_getnonblock(pcap_t *p, char *errbuf);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_setnonblock()
+puts a capture handle into ``non-blocking'' mode, or takes it out
+of ``non-blocking'' mode, depending on whether the
+.I nonblock
+argument is non-zero or zero.  It has no effect on ``savefiles''.
+If there is an error, \-1 is returned and
+.I errbuf
+is filled in with an appropriate error message; otherwise, 0 is
+returned.
+In
+``non-blocking'' mode, an attempt to read from the capture descriptor
+with
+.B pcap_dispatch()
+will, if no packets are currently available to be read, return 0
+immediately rather than blocking waiting for packets to arrive.
+.B pcap_loop()
+and
+.B pcap_next()
+will not work in ``non-blocking'' mode.
+.SH RETURN VALUE
+.B pcap_getnonblock()
+returns the current ``non-blocking'' state of the capture descriptor; it
+always returns 0 on ``savefiles''.
+If there is an error, \-1 is returned and
+.I errbuf
+is filled in with an appropriate error message.
+.PP
+.I errbuf
+is assumed to be able to hold at least
+.B PCAP_ERRBUF_SIZE
+chars.
+.SH SEE ALSO
+pcap(3PCAP), pcap_loop(3PCAP), pcap_next_ex(3PCAP), pcap_geterr(3PCAP)
diff --git a/pcap_snapshot.3pcap b/pcap_snapshot.3pcap
new file mode 100644
index 0000000..f8e4097
--- /dev/null
+++ b/pcap_snapshot.3pcap
@@ -0,0 +1,54 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_snapshot.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_SNAPSHOT 3PCAP "5 April 2008"
+.SH NAME
+pcap_snapshot \- get the snapshot length
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_snapshot(pcap_t *p);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_snapshot()
+returns the snapshot length specified when
+.B pcap_set_snapshot()
+or
+.B pcap_open_live()
+was called, for a live capture, or the snapshot length from the capture
+file, for a ``savefile''.
+.PP
+It must not be called on a pcap descriptor created by
+.B pcap_create()
+that has not yet been activated by
+.BR pcap_activate() .
+.SH RETURN VALUE
+.B pcap_snapshot()
+returns the snapshot length on success and
+.B PCAP_ERROR_NOT_ACTIVATED
+if called on a capture handle that has been created but not activated.
+.SH SEE ALSO
+pcap(3PCAP)
diff --git a/pcap_stats.3pcap b/pcap_stats.3pcap
new file mode 100644
index 0000000..a953e21
--- /dev/null
+++ b/pcap_stats.3pcap
@@ -0,0 +1,99 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_stats.3pcap,v 1.3 2008-04-06 02:53:22 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_STATS 3PCAP "7 September 2009"
+.SH NAME
+pcap_stats \- get capture statistics
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_stats(pcap_t *p, struct pcap_stat *ps);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_stats()
+fills in the
+.B struct pcap_stat
+pointed to by its second argument.  The values represent
+packet statistics from the start of the run to the time of the call.
+.PP
+.B pcap_stats()
+is supported only on live captures, not on ``savefiles''; no statistics
+are stored in ``savefiles'', so no statistics are available when reading
+from a ``savefile''.
+.PP
+A
+.B struct pcap_stat
+has the following members:
+.RS
+.TP
+.B ps_recv
+number of packets received;
+.TP
+.B ps_drop
+number of packets dropped because there was no room in the operating
+system's buffer when they arrived, because packets weren't being read
+fast enough;
+.TP
+.B ps_ifdrop
+number of packets dropped by the network interface or its driver.
+.RE
+.PP
+The statistics do not behave the same way on all platforms.
+.B ps_recv
+might count packets whether they passed any filter set with
+.BR pcap_setfilter (3PCAP)
+or not, or it might count only packets that pass the filter.
+It also might, or might not, count packets dropped because there was no
+room in the operating system's buffer when they arrived.
+.B ps_drop
+is not available on all platforms; it is zero on platforms where it's
+not available.  If packet filtering is done in libpcap, rather than in
+the operating system, it would count packets that don't pass the filter.
+Both
+.B ps_recv
+and
+.B ps_drop
+might, or might not, count packets not yet read from the operating
+system and thus not yet seen by the application.
+.B ps_ifdrop
+might, or might not, be implemented; if it's zero, that might mean that
+no packets were dropped by the interface, or it might mean that the
+statistic is unavailable, so it should not be treated as an indication
+that the interface did not drop any packets.
+.SH RETURN VALUE
+.B pcap_stats()
+returns 0 on success and returns \-1 if there is an error or if
+.I p
+doesn't support packet statistics.
+If \-1 is returned,
+.B pcap_geterr()
+or
+.B pcap_perror()
+may be called with
+.I p
+as an argument to fetch or display the error text.
+.SH SEE ALSO
+pcap(3PCAP), pcap_geterr(3PCAP)
diff --git a/pcap_statustostr.3pcap b/pcap_statustostr.3pcap
new file mode 100644
index 0000000..da18f69
--- /dev/null
+++ b/pcap_statustostr.3pcap
@@ -0,0 +1,43 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_statustostr.3pcap,v 1.1 2008-04-09 21:39:21 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_STATUSTOSTR 3PCAP "9 April 2008"
+.SH NAME
+pcap_statustostr \- convert a PCAP_ERROR_ or PCAP_WARNING_ value to a string
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+const char *pcap_statustostr(int error);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_statustostr()
+converts a
+.B PCAP_ERROR_
+or
+.B PCAP_WARNING_
+value returned by a libpcap routine to an error string.
+.SH SEE ALSO
+pcap(3PCAP)
diff --git a/pcap_strerror.3pcap b/pcap_strerror.3pcap
new file mode 100644
index 0000000..8e6319b
--- /dev/null
+++ b/pcap_strerror.3pcap
@@ -0,0 +1,42 @@
+.\" @(#) $Header: /tcpdump/master/libpcap/pcap_strerror.3pcap,v 1.2 2008-04-05 20:26:56 guy Exp $
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_STRERROR 3PCAP "4 April 2008"
+.SH NAME
+pcap_strerror \- convert an errno value to a string
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+const char *pcap_strerror(int error);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_strerror()
+is provided in case
+.BR strerror (3)
+isn't available.  It returns an error message string corresponding to
+.IR error .
+.SH SEE ALSO
+strerror(3)
diff --git a/pcap_tstamp_type_name_to_val.3pcap b/pcap_tstamp_type_name_to_val.3pcap
new file mode 100644
index 0000000..8fcc4d7
--- /dev/null
+++ b/pcap_tstamp_type_name_to_val.3pcap
@@ -0,0 +1,45 @@
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_TSTAMP_TYPE_NAME_TO_VAL 3PCAP "21 August 2010"
+.SH NAME
+pcap_tstamp_type_name_to_val \- get the time stamp type value
+corresponding to a time stamp type name
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap/pcap.h>
+.ft
+.LP
+.ft B
+int pcap_tstamp_type_name_to_val(const char *name);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_tstamp_type_name_to_val()
+translates a time stamp type name to the corresponding time stamp type
+value.  The translation is case-insensitive.
+.SH RETURN VALUE
+.B pcap_tstamp_type_name_to_val()
+returns 0 on success and
+.B PCAP_ERROR
+on failure.
+.SH SEE ALSO
+pcap(3PCAP), pcap_tstamp_type_val_to_name(3PCAP)
diff --git a/pcap_tstamp_type_val_to_name.3pcap b/pcap_tstamp_type_val_to_name.3pcap
new file mode 100644
index 0000000..903cea7
--- /dev/null
+++ b/pcap_tstamp_type_val_to_name.3pcap
@@ -0,0 +1,49 @@
+.\"
+.\" Copyright (c) 1994, 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.
+.\"
+.TH PCAP_TSTAMP_TYPE_VAL_TO_NAME 3PCAP "21 August 2010"
+.SH NAME
+pcap_tstamp_type_val_to_name, pcap_tstamp_type_val_to_description \- get
+a name or description for a time stamp type value
+.SH SYNOPSIS
+.nf
+.ft B
+#include <pcap.h>
+.ft
+.LP
+.ft B
+const char *pcap_tstamp_type_val_to_name(int tstamp_type);
+const char *pcap_tstamp_type_val_to_description(int tstamp_type);
+.ft
+.fi
+.SH DESCRIPTION
+.B pcap_tstamp_type_val_to_name()
+translates a time stamp type value to the corresponding time stamp type
+name.
+.B NULL
+is returned on failure.
+.PP
+.B pcap_tstamp_type_val_to_description()
+translates a time stamp type value to a short description of that time
+stamp type.
+.B NULL
+is returned on failure.
+.SH SEE ALSO
+pcap(3PCAP), pcap_tstamp_type_name_to_val(3PCAP)
diff --git a/ppp.h b/ppp.h
index 80a6851..4e1d08d 100644
--- a/ppp.h
+++ b/ppp.h
@@ -1,4 +1,4 @@
-/* @(#) $Header: /tcpdump/master/libpcap/ppp.h,v 1.12 2005/02/08 19:52:19 guy Exp $ (LBL) */
+/* @(#) $Header: /tcpdump/master/libpcap/ppp.h,v 1.12 2005-02-08 19:52:19 guy Exp $ (LBL) */
 /*
  * Point to Point Protocol (PPP) RFC1331
  *
diff --git a/runlex.sh b/runlex.sh
new file mode 100755
index 0000000..74f2161
--- /dev/null
+++ b/runlex.sh
@@ -0,0 +1,235 @@
+#! /bin/sh
+
+#
+# runlex.sh
+# Script to run Lex/Flex.
+# First argument is the (quoted) name of the command; if it's null, that
+# means that neither Flex nor Lex was found, so we report an error and
+# quit.
+#
+# @(#) $Header: /tcpdump/master/libpcap/runlex.sh,v 1.4 2007-12-31 03:38:39 guy Exp $
+#
+
+#
+# Get the name of the command to run, and then shift to get the arguments.
+#
+if [ $# -eq 0 ]
+then
+	echo "Usage: runlex <lex/flex command to run> [ arguments ]" 1>&2
+	exit 1
+fi
+LEX="$1"
+shift
+
+#
+# Check whether we have Lex or Flex.
+#
+if [ -z "${LEX}" ]
+then
+	echo "Neither lex nor flex was found" 1>&2
+	exit 1
+fi
+
+#
+# Process the flags.  We don't use getopt because we don't want to
+# embed complete knowledge of what options are supported by Lex/Flex.
+#
+flags=""
+outfile=lex.yy.c
+while [ $# -ne 0 ]
+do
+	case "$1" in
+
+	-o*)
+		#
+		# Set the output file name.
+		#
+		outfile=`echo "$1" | sed 's/-o\(.*\)/\1/'`
+		;;
+
+	-*)
+		#
+		# Add this to the list of flags.
+		#
+		flags="$flags $1"
+		;;
+
+	--|*)
+		#
+		# End of flags.
+		#
+		break
+		;;
+	esac
+	shift
+done
+
+#
+# Is it Lex, or is it Flex?
+#
+if [ "${LEX}" = flex ]
+then
+	#
+	# It's Flex.
+	#
+	have_flex=yes
+
+	#
+	# Does it support the --noFUNCTION options?  If so, we pass
+	# --nounput, as at least some versions that support those
+	# options don't support disabling yyunput by defining
+	# YY_NO_UNPUT.
+	#
+	if flex --help | egrep noFUNCTION >/dev/null
+	then
+		flags="$flags --nounput"
+
+		#
+		# Does it support -R, for generating reentrant scanners?
+		# If so, we're not currently using that feature, but
+		# it'll generate some unused functions anyway - and there
+		# won't be any header file declaring them, so there'll be
+		# defined-but-not-declared warnings.  Therefore, we use
+		# --noFUNCTION options to suppress generating those
+		# functions.
+		#
+		if flex --help | egrep reentrant >/dev/null
+		then
+			flags="$flags --noyyget_lineno --noyyget_in --noyyget_out --noyyget_leng --noyyget_text --noyyset_lineno --noyyset_in --noyyset_out"
+		fi
+	fi
+else
+	#
+	# It's Lex.
+	#
+	have_flex=no
+fi
+
+#
+# OK, run it.
+# If it's lex, it doesn't support -o, so we just write to
+# lex.yy.c and, if it succeeds, rename it to the right name,
+# otherwise we remove lex.yy.c.
+# If it's flex, it supports -o, so we use that - flex with -P doesn't
+# write to lex.yy.c, it writes to a lex.{prefix from -P}.c.
+#
+if [ $have_flex = yes ]
+then
+	${LEX} $flags -o"$outfile" "$@"
+
+	#
+	# Did it succeed?
+	#
+	status=$?
+	if [ $status -ne 0 ]
+	then
+		#
+		# No.  Exit with the failing exit status.
+		#
+		exit $status
+	fi
+
+	#
+	# Flex has the annoying habit of stripping all but the last
+	# component of the "-o" flag argument and using that as the
+	# place to put the output.  This gets in the way of building
+	# in a directory different from the source directory.  Try
+	# to work around this.
+	#
+	# Is the outfile where we think it is?
+	#
+	outfile_base=`basename "$outfile"`
+	if [ "$outfile_base" != "$outfile" -a \( ! -r "$outfile" \) -a -r "$outfile_base" ]
+	then
+		#
+		# No, it's not, but it is in the current directory.  Put it
+		# where it's supposed to be.
+		#
+		mv "$outfile_base" "$outfile"
+
+		#
+		# Did that succeed?
+		#
+		status=$?
+		if [ $status -ne 0 ]
+		then
+			#
+			# No.  Exit with the failing exit status.
+			#
+			exit $status
+		fi
+	fi
+else
+	${LEX} $flags "$@"
+
+	#
+	# Did it succeed?
+	#
+	status=$?
+	if [ $status -ne 0 ]
+	then
+		#
+		# No.  Get rid of any lex.yy.c file we generated, and
+		# exit with the failing exit status.
+		#
+		rm -f lex.yy.c
+		exit $status
+	fi
+
+	#
+	# OK, rename lex.yy.c to the right output file.
+	#
+	mv lex.yy.c "$outfile" 
+
+	#
+	# Did that succeed?
+	#
+	status=$?
+	if [ $status -ne 0 ]
+	then
+		#
+		# No.  Get rid of any lex.yy.c file we generated, and
+		# exit with the failing exit status.
+		#
+		rm -f lex.yy.c
+		exit $status
+	fi
+fi
+
+#
+# OK, now let's generate a header file declaring the relevant functions
+# defined by the .c file; if the .c file is .../foo.c, the header file
+# will be .../foo.h.
+#
+# This works around some other Flex suckage, wherein it doesn't declare
+# the lex routine before defining it, causing compiler warnings.
+# XXX - newer versions of Flex support --header-file=, to generate the
+# appropriate header file.  With those versions, we should use that option.
+#
+
+#
+# Get the name of the prefix; scan the source files for a %option prefix
+# line.  We use the last one.
+#
+prefix=`sed -n 's/%option[ 	][ 	]*prefix="\(.*\)".*/\1/p' "$@" | tail -1`
+if [ ! -z "$prefix" ]
+then
+	prefixline="#define yylex ${prefix}lex"
+fi
+
+#
+# Construct the name of the header file.
+#
+header_file=`dirname "$outfile"`/`basename "$outfile" .c`.h
+
+#
+# Spew out the declaration.
+#
+cat <<EOF >$header_file
+/* This is generated by runlex.sh.  Do not edit it. */
+$prefixline
+#ifndef YY_DECL
+#define YY_DECL int yylex(void)
+#endif  
+YY_DECL;
+EOF
diff --git a/savefile.c b/savefile.c
index e5a5403..73e3ea9 100644
--- a/savefile.c
+++ b/savefile.c
@@ -30,13 +30,27 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/savefile.c,v 1.126.2.30 2007/08/14 20:57:49 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/savefile.c,v 1.183 2008-12-23 20:13:29 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 <errno.h>
 #include <memory.h>
 #include <stdio.h>
@@ -44,61 +58,14 @@
 #include <string.h>
 
 #include "pcap-int.h"
+#include "pcap/usb.h"
 
 #ifdef HAVE_OS_PROTO_H
 #include "os-proto.h"
 #endif
 
-/*
- * Standard libpcap format.
- */
-#define TCPDUMP_MAGIC		0xa1b2c3d4
-
-/*
- * Alexey Kuznetzov's modified libpcap format.
- */
-#define KUZNETZOV_TCPDUMP_MAGIC	0xa1b2cd34
-
-/*
- * Reserved for Francisco Mesquita <francisco.mesquita@radiomovel.pt>
- * for another modified format.
- */
-#define FMESQUITA_TCPDUMP_MAGIC	0xa1b234cd
-
-/*
- * Navtel Communcations' format, with nanosecond timestamps,
- * as per a request from Dumas Hwang <dumas.hwang@navtelcom.com>.
- */
-#define NAVTEL_TCPDUMP_MAGIC	0xa12b3c4d
-
-/*
- * Normal libpcap format, except for seconds/nanoseconds timestamps,
- * as per a request by Ulf Lamping <ulf.lamping@web.de>
- */
-#define NSEC_TCPDUMP_MAGIC	0xa1b23c4d
-
-/*
- * 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) )
-
-#define SFERR_TRUNC		1
-#define SFERR_BADVERSION	2
-#define SFERR_BADF		3
-#define SFERR_EOF		4 /* not really an error, just a status */
+#include "sf-pcap.h"
+#include "sf-pcap-ng.h"
 
 /*
  * Setting O_BINARY on DOS/Windows is a bit tricky
@@ -113,774 +80,6 @@
   #endif
 #endif
 
-/*
- * We don't write DLT_* values to the capture file header, 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@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 CVS 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 CVS 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.
- */
-#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		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 */
-
-#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 */
-#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@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
-
-
-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 },
-	{ 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 },
-
-	/* IEEE 802.11 wireless */
-	{ DLT_IEEE802_11,	LINKTYPE_IEEE802_11 },
-
-	/* Frame Relay */
-	{ DLT_FRELAY,		LINKTYPE_FRELAY },
-
-	/* OpenBSD loopback */
-	{ DLT_LOOP,		LINKTYPE_LOOP },
-
-	/* Linux cooked socket capture */
-	{ DLT_LINUX_SLL,	LINKTYPE_LINUX_SLL },
-
-	/* Apple LocalTalk hardware */
-	{ DLT_LTALK,		LINKTYPE_LTALK },
-
-	/* Acorn Econet */
-	{ DLT_ECONET,		LINKTYPE_ECONET },
-
-	/* OpenBSD DLT_PFLOG */
-	{ DLT_PFLOG,		LINKTYPE_PFLOG },
-
-	/* For Cisco-internal use */
-	{ DLT_CISCO_IOS,	LINKTYPE_CISCO_IOS },
-
-	/* Prism II monitor-mode header plus 802.11 header */
-	{ DLT_PRISM_HEADER,	LINKTYPE_PRISM_HEADER },
-
-	/* FreeBSD Aironet driver stuff */
-	{ DLT_AIRONET_HEADER,	LINKTYPE_AIRONET_HEADER },
-
-	/* Siemens HiPath HDLC */
-	{ DLT_HHDLC,		LINKTYPE_HHDLC },
-
-	/* RFC 2625 IP-over-Fibre Channel */
-	{ DLT_IP_OVER_FC,	LINKTYPE_IP_OVER_FC },
-
-	/* Solaris+SunATM */
-	{ DLT_SUNATM,		LINKTYPE_SUNATM },
-
-	/* RapidIO */
-	{ DLT_RIO,		LINKTYPE_RIO },
-
-	/* PCI Express */
-	{ DLT_PCI_EXP,		LINKTYPE_PCI_EXP },
-
-	/* Xilinx Aurora link layer */
-	{ DLT_AURORA,		LINKTYPE_AURORA },
-
-	/* 802.11 plus BSD radio header */
-	{ DLT_IEEE802_11_RADIO,	LINKTYPE_IEEE802_11_RADIO },
-
-	/* Tazmen Sniffer Protocol */
-	{ DLT_TZSP,		LINKTYPE_TZSP },
-
-	/* Arcnet with Linux-style link-layer headers */
-	{ DLT_ARCNET_LINUX,	LINKTYPE_ARCNET_LINUX },
-
-        /* Juniper-internal chassis encapsulation */
-        { DLT_JUNIPER_MLPPP,    LINKTYPE_JUNIPER_MLPPP },
-        { DLT_JUNIPER_MLFR,     LINKTYPE_JUNIPER_MLFR },
-        { DLT_JUNIPER_ES,       LINKTYPE_JUNIPER_ES },
-        { DLT_JUNIPER_GGSN,     LINKTYPE_JUNIPER_GGSN },
-        { DLT_JUNIPER_MFR,      LINKTYPE_JUNIPER_MFR },
-        { DLT_JUNIPER_ATM2,     LINKTYPE_JUNIPER_ATM2 },
-        { DLT_JUNIPER_SERVICES, LINKTYPE_JUNIPER_SERVICES },
-        { DLT_JUNIPER_ATM1,     LINKTYPE_JUNIPER_ATM1 },
-
-	/* Apple IP-over-IEEE 1394 cooked header */
-	{ DLT_APPLE_IP_OVER_IEEE1394, LINKTYPE_APPLE_IP_OVER_IEEE1394 },
-
-	/* SS7 */
-	{ DLT_MTP2_WITH_PHDR,	LINKTYPE_MTP2_WITH_PHDR },
-	{ DLT_MTP2,		LINKTYPE_MTP2 },
-	{ DLT_MTP3,		LINKTYPE_MTP3 },
-	{ DLT_SCCP,		LINKTYPE_SCCP },
-
-	/* DOCSIS MAC frames */
-	{ DLT_DOCSIS,		LINKTYPE_DOCSIS },
-
-	/* IrDA IrLAP packets + Linux-cooked header */
-	{ DLT_LINUX_IRDA,	LINKTYPE_LINUX_IRDA },
-
-	/* IBM SP and Next Federation switches */
-	{ DLT_IBM_SP,		LINKTYPE_IBM_SP },
-	{ DLT_IBM_SN,		LINKTYPE_IBM_SN },
-
-	/* 802.11 plus AVS radio header */
-	{ DLT_IEEE802_11_RADIO_AVS, LINKTYPE_IEEE802_11_RADIO_AVS },
-
-	/*
-	 * 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).
-	 */
-
-	/* Juniper-internal chassis encapsulation */
-	{ DLT_JUNIPER_MONITOR,	LINKTYPE_JUNIPER_MONITOR },
-
-	/* BACnet MS/TP */
-	{ DLT_BACNET_MS_TP,	LINKTYPE_BACNET_MS_TP },
-
-	/* PPP for pppd, with direction flag in the PPP header */
-	{ DLT_PPP_PPPD,		LINKTYPE_PPP_PPPD},
-
-	/* Juniper-internal chassis encapsulation */
-        { DLT_JUNIPER_PPPOE,    LINKTYPE_JUNIPER_PPPOE },
-        { DLT_JUNIPER_PPPOE_ATM,LINKTYPE_JUNIPER_PPPOE_ATM },
-
-	/* GPRS LLC */
-	{ DLT_GPRS_LLC,		LINKTYPE_GPRS_LLC },
-
-	/* Transparent Generic Framing Procedure (ITU-T G.7041/Y.1303) */
-	{ DLT_GPF_T,		LINKTYPE_GPF_T },
-
-	/* Framed Generic Framing Procedure (ITU-T G.7041/Y.1303) */
-	{ DLT_GPF_F,		LINKTYPE_GPF_F },
-
-	{ DLT_GCOM_T1E1,	LINKTYPE_GCOM_T1E1 },
-	{ DLT_GCOM_SERIAL,	LINKTYPE_GCOM_SERIAL },
-
-        /* Juniper-internal chassis encapsulation */
-        { DLT_JUNIPER_PIC_PEER, LINKTYPE_JUNIPER_PIC_PEER },
-
-	/* Endace types */
-	{ DLT_ERF_ETH,		LINKTYPE_ERF_ETH },
-	{ DLT_ERF_POS,		LINKTYPE_ERF_POS },
-
-	/* viSDN LAPD */
-	{ DLT_LINUX_LAPD,	LINKTYPE_LINUX_LAPD },
-
-        /* Juniper meta-information before Ether, PPP, Frame Relay, C-HDLC Frames */
-        { DLT_JUNIPER_ETHER, LINKTYPE_JUNIPER_ETHER },
-        { DLT_JUNIPER_PPP, LINKTYPE_JUNIPER_PPP },
-        { DLT_JUNIPER_FRELAY, LINKTYPE_JUNIPER_FRELAY },
-        { DLT_JUNIPER_CHDLC, LINKTYPE_JUNIPER_CHDLC },
-
-        /* Multi Link Frame Relay (FRF.16) */
-        { DLT_MFR,              LINKTYPE_MFR },
-
-        /* Juniper Voice PIC */
-        { DLT_JUNIPER_VP,       LINKTYPE_JUNIPER_VP },
-
-	/* Controller Area Network (CAN) v2.0B */
-	{ DLT_A429,		LINKTYPE_A429 },
-
-	/* Arinc 653 Interpartition Communication messages */
-	{ DLT_A653_ICM,         LINKTYPE_A653_ICM },
-
-	/* USB */
-	{ DLT_USB,		LINKTYPE_USB },
-
-	/* Bluetooth HCI UART transport layer */
-	{ DLT_BLUETOOTH_HCI_H4,	LINKTYPE_BLUETOOTH_HCI_H4 },
-
-	/* IEEE 802.16 MAC Common Part Sublayer */
-	{ DLT_IEEE802_16_MAC_CPS,	LINKTYPE_IEEE802_16_MAC_CPS },
-
-	/* USB with Linux header */
-	{ DLT_USB_LINUX,	LINKTYPE_USB_LINUX },
-
-	/* Controller Area Network (CAN) v2.0B */
-	{ DLT_CAN20B,		LINKTYPE_CAN20B },
-
-	/* IEEE 802.15.4 with address fields padded */
-	{ DLT_IEEE802_15_4_LINUX,	LINKTYPE_IEEE802_15_4_LINUX },
-
-	/* Per Packet Information encapsulated packets */
-	{ DLT_PPI,			LINKTYPE_PPI },
-
-	/* IEEE 802.16 MAC Common Part Sublayer plus radiotap header */
-	{ DLT_IEEE802_16_MAC_CPS_RADIO, LINKTYPE_IEEE802_16_MAC_CPS_RADIO },
-
-        /* Juniper Voice ISM */
-        { DLT_JUNIPER_ISM,      LINKTYPE_JUNIPER_ISM },
-
-	/* IEEE 802.15.4 exactly as it appears in the spec */
-        { DLT_IEEE802_15_4,	LINKTYPE_IEEE802_15_4 },
-
-	/* Various link-layer types for SITA */
-	{ DLT_SITA,		LINKTYPE_SITA },
-
-	/* Various link-layer types for Endace */
-	{ DLT_ERF,		LINKTYPE_ERF },
-
-	/* Special header for u10 Networks boards */
-	{ DLT_RAIF1,		LINKTYPE_RAIF1 },
-
-	/* IPMB */
-	{ DLT_IPMB,		LINKTYPE_IPMB },
-
-	{ -1,			-1 }
-};
-
-static int
-dlt_to_linktype(int dlt)
-{
-	int i;
-
-	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 the table above needs to have an
-	 * entry added.
-	 */
-	return (-1);
-}
-
-static int
-linktype_to_dlt(int linktype)
-{
-	int i;
-
-	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;
-}
-
-static int
-sf_write_header(FILE *fp, int linktype, int thiszone, int snaplen)
-{
-	struct pcap_file_header hdr;
-
-	hdr.magic = TCPDUMP_MAGIC;
-	hdr.version_major = PCAP_VERSION_MAJOR;
-	hdr.version_minor = PCAP_VERSION_MINOR;
-
-	hdr.thiszone = thiszone;
-	hdr.snaplen = snaplen;
-	hdr.sigfigs = 0;
-	hdr.linktype = linktype;
-
-	if (fwrite((char *)&hdr, sizeof(hdr), 1, fp) != 1)
-		return (-1);
-
-	return (0);
-}
-
-static void
-swap_hdr(struct pcap_file_header *hp)
-{
-	hp->version_major = SWAPSHORT(hp->version_major);
-	hp->version_minor = SWAPSHORT(hp->version_minor);
-	hp->thiszone = SWAPLONG(hp->thiszone);
-	hp->sigfigs = SWAPLONG(hp->sigfigs);
-	hp->snaplen = SWAPLONG(hp->snaplen);
-	hp->linktype = SWAPLONG(hp->linktype);
-}
-
 static int
 sf_getnonblock(pcap_t *p, char *errbuf)
 {
@@ -895,10 +94,16 @@
 sf_setnonblock(pcap_t *p, int nonblock, char *errbuf)
 {
 	/*
-	 * This is a savefile, not a live capture file, so ignore
-	 * requests to put it in non-blocking mode.
+	 * This is a savefile, not a live capture file, so reject
+	 * requests to put it in non-blocking mode.  (If it's a
+	 * pipe, it could be put in non-blocking mode, but that
+	 * would significantly complicate the code to read packets,
+	 * as it would have to handle reading partial packets and
+	 * keeping the state of the read.)
 	 */
-	return (0);
+	snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+	    "Savefiles cannot be put into non-blocking mode");
+	return (-1);
 }
 
 static int
@@ -909,6 +114,32 @@
 	return (-1);
 }
 
+#ifdef WIN32
+static int
+sf_setbuff(pcap_t *p, int dim)
+{
+	snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+	    "The kernel buffer size cannot be set while reading from a file");
+	return (-1);
+}
+
+static int
+sf_setmode(pcap_t *p, int mode)
+{
+	snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+	    "impossible to set mode while reading from a file");
+	return (-1);
+}
+
+static int
+sf_setmintocopy(pcap_t *p, int size)
+{
+	snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+	    "The mintocopy parameter cannot be set while reading from a file");
+	return (-1);
+}
+#endif
+
 static int
 sf_inject(pcap_t *p, const void *buf _U_, size_t size _U_)
 {
@@ -929,17 +160,19 @@
 	return (-1);
 }
 
-static void
-sf_close(pcap_t *p)
+void
+sf_cleanup(pcap_t *p)
 {
-	if (p->sf.rfile != stdin)
-		(void)fclose(p->sf.rfile);
-	if (p->sf.base != NULL)
-		free(p->sf.base);
+	if (p->rfile != stdin)
+		(void)fclose(p->rfile);
+	if (p->buffer != NULL)
+		free(p->buffer);
+	pcap_freecode(&p->fcode);
 }
 
 pcap_t *
-pcap_open_offline(const char *fname, char *errbuf)
+pcap_open_offline_with_tstamp_precision(const char *fname, u_int precision,
+    char *errbuf)
 {
 	FILE *fp;
 	pcap_t *p;
@@ -967,7 +200,7 @@
 			return (NULL);
 		}
 	}
-	p = pcap_fopen_offline(fp, errbuf);
+	p = pcap_fopen_offline_with_tstamp_precision(fp, precision, errbuf);
 	if (p == NULL) {
 		if (fp != stdin)
 			fclose(fp);
@@ -976,24 +209,73 @@
 }
 
 pcap_t *
-pcap_fopen_offline(FILE *fp, char *errbuf)
+pcap_open_offline(const char *fname, char *errbuf)
 {
-	register pcap_t *p;
-	struct pcap_file_header hdr;
-	size_t amt_read;
-	bpf_u_int32 magic;
-	int linklen;
+	return (pcap_open_offline_with_tstamp_precision(fname,
+	    PCAP_TSTAMP_PRECISION_MICRO, errbuf));
+}
 
-	p = (pcap_t *)malloc(sizeof(*p));
-	if (p == NULL) {
-		strlcpy(errbuf, "out of swap", PCAP_ERRBUF_SIZE);
-		return (NULL);
+#ifdef WIN32
+pcap_t* pcap_hopen_offline_with_tstamp_precision(intptr_t osfd, u_int precision,
+    char *errbuf)
+{
+	int fd;
+	FILE *file;
+
+	fd = _open_osfhandle(osfd, _O_RDONLY);
+	if ( fd < 0 ) 
+	{
+		snprintf(errbuf, PCAP_ERRBUF_SIZE, pcap_strerror(errno));
+		return NULL;
 	}
 
-	memset((char *)p, 0, sizeof(*p));
+	file = _fdopen(fd, "rb");
+	if ( file == NULL ) 
+	{
+		snprintf(errbuf, PCAP_ERRBUF_SIZE, pcap_strerror(errno));
+		return NULL;
+	}
 
-	amt_read = fread((char *)&hdr, 1, sizeof(hdr), fp);
-	if (amt_read != sizeof(hdr)) {
+	return pcap_fopen_offline_with_tstamp_precision(file, precision,
+	    errbuf);
+}
+
+pcap_t* pcap_hopen_offline(intptr_t osfd, char *errbuf)
+{
+	return pcap_hopen_offline_with_tstamp_precision(osfd,
+	    PCAP_TSTAMP_PRECISION_MICRO, errbuf);
+}
+#endif
+
+static pcap_t *(*check_headers[])(bpf_u_int32, FILE *, u_int, char *, int *) = {
+	pcap_check_header,
+	pcap_ng_check_header
+};
+
+#define	N_FILE_TYPES	(sizeof check_headers / sizeof check_headers[0])
+
+#ifdef WIN32
+static
+#endif
+pcap_t *
+pcap_fopen_offline_with_tstamp_precision(FILE *fp, u_int precision,
+    char *errbuf)
+{
+	register pcap_t *p;
+	bpf_u_int32 magic;
+	size_t amt_read;
+	u_int i;
+	int err;
+
+	/*
+	 * Read the first 4 bytes of the file; the network analyzer dump
+	 * file formats we support (pcap and pcap-ng), and several other
+	 * formats we might support in the future (such as snoop, DOS and
+	 * Windows Sniffer, and Microsoft Network Monitor) all have magic
+	 * numbers that are unique in their first 4 bytes.
+	 */
+	amt_read = fread((char *)&magic, 1, sizeof(magic), fp);
+	if (amt_read != sizeof(magic)) {
 		if (ferror(fp)) {
 			snprintf(errbuf, PCAP_ERRBUF_SIZE,
 			    "error reading dump file: %s",
@@ -1001,143 +283,41 @@
 		} else {
 			snprintf(errbuf, PCAP_ERRBUF_SIZE,
 			    "truncated dump file; tried to read %lu file header bytes, only got %lu",
-			    (unsigned long)sizeof(hdr),
+			    (unsigned long)sizeof(magic),
 			    (unsigned long)amt_read);
 		}
-		goto bad;
+		return (NULL);
 	}
-	magic = hdr.magic;
-	if (magic != TCPDUMP_MAGIC && magic != KUZNETZOV_TCPDUMP_MAGIC) {
-		magic = SWAPLONG(magic);
-		if (magic != TCPDUMP_MAGIC && magic != KUZNETZOV_TCPDUMP_MAGIC) {
-			snprintf(errbuf, PCAP_ERRBUF_SIZE,
-			    "bad dump file format");
-			goto bad;
-		}
-		p->sf.swapped = 1;
-		swap_hdr(&hdr);
-	}
-	if (magic == KUZNETZOV_TCPDUMP_MAGIC) {
-		/*
-		 * XXX - the patch that's in some versions of libpcap
-		 * changes the packet header but not the magic number,
-		 * and some other versions with this magic number have
-		 * some extra debugging information in the packet header;
-		 * we'd have to use some hacks^H^H^H^H^Hheuristics to
-		 * detect those variants.
-		 *
-		 * Ethereal does that, but it does so by trying to read
-		 * the first two packets of the file with each of the
-		 * record header formats.  That currently means it seeks
-		 * backwards and retries the reads, which doesn't work
-		 * on pipes.  We want to be able to read from a pipe, so
-		 * that strategy won't work; we'd have to buffer some
-		 * data ourselves and read from that buffer in order to
-		 * make that work.
-		 */
-		p->sf.hdrsize = sizeof(struct pcap_sf_patched_pkthdr);
-	} else
-		p->sf.hdrsize = sizeof(struct pcap_sf_pkthdr);
-	if (hdr.version_major < PCAP_VERSION_MAJOR) {
-		snprintf(errbuf, PCAP_ERRBUF_SIZE, "archaic file format");
-		goto bad;
-	}
-	p->tzoff = hdr.thiszone;
-	p->snapshot = hdr.snaplen;
-	p->linktype = linktype_to_dlt(hdr.linktype);
-	if (magic == KUZNETZOV_TCPDUMP_MAGIC && p->linktype == DLT_EN10MB) {
-		/*
-		 * This capture might have been done in raw mode or cooked
-		 * mode.
-		 *
-		 * If it was done in cooked mode, p->snapshot was passed
-		 * to recvfrom() as the buffer size, meaning that the
-		 * most packet data that would be copied would be
-		 * p->snapshot.  However, a faked Ethernet header would
-		 * then have been added to it, so the most data that would
-		 * be in a packet in the file would be p->snapshot + 14.
-		 *
-		 * We can't easily tell whether the capture was done in
-		 * raw mode or cooked mode, so we'll assume it was
-		 * cooked mode, and add 14 to the snapshot length.  That
-		 * means that, for a raw capture, the snapshot length will
-		 * be misleading if you use it to figure out why a capture
-		 * doesn't have all the packet data, but there's not much
-		 * we can do to avoid that.
-		 */
-		p->snapshot += 14;
-	}
-	p->sf.rfile = fp;
-#ifndef WIN32
-	p->bufsize = hdr.snaplen;
-#else
-	/* Allocate the space for pcap_pkthdr as well. It will be used by pcap_read_ex */
-	p->bufsize = hdr.snaplen+sizeof(struct pcap_pkthdr);
-#endif
-
-	/* Align link header as required for proper data alignment */
-	/* XXX should handle all types */
-	switch (p->linktype) {
-
-	case DLT_EN10MB:
-		linklen = 14;
-		break;
-
-	case DLT_FDDI:
-		linklen = 13 + 8;	/* fddi_header + llc */
-		break;
-
-	case DLT_NULL:
-	default:
-		linklen = 0;
-		break;
-	}
-
-	if (p->bufsize < 0)
-		p->bufsize = BPF_MAXBUFSIZE;
-	p->sf.base = (u_char *)malloc(p->bufsize + BPF_ALIGNMENT);
-	if (p->sf.base == NULL) {
-		strlcpy(errbuf, "out of swap", PCAP_ERRBUF_SIZE);
-		goto bad;
-	}
-	p->buffer = p->sf.base + BPF_ALIGNMENT - (linklen % BPF_ALIGNMENT);
-	p->sf.version_major = hdr.version_major;
-	p->sf.version_minor = hdr.version_minor;
-#ifdef PCAP_FDDIPAD
-	/* Padding only needed for live capture fcode */
-	p->fddipad = 0;
-#endif
 
 	/*
-	 * We interchanged the caplen and len fields at version 2.3,
-	 * in order to match the bpf header layout.  But unfortunately
-	 * some files were written with version 2.3 in their headers
-	 * but without the interchanged fields.
-	 *
-	 * In addition, DG/UX tcpdump writes out files with a version
-	 * number of 543.0, and with the caplen and len fields in the
-	 * pre-2.3 order.
+	 * Try all file types.
 	 */
-	switch (hdr.version_major) {
-
-	case 2:
-		if (hdr.version_minor < 3)
-			p->sf.lengths_swapped = SWAPPED;
-		else if (hdr.version_minor == 3)
-			p->sf.lengths_swapped = MAYBE_SWAPPED;
-		else
-			p->sf.lengths_swapped = NOT_SWAPPED;
-		break;
-
-	case 543:
-		p->sf.lengths_swapped = SWAPPED;
-		break;
-
-	default:
-		p->sf.lengths_swapped = NOT_SWAPPED;
-		break;
+	for (i = 0; i < N_FILE_TYPES; i++) {
+		p = (*check_headers[i])(magic, fp, precision, errbuf, &err);
+		if (p != NULL) {
+			/* Yup, that's it. */
+			goto found;
+		}
+		if (err) {
+			/*
+			 * Error trying to read the header.
+			 */
+			return (NULL);
+		}
 	}
 
+	/*
+	 * Well, who knows what this mess is....
+	 */
+	snprintf(errbuf, PCAP_ERRBUF_SIZE, "unknown file format");
+	return (NULL);
+
+found:
+	p->rfile = fp;
+
+	/* Padding only needed for live capture fcode */
+	p->fddipad = 0;
+
 #if !defined(WIN32) && !defined(MSDOS)
 	/*
 	 * You can do "select()" and "poll()" on plain files on most
@@ -1157,160 +337,36 @@
 	p->getnonblock_op = sf_getnonblock;
 	p->setnonblock_op = sf_setnonblock;
 	p->stats_op = sf_stats;
-	p->close_op = sf_close;
-
-	return (p);
- bad:
-	free(p);
-	return (NULL);
-}
-
-/*
- * Read sf_readfile and return the next packet.  Return the header in hdr
- * and the contents in buf.  Return 0 on success, SFERR_EOF if there were
- * no more packets, and SFERR_TRUNC if a partial packet was encountered.
- */
-static int
-sf_next_packet(pcap_t *p, struct pcap_pkthdr *hdr, u_char *buf, u_int buflen)
-{
-	struct pcap_sf_patched_pkthdr sf_hdr;
-	FILE *fp = p->sf.rfile;
-	size_t amt_read;
-	bpf_u_int32 t;
+#ifdef WIN32
+	p->setbuff_op = sf_setbuff;
+	p->setmode_op = sf_setmode;
+	p->setmintocopy_op = sf_setmintocopy;
+#endif
 
 	/*
-	 * Read the packet header; the structure we use as a buffer
-	 * is the longer structure for files generated by the patched
-	 * libpcap, but if the file has the magic number for an
-	 * unpatched libpcap we only read as many bytes as the regular
-	 * header has.
+	 * For offline captures, the standard one-shot callback can
+	 * be used for pcap_next()/pcap_next_ex().
 	 */
-	amt_read = fread(&sf_hdr, 1, p->sf.hdrsize, fp);
-	if (amt_read != p->sf.hdrsize) {
-		if (ferror(fp)) {
-			snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
-			    "error reading dump file: %s",
-			    pcap_strerror(errno));
-			return (-1);
-		} else {
-			if (amt_read != 0) {
-				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
-				    "truncated dump file; tried to read %d header bytes, only got %lu",
-				    p->sf.hdrsize, (unsigned long)amt_read);
-				return (-1);
-			}
-			/* EOF */
-			return (1);
-		}
-	}
+	p->oneshot_callback = pcap_oneshot;
 
-	if (p->sf.swapped) {
-		/* these were written in opposite byte order */
-		hdr->caplen = SWAPLONG(sf_hdr.caplen);
-		hdr->len = SWAPLONG(sf_hdr.len);
-		hdr->ts.tv_sec = SWAPLONG(sf_hdr.ts.tv_sec);
-		hdr->ts.tv_usec = SWAPLONG(sf_hdr.ts.tv_usec);
-	} else {
-		hdr->caplen = sf_hdr.caplen;
-		hdr->len = sf_hdr.len;
-		hdr->ts.tv_sec = sf_hdr.ts.tv_sec;
-		hdr->ts.tv_usec = sf_hdr.ts.tv_usec;
-	}
-	/* Swap the caplen and len fields, if necessary. */
-	switch (p->sf.lengths_swapped) {
+	p->activated = 1;
 
-	case NOT_SWAPPED:
-		break;
+	return (p);
+}
 
-	case MAYBE_SWAPPED:
-		if (hdr->caplen <= hdr->len) {
-			/*
-			 * The captured length is <= the actual length,
-			 * so presumably they weren't swapped.
-			 */
-			break;
-		}
-		/* FALLTHROUGH */
-
-	case SWAPPED:
-		t = hdr->caplen;
-		hdr->caplen = hdr->len;
-		hdr->len = t;
-		break;
-	}
-
-	if (hdr->caplen > buflen) {
-		/*
-		 * This can happen due to Solaris 2.3 systems tripping
-		 * over the BUFMOD problem and not setting the snapshot
-		 * correctly in the savefile header.  If the caplen isn't
-		 * grossly wrong, try to salvage.
-		 */
-		static u_char *tp = NULL;
-		static size_t tsize = 0;
-
-		if (hdr->caplen > 65535) {
-			snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
-			    "bogus savefile header");
-			return (-1);
-		}
-
-		if (tsize < hdr->caplen) {
-			tsize = ((hdr->caplen + 1023) / 1024) * 1024;
-			if (tp != NULL)
-				free((u_char *)tp);
-			tp = (u_char *)malloc(tsize);
-			if (tp == NULL) {
-				tsize = 0;
-				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
-				    "BUFMOD hack malloc");
-				return (-1);
-			}
-		}
-		amt_read = fread((char *)tp, 1, hdr->caplen, fp);
-		if (amt_read != hdr->caplen) {
-			if (ferror(fp)) {
-				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
-				    "error reading dump file: %s",
-				    pcap_strerror(errno));
-			} else {
-				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
-				    "truncated dump file; tried to read %u captured bytes, only got %lu",
-				    hdr->caplen, (unsigned long)amt_read);
-			}
-			return (-1);
-		}
-		/*
-		 * We can only keep up to buflen bytes.  Since caplen > buflen
-		 * is exactly how we got here, we know we can only keep the
-		 * first buflen bytes and must drop the remainder.  Adjust
-		 * caplen accordingly, so we don't get confused later as
-		 * to how many bytes we have to play with.
-		 */
-		hdr->caplen = buflen;
-		memcpy((char *)buf, (char *)tp, buflen);
-
-	} else {
-		/* read the packet itself */
-		amt_read = fread((char *)buf, 1, hdr->caplen, fp);
-		if (amt_read != hdr->caplen) {
-			if (ferror(fp)) {
-				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
-				    "error reading dump file: %s",
-				    pcap_strerror(errno));
-			} else {
-				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
-				    "truncated dump file; tried to read %u captured bytes, only got %lu",
-				    hdr->caplen, (unsigned long)amt_read);
-			}
-			return (-1);
-		}
-	}
-	return (0);
+#ifdef WIN32
+static
+#endif
+pcap_t *
+pcap_fopen_offline(FILE *fp, char *errbuf)
+{
+	return (pcap_fopen_offline_with_tstamp_precision(fp,
+	    PCAP_TSTAMP_PRECISION_MICRO, errbuf));
 }
 
 /*
- * Print out packets stored in the file initialized by sf_read_init().
+ * Read packets from a capture file, and call the callback for each
+ * packet.
  * If cnt > 0, return after 'cnt' packets, otherwise continue until eof.
  */
 int
@@ -1319,6 +375,7 @@
 	struct bpf_insn *fcode;
 	int status = 0;
 	int n = 0;
+	u_char *data;
 
 	while (status == 0) {
 		struct pcap_pkthdr h;
@@ -1340,7 +397,7 @@
 				return (n);
 		}
 
-		status = sf_next_packet(p, &h, p->buffer, p->bufsize);
+		status = p->next_packet_op(p, &h, &data);
 		if (status) {
 			if (status == 1)
 				return (0);
@@ -1348,8 +405,8 @@
 		}
 
 		if ((fcode = p->fcode.bf_insns) == NULL ||
-		    bpf_filter(fcode, p->buffer, h.len, h.caplen)) {
-			(*callback)(user, &h, p->buffer);
+		    bpf_filter(fcode, data, h.len, h.caplen)) {
+			(*callback)(user, &h, data);
 			if (++n >= cnt && cnt > 0)
 				break;
 		}
@@ -1357,137 +414,3 @@
 	/*XXX this breaks semantics tcpslice expects */
 	return (n);
 }
-
-/*
- * Output a packet to the initialized dump file.
- */
-void
-pcap_dump(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
-{
-	register FILE *f;
-	struct pcap_sf_pkthdr sf_hdr;
-
-	f = (FILE *)user;
-	sf_hdr.ts.tv_sec  = h->ts.tv_sec;
-	sf_hdr.ts.tv_usec = h->ts.tv_usec;
-	sf_hdr.caplen     = h->caplen;
-	sf_hdr.len        = h->len;
-	/* XXX we should check the return status */
-	(void)fwrite(&sf_hdr, sizeof(sf_hdr), 1, f);
-	(void)fwrite(sp, h->caplen, 1, f);
-}
-
-static pcap_dumper_t *
-pcap_setup_dump(pcap_t *p, int linktype, FILE *f, const char *fname)
-{
-
-#if defined(WIN32) || defined(MSDOS)
-	/*
-	 * If we're writing to the standard output, put it in binary
-	 * mode, as savefiles are binary files.
-	 *
-	 * Otherwise, we turn off buffering.
-	 * XXX - why?  And why not on the standard output?
-	 */
-	if (f == stdout)
-		SET_BINMODE(f);
-	else
-		setbuf(f, NULL);
-#endif
-	if (sf_write_header(f, linktype, p->tzoff, p->snapshot) == -1) {
-		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "Can't write to %s: %s",
-		    fname, pcap_strerror(errno));
-		if (f != stdout)
-			(void)fclose(f);
-		return (NULL);
-	}
-	return ((pcap_dumper_t *)f);
-}
-
-/*
- * Initialize so that sf_write() will output to the file named 'fname'.
- */
-pcap_dumper_t *
-pcap_dump_open(pcap_t *p, const char *fname)
-{
-	FILE *f;
-	int linktype;
-
-	linktype = dlt_to_linktype(p->linktype);
-	if (linktype == -1) {
-		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
-		    "%s: link-layer type %d isn't supported in savefiles",
-		    fname, linktype);
-		return (NULL);
-	}
-
-	if (fname[0] == '-' && fname[1] == '\0') {
-		f = stdout;
-		fname = "standard output";
-	} else {
-#if !defined(WIN32) && !defined(MSDOS)
-		f = fopen(fname, "w");
-#else
-		f = fopen(fname, "wb");
-#endif
-		if (f == NULL) {
-			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "%s: %s",
-			    fname, pcap_strerror(errno));
-			return (NULL);
-		}
-	}
-	return (pcap_setup_dump(p, linktype, f, fname));
-}
-
-/*
- * Initialize so that sf_write() will output to the given stream.
- */
-pcap_dumper_t *
-pcap_dump_fopen(pcap_t *p, FILE *f)
-{	
-	int linktype;
-
-	linktype = dlt_to_linktype(p->linktype);
-	if (linktype == -1) {
-		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
-		    "stream: link-layer type %d isn't supported in savefiles",
-		    linktype);
-		return (NULL);
-	}
-
-	return (pcap_setup_dump(p, linktype, f, "stream"));
-}
-
-FILE *
-pcap_dump_file(pcap_dumper_t *p)
-{
-	return ((FILE *)p);
-}
-
-long
-pcap_dump_ftell(pcap_dumper_t *p)
-{
-	return (ftell((FILE *)p));
-}
-
-int
-pcap_dump_flush(pcap_dumper_t *p)
-{
-
-	if (fflush((FILE *)p) == EOF)
-		return (-1);
-	else
-		return (0);
-}
-
-void
-pcap_dump_close(pcap_dumper_t *p)
-{
-
-#ifdef notyet
-	if (ferror((FILE *)p))
-		return-an-error;
-	/* XXX should check return from fclose() too */
-#endif
-	(void)fclose((FILE *)p);
-}
diff --git a/scanner.c b/scanner.c
index 31ba552..e9fc736 100644
--- a/scanner.c
+++ b/scanner.c
@@ -1,14 +1,34 @@
+#line 2 "scanner.c"
 
-#line 3 "<stdout>"
+#line 4 "scanner.c"
 
 #define  YY_INT_ALIGNED short int
 
 /* A lexical scanner generated by flex */
 
+#define yy_create_buffer pcap__create_buffer
+#define yy_delete_buffer pcap__delete_buffer
+#define yy_flex_debug pcap__flex_debug
+#define yy_init_buffer pcap__init_buffer
+#define yy_flush_buffer pcap__flush_buffer
+#define yy_load_buffer_state pcap__load_buffer_state
+#define yy_switch_to_buffer pcap__switch_to_buffer
+#define yyin pcap_in
+#define yyleng pcap_leng
+#define yylex pcap_lex
+#define yylineno pcap_lineno
+#define yyout pcap_out
+#define yyrestart pcap_restart
+#define yytext pcap_text
+#define yywrap pcap_wrap
+#define yyalloc pcap_alloc
+#define yyrealloc pcap_realloc
+#define yyfree pcap_free
+
 #define FLEX_SCANNER
 #define YY_FLEX_MAJOR_VERSION 2
 #define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 31
+#define YY_FLEX_SUBMINOR_VERSION 35
 #if YY_FLEX_SUBMINOR_VERSION > 0
 #define FLEX_BETA
 #endif
@@ -30,7 +50,15 @@
 
 /* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
 
-#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types. 
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
 #include <inttypes.h>
 typedef int8_t flex_int8_t;
 typedef uint8_t flex_uint8_t;
@@ -45,7 +73,6 @@
 typedef unsigned char flex_uint8_t; 
 typedef unsigned short int flex_uint16_t;
 typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
 
 /* Limits of integral types. */
 #ifndef INT8_MIN
@@ -76,6 +103,8 @@
 #define UINT32_MAX             (4294967295U)
 #endif
 
+#endif /* ! C99 */
+
 #endif /* ! FLEXINT_H */
 
 #ifdef __cplusplus
@@ -85,11 +114,12 @@
 
 #else	/* ! __cplusplus */
 
-#if __STDC__
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
 
 #define YY_USE_CONST
 
-#endif	/* __STDC__ */
+#endif	/* defined (__STDC__) */
 #endif	/* ! __cplusplus */
 
 #ifdef YY_USE_CONST
@@ -131,9 +161,21 @@
 
 /* Size of default input buffer. */
 #ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
 #define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
 #endif
 
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
 #ifndef YY_TYPEDEF_YY_BUFFER_STATE
 #define YY_TYPEDEF_YY_BUFFER_STATE
 typedef struct yy_buffer_state *YY_BUFFER_STATE;
@@ -165,14 +207,9 @@
 
 #define unput(c) yyunput( c, (yytext_ptr)  )
 
-/* The following is because we cannot portably get our hands on size_t
- * (without autoconf's help, which isn't available because we want
- * flex-generated scanners to compile on their own).
- */
-
 #ifndef YY_TYPEDEF_YY_SIZE_T
 #define YY_TYPEDEF_YY_SIZE_T
-typedef unsigned int yy_size_t;
+typedef size_t yy_size_t;
 #endif
 
 #ifndef YY_STRUCT_YY_BUFFER_STATE
@@ -267,7 +304,7 @@
 
 /* Points to current character in buffer. */
 static char *yy_c_buf_p = (char *) 0;
-static int yy_init = 1;		/* whether we need to initialize */
+static int yy_init = 0;		/* whether we need to initialize */
 static int yy_start = 0;	/* start state number */
 
 /* Flag which is used to allow pcap_wrap()'s to do buffer switches
@@ -351,8 +388,8 @@
 	*yy_cp = '\0'; \
 	(yy_c_buf_p) = yy_cp;
 
-#define YY_NUM_RULES 137
-#define YY_END_OF_BUFFER 138
+#define YY_NUM_RULES 154
+#define YY_END_OF_BUFFER 155
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -360,154 +397,168 @@
 	flex_int32_t yy_verify;
 	flex_int32_t yy_nxt;
 	};
-static yyconst flex_int16_t yy_accept[1330] =
+static yyconst flex_int16_t yy_accept[1459] =
     {   0,
-        0,    0,  138,  135,   95,   95,   95,   96,  135,   96,
-       96,   96,  136,  104,  104,   96,   96,   96,   96,  133,
-      133,  135,  133,  133,  133,  133,  133,  133,  133,  133,
-      133,  133,  133,  133,  133,  133,  133,  133,  133,  133,
-      133,  133,   96,  135,   99,  103,   57,    0,  133,  104,
-        0,  133,  133,  133,  107,  101,   98,  100,   97,  102,
-      134,  134,  133,  133,   19,  133,  133,  133,  133,  133,
-      133,  133,  133,  133,  133,  133,  133,  133,  133,  133,
-      133,  133,  133,  133,  133,  133,  133,  133,  133,  133,
-        7,  133,   33,   34,  133,  133,  133,  133,  133,  133,
+        0,    0,  155,  152,  112,  112,  112,  113,  152,  113,
+      113,  113,  153,  122,  122,  113,  113,  113,  113,  150,
+      150,  152,  150,  150,  150,  150,  150,  150,  150,  150,
+      150,  150,  150,  150,  150,  150,  150,  150,  150,  150,
+      150,  150,  113,  152,  116,  120,   67,    0,  150,  122,
+        0,  150,  150,  150,    0,  124,  118,  115,  117,  114,
+      119,  150,  151,  151,  150,  150,  150,   20,  150,  150,
+      150,  150,  150,  150,  150,  150,  150,  150,  150,  150,
+      150,  150,  150,  150,  150,  150,  150,  150,  150,  150,
+      150,  150,  150,  150,  150,  150,  150,  150,  150,  150,
 
-      133,  133,  133,  133,  133,  133,  133,  133,   81,  133,
-       58,  133,  133,  133,  133,  133,  133,  133,  133,  133,
-      133,  133,   75,  133,  133,  133,  133,  133,  133,  133,
-        4,  133,  133,  133,  133,  133,  133,   58,  103,  105,
-      105,  104,  133,    0,  107,  104,  107,  107,  107,  133,
-      133,   57,    5,  133,   70,  133,  133,  133,  133,  133,
-      133,   93,    1,    0,  133,   20,  133,  133,  133,  133,
-      133,  133,  133,  133,  133,  133,   35,  133,  133,   17,
-       42,    0,  133,   28,  133,   24,   60,  133,  133,   68,
-       36,  133,   89,  133,  133,  133,  133,   90,  133,   45,
+        7,  150,   34,   35,  150,  150,  150,  150,  150,  150,
+      150,  150,  150,  150,  150,  150,  150,  150,   91,  150,
+       68,  150,  150,  150,  150,  150,  150,   60,  150,  150,
+      150,  150,   85,  150,  150,  150,  150,  150,  150,   61,
+      150,    4,  150,  150,  150,  150,  150,  150,  150,   68,
+      120,  150,  123,  123,  150,  122,  150,    0,  124,  122,
+      124,  124,  124,  150,  150,  150,   67,    5,  150,   80,
+      150,  150,  150,  150,  150,  150,  150,   55,  106,    1,
+        0,  150,   21,  150,  150,  150,  150,  150,  150,  150,
+      150,  150,  150,  150,  150,  150,  150,  150,  150,  150,
 
-       59,   71,   92,  133,   14,  133,    3,  133,  133,  133,
-      133,  133,   83,  133,  133,   25,  133,   91,  133,   94,
-       37,    2,  133,   41,  133,    9,   10,   78,  133,   77,
-      133,  133,  133,  133,  104,    0,  133,    0,  108,  107,
-      107,    0,  107,    0,  107,    0,  107,    0,   22,  133,
-      133,  133,   54,   40,  133,   38,  133,  133,   29,  133,
-       87,  133,  133,   44,   11,  133,   12,   13,  133,  133,
-      133,   31,   67,  133,   52,    3,   88,   46,  133,  133,
-      133,   64,  133,  133,  133,  133,   47,  133,  133,   39,
-      133,    6,  133,   82,  133,    8,   84,  133,    0,  133,
+       36,  150,  150,   18,   43,    0,  150,   29,  150,   25,
+       70,  150,  150,   78,   37,  150,   99,  150,  150,  150,
+      150,  100,  150,   46,   69,   81,  105,  150,   14,  150,
+        3,  150,  150,  150,  150,  150,   93,  150,  150,   26,
+      150,  104,  150,  107,   38,    2,  150,   42,  150,    9,
+      150,   10,   88,  150,   87,  150,  150,    0,  150,  150,
+      123,  150,  150,  150,  150,  122,    0,  150,    0,  125,
+      124,  124,    0,  124,    0,  124,    0,  124,    0,   23,
+      150,  150,  150,  150,   64,   16,   41,  150,   39,  150,
+      150,  150,   30,  150,   97,  150,  150,  110,  150,  150,
 
-       63,   15,  105,  105,  105,  104,    0,  107,    0,    0,
-      107,    0,  107,  108,  107,    0,    0,    0,    0,  107,
-      107,  107,  107,  107,    0,  133,   21,  133,  133,  133,
-       30,  133,  133,    0,   18,  133,  133,  133,   76,  133,
-       32,  133,   69,   27,   26,  133,  133,   72,  133,  133,
-      133,   49,   16,  133,  133,  133,  133,  133,  133,  133,
-      133,  133,  133,  133,  133,  133,    0,    0,  107,  107,
-      107,    0,    0,  108,  107,  107,  108,  107,    0,    0,
-      107,  107,  107,  107,  107,    0,    0,    0,    0,  107,
-      107,    0,  107,    0,  107,    0,   86,  133,  133,   23,
+      103,  109,   45,  108,  111,   11,  150,   12,   13,  150,
+      150,  150,   32,   77,  150,   62,    3,   98,   47,  150,
+      150,  150,   74,  150,  150,  150,  150,   48,  150,  150,
+       40,  150,    6,  150,   92,  150,    8,   94,  150,  150,
+        0,  150,   53,   73,   15,  150,  123,  123,  150,  123,
+      123,  123,  150,  122,  150,    0,  124,  150,    0,    0,
+      124,    0,  124,  125,  124,    0,    0,    0,    0,  124,
+      124,  124,  124,  124,    0,  150,   56,   57,   58,   59,
+      150,   22,  150,  150,  150,  150,   31,  150,  150,  101,
+      102,    0,   19,  150,  150,  150,   86,  150,   33,  150,
 
-      133,  133,  133,  133,  133,  133,  133,  133,  133,  133,
-      133,  133,  133,   60,  133,  133,  133,  133,  133,  133,
-      133,   65,   66,  133,   85,  133,  133,  133,  133,  133,
-      133,  133,  133,  133,  133,  105,  105,  105,    0,  107,
-      107,    0,  107,    0,    0,  107,    0,  107,  108,  107,
-        0,    0,    0,  107,  107,    0,  107,  108,  107,    0,
-        0,    0,    0,    0,    0,    0,  107,  107,  107,  107,
-      107,    0,  133,  133,   51,   53,  133,  133,  133,  133,
-      133,  133,  133,  133,  133,  133,  133,  133,   61,  133,
-      133,   43,   73,   74,  133,  133,  133,  133,  131,  127,
+       79,   28,   27,  150,  150,   82,  150,  150,  150,   50,
+       17,  150,  150,  150,  150,  150,  150,  150,  150,  150,
+      150,  150,  150,    0,  150,  150,  123,  150,  150,  150,
+      150,  123,  123,  150,  122,  150,    0,    0,  124,  124,
+      124,    0,    0,  125,  124,  124,  125,  124,    0,    0,
+      124,  124,  124,  124,  124,    0,    0,    0,    0,  124,
+      124,    0,  124,    0,  124,    0,   96,  150,  150,  150,
+       24,  150,  150,  150,  150,  150,  150,  150,  150,  150,
+      150,  150,  150,  150,  150,   70,  150,  150,  150,  150,
+      150,  150,  150,   75,   76,  150,   95,  150,  150,  150,
 
-      133,  129,  128,  132,  133,  133,    0,    0,  107,  107,
-      107,  107,  107,  107,    0,    0,  108,  107,  107,  107,
-        0,    0,  107,  107,  107,  107,  107,    0,    0,    0,
-        0,    0,    0,    0,  107,  107,  107,  107,  107,    0,
-        0,    0,    0,    0,  107,  107,    0,  107,    0,  107,
-        0,  133,  133,  133,  133,  133,  133,  133,  133,  133,
-      133,  133,  133,  110,  109,  133,  133,   62,  133,  133,
-      133,  130,  126,  105,    0,  107,  107,    0,  107,  107,
-        0,  107,    0,    0,  107,    0,  107,  108,  107,    0,
-        0,    0,  107,  107,    0,  107,  108,  107,    0,    0,
+      150,  150,  150,  150,  150,  150,  150,  150,  150,  123,
+      123,  150,  123,  123,  123,  123,  150,  122,  150,    0,
+      124,  124,    0,  124,    0,    0,  124,    0,  124,  125,
+      124,    0,    0,    0,  124,  124,    0,  124,  125,  124,
+        0,    0,    0,    0,    0,    0,    0,  124,  124,  124,
+      124,  124,    0,  150,  150,  150,  150,   52,   63,  150,
+      150,  150,  150,  150,  150,  150,  150,  150,  150,  150,
+      150,   71,  150,  150,   44,   83,   84,  150,  150,  150,
+      150,   54,  148,  144,  150,  146,  145,  149,  150,    0,
+      150,  150,  123,  150,  150,  150,  123,  150,  122,  150,
 
-        0,    0,    0,  107,  107,    0,  107,  108,  107,    0,
-      107,  107,    0,    0,    0,    0,    0,    0,    0,  107,
-      107,  107,  107,  107,    0,   55,  133,  115,  122,  133,
-      133,  133,  133,  133,  133,  133,  133,  133,   56,   48,
-      133,  133,    0,    0,  107,  107,  107,  107,  107,  107,
-      107,  107,  107,    0,    0,  108,  107,  107,  107,    0,
-        0,  107,  107,  107,  107,  107,    0,    0,    0,    0,
-        0,    0,    0,  107,  107,  107,  107,  107,    0,  107,
-      107,    0,    0,    0,    0,    0,    0,    0,  107,  107,
-      107,  107,  107,    0,    0,    0,    0,    0,    0,  107,
+        0,    0,  124,  124,  124,  124,  124,  124,    0,    0,
+      125,  124,  124,  124,    0,    0,  124,  124,  124,  124,
+      124,    0,    0,    0,    0,    0,    0,    0,  124,  124,
+      124,  124,  124,    0,    0,    0,    0,    0,  124,  124,
+        0,  124,    0,  124,    0,  150,  150,  150,  150,  150,
+      150,  150,  150,  150,  150,  150,  150,  150,  127,  126,
+      150,  150,   72,  150,  150,  150,  147,  143,  150,  150,
+      123,  123,  123,  123,  150,  122,  150,    0,  124,  124,
+        0,  124,  124,    0,  124,    0,    0,  124,    0,  124,
+      125,  124,    0,    0,    0,  124,  124,    0,  124,  125,
 
-      107,    0,  107,    0,  107,    0,   79,  133,  133,  133,
-      133,  133,  133,  133,  133,  133,  133,  133,   50,    0,
-      107,  107,    0,  107,  107,    0,  107,  107,    0,  107,
-        0,  106,  107,    0,  107,  108,  107,    0,    0,    0,
-      107,  107,    0,  107,  108,  107,    0,    0,    0,    0,
-        0,  107,  107,    0,  107,  108,  107,    0,    0,    0,
-        0,    0,    0,  107,  107,    0,  107,  108,  107,    0,
-      107,  107,  107,    0,    0,    0,    0,    0,    0,    0,
-      107,  107,  107,  107,  107,    0,  133,  133,  133,  133,
-      133,  133,  133,  133,  120,  133,   80,    0,    0,  107,
+      124,    0,    0,    0,    0,    0,  124,  124,    0,  124,
+      125,  124,    0,  124,  124,    0,    0,    0,    0,    0,
+        0,    0,  124,  124,  124,  124,  124,    0,   65,  150,
+       55,  132,  139,  150,  150,  150,  150,  150,  150,  150,
+      150,  150,   66,   49,  150,  150,    0,  150,  150,  150,
+      150,  150,  122,  150,    0,    0,  124,  124,  124,  124,
+      124,  124,  124,  124,  124,    0,    0,  125,  124,  124,
+      124,    0,    0,  124,  124,  124,  124,  124,    0,    0,
+        0,    0,    0,    0,    0,  124,  124,  124,  124,  124,
+        0,  124,  124,    0,    0,    0,    0,    0,    0,    0,
 
-      107,  107,  107,  107,  107,  107,  107,  107,  107,  107,
-      107,    0,  106,  108,  107,  107,  107,    0,    0,  107,
-      107,  107,  107,  107,    0,    0,    0,    0,    0,    0,
-        0,  107,  107,  107,  107,  107,    0,  107,  107,    0,
-        0,    0,    0,    0,    0,    0,  107,  107,  107,  107,
-      107,    0,  107,  107,  107,    0,    0,    0,    0,    0,
-        0,    0,  107,  107,  107,  107,  107,    0,    0,    0,
-        0,    0,    0,  107,  107,    0,  107,    0,  107,    0,
-      133,  133,  133,  124,  133,  133,  133,  133,  133,  133,
-      133,  112,    0,  107,  107,    0,  107,  107,    0,  107,
+      124,  124,  124,  124,  124,    0,    0,    0,    0,    0,
+        0,  124,  124,    0,  124,    0,  124,    0,   89,  150,
+      150,  150,  150,  150,  150,  150,  150,  150,  150,  150,
+       51,  121,  121,  123,  123,  150,  122,  150,    0,  124,
+      124,    0,  124,  124,    0,  124,  124,    0,  124,    0,
+      121,  124,    0,  124,  125,  124,    0,    0,    0,  124,
+      124,    0,  124,  125,  124,    0,    0,    0,    0,    0,
+      124,  124,    0,  124,  125,  124,    0,    0,    0,    0,
+        0,    0,  124,  124,    0,  124,  125,  124,    0,  124,
+      124,  124,    0,    0,    0,    0,    0,    0,    0,  124,
 
-      107,    0,  107,  107,    0,  107,    0,    0,    0,  107,
-        0,    0,  107,  108,  107,    0,    0,    0,  107,  107,
-        0,  107,  108,  107,    0,    0,    0,    0,    0,  107,
-      107,    0,  107,  108,  107,    0,    0,    0,    0,    0,
-        0,  107,  107,    0,  107,  108,  107,    0,    0,    0,
-        0,    0,    0,  107,  107,    0,  107,  108,  107,    0,
-      107,  107,  107,    0,    0,    0,    0,    0,    0,    0,
-      107,  107,  107,  107,  107,    0,  133,  133,  133,  133,
-      114,  133,  133,  133,  118,  133,    0,    0,  107,  107,
-      107,  107,  107,  107,  107,  107,  107,  107,  107,  107,
+      124,  124,  124,  124,    0,  150,  150,  150,  150,  150,
+      150,  150,  150,  137,  150,   90,  121,  121,  123,  150,
+      121,  121,    0,    0,  124,  124,  124,  124,  124,  124,
+      124,  124,  124,  124,  124,  124,    0,  121,  125,  124,
+      124,  124,    0,    0,  124,  124,  124,  124,  124,    0,
+        0,    0,    0,    0,    0,    0,  124,  124,  124,  124,
+      124,    0,  124,  124,    0,    0,    0,    0,    0,    0,
+        0,  124,  124,  124,  124,  124,    0,  124,  124,  124,
+        0,    0,    0,    0,    0,    0,    0,  124,  124,  124,
+      124,  124,    0,    0,    0,    0,    0,    0,  124,  124,
 
-      107,  107,  107,    0,    0,    0,  108,    0,    0,  107,
-        0,    0,  107,  107,  107,    0,    0,    0,    0,    0,
-        0,    0,  107,  107,  107,    0,  107,  107,    0,    0,
-        0,    0,    0,    0,    0,  107,  107,  107,    0,  107,
-      107,  107,    0,    0,    0,    0,    0,    0,    0,  107,
-      107,  107,    0,  107,  107,  107,    0,    0,    0,    0,
-        0,    0,    0,  107,  107,  107,    0,    0,    0,    0,
-        0,    0,  107,  107,    0,  107,    0,  107,    0,  111,
-      123,  125,  119,  133,  133,  133,  133,    0,    0,  107,
-        0,  107,    0,  107,  107,    0,  107,  107,    0,  107,
+        0,  124,    0,  124,    0,  150,  150,  150,  141,  150,
+      150,  150,  150,  150,  150,  150,  129,  123,  150,  122,
+        0,  124,  124,    0,  124,  124,    0,  124,  124,    0,
+      124,  124,    0,  124,    0,    0,    0,  124,    0,    0,
+      124,  125,  124,    0,    0,    0,  124,  124,    0,  124,
+      125,  124,    0,    0,    0,    0,    0,  124,  124,    0,
+      124,  125,  124,    0,    0,    0,    0,    0,    0,  124,
+      124,    0,  124,  125,  124,    0,    0,    0,    0,    0,
+        0,  124,  124,    0,  124,  125,  124,    0,  124,  124,
+      124,    0,    0,    0,    0,    0,    0,    0,  124,  124,
 
-      107,    0,  107,  107,    0,  107,    0,    0,    0,    0,
-      107,  107,    0,  107,    0,    0,  107,  107,  107,    0,
-        0,    0,    0,  107,  107,  107,    0,    0,    0,    0,
-        0,  107,  107,  107,    0,    0,    0,    0,    0,  107,
-      107,  107,    0,    0,    0,    0,    0,  107,  107,  107,
-      107,  107,  107,    0,    0,    0,    0,    0,    0,    0,
-      107,  107,  107,    0,  133,  133,  133,  133,    0,    0,
-        0,  107,  107,  107,  107,  107,  107,    0,    0,    0,
-        0,  107,  107,    0,    0,    0,    0,  107,  107,  107,
-        0,    0,    0,    0,    0,  107,  107,  107,  107,    0,
+      124,  124,  124,    0,  150,  150,  150,  150,  131,  150,
+      150,  150,  135,  150,  121,    0,    0,  124,  124,  124,
+      124,  124,  124,  124,  124,  124,  124,  124,  124,  124,
+      124,  124,    0,    0,    0,  125,    0,    0,  124,    0,
+        0,  124,  124,  124,    0,    0,    0,    0,    0,    0,
+        0,  124,  124,  124,    0,  124,  124,    0,    0,    0,
+        0,    0,    0,    0,  124,  124,  124,    0,  124,  124,
+      124,    0,    0,    0,    0,    0,    0,    0,  124,  124,
+      124,    0,  124,  124,  124,    0,    0,    0,    0,    0,
+        0,    0,  124,  124,  124,    0,    0,    0,    0,    0,
 
-        0,    0,    0,    0,  107,  107,  107,  107,    0,    0,
-        0,    0,    0,  107,  107,  107,  107,    0,    0,    0,
-        0,    0,  107,    0,    0,    0,    0,    0,  107,  107,
-      107,  133,  133,  133,  121,  107,  107,  107,  107,  107,
-      107,  107,  107,    0,    0,    0,    0,  107,  107,    0,
-        0,  107,    0,    0,    0,  107,    0,    0,    0,  107,
-        0,    0,    0,  107,    0,    0,    0,  107,  107,  107,
-      107,    0,    0,    0,    0,    0,  107,  116,  133,  113,
-      107,    0,    0,  107,  107,    0,  107,  107,  107,    0,
-      107,  107,  107,    0,  107,  107,  107,    0,  107,  107,
+        0,  124,  124,    0,  124,    0,  124,    0,  128,  140,
+      142,  136,  150,  150,  150,  150,    0,    0,  124,    0,
+      124,    0,  124,  124,    0,  124,  124,    0,  124,  124,
+        0,  124,  124,    0,  124,    0,    0,    0,    0,  124,
+      124,    0,  124,    0,    0,  124,  124,  124,    0,    0,
+        0,    0,  124,  124,  124,    0,    0,    0,    0,    0,
+      124,  124,  124,    0,    0,    0,    0,    0,  124,  124,
+      124,    0,    0,    0,    0,    0,  124,  124,  124,  124,
+      124,  124,    0,    0,    0,    0,    0,    0,    0,  124,
+      124,  124,    0,  150,  150,  150,  150,    0,    0,    0,
 
-      107,    0,    0,    0,    0,  107,  117,  107,  107,    0,
-        0,    0,    0,    0,    0,  107,  107,  107,    0,    0,
-      107,  107,  107,  107,  107,    0,  107,  107,    0
+      124,  124,  124,  124,  124,  124,    0,    0,    0,    0,
+      124,  124,    0,    0,    0,    0,  124,  124,  124,    0,
+        0,    0,    0,    0,  124,  124,  124,  124,    0,    0,
+        0,    0,    0,  124,  124,  124,  124,    0,    0,    0,
+        0,    0,  124,  124,  124,  124,    0,    0,    0,    0,
+        0,  124,    0,    0,    0,    0,    0,  124,  124,  124,
+      150,  150,  150,  138,  124,  124,  124,  124,  124,  124,
+      124,  124,    0,    0,    0,    0,  124,  124,    0,    0,
+      124,    0,    0,    0,  124,    0,    0,    0,  124,    0,
+        0,    0,  124,    0,    0,    0,  124,  124,  124,  124,
+
+        0,    0,    0,    0,    0,  124,  133,  150,  130,  124,
+        0,    0,  124,  124,    0,  124,  124,  124,    0,  124,
+      124,  124,    0,  124,  124,  124,    0,  124,  124,  124,
+        0,    0,    0,    0,  124,  134,  124,  124,    0,    0,
+        0,    0,    0,    0,  124,  124,  124,    0,    0,  124,
+      124,  124,  124,  124,    0,  124,  124,    0
     } ;
 
 static yyconst flex_int32_t yy_ec[256] =
@@ -517,15 +568,15 @@
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    2,    5,    1,    1,    6,    1,    7,    1,    8,
         8,    9,    9,    1,   10,   11,    9,   12,   13,   14,
-       15,   16,   15,   17,   15,   15,   15,   18,    1,   19,
-       20,   21,    1,    1,   22,   22,   22,   22,   22,   22,
-       23,   23,   23,   23,   23,   23,   23,   23,   23,   23,
-       23,   23,   23,   23,   23,   23,   23,   24,   23,   23,
-       25,   26,   25,    1,   27,    1,   28,   29,   30,   31,
+       15,   16,   17,   18,   17,   17,   17,   19,    1,   20,
+       21,   22,    1,    1,   23,   23,   23,   23,   23,   23,
+       24,   24,   24,   24,   24,   24,   24,   24,   24,   24,
+       24,   24,   24,   24,   24,   24,   24,   25,   24,   24,
+       26,   27,   26,    1,   28,    1,   29,   30,   31,   32,
 
-       32,   33,   34,   35,   36,   23,   37,   38,   39,   40,
-       41,   42,   43,   44,   45,   46,   47,   48,   49,   50,
-       51,   23,    1,   52,    1,    1,    1,    1,    1,    1,
+       33,   34,   35,   36,   37,   24,   38,   39,   40,   41,
+       42,   43,   44,   45,   46,   47,   48,   49,   50,   51,
+       52,   24,    1,   53,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -542,1864 +593,2092 @@
         1,    1,    1,    1,    1
     } ;
 
-static yyconst flex_int32_t yy_meta[53] =
+static yyconst flex_int32_t yy_meta[54] =
     {   0,
         1,    2,    2,    1,    2,    1,    3,    2,    1,    4,
-        5,    6,    6,    6,    6,    6,    6,    7,    3,    3,
-        3,    8,    4,    9,    3,    1,    4,    8,    8,    8,
-        8,    8,    8,    4,    4,    4,    4,    4,    4,    4,
-        4,    4,    4,    4,    4,    4,    4,    4,    4,    9,
-        4,    3
+        5,    6,    6,    6,    6,    6,    6,    6,    7,    3,
+        3,    3,    8,    4,    9,    3,    1,    4,    8,    8,
+        8,    8,    8,    8,    4,    4,    4,    4,    4,    4,
+        4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
+        9,    4,    3
     } ;
 
-static yyconst flex_int16_t yy_base[1703] =
+static yyconst flex_int16_t yy_base[1919] =
     {   0,
-        0,    0, 3454,   52, 6570, 6570,   53, 3419,   59, 3431,
-     6570,   63, 6570,   80,   49,  131,   55, 3417,   62,  147,
-      186,  147,  106,   36,  129,  134,   55,  102,  111, 3395,
-      190,  193,  140,  113,  149,  198,  205,  148,  139, 3404,
-      211, 3395, 3379,  250, 6570,    0, 6570,    0,  248,  266,
-     3403,  258,    0,  288,  321, 6570, 6570, 6570, 6570, 6570,
-      305,    0,  344,   40,    0, 3389, 3376, 3371,  183, 3357,
-     3351, 3355, 3353, 3352,  192, 3361, 3330,  248, 3340,  213,
-     3329, 3327, 3340, 3325, 3330, 3328,  103, 3323, 3318, 3307,
-       38,  305,    0,    0,  165,  135, 3295, 3304,  244, 3287,
+        0,    0, 3907,   53, 7401, 7401,   54, 3884,   60, 3897,
+     7401,   82, 7401,  100,   31,  152,   47, 3882,   49,  169,
+      211,  169,   61,   44,  126,   61,   30,   63,   76,  158,
+      215,  218,  160,   32,  166,  117,  230,  236,  208, 3855,
+      174, 3847, 3832,  281, 7401,    0, 7401,  297,  320,  344,
+     3865,  368,    0,  375,    0,  409, 7401, 7401, 7401, 7401,
+     7401,  279,  297,    0, 3838, 3834, 3848,    0, 3847, 3821,
+     3834, 3831, 3819, 3813, 3813, 3816, 3815, 3799, 3808, 3793,
+     3806, 3789,  225, 3798, 3801, 3786, 3770, 3783, 3772, 3777,
+     3767, 3765,  121,   83, 3770, 3768,  129, 3757, 3752, 3761,
 
-     3284, 3287, 3290, 3266, 3274, 3265, 3264, 3270,    0, 3277,
-        0, 3260, 3266, 3251, 3252, 3232, 3232,  282, 3243, 3223,
-     3234, 3227,  220, 3209,  326, 3207,  302, 3206, 3218, 3204,
-        0, 3202, 3206, 3204, 3195, 3166, 3180, 6570, 6570,  378,
-      243,  417,  352, 3188,  439, 3193,  462,  320, 3185, 3160,
-     3151,    0,    0, 3148,  361, 3157, 3152, 3139, 3140, 3137,
-      502,    0,    0, 3133, 3103,    0, 3115,  272, 3099, 3112,
-     3114, 3095, 3098, 3102, 3087, 3066,    0, 3071, 3065,    0,
-        0, 3068, 3056,    0, 3068,    0, 3056, 3023, 3030,    0,
-        0, 3019,    0, 3027, 3034,  352, 3016,    0, 3014, 3021,
+      148,  228,    0,    0,   37,  169, 3749, 3758,  226, 3741,
+     3739, 3742, 3731, 3721, 3729, 3720, 3719, 3724,    0, 3732,
+        0, 3715, 3706, 3700, 3701, 3701, 3701,  234, 3710, 3693,
+     3690, 3683,   56, 3679,  243, 3677,  160, 3676, 3687,    0,
+     3673,    0, 3672, 3656, 3661, 3668, 3659, 3649, 3663, 7401,
+     7401,  434,  458,  274,  499,  523,  547, 3657,  554, 3664,
+      578,  293, 3655, 3630, 3635, 3625,    0,    0, 3630,    0,
+     3639, 3619, 3608, 3607, 3608, 3604, 3604, 3596,    0,    0,
+     3591, 3581,    0, 3593, 3588, 3575, 3589, 3592, 3574, 3558,
+     3557, 3554, 3569, 3552, 3556, 3536, 3538, 3551, 3536, 3535,
 
-        0, 3016,    0, 2999,    0, 2981, 2985, 2978, 2980, 2985,
-     2978, 2965,    0, 2963, 2956,    0, 2945,    0, 2944,    0,
-        0,    0, 2940,    0, 2938,  370,    0,    0, 2941,    0,
-     2938, 2918,  392,  531,  554, 2939, 2938, 2937, 2936,  562,
-      360, 2934, 2933,  399,  602,  624,  406,    0,    0, 2909,
-     2864, 2869,    0,    0, 2867,    0, 2866, 2852,    0, 2851,
-        0, 2845, 2847,    0,  479, 2840,    0,    0, 2848, 2830,
-     2831,    0,    0, 2829,    0,    0,    0,    0, 2843, 2834,
-     2841,    0, 2795, 2798, 2813, 2787, 2783, 2793, 2783,    0,
-     2782,    0, 2768,    0,  247,    0,    0, 2761,  455, 2769,
+        0, 3539, 3533,    0,    0, 3537, 3527,    0, 3518,    0,
+     3515, 3502, 3509,    0,    0, 3497,    0, 3506, 3514,  272,
+     3496,    0, 3480, 3496,    0, 3491,    0, 3494,    0, 3474,
+     3478, 3472, 3475, 3471, 3444, 3440,    0, 3438, 3450,    0,
+     3438,    0, 3437,    0,    0,    0, 3434,    0,  171,  202,
+     3445,    0,    0, 3421,    0, 3418, 3419,  618, 3449,  641,
+      665, 3446,  672,  481,  115,  696, 3437,  720, 3436, 3435,
+      728,  294, 3420, 3419,  488,  769,  792, 3417,    0,    0,
+     3392,  381, 3395, 3399,    0,    0,    0, 3382,    0, 3381,
+     3382, 3366,    0, 3364,    0, 3358, 3360,    0, 3343, 3342,
 
-        0,    0,  647,  374, 2795, 2787, 2785,  686, 2784, 2783,
-      708,  491,  731,  753,  515,    0, 2743,  375,  522,  776,
-      585,  799,  376, 2742, 2748, 2718,    0, 2727, 2725, 2708,
-        0, 2725, 2707,  818,    0, 2697, 2686, 2704,    0, 2695,
-        0, 2698, 2691,    0,    0, 2701, 2650,  395, 2649, 2667,
-      356, 2664,    0, 2653, 2644, 2658, 2651, 2645, 2638, 2626,
-     2627, 2620, 2625, 2640,  591,  854, 2649, 2628,  877,  412,
-     2627, 2626, 2625, 2624,  917,  413, 2622, 2621,  474,  661,
-      957,  668,  980,  414, 2620, 2606, 2598,  653,    0,  447,
-     2597,  674, 1020, 1042,  822,    0,    0, 2586, 2567,    0,
+        0,    0,    0,    0,    0,  595, 3349,    0,    0, 3355,
+     3325, 3324,    0,    0, 3313,    0,    0,    0,    0, 3328,
+     3311, 3318,    0, 3310, 3294, 3310, 3283, 3279, 3290, 3279,
+        0, 3278,    0, 3264,    0,  261,    0,    0, 3247, 3241,
+      720, 3247,    0,    0,    0,  817,  841,  296,  882, 3274,
+     3273,  405,  905,  929,  953, 3242,  960,  602, 3241, 3240,
+      983,  757, 1007, 1030, 3239,    0, 3236,  408,  409, 1054,
+     3235, 1078,  297, 3224, 3210, 3179,    0,    0,    0,    0,
+     3173,    0, 3183, 3182, 3150, 3148,    0, 3165, 3160,    0,
+        0, 1097,    0, 3148, 3126, 3140,    0, 3131,    0, 3135,
 
-     2560, 2566, 2579, 2564, 2567, 2566,  469, 2552,  475, 2552,
-     2560, 2547, 2557,    0, 2547, 2536, 2527, 2532, 2531, 2519,
-     2518,    0,    0, 2522,    0, 2504, 2496, 2509, 2503, 2497,
-     2491, 2489, 2472, 2477, 2476, 1064,  499, 2498, 2489, 1103,
-     2488, 1125, 2487, 2473, 2472, 1147,  828, 1170, 1192,  900,
-        0,  906,    0,  448, 2471,  939, 1215, 1237,  946,    0,
-      598, 1003, 2477, 1010,  599, 1078, 1260, 1085, 1283,  531,
-     2466, 2472, 2423, 2428,    0,    0, 2431, 2433, 2419, 2418,
-     2430, 2413, 2398, 2405, 2396, 2396, 2392, 2389,    0, 2380,
-     2373,    0,    0,    0, 2385, 2350, 2355, 2342,    0,    0,
+     3112,    0,    0, 3121, 3101,  366, 3089, 3104,  371, 3101,
+        0, 3090, 3060, 3063, 3053, 3048, 3059, 3052, 3038, 3039,
+     3032, 3038, 3053, 1134, 3062, 1157, 1181, 3059, 1188,  864,
+      165, 1212,  314, 1252, 1275, 1299, 3047, 3036, 1307,  315,
+     3014, 3013, 3012, 3010, 1348,  317, 3008, 3007,  496,  612,
+     1389, 3006, 1413,  321, 2981, 2988, 2979,  871,    0,  352,
+     2978, 1101, 1454, 1477, 2976,    0,    0, 2948, 2964, 2930,
+        0, 2939, 2923, 2928, 2940, 2925, 2940, 2939,  369, 2911,
+      408, 2911, 2916, 2904, 2914,    0, 2904, 2901, 2892, 2896,
+     2892, 2881, 2848,    0,    0, 2852,    0, 2847, 2838, 2850,
 
-     2343,    0,    0,    0, 2332, 1322, 2343, 2342, 1345,  532,
-     2341, 1385,  533, 2340, 2337, 2335, 2325, 1425,  561, 2324,
-      681, 1092, 1465, 1306, 1488,  597, 2303, 2309,  682, 1313,
-     2308, 1368,  683, 1375, 1528, 1408, 1551,  601, 2299, 2303,
-     1070,    0, 1414,    0,  540, 2295, 1447, 1591, 1613, 1454,
-        0, 2252, 2252, 2254, 2251, 2255, 2263, 2254, 2234, 2214,
-     2207, 2228, 2222,    0,    0, 2220, 2205,    0, 2203, 2198,
-     2185,    0,    0,    0, 2213, 1635, 1658, 1680, 1511, 1703,
-     1725, 1518, 2211, 2210, 1747, 1573, 1770, 1792, 1580,    0,
-     1814,    0,  632, 2209, 1820, 1827, 1849, 1872,    0, 1878,
+     2849, 2843, 2824, 2818, 2816, 2821, 2826, 2824, 1502, 1526,
+      404, 1567, 2847, 2846,  614, 1591, 1615, 1622, 1646, 2822,
+     1653, 1677, 1700, 2821, 2820, 2819, 1723, 1108, 1747, 1770,
+     2818,    0, 1235,    0,  442, 2816, 1242, 1794, 1817, 2815,
+        0,  739,  766, 2822,  466,  786,  817, 1841, 2799, 1865,
+      433, 2798, 2805,  510, 2769, 2774, 2770,    0,    0, 2775,
+     2777, 2748, 2748, 2760, 2743, 2742, 2748, 2740, 2741, 2738,
+     2737,    0, 2728, 2722,    0,    0,    0, 2735, 2730, 2735,
+     2722,    0,    0,    0, 2711,    0,    0,    0, 2700, 1905,
+     2735, 1928, 1952, 2733, 1959,  358, 1983, 2007, 2014, 2038,
 
-        0, 1884,    0,  693, 2177, 1890, 1897, 1919, 1942,    0,
-      685, 1948, 2183,  848, 1955, 2178, 1962,  850, 1969, 1976,
-     1999, 2006,  704, 2170, 2176,  297,  700,  685,  955,  956,
-     2015, 1018,  745,  318,  746, 2016,  617,  769,  433,  686,
-     1103, 2019, 2137, 2136, 2048,  728, 2135, 2088,  750, 2130,
-     2128,  796, 2129, 2097, 2093, 2091, 2168,  798, 2090,  914,
-     2036, 2208, 2071, 2231,  801, 2089, 2064, 1099, 2078, 2063,
-     2111, 1100, 2118, 2271, 2151, 2294,  802, 2055, 2058,  823,
-     2157, 2022, 1321, 2191, 2020, 2198, 1382, 2254, 2334, 2261,
-     2357,  829, 1985, 1991,    0, 2316,    0, 2322,    0,  739,
+     2724, 2722, 2046,  457, 2721, 2087,  493, 2720, 2705, 2704,
+     2703, 2128,  494, 2702,  879,  899, 2169, 2701, 2193,  523,
+     2699, 2706, 1128, 1130, 2705, 2689, 1251, 1317, 2234, 2680,
+     2258,  524, 2679, 2686, 1331,    0, 1338,    0,  467, 2677,
+     1371, 2299, 2322, 2674,    0, 2345,  354,  390,  534,  535,
+      622,  276,  591, 2645,  241,  551,  433, 1129, 2630, 2629,
+     1247, 2628, 2627, 1343,  854,  503, 2626, 2624, 2383, 2420,
+     2456, 2492,  553, 2516,  650, 2524, 2548, 2651, 2555, 2579,
+     2602, 2650, 2626, 2649, 2634, 2633, 2632, 2672, 1379, 2696,
+     2719, 2631,    0, 1436,    0,  680, 2629, 1443, 2743, 2766,
 
-     1983, 2379, 2397, 2419, 2386,    0,  770,  792,  848,  974,
-     1019, 1033, 1102, 1141, 1162, 1589, 1118, 1462,  791, 1982,
-     2441, 2464, 2486, 2509, 2516, 2538, 2561, 2568, 2590, 2613,
-     1981, 1979, 2619, 2641, 2648, 2670, 2693,    0, 2699,    0,
-      740, 1978, 2705, 2712, 2734, 2757,    0, 2763,    0, 2769,
-        0,  885, 1977, 2775, 2782, 2804, 2827,    0,    0, 2833,
-        0, 2839,    0,  886, 1927, 2845, 2852, 2874, 2897,    0,
-        0,  831, 2903, 1931, 1587, 2910, 1929, 2917, 1629, 2924,
-     2931, 2954, 2961,  953, 1906, 1909, 1590, 2395, 2396, 1321,
-     1185, 1464, 1527, 1164, 1463, 1117,  916, 1855, 1852, 3001,
+     2627,    0, 1549,    0, 1556,    0,  681, 2611, 1888, 2790,
+     2813, 2610,    0,  555, 1895, 2617, 1451, 1471, 2616, 2615,
+     1502, 1564, 2837, 2605, 2861,  615, 2604, 2611,  617,  688,
+      634,  768, 1251, 1388, 2056, 1453,  808,  834,  898, 2083,
+      766,  923,  810,  833, 2081, 2085, 2903,  835, 2926,  921,
+     2949, 2114, 2973, 2997, 2587, 2586, 3005,  642, 2585, 3046,
+      643, 2584, 3087,  671, 2582, 2581, 2580, 2564, 3128,  742,
+     2563, 1694, 1904, 3169, 2562, 3193,  902, 2561, 2568, 2056,
+     2057, 2566, 2565, 2063, 2123, 3234, 2556, 3258,  930, 2555,
+     2541,  931, 2151, 2540, 2124, 2125, 2539, 2538, 2145, 2166,
 
-      957, 1833, 3041, 1016, 1797, 3081, 1017, 1776, 3121, 1143,
-     1775, 1752, 1733, 3160, 3183, 1147, 1730, 1674, 2984, 3223,
-     2991, 3246, 1166, 1689, 1671, 2021, 3024, 1651, 3031, 2125,
-     3064, 3286, 3071, 3309, 1189, 1636, 1623, 1210, 3103, 1607,
-     2330, 3110, 1604, 3144, 2393, 3151, 3349, 3206, 3372, 1211,
-     1596, 1565,    0, 1212, 3212, 1560, 2435, 3269, 1544, 3276,
-     3078, 3332, 3412, 3339, 3435, 1214, 1531, 1536,    0, 3394,
-        0, 3400,    0,  926, 1497, 3457, 3475, 3497, 3464,    0,
-     2030, 3505, 3506, 1230, 3490, 1526, 1253, 3508, 1696, 1275,
-     1276, 1231, 1495, 3538, 3561, 3583, 3525, 3606, 3628, 3651,
+     3299, 2529, 3323,  954, 2527, 2534,    0, 2216,    0, 2223,
+        0,  737, 2525, 2281, 3364, 3387, 2524,    0,  897,  975,
+      976, 1000, 1904, 1001, 1566, 1022, 1046, 2276, 1047, 2105,
+     1048, 3412, 3435, 3459, 1029, 3499, 3523, 3547, 2501, 3554,
+     3578, 3601, 2500, 3625, 3648, 2499, 3672, 3695, 2498, 2497,
+     2495, 3718, 2368, 3742, 3765, 2494,    0, 2406,    0,  969,
+     2493, 2443, 3789, 3812, 2492,    0, 2463,    0, 2470,    0,
+     1016, 2445, 2477, 3836, 3859, 2443,    0,    0, 2484,    0,
+     2884,    0, 1087, 2429, 2891, 3883, 3906, 2428,    0,    0,
+     1077, 3028, 2434, 2231, 2295, 2431, 2397, 2296, 2316, 3930,
 
-     3658, 3680, 3703, 3710, 3732, 3755, 1468, 3762, 1259, 1466,
-     1430, 3784, 3802, 1428, 3791,    0, 3824,    0, 1200, 1427,
-     3830, 3837, 1426, 3860,    0, 3866,    0, 3872,    0, 1329,
-     1392, 3878, 3885, 1390, 3908,    0,    0, 3914,    0, 3920,
-        0, 1331, 1352, 3926, 3933, 1348, 3956,    0,    0, 3962,
-        0, 3968,    0, 1393, 1346, 3974, 3981, 1325, 4004,    0,
-        0, 1322, 4010, 1330, 3159, 4017, 1299, 4024, 3219, 4031,
-     4038, 4061, 4068, 1344, 1263, 1268, 1650, 1695, 1717, 1423,
-     1277, 1651, 4077, 1718, 1424, 3538, 1238, 4107, 4130, 1461,
-     1224, 4170, 1464, 1201, 4210, 1524, 1199, 4250, 1527, 1152,
+     2375, 3954, 1080, 2347, 2354, 2359, 2360, 2361, 2127, 1128,
+     2233, 2298, 1071, 2362, 1203, 1072, 1126, 1150, 3996, 4020,
+     4029, 1204, 2345, 2331, 4047, 1107, 2330, 4088, 1110, 2329,
+     4129, 1157, 2325, 4170, 1158, 2324, 2306, 2305, 4210, 4234,
+     1159, 2286, 2414, 2415, 4275, 2283, 4299, 1182, 2282, 2289,
+     2596, 2643, 2273, 2269, 2899, 2900, 4340, 2259, 4364, 1187,
+     2241, 2248, 1246, 3035, 2247, 2903, 3043, 2244, 2243, 3056,
+     3062, 4405, 2202, 4429, 1248, 2201, 2208,    0, 1249, 3110,
+     2204, 3063, 3084, 2203, 2183, 3104, 3123, 4470, 2174, 4494,
+     1252, 2171, 2167,    0, 3151,    0, 3216,    0, 1166, 2154,
 
-     4290, 1528, 1148, 1108, 4093, 4330, 1104, 4153,    0, 1103,
-     3408, 4160, 4353, 4193, 1051, 1057, 3471, 4200, 1052, 4233,
-     3472, 4240, 4376, 4273, 1029, 1033, 1586, 4279, 1028, 3534,
-     4313,  994, 4320, 3535, 4399, 4406, 4429,  962,  967,    0,
-     1588, 4435,  965, 3577, 4442,  931, 4449, 4078, 4456, 4463,
-     4486,  922,  925,    0, 1609, 4492,  913, 4103, 4499,  891,
-     4506, 4106, 4513, 4520, 4543,  860,  866,    0, 4549,    0,
-     4555,    0, 1394,  838, 4561, 4568,    0, 4591,    0, 1629,
-     1673, 1739, 1762, 1763, 2477, 4582, 4583, 4612, 1631,    0,
-      785, 4652,    0, 4600, 4675,    0, 4635, 4698,    0, 4642,
+     3223, 4535, 4558, 2135,    0, 3268, 3269, 3333, 1206, 2399,
+     2363, 1407, 3252, 2275, 1469, 1493, 1347, 4583, 4607, 4616,
+     2105, 4633, 4657, 4680, 2075, 4704, 4727, 2073, 4751, 4774,
+     2070, 4798, 4821, 2068, 2067, 4845, 1276, 2066, 2064, 3286,
+     4886, 2054, 2051,    0, 3350,    0, 1535, 2023, 3482, 4910,
+     2021, 2020,    0, 3489,    0, 3977,    0, 1576, 2019, 3984,
+     4934, 2017, 2016,    0,    0, 4036,    0, 4070,    0, 1599,
+     2015, 4077, 4958, 1991, 1989,    0,    0, 4111,    0, 4118,
+        0, 1630, 1986, 4152, 4982, 1985, 1911,    0,    0, 1386,
+     4159, 1876, 3125, 3145, 1857, 1832, 3164, 3166, 5006, 1819,
 
-     4721,    0, 4744, 4751,    0, 4774, 4247, 4781, 4788, 4811,
-      777,  624,  618,  610, 4817,    0, 1756,  608,  571, 4823,
-        0, 4829,    0, 1800,  570,  569,    0, 4835,    0, 4841,
-        0, 1801,  536,  534,    0, 4847,    0, 4853,    0, 1835,
-      532,  523,    0, 4859,    0, 4865,    0, 1836,  522,  504,
-        0, 1634, 4871,  510, 4327, 4878,  476, 4885, 4649, 4892,
-     4899, 4922,    0,  471, 2206, 1786, 1842, 2086, 4929,  463,
-     4952,    0,    0,    0,    0,    0,    0, 4958,    0, 1857,
-      426,  424,    0, 4965, 4966,  430, 4979,    0, 1679, 4985,
-      386, 4992, 4993,  374, 5006,    0,    0, 1680, 5012,  371,
+     5030, 1389, 1803, 1807, 1495, 1669, 1670, 1520, 1671, 1741,
+     4168, 1692, 1716, 2401, 5072, 1776, 5089, 5113, 1390, 1775,
+     5154, 1453, 1753, 5195, 1561, 1752, 5236, 1566, 1730, 5277,
+     1568, 1729, 1728, 4196, 5318, 1724, 1709,    0, 1708, 3231,
+     3294, 5342, 1705, 1631, 1633, 3333, 3360, 1632, 1602, 3381,
+     3412, 5366, 1573, 1569, 1541, 1591, 4257, 1534, 3498, 3595,
+     1518, 1517, 3642, 3689, 5390, 1505, 1480, 1469,    0, 1621,
+     4264, 1464, 4180, 4181, 1463, 1423, 4205, 4209, 5414, 1394,
+     1391, 1398,    0, 1622, 4322, 1363, 4272, 4316, 1361, 1359,
+     4335, 4337, 5438, 1350, 1316, 1323,    0, 4387,    0, 4394,
 
-     5019, 5020,  370, 5033,    0,    0, 1702, 5039,  368, 5046,
-     5047,  329, 5060,    0,    0, 1747, 5066,  318, 5073, 5074,
-      274, 5087,    0,    0, 5093,    0, 5099,    0, 1905,  229,
-        0, 2269, 2529, 1911, 1912,    0, 6570,    0,    0,    0,
-        0,    0,    0, 5106, 5120,  235, 5127,    0, 6570, 5112,
-        0, 6570,    0, 5133,    0, 6570,    0, 5145,    0, 6570,
-        0, 5151,    0, 6570,    0, 5157,    0, 6570,    0, 1767,
-     5163,  201, 5170, 5171,  199, 5184,    0, 2017, 2330, 2087,
-        0, 5190,    0, 1824, 5196,  198,    0, 1826, 5202,  179,
-        0, 1893, 5209,  133,    0, 1894, 5215,  132,    0, 2017,
+        0, 1756, 1314, 4452, 5462,    0, 1312,    0, 1740, 1763,
+     1764, 1786, 1787, 1974, 4488, 4504, 5486, 1623,    0, 1310,
+     5527,    0, 1276, 5551,    0, 1259, 5575,    0, 1253, 5599,
+        0, 1221, 5623,    0, 1217, 4402, 4446, 5647, 1196, 1114,
+     1108,   88,  138, 4460,    0, 1826,  214,  229, 4521,    0,
+     4623,    0, 1850,  322,  345,    0, 4868,    0, 4875,    0,
+     1874,  416,  460,    0, 5053,    0, 5060,    0, 1914,  501,
+      508,    0, 5079,    0, 5136,    0, 1937,  524,  580,    0,
+     1650, 5143,  589, 4531, 4552,  610,  611, 4632, 4674, 5671,
+      605,    0,  632, 2418, 1788, 1811, 1834, 5695,  627,  696,
 
-     5221,   95,    0, 5227,    0, 6570, 2166, 2127, 5233,   94,
-        0,    0,    0,    0,    0,    0, 2167, 5239,   65,    0,
-        0,    0,    0,    0,    0,    0,    0,    0, 6570, 5256,
-     5264, 5268, 5271, 5274, 5277, 5280, 5283, 5286, 5289, 5292,
-     5295, 5298, 5301, 5304, 5307, 5310, 5314, 5318, 5321, 5324,
-     5327, 5330, 5333, 5337, 5341, 5344, 5348, 5350, 5353, 5356,
-     5359, 5362, 5365, 5369, 5371, 5375, 5380, 5384, 5387, 5390,
-     5393, 5396, 5399, 5402, 5405, 5409, 5413, 5417, 5422, 5426,
-     5429, 5432, 5436, 5438, 5441, 5444, 5447, 5450, 5453, 5457,
-     5459, 5462, 5465, 5469, 5471, 5474, 5479, 5484, 5488, 5492,
+        0,    0,    0,    0,    0,    0, 5177,    0, 1967,  698,
+      699,    0, 4721, 4768,  709,  710,    0, 1652, 5184,  713,
+     4815, 4883,  741,  744,    0,    0, 1653, 5218,  778, 5088,
+     5192,  801,  803,    0,    0, 1816, 5259,  805, 5212, 5231,
+      808,  828,    0,    0, 1838, 5300,  849, 5233, 5253,  856,
+      858,    0,    0, 5307,    0, 5509,    0, 1968,  883,    0,
+     3083, 2964, 2161, 1921,    0, 7401,    0,    0,    0,    0,
+        0,    0, 5315, 5503,  892,  895,    0, 7401, 5517,    0,
+     7401,    0, 5718,    0, 7401,    0, 5725,    0, 7401,    0,
+     5732,    0, 7401,    0, 5739,    0, 7401,    0, 1840, 5746,
 
-     5496, 5501, 5505, 5508, 5511, 5514, 5517, 5520, 5523, 5526,
-     5530, 5534, 5538, 5542, 5547, 5551, 5555, 5559, 5562, 5567,
-     5571, 5576, 5580, 5584, 5588, 5591, 5594, 5597, 5601, 5603,
-     5608, 5612, 5615, 5618, 5621, 5624, 5628, 5630, 5633, 5636,
-     5640, 5642, 5645, 5648, 5651, 5655, 5657, 5660, 5663, 5668,
-     5672, 5677, 5681, 5685, 5689, 5694, 5698, 5701, 5704, 5707,
-     5710, 5713, 5716, 5719, 5723, 5727, 5731, 5735, 5740, 5744,
-     5748, 5752, 5755, 5760, 5764, 5769, 5773, 5777, 5781, 5784,
-     5787, 5792, 5796, 5801, 5805, 5809, 5813, 5816, 5819, 5822,
-     5826, 5828, 5833, 5837, 5840, 5843, 5846, 5849, 5852, 5855,
+      898, 5754, 5755,  937, 2022,    0, 1975, 3341, 2062,    0,
+     5755,    0, 1841, 5769,  946,    0, 1899, 5776,  973,    0,
+     1901, 5783,  976,    0, 1902, 5795,  996,    0, 1929, 5802,
+     1020,    0, 5809,    0, 7401, 2185, 1956, 5816, 1040,    0,
+        0,    0,    0,    0,    0, 1958, 5823, 1041,    0,    0,
+        0,    0,    0,    0,    0,    0,    0, 7401, 5841, 5849,
+     5853, 5856, 5859, 5862, 5865, 5868, 5871, 5874, 5877, 5880,
+     5883, 5886, 5889, 5892, 5895, 5898, 5901, 5905, 5909, 5912,
+     5915, 5918, 5921, 5924, 5927, 5930, 5933, 5937, 5941, 5944,
+     5947, 5951, 5953, 5956, 5959, 5962, 5965, 5968, 5971, 5974,
 
-     5859, 5861, 5864, 5867, 5870, 5874, 5876, 5879, 5882, 5885,
-     5888, 5892, 5894, 5897, 5900, 5903, 5906, 5910, 5912, 5915,
-     5918, 5921, 5926, 5930, 5935, 5939, 5943, 5947, 5952, 5956,
-     5959, 5962, 5965, 5968, 5971, 5974, 5977, 5980, 5984, 5988,
-     5992, 5996, 6001, 6005, 6009, 6013, 6016, 6021, 6025, 6030,
-     6034, 6038, 6042, 6045, 6048, 6053, 6057, 6062, 6066, 6070,
-     6074, 6077, 6080, 6085, 6089, 6094, 6098, 6102, 6106, 6109,
-     6112, 6115, 6119, 6121, 6124, 6129, 6133, 6136, 6139, 6142,
-     6145, 6148, 6151, 6155, 6159, 6162, 6166, 6169, 6172, 6176,
-     6178, 6181, 6184, 6188, 6190, 6193, 6196, 6199, 6203, 6205,
+     5977, 5981, 5983, 5986, 5990, 5995, 5999, 6002, 6006, 6009,
+     6012, 6015, 6018, 6021, 6024, 6027, 6031, 6035, 6038, 6042,
+     6046, 6051, 6055, 6057, 6061, 6064, 6068, 6071, 6074, 6078,
+     6080, 6083, 6086, 6089, 6092, 6095, 6098, 6101, 6104, 6107,
+     6111, 6113, 6116, 6119, 6122, 6126, 6128, 6131, 6134, 6139,
+     6143, 6148, 6152, 6154, 6158, 6161, 6165, 6170, 6174, 6177,
+     6180, 6183, 6186, 6189, 6192, 6195, 6199, 6203, 6206, 6210,
+     6214, 6219, 6223, 6225, 6229, 6232, 6236, 6239, 6244, 6248,
+     6253, 6257, 6259, 6263, 6266, 6270, 6273, 6276, 6279, 6283,
+     6285, 6288, 6293, 6297, 6300, 6303, 6306, 6309, 6312, 6315,
 
-     6208, 6211, 6214, 6218, 6220, 6223, 6226, 6229, 6233, 6235,
-     6238, 6241, 6246, 6250, 6255, 6259, 6263, 6267, 6272, 6276,
-     6279, 6282, 6285, 6288, 6291, 6294, 6297, 6301, 6303, 6306,
-     6310, 6315, 6318, 6321, 6326, 6330, 6335, 6338, 6341, 6344,
-     6349, 6353, 6358, 6361, 6364, 6367, 6372, 6376, 6381, 6384,
-     6387, 6390, 6395, 6399, 6404, 6407, 6410, 6413, 6416, 6420,
-     6422, 6427, 6431, 6434, 6437, 6440, 6443, 6446, 6449, 6453,
-     6458, 6461, 6464, 6467, 6470, 6473, 6476, 6479, 6482, 6485,
-     6488, 6491, 6496, 6500, 6503, 6506, 6509, 6513, 6517, 6521,
-     6525, 6529, 6532, 6535, 6539, 6542, 6545, 6548, 6551, 6554,
+     6318, 6321, 6325, 6327, 6330, 6333, 6336, 6340, 6342, 6345,
+     6348, 6351, 6354, 6358, 6360, 6363, 6366, 6369, 6374, 6378,
+     6383, 6387, 6389, 6393, 6396, 6400, 6405, 6409, 6412, 6415,
+     6418, 6421, 6424, 6427, 6430, 6434, 6438, 6441, 6445, 6449,
+     6454, 6458, 6460, 6464, 6467, 6471, 6474, 6479, 6483, 6488,
+     6492, 6494, 6498, 6501, 6505, 6508, 6511, 6516, 6520, 6525,
+     6529, 6531, 6535, 6538, 6542, 6545, 6548, 6551, 6555, 6557,
+     6560, 6565, 6569, 6572, 6575, 6578, 6581, 6584, 6587, 6590,
+     6593, 6596, 6599, 6602, 6606, 6608, 6611, 6614, 6617, 6620,
+     6624, 6626, 6629, 6632, 6635, 6638, 6641, 6645, 6647, 6650,
 
-     6558, 6561
+     6653, 6656, 6659, 6662, 6666, 6668, 6671, 6674, 6677, 6680,
+     6685, 6689, 6694, 6698, 6700, 6704, 6707, 6711, 6716, 6720,
+     6723, 6726, 6729, 6732, 6735, 6738, 6741, 6744, 6747, 6751,
+     6755, 6758, 6762, 6766, 6771, 6775, 6777, 6781, 6784, 6788,
+     6791, 6796, 6800, 6805, 6809, 6811, 6815, 6818, 6822, 6825,
+     6828, 6833, 6837, 6842, 6846, 6848, 6852, 6855, 6859, 6862,
+     6865, 6870, 6874, 6879, 6883, 6885, 6889, 6892, 6896, 6899,
+     6902, 6905, 6909, 6911, 6914, 6917, 6922, 6926, 6929, 6932,
+     6935, 6938, 6941, 6944, 6947, 6950, 6953, 6956, 6959, 6963,
+     6967, 6970, 6973, 6977, 6980, 6983, 6987, 6989, 6992, 6995,
+
+     6999, 7001, 7004, 7007, 7010, 7014, 7016, 7019, 7022, 7025,
+     7029, 7031, 7034, 7037, 7040, 7044, 7046, 7049, 7052, 7057,
+     7061, 7066, 7070, 7072, 7076, 7079, 7083, 7088, 7092, 7095,
+     7098, 7101, 7104, 7107, 7110, 7113, 7116, 7120, 7122, 7125,
+     7129, 7134, 7138, 7139, 7142, 7147, 7151, 7156, 7160, 7161,
+     7164, 7167, 7172, 7176, 7181, 7185, 7186, 7189, 7192, 7197,
+     7201, 7206, 7210, 7211, 7214, 7217, 7222, 7226, 7231, 7235,
+     7236, 7239, 7242, 7245, 7249, 7251, 7256, 7260, 7263, 7266,
+     7269, 7272, 7275, 7278, 7282, 7287, 7291, 7292, 7295, 7298,
+     7301, 7304, 7307, 7310, 7313, 7316, 7319, 7322, 7327, 7331,
+
+     7334, 7337, 7340, 7344, 7348, 7352, 7356, 7360, 7363, 7366,
+     7370, 7373, 7376, 7379, 7382, 7385, 7389, 7392
     } ;
 
-static yyconst flex_int16_t yy_def[1703] =
+static yyconst flex_int16_t yy_def[1919] =
     {   0,
-     1329,    1, 1329, 1329, 1329, 1329, 1329, 1329, 1330, 1329,
-     1329, 1329, 1329, 1329,   14, 1329, 1329, 1329, 1329,   14,
-       20, 1331,   20,   20,   20,   20,   20,   20,   21,   21,
+     1458,    1, 1458, 1458, 1458, 1458, 1458, 1458, 1459, 1458,
+     1458, 1458, 1458, 1458,   14, 1458, 1458, 1458, 1458,   14,
+       20, 1460,   20,   20,   20,   20,   20,   20,   21,   21,
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21, 1329, 1329, 1329, 1332, 1329,   21,   21,   20,
-     1333,   50,   21,   21, 1329, 1329, 1329, 1329, 1329, 1329,
-     1331, 1331,   50,   63,   21,   21,   21,   21,   63,   21,
-       21,   21,   21,   21,   63,   21,   21,   21,   21,   63,
+       21,   21, 1458, 1458, 1458, 1461, 1458,   21,   21,   20,
+     1462,   50,   21,   21,   21, 1458, 1458, 1458, 1458, 1458,
+     1458,   49, 1460, 1460,   52,   52,   52,   21,   21,   21,
+       21,   52,   21,   21,   52,   21,   21,   21,   52,   21,
+       21,   21,   21,   21,   52,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21, 1458,
+     1458,   21,   21,  153,   21,   21,  156, 1463, 1458,   54,
+     1458,  161, 1464,   21,   21,  157,   21,   21,   21,  157,
+       21,   21,   21,   21,   21,   21,  157,   21,   21,   21,
+       21,   21,   21,   21,  157,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,  260,  261,  157, 1465,  266, 1466, 1467,
+     1458,  271, 1468, 1469, 1458, 1458, 1458, 1470, 1471,   21,
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
 
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   21,   21,   21,   21, 1329, 1329,   21,
-      140,   50,  142, 1334, 1329,   54, 1329,  147, 1335,   21,
-       21,   21,   21,   21,  142,   21,   21,   21,   21,   21,
-      142,   21,   21,   21,   21,   21,   21,  161,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,  347,   21,  261,
+      263,  261,  263,  263,  354, 1472, 1458,  353, 1473, 1474,
+     1458, 1458, 1458, 1458, 1475, 1476, 1477, 1478, 1478, 1458,
+     1479, 1458,  372, 1480, 1471,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,  426,
+      427,  427,  432,  426,  354,  435, 1481, 1482, 1458,  439,
+     1483, 1458, 1484, 1485, 1458,  445, 1486, 1487, 1488, 1488,
+     1458, 1489, 1458,  453, 1490, 1476, 1458, 1458, 1491, 1492,
+     1458, 1458, 1458, 1458, 1493, 1494,   21,   21,   21,   21,
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
 
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   21,   21, 1336,   21, 1337, 1338, 1329,
-      240, 1339, 1340, 1329, 1329, 1329,  245, 1341,   21,   21,
+      510,   21,  427,  429,  427,  427,  516,  435,  518, 1495,
+     1458, 1458, 1458, 1496, 1497, 1498, 1458, 1458, 1458, 1458,
+     1499, 1500, 1458, 1501, 1502, 1458, 1458, 1458, 1458, 1503,
+     1504, 1505, 1505, 1491, 1492, 1506, 1506, 1458, 1507, 1458,
+      550, 1508, 1509,   21,   21,   21,   21,   21,   21,   21,
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
        21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       21,   21,   21,   21,   21,  593,  593,  597,  518,  599,
 
-       21,   21,   21,  303,  234,  235, 1342, 1329, 1343, 1344,
-     1329, 1329, 1329, 1329,  313, 1345, 1346, 1347, 1329, 1329,
-      320, 1329,  322, 1348, 1341,   21,   21,   21,   21,   21,
-       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   21,   21,   21, 1337, 1349, 1329,  369,
-     1350, 1329, 1351, 1352, 1329,  375, 1339, 1353, 1354, 1329,
-     1329,  381, 1329,  383, 1355, 1345, 1329, 1329, 1356, 1357,
-     1329, 1329, 1329, 1329,  393, 1358,   21,   21,   21,   21,
+     1510, 1511, 1458,  603, 1512, 1458,  606, 1513, 1458, 1514,
+     1515, 1458,  612, 1516, 1517, 1517, 1458, 1518, 1458,  619,
+     1519, 1520, 1521, 1521, 1522, 1523, 1524, 1524, 1458, 1525,
+     1458,  631, 1526, 1527, 1458, 1528, 1458, 1529, 1530, 1458,
+     1458, 1458, 1458, 1531, 1532,  600,  646,  646,  646,  646,
+      646,  646,  646,  646,  646,  646,  646,  646,  646,  646,
+      646,  646,  646,  646,  646,  646,  646,  646,  646,  646,
+      646,  671,  671,  671,  646,  671,  676, 1533, 1458, 1458,
+     1458, 1534, 1458, 1458, 1535, 1536, 1537, 1458, 1458, 1458,
+     1458, 1538, 1539, 1458, 1540, 1541, 1458, 1458, 1458, 1458,
 
-       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   21,   21,   21,  436,  366, 1359, 1329,
-      313, 1329,  315, 1360, 1361, 1329, 1329, 1329, 1329,  448,
-     1362, 1329, 1363, 1364, 1329, 1329, 1329, 1329,  457, 1365,
-     1366, 1329, 1356, 1329, 1367, 1329, 1329,  467, 1329,  469,
-     1368, 1358,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+     1542, 1543, 1458, 1544, 1458, 1545, 1546, 1458, 1458, 1458,
+     1458, 1547, 1548, 1549, 1458, 1550, 1551, 1551, 1552, 1553,
+     1554, 1554, 1458, 1555, 1458,  725, 1556, 1557, 1558, 1558,
+     1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,
+     1558, 1558, 1558, 1558, 1558, 1558, 1558, 1558,  747, 1558,
+      747,  751,  751,  753, 1559, 1560, 1458,  757, 1561, 1458,
+      760, 1562, 1458,  763, 1563, 1458, 1564, 1565, 1458,  769,
+     1566, 1567, 1567, 1458, 1568, 1458,  776, 1569, 1570, 1571,
+     1571, 1572, 1573, 1574, 1574, 1458, 1575, 1458,  788, 1576,
+     1577, 1578, 1458, 1579, 1580, 1580, 1581, 1582, 1583, 1583,
 
-       21,   21,   21,   21,   21,   21, 1369, 1370, 1329,  509,
-     1371, 1329,  512, 1372, 1329, 1373, 1374, 1329,  518, 1375,
-     1376, 1329, 1329,  523, 1329,  525, 1377, 1362, 1378, 1329,
-     1363, 1329, 1379, 1329, 1329,  535, 1329,  537, 1380, 1365,
-     1329, 1381, 1329, 1382, 1383, 1329, 1329, 1329, 1329,  548,
-     1384,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-       21,   21,   21,  506, 1385, 1329, 1329, 1329,  577, 1329,
-     1329,  580, 1386, 1387, 1329, 1329, 1329, 1329,  587, 1388,
-     1329, 1389, 1390, 1329, 1329, 1329, 1329,  596, 1391, 1329,
+     1458, 1584, 1458,  803, 1585, 1586, 1587, 1458, 1588, 1458,
+     1589, 1590, 1458, 1458, 1458, 1458, 1591, 1592, 1593, 1593,
+     1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593,
+     1593, 1593,  832,  832,  834,  832,  832,  837, 1594, 1458,
+     1458, 1458, 1595, 1458, 1458, 1596, 1458, 1458, 1597, 1598,
+     1599, 1458, 1458, 1458, 1458, 1600, 1601, 1458, 1602, 1603,
+     1458, 1458, 1458, 1458, 1604, 1605, 1458, 1606, 1458, 1607,
+     1608, 1458, 1458, 1458, 1458, 1609, 1610, 1611, 1458, 1612,
+     1458, 1613, 1614, 1458, 1458, 1458, 1458, 1615, 1616, 1617,
+     1618, 1458, 1619, 1620, 1620, 1621, 1622, 1623, 1623, 1458,
 
-     1392, 1329, 1393, 1394, 1329, 1329, 1329, 1329,  607, 1395,
-     1396, 1329, 1381, 1397, 1329, 1398, 1329, 1399, 1329, 1329,
-      620, 1329,  622, 1400, 1401, 1402, 1402, 1402, 1402, 1402,
-     1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402,
-     1402, 1402, 1403, 1404, 1329,  645, 1405, 1329,  648, 1406,
-     1329,  651, 1407, 1329, 1408, 1409, 1329,  657, 1410, 1411,
-     1329, 1329,  662, 1329,  664, 1412, 1413, 1414, 1329, 1415,
-     1329, 1416, 1329, 1329,  674, 1329,  676, 1417, 1418, 1419,
-     1329, 1420, 1421, 1329, 1422, 1329, 1423, 1329, 1329,  689,
-     1329,  691, 1424, 1425, 1426, 1329, 1427, 1329, 1428, 1429,
+     1624, 1458,  902, 1625, 1626, 1627, 1627, 1627, 1627, 1627,
+     1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627,  919,
+     1627, 1627, 1628, 1629, 1458,  925, 1630, 1458,  928, 1631,
+     1458,  931, 1632, 1458,  934, 1633, 1458, 1634, 1458, 1458,
+      940, 1635, 1636, 1636, 1458, 1637, 1458,  947, 1638, 1639,
+     1640, 1640, 1641, 1642, 1643, 1643, 1458, 1644, 1458,  959,
+     1645, 1646, 1647, 1458, 1648, 1649, 1649, 1650, 1651, 1652,
+     1652, 1458, 1653, 1458,  974, 1654, 1655, 1656, 1657, 1458,
+     1658, 1659, 1659, 1660, 1661, 1662, 1662, 1458, 1663, 1458,
+      990, 1664, 1665, 1666, 1458, 1667, 1458, 1668, 1669, 1458,
 
-     1329, 1329, 1329, 1329,  703, 1430, 1431, 1431, 1431, 1431,
-     1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1432,
-     1329, 1329, 1329,  722, 1329, 1329,  725, 1329, 1329,  728,
-     1433, 1434, 1329, 1329, 1329, 1329,  735, 1435, 1329, 1436,
-     1437, 1329, 1329, 1329, 1329,  744, 1438, 1329, 1439, 1329,
-     1440, 1441, 1329, 1329, 1329, 1329,  755, 1442, 1443, 1329,
-     1444, 1329, 1445, 1446, 1329, 1329, 1329, 1329,  767, 1447,
-     1448, 1449, 1329, 1450, 1451, 1329, 1452, 1329, 1453, 1329,
-     1329,  781, 1329,  783, 1454, 1455, 1456, 1456, 1456, 1456,
-     1456, 1456, 1456, 1456, 1456, 1456, 1456, 1457, 1458, 1329,
+     1458, 1458, 1458, 1670, 1671, 1672, 1672, 1672, 1672, 1672,
+     1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1018, 1672,
+     1673, 1458, 1458, 1458, 1674, 1458, 1458, 1675, 1458, 1458,
+     1676, 1458, 1458, 1677, 1678, 1458, 1036, 1679, 1680, 1458,
+     1458, 1681, 1682, 1683, 1458, 1684, 1685, 1458, 1458, 1458,
+     1686, 1687, 1688, 1458, 1689, 1458, 1690, 1691, 1458, 1458,
+     1458, 1692, 1693, 1694, 1695, 1458, 1696, 1458, 1697, 1698,
+     1458, 1458, 1458, 1699, 1700, 1701, 1702, 1458, 1703, 1458,
+     1704, 1705, 1458, 1458, 1458, 1706, 1707, 1708, 1709, 1710,
+     1458, 1711, 1712, 1712, 1713, 1714, 1715, 1715, 1458, 1716,
 
-      800, 1459, 1329,  803, 1460, 1329,  806, 1461, 1329,  809,
-     1462, 1329, 1463, 1329, 1329,  815, 1464, 1465, 1329, 1329,
-      820, 1329,  822, 1466, 1467, 1468, 1329, 1469, 1329, 1470,
-     1329, 1329,  832, 1329,  834, 1471, 1472, 1473, 1329, 1474,
-     1475, 1329, 1476, 1329, 1477, 1329, 1329,  847, 1329,  849,
-     1478, 1479, 1480, 1481, 1329, 1482, 1483, 1329, 1484, 1329,
-     1485, 1329, 1329,  863, 1329,  865, 1486, 1487, 1488, 1329,
-     1489, 1329, 1490, 1491, 1329, 1329, 1329, 1329,  877, 1492,
-     1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493, 1493,
-     1493, 1493, 1494, 1329, 1329, 1329,  895, 1329, 1329,  898,
+     1458, 1101, 1717, 1718, 1719, 1719, 1719, 1719, 1719, 1719,
+     1719, 1719, 1719, 1719, 1719, 1720, 1458, 1458, 1118, 1721,
+     1458, 1121, 1722, 1458, 1124, 1723, 1458, 1127, 1724, 1458,
+     1130, 1725, 1458, 1458, 1458, 1726, 1727, 1728, 1729, 1730,
+     1730, 1458, 1731, 1732, 1733, 1734, 1734, 1735, 1736, 1737,
+     1737, 1458, 1738, 1739, 1740, 1741, 1458, 1742, 1743, 1743,
+     1744, 1745, 1746, 1746, 1458, 1747, 1748, 1749, 1750, 1751,
+     1458, 1752, 1753, 1753, 1754, 1755, 1756, 1756, 1458, 1757,
+     1758, 1759, 1760, 1761, 1458, 1762, 1763, 1763, 1764, 1765,
+     1766, 1766, 1458, 1767, 1768, 1769, 1770, 1458, 1771, 1458,
 
-     1329, 1329,  901, 1329, 1329,  904, 1495, 1329,  908, 1496,
-     1497, 1329, 1329, 1498,  913, 1499, 1329, 1500, 1501, 1329,
-     1329, 1329, 1502,  922, 1503, 1329, 1504, 1329, 1505, 1506,
-     1329, 1329, 1329, 1507,  933, 1508, 1509, 1329, 1510, 1329,
-     1511, 1512, 1329, 1329, 1329, 1513,  945, 1514, 1515, 1329,
-     1516, 1329, 1517, 1518, 1329, 1329, 1329, 1519,  957, 1520,
-     1521, 1522, 1329, 1523, 1524, 1329, 1525, 1329, 1526, 1329,
-     1329,  971, 1329,  973, 1527, 1528, 1529, 1529, 1529, 1529,
-     1529, 1529, 1529, 1529, 1529, 1529, 1530, 1329, 1329,  989,
-     1531, 1329,  992, 1532, 1329,  995, 1533, 1329,  998, 1534,
+     1772, 1773, 1458, 1458, 1458, 1774, 1775, 1776, 1777, 1777,
+     1777, 1777, 1777, 1777, 1777, 1777, 1458, 1217, 1778, 1779,
+     1458, 1780, 1781, 1458, 1782, 1783, 1458, 1784, 1785, 1458,
+     1786, 1787, 1458, 1788, 1789, 1790, 1790, 1458, 1791, 1792,
+     1793, 1794, 1795, 1458, 1796, 1797, 1458, 1798, 1458, 1799,
+     1458, 1800, 1801, 1458, 1802, 1803, 1458, 1804, 1458, 1805,
+     1806, 1458, 1807, 1808, 1458, 1809, 1458, 1810, 1811, 1458,
+     1812, 1813, 1458, 1814, 1458, 1815, 1816, 1458, 1817, 1818,
+     1819, 1458, 1820, 1821, 1821, 1822, 1823, 1824, 1824, 1458,
+     1825, 1826, 1827, 1828, 1828, 1828, 1828, 1458, 1829, 1830,
 
-     1329, 1001, 1535, 1329, 1329, 1329, 1536, 1006, 1537, 1538,
-     1539, 1329, 1329, 1013, 1540, 1541, 1542, 1329, 1543, 1329,
-     1544, 1329, 1329, 1023, 1545, 1546, 1547, 1329, 1548, 1549,
-     1329, 1550, 1329, 1551, 1329, 1329, 1036, 1552, 1553, 1554,
-     1555, 1329, 1556, 1557, 1329, 1558, 1329, 1559, 1329, 1329,
-     1050, 1560, 1561, 1562, 1563, 1329, 1564, 1565, 1329, 1566,
-     1329, 1567, 1329, 1329, 1064, 1568, 1569, 1570, 1329, 1571,
-     1329, 1572, 1573, 1329, 1329, 1329, 1574, 1076, 1575, 1576,
-     1576, 1576, 1576, 1576, 1576, 1576, 1576, 1329, 1088, 1577,
-     1578, 1329, 1579, 1092, 1329, 1580, 1095, 1329, 1581, 1098,
+     1831, 1832, 1833, 1834, 1835, 1836, 1458, 1837, 1838, 1458,
+     1839, 1840, 1841, 1841, 1842, 1843, 1844, 1845, 1458, 1846,
+     1847, 1847, 1848, 1849, 1850, 1851, 1852, 1458, 1853, 1854,
+     1854, 1855, 1856, 1857, 1858, 1859, 1458, 1860, 1861, 1861,
+     1862, 1863, 1864, 1865, 1866, 1458, 1867, 1868, 1868, 1869,
+     1870, 1871, 1872, 1458, 1873, 1458, 1874, 1875, 1458, 1876,
+     1877, 1877, 1877, 1877, 1878, 1458, 1879, 1880, 1881, 1882,
+     1883, 1884, 1885, 1885, 1886, 1887, 1888, 1458, 1458, 1889,
+     1458, 1890, 1458, 1891, 1458, 1892, 1458, 1893, 1458, 1894,
+     1458, 1895, 1458, 1896, 1458, 1897, 1458, 1872, 1898, 1458,
 
-     1329, 1582, 1101, 1329, 1583, 1104, 1584, 1329, 1329, 1109,
-     1585, 1586, 1587, 1588, 1329, 1589, 1590, 1329, 1591, 1329,
-     1592, 1329, 1593, 1594, 1329, 1595, 1596, 1329, 1597, 1329,
-     1598, 1599, 1329, 1600, 1601, 1329, 1602, 1329, 1603, 1604,
-     1329, 1605, 1606, 1329, 1607, 1329, 1608, 1609, 1329, 1610,
-     1611, 1612, 1329, 1613, 1614, 1329, 1615, 1329, 1616, 1329,
-     1329, 1161, 1617, 1618, 1619, 1619, 1619, 1619, 1329, 1620,
-     1169, 1621, 1622, 1623, 1624, 1625, 1626, 1329, 1627, 1628,
-     1329, 1629, 1630, 1631, 1329, 1632, 1329, 1633, 1634, 1329,
-     1635, 1636, 1329, 1637, 1329, 1638, 1639, 1640, 1329, 1641,
+     1873, 1899, 1899, 1874, 1875, 1900, 1877, 1877, 1877, 1901,
+     1458, 1902, 1903, 1458, 1889, 1890, 1904, 1458, 1891, 1892,
+     1905, 1458, 1893, 1894, 1906, 1458, 1895, 1896, 1907, 1458,
+     1897, 1908, 1458, 1909, 1458, 1877, 1910, 1458, 1902, 1911,
+     1912, 1913, 1914, 1915, 1908, 1916, 1458, 1909, 1917, 1911,
+     1912, 1913, 1914, 1915, 1918, 1917, 1918,    0, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
 
-     1642, 1329, 1643, 1329, 1644, 1645, 1646, 1329, 1647, 1648,
-     1329, 1649, 1329, 1650, 1651, 1652, 1329, 1653, 1654, 1329,
-     1655, 1329, 1656, 1657, 1329, 1658, 1329, 1659, 1660, 1329,
-     1661, 1662, 1662, 1662, 1662, 1663, 1329, 1664, 1665, 1666,
-     1667, 1668, 1669, 1670, 1329, 1671, 1329, 1672, 1329, 1329,
-     1673, 1329, 1674, 1329, 1675, 1329, 1676, 1329, 1677, 1329,
-     1678, 1329, 1679, 1329, 1680, 1329, 1681, 1329, 1657, 1682,
-     1329, 1658, 1683, 1329, 1659, 1329, 1684, 1662, 1662, 1662,
-     1685, 1329, 1686, 1687, 1329, 1673, 1674, 1688, 1329, 1675,
-     1676, 1689, 1329, 1677, 1678, 1690, 1329, 1679, 1680, 1691,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
 
-     1329, 1681, 1692, 1329, 1693, 1329, 1662, 1694, 1329, 1686,
-     1695, 1696, 1697, 1698, 1699, 1692, 1700, 1329, 1693, 1701,
-     1695, 1696, 1697, 1698, 1699, 1702, 1701, 1702,    0, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
 
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
 
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
 
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-
-     1329, 1329
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458
     } ;
 
-static yyconst flex_int16_t yy_nxt[6623] =
+static yyconst flex_int16_t yy_nxt[7455] =
     {   0,
         4,    5,    6,    7,    8,    9,   10,   11,   12,   11,
-       13,   14,   15,   15,   15,   15,   15,   16,   17,   18,
-       19,   20,   21,   21,   11,   22,   13,   23,   24,   25,
-       26,   27,   28,   29,   30,   31,   21,   32,   33,   34,
-       35,   36,   21,   37,   38,   39,   40,   41,   42,   21,
-       21,   43,   44,   44,  180,   44,   44,   44,   44,   44,
-       44,   44,   44,   44,   44,   69,   44,   44,   44,   44,
-       44,   44,   53,   56,   57, 1304,   44,   44,   44,   70,
-       44,   59,   60,   53,   44,  151,   71,  181,   44,   48,
-       49,   50,   50,   50,   50,   50,   50,   51,   53,   78,
+       13,   14,   15,   15,   15,   15,   15,   15,   16,   17,
+       18,   19,   20,   21,   21,   11,   22,   13,   23,   24,
+       25,   26,   27,   28,   29,   30,   31,   21,   32,   33,
+       34,   35,   36,   21,   37,   38,   39,   40,   41,   42,
+       21,   21,   43,   44,   44,   53,   44,   44,   44,   44,
+       44,   44,   44,   44,  116,   44,   57,   58,   44,   60,
+       61,   44,   44,  117,   72,   83,   84,  209,   44,   44,
+       44,   53,   44,  210,  240,   44,   44,   44,   73,   65,
+       44,   66,   67,   79,   85,   74,   68,   80, 1134,   86,
 
-       79,   52,   53,   54, 1282, 1266,   48,   52,   52,   52,
-       52,   52,   52,   53,   53,   53,   53,   53,   53,   53,
-       53,   53,   53,   53,   53,   53,   53,   53,   53,   54,
-       53,   44,   80,   63,   44,   64,   44,   81,   82,   44,
-       65,  175, 1262, 1258,  106,   66,  176,   61,   55,   67,
-       61,   68,   61,  107,   83,   61,   44,   53,   52,   52,
-       52,   52,   52,   52,   61,   75,   72,  100,  130,   73,
-       53,  101,   61,   74,  187,   76,  108,  123,   77,  188,
-      102,  103,  131,  124,  104,  125,  105,  126,  109, 1254,
-      110,  127,  111,  128,  129,  112,   53,   53,   53,   53,
+       44,   69,  241,   81,   87,   70,   82,   71,   44,   48,
+       49,   50,   50,   50,   50,   50,   50,   50,   51,  195,
+       88,  196,   52,   53,   54,   53,  352,   55,   52,   52,
+       52,   52,   52,   52,   53,   53,   53,   53,   53,   53,
+       53,   53,   53,   53,   53,   53,   53,   53,   53,   53,
+       54,   53,   44,  123,   75,   44,  447,   44,  124,  125,
+       44,  126,  127,  193,   76,  204,  194,   77,  199,   63,
+       56,   78,   63,  200,   63,   53,  515,   63,   44,   62,
+       52,   52,   52,   52,   52,   52,   52,   63,  110,   89,
+      246,   90,  111,   53,  118,   63,   91,   92,  205,   93,
 
-       53,   53,   53, 1329,  185,   93,   94,   53, 1250, 1227,
-      186, 1225,  155,   53,   53,   53,   53,   53,   53,   85,
-       95,  161,   86,   87,   96,   88,   53,   89,   97,   90,
-       98,   91,  118,  113,   92,   53,  119,   99,  114,  115,
-      133,  116,  117,  168,  120, 1178, 1077,  216,  134,  121,
-       44,  122,  135,   44,  136,   44,   53,  164,   44,  140,
-      141,  141,  141,  141,  141,  217,   53,   44,   53,  143,
-      143,  143,  143,  143,  143,   44,   49,  142,  142,  142,
-      142,  142,  142,  165, 1146,  191,  355,  143,  192,  166,
-      193,  356,   53,  143,  143,  143,  143,  143,  143,  146,
+      247,  112,  113,   94,  145,  114,  119,  115,  120,  211,
+      121,  341,  146,  122,  212,  339,  147,  340,  148,   53,
+       55,   53,   53,   53,   53,   53,   53,   53,   53, 1458,
+      103,  104, 1222,   53,  181,  342,  140,  206,  141,   53,
+       53,   53,   53,   53,   53,   95,  105,  447,   96,   97,
+      106,   98,  142,   99,  107,  100,  108,  101,  128,  143,
+      102,  182,  129,  109,  207,  234,  133,  183,  215,  208,
+      130,  216,  134,  217,  135,  131,  136,  132,  235,  243,
+      137,   44,  138,  139,   44,  738,   44,   53,  244,   44,
+      155,  155,  155,  155,  155,  155,  155,   63,   53,   44,
 
-      146,  146,  146,  146,  146,   61,   48,  131,   61,  146,
-       61,   53,  210,   61,  182,  146,  146,  146,  146,  146,
-      146,   44,   61,   48,   44,  211,   44,   48, 1144,   44,
-       61,  222,  147,  148,  148,  148,  148,  148,   44, 1138,
-      183,  223,  149, 1329,   48,  184,   44,  714,  149,  149,
-      149,  149,  149,  149,   53,  143,  143,  143,  143,  143,
-      143,  219,   53,  237,  237,  237,  237,  237,  237, 1329,
-      220,   53,  237,  237,  237,  237,  237,  237, 1136,  299,
-     1130, 1128,  280, 1329, 1122,  388,  422,  150,  233,  141,
-      141,  141,  141,  141,  141,  281, 1120,   53,  389, 1329,
+       63,  413,   63,  321,  735,   63,  414,   44,  152,  152,
+      152,  152,  152,  152,  152,   63,  322, 1458, 1458,  152,
+       53, 1458,   53,   63,   53,  152,  152,  152,  152,  152,
+      152,  153,  154,  154,  154,  154,  154,  154,   53, 1458,
+     1225, 1458,  155, 1458, 1458, 1458,   53, 1458,  155,  155,
+      155,  155,  155,  155,   49,  156,  156,  156,  156,  156,
+      156,  156,  275,  447,   53, 1458,  157, 1458,   53,  673,
+      277, 1458,  157,  157,  157,  157,  157,  157,   62,  157,
+      157,  157,  157,  157,  157,  157,  160,  160,  160,  160,
+      160,  160,  160,  377,  378,  379,  380,  160,  490,  730,
 
-      423,  234,  300,  303,  304,  304,  304,  304,  304, 1329,
-      318,  319,  319,  319,  319,  319, 1329,  321,  321,  321,
-      321,  321,  321,   53,  389, 1329,  418,  234,  235,  235,
-      235,  235,  235,  235,  236, 1329, 1329, 1329,  237,  419,
-     1115,  377,   48, 1170,  237,  237,  237,  237,  237,  237,
-      240,  241,  241,  241,  241,  241,  242,  244,  312,   48,
-      243, 1329, 1329, 1329,  246,  442,  243,  243,  243,  243,
-      243,  243,  244,  245,  245,  245,  245,  245,  245,  246,
-     1237, 1075,  358,  247,  452,  248, 1071,  359,  334,  247,
-      247,  247,  247,  247,  247,  335,  360,  453,  361,  362,
+       53,  564,  494,  160,  160,  160,  160,  160,  160,   44,
+      565,  491,   44,  381,   44,  431,  495,   44,  458,  458,
+      161,  162,  162,  162,  162,  162,  162,   44,   53,  263,
+      731,  163,  459, 1458, 1228,   44,   53,  163,  163,  163,
+      163,  163,  163,  258,  567,  259,  259,  259,  259,  259,
+      259,  259,  362,  568,   53,  263,  259, 1458,  459, 1458,
+      523,  740,  259,  259,  259,  259,  259,  259,  260,  261,
+      261,  261,  261,  261,  261,  261,  275,  462,  447,   53,
+      262, 1458,  263, 1458, 1458,  464,  262,  262,  262,  262,
+      262,  262,  349,  349,  349,  349,  349,  349,  349,  368,
 
-      481,  363,  379,  380,  380,  380,  380,  380,  336,  482,
-      484,  248,   53,  237,  237,  237,  237,  237,  237,  485,
-     1069,  377,   53,  453,  337, 1329,  382,  382,  382,  382,
-      382,  382,  388,  319,  319,  319,  319,  319,  319, 1105,
-      377,  257,  305,  305,  305,  305,  305,  305,   53, 1102,
-      392,  377,  305, 1099, 1329, 1329, 1329,  394,  305,  305,
-      305,  305,  305,  305,   49,  306,  306,  306,  306,  306,
-      306,  236,  312,  313,  313,  313,  313,  313,  313,  314,
-     1329, 1329, 1329,  315, 1329,  316,  377, 1096,  377,  315,
-      315,  315,  315,  315,  315, 1329,  391,  391,  391,  391,
+      369,  369,  369,  369,  369,  369,  533, 1458,  263,  264,
+      262,  262,  262,  262,  262,  262,  262, 1458, 1458, 1231,
+      534,  262,  377,  378,  379,  380,  447,  262,  262,  262,
+      262,  262,  262,  265,  266,  266,  266,  266,  266,  266,
+      266,  267, 1234, 1458, 1458,  268,  534, 1458, 1458,   53,
+      746,  268,  268,  268,  268,  268,  268,   53,  268,  268,
+      268,  268,  268,  268,  268,  271,  272,  272,  272,  272,
+      272,  272,  273, 1458, 1458,  732,  274,  595,  733,  807,
+       53,   53,  274,  274,  274,  274,  274,  274,  275,  276,
+      276,  276,  276,  276,  276,  276,  277,   53,  447, 1198,
 
-      391,  391,  436,  437,  437,  437,  437,  437,  541,  543,
-     1329,  316,  244,  320,  320,  320,  320,  320,  320,  246,
-     1329,  542,  544,  321, 1329, 1093,   48,  377, 1005,  321,
-      321,  321,  321,  321,  321,  322,  323,  323,  323,  323,
-      323,  377,  447,   48,  717,  324, 1329,  542,  544,  578,
-     1329,  324,  324,  324,  324,  324,  324,  365,  304,  304,
-      304,  304,  304,  304,  461,  462,  462,  462,  462,  462,
-      366,  452,  380,  380,  380,  380,  380,  380, 1329,  455,
-      455,  455,  455,  455,  455,  465,  466,  466,  466,  466,
-      466,  591,  600,  602,   48,   48,  366,  369,  370,  370,
+      278,  739,  279,  595,  392,  807,  278,  278,  278,  278,
+      278,  278,  393,  434,  434,  434,  434,  434,  434,  434,
+     1200, 1001,  533, 1206,  596,  394,   55,  736,  279,  346,
+      346,  346,  346,  346,  346,  346, 1458,   53,  429, 1458,
+      346,  395, 1204,   55,   55, 1366,  346,  346,  346,  346,
+      346,  346,  347,  348,  348,  348,  348,  348,  348,  734,
+      752,   55, 1458,  349,  429, 1458, 1458, 1458,   53,  349,
+      349,  349,  349,  349,  349,  260,  350,  350,  350,  350,
+      350,  350,  350,  351,  351,  351,  351,  351,  351,  351,
+      528,  537, 1458, 1458,  351, 1458,   53,   55,  681,  684,
 
-      370,  370,  370,  456,  592,  601,  603,  371,  695,   48,
-      581,   48,   48,  371,  371,  371,  371,  371,  371,  375,
-      376,  376,  376,  376,  376,  377,   48, 1329,  708,  378,
-      592,  601,  603,  707,  695,  378,  378,  378,  378,  378,
-      378,  312,  381,  381,  381,  381,  381,  381,  314,  547,
-      586, 1329,  382, 1329,   48,   48,  549,  723,  382,  382,
-      382,  382,  382,  382,  383,  384,  384,  384,  384,  384,
-      377,   48,   48, 1329,  385,  715,  713, 1329,   48,   48,
-      385,  385,  385,  385,  385,  385,  244,  390,  390,  390,
-      390,  390,  390,  246,  377,   48,   48,  391,  718, 1329,
+      351,  351,  351,  351,  351,  351,  353,  354,  354,  354,
+      354,  354,  354,  354, 1299,   55, 1299,  447,  355, 1244,
+     1040, 1458,  819, 1249,  355,  355,  355,  355,  355,  355,
+      358,  355,  355,  355,  355,  355,  355,  355,  362,  363,
+      363,  363,  363,  363,  363,  363,  364,  641,  417,  635,
+      365, 1251,  366,  418, 1049,  643,  365,  365,  365,  365,
+      365,  365,  419,  636,  420,  421, 1458,  422,  449,  450,
+      450,  450,  450,  450,  450,   55,  635,   55,  366,  275,
+      370,  370,  370,  370,  370,  370,  370,  277, 1257,  636,
+     1458,  371, 1458,   55,  829,   55,  637,  371,  371,  371,
 
-       48,   48, 1170,  391,  391,  391,  391,  391,  391,  392,
-      393,  393,  393,  393,  393,  393,  394,   48,   48, 1329,
-      395, 1329,  396,  787, 1329, 1329,  395,  395,  395,  395,
-      395,  395, 1329,  468,  468,  468,  468,  468,  468,  521,
-      522,  522,  522,  522,  522, 1329,  759, 1329,  396,  403,
-     1329, 1329, 1329,  404,  869,  878,  405,   48,  696,  406,
-      698,  407,  408,  409,  410,  438,  438,  438,  438,  438,
-      438,  697,  759,  699,   48,  438,  956,  377, 1329,  788,
-      869,  438,  438,  438,  438,  438,  438,  312,  441,  441,
-      441,  441,  441,  441,  442,  595,  606,  697,  443,  699,
+      371,  371,  371,  372,  373,  373,  373,  373,  373,  373,
+      638, 1259,  820, 1060,  374, 1265, 1458,   55, 1267,   55,
+      374,  374,  374,  374,  374,  374,  424,  637,  425,  425,
+      425,  425,  425,  425,  425,   55,  638,   55, 1072,  425,
+      825, 1458,   55,   55,  747,  425,  425,  425,  425,  425,
+      425,  426,  427,  427,  427,  427,  427,  427,  427, 1273,
+       55,   55,   55,  428,  826,  429, 1275, 1458, 1084,  428,
+      428,  428,  428,  428,  428,  512,  512,  512,  512,  512,
+      512,  512,  542,  543,  543,  543,  543,  543,  543,  694,
+      745,  429,  430,  428,  428,  428,  428,  428,  428,  428,
 
-      316,  952,  726,  729,  443,  443,  443,  443,  443,  443,
-     1329,  524,  524,  524,  524,  524,  524,  529,  530,  530,
-      530,  530,  530,  950,  739,   48,  316,  447,  448,  448,
-      448,  448,  448,  448,  449,  944,  702,  740,  450,  377,
-      451,  940,   48,  704,  450,  450,  450,  450,  450,  450,
-      533,  534,  534,  534,  534,  534, 1329,  536,  536,  536,
-      536,  536,  536,  740,   48,   48,  451,  312,  454,  454,
-      454,  454,  454,  454,  442,  938, 1329,  932,  455,  377,
-     1329,   48,   48,   48,  455,  455,  455,  455,  455,  455,
-      456,  457,  457,  457,  457,  457,  457,  458,  709,  710,
+       53, 1206, 1307,  695,  428, 1134,   55,   55, 1354,  694,
+      428,  428,  428,  428,  428,  428,  432,  433,  433,  433,
+      433,  433,  433, 1458,   55,   55, 1458,  434,  827,  695,
+       55,  749,   55,  434,  434,  434,  434,  434,  434,  265,
+      435,  435,  435,  435,  435,  435,  435, 1356,   55, 1458,
+       55,  436, 1458,  830, 1458,  878, 1379,  436,  436,  436,
+      436,  436,  436,   53,  436,  436,  436,  436,  436,  436,
+      436,  439,  440,  440,  440,  440,  440,  440, 1458,  689,
+     1458,  878,  441, 1383,   55,   55, 1387,  842,  441,  441,
+      441,  441,  441,  441,  445,  446,  446,  446,  446,  446,
 
-       48,  459, 1329,  460,  928,  789, 1329,  459,  459,  459,
-      459,  459,  459,  541,  462,  462,  462,  462,  462,  462,
-      244,  464,  464,  464,  464,  464,  464,   48,   48,  460,
-      392,  467,  467,  467,  467,  467,  467,  394,  926, 1329,
-     1329,  468,   48,  921,   48,   48,  377,  468,  468,  468,
-      468,  468,  468,  469,  470,  470,  470,  470,  470,   48,
-      790,  712,  917,  471,  791, 1329, 1329,  912,  377,  471,
-      471,  471,  471,  471,  471,  437,  437,  437,  437,  437,
-      437,  611,  612,  612,  612,  612,  612,  506,  543,  466,
-      466,  466,  466,  466,  466, 1329,  546,  546,  546,  546,
+      446,  447,   55,   55, 1458,  448, 1391,  906,  907,   55,
+       55,  448,  448,  448,  448,  448,  448,  362,  451,  451,
+      451,  451,  451,  451,  451,  364,  698,   55,   55,  452,
+     1395,   55,  908,  910,  845,  452,  452,  452,  452,  452,
+      452,  453,  454,  454,  454,  454,  454,  454,  447,   55,
+     1411, 1433,  455,   53,  912,   55,   55,   55,  455,  455,
+      455,  455,  455,  455,  275,  460,  460,  460,  460,  460,
+      460,  460,  277,   55,   55,   55,  461,  915,  913,   53,
+       55,   55,  461,  461,  461,  461,  461,  461,  462,  463,
+      463,  463,  463,  463,  463,  463,  464,  709,   55,   55,
 
-      546,  546,  591,  522,  522,  522,  522,  522,  522,  748,
-      750,   48,   48,  506,  509,  510,  510,  510,  510,  510,
-      377, 1112,  749,  751,  511,  988,   48,   48,   48,   48,
-      511,  511,  511,  511,  511,  511,  512,  513,  513,  513,
-      513,  513,  719,   48,   48,  792,  514,  796,  749,  751,
-       48,  892,  514,  514,  514,  514,  514,  514,  518,  519,
-      519,  519,  519,  519,  377, 1105, 1329,   48,  520, 1102,
-     1329,   48,  793,   48,  520,  520,  520,  520,  520,  520,
-      447,  523,  523,  523,  523,  523,  523,  449,   48, 1329,
-       48,  524, 1329,  794,   48,  890, 1329,  524,  524,  524,
+      465,  994,  466, 1015, 1458,  848,  465,  465,  465,  465,
+      465,  465,  546,  547,  547,  547,  547,  547,  547,  615,
+      616,  616,  616,  616,  616,  616,  447,  994,  466,  475,
+     1458, 1458,  447,  476, 1458,   55,  477,   55,  703,  478,
+      703,  479,  480,  481,  482,  509,  509,  509,  509,  509,
+      509,  509,  704,   55, 1458,   55,  509, 1458, 1011,   55,
+     1458,  741,  509,  509,  509,  509,  509,  509,  510,  511,
+      511,  511,  511,  511,  511,   53,  814,   55,  704,  512,
+     1458, 1458, 1458, 1458,  816,  512,  512,  512,  512,  512,
+      512,  426,  513,  513,  513,  513,  513,  513,  513,  514,
 
-      524,  524,  524,  525,  526,  526,  526,  526,  526,  377,
-      734,   48, 1329,  527,  886, 1329, 1099,  896, 1096,  527,
-      527,  527,  527,  527,  527,  456,  535,  535,  535,  535,
-      535,  535,  458,  937, 1329,  949,  536, 1329, 1329,   48,
-       48, 1093,  536,  536,  536,  536,  536,  536,  537,  538,
-      538,  538,  538,  538,  377,  988,   48,   48,  539,  937,
-     1329,  949,   48, 1329,  539,  539,  539,  539,  539,  539,
-      392,  545,  545,  545,  545,  545,  545,  394,  876,   48,
-     1077,  546, 1329,  982,   48,   48,   48,  546,  546,  546,
-      546,  546,  546,  547,  548,  548,  548,  548,  548,  548,
+      514,  514,  514,  514,  514,  514, 1458, 1458, 1458, 1458,
+      514, 1458,   55,   55, 1299,   55,  514,  514,  514,  514,
+      514,  514,  431,  516,  516,  516,  516,  516,  516,  516,
+       55,   55, 1458,   55,  517, 1234,  263, 1458, 1017, 1231,
+      517,  517,  517,  517,  517,  517,  623,  624,  624,  624,
+      624,  624,  624,  627,  628,  628,  628,  628,  628,  628,
+       55,  705,  263,  517,  517,  517,  517,  517,  517,  517,
+     1065, 1228, 1458, 1077,  517,  706, 1458, 1225,   55,  742,
+      517,  517,  517,  517,  517,  517,  518,  518,  518,  518,
+      518,  518,  518,   53, 1222,  821, 1065,  519, 1458, 1077,
 
-      549,   48,   48,   48,  550,  985,  551,  986, 1329,  872,
-      550,  550,  550,  550,  550,  550, 1329,  594,  594,  594,
-      594,  594,  594,  600,  530,  530,  530,  530,  530,  530,
-       48,  760,  551,  574,  574,  574,  574,  574,  574,  743,
-      870,  754,  377,  574,  761, 1068,  899,   48,  902,  574,
-      574,  574,  574,  574,  574,  447,  577,  577,  577,  577,
-      577,  577,  578,  905,  885,  377,  579, 1329,  451,  902,
-      761, 1068,  579,  579,  579,  579,  579,  579,  312,  532,
-      532,  532,  532,  532,  532,  602,  534,  534,  534,  534,
-      534,  534,  762, 1329,  451,  456,  580,  580,  580,  580,
+     1458,  706, 1458,  519,  519,  519,  519,  519,  519,   53,
+      519,  519,  519,  519,  519,  519,  519,  362,  522,  522,
+      522,  522,  522,  522,  522,  523, 1458,  705, 1299,  524,
+     1206,  366, 1003, 1084,  447,  524,  524,  524,  524,  524,
+      524, 1458,  714,  715,  715,  715,  715,  715,  715,  717,
+      718,  718,  718,  718,  718,  718,   55,  366,  528,  529,
+      529,  529,  529,  529,  529,  529,  530, 1458, 1234,  885,
+      531, 1080,  532, 1078,   55,  744,  531,  531,  531,  531,
+      531,  531,  721,  722,  722,  722,  722,  722,  722,   53,
+      772,  773,  773,  773,  773,  773,  773,   55,  532,  362,
 
-      580,  580,  581,  766,  876,  763,  582,  377,  460,  899,
-      905,  878,  582,  582,  582,  582,  582,  582, 1329,  605,
-      605,  605,  605,  605,  605,  614,  615,  615,  615,  615,
-      615,  763,   48,   48,  460,  586,  587,  587,  587,  587,
-      587,  587,  588,  377,  896,  377,  589, 1007,  590,   48,
-       48, 1083,  589,  589,  589,  589,  589,  589,  618,  619,
-      619,  619,  619,  619, 1329,  621,  621,  621,  621,  621,
-      621,   48,   48,   48,  590,  447,  593,  593,  593,  593,
-      593,  593,  578,  377, 1329,  988,  594, 1329,   48,   48,
-       48,  887,  594,  594,  594,  594,  594,  594,  595,  596,
+      535,  535,  535,  535,  535,  535,  535,  523, 1072,  447,
+     1197,  536, 1231, 1458, 1458,   55,   55,  536,  536,  536,
+      536,  536,  536,  537,  538,  538,  538,  538,  538,  538,
+      538,  539,  822,  873,   55,  540, 1197,  541, 1110, 1458,
+     1458,  540,  540,  540,  540,  540,  540,  780,  781,  781,
+      781,  781,  781,  781,  784,  785,  785,  785,  785,  785,
+      785,  808,   55,  541,  462,  548,  548,  548,  548,  548,
+      548,  548,  464, 1068, 1066,  809,  549, 1458,   55, 1060,
+       55,  808,  549,  549,  549,  549,  549,  549,  550,  551,
+      551,  551,  551,  551,  551, 1458,   55,  824,  447,  552,
 
-      596,  596,  596,  596,  596,  597,  891,  797,  888,  598,
-     1329,  599,  988, 1329,  704,  598,  598,  598,  598,  598,
-      598, 1329,  524,  524,  524,  524,  524,  524, 1329,  536,
-      536,  536,  536,  536,  536,   48,   48,  599,  456,  604,
-      604,  604,  604,  604,  604,  581,  766, 1329,  958,  605,
-     1329, 1329,   48,   48,  762,  605,  605,  605,  605,  605,
-      605,  606,  607,  607,  607,  607,  607,  607,  608,  889,
-      760,  981,  609, 1329,  610,  754, 1329, 1329,  609,  609,
-      609,  609,  609,  609,  660,  661,  661,  661,  661,  661,
-     1329,  663,  663,  663,  663,  663,  663,  870,   48,   48,
+     1113,  809,   55, 1458,   55,  552,  552,  552,  552,  552,
+      552,  590,  810,  591,  591,  591,  591,  591,  591,  591,
+       55, 1458,   55, 1228,  591, 1114,  811,  862, 1056,   55,
+      591,  591,  591,  591,  591,  591,  592,  593,  593,  593,
+      593,  593,  593,  593, 1054,  853, 1209,   55,  594, 1212,
+      595, 1049,  811, 1024,  594,  594,  594,  594,  594,  594,
+      792,  793,  793,  793,  793,  793,  793,  795,  796,  796,
+      796,  796,  796,  796,  810,   55,  595,  592,  594,  594,
+      594,  594,  594,  594,  594, 1458,  862,  447, 1458,  594,
+     1458, 1225, 1458,   55, 1027,  594,  594,  594,  594,  594,
 
-      610,  547,  620,  620,  620,  620,  620,  620,  549, 1127,
-      871, 1135,  621,  946,  750,   48,   48,  748,  621,  621,
-      621,  621,  621,  621,  622,  623,  623,  623,  623,  623,
-      795,  881, 1143,  743,  624, 1127,  871, 1135,   48,  872,
-      624,  624,  624,  624,  624,  624,  645,  646,  646,  646,
-      646,  646,  873,  934, 1329,   48,  647, 1224, 1143,   48,
-       48,  739,  647,  647,  647,  647,  647,  647,  447,  523,
-      523,  523,  523,  523,  523,  578,   48,   48,  873,  524,
-     1329,  734,   48, 1224,  917,  524,  524,  524,  524,  524,
-      524,  648,  649,  649,  649,  649,  649,  918, 1084,   48,
+      594,  431,  597,  597,  597,  597,  597,  597,  597,  873,
+      911, 1458,  853,  598, 1458, 1256, 1458, 1030, 1458,  598,
+      598,  598,  598,  598,  598,   53,  598,  598,  598,  598,
+      598,  598,  598,  599,  599,  599,  599,  599,  599,  599,
+      885, 1256, 1045, 1040,  600, 1264, 1272, 1458, 1033,  447,
+      600,  600,  600,  600,  600,  600,   53,  600,  600,  600,
+      600,  600,  600,  600,  603,  604,  604,  604,  604,  604,
+      604, 1264, 1272, 1458, 1353,  605, 1382, 1386,   55,   55,
+       55,  605,  605,  605,  605,  605,  605,  362,  451,  451,
+      451,  451,  451,  451,  451,  523,   55,   55,   55,  452,
 
-     1080,  650, 1253, 1257,   48,   48,  923,  650,  650,  650,
-      650,  650,  650,  456,  535,  535,  535,  535,  535,  535,
-      581,   48,   48,  918,  536, 1261,   48,   48, 1253, 1257,
-      536,  536,  536,  536,  536,  536,  651,  652,  652,  652,
-      652,  652,  984,   48,   48, 1081,  653,  914,   48, 1086,
-      814, 1261,  653,  653,  653,  653,  653,  653,  657,  658,
-      658,  658,  658,  658,  377,   48,  912, 1082,  659,  799,
-     1265,   48,   48, 1093,  659,  659,  659,  659,  659,  659,
-      586,  662,  662,  662,  662,  662,  662,  588,   48,   48,
-     1303,  663,  905,  902, 1165,   48, 1265,  663,  663,  663,
+     1353,   55, 1382, 1386,  858,  452,  452,  452,  452,  452,
+      452,  606,  607,  607,  607,  607,  607,  607,  859,   55,
+     1210, 1211,  608, 1222, 1215,   55,  447, 1136,  608,  608,
+      608,  608,  608,  608,  612,  613,  613,  613,  613,  613,
+      613,  447, 1241,   55,  859,  614, 1117, 1234, 1231,   55,
+       55,  614,  614,  614,  614,  614,  614,  528,  617,  617,
+      617,  617,  617,  617,  617,  530, 1001,   55,   55,  618,
+     1228, 1225,   55,   55, 1003,  618,  618,  618,  618,  618,
+      618,  619,  620,  620,  620,  620,  620,  620,  447, 1213,
+       55,   55,  621, 1222, 1117,   55,   55,   55,  621,  621,
 
-      663,  663,  663,  664,  665,  665,  665,  665,  665,  377,
-      921,  932,   48,  666,  899, 1233, 1303, 1096, 1099,  666,
-      666,  666,  666,  666,  666,  668,  669,  669,  669,  669,
-      669,  672,  673,  673,  673,  673,  673,  595,  674,  674,
-      674,  674,  674,  674,  597,  944,  956, 1311,  675, 1312,
-      896,   48, 1102, 1105,  675,  675,  675,  675,  675,  675,
-      676,  677,  677,  677,  677,  677,  377, 1005,   48,  894,
-      678, 1234,  799, 1311, 1170, 1312,  678,  678,  678,  678,
-      678,  678, 1329,  675,  675,  675,  675,  675,  675,  680,
-      681,  681,  681,  681,  681,  683,  684,  684,  684,  684,
+      621,  621,  621,  621,  537,  629,  629,  629,  629,  629,
+      629,  629,  539,   55,   55,   55,  630, 1001, 1362, 1294,
+       55, 1206,  630,  630,  630,  630,  630,  630,  631,  632,
+      632,  632,  632,  632,  632,  447, 1040, 1003,   55,  633,
+     1390, 1363,  814,   55, 1222,  633,  633,  633,  633,  633,
+      633,  462,  639,  639,  639,  639,  639,  639,  639,  464,
+     1049,   55, 1394,  640, 1432, 1440, 1390,  997, 1225,  640,
+      640,  640,  640,  640,  640,  641,  642,  642,  642,  642,
+      642,  642,  642,  643, 1060, 1364,  995,  644, 1394,  645,
+     1432, 1440, 1228,  644,  644,  644,  644,  644,  644,  799,
 
-      684,  687,  688,  688,  688,  688,  688,  606,  689,  689,
-      689,  689,  689,  689,  608, 1075, 1313, 1314,  690,  702,
-       48,   48, 1077,  878,  690,  690,  690,  690,  690,  690,
-      691,  692,  692,  692,  692,  692,  377,   48,   48,  698,
-      693,  696, 1313, 1314,  729, 1280,  693,  693,  693,  693,
-      693,  693, 1329,  690,  690,  690,  690,  690,  690,  612,
-      612,  612,  612,  612,  612,  696,  615,  615,  615,  615,
-      615,  615,  392,  617,  617,  617,  617,  617,  617,  698,
-      619,  619,  619,  619,  619,  619,  547,  700,  700,  700,
-      700,  700,  700,  549,  726,  723,  814,  701,  799,  799,
+      800,  800,  800,  800,  800,  800,  715,  715,  715,  715,
+      715,  715,  715,   55,  858,  645,  669,  669,  669,  669,
+      669,  669,  669, 1441, 1072, 1442, 1443,  669, 1458, 1086,
+       55,   55, 1231,  669,  669,  669,  669,  669,  669,  670,
+      670,  670,  670,  670,  670,  670,  909, 1084,   55, 1441,
+      670, 1442, 1443, 1444, 1458, 1234,  670,  670,  670,  670,
+      670,  670,  592,  671,  671,  671,  671,  671,  671,  671,
+      672,  672,  672,  672,  672,  672,  672, 1134, 1204, 1444,
+     1449,  672, 1455,   55,   55, 1299, 1206,  672,  672,  672,
+      672,  672,  672,  431,  674,  674,  674,  674,  674,  674,
 
-      549,  606,  768,  701,  701,  701,  701,  701,  701, 1329,
-      701,  701,  701,  701,  701,  701,  702,  703,  703,  703,
-      703,  703,  703,  704,   48,   48,   48,  705,   48,  706,
-      602,  926,  600,  705,  705,  705,  705,  705,  705,   48,
-     1315,   48,   48,   48,  927,   48,  739,  661,  661,  661,
-      661,  661,  661,  711,  716,  706,   48,  297,  586,  722,
-      722,  722,  722,  722,  722,  723, 1315,  977,  595,  724,
-      927,  590,  756,  591,  586,  724,  724,  724,  724,  724,
-      724, 1329,  742,  742,  742,  742,  742,  742,  748,  669,
-      669,  669,  669,  669,  669,   48,   48,  590,  595,  725,
+      674,   55,   55,  447, 1033,  675, 1449, 1074, 1455,  447,
+     1295,  675,  675,  675,  675,  675,  675,   53,  675,  675,
+      675,  675,  675,  675,  675,  676,  676,  676,  676,  676,
+      676,  676, 1204, 1030, 1062,  447,  677, 1027, 1051,  447,
+     1458, 1024,  677,  677,  677,  677,  677,  677,   53,  677,
+      677,  677,  677,  677,  677,  677,  528,  680,  680,  680,
+      680,  680,  680,  680,  681,   55,  867,  867,  682, 1042,
+      532,   55,  447,  869,  682,  682,  682,  682,  682,  682,
+      868, 1458, 1136,   55,  447, 1117, 1033,  870, 1030,   55,
+       55, 1027,   55, 1024,   55,  823,  532,  537,  683,  683,
 
-      725,  725,  725,  725,  725,  726,  745,  736,  733,  727,
-      656,  599,   48,   48,  644,  727,  727,  727,  727,  727,
-      727,  447,  671,  671,  671,  671,  671,  671,  750,  673,
-      673,  673,  673,  673,  673,  928, 1235,  599,  606,  728,
-      728,  728,  728,  728,  728,  729,  729,  726,  929,  730,
-     1320,  610,  723,  721,  644,  730,  730,  730,  730,  730,
-      730, 1329,  753,  753,  753,  753,  753,  753,  681,  681,
-      681,  681,  681,  681,  929,   48, 1320,  610,  734,  735,
-      735,  735,  735,  735,  735,  736,  547,  704,  543,  737,
-     1326,  738,   48,  541,  581,  737,  737,  737,  737,  737,
+      683,  683,  683,  683,  683,  684,  868, 1458,   55,  685,
+       55,  541,   55,  870,   55,  685,  685,  685,  685,  685,
+      685,  831,  828, 1117,  338,  836,  836,  836,  836,  836,
+      836,  836,   55,  869,  879,  879,   55,  541,  689,  690,
+      690,  690,  690,  690,  690,  690,  691, 1458,  880, 1458,
+      692,  916,  693, 1003,   55,  881,  692,  692,  692,  692,
+      692,  692,  793,  793,  793,  793,  793,  793,  793,  882,
+       55, 1010,  816, 1458,  880, 1458,  881,  885,  693,  528,
+      696,  696,  696,  696,  696,  696,  696,  681,   55, 1086,
+     1458,  697, 1033,  709,   55,  882, 1409,  697,  697,  697,
 
-      737,  760,  684,  684,  684,  684,  684,  684,  456,  686,
-      686,  686,  686,  686,  686,   48, 1326,  738,  586,  741,
-      741,  741,  741,  741,  741,  723,  578,  656,  644,  742,
-      644,  642,   48,  641,  640,  742,  742,  742,  742,  742,
-      742,  743,  744,  744,  744,  744,  744,  744,  745, 1232,
-      639,  638,  746,  637,  747,  636,  635,  634,  746,  746,
-      746,  746,  746,  746,  762,  688,  688,  688,  688,  688,
-      688, 1329,  765,  765,  765,  765,  765,  765,   48,  633,
-      747,  595,  752,  752,  752,  752,  752,  752,  726,  632,
-      631,  630,  753,  629,  628,   48,  627,  626,  753,  753,
+      697,  697,  697,  698,  699,  699,  699,  699,  699,  699,
+      699,  700,   55,  881,  879,  701, 1458,  702,  873, 1074,
+     1030,  701,  701,  701,  701,  701,  701,  891,  892,  892,
+      892,  892,  892,  892,  894,  895,  895,  895,  895,  895,
+      895,  995,   55,  702,  537,  707,  707,  707,  707,  707,
+      707,  707,  684,  698,  869,  996,  708,  867,  862, 1062,
+       55, 1012,  708,  708,  708,  708,  708,  708,  709,  710,
+      710,  710,  710,  710,  710,  710,  711, 1027, 1013,  689,
+      712,  996,  713,  858,   55,   55,  712,  712,  712,  712,
+      712,  712,  898,  899,  899,  899,  899,  899,  899,  853,
 
-      753,  753,  753,  753,  754,  755,  755,  755,  755,  755,
-      755,  756,  394,  456, 1278,  757,  608,  758,  452,  447,
-      597,  757,  757,  757,  757,  757,  757,  772,  773,  773,
-      773,  773,  773,  775,  776,  776,  776,  776,  776,   48,
-      938,  588,  585,  758,  606,  764,  764,  764,  764,  764,
-      764,  729,  517,  939,  508,  765,   48,  581,  578,  576,
-      508,  765,  765,  765,  765,  765,  765,  766,  767,  767,
-      767,  767,  767,  767,  768, 1307,  573,  572,  769,  939,
-      770,  571,  570,  569,  769,  769,  769,  769,  769,  769,
-      779,  780,  780,  780,  780,  780, 1329,  782,  782,  782,
+     1051, 1024,   55,   55, 1042,  995,  997,   55,  713,  641,
+      723,  723,  723,  723,  723,  723,  723,  643,  914, 1458,
+      998,  724, 1112,  939,  924,   55,  997,  724,  724,  724,
+      724,  724,  724,  725,  726,  726,  726,  726,  726,  726,
+     1458, 1014, 1033, 1030,  727, 1458,  998, 1027, 1024, 1022,
+      727,  727,  727,  727,  727,  727,   53,   53,   53,   53,
+       53,   53,   53,  924,  814, 1003, 1458,   53,   55,   55,
+       55,   55,   55,   53,   53,   53,   53,   53,   53,  943,
+      944,  944,  944,  944,  944,  944,   55,   55,   55,   55,
+       55,  729,  747,  816,  748,  748,  748,  748,  748,  748,
 
-      782,  782,  782,  940,   48,   48,  770,  702,  781,  781,
-      781,  781,  781,  781,  704,  568,  941,  567,  782,  566,
-      565,   48,   48,  564,  782,  782,  782,  782,  782,  782,
-      783,  784,  784,  784,  784,  784,  882,  883,  884,  563,
-      785,  562,  941,  561,  560,  950,  785,  785,  785,  785,
-      785,  785,  800,  801,  801,  801,  801,  801,  951,  559,
-      558,  557,  802,  556,  555,  554,  553,  552,  802,  802,
-      802,  802,  802,  802,  586,  662,  662,  662,  662,  662,
-      662,  723,  392,  549,  951,  663,   48,  388,  442,  517,
-      508,  663,  663,  663,  663,  663,  663,  803,  804,  804,
+      748, 1006, 1007, 1008, 1009,  748, 1016,  641,   55, 1109,
+       55,  748,  748,  748,  748,  748,  748,  951,  952,  952,
+      952,  952,  952,  952, 1045, 1045,   55,   55,   55,   53,
+      749,  750,  750,  750,  750,  750,  750,  750, 1046, 1458,
+     1108,  810,  750, 1216,  808,   55,  887,  848,  750,  750,
+      750,  750,  750,  750,  955,  956,  956,  956,  956,  956,
+      956,  875, 1361,  845, 1046, 1458,   53,  671,  671,  671,
+      671,  671,  671,  671,  963,  964,  964,  964,  964,  964,
+      964,  966,  967,  967,  967,  967,  967,  967,  970,  971,
+      971,  971,  971,  971,  971,  979,  980,  980,  980,  980,
 
-      804,  804,  804,   48,  442,  442,  508,  805,  365,  505,
-      504,  503, 1166,  805,  805,  805,  805,  805,  805, 1329,
-      663,  663,  663,  663,  663,  663,  595,  674,  674,  674,
-      674,  674,  674,  726,  502,  501,  500,  675,   48,  499,
-      498,  294,  213,  675,  675,  675,  675,  675,  675,  806,
-      807,  807,  807,  807,  807,   48,  497,  496,  495,  808,
-      494,  493,  492,  491, 1279,  808,  808,  808,  808,  808,
-      808, 1329,  675,  675,  675,  675,  675,  675,  606,  689,
-      689,  689,  689,  689,  689,  729,  490,  489,  488,  690,
-      487,  486,  483,  480,  479,  690,  690,  690,  690,  690,
+      980,  980,   53,  672,  672,  672,  672,  672,  672,  672,
+      864,  842,  855,  939,  672,  924,  848,  845,  842,  924,
+      672,  672,  672,  672,  672,  672,  751,  350,  350,  350,
+      350,  350,  350,  350,  265,  753,  753,  753,  753,  753,
+      753,  753,  816,  643,  709,  887,  754,  848,  537,  705,
+      703,  698,  754,  754,  754,  754,  754,  754,   53,  754,
+      754,  754,  754,  754,  754,  754,  757,  758,  758,  758,
+      758,  758,  758,  875,  845,  528,  694,  759,  689,  864,
+      842,  855,  852,  759,  759,  759,  759,  759,  759,  528,
+      617,  617,  617,  617,  617,  617,  617,  681,  768,  756,
 
-      690,  809,  810,  810,  810,  810,  810,  478,  477,  476,
-      475,  811,  474,  473,  246,  377,  312,  811,  811,  811,
-      811,  811,  811, 1329,  690,  690,  690,  690,  690,  690,
-      815,  816,  816,  816,  816,  816,  377,  458,  449,  377,
-      817,  446,  374,  368,  442,  440,  817,  817,  817,  817,
-      817,  817,  818,  819,  819,  819,  819,  819,  734,  820,
-      820,  820,  820,  820,  820,  736,  368,  435,  434,  821,
-      433,  432,  431,  430,  429,  821,  821,  821,  821,  821,
-      821,  822,  823,  823,  823,  823,  823,  377,  428,  427,
-      426,  824,  425,  424,  421,  420,  417,  824,  824,  824,
+      848,  618,  845,  842,  840,  756, 1054,  618,  618,  618,
+      618,  618,  618,  760,  761,  761,  761,  761,  761,  761,
+     1055,  641,  816,  643,  762,  462,  637,  635,  711,  684,
+      762,  762,  762,  762,  762,  762,  537,  629,  629,  629,
+      629,  629,  629,  629,  684,  700, 1055,  681,  630,  691,
+      768,  756,  684, 1054,  630,  630,  630,  630,  630,  630,
+      763,  764,  764,  764,  764,  764,  764, 1458,  681,  756,
+       53,  765,   53,   53,  743,   53,   53,  765,  765,  765,
+      765,  765,  765,  769,  770,  770,  770,  770,  770,  770,
+      447,  737,  643, 1458,  771,  464,  537,  711,  684,  362,
 
-      824,  824,  824, 1329,  821,  821,  821,  821,  821,  821,
-      826,  827,  827,  827,  827,  827,  830,  831,  831,  831,
-      831,  831,  743,  832,  832,  832,  832,  832,  832,  745,
-      416,  415,  414,  833,  413,  109,  412,  411,  402,  833,
-      833,  833,  833,  833,  833,  834,  835,  835,  835,  835,
-      835,  377,  401,  400,  399,  836,  398,  397,  244,  394,
-      377,  836,  836,  836,  836,  836,  836, 1329,  833,  833,
-      833,  833,  833,  833,  838,  839,  839,  839,  839,  839,
-      841,  842,  842,  842,  842,  842,  845,  846,  846,  846,
-      846,  846,  754,  847,  847,  847,  847,  847,  847,  756,
+      771,  771,  771,  771,  771,  771,  689,  774,  774,  774,
+      774,  774,  774,  774,  691,  533,  528,  700,  775,  681,
+      691,  688,  611,  602,  775,  775,  775,  775,  775,  775,
+      776,  777,  777,  777,  777,  777,  777,  447,  684,  681,
+      679,  778,  602,  592,  590,  668,  667,  778,  778,  778,
+      778,  778,  778,  698,  786,  786,  786,  786,  786,  786,
+      786,  700,  666,  665,  664,  787,  663,  662,  661,  660,
+      659,  787,  787,  787,  787,  787,  787,  788,  789,  789,
+      789,  789,  789,  789,  447,  658,  657,  656,  790,  655,
+      654,  653,  652,  651,  790,  790,  790,  790,  790,  790,
 
-      374,  368,  368,  848, 1329,  233,  364,  357,  354,  848,
-      848,  848,  848,  848,  848,  849,  850,  850,  850,  850,
-      850,  377,  353,  352,  351,  851,  350,  349,  348,  347,
-      346,  851,  851,  851,  851,  851,  851, 1329,  848,  848,
-      848,  848,  848,  848,  854,  855,  855,  855,  855,  855,
-      857,  858,  858,  858,  858,  858,  861,  862,  862,  862,
-      862,  862,  766,  863,  863,  863,  863,  863,  863,  768,
-      345,  344,  343,  864,  342,  341,  340,  339,  338,  864,
-      864,  864,  864,  864,  864,  865,  866,  866,  866,  866,
-      866,  377,  333,  332,  276,  867,  331,  330,  329,  328,
+      709,  801,  801,  801,  801,  801,  801,  801,  711,  650,
+      649,  648,  802,  647,  646,  462,  643,  464,  802,  802,
+      802,  802,  802,  802,  803,  804,  804,  804,  804,  804,
+      804,  447,  458,  539,  523,  805,  530,  611,  602,  523,
+      602,  805,  805,  805,  805,  805,  805,  641,  812,  812,
+      812,  812,  812,  812,  812,  643,  596,  596,  589,  813,
+      588,  587,  586,  585,  584,  813,  813,  813,  813,  813,
+      813,  814,  815,  815,  815,  815,  815,  815,  815,  816,
+      583,  582,  581,  817,  335,  818,  237,  580,  579,  817,
+      817,  817,  817,  817,  817,  982,  983,  983,  983,  983,
 
-      327,  867,  867,  867,  867,  867,  867, 1329,  864,  864,
-      864,  864,  864,  864,  773,  773,  773,  773,  773,  773,
-      870,  776,  776,  776,  776,  776,  776,  547,  778,  778,
-      778,  778,  778,  778,  872,  780,  780,  780,  780,  780,
-      780,  702,  874,  874,  874,  874,  874,  874,  704,  326,
-      314,  242,  875,  311,  239,  236,  308,  131,  875,  875,
-      875,  875,  875,  875, 1329,  875,  875,  875,  875,  875,
-      875,  876,  877,  877,  877,  877,  877,  877,  878,  302,
-      301,  298,  879,  297,  880,  276,  296,  295,  879,  879,
-      879,  879,  879,  879,  917,  819,  819,  819,  819,  819,
+      983,  983,  986,  987,  987,  987,  987,  987,  987, 1056,
+     1056,  818,   55, 1066,  832,  832,  832,  832,  832,  832,
+      832,  578,  577, 1057, 1458,  832,  576, 1067,  575,  574,
+       55,  832,  832,  832,  832,  832,  832,  833,  833,  833,
+      833,  833,  833,  833,  573,  572,  571,  570,  833, 1057,
+     1458,  569,  566, 1067,  833,  833,  833,  833,  833,  833,
+      834,  835,  835,  835,  835,  835,  835,  563,  562,  561,
+      560,  836,  559,   55,  558,  557,  556,  836,  836,  836,
+      836,  836,  836,  265,  837,  837,  837,  837,  837,  837,
+      837,   55,  555,  554,  464,  838,  277,  447,  362,  539,
 
-      819, 1329,  920,  920,  920,  920,  920,  920,  294,  293,
-      880,  734,  895,  895,  895,  895,  895,  895,  896,  292,
-      291,  290,  897,  289,  738,  288,  287,  286,  897,  897,
-      897,  897,  897,  897,  926,  827,  827,  827,  827,  827,
-      827,  586,  829,  829,  829,  829,  829,  829,  285,  284,
-      738,  743,  898,  898,  898,  898,  898,  898,  899,  283,
-      282,  279,  900,  278,  747,  277,  276,  275,  900,  900,
-      900,  900,  900,  900,  928,  831,  831,  831,  831,  831,
-      831, 1329,  931,  931,  931,  931,  931,  931,  952,  274,
-      747,  754,  901,  901,  901,  901,  901,  901,  902,  273,
+     1408,  838,  838,  838,  838,  838,  838,   53,  838,  838,
+      838,  838,  838,  838,  838,  689,  841,  841,  841,  841,
+      841,  841,  841,  842,  523,  530,  447,  843,  527,  693,
+      444,  438,  523,  843,  843,  843,  843,  843,  843,  892,
+      892,  892,  892,  892,  892,  892,  964,  964,  964,  964,
+      964,  964,  964, 1066,  521,  693,  698,  844,  844,  844,
+      844,  844,  844,  844,  845,  438, 1068, 1458,  846,  430,
+      702,  424, 1068, 1078,  846,  846,  846,  846,  846,  846,
+     1069,  508,  507,  506,  505,  504, 1458, 1079,  503,  502,
+      501,  500,   55, 1458, 1078,  499,  702,  709,  847,  847,
 
-      272,  953,  903,  271,  758,  270,  269,  268,  903,  903,
-      903,  903,  903,  903,  839,  839,  839,  839,  839,  839,
-      938,  842,  842,  842,  842,  842,  842,  953,  267,  266,
-      758,  766,  904,  904,  904,  904,  904,  904,  905,  265,
-      264,  263,  906,  262,  770,  261,  260,  259,  906,  906,
-      906,  906,  906,  906,  595,  844,  844,  844,  844,  844,
-      844,  940,  846,  846,  846,  846,  846,  846,  258, 1069,
-      770,  908,  909,  909,  909,  909,  909,  910,  256,  255,
-      254,  911, 1070,  253,  252,  251,  250,  911,  911,  911,
-      911,  911,  911,  912,  913,  913,  913,  913,  913,  913,
+      847,  847,  847,  847,  847,  848, 1069,  498, 1458,  849,
+       55,  713, 1458, 1079, 1080,  849,  849,  849,  849,  849,
+      849,  980,  980,  980,  980,  980,  980,  980, 1081, 1407,
+      497,  496,  493, 1080, 1458, 1198,  492,  713,  853,  854,
+      854,  854,  854,  854,  854,  854,  855, 1458,  489, 1199,
+      856,  488,  857,  487, 1081, 1198,  856,  856,  856,  856,
+      856,  856, 1090, 1091, 1091, 1091, 1091, 1091, 1091, 1458,
+      486,  485,  119, 1458, 1200, 1199, 1200,  484,  857,  689,
+      860,  860,  860,  860,  860,  860,  860,  842, 1201,  483,
+     1458,  861,  474,  473,  472, 1458,  471,  861,  861,  861,
+
+      861,  861,  861,  862,  863,  863,  863,  863,  863,  863,
+      863,  864,  470,  469, 1201,  865, 1458,  866,  468,  467,
+      275,  865,  865,  865,  865,  865,  865, 1093, 1094, 1094,
+     1094, 1094, 1094, 1094, 1097, 1098, 1098, 1098, 1098, 1098,
+     1098, 1244,  464,  866,  698,  871,  871,  871,  871,  871,
+      871,  871,  845,  277,  447, 1245,  872,  364,  444,  438,
+      438,   55,  872,  872,  872,  872,  872,  872,  873,  874,
+      874,  874,  874,  874,  874,  874,  875,   55,   55,   55,
+      876, 1245,  877,  431,  431,  423,  876,  876,  876,  876,
+      876,  876,  416, 1111,  415,   55,   55, 1140, 1141, 1141,
+
+     1141, 1141, 1141, 1141, 1244,  412, 1105, 1106,  877,  709,
+      883,  883,  883,  883,  883,  883,  883,  848, 1458,  411,
+      410,  884,  409,  408,  407,  406,  405,  884,  884,  884,
+      884,  884,  884,  885,  886,  886,  886,  886,  886,  886,
+      886,  887,   55, 1249, 1458,  888,  404,  889,  403,  402,
+       55,  888,  888,  888,  888,  888,  888, 1250,  401,  400,
+       55, 1146, 1147, 1147, 1147, 1147, 1147, 1147,   55,  399,
+     1249, 1107,  398,  889,  814,  900,  900,  900,  900,  900,
+      900,  900,  816, 1250, 1458,  397,  901, 1436,  396,  391,
+      390, 1251,  901,  901,  901,  901,  901,  901,  902,  903,
+
+      903,  903,  903,  903,  903, 1252,  389,  388,  317,  904,
+     1458,  387,  386,  385,  384,  904,  904,  904,  904,  904,
+      904,   55, 1251,  917,  917,  917,  917,  917,  917,  917,
+      383, 1252,  382,  376,  917,  277, 1458,  364,  273,   55,
+      917,  917,  917,  917,  917,  917,  918,  918,  918,  918,
+      918,  918,  918,  361,  270,  357,  264,  918,  258,  142,
+      345,  344, 1458,  918,  918,  918,  918,  918,  918,  596,
+      919,  919,  919,  919,  919,  919,  919,  343,  338,  317,
+      337,  920,  336,  429,  335,  334,  333,  920,  920,  920,
+      920,  920,  920, 1150, 1151, 1151, 1151, 1151, 1151, 1151,
+
+     1156, 1157, 1157, 1157, 1157, 1157, 1157,  332, 1257,  429,
+      920,  920,  920,  920,  920,  920,  920,  331,  330,  329,
+      328,  920, 1258,  327,  326,  325,  324,  920,  920,  920,
+      920,  920,  920,  265,  921,  921,  921,  921,  921,  921,
+      921,  323,  320,  319,  318,  922,  317,  316, 1258,  315,
+      314,  922,  922,  922,  922,  922,  922,   53,  922,  922,
+      922,  922,  922,  922,  922,  925,  926,  926,  926,  926,
+      926,  926,  313,  312,  311,  310,  927,  309,  308,  307,
+      306,  305,  927,  927,  927,  927,  927,  927,  689,  774,
+      774,  774,  774,  774,  774,  774,  842,  304,  303,  302,
+
+      775,  301,  300,  299,  298, 1257,  775,  775,  775,  775,
+      775,  775,  928,  929,  929,  929,  929,  929,  929, 1458,
+      297,  296,  295,  930,  142,  294,  293,  292,  291,  930,
+      930,  930,  930,  930,  930,  698,  786,  786,  786,  786,
+      786,  786,  786,  845,  290, 1458,  289,  787,  288,  287,
+      286,  285, 1259,  787,  787,  787,  787,  787,  787,  931,
+      932,  932,  932,  932,  932,  932, 1260,  284,  283,  282,
+      933,  281,  280,  277,  265,  270,  933,  933,  933,  933,
+      933,  933,  709,  801,  801,  801,  801,  801,  801,  801,
+      848,  257, 1260,  256,  802,  255,  254,  253,  252, 1259,
+
+      802,  802,  802,  802,  802,  802,  934,  935,  935,  935,
+      935,  935,  935, 1458,  251,  250,  249,  936,  248,  245,
+      242,  239,  238,  936,  936,  936,  936,  936,  936,  940,
+      941,  941,  941,  941,  941,  941,  447,  237,  236, 1458,
+      942,  233,  232,  231,  230,  229,  942,  942,  942,  942,
+      942,  942,  853,  945,  945,  945,  945,  945,  945,  945,
+      855,  228,  227,  226,  946,  225,  224,  223,  222,  221,
+      946,  946,  946,  946,  946,  946,  947,  948,  948,  948,
+      948,  948,  948,  447,  220,  219,  218,  949,  214,  213,
+      203,  202,  201,  949,  949,  949,  949,  949,  949,  862,
+
+      957,  957,  957,  957,  957,  957,  957,  864,  198,  197,
+      192,  958,  191,  190,  189,  188,  187,  958,  958,  958,
+      958,  958,  958,  959,  960,  960,  960,  960,  960,  960,
+      447,  186,  185,  184,  961,  180,  179,  178,  177,  176,
+      961,  961,  961,  961,  961,  961,  873,  972,  972,  972,
+      972,  972,  972,  972,  875,  175,  174,  173,  973,  172,
+      171,  170,  169,  168,  973,  973,  973,  973,  973,  973,
+      974,  975,  975,  975,  975,  975,  975,  447,  167,  166,
+      165,  976,  164,  159,  150,  149,  144,  976,  976,  976,
+      976,  976,  976,  885,  988,  988,  988,  988,  988,  988,
+
+      988,  887,   59,   47,   45,  989, 1458, 1458, 1458, 1458,
+     1458,  989,  989,  989,  989,  989,  989,  990,  991,  991,
+      991,  991,  991,  991,  447, 1458, 1458, 1458,  992, 1458,
+     1458, 1458, 1458, 1458,  992,  992,  992,  992,  992,  992,
+      814,  999,  999,  999,  999,  999,  999,  999,  816, 1458,
+     1458, 1458, 1000, 1458, 1458, 1458, 1458, 1458, 1000, 1000,
+     1000, 1000, 1000, 1000, 1001, 1002, 1002, 1002, 1002, 1002,
+     1002, 1002, 1003, 1458, 1458, 1458, 1004, 1458, 1005, 1458,
+     1458, 1458, 1004, 1004, 1004, 1004, 1004, 1004, 1159, 1160,
+     1160, 1160, 1160, 1160, 1160, 1163, 1164, 1164, 1164, 1164,
 
-      914,  249,  246,   49,  915,  239,  916,  232, 1070,  231,
-      915,  915,  915,  915,  915,  915, 1329,  943,  943,  943,
-      943,  943,  943,  855,  855,  855,  855,  855,  855, 1071,
-      230,  229,  916,  734,  919,  919,  919,  919,  919,  919,
-      896,  228, 1072,  227,  920,  226,  225,  224,  221,  218,
-      920,  920,  920,  920,  920,  920,  921,  922,  922,  922,
-      922,  922,  922,  923,  215,  214,  213,  924, 1072,  925,
-      212,  209,  208,  924,  924,  924,  924,  924,  924,  950,
-      858,  858,  858,  858,  858,  858,  606,  860,  860,  860,
-      860,  860,  860,  207,  206,  925,  743,  930,  930,  930,
+     1164, 1164, 1458, 1458, 1005,   55,  596, 1018, 1018, 1018,
+     1018, 1018, 1018, 1018, 1458, 1458, 1458, 1458, 1019, 1458,
+     1458, 1458, 1458,   55, 1019, 1019, 1019, 1019, 1019, 1019,
+       53, 1019, 1019, 1019, 1019, 1019, 1019, 1019,   55,  265,
+     1020, 1020, 1020, 1020, 1020, 1020, 1020, 1170, 1171, 1171,
+     1171, 1171, 1171, 1171, 1458, 1458,   55,  853, 1023, 1023,
+     1023, 1023, 1023, 1023, 1023, 1024, 1458, 1458, 1458, 1025,
+     1458,  857, 1458, 1458, 1458, 1025, 1025, 1025, 1025, 1025,
+     1025, 1173, 1174, 1174, 1174, 1174, 1174, 1174, 1177, 1178,
+     1178, 1178, 1178, 1178, 1178, 1458, 1458,  857,  862, 1026,
 
-      930,  930,  930,  899,  205,  204,  203,  931,  202,  201,
-      200,  199,  198,  931,  931,  931,  931,  931,  931,  932,
-      933,  933,  933,  933,  933,  933,  934,  197,  196,  195,
-      935,  194,  936,  190,  189,  179,  935,  935,  935,  935,
-      935,  935,  952,  862,  862,  862,  862,  862,  862, 1329,
-      955,  955,  955,  955,  955,  955,  178,  177,  936,  754,
-      942,  942,  942,  942,  942,  942,  902,  174,  173,  172,
-      943,  171,  170,  169,  167,  163,  943,  943,  943,  943,
-      943,  943,  944,  945,  945,  945,  945,  945,  945,  946,
-      162,  160,  159,  947,  158,  948,  157,  156,  154,  947,
+     1026, 1026, 1026, 1026, 1026, 1026, 1027, 1458, 1458, 1458,
+     1028, 1458,  866, 1458, 1458, 1458, 1028, 1028, 1028, 1028,
+     1028, 1028, 1184, 1185, 1185, 1185, 1185, 1185, 1185, 1187,
+     1188, 1188, 1188, 1188, 1188, 1188, 1458, 1458,  866,  873,
+     1029, 1029, 1029, 1029, 1029, 1029, 1029, 1030, 1458, 1458,
+     1458, 1031, 1458,  877, 1458, 1458, 1458, 1031, 1031, 1031,
+     1031, 1031, 1031, 1191, 1192, 1192, 1192, 1192, 1192, 1192,
+     1091, 1091, 1091, 1091, 1091, 1091, 1091,   55, 1458,  877,
+      885, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1033, 1458,
+     1265, 1265, 1034, 1458,  889,   55, 1458, 1458, 1034, 1034,
 
-      947,  947,  947,  947,  947,  962,  963,  963,  963,  963,
-      963,  965,  966,  966,  966,  966,  966,  153, 1115,  152,
-      145,  948,  766,  954,  954,  954,  954,  954,  954,  905,
-      138, 1116,  137,  955,  132,   84,   58,   47,   45,  955,
-      955,  955,  955,  955,  955,  956,  957,  957,  957,  957,
-      957,  957,  958, 1329, 1329, 1329,  959, 1116,  960, 1329,
-     1329, 1329,  959,  959,  959,  959,  959,  959,  969,  970,
-      970,  970,  970,  970, 1329,  972,  972,  972,  972,  972,
-      972, 1120, 1122, 1329,  960,  876,  971,  971,  971,  971,
-      971,  971,  878, 1329, 1121, 1123,  972, 1329, 1329,   48,
+     1034, 1034, 1034, 1034, 1266, 1458, 1214, 1236, 1237, 1237,
+     1237, 1237, 1237, 1237, 1458, 1267, 1458, 1458, 1458, 1267,
+      889, 1036, 1037, 1037, 1037, 1037, 1037, 1037, 1038, 1268,
+     1266, 1458, 1039, 1458, 1458, 1458, 1458, 1458, 1039, 1039,
+     1039, 1039, 1039, 1039, 1040, 1041, 1041, 1041, 1041, 1041,
+     1041, 1041, 1042, 1458, 1458, 1268, 1043, 1458, 1044, 1458,
+     1458, 1458, 1043, 1043, 1043, 1043, 1043, 1043, 1157, 1157,
+     1157, 1157, 1157, 1157, 1157, 1171, 1171, 1171, 1171, 1171,
+     1171, 1171, 1273, 1458, 1044,  853, 1047, 1047, 1047, 1047,
+     1047, 1047, 1047, 1024, 1458, 1458, 1274, 1048, 1458, 1458,
 
-     1329, 1329,  972,  972,  972,  972,  972,  972,  973,  974,
-      974,  974,  974,  974,   48,   48,   48,   48,  975, 1329,
-     1121, 1123, 1329, 1329,  975,  975,  975,  975,  975,  975,
-      980,   48,   48, 1329,   48, 1329,  821,  821,  821,  821,
-      821,  821,  978,  979, 1128, 1130, 1329,   48,  983,  989,
-      990,  990,  990,  990,  990, 1329, 1329, 1129, 1131,  991,
-     1329, 1329, 1329, 1329,   48,  991,  991,  991,  991,  991,
-      991,  734,  820,  820,  820,  820,  820,  820,  896, 1087,
-     1329, 1329,  821, 1129, 1131, 1329, 1329, 1136,  821,  821,
-      821,  821,  821,  821,  992,  993,  993,  993,  993,  993,
+     1458, 1458, 1458, 1048, 1048, 1048, 1048, 1048, 1048, 1049,
+     1050, 1050, 1050, 1050, 1050, 1050, 1050, 1051, 1458, 1458,
+     1458, 1052, 1274, 1053, 1458, 1458, 1273, 1052, 1052, 1052,
+     1052, 1052, 1052, 1185, 1185, 1185, 1185, 1185, 1185, 1185,
+     1458, 1458, 1458, 1458, 1458, 1275, 1458, 1275, 1458, 1053,
+      862, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1027, 1276,
+     1458, 1458, 1059, 1458, 1458, 1458, 1458, 1458, 1059, 1059,
+     1059, 1059, 1059, 1059, 1060, 1061, 1061, 1061, 1061, 1061,
+     1061, 1061, 1062, 1458, 1458, 1276, 1063, 1458, 1064, 1458,
+     1458, 1458, 1063, 1063, 1063, 1063, 1063, 1063, 1281, 1282,
 
-     1137, 1329, 1329, 1329,  994, 1329, 1329, 1329, 1329, 1329,
-      994,  994,  994,  994,  994,  994,  743,  832,  832,  832,
-      832,  832,  832,  899, 1329, 1329, 1137,  833, 1329, 1329,
-     1329, 1329, 1329,  833,  833,  833,  833,  833,  833,  995,
-      996,  996,  996,  996,  996, 1329, 1329, 1329, 1329,  997,
-     1329, 1329, 1329, 1329, 1329,  997,  997,  997,  997,  997,
-      997, 1329,  833,  833,  833,  833,  833,  833,  754,  847,
-      847,  847,  847,  847,  847,  902, 1329, 1329, 1329,  848,
-     1329, 1329, 1329, 1329, 1329,  848,  848,  848,  848,  848,
-      848,  998,  999,  999,  999,  999,  999, 1329, 1329, 1329,
+     1282, 1282, 1282, 1282, 1282, 1284, 1285, 1285, 1285, 1285,
+     1285, 1285, 1307, 1458, 1064,  873, 1070, 1070, 1070, 1070,
+     1070, 1070, 1070, 1030, 1458, 1458, 1308, 1071, 1458, 1458,
+     1458, 1458, 1458, 1071, 1071, 1071, 1071, 1071, 1071, 1072,
+     1073, 1073, 1073, 1073, 1073, 1073, 1073, 1074, 1458, 1458,
+     1458, 1075, 1308, 1076, 1458, 1458, 1307, 1075, 1075, 1075,
+     1075, 1075, 1075, 1288, 1289, 1289, 1289, 1289, 1289, 1289,
+     1458, 1313, 1314, 1314, 1314, 1314, 1314, 1314, 1458, 1076,
+      885, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1033, 1458,
+     1458, 1458, 1083, 1458, 1458, 1458, 1458,   55, 1083, 1083,
 
-     1329, 1000, 1329, 1329, 1329, 1329, 1329, 1000, 1000, 1000,
-     1000, 1000, 1000, 1329,  848,  848,  848,  848,  848,  848,
-      766,  863,  863,  863,  863,  863,  863,  905, 1329, 1329,
-     1329,  864, 1329, 1329, 1329, 1329, 1329,  864,  864,  864,
-      864,  864,  864, 1001, 1002, 1002, 1002, 1002, 1002, 1329,
-     1329, 1329, 1329, 1003, 1329, 1329, 1329, 1329, 1329, 1003,
-     1003, 1003, 1003, 1003, 1003, 1329,  864,  864,  864,  864,
-      864,  864, 1005, 1006, 1006, 1006, 1006, 1006, 1006, 1007,
-     1329, 1329, 1329, 1008, 1329, 1009, 1329, 1329, 1329, 1008,
-     1008, 1008, 1008, 1008, 1008, 1011, 1012, 1012, 1012, 1012,
+     1083, 1083, 1083, 1083, 1084, 1085, 1085, 1085, 1085, 1085,
+     1085, 1085, 1086,   55, 1458,   55, 1087, 1458, 1088, 1458,
+     1458, 1458, 1087, 1087, 1087, 1087, 1087, 1087, 1296, 1458,
+     1458,   55, 1318, 1319, 1319, 1319, 1319, 1319, 1319, 1458,
+     1458, 1354, 1297, 1458, 1088, 1001, 1099, 1099, 1099, 1099,
+     1099, 1099, 1099, 1003, 1458, 1355, 1458, 1100, 1458, 1458,
+     1458, 1458, 1354, 1100, 1100, 1100, 1100, 1100, 1100, 1101,
+     1102, 1102, 1102, 1102, 1102, 1102, 1458, 1458, 1458, 1458,
+     1103, 1355, 1458, 1458, 1458, 1458, 1103, 1103, 1103, 1103,
+     1103, 1103,   55,  596, 1115, 1115, 1115, 1115, 1115, 1115,
 
-     1012, 1329, 1014, 1014, 1014, 1014, 1014, 1014, 1329, 1329,
-     1329, 1009,  912, 1013, 1013, 1013, 1013, 1013, 1013,  914,
-     1329, 1329, 1329, 1014, 1329, 1329, 1329, 1329, 1329, 1014,
-     1014, 1014, 1014, 1014, 1014, 1017, 1018, 1018, 1018, 1018,
-     1018, 1021, 1022, 1022, 1022, 1022, 1022,  921, 1023, 1023,
-     1023, 1023, 1023, 1023,  923, 1329, 1329, 1329, 1024, 1329,
-     1329, 1329, 1329, 1329, 1024, 1024, 1024, 1024, 1024, 1024,
-     1329, 1024, 1024, 1024, 1024, 1024, 1024, 1027, 1028, 1028,
-     1028, 1028, 1028, 1030, 1031, 1031, 1031, 1031, 1031, 1034,
-     1035, 1035, 1035, 1035, 1035,  932, 1036, 1036, 1036, 1036,
+     1115, 1458, 1458, 1458, 1458,  922, 1458, 1458, 1458, 1458,
+       55,  922,  922,  922,  922,  922,  922,   53,  922,  922,
+      922,  922,  922,  922,  922,   55,  265, 1020, 1020, 1020,
+     1020, 1020, 1020, 1020, 1321, 1322, 1322, 1322, 1322, 1322,
+     1322, 1458, 1356,   55, 1118, 1119, 1119, 1119, 1119, 1119,
+     1119, 1458, 1458, 1458, 1458, 1120, 1357, 1458, 1458, 1458,
+     1458, 1120, 1120, 1120, 1120, 1120, 1120,  853,  945,  945,
+      945,  945,  945,  945,  945, 1024, 1458, 1458, 1458,  946,
+     1458, 1458, 1357, 1458, 1356,  946,  946,  946,  946,  946,
+      946, 1121, 1122, 1122, 1122, 1122, 1122, 1122, 1458, 1458,
 
-     1036, 1036,  934, 1329, 1329, 1329, 1037, 1329, 1329, 1329,
-     1329, 1329, 1037, 1037, 1037, 1037, 1037, 1037, 1329, 1037,
-     1037, 1037, 1037, 1037, 1037, 1041, 1042, 1042, 1042, 1042,
-     1042, 1044, 1045, 1045, 1045, 1045, 1045, 1048, 1049, 1049,
-     1049, 1049, 1049,  944, 1050, 1050, 1050, 1050, 1050, 1050,
-      946, 1329, 1329, 1329, 1051, 1329, 1329, 1329, 1329, 1329,
-     1051, 1051, 1051, 1051, 1051, 1051, 1329, 1051, 1051, 1051,
-     1051, 1051, 1051, 1055, 1056, 1056, 1056, 1056, 1056, 1058,
-     1059, 1059, 1059, 1059, 1059, 1062, 1063, 1063, 1063, 1063,
-     1063,  956, 1064, 1064, 1064, 1064, 1064, 1064,  958, 1329,
+     1458, 1458, 1123, 1458, 1458, 1458, 1458, 1458, 1123, 1123,
+     1123, 1123, 1123, 1123,  862,  957,  957,  957,  957,  957,
+      957,  957, 1027, 1458, 1458, 1458,  958, 1458, 1458, 1458,
+     1458, 1379,  958,  958,  958,  958,  958,  958, 1124, 1125,
+     1125, 1125, 1125, 1125, 1125, 1380, 1458, 1458, 1458, 1126,
+     1458, 1458, 1458, 1458, 1458, 1126, 1126, 1126, 1126, 1126,
+     1126,  873,  972,  972,  972,  972,  972,  972,  972, 1030,
+     1458, 1380, 1458,  973, 1458, 1458, 1458, 1458, 1379,  973,
+      973,  973,  973,  973,  973, 1127, 1128, 1128, 1128, 1128,
+     1128, 1128, 1458, 1458, 1458, 1458, 1129, 1458, 1458, 1458,
 
-     1329, 1329, 1065, 1329, 1329, 1329, 1329, 1329, 1065, 1065,
-     1065, 1065, 1065, 1065, 1329, 1065, 1065, 1065, 1065, 1065,
-     1065,  963,  963,  963,  963,  963,  963, 1069,  966,  966,
-      966,  966,  966,  966,  702,  968,  968,  968,  968,  968,
-      968, 1071,  970,  970,  970,  970,  970,  970,  876, 1073,
-     1073, 1073, 1073, 1073, 1073,  878, 1329, 1329, 1329, 1074,
-     1329, 1329, 1329, 1329, 1329, 1074, 1074, 1074, 1074, 1074,
-     1074, 1329, 1074, 1074, 1074, 1074, 1074, 1074, 1075, 1076,
-     1076, 1076, 1076, 1076, 1076, 1077,   48, 1329, 1138, 1078,
-     1329, 1079, 1329, 1329, 1329, 1078, 1078, 1078, 1078, 1078,
+     1458, 1458, 1129, 1129, 1129, 1129, 1129, 1129,  885,  988,
+      988,  988,  988,  988,  988,  988, 1033, 1458, 1458, 1458,
+      989, 1458, 1458, 1458, 1458, 1383,  989,  989,  989,  989,
+      989,  989, 1130, 1131, 1131, 1131, 1131, 1131, 1131, 1384,
+     1458, 1458, 1458, 1132, 1458, 1458, 1458, 1458, 1458, 1132,
+     1132, 1132, 1132, 1132, 1132, 1134, 1135, 1135, 1135, 1135,
+     1135, 1135, 1135, 1136, 1458, 1384, 1458, 1137, 1458, 1138,
+     1458, 1458, 1458, 1137, 1137, 1137, 1137, 1137, 1137, 1327,
+     1328, 1328, 1328, 1328, 1328, 1328, 1330, 1331, 1331, 1331,
+     1331, 1331, 1331, 1383, 1458, 1138, 1040, 1142, 1142, 1142,
 
-     1078, 1139, 1329,   48, 1107, 1108, 1108, 1108, 1108, 1108,
-     1329, 1329, 1329, 1144, 1085, 1329, 1146, 1079, 1088, 1089,
-     1089, 1089, 1089, 1089, 1090, 1329, 1145, 1139, 1091, 1147,
-     1329, 1329, 1329, 1329, 1091, 1091, 1091, 1091, 1091, 1091,
-      912, 1092, 1092, 1092, 1092, 1092, 1092, 1093, 1329, 1329,
-     1329, 1094, 1145,  916, 1329, 1147, 1329, 1094, 1094, 1094,
-     1094, 1094, 1094, 1329, 1110, 1110, 1110, 1110, 1110, 1110,
-     1115, 1012, 1012, 1012, 1012, 1012, 1012, 1329, 1329,  916,
-      921, 1095, 1095, 1095, 1095, 1095, 1095, 1096, 1329, 1329,
-     1329, 1097, 1329,  925, 1329, 1329, 1329, 1097, 1097, 1097,
+     1142, 1142, 1142, 1142, 1042, 1458, 1458, 1458, 1143, 1458,
+     1458, 1458, 1458, 1458, 1143, 1143, 1143, 1143, 1143, 1143,
+     1049, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1051, 1458,
+     1458, 1458, 1153, 1458, 1458, 1458, 1458, 1458, 1153, 1153,
+     1153, 1153, 1153, 1153, 1060, 1165, 1165, 1165, 1165, 1165,
+     1165, 1165, 1062, 1458, 1458, 1458, 1166, 1458, 1458, 1458,
+     1458, 1458, 1166, 1166, 1166, 1166, 1166, 1166, 1072, 1179,
+     1179, 1179, 1179, 1179, 1179, 1179, 1074, 1458, 1458, 1458,
+     1180, 1458, 1458, 1458, 1458, 1458, 1180, 1180, 1180, 1180,
+     1180, 1180, 1084, 1193, 1193, 1193, 1193, 1193, 1193, 1193,
 
-     1097, 1097, 1097, 1329, 1118, 1118, 1118, 1118, 1118, 1118,
-     1120, 1018, 1018, 1018, 1018, 1018, 1018, 1329, 1329,  925,
-      932, 1098, 1098, 1098, 1098, 1098, 1098, 1099, 1329, 1329,
-     1329, 1100, 1329,  936, 1329, 1329, 1329, 1100, 1100, 1100,
-     1100, 1100, 1100,  734, 1020, 1020, 1020, 1020, 1020, 1020,
-     1122, 1022, 1022, 1022, 1022, 1022, 1022, 1178, 1329,  936,
-      944, 1101, 1101, 1101, 1101, 1101, 1101, 1102, 1329, 1329,
-     1179, 1103, 1329,  948, 1329, 1329, 1329, 1103, 1103, 1103,
-     1103, 1103, 1103, 1329, 1125, 1125, 1125, 1125, 1125, 1125,
-     1028, 1028, 1028, 1028, 1028, 1028, 1179, 1329, 1329,  948,
+     1086, 1458, 1458, 1458, 1194, 1458, 1458, 1458, 1458, 1458,
+     1194, 1194, 1194, 1194, 1194, 1194, 1001, 1202, 1202, 1202,
+     1202, 1202, 1202, 1202, 1003, 1458, 1458, 1458, 1203, 1458,
+     1458, 1458, 1458, 1458, 1203, 1203, 1203, 1203, 1203, 1203,
+     1204, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1206, 1458,
+     1458, 1458, 1207, 1458, 1208, 1458, 1458, 1458, 1207, 1207,
+     1207, 1207, 1207, 1207, 1336, 1337, 1337, 1337, 1337, 1337,
+     1337, 1339, 1340, 1340, 1340, 1340, 1340, 1340, 1458, 1458,
+     1208,   55,  596,  513,  513,  513,  513,  513,  513,  513,
+     1345, 1346, 1346, 1346, 1346, 1346, 1346, 1458, 1387,   55,
 
-      956, 1104, 1104, 1104, 1104, 1104, 1104, 1105, 1329, 1329,
-     1329, 1106, 1329,  960, 1329, 1329, 1329, 1106, 1106, 1106,
-     1106, 1106, 1106, 1128, 1031, 1031, 1031, 1031, 1031, 1031,
-      743, 1033, 1033, 1033, 1033, 1033, 1033, 1225, 1329,  960,
-     1005, 1109, 1109, 1109, 1109, 1109, 1109, 1007, 1329, 1329,
-     1226, 1110, 1329, 1329, 1329, 1329, 1329, 1110, 1110, 1110,
-     1110, 1110, 1110,  912, 1117, 1117, 1117, 1117, 1117, 1117,
-     1093, 1329, 1329, 1329, 1118, 1329, 1226, 1329, 1329, 1329,
-     1118, 1118, 1118, 1118, 1118, 1118,  921, 1124, 1124, 1124,
-     1124, 1124, 1124, 1096, 1329, 1329, 1329, 1125, 1329, 1329,
+     1217, 1218, 1218, 1218, 1218, 1218, 1218, 1219, 1458, 1458,
+     1458, 1220, 1388, 1458, 1458, 1458, 1458, 1220, 1220, 1220,
+     1220, 1220, 1220, 1040, 1221, 1221, 1221, 1221, 1221, 1221,
+     1221, 1222, 1458, 1458, 1458, 1223, 1458, 1044, 1388, 1458,
+     1458, 1223, 1223, 1223, 1223, 1223, 1223, 1348, 1349, 1349,
+     1349, 1349, 1349, 1349, 1282, 1282, 1282, 1282, 1282, 1282,
+     1282, 1458, 1458, 1044, 1049, 1224, 1224, 1224, 1224, 1224,
+     1224, 1224, 1225, 1458, 1458, 1458, 1226, 1458, 1053, 1458,
+     1458, 1458, 1226, 1226, 1226, 1226, 1226, 1226, 1373, 1374,
+     1374, 1374, 1374, 1374, 1374, 1319, 1319, 1319, 1319, 1319,
 
-     1329, 1329, 1329, 1125, 1125, 1125, 1125, 1125, 1125, 1130,
-     1035, 1035, 1035, 1035, 1035, 1035,  932, 1132, 1132, 1132,
-     1132, 1132, 1132, 1099, 1329, 1329, 1329, 1133, 1329, 1329,
-     1329, 1329, 1329, 1133, 1133, 1133, 1133, 1133, 1133, 1329,
-     1133, 1133, 1133, 1133, 1133, 1133, 1042, 1042, 1042, 1042,
-     1042, 1042, 1136, 1045, 1045, 1045, 1045, 1045, 1045,  754,
-     1047, 1047, 1047, 1047, 1047, 1047, 1138, 1049, 1049, 1049,
-     1049, 1049, 1049,  944, 1140, 1140, 1140, 1140, 1140, 1140,
-     1102, 1329, 1329, 1329, 1141, 1329, 1329, 1329, 1329, 1329,
-     1141, 1141, 1141, 1141, 1141, 1141, 1329, 1141, 1141, 1141,
+     1319, 1319, 1387, 1458, 1053, 1060, 1227, 1227, 1227, 1227,
+     1227, 1227, 1227, 1228, 1458, 1458, 1458, 1229, 1458, 1064,
+     1458, 1458, 1391, 1229, 1229, 1229, 1229, 1229, 1229, 1328,
+     1328, 1328, 1328, 1328, 1328, 1328, 1392, 1458, 1458, 1458,
+     1458, 1391, 1458, 1395, 1458, 1064, 1072, 1230, 1230, 1230,
+     1230, 1230, 1230, 1230, 1231, 1458, 1458, 1396, 1232, 1458,
+     1076, 1458, 1392, 1395, 1232, 1232, 1232, 1232, 1232, 1232,
+     1337, 1337, 1337, 1337, 1337, 1337, 1337, 1458, 1458, 1458,
+     1458, 1458, 1458, 1396, 1458, 1458, 1076, 1084, 1233, 1233,
+     1233, 1233, 1233, 1233, 1233, 1234, 1458, 1458, 1458, 1235,
 
-     1141, 1141, 1141, 1056, 1056, 1056, 1056, 1056, 1056, 1144,
-     1059, 1059, 1059, 1059, 1059, 1059,  766, 1061, 1061, 1061,
-     1061, 1061, 1061, 1146, 1063, 1063, 1063, 1063, 1063, 1063,
-      956, 1148, 1148, 1148, 1148, 1148, 1148, 1105, 1329, 1329,
-     1329, 1149, 1329, 1329, 1329, 1329, 1329, 1149, 1149, 1149,
-     1149, 1149, 1149, 1329, 1149, 1149, 1149, 1149, 1149, 1149,
-     1152, 1153, 1153, 1153, 1153, 1153, 1155, 1156, 1156, 1156,
-     1156, 1156, 1159, 1160, 1160, 1160, 1160, 1160, 1075, 1161,
-     1161, 1161, 1161, 1161, 1161, 1077, 1329, 1329, 1329, 1162,
-     1329,   48,   48, 1329, 1329, 1162, 1162, 1162, 1162, 1162,
+     1458, 1088, 1458, 1458, 1458, 1235, 1235, 1235, 1235, 1235,
+     1235, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1399, 1400,
+     1400, 1400, 1400, 1400, 1400, 1411, 1458, 1088, 1134, 1238,
+     1238, 1238, 1238, 1238, 1238, 1238, 1136, 1458, 1458, 1412,
+     1239, 1458, 1458, 1458, 1458, 1458, 1239, 1239, 1239, 1239,
+     1239, 1239, 1040, 1246, 1246, 1246, 1246, 1246, 1246, 1246,
+     1222, 1458, 1458, 1458, 1247, 1412, 1458, 1458, 1458, 1458,
+     1247, 1247, 1247, 1247, 1247, 1247, 1049, 1253, 1253, 1253,
+     1253, 1253, 1253, 1253, 1225, 1458, 1458, 1458, 1254, 1458,
+     1458, 1458, 1458, 1458, 1254, 1254, 1254, 1254, 1254, 1254,
 
-     1162, 1329, 1162, 1162, 1162, 1162, 1162, 1162,   48,   48,
-     1329, 1014, 1014, 1014, 1014, 1014, 1014, 1329, 1329, 1329,
-     1168, 1167, 1005, 1169, 1169, 1169, 1169, 1169, 1169, 1170,
-     1329, 1329, 1329, 1171, 1329, 1009, 1329, 1329, 1329, 1171,
-     1171, 1171, 1171, 1171, 1171, 1329, 1024, 1024, 1024, 1024,
-     1024, 1024, 1329, 1037, 1037, 1037, 1037, 1037, 1037, 1227,
-     1329, 1009,  912, 1013, 1013, 1013, 1013, 1013, 1013, 1093,
-     1329, 1329, 1228, 1014, 1329, 1329, 1329, 1329, 1329, 1014,
-     1014, 1014, 1014, 1014, 1014,  921, 1023, 1023, 1023, 1023,
-     1023, 1023, 1096, 1329, 1329, 1329, 1024, 1329, 1228, 1329,
+     1060, 1261, 1261, 1261, 1261, 1261, 1261, 1261, 1228, 1458,
+     1458, 1458, 1262, 1458, 1458, 1458, 1458, 1458, 1262, 1262,
+     1262, 1262, 1262, 1262, 1072, 1269, 1269, 1269, 1269, 1269,
+     1269, 1269, 1231, 1458, 1458, 1458, 1270, 1458, 1458, 1458,
+     1458, 1458, 1270, 1270, 1270, 1270, 1270, 1270, 1084, 1277,
+     1277, 1277, 1277, 1277, 1277, 1277, 1234, 1458, 1458, 1458,
+     1278, 1458, 1458, 1458, 1458, 1458, 1278, 1278, 1278, 1278,
+     1278, 1278, 1204, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+     1206, 1458, 1458, 1458, 1291, 1458, 1458, 1458, 1458, 1458,
+     1291, 1291, 1291, 1291, 1291, 1291, 1134, 1298, 1298, 1298,
 
-     1329, 1329, 1024, 1024, 1024, 1024, 1024, 1024,  932, 1036,
-     1036, 1036, 1036, 1036, 1036, 1099, 1329, 1329, 1329, 1037,
-     1329, 1329, 1329, 1329, 1329, 1037, 1037, 1037, 1037, 1037,
-     1037,  944, 1050, 1050, 1050, 1050, 1050, 1050, 1102, 1329,
-     1329, 1329, 1051, 1329, 1329, 1329, 1329, 1329, 1051, 1051,
-     1051, 1051, 1051, 1051, 1329, 1051, 1051, 1051, 1051, 1051,
-     1051,  956, 1064, 1064, 1064, 1064, 1064, 1064, 1105, 1329,
-     1329, 1329, 1065, 1329, 1329, 1329, 1329, 1329, 1065, 1065,
-     1065, 1065, 1065, 1065, 1329, 1065, 1065, 1065, 1065, 1065,
-     1065, 1178, 1108, 1108, 1108, 1108, 1108, 1108, 1005, 1180,
+     1298, 1298, 1298, 1298, 1299, 1458, 1458, 1458, 1300, 1458,
+     1138, 1458, 1458, 1411, 1300, 1300, 1300, 1300, 1300, 1300,
+     1402, 1403, 1403, 1403, 1403, 1403, 1403, 1458, 1413, 1414,
+     1414, 1414, 1414, 1414, 1414, 1458, 1138, 1040, 1142, 1142,
+     1142, 1142, 1142, 1142, 1142, 1222, 1458, 1458, 1458, 1143,
+     1458, 1458, 1458, 1458, 1458, 1143, 1143, 1143, 1143, 1143,
+     1143, 1049, 1152, 1152, 1152, 1152, 1152, 1152, 1152, 1225,
+     1458, 1458, 1458, 1153, 1458, 1458, 1458, 1458, 1458, 1153,
+     1153, 1153, 1153, 1153, 1153, 1060, 1165, 1165, 1165, 1165,
+     1165, 1165, 1165, 1228, 1458, 1458, 1458, 1166, 1458, 1458,
 
-     1180, 1180, 1180, 1180, 1180, 1170, 1329, 1329, 1329, 1181,
-     1329, 1329, 1329, 1329, 1329, 1181, 1181, 1181, 1181, 1181,
-     1181, 1329, 1181, 1181, 1181, 1181, 1181, 1181, 1184, 1185,
-     1185, 1185, 1185, 1185, 1189, 1190, 1190, 1190, 1190, 1190,
-     1192, 1193, 1193, 1193, 1193, 1193, 1198, 1199, 1199, 1199,
-     1199, 1199, 1201, 1202, 1202, 1202, 1202, 1202, 1207, 1208,
-     1208, 1208, 1208, 1208, 1210, 1211, 1211, 1211, 1211, 1211,
-     1216, 1217, 1217, 1217, 1217, 1217, 1219, 1220, 1220, 1220,
-     1220, 1220, 1153, 1153, 1153, 1153, 1153, 1153, 1225, 1156,
-     1156, 1156, 1156, 1156, 1156,  876, 1158, 1158, 1158, 1158,
+     1458, 1458, 1458, 1166, 1166, 1166, 1166, 1166, 1166, 1072,
+     1179, 1179, 1179, 1179, 1179, 1179, 1179, 1231, 1458, 1458,
+     1458, 1180, 1458, 1458, 1458, 1458, 1458, 1180, 1180, 1180,
+     1180, 1180, 1180, 1084, 1193, 1193, 1193, 1193, 1193, 1193,
+     1193, 1234, 1458, 1458, 1458, 1194, 1458, 1458, 1458, 1458,
+     1458, 1194, 1194, 1194, 1194, 1194, 1194, 1134, 1309, 1309,
+     1309, 1309, 1309, 1309, 1309, 1299, 1458, 1458, 1458, 1310,
+     1458, 1458, 1458, 1458, 1458, 1310, 1310, 1310, 1310, 1310,
+     1310, 1204, 1358, 1358, 1358, 1358, 1358, 1358, 1358, 1206,
+     1458, 1458, 1458, 1359, 1458, 1458, 1458, 1458, 1458, 1359,
 
-     1158, 1158, 1227, 1160, 1160, 1160, 1160, 1160, 1160, 1075,
-     1229, 1229, 1229, 1229, 1229, 1229, 1077, 1329, 1329, 1329,
-     1230, 1329, 1329, 1329, 1329, 1329, 1230, 1230, 1230, 1230,
-     1230, 1230, 1329, 1230, 1230, 1230, 1230, 1230, 1230, 1005,
-     1109, 1109, 1109, 1109, 1109, 1109, 1170, 1329, 1329, 1329,
-     1110, 1329, 1329, 1329, 1329, 1329, 1110, 1110, 1110, 1110,
-     1110, 1110, 1329, 1110, 1110, 1110, 1110, 1110, 1110, 1244,
-     1245, 1245, 1245, 1245, 1245, 1250, 1250, 1185, 1185, 1185,
-     1185, 1185, 1185, 1329, 1329, 1329, 1329, 1329, 1251,  912,
-     1187, 1187, 1187, 1187, 1187, 1187, 1190, 1190, 1190, 1190,
+     1359, 1359, 1359, 1359, 1359, 1134, 1238, 1238, 1238, 1238,
+     1238, 1238, 1238, 1299, 1458, 1458, 1458, 1239, 1458, 1458,
+     1458, 1458, 1458, 1239, 1239, 1239, 1239, 1239, 1239, 1417,
+     1418, 1418, 1418, 1418, 1418, 1418, 1421, 1422, 1422, 1422,
+     1422, 1422, 1422, 1425, 1426, 1426, 1426, 1426, 1426, 1426,
+     1429, 1430, 1430, 1430, 1430, 1430, 1430, 1400, 1400, 1400,
+     1400, 1400, 1400, 1400, 1433, 1433, 1437, 1438, 1438, 1438,
+     1438, 1438, 1438, 1458, 1458, 1458, 1458, 1458, 1434, 1458,
+     1414, 1414, 1414, 1414, 1414, 1414, 1414, 1418, 1418, 1418,
+     1418, 1418, 1418, 1418, 1422, 1422, 1422, 1422, 1422, 1422,
 
-     1190, 1190, 1254, 1254, 1193, 1193, 1193, 1193, 1193, 1193,
-     1329, 1329, 1329, 1329, 1251, 1255,  921, 1195, 1195, 1195,
-     1195, 1195, 1195, 1199, 1199, 1199, 1199, 1199, 1199, 1258,
-     1258, 1202, 1202, 1202, 1202, 1202, 1202, 1329, 1329, 1329,
-     1329, 1255, 1259,  932, 1204, 1204, 1204, 1204, 1204, 1204,
-     1208, 1208, 1208, 1208, 1208, 1208, 1262, 1262, 1211, 1211,
-     1211, 1211, 1211, 1211, 1329, 1329, 1329, 1329, 1259, 1263,
-      944, 1213, 1213, 1213, 1213, 1213, 1213, 1217, 1217, 1217,
-     1217, 1217, 1217, 1266, 1266, 1220, 1220, 1220, 1220, 1220,
-     1220, 1329, 1329, 1329, 1329, 1263, 1267,  956, 1222, 1222,
+     1422, 1458, 1458, 1458, 1434, 1458, 1426, 1426, 1426, 1426,
+     1426, 1426, 1426, 1430, 1430, 1430, 1430, 1430, 1430, 1430,
+     1446, 1447, 1447, 1447, 1447, 1447, 1447, 1438, 1438, 1438,
+     1438, 1438, 1438, 1438, 1447, 1447, 1447, 1447, 1447, 1447,
+     1447,   46, 1458, 1458, 1458, 1458,   46,   46,   46,   64,
+     1458,   64,   64,   64,   64,   64,   64,   64,  151, 1458,
+      151,  158,  158,  158,  269,  269,  269,  278,  278,  278,
+      356,  356,  356,  359,  359,  359,  360,  360,  360,  367,
+      367,  367,  365,  365,  365,  371,  371,  371,  375, 1458,
+      375,  437,  437,  437,  442,  442,  442,  443,  443,  443,
 
-     1222, 1222, 1222, 1222, 1270, 1271, 1271, 1271, 1271, 1271,
-     1273, 1274, 1274, 1274, 1274, 1274, 1282, 1329, 1329, 1329,
-     1329, 1329, 1267, 1284, 1285, 1285, 1285, 1285, 1285, 1283,
-     1282, 1245, 1245, 1245, 1245, 1245, 1245, 1005, 1247, 1247,
-     1247, 1247, 1247, 1247, 1288, 1289, 1289, 1289, 1289, 1289,
-     1329, 1329, 1329, 1329, 1329, 1283, 1292, 1293, 1293, 1293,
-     1293, 1293, 1296, 1297, 1297, 1297, 1297, 1297, 1300, 1301,
-     1301, 1301, 1301, 1301, 1271, 1271, 1271, 1271, 1271, 1271,
-     1304, 1304, 1274, 1274, 1274, 1274, 1274, 1274, 1329, 1329,
-     1329, 1329, 1329, 1305, 1075, 1276, 1276, 1276, 1276, 1276,
+      452,  452,  452,  456, 1458,  456,  457,  457,  457,  369,
+      369, 1458, 1458,  369,  461,  461,  461,  465,  465,  465,
+      359,  359,  359,  520,  520,  520,  524,  524,  524,  525,
+      525,  525,  526,  526,  526,  367,  367,  367,  531,  531,
+      531,  450,  450, 1458, 1458,  450,  536,  536,  536,  540,
+      540,  540,  544, 1458,  544,  545,  545,  545,  549,  549,
+      549,  553, 1458,  553,  601,  601,  601,  452,  452,  452,
+      609,  609,  609,  610,  610,  610,  618,  618,  618,  622,
+     1458,  622,  625, 1458,  625,  626,  626,  626,  630,  630,
+      630,  634, 1458,  634,  543,  543, 1458, 1458,  543,  547,
 
-     1276, 1308, 1309, 1309, 1309, 1309, 1309, 1285, 1285, 1285,
-     1285, 1285, 1285, 1289, 1289, 1289, 1289, 1289, 1289, 1305,
-     1293, 1293, 1293, 1293, 1293, 1293, 1297, 1297, 1297, 1297,
-     1297, 1297, 1301, 1301, 1301, 1301, 1301, 1301, 1317, 1318,
-     1318, 1318, 1318, 1318, 1309, 1309, 1309, 1309, 1309, 1309,
-     1318, 1318, 1318, 1318, 1318, 1318,   46, 1329, 1329, 1329,
-     1329,   46,   46,   46,   62, 1329,   62,   62,   62,   62,
-       62,   62,   62,  139, 1329,  139,  144,  144,  144,  238,
-      238,  238,  247,  247,  247,  307,  307,  307,  309,  309,
-      309,  310,  310,  310,  317,  317,  317,  315,  315,  315,
+      547, 1458, 1458,  547,  640,  640,  640,  644,  644,  644,
+      553,  553, 1458,  553,  525,  525,  525,  678,  678,  678,
+      682,  682,  682,  685,  685,  685,  686,  686,  686,  687,
+      687,  687,  692,  692,  692,  616,  616, 1458, 1458,  616,
+      697,  697,  697,  701,  701,  701,  622,  622, 1458,  622,
+      624,  624, 1458, 1458,  624,  625,  625, 1458,  625,  626,
+      626,  628,  628, 1458, 1458,  628,  708,  708,  708,  712,
+      712,  712,  634,  634, 1458,  634,  716, 1458,  716,  719,
+     1458,  719,  720,  720,  720,  724,  724,  724,  728, 1458,
+      728,  755,  755,  755,  618,  618,  618,  630,  630,  630,
 
-      325, 1329,  325,  367,  367,  367,  372,  372,  372,  373,
-      373,  373,  386, 1329,  386,  387,  387,  387,  319,  319,
-     1329, 1329,  319,  395,  395,  395,  439,  439,  439,  443,
-      443,  443,  444,  444,  444,  445,  445,  445,  450,  450,
-      450,  380,  380, 1329, 1329,  380,  459,  459,  459,  463,
-     1329,  463,  464,  464,  464,  472, 1329,  472,  507,  507,
-      507,  515,  515,  515,  516,  516,  516,  528, 1329,  528,
-      531, 1329,  531,  532,  532,  532,  540, 1329,  540,  462,
-      462, 1329, 1329,  462,  466,  466, 1329, 1329,  466,  550,
-      550,  550,  444,  444,  444,  575,  575,  575,  579,  579,
+      766,  766,  766,  767,  767,  767,  775,  775,  775,  779,
+     1458,  779,  782, 1458,  782,  783,  783,  783,  787,  787,
+      787,  791, 1458,  791,  794, 1458,  794,  797, 1458,  797,
+      798,  798,  798,  802,  802,  802,  806, 1458,  806,  715,
+     1458, 1458,  715,  716,  716, 1458,  716,  718,  718, 1458,
+     1458,  718,  719,  719, 1458,  719,  720,  720,  722,  722,
+     1458, 1458,  722,  813,  813,  813,  817,  817,  817,  728,
+      728, 1458,  728,   53,   53,   53, 1458,   53,   53,  686,
+      686,  686,  839,  839,  839,  843,  843,  843,  846,  846,
+      846,  849,  849,  849,  850,  850,  850,  851,  851,  851,
 
-      579,  582,  582,  582,  583,  583,  583,  584,  584,  584,
-      589,  589,  589,  522,  522, 1329, 1329,  522,  598,  598,
-      598,  530,  530, 1329, 1329,  530,  534,  534, 1329, 1329,
-      534,  609,  609,  609,  613, 1329,  613,  616, 1329,  616,
-      617,  617,  617,  625, 1329,  625,  643,  643,  643,  654,
-      654,  654,  655,  655,  655,  667, 1329,  667,  670, 1329,
-      670,  671,  671,  671,  679, 1329,  679,  682, 1329,  682,
-      685, 1329,  685,  686,  686,  686,  694, 1329,  694,  612,
-     1329, 1329,  612,  615,  615, 1329, 1329,  615,  616,  616,
-     1329,  616,  619,  619, 1329, 1329,  619,  705,  705,  705,
+      856,  856,  856,  773,  773, 1458, 1458,  773,  861,  861,
+      861,  865,  865,  865,  779,  779, 1458,  779,  781,  781,
+     1458, 1458,  781,  782,  782, 1458,  782,  783,  783,  785,
+      785, 1458, 1458,  785,  872,  872,  872,  876,  876,  876,
+      791,  791, 1458,  791,  793, 1458, 1458,  793,  794,  794,
+     1458,  794,  796,  796, 1458, 1458,  796,  797,  797, 1458,
+      797,  798,  798,  800,  800, 1458, 1458,  800,  884,  884,
+      884,  888,  888,  888,  806,  806, 1458,  806,  890, 1458,
+      890,  893, 1458,  893,  896, 1458,  896,  897,  897,  897,
+      901,  901,  901,  905, 1458,  905,   53,   53,   53, 1458,
 
-      625,  625, 1329,  625,   53,   53,   53, 1329,   53,   53,
-      583,  583,  583,  720,  720,  720,  724,  724,  724,  727,
-      727,  727,  730,  730,  730,  731,  731,  731,  732,  732,
-      732,  737,  737,  737,  661,  661, 1329, 1329,  661,  746,
-      746,  746,  667,  667, 1329,  667,  669,  669, 1329, 1329,
-      669,  670,  670, 1329,  670,  673,  673, 1329, 1329,  673,
-      757,  757,  757,  679,  679, 1329,  679,  681, 1329, 1329,
-      681,  682,  682, 1329,  682,  684,  684, 1329, 1329,  684,
-      685,  685, 1329,  685,  688,  688, 1329, 1329,  688,  769,
-      769,  769,  694,  694, 1329,  694,  771, 1329,  771,  774,
+       53,   53,  923,  923,  923,  775,  775,  775,  787,  787,
+      787,  802,  802,  802,  937,  937,  937,  938,  938,  938,
+      946,  946,  946,  950, 1458,  950,  953, 1458,  953,  954,
+      954,  954,  958,  958,  958,  962, 1458,  962,  965, 1458,
+      965,  968, 1458,  968,  969,  969,  969,  973,  973,  973,
+      977, 1458,  977,  978, 1458,  978,  981, 1458,  981,  984,
+     1458,  984,  985,  985,  985,  989,  989,  989,  993, 1458,
+      993,  890, 1458,  890,  892, 1458, 1458,  892,  893,  893,
+     1458,  893,  895,  895, 1458, 1458,  895,  896,  896, 1458,
+      896,  897,  897,  899,  899, 1458, 1458,  899, 1000, 1000,
 
-     1329,  774,  777, 1329,  777,  778,  778,  778,  786, 1329,
-      786,   53,   53,   53, 1329,   53,   53,  798,  798,  798,
-      812,  812,  812,  813,  813,  813,  825, 1329,  825,  828,
-     1329,  828,  829,  829,  829,  837, 1329,  837,  840, 1329,
-      840,  843, 1329,  843,  844,  844,  844,  852, 1329,  852,
-      853, 1329,  853,  856, 1329,  856,  859, 1329,  859,  860,
-      860,  860,  868, 1329,  868,  771, 1329,  771,  773, 1329,
-     1329,  773,  774,  774, 1329,  774,  776,  776, 1329, 1329,
-      776,  777,  777, 1329,  777,  780,  780, 1329, 1329,  780,
-      879,  879,  879,  786,  786, 1329,  786,   53,   53,   53,
+     1000, 1004, 1004, 1004,  905,  905, 1458,  905,   53,   53,
+       53, 1458,   53,   53,  850,  850,  850, 1021, 1021, 1021,
+     1025, 1025, 1025, 1028, 1028, 1028, 1031, 1031, 1031, 1034,
+     1034, 1034, 1035, 1035, 1035, 1043, 1043, 1043,  944,  944,
+     1458, 1458,  944, 1048, 1048, 1048, 1052, 1052, 1052,  950,
+      950, 1458,  950,  952,  952, 1458, 1458,  952,  953,  953,
+     1458,  953,  954,  954,  956,  956, 1458, 1458,  956, 1059,
+     1059, 1059, 1063, 1063, 1063,  962,  962, 1458,  962,  964,
+     1458, 1458,  964,  965,  965, 1458,  965,  967,  967, 1458,
+     1458,  967,  968,  968, 1458,  968,  969,  969,  971,  971,
 
-     1329,   53,   53,  731,  731,  731,  893,  893,  893,  897,
-      897,  897,  900,  900,  900,  903,  903,  903,  906,  906,
-      906,  907,  907,  907,  915,  915,  915,  819,  819, 1329,
-     1329,  819,  924,  924,  924,  825,  825, 1329,  825,  827,
-      827, 1329, 1329,  827,  828,  828, 1329,  828,  831,  831,
-     1329, 1329,  831,  935,  935,  935,  837,  837, 1329,  837,
-      839, 1329, 1329,  839,  840,  840, 1329,  840,  842,  842,
-     1329, 1329,  842,  843,  843, 1329,  843,  846,  846, 1329,
-     1329,  846,  947,  947,  947,  852,  852, 1329,  852,  853,
-     1329,  853,  855, 1329, 1329,  855,  856,  856, 1329,  856,
+     1458, 1458,  971, 1071, 1071, 1071, 1075, 1075, 1075,  977,
+      977, 1458,  977,  978, 1458,  978,  980, 1458, 1458,  980,
+      981,  981, 1458,  981,  983,  983, 1458, 1458,  983,  984,
+      984, 1458,  984,  985,  985,  987,  987, 1458, 1458,  987,
+     1083, 1083, 1083, 1087, 1087, 1087,  993,  993, 1458,  993,
+     1089, 1458, 1089, 1092, 1458, 1092, 1095, 1458, 1095, 1096,
+     1096, 1096, 1100, 1100, 1100, 1104, 1458, 1104,   53,   53,
+       53, 1458,   53,   53, 1116, 1116, 1116,  946,  946,  946,
+      958,  958,  958,  973,  973,  973,  989,  989,  989, 1133,
+     1133, 1133, 1139, 1139, 1139, 1137, 1137, 1137, 1144, 1144,
 
-      858,  858, 1329, 1329,  858,  859,  859, 1329,  859,  862,
-      862, 1329, 1329,  862,  959,  959,  959,  868,  868, 1329,
-      868,  961, 1329,  961,  964, 1329,  964,  967, 1329,  967,
-      968,  968,  968,  976, 1329,  976,   53,   53,   53, 1329,
-       53,   53,  987,  987,  987, 1004, 1004, 1004, 1010, 1010,
-     1010, 1008, 1008, 1008, 1015, 1015, 1015, 1016, 1329, 1016,
-     1019, 1329, 1019, 1020, 1020, 1020, 1025, 1025, 1025, 1026,
-     1329, 1026, 1029, 1329, 1029, 1032, 1329, 1032, 1033, 1033,
-     1033, 1038, 1038, 1038, 1039, 1329, 1039, 1040, 1329, 1040,
-     1043, 1329, 1043, 1046, 1329, 1046, 1047, 1047, 1047, 1052,
+     1144, 1143, 1143, 1143, 1145, 1458, 1145, 1148, 1458, 1148,
+     1149, 1149, 1149, 1154, 1154, 1154, 1153, 1153, 1153, 1155,
+     1458, 1155, 1158, 1458, 1158, 1161, 1458, 1161, 1162, 1162,
+     1162, 1167, 1167, 1167, 1166, 1166, 1166, 1168, 1458, 1168,
+     1169, 1458, 1169, 1172, 1458, 1172, 1175, 1458, 1175, 1176,
+     1176, 1176, 1181, 1181, 1181, 1180, 1180, 1180, 1182, 1458,
+     1182, 1183, 1458, 1183, 1186, 1458, 1186, 1189, 1458, 1189,
+     1190, 1190, 1190, 1195, 1195, 1195, 1194, 1194, 1194, 1196,
+     1458, 1196, 1089, 1458, 1089, 1091, 1458, 1458, 1091, 1092,
+     1092, 1458, 1092, 1094, 1094, 1458, 1458, 1094, 1095, 1095,
 
-     1052, 1052, 1053, 1329, 1053, 1054, 1329, 1054, 1057, 1329,
-     1057, 1060, 1329, 1060, 1061, 1061, 1061, 1066, 1066, 1066,
-     1067, 1329, 1067,  961, 1329,  961,  963, 1329, 1329,  963,
-      964,  964, 1329,  964,  966,  966, 1329, 1329,  966,  967,
-      967, 1329,  967,  970,  970, 1329, 1329,  970, 1078, 1078,
-     1078,  976,  976, 1329,  976,   53,   53,   53, 1329,   53,
-       53,  907,  907,  907, 1094, 1094, 1094, 1097, 1097, 1097,
-     1100, 1100, 1100, 1103, 1103, 1103, 1106, 1106, 1106, 1111,
-     1111, 1111, 1113, 1329, 1113, 1114, 1114, 1114, 1012, 1012,
-     1329, 1329, 1012, 1119, 1119, 1119, 1016, 1016, 1329, 1016,
+     1458, 1095, 1096, 1096, 1098, 1098, 1458, 1458, 1098, 1203,
+     1203, 1203, 1207, 1207, 1207, 1104, 1104, 1458, 1104,   53,
+       53,   53, 1458,   53,   53, 1035, 1035, 1035, 1223, 1223,
+     1223, 1226, 1226, 1226, 1229, 1229, 1229, 1232, 1232, 1232,
+     1235, 1235, 1235, 1240, 1240, 1240, 1239, 1239, 1239, 1242,
+     1458, 1242, 1243, 1243, 1243, 1141, 1141, 1458, 1458, 1141,
+     1247, 1247, 1247, 1248, 1248, 1248, 1145, 1145, 1458, 1145,
+     1147, 1147, 1458, 1458, 1147, 1148, 1148, 1458, 1148, 1149,
+     1149, 1151, 1151, 1458, 1458, 1151, 1254, 1254, 1254, 1255,
+     1255, 1255, 1155, 1155, 1458, 1155, 1157, 1458, 1458, 1157,
 
-     1018, 1018, 1329, 1329, 1018, 1019, 1019, 1329, 1019, 1022,
-     1022, 1329, 1329, 1022, 1126, 1126, 1126, 1026, 1026, 1329,
-     1026, 1028, 1329, 1329, 1028, 1029, 1029, 1329, 1029, 1031,
-     1031, 1329, 1329, 1031, 1032, 1032, 1329, 1032, 1035, 1035,
-     1329, 1329, 1035, 1134, 1134, 1134, 1039, 1039, 1329, 1039,
-     1040, 1329, 1040, 1042, 1329, 1329, 1042, 1043, 1043, 1329,
-     1043, 1045, 1045, 1329, 1329, 1045, 1046, 1046, 1329, 1046,
-     1049, 1049, 1329, 1329, 1049, 1142, 1142, 1142, 1053, 1053,
-     1329, 1053, 1054, 1329, 1054, 1056, 1329, 1329, 1056, 1057,
-     1057, 1329, 1057, 1059, 1059, 1329, 1329, 1059, 1060, 1060,
+     1158, 1158, 1458, 1158, 1160, 1160, 1458, 1458, 1160, 1161,
+     1161, 1458, 1161, 1162, 1162, 1164, 1164, 1458, 1458, 1164,
+     1262, 1262, 1262, 1263, 1263, 1263, 1168, 1168, 1458, 1168,
+     1169, 1458, 1169, 1171, 1458, 1458, 1171, 1172, 1172, 1458,
+     1172, 1174, 1174, 1458, 1458, 1174, 1175, 1175, 1458, 1175,
+     1176, 1176, 1178, 1178, 1458, 1458, 1178, 1270, 1270, 1270,
+     1271, 1271, 1271, 1182, 1182, 1458, 1182, 1183, 1458, 1183,
+     1185, 1458, 1458, 1185, 1186, 1186, 1458, 1186, 1188, 1188,
+     1458, 1458, 1188, 1189, 1189, 1458, 1189, 1190, 1190, 1192,
+     1192, 1458, 1458, 1192, 1278, 1278, 1278, 1279, 1279, 1279,
 
-     1329, 1060, 1063, 1063, 1329, 1329, 1063, 1150, 1150, 1150,
-     1067, 1067, 1329, 1067, 1151, 1329, 1151, 1154, 1329, 1154,
-     1157, 1329, 1157, 1158, 1158, 1158, 1163, 1329, 1163, 1164,
-     1329, 1164,   53,   53,   53, 1329,   53,   53, 1172, 1329,
-     1172, 1171, 1171, 1171, 1173, 1329, 1173, 1174, 1329, 1174,
-     1175, 1329, 1175, 1176, 1329, 1176, 1177, 1329, 1177, 1108,
-     1108, 1329, 1329, 1108, 1182, 1182, 1182,  317,  317,  317,
-     1113, 1113, 1329, 1113, 1183, 1183, 1183, 1186, 1329, 1186,
-     1187, 1187, 1187, 1188, 1188, 1188, 1191, 1329, 1191, 1194,
-     1329, 1194, 1195, 1195, 1195, 1196, 1196, 1196, 1197, 1329,
+     1196, 1196, 1458, 1196, 1280, 1458, 1280, 1283, 1458, 1283,
+     1286, 1458, 1286, 1287, 1287, 1287, 1292, 1458, 1292, 1291,
+     1291, 1291, 1293, 1458, 1293,   53,   53,   53, 1458,   53,
+       53, 1301, 1458, 1301, 1300, 1300, 1300, 1302, 1458, 1302,
+     1143, 1143, 1143, 1303, 1458, 1303, 1153, 1153, 1153, 1304,
+     1458, 1304, 1166, 1166, 1166, 1305, 1458, 1305, 1180, 1180,
+     1180, 1306, 1458, 1306, 1194, 1194, 1194, 1237, 1237, 1458,
+     1458, 1237, 1310, 1310, 1310, 1311, 1311, 1311,  367,  367,
+      367, 1242, 1242, 1458, 1242, 1312, 1312, 1312, 1315, 1458,
+     1315, 1316, 1316, 1316, 1317, 1317, 1317, 1320, 1458, 1320,
 
-     1197, 1200, 1329, 1200, 1203, 1329, 1203, 1204, 1204, 1204,
-     1205, 1205, 1205, 1206, 1329, 1206, 1209, 1329, 1209, 1212,
-     1329, 1212, 1213, 1213, 1213, 1214, 1214, 1214, 1215, 1329,
-     1215, 1218, 1329, 1218, 1221, 1329, 1221, 1222, 1222, 1222,
-     1223, 1223, 1223, 1151, 1329, 1151, 1153, 1329, 1329, 1153,
-     1154, 1154, 1329, 1154, 1156, 1156, 1329, 1329, 1156, 1157,
-     1157, 1329, 1157, 1160, 1160, 1329, 1329, 1160, 1231, 1329,
-     1231, 1164, 1164, 1329, 1164,   53,   53,   53, 1329,   53,
-       53, 1236, 1236, 1236, 1238, 1329, 1238, 1239, 1329, 1239,
-     1240, 1329, 1240, 1241, 1329, 1241, 1242, 1329, 1242, 1243,
+     1323, 1458, 1323, 1324, 1324, 1324, 1325, 1325, 1325, 1326,
+     1458, 1326, 1329, 1458, 1329, 1332, 1458, 1332, 1333, 1333,
+     1333, 1334, 1334, 1334, 1335, 1458, 1335, 1338, 1458, 1338,
+     1341, 1458, 1341, 1342, 1342, 1342, 1343, 1343, 1343, 1344,
+     1458, 1344, 1347, 1458, 1347, 1350, 1458, 1350, 1351, 1351,
+     1351, 1352, 1352, 1352, 1280, 1458, 1280, 1282, 1458, 1458,
+     1282, 1283, 1283, 1458, 1283, 1285, 1285, 1458, 1458, 1285,
+     1286, 1286, 1458, 1286, 1287, 1287, 1289, 1289, 1458, 1458,
+     1289, 1359, 1359, 1359, 1360, 1458, 1360, 1293, 1293, 1458,
+     1293,   53,   53,   53, 1458,   53,   53, 1365, 1365, 1365,
 
-     1329, 1243, 1246, 1329, 1246, 1247, 1247, 1247, 1248, 1248,
-     1248, 1249, 1329, 1249, 1185, 1185, 1329, 1329, 1185, 1186,
-     1186, 1329, 1186, 1252, 1329, 1252, 1190, 1329, 1329, 1190,
-     1191, 1191, 1329, 1191, 1193, 1193, 1329, 1329, 1193, 1194,
-     1194, 1329, 1194, 1256, 1329, 1256, 1197, 1329, 1197, 1199,
-     1329, 1329, 1199, 1200, 1200, 1329, 1200, 1202, 1202, 1329,
-     1329, 1202, 1203, 1203, 1329, 1203, 1260, 1329, 1260, 1206,
-     1329, 1206, 1208, 1329, 1329, 1208, 1209, 1209, 1329, 1209,
-     1211, 1211, 1329, 1329, 1211, 1212, 1212, 1329, 1212, 1264,
-     1329, 1264, 1215, 1329, 1215, 1217, 1329, 1329, 1217, 1218,
+     1239, 1239, 1239, 1367, 1458, 1367, 1368, 1458, 1368, 1369,
+     1458, 1369, 1370, 1458, 1370, 1371, 1458, 1371, 1372, 1458,
+     1372, 1375, 1458, 1375, 1376, 1376, 1376, 1377, 1377, 1377,
+     1378, 1458, 1378, 1314, 1314, 1458, 1458, 1314, 1315, 1315,
+     1458, 1315, 1316, 1316, 1381, 1458, 1381, 1319, 1458, 1458,
+     1319, 1320, 1320, 1458, 1320, 1322, 1322, 1458, 1458, 1322,
+     1323, 1323, 1458, 1323, 1324, 1324, 1385, 1458, 1385, 1326,
+     1458, 1326, 1328, 1458, 1458, 1328, 1329, 1329, 1458, 1329,
+     1331, 1331, 1458, 1458, 1331, 1332, 1332, 1458, 1332, 1333,
+     1333, 1389, 1458, 1389, 1335, 1458, 1335, 1337, 1458, 1458,
 
-     1218, 1329, 1218, 1220, 1220, 1329, 1329, 1220, 1221, 1221,
-     1329, 1221, 1268, 1329, 1268, 1269, 1329, 1269, 1272, 1329,
-     1272, 1275, 1329, 1275, 1276, 1276, 1276, 1277, 1329, 1277,
-       53,   53,   53, 1329,   53,   53, 1281, 1329, 1281, 1183,
-     1329, 1183, 1188, 1329, 1188, 1196, 1329, 1196, 1205, 1329,
-     1205, 1214, 1329, 1214, 1223, 1329, 1223, 1245, 1245, 1329,
-     1329, 1245, 1246, 1246, 1329, 1246, 1237, 1329, 1237, 1286,
-     1329, 1286, 1287, 1329, 1287, 1290, 1329, 1290, 1291, 1329,
-     1291, 1294, 1329, 1294, 1295, 1329, 1295, 1298, 1329, 1298,
-     1299, 1329, 1299, 1302, 1329, 1302, 1271, 1329, 1329, 1271,
+     1337, 1338, 1338, 1458, 1338, 1340, 1340, 1458, 1458, 1340,
+     1341, 1341, 1458, 1341, 1342, 1342, 1393, 1458, 1393, 1344,
+     1458, 1344, 1346, 1458, 1458, 1346, 1347, 1347, 1458, 1347,
+     1349, 1349, 1458, 1458, 1349, 1350, 1350, 1458, 1350, 1351,
+     1351, 1397, 1458, 1397, 1398, 1458, 1398, 1401, 1458, 1401,
+     1404, 1458, 1404, 1405, 1405, 1405, 1406, 1458, 1406,   53,
+       53,   53, 1458,   53,   53, 1410, 1458, 1410, 1312, 1458,
+     1312, 1317, 1458, 1317, 1325, 1458, 1325, 1334, 1458, 1334,
+     1343, 1458, 1343, 1352, 1458, 1352, 1374, 1374, 1458, 1458,
+     1374, 1375, 1375, 1458, 1375, 1376, 1376, 1366, 1458, 1366,
 
-     1274, 1274, 1329, 1329, 1274, 1306, 1329, 1306, 1248, 1329,
-     1248, 1310, 1329, 1310, 1285, 1329, 1329, 1285, 1289, 1329,
-     1329, 1289, 1293, 1329, 1329, 1293, 1297, 1329, 1329, 1297,
-     1301, 1329, 1329, 1301, 1316, 1329, 1316, 1319, 1329, 1319,
-     1309, 1329, 1329, 1309, 1321, 1329, 1321, 1322, 1329, 1322,
-     1323, 1329, 1323, 1324, 1329, 1324, 1325, 1329, 1325, 1318,
-     1329, 1329, 1318, 1327, 1329, 1327, 1328, 1329, 1328,    3,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
+     1415, 1458, 1415, 1416, 1458, 1416, 1419, 1458, 1419, 1420,
+     1458, 1420, 1423, 1458, 1423, 1424, 1458, 1424, 1427, 1458,
+     1427, 1428, 1458, 1428, 1431, 1458, 1431, 1400, 1458, 1458,
+     1400, 1403, 1403, 1458, 1458, 1403, 1435, 1458, 1435, 1377,
+     1458, 1377, 1439, 1458, 1439, 1414, 1458, 1458, 1414, 1418,
+     1458, 1458, 1418, 1422, 1458, 1458, 1422, 1426, 1458, 1458,
+     1426, 1430, 1458, 1458, 1430, 1445, 1458, 1445, 1448, 1458,
+     1448, 1438, 1458, 1458, 1438, 1450, 1458, 1450, 1451, 1458,
+     1451, 1452, 1458, 1452, 1453, 1458, 1453, 1454, 1458, 1454,
+     1447, 1458, 1458, 1447, 1456, 1458, 1456, 1457, 1458, 1457,
 
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329
+        3, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458
     } ;
 
-static yyconst flex_int16_t yy_chk[6623] =
+static yyconst flex_int16_t yy_chk[7455] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    4,    7,   91,    4,    7,    4,    7,    9,
-        4,    7,    9,   12,    9,   24,   12,    9,   12,    4,
-        7,   12,   15,   17,   17, 1319,    9,    4,    7,   24,
-       12,   19,   19,   64,    9,   64,   24,   91,   12,   14,
-       14,   14,   14,   14,   14,   14,   14,   14,   15,   27,
+        1,    1,    1,    4,    7,   15,    4,    7,    4,    7,
+        9,    4,    7,    9,   34,    9,   17,   17,    9,   19,
+       19,    4,    7,   34,   24,   27,   27,  105,    9,    4,
+        7,   15,   12,  105,  133,   12,    9,   12,   24,   23,
+       12,   23,   23,   26,   28,   24,   23,   26, 1242,   28,
 
-       27,   14,   14,   14, 1310, 1302,   14,   14,   14,   14,
+       12,   23,  133,   26,   29,   23,   26,   23,   12,   14,
+       14,   14,   14,   14,   14,   14,   14,   14,   14,   94,
+       29,   94,   14,   14,   14,  265,  265,   14,   14,   14,
        14,   14,   14,   14,   14,   14,   14,   14,   14,   14,
        14,   14,   14,   14,   14,   14,   14,   14,   14,   14,
-       14,   16,   28,   23,   16,   23,   16,   28,   29,   16,
-       23,   87, 1298, 1294,   34,   23,   87,   22,   16,   23,
-       22,   23,   22,   34,   29,   22,   16,   20,   20,   20,
-       20,   20,   20,   20,   22,   26,   25,   33,   39,   25,
-       20,   33,   22,   25,   96,   26,   35,   38,   26,   96,
-       33,   33,   39,   38,   33,   38,   33,   38,   35, 1290,
-       35,   38,   35,   38,   38,   35,   20,   21,   21,   21,
+       14,   14,   16,   36,   25,   16, 1243,   16,   36,   36,
+       16,   36,   36,   93,   25,  101,   93,   25,   97,   22,
+       16,   25,   22,   97,   22,  431,  431,   22,   16,   20,
+       20,   20,   20,   20,   20,   20,   20,   22,   33,   30,
+      137,   30,   33,   20,   35,   22,   30,   30,  101,   30,
 
-       21,   21,   21,   21,   95,   32,   32,   21, 1286, 1275,
-       95, 1272,   69,   21,   21,   21,   21,   21,   21,   31,
-       32,   75,   31,   31,   32,   31,   69,   31,   32,   31,
-       32,   31,   37,   36,   31,   75,   37,   32,   36,   36,
-       41,   36,   36,   80,   37, 1246, 1230,  123,   41,   37,
-       44,   37,   41,   44,   41,   44,   80,   78,   44,   49,
-       49,   49,   49,   49,   49,  123,  141,   44,   52,   52,
-       52,   52,   52,   52,   52,   44,   50,   50,   50,   50,
-       50,   50,   50,   78, 1221,   99,  295,   50,   99,   78,
-       99,  295,  141,   50,   50,   50,   50,   50,   50,   54,
+      137,   33,   33,   30,   41,   33,   35,   33,   35,  106,
+       35,  250,   41,   35,  106,  249,   41,  249,   41,   20,
+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
+       32,   32, 1247,   21,   83,  250,   39,  102,   39,   21,
+       21,   21,   21,   21,   21,   31,   32, 1248,   31,   31,
+       32,   31,   39,   31,   32,   31,   32,   31,   37,   39,
+       31,   83,   37,   32,  102,  128,   38,   83,  109,  102,
+       37,  109,   38,  109,   38,   37,   38,   37,  128,  135,
+       38,   44,   38,   38,   44,  655,   44,  655,  135,   44,
+       62,   62,   62,   62,   62,   62,   62,   63,  154,   44,
 
-       54,   54,   54,   54,   54,   61,  626,  168,   61,   54,
-       61,  168,  118,   61,   92,   54,   54,   54,   54,   54,
-       54,   55,   61,  626,   55,  118,   55,  634, 1218,   55,
-       61,  127,   55,   55,   55,   55,   55,   55,   55, 1212,
-       92,  127,   55,  148,  634,   92,   55,  634,   55,   55,
-       55,   55,   55,   55,   63,   63,   63,   63,   63,   63,
-       63,  125,  143,  143,  143,  143,  143,  143,  143,  148,
-      125,  155,  155,  155,  155,  155,  155,  155, 1209,  226,
-     1203, 1200,  196,  241, 1194,  318,  351,   63,  140,  140,
-      140,  140,  140,  140,  140,  196, 1191,  304,  318,  323,
+       63,  336,   63,  220,  652,   63,  336,   44,   48,   48,
+       48,   48,   48,   48,   48,   63,  220,  162,  272,   48,
+      348,  373,  652,   63,  154,   48,   48,   48,   48,   48,
+       48,   49,   49,   49,   49,   49,   49,   49,  433,  440,
+     1254,  446,   49,  162,  272,  454,  348,  373,   49,   49,
+       49,   49,   49,   49,   50,   50,   50,   50,   50,   50,
+       50,   50,  460, 1255,  433,  440,   50,  446,  596,  596,
+      460,  454,   50,   50,   50,   50,   50,   50,   52,   52,
+       52,   52,   52,   52,   52,   52,   54,   54,   54,   54,
+       54,   54,   54,  282,  282,  282,  282,   54,  406,  647,
 
-      351,  140,  226,  233,  233,  233,  233,  233,  233,  241,
-      244,  244,  244,  244,  244,  244,  247,  247,  247,  247,
-      247,  247,  247,  304,  318,  323,  348,  140,  142,  142,
-      142,  142,  142,  142,  142,  370,  376,  384,  142,  348,
-     1186, 1182,  639, 1181,  142,  142,  142,  142,  142,  142,
-      145,  145,  145,  145,  145,  145,  145,  390,  454,  639,
-      145,  370,  376,  384,  390,  454,  145,  145,  145,  145,
-      145,  145,  147,  147,  147,  147,  147,  147,  147,  147,
-     1170, 1164,  299,  147,  379,  147, 1157,  299,  265,  147,
-      147,  147,  147,  147,  147,  265,  299,  379,  299,  299,
+      647,  479,  409,   54,   54,   54,   54,   54,   54,   56,
+      479,  406,   56,  282,   56,  352,  409,   56,  368,  369,
+       56,   56,   56,   56,   56,   56,   56,   56,  511,  352,
+      648,   56,  368,  369, 1262,   56,  648,   56,   56,   56,
+       56,   56,   56,  152,  481,  152,  152,  152,  152,  152,
+      152,  152,  535,  481,  511,  352,  152,  551,  368,  369,
+      535,  657,  152,  152,  152,  152,  152,  152,  153,  153,
+      153,  153,  153,  153,  153,  153,  545,  639, 1263,  657,
+      153,  604,  153,  551,  545,  639,  153,  153,  153,  153,
+      153,  153,  264,  264,  264,  264,  264,  264,  264,  275,
 
-      407,  299,  312,  312,  312,  312,  312,  312,  265,  407,
-      409,  147,  161,  161,  161,  161,  161,  161,  161,  409,
-     1154, 1150,  437,  379,  265,  315,  315,  315,  315,  315,
-      315,  315,  319,  319,  319,  319,  319,  319,  319, 1149,
-     1142,  161,  234,  234,  234,  234,  234,  234,  437, 1141,
-      545, 1134,  234, 1133,  470,  510,  513,  545,  234,  234,
-      234,  234,  234,  234,  235,  235,  235,  235,  235,  235,
-      235,  235,  240,  240,  240,  240,  240,  240,  240,  240,
-      470,  510,  513,  240,  519,  240, 1126, 1125, 1119,  240,
-      240,  240,  240,  240,  240,  321,  321,  321,  321,  321,
+      275,  275,  275,  275,  275,  275,  449,  604,  153,  155,
+      155,  155,  155,  155,  155,  155,  155,  607,  613, 1270,
+      449,  155,  554,  554,  554,  554, 1271,  155,  155,  155,
+      155,  155,  155,  156,  156,  156,  156,  156,  156,  156,
+      156,  156, 1278,  607,  613,  156,  449,  620,  632,  666,
+      666,  156,  156,  156,  156,  156,  156,  157,  157,  157,
+      157,  157,  157,  157,  157,  159,  159,  159,  159,  159,
+      159,  159,  159,  620,  632,  649,  159,  673,  650,  714,
+      649,  650,  159,  159,  159,  159,  159,  159,  161,  161,
+      161,  161,  161,  161,  161,  161,  161,  656, 1279, 1283,
 
-      321,  321,  365,  365,  365,  365,  365,  365,  461,  465,
-      519,  240,  245,  245,  245,  245,  245,  245,  245,  245,
-      526,  461,  465,  245,  538, 1118,  637, 1114, 1113,  245,
-      245,  245,  245,  245,  245,  246,  246,  246,  246,  246,
-      246, 1112,  593,  637,  637,  246,  526,  461,  465,  593,
-      538,  246,  246,  246,  246,  246,  246,  303,  303,  303,
-      303,  303,  303,  303,  388,  388,  388,  388,  388,  388,
-      303,  380,  380,  380,  380,  380,  380,  380,  382,  382,
-      382,  382,  382,  382,  382,  392,  392,  392,  392,  392,
-      392,  521,  529,  533,  628,  640,  303,  308,  308,  308,
+      161,  656,  161,  673,  306,  714,  161,  161,  161,  161,
+      161,  161,  306,  358,  358,  358,  358,  358,  358,  358,
+     1286, 1287,  450, 1291,  515,  306,  729,  653,  161,  258,
+      258,  258,  258,  258,  258,  258,  450,  653,  515,  726,
+      258,  306, 1293,  731,  729, 1299,  258,  258,  258,  258,
+      258,  258,  260,  260,  260,  260,  260,  260,  260,  651,
+      675,  731,  450,  260,  515,  726,  758,  761,  651,  260,
+      260,  260,  260,  260,  260,  261,  261,  261,  261,  261,
+      261,  261,  261,  263,  263,  263,  263,  263,  263,  263,
+      696,  707,  758,  761,  263,  764,  675,  730,  696,  707,
 
-      308,  308,  308,  604,  521,  529,  533,  308,  611,  627,
-      604,  628,  640,  308,  308,  308,  308,  308,  308,  311,
-      311,  311,  311,  311,  311,  311,  627,  623,  628,  311,
-      521,  529,  533,  627,  611,  311,  311,  311,  311,  311,
-      311,  313,  313,  313,  313,  313,  313,  313,  313,  700,
-      741,  646,  313,  623,  633,  635,  700,  741,  313,  313,
-      313,  313,  313,  313,  314,  314,  314,  314,  314,  314,
-      314,  633,  635,  649,  314,  635,  633,  646,  638,  707,
-      314,  314,  314,  314,  314,  314,  320,  320,  320,  320,
-      320,  320,  320,  320, 1111,  638,  707,  320,  638,  649,
+      263,  263,  263,  263,  263,  263,  266,  266,  266,  266,
+      266,  266,  266,  266, 1300,  730, 1310, 1311,  266, 1315,
+     1316,  764,  730, 1320,  266,  266,  266,  266,  266,  266,
+      268,  268,  268,  268,  268,  268,  268,  268,  271,  271,
+      271,  271,  271,  271,  271,  271,  271,  812,  341,  542,
+      271, 1323,  271,  341, 1324,  812,  271,  271,  271,  271,
+      271,  271,  341,  542,  341,  341,  770,  341,  362,  362,
+      362,  362,  362,  362,  362,  741,  543,  732,  271,  276,
+      276,  276,  276,  276,  276,  276,  276,  276, 1329,  542,
+      543,  276,  770,  741,  741,  732,  546,  276,  276,  276,
 
-      719,  708, 1091,  320,  320,  320,  320,  320,  320,  322,
-      322,  322,  322,  322,  322,  322,  322,  719,  708,  652,
-      322,  658,  322,  708,  665,  677,  322,  322,  322,  322,
-      322,  322,  395,  395,  395,  395,  395,  395,  395,  447,
-      447,  447,  447,  447,  447,  652,  680,  658,  322,  334,
-      665,  677,  692,  334,  772, 1074,  334,  709,  614,  334,
-      618,  334,  334,  334,  334,  366,  366,  366,  366,  366,
-      366,  614,  680,  618,  709,  366, 1067, 1066,  692,  709,
-      772,  366,  366,  366,  366,  366,  366,  369,  369,  369,
-      369,  369,  369,  369,  369,  752,  764,  614,  369,  618,
+      276,  276,  276,  277,  277,  277,  277,  277,  277,  277,
+      546, 1332,  732, 1333,  277, 1338,  543,  737, 1341,  743,
+      277,  277,  277,  277,  277,  277,  346,  547,  346,  346,
+      346,  346,  346,  346,  346,  737,  546,  743, 1342,  346,
+      737,  547,  744,  738,  748,  346,  346,  346,  346,  346,
+      346,  347,  347,  347,  347,  347,  347,  347,  347, 1347,
+      744,  738,  748,  347,  738,  347, 1350,  547, 1351,  347,
+      347,  347,  347,  347,  347,  430,  430,  430,  430,  430,
+      430,  430,  458,  458,  458,  458,  458,  458,  458,  615,
+      665,  347,  349,  349,  349,  349,  349,  349,  349,  349,
 
-      369, 1060,  752,  764,  369,  369,  369,  369,  369,  369,
-      450,  450,  450,  450,  450,  450,  450,  452,  452,  452,
-      452,  452,  452, 1057,  660,  797,  369,  375,  375,  375,
-      375,  375,  375,  375,  375, 1053,  874,  660,  375, 1052,
-      375, 1046,  797,  874,  375,  375,  375,  375,  375,  375,
-      456,  456,  456,  456,  456,  456,  459,  459,  459,  459,
-      459,  459,  459,  660,  629,  630,  375,  381,  381,  381,
-      381,  381,  381,  381,  381, 1043,  784, 1039,  381, 1038,
-      801,  629,  630,  710,  381,  381,  381,  381,  381,  381,
-      383,  383,  383,  383,  383,  383,  383,  383,  629,  630,
+      665, 1359, 1375,  615,  349, 1376,  819,  739, 1401,  616,
+      349,  349,  349,  349,  349,  349,  353,  353,  353,  353,
+      353,  353,  353,  616,  819,  739,  777,  353,  739,  615,
+      750,  750,  742,  353,  353,  353,  353,  353,  353,  354,
+      354,  354,  354,  354,  354,  354,  354, 1404,  750,  616,
+      742,  354,  777,  742,  789,  792, 1415,  354,  354,  354,
+      354,  354,  354,  355,  355,  355,  355,  355,  355,  355,
+      355,  357,  357,  357,  357,  357,  357,  357,  804,  860,
+      789,  792,  357, 1419,  820,  821, 1423,  860,  357,  357,
+      357,  357,  357,  357,  361,  361,  361,  361,  361,  361,
 
-      710,  383,  784,  383, 1032,  710,  801,  383,  383,  383,
-      383,  383,  383,  462,  462,  462,  462,  462,  462,  462,
-      464,  464,  464,  464,  464,  464,  464,  632,  711,  383,
-      393,  393,  393,  393,  393,  393,  393,  393, 1029,  804,
-      807,  393,  712, 1026,  632,  711, 1025,  393,  393,  393,
-      393,  393,  393,  394,  394,  394,  394,  394,  394,  712,
-      711,  632, 1019,  394,  712,  804,  807, 1016, 1015,  394,
-      394,  394,  394,  394,  394,  436,  436,  436,  436,  436,
-      436,  541,  541,  541,  541,  541,  541,  436,  466,  466,
-      466,  466,  466,  466,  466,  468,  468,  468,  468,  468,
+      361,  361,  820,  821,  804,  361, 1427,  820,  821,  822,
+      824,  361,  361,  361,  361,  361,  361,  363,  363,  363,
+      363,  363,  363,  363,  363,  363,  871,  822,  824,  363,
+     1431,  826,  822,  824,  871,  363,  363,  363,  363,  363,
+      363,  364,  364,  364,  364,  364,  364,  364,  364,  826,
+     1439, 1448,  364,  835,  826,  827,  829,  831,  364,  364,
+      364,  364,  364,  364,  370,  370,  370,  370,  370,  370,
+      370,  370,  370,  827,  829,  831,  370,  829,  827,  835,
+      913,  916,  370,  370,  370,  370,  370,  370,  372,  372,
+      372,  372,  372,  372,  372,  372,  372,  883,  913,  916,
 
-      468,  468,  522,  522,  522,  522,  522,  522,  522,  668,
-      672,  713,  641,  436,  440,  440,  440,  440,  440,  440,
-     1010, 1007,  668,  672,  440, 1004,  796,  717,  713,  641,
-      440,  440,  440,  440,  440,  440,  442,  442,  442,  442,
-      442,  442,  641,  796,  717,  713,  442,  717,  668,  672,
-      714,  796,  442,  442,  442,  442,  442,  442,  446,  446,
-      446,  446,  446,  446,  446, 1003,  810,  714,  446, 1000,
-      816,  715,  714,  794,  446,  446,  446,  446,  446,  446,
-      448,  448,  448,  448,  448,  448,  448,  448,  715,  823,
-      794,  448,  810,  715,  791,  794,  816,  448,  448,  448,
+      372,  891,  372,  913,  903,  883,  372,  372,  372,  372,
+      372,  372,  462,  462,  462,  462,  462,  462,  462,  528,
+      528,  528,  528,  528,  528,  528, 1241,  891,  372,  392,
+      903,  926, 1240,  392,  929,  917,  392,  910,  623,  392,
+      624,  392,  392,  392,  392,  424,  424,  424,  424,  424,
+      424,  424,  623,  917,  624,  910,  424,  926,  910,  918,
+      929,  658,  424,  424,  424,  424,  424,  424,  426,  426,
+      426,  426,  426,  426,  426,  658,  999,  918,  623,  426,
+      624,  932,  935,  941,  999,  426,  426,  426,  426,  426,
+      426,  427,  427,  427,  427,  427,  427,  427,  427,  429,
 
-      448,  448,  448,  449,  449,  449,  449,  449,  449,  449,
-      919,  791,  835,  449,  791,  823,  997,  919,  994,  449,
-      449,  449,  449,  449,  449,  457,  457,  457,  457,  457,
-      457,  457,  457,  838,  850,  854,  457,  866,  835,  884,
-      892,  991,  457,  457,  457,  457,  457,  457,  458,  458,
-      458,  458,  458,  458,  458,  987,  884,  892,  458,  838,
-      850,  854,  887,  866,  458,  458,  458,  458,  458,  458,
-      467,  467,  467,  467,  467,  467,  467,  467,  976,  887,
-      975,  467,  909,  887,  890,  891,  981,  467,  467,  467,
-      467,  467,  467,  469,  469,  469,  469,  469,  469,  469,
+      429,  429,  429,  429,  429,  429,  948,  932,  935,  941,
+      429,  960,  915,  922, 1239, 1009,  429,  429,  429,  429,
+      429,  429,  432,  432,  432,  432,  432,  432,  432,  432,
+      915,  922,  948, 1009,  432, 1235,  432,  960,  915, 1232,
+      432,  432,  432,  432,  432,  432,  533,  533,  533,  533,
+      533,  533,  533,  537,  537,  537,  537,  537,  537,  537,
+      733,  627,  432,  434,  434,  434,  434,  434,  434,  434,
+      963, 1229,  975,  979,  434,  627,  991, 1226,  733,  661,
+      434,  434,  434,  434,  434,  434,  435,  435,  435,  435,
+      435,  435,  435,  661, 1223,  733,  963,  435,  975,  979,
 
-      469,  890,  891,  981,  469,  890,  469,  891,  909,  967,
-      469,  469,  469,  469,  469,  469,  524,  524,  524,  524,
-      524,  524,  524,  530,  530,  530,  530,  530,  530,  530,
-      790,  683,  469,  506,  506,  506,  506,  506,  506,  930,
-      964,  942,  958,  506,  683,  962,  930,  790,  942,  506,
-      506,  506,  506,  506,  506,  509,  509,  509,  509,  509,
-      509,  509,  509,  955,  790,  946,  509,  974,  509,  943,
-      683,  962,  509,  509,  509,  509,  509,  509,  532,  532,
-      532,  532,  532,  532,  532,  534,  534,  534,  534,  534,
-      534,  534,  687,  974,  509,  512,  512,  512,  512,  512,
+     1037,  627,  991,  435,  435,  435,  435,  435,  435,  436,
+      436,  436,  436,  436,  436,  436,  436,  439,  439,  439,
+      439,  439,  439,  439,  439,  439, 1037,  628, 1220,  439,
+     1207,  439, 1203, 1196, 1195,  439,  439,  439,  439,  439,
+      439,  628,  635,  635,  635,  635,  635,  635,  635,  637,
+      637,  637,  637,  637,  637,  637, 1017,  439,  445,  445,
+      445,  445,  445,  445,  445,  445,  445,  628, 1194, 1190,
+      445, 1189,  445, 1186, 1017,  664,  445,  445,  445,  445,
+      445,  445,  641,  641,  641,  641,  641,  641,  641,  664,
+      689,  689,  689,  689,  689,  689,  689,  734,  445,  451,
 
-      512,  512,  512,  954, 1073,  687,  512,  934,  512,  931,
-      954, 1073,  512,  512,  512,  512,  512,  512,  536,  536,
-      536,  536,  536,  536,  536,  543,  543,  543,  543,  543,
-      543,  687,  980,  985,  512,  518,  518,  518,  518,  518,
-      518,  518,  518,  923,  920,  914,  518,  911,  518,  980,
-      985,  980,  518,  518,  518,  518,  518,  518,  547,  547,
-      547,  547,  547,  547,  550,  550,  550,  550,  550,  550,
-      550,  718,  795,  792,  518,  523,  523,  523,  523,  523,
-      523,  523,  523,  910,  990,  907,  523,  993,  718,  795,
-      792,  792,  523,  523,  523,  523,  523,  523,  525,  525,
+      451,  451,  451,  451,  451,  451,  451,  451, 1182, 1181,
+     1090,  451, 1180, 1102, 1119,  734, 1012,  451,  451,  451,
+      451,  451,  451,  453,  453,  453,  453,  453,  453,  453,
+      453,  453,  734, 1176, 1012,  453, 1090,  453, 1012, 1102,
+     1119,  453,  453,  453,  453,  453,  453,  694,  694,  694,
+      694,  694,  694,  694,  698,  698,  698,  698,  698,  698,
+      698,  717,  736,  453,  463,  463,  463,  463,  463,  463,
+      463,  463,  463, 1175, 1172,  717,  463, 1122, 1015, 1168,
+      736,  718,  463,  463,  463,  463,  463,  463,  464,  464,
+      464,  464,  464,  464,  464,  718, 1015,  736, 1167,  464,
 
-      525,  525,  525,  525,  525,  525,  795,  718,  792,  525,
-      990,  525,  893,  993,  875,  525,  525,  525,  525,  525,
-      525,  579,  579,  579,  579,  579,  579,  579,  582,  582,
-      582,  582,  582,  582,  582,  886,  793,  525,  535,  535,
-      535,  535,  535,  535,  535,  535,  868,  996,  867,  535,
-      999, 1002,  886,  793,  859,  535,  535,  535,  535,  535,
-      535,  537,  537,  537,  537,  537,  537,  537,  537,  793,
-      856,  886,  537,  996,  537,  852,  999, 1002,  537,  537,
-      537,  537,  537,  537,  586,  586,  586,  586,  586,  586,
-      589,  589,  589,  589,  589,  589,  589,  775,  716,  787,
+     1015,  717, 1016, 1122, 1105,  464,  464,  464,  464,  464,
+      464,  509,  721,  509,  509,  509,  509,  509,  509,  509,
+     1016,  718, 1105, 1166,  509, 1016,  721, 1162, 1161, 1108,
+      509,  509,  509,  509,  509,  509,  510,  510,  510,  510,
+      510,  510,  510,  510, 1158, 1047, 1105, 1108,  510, 1108,
+      510, 1155,  721, 1047,  510,  510,  510,  510,  510,  510,
+      703,  703,  703,  703,  703,  703,  703,  705,  705,  705,
+      705,  705,  705,  705,  722,  825,  510,  512,  512,  512,
+      512,  512,  512,  512,  512, 1125, 1058, 1154,  722,  512,
+     1128, 1153, 1131,  825, 1058,  512,  512,  512,  512,  512,
 
-      537,  548,  548,  548,  548,  548,  548,  548,  548, 1027,
-      775, 1041,  548,  851,  843,  716,  787,  840,  548,  548,
-      548,  548,  548,  548,  549,  549,  549,  549,  549,  549,
-      716,  787, 1055,  837,  549, 1027,  775, 1041, 1080,  779,
-      549,  549,  549,  549,  549,  549,  576,  576,  576,  576,
-      576,  576,  779,  836, 1089, 1080,  576, 1152, 1055,  977,
-      982,  828,  576,  576,  576,  576,  576,  576,  577,  577,
-      577,  577,  577,  577,  577,  577,  977,  982,  779,  577,
-     1089,  825, 1081, 1152,  818,  577,  577,  577,  577,  577,
-      577,  578,  578,  578,  578,  578,  578,  818,  982, 1081,
+      512,  516,  516,  516,  516,  516,  516,  516,  516, 1070,
+      825, 1125, 1149,  516,  722, 1156, 1128, 1070, 1131,  516,
+      516,  516,  516,  516,  516,  517,  517,  517,  517,  517,
+      517,  517,  517,  518,  518,  518,  518,  518,  518,  518,
+     1082, 1156, 1148, 1145,  518, 1170, 1184, 1218, 1082, 1144,
+      518,  518,  518,  518,  518,  518,  519,  519,  519,  519,
+      519,  519,  519,  519,  521,  521,  521,  521,  521,  521,
+      521, 1170, 1184, 1218, 1281,  521, 1318, 1327, 1106, 1107,
+     1109,  521,  521,  521,  521,  521,  521,  522,  522,  522,
+      522,  522,  522,  522,  522,  522, 1106, 1107, 1109,  522,
 
-      977,  578, 1189, 1198,  978,  889,  824,  578,  578,  578,
-      578,  578,  578,  580,  580,  580,  580,  580,  580,  580,
-      580,  978,  889,  818,  580, 1207,  979,  984, 1189, 1198,
-      580,  580,  580,  580,  580,  580,  581,  581,  581,  581,
-      581,  581,  889,  979,  984,  978,  581,  817, 1082,  984,
-      813, 1207,  581,  581,  581,  581,  581,  581,  585,  585,
-      585,  585,  585,  585,  585, 1082, 1117,  979,  585,  812,
-     1216, 1083, 1084, 1117,  585,  585,  585,  585,  585,  585,
-      587,  587,  587,  587,  587,  587,  587,  587, 1083, 1084,
-     1270,  587,  811,  808, 1084, 1166, 1216,  587,  587,  587,
+     1281, 1112, 1318, 1327,  772,  522,  522,  522,  522,  522,
+      522,  523,  523,  523,  523,  523,  523,  523,  772, 1112,
+     1106, 1107,  523, 1143, 1112, 1113, 1139, 1137,  523,  523,
+      523,  523,  523,  523,  527,  527,  527,  527,  527,  527,
+      527,  527, 1136, 1113,  772,  527, 1133, 1132, 1129, 1209,
+     1110,  527,  527,  527,  527,  527,  527,  529,  529,  529,
+      529,  529,  529,  529,  529,  529, 1202, 1209, 1110,  529,
+     1126, 1123, 1210, 1211, 1202,  529,  529,  529,  529,  529,
+      529,  530,  530,  530,  530,  530,  530,  530,  530, 1110,
+     1210, 1211,  530, 1120, 1116, 1212, 1213, 1295,  530,  530,
 
-      587,  587,  587,  588,  588,  588,  588,  588,  588,  588,
-     1124, 1132, 1166,  588,  805, 1166, 1270, 1124, 1132,  588,
-      588,  588,  588,  588,  588,  591,  591,  591,  591,  591,
-      591,  595,  595,  595,  595,  595,  595,  596,  596,  596,
-      596,  596,  596,  596,  596, 1140, 1148, 1284,  596, 1288,
-      802, 1167, 1140, 1148,  596,  596,  596,  596,  596,  596,
-      597,  597,  597,  597,  597,  597,  597, 1180, 1167,  799,
-      597, 1167,  798, 1284, 1180, 1288,  597,  597,  597,  597,
-      597,  597,  598,  598,  598,  598,  598,  598,  598,  600,
-      600,  600,  600,  600,  600,  602,  602,  602,  602,  602,
+      530,  530,  530,  530,  538,  538,  538,  538,  538,  538,
+      538,  538,  538, 1212, 1213, 1295,  538, 1104, 1295, 1213,
+     1296, 1103,  538,  538,  538,  538,  538,  538,  539,  539,
+      539,  539,  539,  539,  539,  539, 1246, 1100, 1296,  539,
+     1336, 1296, 1096, 1297, 1246,  539,  539,  539,  539,  539,
+      539,  548,  548,  548,  548,  548,  548,  548,  548,  548,
+     1253, 1297, 1345,  548, 1399, 1413, 1336, 1095, 1253,  548,
+      548,  548,  548,  548,  548,  550,  550,  550,  550,  550,
+      550,  550,  550,  550, 1261, 1297, 1092,  550, 1345,  550,
+     1399, 1413, 1261,  550,  550,  550,  550,  550,  550,  709,
 
-      602,  606,  606,  606,  606,  606,  606,  607,  607,  607,
-      607,  607,  607,  607,  607, 1229, 1292, 1296,  607,  786,
-     1234, 1235, 1229,  785,  607,  607,  607,  607,  607,  607,
-      608,  608,  608,  608,  608,  608,  608, 1234, 1235,  777,
-      608,  774, 1292, 1296,  765, 1234,  608,  608,  608,  608,
-      608,  608,  609,  609,  609,  609,  609,  609,  609,  612,
-      612,  612,  612,  612,  612,  615,  615,  615,  615,  615,
-      615,  615,  617,  617,  617,  617,  617,  617,  617,  619,
-      619,  619,  619,  619,  619,  619,  620,  620,  620,  620,
-      620,  620,  620,  620,  753,  742,  732,  620,  731,  720,
+      709,  709,  709,  709,  709,  709,  715,  715,  715,  715,
+      715,  715,  715,  823,  773,  550,  590,  590,  590,  590,
+      590,  590,  590, 1417, 1269, 1421, 1425,  590,  773, 1087,
+     1364,  823, 1269,  590,  590,  590,  590,  590,  590,  592,
+      592,  592,  592,  592,  592,  592,  823, 1277, 1364, 1417,
+      592, 1421, 1425, 1429,  773, 1277,  592,  592,  592,  592,
+      592,  592,  593,  593,  593,  593,  593,  593,  593,  593,
+      595,  595,  595,  595,  595,  595,  595, 1309, 1358, 1429,
+     1437,  595, 1446, 1214, 1407, 1309, 1358,  595,  595,  595,
+      595,  595,  595,  597,  597,  597,  597,  597,  597,  597,
 
-      701,  694,  693,  620,  620,  620,  620,  620,  620,  621,
-      621,  621,  621,  621,  621,  621,  622,  622,  622,  622,
-      622,  622,  622,  622,  631,  636, 1278,  622,  642,  622,
-      685,  826,  682,  622,  622,  622,  622,  622,  622,  881,
-     1300,  631,  636, 1278,  826,  642,  661,  661,  661,  661,
-      661,  661,  661,  631,  636,  622,  881,  642,  645,  645,
-      645,  645,  645,  645,  645,  645, 1300,  881,  679,  645,
-      826,  645,  678,  670,  667,  645,  645,  645,  645,  645,
-      645,  663,  663,  663,  663,  663,  663,  663,  669,  669,
-      669,  669,  669,  669,  669, 1168, 1280,  645,  648,  648,
+      597, 1214, 1407, 1086, 1083,  597, 1437, 1075, 1446, 1074,
+     1214,  597,  597,  597,  597,  597,  597,  598,  598,  598,
+      598,  598,  598,  598,  598,  599,  599,  599,  599,  599,
+      599,  599, 1405, 1071, 1063, 1062,  599, 1059, 1052, 1051,
+     1405, 1048,  599,  599,  599,  599,  599,  599,  600,  600,
+      600,  600,  600,  600,  600,  600,  603,  603,  603,  603,
+      603,  603,  603,  603,  603,  735,  780,  781,  603, 1043,
+      603, 1409, 1042,  784,  603,  603,  603,  603,  603,  603,
+      780,  781, 1039,  735, 1038, 1035, 1034,  784, 1031, 1409,
+      745, 1028,  740, 1025,  746,  735,  603,  606,  606,  606,
 
-      648,  648,  648,  648,  648,  648,  666,  659,  656,  648,
-      655,  648, 1168, 1280,  654,  648,  648,  648,  648,  648,
-      648,  671,  671,  671,  671,  671,  671,  671,  673,  673,
-      673,  673,  673,  673,  673,  830, 1168,  648,  651,  651,
-      651,  651,  651,  651,  651,  651,  653,  650,  830,  651,
-     1308,  651,  647,  644,  643,  651,  651,  651,  651,  651,
-      651,  675,  675,  675,  675,  675,  675,  675,  681,  681,
-      681,  681,  681,  681,  830, 1307, 1308,  651,  657,  657,
-      657,  657,  657,  657,  657,  657,  625,  624,  616,  657,
-     1317,  657, 1307,  613,  605,  657,  657,  657,  657,  657,
+      606,  606,  606,  606,  606,  606,  780,  781,  745,  606,
+      740,  606,  746,  784,  830,  606,  606,  606,  606,  606,
+      606,  745,  740, 1021,  746,  752,  752,  752,  752,  752,
+      752,  752,  830,  785,  795,  796,  909,  606,  612,  612,
+      612,  612,  612,  612,  612,  612,  612,  785,  795,  796,
+      612,  830,  612, 1004,  909,  799,  612,  612,  612,  612,
+      612,  612,  793,  793,  793,  793,  793,  793,  793,  799,
+     1363,  909, 1000,  785,  795,  796,  800,  993,  612,  617,
+      617,  617,  617,  617,  617,  617,  617,  617, 1363,  992,
+      800,  617,  989,  985, 1436,  799, 1363,  617,  617,  617,
 
-      657,  684,  684,  684,  684,  684,  684,  684,  686,  686,
-      686,  686,  686,  686,  686, 1165, 1317,  657,  662,  662,
-      662,  662,  662,  662,  662,  662,  594,  584,  583,  662,
-      575,  571, 1165,  570,  569,  662,  662,  662,  662,  662,
-      662,  664,  664,  664,  664,  664,  664,  664,  664, 1165,
-      567,  566,  664,  563,  664,  562,  561,  560,  664,  664,
-      664,  664,  664,  664,  688,  688,  688,  688,  688,  688,
-      688,  690,  690,  690,  690,  690,  690,  690, 1232,  559,
-      664,  674,  674,  674,  674,  674,  674,  674,  674,  558,
-      557,  556,  674,  555,  554, 1232,  553,  552,  674,  674,
+      617,  617,  617,  619,  619,  619,  619,  619,  619,  619,
+      619,  619, 1436,  984,  981,  619,  800,  619,  977,  976,
+      973,  619,  619,  619,  619,  619,  619,  808,  808,  808,
+      808,  808,  808,  808,  810,  810,  810,  810,  810,  810,
+      810,  894,  911,  619,  629,  629,  629,  629,  629,  629,
+      629,  629,  629,  969,  968,  894,  629,  965,  962,  961,
+      911,  911,  629,  629,  629,  629,  629,  629,  631,  631,
+      631,  631,  631,  631,  631,  631,  631,  958,  911,  954,
+      631,  894,  631,  953, 1014,  828,  631,  631,  631,  631,
+      631,  631,  814,  814,  814,  814,  814,  814,  814,  950,
 
+      949,  946, 1014,  828,  942,  895,  898,  912,  631,  642,
+      642,  642,  642,  642,  642,  642,  642,  642,  828,  895,
+      898,  642, 1014,  938,  937,  912,  899,  642,  642,  642,
+      642,  642,  642,  643,  643,  643,  643,  643,  643,  643,
+      899,  912,  936,  933,  643,  895,  898,  930,  927,  924,
+      643,  643,  643,  643,  643,  643,  646,  646,  646,  646,
+      646,  646,  646,  923,  905,  904,  899,  646,  906,  907,
+      908,  914, 1011,  646,  646,  646,  646,  646,  646,  853,
+      853,  853,  853,  853,  853,  853,  906,  907,  908,  914,
+     1011,  646,  669,  901,  669,  669,  669,  669,  669,  669,
+
+      669,  906,  907,  908,  908,  669,  914,  897, 1010, 1011,
+     1114,  669,  669,  669,  669,  669,  669,  858,  858,  858,
+      858,  858,  858,  858,  943,  944, 1010, 1294, 1114,  669,
+      670,  670,  670,  670,  670,  670,  670,  670,  943,  944,
+     1010,  896,  670, 1114,  893, 1294,  888,  884,  670,  670,
+      670,  670,  670,  670,  862,  862,  862,  862,  862,  862,
+      862,  876, 1294,  872,  943,  944,  670,  671,  671,  671,
+      671,  671,  671,  671,  867,  867,  867,  867,  867,  867,
+      867,  869,  869,  869,  869,  869,  869,  869,  873,  873,
+      873,  873,  873,  873,  873,  879,  879,  879,  879,  879,
+
+      879,  879,  671,  672,  672,  672,  672,  672,  672,  672,
+      865,  861,  856,  851,  672,  850,  849,  846,  843,  839,
+      672,  672,  672,  672,  672,  672,  674,  674,  674,  674,
       674,  674,  674,  674,  676,  676,  676,  676,  676,  676,
-      676,  676,  546,  540, 1232,  676,  539,  676,  531,  528,
-      527,  676,  676,  676,  676,  676,  676,  696,  696,  696,
-      696,  696,  696,  698,  698,  698,  698,  698,  698, 1279,
-      841,  520,  517,  676,  689,  689,  689,  689,  689,  689,
-      689,  689,  516,  841,  515,  689, 1279,  514,  511,  508,
-      507,  689,  689,  689,  689,  689,  689,  691,  691,  691,
-      691,  691,  691,  691,  691, 1279,  505,  501,  691,  841,
-      691,  498,  497,  496,  691,  691,  691,  691,  691,  691,
-      702,  702,  702,  702,  702,  702,  705,  705,  705,  705,
+      676,  676,  817,  813,  806,  805,  676,  802,  798,  797,
+      794,  791,  676,  676,  676,  676,  676,  676,  677,  677,
+      677,  677,  677,  677,  677,  677,  679,  679,  679,  679,
+      679,  679,  679,  790,  787,  783,  782,  679,  779,  778,
+      775,  771,  768,  679,  679,  679,  679,  679,  679,  680,
+      680,  680,  680,  680,  680,  680,  680,  680,  767,  766,
 
-      705,  705,  705,  845,  788,  789,  691,  703,  703,  703,
-      703,  703,  703,  703,  703,  495,  845,  491,  703,  490,
-      488,  788,  789,  487,  703,  703,  703,  703,  703,  703,
-      704,  704,  704,  704,  704,  704,  788,  789,  789,  486,
-      704,  485,  845,  484,  483,  857,  704,  704,  704,  704,
-      704,  704,  721,  721,  721,  721,  721,  721,  857,  482,
-      481,  480,  721,  479,  478,  477,  474,  473,  721,  721,
-      721,  721,  721,  721,  722,  722,  722,  722,  722,  722,
-      722,  722,  472,  471,  857,  722, 1085,  463,  455,  445,
-      444,  722,  722,  722,  722,  722,  722,  723,  723,  723,
+      765,  680,  762,  759,  756,  755,  951,  680,  680,  680,
+      680,  680,  680,  681,  681,  681,  681,  681,  681,  681,
+      951,  728,  727,  724,  681,  720,  719,  716,  712,  708,
+      681,  681,  681,  681,  681,  681,  683,  683,  683,  683,
+      683,  683,  683,  683,  683,  701,  951,  697,  683,  692,
+      687,  686,  685,  952,  683,  683,  683,  683,  683,  683,
+      684,  684,  684,  684,  684,  684,  684,  952,  682,  678,
+      668,  684,  667,  663,  662,  660,  659,  684,  684,  684,
+      684,  684,  684,  688,  688,  688,  688,  688,  688,  688,
+      688,  654,  644,  952,  688,  640,  634,  633,  630,  626,
 
-      723,  723,  723, 1085,  443,  441,  439,  723,  438,  435,
-      434,  433, 1085,  723,  723,  723,  723,  723,  723,  724,
-      724,  724,  724,  724,  724,  724,  725,  725,  725,  725,
-      725,  725,  725,  725,  432,  431,  430,  725, 1233,  429,
-      428,  427,  426,  725,  725,  725,  725,  725,  725,  726,
-      726,  726,  726,  726,  726, 1233,  424,  421,  420,  726,
-      419,  418,  417,  416, 1233,  726,  726,  726,  726,  726,
-      726,  727,  727,  727,  727,  727,  727,  727,  728,  728,
-      728,  728,  728,  728,  728,  728,  415,  413,  412,  728,
-      411,  410,  408,  406,  405,  728,  728,  728,  728,  728,
+      688,  688,  688,  688,  688,  688,  690,  690,  690,  690,
+      690,  690,  690,  690,  690,  625,  622,  621,  690,  618,
+      614,  611,  610,  609,  690,  690,  690,  690,  690,  690,
+      691,  691,  691,  691,  691,  691,  691,  691,  608,  605,
+      602,  691,  601,  594,  591,  589,  585,  691,  691,  691,
+      691,  691,  691,  699,  699,  699,  699,  699,  699,  699,
+      699,  699,  581,  580,  579,  699,  578,  574,  573,  571,
+      570,  699,  699,  699,  699,  699,  699,  700,  700,  700,
+      700,  700,  700,  700,  700,  569,  568,  567,  700,  566,
+      565,  564,  563,  562,  700,  700,  700,  700,  700,  700,
 
-      728,  729,  729,  729,  729,  729,  729,  404,  403,  402,
-      401,  729,  399,  398,  391,  387,  386,  729,  729,  729,
-      729,  729,  729,  730,  730,  730,  730,  730,  730,  730,
-      733,  733,  733,  733,  733,  733,  733,  385,  378,  377,
-      733,  374,  373,  372,  371,  368,  733,  733,  733,  733,
-      733,  733,  734,  734,  734,  734,  734,  734,  735,  735,
-      735,  735,  735,  735,  735,  735,  367,  364,  363,  735,
-      362,  361,  360,  359,  358,  735,  735,  735,  735,  735,
-      735,  736,  736,  736,  736,  736,  736,  736,  357,  356,
-      355,  736,  354,  352,  350,  349,  347,  736,  736,  736,
+      710,  710,  710,  710,  710,  710,  710,  710,  710,  561,
+      560,  557,  710,  556,  555,  553,  552,  549,  710,  710,
+      710,  710,  710,  710,  711,  711,  711,  711,  711,  711,
+      711,  711,  544,  540,  536,  711,  531,  526,  525,  524,
+      520,  711,  711,  711,  711,  711,  711,  723,  723,  723,
+      723,  723,  723,  723,  723,  723,  514,  513,  508,  723,
+      507,  506,  505,  504,  503,  723,  723,  723,  723,  723,
+      723,  725,  725,  725,  725,  725,  725,  725,  725,  725,
+      502,  501,  500,  725,  499,  725,  498,  496,  493,  725,
+      725,  725,  725,  725,  725,  881,  881,  881,  881,  881,
 
-      736,  736,  736,  737,  737,  737,  737,  737,  737,  737,
-      739,  739,  739,  739,  739,  739,  743,  743,  743,  743,
-      743,  743,  744,  744,  744,  744,  744,  744,  744,  744,
-      346,  343,  342,  744,  340,  338,  337,  336,  333,  744,
-      744,  744,  744,  744,  744,  745,  745,  745,  745,  745,
-      745,  745,  332,  330,  329,  745,  328,  326,  325,  324,
-      317,  745,  745,  745,  745,  745,  745,  746,  746,  746,
-      746,  746,  746,  746,  748,  748,  748,  748,  748,  748,
-      750,  750,  750,  750,  750,  750,  754,  754,  754,  754,
-      754,  754,  755,  755,  755,  755,  755,  755,  755,  755,
+      881,  881,  885,  885,  885,  885,  885,  885,  885,  955,
+      956,  725,  747,  966,  747,  747,  747,  747,  747,  747,
+      747,  492,  491,  955,  956,  747,  490,  966,  489,  488,
+      747,  747,  747,  747,  747,  747,  747,  749,  749,  749,
+      749,  749,  749,  749,  487,  485,  484,  483,  749,  955,
+      956,  482,  480,  966,  749,  749,  749,  749,  749,  749,
+      751,  751,  751,  751,  751,  751,  751,  478,  477,  476,
+      475,  751,  474, 1362,  473,  472,  470,  751,  751,  751,
+      751,  751,  751,  753,  753,  753,  753,  753,  753,  753,
+      753, 1362,  469,  468,  465,  753,  461,  457,  456,  455,
 
-      310,  309,  307,  755,  306,  305,  300,  298,  293,  755,
-      755,  755,  755,  755,  755,  756,  756,  756,  756,  756,
-      756,  756,  291,  289,  288,  756,  287,  286,  285,  284,
-      283,  756,  756,  756,  756,  756,  756,  757,  757,  757,
-      757,  757,  757,  757,  760,  760,  760,  760,  760,  760,
-      762,  762,  762,  762,  762,  762,  766,  766,  766,  766,
-      766,  766,  767,  767,  767,  767,  767,  767,  767,  767,
-      281,  280,  279,  767,  274,  271,  270,  269,  266,  767,
-      767,  767,  767,  767,  767,  768,  768,  768,  768,  768,
-      768,  768,  263,  262,  260,  768,  258,  257,  255,  252,
+     1362,  753,  753,  753,  753,  753,  753,  754,  754,  754,
+      754,  754,  754,  754,  754,  757,  757,  757,  757,  757,
+      757,  757,  757,  757,  452,  448,  447,  757,  444,  757,
+      443,  442,  441,  757,  757,  757,  757,  757,  757,  892,
+      892,  892,  892,  892,  892,  892,  964,  964,  964,  964,
+      964,  964,  964,  967,  438,  757,  760,  760,  760,  760,
+      760,  760,  760,  760,  760,  437,  970,  967,  760,  428,
+      760,  425,  971,  982,  760,  760,  760,  760,  760,  760,
+      970,  423,  422,  421,  420,  419,  971,  982,  418,  417,
+      416,  415, 1361,  967,  983,  414,  760,  763,  763,  763,
 
-      251,  768,  768,  768,  768,  768,  768,  769,  769,  769,
-      769,  769,  769,  769,  773,  773,  773,  773,  773,  773,
-      776,  776,  776,  776,  776,  776,  776,  778,  778,  778,
-      778,  778,  778,  778,  780,  780,  780,  780,  780,  780,
-      780,  781,  781,  781,  781,  781,  781,  781,  781,  250,
-      243,  242,  781,  239,  238,  237,  236,  232,  781,  781,
-      781,  781,  781,  781,  782,  782,  782,  782,  782,  782,
-      782,  783,  783,  783,  783,  783,  783,  783,  783,  231,
-      229,  225,  783,  223,  783,  219,  217,  215,  783,  783,
-      783,  783,  783,  783,  819,  819,  819,  819,  819,  819,
+      763,  763,  763,  763,  763,  763,  970,  413,  983,  763,
+     1361,  763,  971,  982,  986,  763,  763,  763,  763,  763,
+      763,  980,  980,  980,  980,  980,  980,  980,  986, 1361,
+      412,  410,  408,  987,  983, 1093,  407,  763,  769,  769,
+      769,  769,  769,  769,  769,  769,  769,  987,  405, 1093,
+      769,  404,  769,  401,  986, 1094,  769,  769,  769,  769,
+      769,  769,  995,  995,  995,  995,  995,  995,  995, 1094,
+      400,  398,  396,  987, 1097, 1093, 1098,  395,  769,  774,
+      774,  774,  774,  774,  774,  774,  774,  774, 1097,  394,
+     1098,  774,  389,  388,  386, 1094,  385,  774,  774,  774,
 
-      819,  821,  821,  821,  821,  821,  821,  821,  214,  212,
-      783,  800,  800,  800,  800,  800,  800,  800,  800,  211,
-      210,  209,  800,  208,  800,  207,  206,  204,  800,  800,
-      800,  800,  800,  800,  827,  827,  827,  827,  827,  827,
-      827,  829,  829,  829,  829,  829,  829,  829,  202,  200,
-      800,  803,  803,  803,  803,  803,  803,  803,  803,  199,
-      197,  195,  803,  194,  803,  192,  189,  188,  803,  803,
-      803,  803,  803,  803,  831,  831,  831,  831,  831,  831,
-      831,  833,  833,  833,  833,  833,  833,  833,  861,  187,
-      803,  806,  806,  806,  806,  806,  806,  806,  806,  185,
+      774,  774,  774,  776,  776,  776,  776,  776,  776,  776,
+      776,  776,  384,  383, 1097,  776, 1098,  776,  381,  376,
+      375,  776,  776,  776,  776,  776,  776,  997,  997,  997,
+      997,  997,  997,  997, 1001, 1001, 1001, 1001, 1001, 1001,
+     1001, 1140,  374,  776,  786,  786,  786,  786,  786,  786,
+      786,  786,  786,  371,  367, 1140,  786,  365,  360,  359,
+      356, 1013,  786,  786,  786,  786,  786,  786,  788,  788,
+      788,  788,  788,  788,  788,  788,  788, 1006, 1007, 1013,
+      788, 1140,  788,  351,  350,  342,  788,  788,  788,  788,
+      788,  788,  340, 1013,  339, 1006, 1007, 1040, 1040, 1040,
 
-      183,  861,  806,  182,  806,  179,  178,  176,  806,  806,
-      806,  806,  806,  806,  839,  839,  839,  839,  839,  839,
-      842,  842,  842,  842,  842,  842,  842,  861,  175,  174,
-      806,  809,  809,  809,  809,  809,  809,  809,  809,  173,
-      172,  171,  809,  170,  809,  169,  167,  165,  809,  809,
-      809,  809,  809,  809,  844,  844,  844,  844,  844,  844,
-      844,  846,  846,  846,  846,  846,  846,  846,  164,  965,
-      809,  814,  814,  814,  814,  814,  814,  814,  160,  159,
-      158,  814,  965,  157,  156,  154,  151,  814,  814,  814,
-      814,  814,  814,  815,  815,  815,  815,  815,  815,  815,
+     1040, 1040, 1040, 1040, 1141,  334, 1006, 1007,  788,  801,
+      801,  801,  801,  801,  801,  801,  801,  801, 1141,  332,
+      330,  801,  329,  328,  327,  326,  325,  801,  801,  801,
+      801,  801,  801,  803,  803,  803,  803,  803,  803,  803,
+      803,  803, 1008, 1146, 1141,  803,  324,  803,  322,  321,
+     1408,  803,  803,  803,  803,  803,  803, 1146,  320,  315,
+     1008, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1408,  312,
+     1147, 1008,  311,  803,  815,  815,  815,  815,  815,  815,
+      815,  815,  815, 1146, 1147,  310,  815, 1408,  307,  300,
+      299, 1150,  815,  815,  815,  815,  815,  815,  816,  816,
 
-      815,  150,  149,  146,  815,  144,  815,  137,  965,  136,
-      815,  815,  815,  815,  815,  815,  848,  848,  848,  848,
-      848,  848,  848,  855,  855,  855,  855,  855,  855,  969,
-      135,  134,  815,  820,  820,  820,  820,  820,  820,  820,
-      820,  133,  969,  132,  820,  130,  129,  128,  126,  124,
-      820,  820,  820,  820,  820,  820,  822,  822,  822,  822,
-      822,  822,  822,  822,  122,  121,  120,  822,  969,  822,
-      119,  117,  116,  822,  822,  822,  822,  822,  822,  858,
-      858,  858,  858,  858,  858,  858,  860,  860,  860,  860,
-      860,  860,  860,  115,  114,  822,  832,  832,  832,  832,
+      816,  816,  816,  816,  816, 1150,  297,  296,  294,  816,
+     1147,  292,  291,  290,  288,  816,  816,  816,  816,  816,
+      816,  832, 1151,  832,  832,  832,  832,  832,  832,  832,
+      284, 1150,  283,  281,  832,  278, 1151,  274,  273,  832,
+      832,  832,  832,  832,  832,  832,  833,  833,  833,  833,
+      833,  833,  833,  270,  269,  267,  262,  833,  259,  257,
+      256,  254, 1151,  833,  833,  833,  833,  833,  833,  834,
+      834,  834,  834,  834,  834,  834,  834,  251,  247,  243,
+      241,  834,  239,  834,  238,  236,  235,  834,  834,  834,
+      834,  834,  834, 1049, 1049, 1049, 1049, 1049, 1049, 1049,
 
-      832,  832,  832,  832,  113,  112,  110,  832,  108,  107,
-      106,  105,  104,  832,  832,  832,  832,  832,  832,  834,
-      834,  834,  834,  834,  834,  834,  834,  103,  102,  101,
-      834,  100,  834,   98,   97,   90,  834,  834,  834,  834,
-      834,  834,  862,  862,  862,  862,  862,  862,  862,  864,
-      864,  864,  864,  864,  864,  864,   89,   88,  834,  847,
-      847,  847,  847,  847,  847,  847,  847,   86,   85,   84,
-      847,   83,   82,   81,   79,   77,  847,  847,  847,  847,
-      847,  847,  849,  849,  849,  849,  849,  849,  849,  849,
-       76,   74,   73,  849,   72,  849,   71,   70,   68,  849,
+     1054, 1054, 1054, 1054, 1054, 1054, 1054,  234, 1159,  834,
+      836,  836,  836,  836,  836,  836,  836,  233,  232,  231,
+      230,  836, 1159,  228,  226,  224,  223,  836,  836,  836,
+      836,  836,  836,  837,  837,  837,  837,  837,  837,  837,
+      837,  221,  219,  218,  216,  837,  213,  212, 1159,  211,
+      209,  837,  837,  837,  837,  837,  837,  838,  838,  838,
+      838,  838,  838,  838,  838,  840,  840,  840,  840,  840,
+      840,  840,  207,  206,  203,  202,  840,  200,  199,  198,
+      197,  196,  840,  840,  840,  840,  840,  840,  841,  841,
+      841,  841,  841,  841,  841,  841,  841,  195,  194,  193,
 
-      849,  849,  849,  849,  849,  870,  870,  870,  870,  870,
-      870,  872,  872,  872,  872,  872,  872,   67, 1011,   66,
-       51,  849,  863,  863,  863,  863,  863,  863,  863,  863,
-       43, 1011,   42,  863,   40,   30,   18,   10,    8,  863,
-      863,  863,  863,  863,  863,  865,  865,  865,  865,  865,
-      865,  865,  865,    3,    0,    0,  865, 1011,  865,    0,
-        0,    0,  865,  865,  865,  865,  865,  865,  876,  876,
-      876,  876,  876,  876,  879,  879,  879,  879,  879,  879,
-      879, 1017, 1021,    0,  865,  877,  877,  877,  877,  877,
-      877,  877,  877,    0, 1017, 1021,  877,    0,    0,  885,
+      841,  192,  191,  190,  189, 1160,  841,  841,  841,  841,
+      841,  841,  842,  842,  842,  842,  842,  842,  842, 1160,
+      188,  187,  186,  842,  185,  184,  182,  181,  178,  842,
+      842,  842,  842,  842,  842,  844,  844,  844,  844,  844,
+      844,  844,  844,  844,  177, 1160,  176,  844,  175,  174,
+      173,  172, 1163,  844,  844,  844,  844,  844,  844,  845,
+      845,  845,  845,  845,  845,  845, 1163,  171,  169,  166,
+      845,  165,  164,  163,  160,  158,  845,  845,  845,  845,
+      845,  845,  847,  847,  847,  847,  847,  847,  847,  847,
+      847,  149, 1163,  148,  847,  147,  146,  145,  144, 1164,
 
-        0,    0,  877,  877,  877,  877,  877,  877,  878,  878,
-      878,  878,  878,  878,  882,  883,  885,  888,  878,    0,
-     1017, 1021,    0,    0,  878,  878,  878,  878,  878,  878,
-      885,  882,  883,    0,  888,  897,  897,  897,  897,  897,
-      897,  897,  882,  883, 1030, 1034,    0,  986,  888,  894,
-      894,  894,  894,  894,  894,    0,    0, 1030, 1034,  894,
-        0,    0,    0,    0,  986,  894,  894,  894,  894,  894,
-      894,  895,  895,  895,  895,  895,  895,  895,  895,  986,
-        0,    0,  895, 1030, 1034,    0,    0, 1044,  895,  895,
-      895,  895,  895,  895,  896,  896,  896,  896,  896,  896,
+      847,  847,  847,  847,  847,  847,  848,  848,  848,  848,
+      848,  848,  848, 1164,  143,  141,  139,  848,  138,  136,
+      134,  132,  131,  848,  848,  848,  848,  848,  848,  852,
+      852,  852,  852,  852,  852,  852,  852,  130,  129, 1164,
+      852,  127,  126,  125,  124,  123,  852,  852,  852,  852,
+      852,  852,  854,  854,  854,  854,  854,  854,  854,  854,
+      854,  122,  120,  118,  854,  117,  116,  115,  114,  113,
+      854,  854,  854,  854,  854,  854,  855,  855,  855,  855,
+      855,  855,  855,  855,  112,  111,  110,  855,  108,  107,
+      100,   99,   98,  855,  855,  855,  855,  855,  855,  863,
 
-     1044,    0,    0,    0,  896,    0,    0,    0,    0,    0,
-      896,  896,  896,  896,  896,  896,  898,  898,  898,  898,
-      898,  898,  898,  898,    0,    0, 1044,  898,    0,    0,
-        0,    0,    0,  898,  898,  898,  898,  898,  898,  899,
-      899,  899,  899,  899,  899,    0,    0,    0,    0,  899,
-        0,    0,    0,    0,    0,  899,  899,  899,  899,  899,
-      899,  900,  900,  900,  900,  900,  900,  900,  901,  901,
-      901,  901,  901,  901,  901,  901,    0,    0,    0,  901,
-        0,    0,    0,    0,    0,  901,  901,  901,  901,  901,
-      901,  902,  902,  902,  902,  902,  902,    0,    0,    0,
+      863,  863,  863,  863,  863,  863,  863,  863,   96,   95,
+       92,  863,   91,   90,   89,   88,   87,  863,  863,  863,
+      863,  863,  863,  864,  864,  864,  864,  864,  864,  864,
+      864,   86,   85,   84,  864,   82,   81,   80,   79,   78,
+      864,  864,  864,  864,  864,  864,  874,  874,  874,  874,
+      874,  874,  874,  874,  874,   77,   76,   75,  874,   74,
+       73,   72,   71,   70,  874,  874,  874,  874,  874,  874,
+      875,  875,  875,  875,  875,  875,  875,  875,   69,   67,
+       66,  875,   65,   51,   43,   42,   40,  875,  875,  875,
+      875,  875,  875,  886,  886,  886,  886,  886,  886,  886,
 
-        0,  902,    0,    0,    0,    0,    0,  902,  902,  902,
-      902,  902,  902,  903,  903,  903,  903,  903,  903,  903,
-      904,  904,  904,  904,  904,  904,  904,  904,    0,    0,
-        0,  904,    0,    0,    0,    0,    0,  904,  904,  904,
-      904,  904,  904,  905,  905,  905,  905,  905,  905,    0,
-        0,    0,    0,  905,    0,    0,    0,    0,    0,  905,
-      905,  905,  905,  905,  905,  906,  906,  906,  906,  906,
-      906,  906,  908,  908,  908,  908,  908,  908,  908,  908,
-        0,    0,    0,  908,    0,  908,    0,    0,    0,  908,
-      908,  908,  908,  908,  908,  912,  912,  912,  912,  912,
+      886,  886,   18,   10,    8,  886,    3,    0,    0,    0,
+        0,  886,  886,  886,  886,  886,  886,  887,  887,  887,
+      887,  887,  887,  887,  887,    0,    0,    0,  887,    0,
+        0,    0,    0,    0,  887,  887,  887,  887,  887,  887,
+      900,  900,  900,  900,  900,  900,  900,  900,  900,    0,
+        0,    0,  900,    0,    0,    0,    0,    0,  900,  900,
+      900,  900,  900,  900,  902,  902,  902,  902,  902,  902,
+      902,  902,  902,    0,    0,    0,  902,    0,  902,    0,
+        0,    0,  902,  902,  902,  902,  902,  902, 1056, 1056,
+     1056, 1056, 1056, 1056, 1056, 1060, 1060, 1060, 1060, 1060,
 
-      912,  915,  915,  915,  915,  915,  915,  915,    0,    0,
-        0,  908,  913,  913,  913,  913,  913,  913,  913,  913,
-        0,    0,    0,  913,    0,    0,    0,    0,    0,  913,
-      913,  913,  913,  913,  913,  917,  917,  917,  917,  917,
-      917,  921,  921,  921,  921,  921,  921,  922,  922,  922,
-      922,  922,  922,  922,  922,    0,    0,    0,  922,    0,
-        0,    0,    0,    0,  922,  922,  922,  922,  922,  922,
-      924,  924,  924,  924,  924,  924,  924,  926,  926,  926,
-      926,  926,  926,  928,  928,  928,  928,  928,  928,  932,
-      932,  932,  932,  932,  932,  933,  933,  933,  933,  933,
+     1060, 1060,    0,    0,  902,  919,  919,  919,  919,  919,
+      919,  919,  919,  919,    0,    0,    0,    0,  919,    0,
+        0,    0,    0,  919,  919,  919,  919,  919,  919,  919,
+      920,  920,  920,  920,  920,  920,  920,  920,  921,  921,
+      921,  921,  921,  921,  921,  921,  921, 1066, 1066, 1066,
+     1066, 1066, 1066, 1066,    0,    0,  921,  925,  925,  925,
+      925,  925,  925,  925,  925,  925,    0,    0,    0,  925,
+        0,  925,    0,    0,    0,  925,  925,  925,  925,  925,
+      925, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1072, 1072,
+     1072, 1072, 1072, 1072, 1072,    0,    0,  925,  928,  928,
 
-      933,  933,  933,    0,    0,    0,  933,    0,    0,    0,
-        0,    0,  933,  933,  933,  933,  933,  933,  935,  935,
-      935,  935,  935,  935,  935,  938,  938,  938,  938,  938,
-      938,  940,  940,  940,  940,  940,  940,  944,  944,  944,
-      944,  944,  944,  945,  945,  945,  945,  945,  945,  945,
-      945,    0,    0,    0,  945,    0,    0,    0,    0,    0,
-      945,  945,  945,  945,  945,  945,  947,  947,  947,  947,
-      947,  947,  947,  950,  950,  950,  950,  950,  950,  952,
-      952,  952,  952,  952,  952,  956,  956,  956,  956,  956,
-      956,  957,  957,  957,  957,  957,  957,  957,  957,    0,
+      928,  928,  928,  928,  928,  928,  928,    0,    0,    0,
+      928,    0,  928,    0,    0,    0,  928,  928,  928,  928,
+      928,  928, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1080,
+     1080, 1080, 1080, 1080, 1080, 1080,    0,    0,  928,  931,
+      931,  931,  931,  931,  931,  931,  931,  931,    0,    0,
+        0,  931,    0,  931,    0,    0,    0,  931,  931,  931,
+      931,  931,  931, 1084, 1084, 1084, 1084, 1084, 1084, 1084,
+     1091, 1091, 1091, 1091, 1091, 1091, 1091, 1111,    0,  931,
+      934,  934,  934,  934,  934,  934,  934,  934,  934,    0,
+     1173, 1174,  934,    0,  934, 1111,    0,    0,  934,  934,
 
-        0,    0,  957,    0,    0,    0,    0,    0,  957,  957,
+      934,  934,  934,  934, 1173, 1174, 1111, 1134, 1134, 1134,
+     1134, 1134, 1134, 1134,    0, 1177,    0,    0,    0, 1178,
+      934,  939,  939,  939,  939,  939,  939,  939,  939, 1177,
+     1173, 1174,  939, 1178,    0,    0,    0,    0,  939,  939,
+      939,  939,  939,  939,  940,  940,  940,  940,  940,  940,
+      940,  940,  940,    0,    0, 1177,  940,    0,  940, 1178,
+        0,    0,  940,  940,  940,  940,  940,  940, 1157, 1157,
+     1157, 1157, 1157, 1157, 1157, 1171, 1171, 1171, 1171, 1171,
+     1171, 1171, 1187,    0,  940,  945,  945,  945,  945,  945,
+      945,  945,  945,  945,    0,    0, 1187,  945,    0,    0,
+
+        0,    0,    0,  945,  945,  945,  945,  945,  945,  947,
+      947,  947,  947,  947,  947,  947,  947,  947,    0,    0,
+        0,  947, 1187,  947,    0,    0, 1188,  947,  947,  947,
+      947,  947,  947, 1185, 1185, 1185, 1185, 1185, 1185, 1185,
+     1188,    0,    0,    0,    0, 1191,    0, 1192,    0,  947,
+      957,  957,  957,  957,  957,  957,  957,  957,  957, 1191,
+        0, 1192,  957,    0,    0,    0, 1188,    0,  957,  957,
       957,  957,  957,  957,  959,  959,  959,  959,  959,  959,
-      959,  963,  963,  963,  963,  963,  963,  966,  966,  966,
-      966,  966,  966,  966,  968,  968,  968,  968,  968,  968,
-      968,  970,  970,  970,  970,  970,  970,  970,  971,  971,
-      971,  971,  971,  971,  971,  971,    0,    0,    0,  971,
-        0,    0,    0,    0,    0,  971,  971,  971,  971,  971,
-      971,  972,  972,  972,  972,  972,  972,  972,  973,  973,
-      973,  973,  973,  973,  973,  973,  983,    0, 1048,  973,
-        0,  973,    0,    0,    0,  973,  973,  973,  973,  973,
+      959,  959,  959,    0,    0, 1191,  959, 1192,  959,    0,
+        0,    0,  959,  959,  959,  959,  959,  959, 1198, 1198,
 
-      973, 1048,    0,  983, 1005, 1005, 1005, 1005, 1005, 1005,
-        0,    0,    0, 1058,  983,    0, 1062,  973,  988,  988,
-      988,  988,  988,  988,  988,    0, 1058, 1048,  988, 1062,
-        0,    0,    0,    0,  988,  988,  988,  988,  988,  988,
-      989,  989,  989,  989,  989,  989,  989,  989,    0,    0,
-        0,  989, 1058,  989,    0, 1062,    0,  989,  989,  989,
-      989,  989,  989, 1008, 1008, 1008, 1008, 1008, 1008, 1008,
-     1012, 1012, 1012, 1012, 1012, 1012, 1012,    0,    0,  989,
-      992,  992,  992,  992,  992,  992,  992,  992,    0,    0,
-        0,  992,    0,  992,    0,    0,    0,  992,  992,  992,
+     1198, 1198, 1198, 1198, 1198, 1200, 1200, 1200, 1200, 1200,
+     1200, 1200, 1236,    0,  959,  972,  972,  972,  972,  972,
+      972,  972,  972,  972,    0,    0, 1236,  972,    0,    0,
+        0,    0,    0,  972,  972,  972,  972,  972,  972,  974,
+      974,  974,  974,  974,  974,  974,  974,  974,    0,    0,
+        0,  974, 1236,  974,    0,    0, 1237,  974,  974,  974,
+      974,  974,  974, 1204, 1204, 1204, 1204, 1204, 1204, 1204,
+     1237, 1244, 1244, 1244, 1244, 1244, 1244, 1244,    0,  974,
+      988,  988,  988,  988,  988,  988,  988,  988,  988,    0,
+        0,    0,  988,    0,    0,    0, 1237, 1215,  988,  988,
 
-      992,  992,  992, 1014, 1014, 1014, 1014, 1014, 1014, 1014,
-     1018, 1018, 1018, 1018, 1018, 1018, 1018,    0,    0,  992,
-      995,  995,  995,  995,  995,  995,  995,  995,    0,    0,
-        0,  995,    0,  995,    0,    0,    0,  995,  995,  995,
-      995,  995,  995, 1020, 1020, 1020, 1020, 1020, 1020, 1020,
-     1022, 1022, 1022, 1022, 1022, 1022, 1022, 1107,    0,  995,
-      998,  998,  998,  998,  998,  998,  998,  998,    0,    0,
-     1107,  998,    0,  998,    0,    0,    0,  998,  998,  998,
-      998,  998,  998, 1024, 1024, 1024, 1024, 1024, 1024, 1024,
-     1028, 1028, 1028, 1028, 1028, 1028, 1107,    0,    0,  998,
+      988,  988,  988,  988,  990,  990,  990,  990,  990,  990,
+      990,  990,  990, 1216,    0, 1215,  990,    0,  990,    0,
+        0,    0,  990,  990,  990,  990,  990,  990, 1215,    0,
+        0, 1216, 1249, 1249, 1249, 1249, 1249, 1249, 1249,    0,
+        0, 1284, 1216,    0,  990, 1002, 1002, 1002, 1002, 1002,
+     1002, 1002, 1002, 1002,    0, 1284,    0, 1002,    0,    0,
+        0,    0, 1285, 1002, 1002, 1002, 1002, 1002, 1002, 1003,
+     1003, 1003, 1003, 1003, 1003, 1003, 1285,    0,    0,    0,
+     1003, 1284,    0,    0,    0,    0, 1003, 1003, 1003, 1003,
+     1003, 1003, 1018, 1018, 1018, 1018, 1018, 1018, 1018, 1018,
 
-     1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001,    0,    0,
-        0, 1001,    0, 1001,    0,    0,    0, 1001, 1001, 1001,
-     1001, 1001, 1001, 1031, 1031, 1031, 1031, 1031, 1031, 1031,
-     1033, 1033, 1033, 1033, 1033, 1033, 1033, 1155,    0, 1001,
-     1006, 1006, 1006, 1006, 1006, 1006, 1006, 1006,    0,    0,
-     1155, 1006,    0,    0,    0,    0,    0, 1006, 1006, 1006,
-     1006, 1006, 1006, 1013, 1013, 1013, 1013, 1013, 1013, 1013,
-     1013,    0,    0,    0, 1013,    0, 1155,    0,    0,    0,
-     1013, 1013, 1013, 1013, 1013, 1013, 1023, 1023, 1023, 1023,
-     1023, 1023, 1023, 1023,    0,    0,    0, 1023,    0,    0,
+     1018,    0, 1285,    0,    0, 1018,    0,    0,    0,    0,
+     1018, 1018, 1018, 1018, 1018, 1018, 1018, 1019, 1019, 1019,
+     1019, 1019, 1019, 1019, 1019, 1020, 1020, 1020, 1020, 1020,
+     1020, 1020, 1020, 1020, 1251, 1251, 1251, 1251, 1251, 1251,
+     1251,    0, 1288, 1020, 1022, 1022, 1022, 1022, 1022, 1022,
+     1022,    0,    0,    0,    0, 1022, 1288,    0,    0,    0,
+        0, 1022, 1022, 1022, 1022, 1022, 1022, 1023, 1023, 1023,
+     1023, 1023, 1023, 1023, 1023, 1023,    0,    0,    0, 1023,
+        0,    0, 1288,    0, 1289, 1023, 1023, 1023, 1023, 1023,
+     1023, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1289,    0,
 
-        0,    0,    0, 1023, 1023, 1023, 1023, 1023, 1023, 1035,
-     1035, 1035, 1035, 1035, 1035, 1035, 1036, 1036, 1036, 1036,
-     1036, 1036, 1036, 1036,    0,    0,    0, 1036,    0,    0,
-        0,    0,    0, 1036, 1036, 1036, 1036, 1036, 1036, 1037,
-     1037, 1037, 1037, 1037, 1037, 1037, 1042, 1042, 1042, 1042,
-     1042, 1042, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1047,
-     1047, 1047, 1047, 1047, 1047, 1047, 1049, 1049, 1049, 1049,
-     1049, 1049, 1049, 1050, 1050, 1050, 1050, 1050, 1050, 1050,
-     1050,    0,    0,    0, 1050,    0,    0,    0,    0,    0,
-     1050, 1050, 1050, 1050, 1050, 1050, 1051, 1051, 1051, 1051,
+        0,    0, 1024,    0,    0,    0,    0,    0, 1024, 1024,
+     1024, 1024, 1024, 1024, 1026, 1026, 1026, 1026, 1026, 1026,
+     1026, 1026, 1026,    0, 1289,    0, 1026,    0,    0,    0,
+        0, 1313, 1026, 1026, 1026, 1026, 1026, 1026, 1027, 1027,
+     1027, 1027, 1027, 1027, 1027, 1313,    0,    0,    0, 1027,
+        0,    0,    0,    0,    0, 1027, 1027, 1027, 1027, 1027,
+     1027, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029,
+        0, 1313,    0, 1029,    0,    0,    0,    0, 1314, 1029,
+     1029, 1029, 1029, 1029, 1029, 1030, 1030, 1030, 1030, 1030,
+     1030, 1030, 1314,    0,    0,    0, 1030,    0,    0,    0,
 
-     1051, 1051, 1051, 1056, 1056, 1056, 1056, 1056, 1056, 1059,
-     1059, 1059, 1059, 1059, 1059, 1059, 1061, 1061, 1061, 1061,
-     1061, 1061, 1061, 1063, 1063, 1063, 1063, 1063, 1063, 1063,
-     1064, 1064, 1064, 1064, 1064, 1064, 1064, 1064,    0,    0,
-        0, 1064,    0,    0,    0,    0,    0, 1064, 1064, 1064,
-     1064, 1064, 1064, 1065, 1065, 1065, 1065, 1065, 1065, 1065,
-     1069, 1069, 1069, 1069, 1069, 1069, 1071, 1071, 1071, 1071,
-     1071, 1071, 1075, 1075, 1075, 1075, 1075, 1075, 1076, 1076,
-     1076, 1076, 1076, 1076, 1076, 1076,    0,    0,    0, 1076,
-        0, 1086, 1087,    0,    0, 1076, 1076, 1076, 1076, 1076,
+        0,    0, 1030, 1030, 1030, 1030, 1030, 1030, 1032, 1032,
+     1032, 1032, 1032, 1032, 1032, 1032, 1032,    0, 1314,    0,
+     1032,    0,    0,    0,    0, 1321, 1032, 1032, 1032, 1032,
+     1032, 1032, 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1321,
+        0,    0,    0, 1033,    0,    0,    0,    0,    0, 1033,
+     1033, 1033, 1033, 1033, 1033, 1036, 1036, 1036, 1036, 1036,
+     1036, 1036, 1036, 1036,    0, 1321,    0, 1036,    0, 1036,
+        0,    0,    0, 1036, 1036, 1036, 1036, 1036, 1036, 1257,
+     1257, 1257, 1257, 1257, 1257, 1257, 1259, 1259, 1259, 1259,
+     1259, 1259, 1259, 1322,    0, 1036, 1041, 1041, 1041, 1041,
 
-     1076, 1078, 1078, 1078, 1078, 1078, 1078, 1078, 1086, 1087,
-     1094, 1094, 1094, 1094, 1094, 1094, 1094,    0,    0,    0,
-     1087, 1086, 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088,
-        0,    0,    0, 1088,    0, 1088,    0,    0,    0, 1088,
-     1088, 1088, 1088, 1088, 1088, 1097, 1097, 1097, 1097, 1097,
-     1097, 1097, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1159,
-        0, 1088, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092,
-        0,    0, 1159, 1092,    0,    0,    0,    0,    0, 1092,
-     1092, 1092, 1092, 1092, 1092, 1095, 1095, 1095, 1095, 1095,
-     1095, 1095, 1095,    0,    0,    0, 1095,    0, 1159,    0,
+     1041, 1041, 1041, 1041, 1041,    0,    0, 1322, 1041,    0,
+        0,    0,    0,    0, 1041, 1041, 1041, 1041, 1041, 1041,
+     1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050,    0,
+        0,    0, 1050, 1322,    0,    0,    0,    0, 1050, 1050,
+     1050, 1050, 1050, 1050, 1061, 1061, 1061, 1061, 1061, 1061,
+     1061, 1061, 1061,    0,    0,    0, 1061,    0,    0,    0,
+        0,    0, 1061, 1061, 1061, 1061, 1061, 1061, 1073, 1073,
+     1073, 1073, 1073, 1073, 1073, 1073, 1073,    0,    0,    0,
+     1073,    0,    0,    0,    0,    0, 1073, 1073, 1073, 1073,
+     1073, 1073, 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1085,
 
-        0,    0, 1095, 1095, 1095, 1095, 1095, 1095, 1098, 1098,
-     1098, 1098, 1098, 1098, 1098, 1098,    0,    0,    0, 1098,
-        0,    0,    0,    0,    0, 1098, 1098, 1098, 1098, 1098,
-     1098, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101,    0,
-        0,    0, 1101,    0,    0,    0,    0,    0, 1101, 1101,
-     1101, 1101, 1101, 1101, 1103, 1103, 1103, 1103, 1103, 1103,
-     1103, 1104, 1104, 1104, 1104, 1104, 1104, 1104, 1104,    0,
-        0,    0, 1104,    0,    0,    0,    0,    0, 1104, 1104,
-     1104, 1104, 1104, 1104, 1106, 1106, 1106, 1106, 1106, 1106,
-     1106, 1108, 1108, 1108, 1108, 1108, 1108, 1108, 1109, 1109,
+     1085,    0,    0,    0, 1085,    0,    0,    0,    0,    0,
+     1085, 1085, 1085, 1085, 1085, 1085, 1099, 1099, 1099, 1099,
+     1099, 1099, 1099, 1099, 1099,    0,    0,    0, 1099,    0,
+        0,    0,    0,    0, 1099, 1099, 1099, 1099, 1099, 1099,
+     1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101,    0,
+        0,    0, 1101,    0, 1101,    0,    0,    0, 1101, 1101,
+     1101, 1101, 1101, 1101, 1265, 1265, 1265, 1265, 1265, 1265,
+     1265, 1267, 1267, 1267, 1267, 1267, 1267, 1267,    0,    0,
+     1101, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115,
+     1273, 1273, 1273, 1273, 1273, 1273, 1273,    0, 1330, 1115,
 
-     1109, 1109, 1109, 1109, 1109, 1109,    0,    0,    0, 1109,
-        0,    0,    0,    0,    0, 1109, 1109, 1109, 1109, 1109,
-     1109, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1115, 1115,
-     1115, 1115, 1115, 1115, 1120, 1120, 1120, 1120, 1120, 1120,
-     1122, 1122, 1122, 1122, 1122, 1122, 1128, 1128, 1128, 1128,
-     1128, 1128, 1130, 1130, 1130, 1130, 1130, 1130, 1136, 1136,
-     1136, 1136, 1136, 1136, 1138, 1138, 1138, 1138, 1138, 1138,
-     1144, 1144, 1144, 1144, 1144, 1144, 1146, 1146, 1146, 1146,
-     1146, 1146, 1153, 1153, 1153, 1153, 1153, 1153, 1156, 1156,
-     1156, 1156, 1156, 1156, 1156, 1158, 1158, 1158, 1158, 1158,
+     1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117,    0,    0,
+        0, 1117, 1330,    0,    0,    0,    0, 1117, 1117, 1117,
+     1117, 1117, 1117, 1118, 1118, 1118, 1118, 1118, 1118, 1118,
+     1118, 1118,    0,    0,    0, 1118,    0, 1118, 1330,    0,
+        0, 1118, 1118, 1118, 1118, 1118, 1118, 1275, 1275, 1275,
+     1275, 1275, 1275, 1275, 1282, 1282, 1282, 1282, 1282, 1282,
+     1282,    0,    0, 1118, 1121, 1121, 1121, 1121, 1121, 1121,
+     1121, 1121, 1121,    0,    0,    0, 1121,    0, 1121,    0,
+        0,    0, 1121, 1121, 1121, 1121, 1121, 1121, 1307, 1307,
+     1307, 1307, 1307, 1307, 1307, 1319, 1319, 1319, 1319, 1319,
 
-     1158, 1158, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1161,
-     1161, 1161, 1161, 1161, 1161, 1161, 1161,    0,    0,    0,
-     1161,    0,    0,    0,    0,    0, 1161, 1161, 1161, 1161,
-     1161, 1161, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1169,
-     1169, 1169, 1169, 1169, 1169, 1169, 1169,    0,    0,    0,
-     1169,    0,    0,    0,    0,    0, 1169, 1169, 1169, 1169,
-     1169, 1169, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1178,
-     1178, 1178, 1178, 1178, 1178, 1184, 1185, 1185, 1185, 1185,
-     1185, 1185, 1185,    0,    0,    0,    0,    0, 1184, 1187,
-     1187, 1187, 1187, 1187, 1187, 1187, 1190, 1190, 1190, 1190,
+     1319, 1319, 1331,    0, 1121, 1124, 1124, 1124, 1124, 1124,
+     1124, 1124, 1124, 1124,    0,    0, 1331, 1124,    0, 1124,
+        0,    0, 1339, 1124, 1124, 1124, 1124, 1124, 1124, 1328,
+     1328, 1328, 1328, 1328, 1328, 1328, 1339,    0,    0,    0,
+        0, 1340, 1331, 1348,    0, 1124, 1127, 1127, 1127, 1127,
+     1127, 1127, 1127, 1127, 1127, 1340,    0, 1348, 1127,    0,
+     1127,    0, 1339, 1349, 1127, 1127, 1127, 1127, 1127, 1127,
+     1337, 1337, 1337, 1337, 1337, 1337, 1337, 1349,    0,    0,
+        0, 1340,    0, 1348,    0,    0, 1127, 1130, 1130, 1130,
+     1130, 1130, 1130, 1130, 1130, 1130,    0,    0,    0, 1130,
 
-     1190, 1190, 1192, 1193, 1193, 1193, 1193, 1193, 1193, 1193,
-        0,    0,    0,    0, 1184, 1192, 1195, 1195, 1195, 1195,
-     1195, 1195, 1195, 1199, 1199, 1199, 1199, 1199, 1199, 1201,
-     1202, 1202, 1202, 1202, 1202, 1202, 1202,    0,    0,    0,
-        0, 1192, 1201, 1204, 1204, 1204, 1204, 1204, 1204, 1204,
-     1208, 1208, 1208, 1208, 1208, 1208, 1210, 1211, 1211, 1211,
-     1211, 1211, 1211, 1211,    0,    0,    0,    0, 1201, 1210,
-     1213, 1213, 1213, 1213, 1213, 1213, 1213, 1217, 1217, 1217,
-     1217, 1217, 1217, 1219, 1220, 1220, 1220, 1220, 1220, 1220,
-     1220,    0,    0,    0,    0, 1210, 1219, 1222, 1222, 1222,
+        0, 1130,    0, 1349,    0, 1130, 1130, 1130, 1130, 1130,
+     1130, 1346, 1346, 1346, 1346, 1346, 1346, 1346, 1354, 1354,
+     1354, 1354, 1354, 1354, 1354, 1373,    0, 1130, 1135, 1135,
+     1135, 1135, 1135, 1135, 1135, 1135, 1135,    0,    0, 1373,
+     1135,    0,    0,    0,    0,    0, 1135, 1135, 1135, 1135,
+     1135, 1135, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142,
+     1142,    0,    0,    0, 1142, 1373,    0,    0,    0,    0,
+     1142, 1142, 1142, 1142, 1142, 1142, 1152, 1152, 1152, 1152,
+     1152, 1152, 1152, 1152, 1152,    0,    0,    0, 1152,    0,
+        0,    0,    0,    0, 1152, 1152, 1152, 1152, 1152, 1152,
 
-     1222, 1222, 1222, 1222, 1225, 1225, 1225, 1225, 1225, 1225,
-     1227, 1227, 1227, 1227, 1227, 1227, 1244,    0,    0,    0,
-        0,    0, 1219, 1250, 1250, 1250, 1250, 1250, 1250, 1244,
-     1245, 1245, 1245, 1245, 1245, 1245, 1245, 1247, 1247, 1247,
-     1247, 1247, 1247, 1247, 1254, 1254, 1254, 1254, 1254, 1254,
-        0,    0,    0,    0,    0, 1244, 1258, 1258, 1258, 1258,
-     1258, 1258, 1262, 1262, 1262, 1262, 1262, 1262, 1266, 1266,
-     1266, 1266, 1266, 1266, 1271, 1271, 1271, 1271, 1271, 1271,
-     1273, 1274, 1274, 1274, 1274, 1274, 1274, 1274,    0,    0,
-        0,    0,    0, 1273, 1276, 1276, 1276, 1276, 1276, 1276,
+     1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165,    0,
+        0,    0, 1165,    0,    0,    0,    0,    0, 1165, 1165,
+     1165, 1165, 1165, 1165, 1179, 1179, 1179, 1179, 1179, 1179,
+     1179, 1179, 1179,    0,    0,    0, 1179,    0,    0,    0,
+        0,    0, 1179, 1179, 1179, 1179, 1179, 1179, 1193, 1193,
+     1193, 1193, 1193, 1193, 1193, 1193, 1193,    0,    0,    0,
+     1193,    0,    0,    0,    0,    0, 1193, 1193, 1193, 1193,
+     1193, 1193, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205,
+     1205,    0,    0,    0, 1205,    0,    0,    0,    0,    0,
+     1205, 1205, 1205, 1205, 1205, 1205, 1217, 1217, 1217, 1217,
 
-     1276, 1282, 1282, 1282, 1282, 1282, 1282, 1285, 1285, 1285,
-     1285, 1285, 1285, 1289, 1289, 1289, 1289, 1289, 1289, 1273,
-     1293, 1293, 1293, 1293, 1293, 1293, 1297, 1297, 1297, 1297,
-     1297, 1297, 1301, 1301, 1301, 1301, 1301, 1301, 1304, 1304,
-     1304, 1304, 1304, 1304, 1309, 1309, 1309, 1309, 1309, 1309,
-     1318, 1318, 1318, 1318, 1318, 1318, 1330,    0,    0,    0,
-        0, 1330, 1330, 1330, 1331,    0, 1331, 1331, 1331, 1331,
-     1331, 1331, 1331, 1332,    0, 1332, 1333, 1333, 1333, 1334,
-     1334, 1334, 1335, 1335, 1335, 1336, 1336, 1336, 1337, 1337,
-     1337, 1338, 1338, 1338, 1339, 1339, 1339, 1340, 1340, 1340,
+     1217, 1217, 1217, 1217, 1217,    0,    0,    0, 1217,    0,
+     1217,    0,    0, 1374, 1217, 1217, 1217, 1217, 1217, 1217,
+     1356, 1356, 1356, 1356, 1356, 1356, 1356, 1374, 1379, 1379,
+     1379, 1379, 1379, 1379, 1379,    0, 1217, 1221, 1221, 1221,
+     1221, 1221, 1221, 1221, 1221, 1221,    0,    0,    0, 1221,
+        0,    0,    0, 1374,    0, 1221, 1221, 1221, 1221, 1221,
+     1221, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+        0,    0,    0, 1224,    0,    0,    0,    0,    0, 1224,
+     1224, 1224, 1224, 1224, 1224, 1227, 1227, 1227, 1227, 1227,
+     1227, 1227, 1227, 1227,    0,    0,    0, 1227,    0,    0,
 
-     1341,    0, 1341, 1342, 1342, 1342, 1343, 1343, 1343, 1344,
-     1344, 1344, 1345,    0, 1345, 1346, 1346, 1346, 1347, 1347,
-        0,    0, 1347, 1348, 1348, 1348, 1349, 1349, 1349, 1350,
-     1350, 1350, 1351, 1351, 1351, 1352, 1352, 1352, 1353, 1353,
-     1353, 1354, 1354,    0,    0, 1354, 1355, 1355, 1355, 1356,
-        0, 1356, 1357, 1357, 1357, 1358,    0, 1358, 1359, 1359,
-     1359, 1360, 1360, 1360, 1361, 1361, 1361, 1362,    0, 1362,
-     1363,    0, 1363, 1364, 1364, 1364, 1365,    0, 1365, 1366,
-     1366,    0,    0, 1366, 1367, 1367,    0,    0, 1367, 1368,
-     1368, 1368, 1369, 1369, 1369, 1370, 1370, 1370, 1371, 1371,
+        0,    0,    0, 1227, 1227, 1227, 1227, 1227, 1227, 1230,
+     1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,    0,    0,
+        0, 1230,    0,    0,    0,    0,    0, 1230, 1230, 1230,
+     1230, 1230, 1230, 1233, 1233, 1233, 1233, 1233, 1233, 1233,
+     1233, 1233,    0,    0,    0, 1233,    0,    0,    0,    0,
+        0, 1233, 1233, 1233, 1233, 1233, 1233, 1238, 1238, 1238,
+     1238, 1238, 1238, 1238, 1238, 1238,    0,    0,    0, 1238,
+        0,    0,    0,    0,    0, 1238, 1238, 1238, 1238, 1238,
+     1238, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290, 1290,
+        0,    0,    0, 1290,    0,    0,    0,    0,    0, 1290,
 
-     1371, 1372, 1372, 1372, 1373, 1373, 1373, 1374, 1374, 1374,
-     1375, 1375, 1375, 1376, 1376,    0,    0, 1376, 1377, 1377,
-     1377, 1378, 1378,    0,    0, 1378, 1379, 1379,    0,    0,
-     1379, 1380, 1380, 1380, 1381,    0, 1381, 1382,    0, 1382,
-     1383, 1383, 1383, 1384,    0, 1384, 1385, 1385, 1385, 1386,
-     1386, 1386, 1387, 1387, 1387, 1388,    0, 1388, 1389,    0,
-     1389, 1390, 1390, 1390, 1391,    0, 1391, 1392,    0, 1392,
-     1393,    0, 1393, 1394, 1394, 1394, 1395,    0, 1395, 1396,
-        0,    0, 1396, 1397, 1397,    0,    0, 1397, 1398, 1398,
-        0, 1398, 1399, 1399,    0,    0, 1399, 1400, 1400, 1400,
+     1290, 1290, 1290, 1290, 1290, 1298, 1298, 1298, 1298, 1298,
+     1298, 1298, 1298, 1298,    0,    0,    0, 1298,    0,    0,
+        0,    0,    0, 1298, 1298, 1298, 1298, 1298, 1298, 1383,
+     1383, 1383, 1383, 1383, 1383, 1383, 1387, 1387, 1387, 1387,
+     1387, 1387, 1387, 1391, 1391, 1391, 1391, 1391, 1391, 1391,
+     1395, 1395, 1395, 1395, 1395, 1395, 1395, 1400, 1400, 1400,
+     1400, 1400, 1400, 1400, 1402, 1403, 1411, 1411, 1411, 1411,
+     1411, 1411, 1411,    0,    0,    0,    0,    0, 1402, 1403,
+     1414, 1414, 1414, 1414, 1414, 1414, 1414, 1418, 1418, 1418,
+     1418, 1418, 1418, 1418, 1422, 1422, 1422, 1422, 1422, 1422,
 
-     1401, 1401,    0, 1401, 1402, 1402, 1402,    0, 1402, 1402,
-     1403, 1403, 1403, 1404, 1404, 1404, 1405, 1405, 1405, 1406,
-     1406, 1406, 1407, 1407, 1407, 1408, 1408, 1408, 1409, 1409,
-     1409, 1410, 1410, 1410, 1411, 1411,    0,    0, 1411, 1412,
-     1412, 1412, 1413, 1413,    0, 1413, 1414, 1414,    0,    0,
-     1414, 1415, 1415,    0, 1415, 1416, 1416,    0,    0, 1416,
-     1417, 1417, 1417, 1418, 1418,    0, 1418, 1419,    0,    0,
-     1419, 1420, 1420,    0, 1420, 1421, 1421,    0,    0, 1421,
-     1422, 1422,    0, 1422, 1423, 1423,    0,    0, 1423, 1424,
-     1424, 1424, 1425, 1425,    0, 1425, 1426,    0, 1426, 1427,
+     1422,    0,    0,    0, 1402, 1403, 1426, 1426, 1426, 1426,
+     1426, 1426, 1426, 1430, 1430, 1430, 1430, 1430, 1430, 1430,
+     1433, 1433, 1433, 1433, 1433, 1433, 1433, 1438, 1438, 1438,
+     1438, 1438, 1438, 1438, 1447, 1447, 1447, 1447, 1447, 1447,
+     1447, 1459,    0,    0,    0,    0, 1459, 1459, 1459, 1460,
+        0, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1461,    0,
+     1461, 1462, 1462, 1462, 1463, 1463, 1463, 1464, 1464, 1464,
+     1465, 1465, 1465, 1466, 1466, 1466, 1467, 1467, 1467, 1468,
+     1468, 1468, 1469, 1469, 1469, 1470, 1470, 1470, 1471,    0,
+     1471, 1472, 1472, 1472, 1473, 1473, 1473, 1474, 1474, 1474,
 
-        0, 1427, 1428,    0, 1428, 1429, 1429, 1429, 1430,    0,
-     1430, 1431, 1431, 1431,    0, 1431, 1431, 1432, 1432, 1432,
-     1433, 1433, 1433, 1434, 1434, 1434, 1435,    0, 1435, 1436,
-        0, 1436, 1437, 1437, 1437, 1438,    0, 1438, 1439,    0,
-     1439, 1440,    0, 1440, 1441, 1441, 1441, 1442,    0, 1442,
-     1443,    0, 1443, 1444,    0, 1444, 1445,    0, 1445, 1446,
-     1446, 1446, 1447,    0, 1447, 1448,    0, 1448, 1449,    0,
-        0, 1449, 1450, 1450,    0, 1450, 1451, 1451,    0,    0,
-     1451, 1452, 1452,    0, 1452, 1453, 1453,    0,    0, 1453,
-     1454, 1454, 1454, 1455, 1455,    0, 1455, 1456, 1456, 1456,
+     1475, 1475, 1475, 1476,    0, 1476, 1477, 1477, 1477, 1478,
+     1478,    0,    0, 1478, 1479, 1479, 1479, 1480, 1480, 1480,
+     1481, 1481, 1481, 1482, 1482, 1482, 1483, 1483, 1483, 1484,
+     1484, 1484, 1485, 1485, 1485, 1486, 1486, 1486, 1487, 1487,
+     1487, 1488, 1488,    0,    0, 1488, 1489, 1489, 1489, 1490,
+     1490, 1490, 1491,    0, 1491, 1492, 1492, 1492, 1493, 1493,
+     1493, 1494,    0, 1494, 1495, 1495, 1495, 1496, 1496, 1496,
+     1497, 1497, 1497, 1498, 1498, 1498, 1499, 1499, 1499, 1500,
+        0, 1500, 1501,    0, 1501, 1502, 1502, 1502, 1503, 1503,
+     1503, 1504,    0, 1504, 1505, 1505,    0,    0, 1505, 1506,
 
-        0, 1456, 1456, 1457, 1457, 1457, 1458, 1458, 1458, 1459,
-     1459, 1459, 1460, 1460, 1460, 1461, 1461, 1461, 1462, 1462,
-     1462, 1463, 1463, 1463, 1464, 1464, 1464, 1465, 1465,    0,
-        0, 1465, 1466, 1466, 1466, 1467, 1467,    0, 1467, 1468,
-     1468,    0,    0, 1468, 1469, 1469,    0, 1469, 1470, 1470,
-        0,    0, 1470, 1471, 1471, 1471, 1472, 1472,    0, 1472,
-     1473,    0,    0, 1473, 1474, 1474,    0, 1474, 1475, 1475,
-        0,    0, 1475, 1476, 1476,    0, 1476, 1477, 1477,    0,
-        0, 1477, 1478, 1478, 1478, 1479, 1479,    0, 1479, 1480,
-        0, 1480, 1481,    0,    0, 1481, 1482, 1482,    0, 1482,
+     1506,    0,    0, 1506, 1507, 1507, 1507, 1508, 1508, 1508,
+     1509, 1509,    0, 1509, 1510, 1510, 1510, 1511, 1511, 1511,
+     1512, 1512, 1512, 1513, 1513, 1513, 1514, 1514, 1514, 1515,
+     1515, 1515, 1516, 1516, 1516, 1517, 1517,    0,    0, 1517,
+     1518, 1518, 1518, 1519, 1519, 1519, 1520, 1520,    0, 1520,
+     1521, 1521,    0,    0, 1521, 1522, 1522,    0, 1522, 1523,
+     1523, 1524, 1524,    0,    0, 1524, 1525, 1525, 1525, 1526,
+     1526, 1526, 1527, 1527,    0, 1527, 1528,    0, 1528, 1529,
+        0, 1529, 1530, 1530, 1530, 1531, 1531, 1531, 1532,    0,
+     1532, 1533, 1533, 1533, 1534, 1534, 1534, 1535, 1535, 1535,
 
-     1483, 1483,    0,    0, 1483, 1484, 1484,    0, 1484, 1485,
-     1485,    0,    0, 1485, 1486, 1486, 1486, 1487, 1487,    0,
-     1487, 1488,    0, 1488, 1489,    0, 1489, 1490,    0, 1490,
-     1491, 1491, 1491, 1492,    0, 1492, 1493, 1493, 1493,    0,
-     1493, 1493, 1494, 1494, 1494, 1495, 1495, 1495, 1496, 1496,
-     1496, 1497, 1497, 1497, 1498, 1498, 1498, 1499,    0, 1499,
-     1500,    0, 1500, 1501, 1501, 1501, 1502, 1502, 1502, 1503,
-        0, 1503, 1504,    0, 1504, 1505,    0, 1505, 1506, 1506,
-     1506, 1507, 1507, 1507, 1508,    0, 1508, 1509,    0, 1509,
-     1510,    0, 1510, 1511,    0, 1511, 1512, 1512, 1512, 1513,
+     1536, 1536, 1536, 1537, 1537, 1537, 1538, 1538, 1538, 1539,
+        0, 1539, 1540,    0, 1540, 1541, 1541, 1541, 1542, 1542,
+     1542, 1543,    0, 1543, 1544,    0, 1544, 1545,    0, 1545,
+     1546, 1546, 1546, 1547, 1547, 1547, 1548,    0, 1548, 1549,
+        0,    0, 1549, 1550, 1550,    0, 1550, 1551, 1551,    0,
+        0, 1551, 1552, 1552,    0, 1552, 1553, 1553, 1554, 1554,
+        0,    0, 1554, 1555, 1555, 1555, 1556, 1556, 1556, 1557,
+     1557,    0, 1557, 1558, 1558, 1558,    0, 1558, 1558, 1559,
+     1559, 1559, 1560, 1560, 1560, 1561, 1561, 1561, 1562, 1562,
+     1562, 1563, 1563, 1563, 1564, 1564, 1564, 1565, 1565, 1565,
 
-     1513, 1513, 1514,    0, 1514, 1515,    0, 1515, 1516,    0,
-     1516, 1517,    0, 1517, 1518, 1518, 1518, 1519, 1519, 1519,
-     1520,    0, 1520, 1521,    0, 1521, 1522,    0,    0, 1522,
-     1523, 1523,    0, 1523, 1524, 1524,    0,    0, 1524, 1525,
-     1525,    0, 1525, 1526, 1526,    0,    0, 1526, 1527, 1527,
-     1527, 1528, 1528,    0, 1528, 1529, 1529, 1529,    0, 1529,
-     1529, 1530, 1530, 1530, 1531, 1531, 1531, 1532, 1532, 1532,
-     1533, 1533, 1533, 1534, 1534, 1534, 1535, 1535, 1535, 1536,
-     1536, 1536, 1537,    0, 1537, 1538, 1538, 1538, 1539, 1539,
-        0,    0, 1539, 1540, 1540, 1540, 1541, 1541,    0, 1541,
+     1566, 1566, 1566, 1567, 1567,    0,    0, 1567, 1568, 1568,
+     1568, 1569, 1569, 1569, 1570, 1570,    0, 1570, 1571, 1571,
+        0,    0, 1571, 1572, 1572,    0, 1572, 1573, 1573, 1574,
+     1574,    0,    0, 1574, 1575, 1575, 1575, 1576, 1576, 1576,
+     1577, 1577,    0, 1577, 1578,    0,    0, 1578, 1579, 1579,
+        0, 1579, 1580, 1580,    0,    0, 1580, 1581, 1581,    0,
+     1581, 1582, 1582, 1583, 1583,    0,    0, 1583, 1584, 1584,
+     1584, 1585, 1585, 1585, 1586, 1586,    0, 1586, 1587,    0,
+     1587, 1588,    0, 1588, 1589,    0, 1589, 1590, 1590, 1590,
+     1591, 1591, 1591, 1592,    0, 1592, 1593, 1593, 1593,    0,
 
-     1542, 1542,    0,    0, 1542, 1543, 1543,    0, 1543, 1544,
-     1544,    0,    0, 1544, 1545, 1545, 1545, 1546, 1546,    0,
-     1546, 1547,    0,    0, 1547, 1548, 1548,    0, 1548, 1549,
-     1549,    0,    0, 1549, 1550, 1550,    0, 1550, 1551, 1551,
-        0,    0, 1551, 1552, 1552, 1552, 1553, 1553,    0, 1553,
-     1554,    0, 1554, 1555,    0,    0, 1555, 1556, 1556,    0,
-     1556, 1557, 1557,    0,    0, 1557, 1558, 1558,    0, 1558,
-     1559, 1559,    0,    0, 1559, 1560, 1560, 1560, 1561, 1561,
-        0, 1561, 1562,    0, 1562, 1563,    0,    0, 1563, 1564,
-     1564,    0, 1564, 1565, 1565,    0,    0, 1565, 1566, 1566,
-
-        0, 1566, 1567, 1567,    0,    0, 1567, 1568, 1568, 1568,
-     1569, 1569,    0, 1569, 1570,    0, 1570, 1571,    0, 1571,
-     1572,    0, 1572, 1573, 1573, 1573, 1574,    0, 1574, 1575,
-        0, 1575, 1576, 1576, 1576,    0, 1576, 1576, 1577,    0,
-     1577, 1578, 1578, 1578, 1579,    0, 1579, 1580,    0, 1580,
-     1581,    0, 1581, 1582,    0, 1582, 1583,    0, 1583, 1584,
-     1584,    0,    0, 1584, 1585, 1585, 1585, 1586, 1586, 1586,
-     1587, 1587,    0, 1587, 1588, 1588, 1588, 1589,    0, 1589,
-     1590, 1590, 1590, 1591, 1591, 1591, 1592,    0, 1592, 1593,
-        0, 1593, 1594, 1594, 1594, 1595, 1595, 1595, 1596,    0,
-
-     1596, 1597,    0, 1597, 1598,    0, 1598, 1599, 1599, 1599,
+     1593, 1593, 1594, 1594, 1594, 1595, 1595, 1595, 1596, 1596,
+     1596, 1597, 1597, 1597, 1598, 1598, 1598, 1599, 1599, 1599,
      1600, 1600, 1600, 1601,    0, 1601, 1602,    0, 1602, 1603,
-        0, 1603, 1604, 1604, 1604, 1605, 1605, 1605, 1606,    0,
-     1606, 1607,    0, 1607, 1608,    0, 1608, 1609, 1609, 1609,
-     1610, 1610, 1610, 1611,    0, 1611, 1612,    0,    0, 1612,
-     1613, 1613,    0, 1613, 1614, 1614,    0,    0, 1614, 1615,
-     1615,    0, 1615, 1616, 1616,    0,    0, 1616, 1617,    0,
-     1617, 1618, 1618,    0, 1618, 1619, 1619, 1619,    0, 1619,
-     1619, 1620, 1620, 1620, 1621,    0, 1621, 1622,    0, 1622,
-     1623,    0, 1623, 1624,    0, 1624, 1625,    0, 1625, 1626,
+     1603, 1603, 1604, 1604, 1604, 1605,    0, 1605, 1606,    0,
+     1606, 1607,    0, 1607, 1608, 1608, 1608, 1609, 1609, 1609,
+     1610,    0, 1610, 1611,    0, 1611, 1612,    0, 1612, 1613,
+        0, 1613, 1614, 1614, 1614, 1615, 1615, 1615, 1616,    0,
+     1616, 1617,    0, 1617, 1618,    0,    0, 1618, 1619, 1619,
+        0, 1619, 1620, 1620,    0,    0, 1620, 1621, 1621,    0,
+     1621, 1622, 1622, 1623, 1623,    0,    0, 1623, 1624, 1624,
 
-        0, 1626, 1627,    0, 1627, 1628, 1628, 1628, 1629, 1629,
-     1629, 1630,    0, 1630, 1631, 1631,    0,    0, 1631, 1632,
-     1632,    0, 1632, 1633,    0, 1633, 1634,    0,    0, 1634,
-     1635, 1635,    0, 1635, 1636, 1636,    0,    0, 1636, 1637,
-     1637,    0, 1637, 1638,    0, 1638, 1639,    0, 1639, 1640,
-        0,    0, 1640, 1641, 1641,    0, 1641, 1642, 1642,    0,
-        0, 1642, 1643, 1643,    0, 1643, 1644,    0, 1644, 1645,
-        0, 1645, 1646,    0,    0, 1646, 1647, 1647,    0, 1647,
-     1648, 1648,    0,    0, 1648, 1649, 1649,    0, 1649, 1650,
-        0, 1650, 1651,    0, 1651, 1652,    0,    0, 1652, 1653,
+     1624, 1625, 1625, 1625, 1626, 1626,    0, 1626, 1627, 1627,
+     1627,    0, 1627, 1627, 1628, 1628, 1628, 1629, 1629, 1629,
+     1630, 1630, 1630, 1631, 1631, 1631, 1632, 1632, 1632, 1633,
+     1633, 1633, 1634, 1634, 1634, 1635, 1635, 1635, 1636, 1636,
+        0,    0, 1636, 1637, 1637, 1637, 1638, 1638, 1638, 1639,
+     1639,    0, 1639, 1640, 1640,    0,    0, 1640, 1641, 1641,
+        0, 1641, 1642, 1642, 1643, 1643,    0,    0, 1643, 1644,
+     1644, 1644, 1645, 1645, 1645, 1646, 1646,    0, 1646, 1647,
+        0,    0, 1647, 1648, 1648,    0, 1648, 1649, 1649,    0,
+        0, 1649, 1650, 1650,    0, 1650, 1651, 1651, 1652, 1652,
 
-     1653,    0, 1653, 1654, 1654,    0,    0, 1654, 1655, 1655,
-        0, 1655, 1656,    0, 1656, 1657,    0, 1657, 1658,    0,
-     1658, 1659,    0, 1659, 1660, 1660, 1660, 1661,    0, 1661,
-     1662, 1662, 1662,    0, 1662, 1662, 1663,    0, 1663, 1664,
-        0, 1664, 1665,    0, 1665, 1666,    0, 1666, 1667,    0,
-     1667, 1668,    0, 1668, 1669,    0, 1669, 1670, 1670,    0,
-        0, 1670, 1671, 1671,    0, 1671, 1672,    0, 1672, 1673,
-        0, 1673, 1674,    0, 1674, 1675,    0, 1675, 1676,    0,
-     1676, 1677,    0, 1677, 1678,    0, 1678, 1679,    0, 1679,
-     1680,    0, 1680, 1681,    0, 1681, 1682,    0,    0, 1682,
+        0,    0, 1652, 1653, 1653, 1653, 1654, 1654, 1654, 1655,
+     1655,    0, 1655, 1656,    0, 1656, 1657,    0,    0, 1657,
+     1658, 1658,    0, 1658, 1659, 1659,    0,    0, 1659, 1660,
+     1660,    0, 1660, 1661, 1661, 1662, 1662,    0,    0, 1662,
+     1663, 1663, 1663, 1664, 1664, 1664, 1665, 1665,    0, 1665,
+     1666,    0, 1666, 1667,    0, 1667, 1668,    0, 1668, 1669,
+     1669, 1669, 1670, 1670, 1670, 1671,    0, 1671, 1672, 1672,
+     1672,    0, 1672, 1672, 1673, 1673, 1673, 1674, 1674, 1674,
+     1675, 1675, 1675, 1676, 1676, 1676, 1677, 1677, 1677, 1678,
+     1678, 1678, 1679, 1679, 1679, 1680, 1680, 1680, 1681, 1681,
 
-     1683, 1683,    0,    0, 1683, 1684,    0, 1684, 1685,    0,
-     1685, 1686,    0, 1686, 1687,    0,    0, 1687, 1688,    0,
-        0, 1688, 1689,    0,    0, 1689, 1690,    0,    0, 1690,
-     1691,    0,    0, 1691, 1692,    0, 1692, 1693,    0, 1693,
-     1694,    0,    0, 1694, 1695,    0, 1695, 1696,    0, 1696,
-     1697,    0, 1697, 1698,    0, 1698, 1699,    0, 1699, 1700,
-        0,    0, 1700, 1701,    0, 1701, 1702,    0, 1702, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
+     1681, 1682, 1682, 1682, 1683,    0, 1683, 1684,    0, 1684,
+     1685, 1685, 1685, 1686, 1686, 1686, 1687, 1687, 1687, 1688,
+        0, 1688, 1689,    0, 1689, 1690,    0, 1690, 1691, 1691,
+     1691, 1692, 1692, 1692, 1693, 1693, 1693, 1694,    0, 1694,
+     1695,    0, 1695, 1696,    0, 1696, 1697,    0, 1697, 1698,
+     1698, 1698, 1699, 1699, 1699, 1700, 1700, 1700, 1701,    0,
+     1701, 1702,    0, 1702, 1703,    0, 1703, 1704,    0, 1704,
+     1705, 1705, 1705, 1706, 1706, 1706, 1707, 1707, 1707, 1708,
+        0, 1708, 1709,    0, 1709, 1710,    0,    0, 1710, 1711,
+     1711,    0, 1711, 1712, 1712,    0,    0, 1712, 1713, 1713,
 
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329, 1329,
-     1329, 1329
+        0, 1713, 1714, 1714, 1715, 1715,    0,    0, 1715, 1716,
+     1716, 1716, 1717, 1717, 1717, 1718, 1718,    0, 1718, 1719,
+     1719, 1719,    0, 1719, 1719, 1720, 1720, 1720, 1721, 1721,
+     1721, 1722, 1722, 1722, 1723, 1723, 1723, 1724, 1724, 1724,
+     1725, 1725, 1725, 1726, 1726, 1726, 1727, 1727, 1727, 1728,
+        0, 1728, 1729, 1729, 1729, 1730, 1730,    0,    0, 1730,
+     1731, 1731, 1731, 1732, 1732, 1732, 1733, 1733,    0, 1733,
+     1734, 1734,    0,    0, 1734, 1735, 1735,    0, 1735, 1736,
+     1736, 1737, 1737,    0,    0, 1737, 1738, 1738, 1738, 1739,
+     1739, 1739, 1740, 1740,    0, 1740, 1741,    0,    0, 1741,
+
+     1742, 1742,    0, 1742, 1743, 1743,    0,    0, 1743, 1744,
+     1744,    0, 1744, 1745, 1745, 1746, 1746,    0,    0, 1746,
+     1747, 1747, 1747, 1748, 1748, 1748, 1749, 1749,    0, 1749,
+     1750,    0, 1750, 1751,    0,    0, 1751, 1752, 1752,    0,
+     1752, 1753, 1753,    0,    0, 1753, 1754, 1754,    0, 1754,
+     1755, 1755, 1756, 1756,    0,    0, 1756, 1757, 1757, 1757,
+     1758, 1758, 1758, 1759, 1759,    0, 1759, 1760,    0, 1760,
+     1761,    0,    0, 1761, 1762, 1762,    0, 1762, 1763, 1763,
+        0,    0, 1763, 1764, 1764,    0, 1764, 1765, 1765, 1766,
+     1766,    0,    0, 1766, 1767, 1767, 1767, 1768, 1768, 1768,
+
+     1769, 1769,    0, 1769, 1770,    0, 1770, 1771,    0, 1771,
+     1772,    0, 1772, 1773, 1773, 1773, 1774,    0, 1774, 1775,
+     1775, 1775, 1776,    0, 1776, 1777, 1777, 1777,    0, 1777,
+     1777, 1778,    0, 1778, 1779, 1779, 1779, 1780,    0, 1780,
+     1781, 1781, 1781, 1782,    0, 1782, 1783, 1783, 1783, 1784,
+        0, 1784, 1785, 1785, 1785, 1786,    0, 1786, 1787, 1787,
+     1787, 1788,    0, 1788, 1789, 1789, 1789, 1790, 1790,    0,
+        0, 1790, 1791, 1791, 1791, 1792, 1792, 1792, 1793, 1793,
+     1793, 1794, 1794,    0, 1794, 1795, 1795, 1795, 1796,    0,
+     1796, 1797, 1797, 1797, 1798, 1798, 1798, 1799,    0, 1799,
+
+     1800,    0, 1800, 1801, 1801, 1801, 1802, 1802, 1802, 1803,
+        0, 1803, 1804,    0, 1804, 1805,    0, 1805, 1806, 1806,
+     1806, 1807, 1807, 1807, 1808,    0, 1808, 1809,    0, 1809,
+     1810,    0, 1810, 1811, 1811, 1811, 1812, 1812, 1812, 1813,
+        0, 1813, 1814,    0, 1814, 1815,    0, 1815, 1816, 1816,
+     1816, 1817, 1817, 1817, 1818,    0, 1818, 1819,    0,    0,
+     1819, 1820, 1820,    0, 1820, 1821, 1821,    0,    0, 1821,
+     1822, 1822,    0, 1822, 1823, 1823, 1824, 1824,    0,    0,
+     1824, 1825, 1825, 1825, 1826,    0, 1826, 1827, 1827,    0,
+     1827, 1828, 1828, 1828,    0, 1828, 1828, 1829, 1829, 1829,
+
+     1830, 1830, 1830, 1831,    0, 1831, 1832,    0, 1832, 1833,
+        0, 1833, 1834,    0, 1834, 1835,    0, 1835, 1836,    0,
+     1836, 1837,    0, 1837, 1838, 1838, 1838, 1839, 1839, 1839,
+     1840,    0, 1840, 1841, 1841,    0,    0, 1841, 1842, 1842,
+        0, 1842, 1843, 1843, 1844,    0, 1844, 1845,    0,    0,
+     1845, 1846, 1846,    0, 1846, 1847, 1847,    0,    0, 1847,
+     1848, 1848,    0, 1848, 1849, 1849, 1850,    0, 1850, 1851,
+        0, 1851, 1852,    0,    0, 1852, 1853, 1853,    0, 1853,
+     1854, 1854,    0,    0, 1854, 1855, 1855,    0, 1855, 1856,
+     1856, 1857,    0, 1857, 1858,    0, 1858, 1859,    0,    0,
+
+     1859, 1860, 1860,    0, 1860, 1861, 1861,    0,    0, 1861,
+     1862, 1862,    0, 1862, 1863, 1863, 1864,    0, 1864, 1865,
+        0, 1865, 1866,    0,    0, 1866, 1867, 1867,    0, 1867,
+     1868, 1868,    0,    0, 1868, 1869, 1869,    0, 1869, 1870,
+     1870, 1871,    0, 1871, 1872,    0, 1872, 1873,    0, 1873,
+     1874,    0, 1874, 1875, 1875, 1875, 1876,    0, 1876, 1877,
+     1877, 1877,    0, 1877, 1877, 1878,    0, 1878, 1879,    0,
+     1879, 1880,    0, 1880, 1881,    0, 1881, 1882,    0, 1882,
+     1883,    0, 1883, 1884,    0, 1884, 1885, 1885,    0,    0,
+     1885, 1886, 1886,    0, 1886, 1887, 1887, 1888,    0, 1888,
+
+     1889,    0, 1889, 1890,    0, 1890, 1891,    0, 1891, 1892,
+        0, 1892, 1893,    0, 1893, 1894,    0, 1894, 1895,    0,
+     1895, 1896,    0, 1896, 1897,    0, 1897, 1898,    0,    0,
+     1898, 1899, 1899,    0,    0, 1899, 1900,    0, 1900, 1901,
+        0, 1901, 1902,    0, 1902, 1903,    0,    0, 1903, 1904,
+        0,    0, 1904, 1905,    0,    0, 1905, 1906,    0,    0,
+     1906, 1907,    0,    0, 1907, 1908,    0, 1908, 1909,    0,
+     1909, 1910,    0,    0, 1910, 1911,    0, 1911, 1912,    0,
+     1912, 1913,    0, 1913, 1914,    0, 1914, 1915,    0, 1915,
+     1916,    0,    0, 1916, 1917,    0, 1917, 1918,    0, 1918,
+
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458,
+     1458, 1458, 1458, 1458
     } ;
 
 static yy_state_type yy_last_accepting_state;
@@ -2441,13 +2720,27 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/scanner.l,v 1.99.2.9 2007/06/11 09:52:05 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/scanner.l,v 1.112 2008-02-06 10:21:30 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 <string.h>
 
@@ -2459,7 +2752,7 @@
 #include <pcap-stdinc.h>
 
 #ifdef __MINGW32__
-#include "IP6_misc.h"
+#include "ip6_misc.h"
 #endif
 #else /* WIN32 */
 #include <sys/socket.h>	/* for "struct sockaddr" in "struct addrinfo" */
@@ -2471,7 +2764,7 @@
 #define AI_NUMERICHOST 0x04
 #endif
 #endif /*INET6*/
-#include <pcap-namedb.h>
+#include <pcap/namedb.h>
 #include "tokdefs.h"
 
 #ifdef HAVE_OS_PROTO_H
@@ -2482,10 +2775,11 @@
 static inline int xdtoi(int);
 
 #ifdef FLEX_SCANNER
+#define YY_NO_INPUT
 #define YY_NO_UNPUT
 static YY_BUFFER_STATE in_buffer;
 #else
-static char *in_buffer;
+static const char *in_buffer;
 
 #undef getc
 #define getc(fp)  (*in_buffer == 0 ? EOF : *in_buffer++)
@@ -2494,7 +2788,7 @@
 #define yylval pcap_lval
 extern YYSTYPE yylval;
 
-#line 2498 "<stdout>"
+#line 2792 "scanner.c"
 
 #define INITIAL 0
 
@@ -2510,6 +2804,21 @@
 #define YY_EXTRA_TYPE void *
 #endif
 
+static int yy_init_globals (void );
+
+/* Accessor methods to globals.
+   These are made visible to non-reentrant scanners for convenience. */
+
+int pcap_lex_destroy (void );
+
+int pcap_get_debug (void );
+
+void pcap_set_debug (int debug_flag  );
+
+YY_EXTRA_TYPE pcap_get_extra (void );
+
+void pcap_set_extra (YY_EXTRA_TYPE user_defined  );
+
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
  */
@@ -2522,8 +2831,6 @@
 #endif
 #endif
 
-    static void yyunput (int c,char *buf_ptr  );
-    
 #ifndef yytext_ptr
 static void yy_flex_strncpy (char *,yyconst char *,int );
 #endif
@@ -2544,7 +2851,12 @@
 
 /* Amount of stuff to slurp up with each read. */
 #ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
 #define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
 #endif
 
 /* Copy whatever the last rule matched to the standard output. */
@@ -2552,7 +2864,7 @@
 /* This used to be an fputs(), but since the string might contain NUL's,
  * we now use fwrite().
  */
-#define ECHO (void) fwrite( pcap_text, pcap_leng, 1, pcap_out )
+#define ECHO do { if (fwrite( pcap_text, pcap_leng, 1, pcap_out )) {} } while (0)
 #endif
 
 /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
@@ -2645,13 +2957,13 @@
 	register char *yy_cp, *yy_bp;
 	register int yy_act;
     
-#line 169 "scanner.l"
+#line 189 "scanner.l"
 
-#line 2651 "<stdout>"
+#line 2963 "scanner.c"
 
-	if ( (yy_init) )
+	if ( !(yy_init) )
 		{
-		(yy_init) = 0;
+		(yy_init) = 1;
 
 #ifdef YY_USER_INIT
 		YY_USER_INIT;
@@ -2700,13 +3012,13 @@
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 1330 )
+				if ( yy_current_state >= 1459 )
 					yy_c = yy_meta[(unsigned int) yy_c];
 				}
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
 			++yy_cp;
 			}
-		while ( yy_base[yy_current_state] != 6570 );
+		while ( yy_base[yy_current_state] != 7401 );
 
 yy_find_action:
 		yy_act = yy_accept[yy_current_state];
@@ -2732,264 +3044,257 @@
 
 case 1:
 YY_RULE_SETUP
-#line 170 "scanner.l"
+#line 190 "scanner.l"
 return DST;
 	YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 171 "scanner.l"
+#line 191 "scanner.l"
 return SRC;
 	YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 173 "scanner.l"
+#line 193 "scanner.l"
 return LINK;
 	YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 174 "scanner.l"
+#line 194 "scanner.l"
 return LINK;
 	YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 175 "scanner.l"
+#line 195 "scanner.l"
 return ARP;
 	YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 176 "scanner.l"
+#line 196 "scanner.l"
 return RARP;
 	YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 177 "scanner.l"
+#line 197 "scanner.l"
 return IP;
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 178 "scanner.l"
+#line 198 "scanner.l"
 return SCTP;
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 179 "scanner.l"
+#line 199 "scanner.l"
 return TCP;
 	YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 180 "scanner.l"
+#line 200 "scanner.l"
 return UDP;
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 181 "scanner.l"
+#line 201 "scanner.l"
 return ICMP;
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 182 "scanner.l"
+#line 202 "scanner.l"
 return IGMP;
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 183 "scanner.l"
+#line 203 "scanner.l"
 return IGRP;
 	YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 184 "scanner.l"
+#line 204 "scanner.l"
 return PIM;
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 185 "scanner.l"
+#line 205 "scanner.l"
 return VRRP;
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 186 "scanner.l"
-return RADIO;
+#line 206 "scanner.l"
+return CARP;
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 188 "scanner.l"
-{
-#ifdef INET6
-		return IPV6;
-#else
-		bpf_error("%s not supported", pcap_text);
-#endif
-		}
+#line 207 "scanner.l"
+return RADIO;
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 195 "scanner.l"
-{
-#ifdef INET6
-		return ICMPV6;
-#else
-		bpf_error("%s not supported", pcap_text);
-#endif
-		}
+#line 209 "scanner.l"
+return IPV6;
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 202 "scanner.l"
-return AH;
+#line 210 "scanner.l"
+return ICMPV6;
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 203 "scanner.l"
-return ESP;
+#line 211 "scanner.l"
+return AH;
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 205 "scanner.l"
-return ATALK;
+#line 212 "scanner.l"
+return ESP;
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 206 "scanner.l"
-return AARP;
+#line 214 "scanner.l"
+return ATALK;
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 207 "scanner.l"
-return DECNET;
+#line 215 "scanner.l"
+return AARP;
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 208 "scanner.l"
-return LAT;
+#line 216 "scanner.l"
+return DECNET;
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 209 "scanner.l"
-return SCA;
+#line 217 "scanner.l"
+return LAT;
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 210 "scanner.l"
-return MOPRC;
+#line 218 "scanner.l"
+return SCA;
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 211 "scanner.l"
-return MOPDL;
+#line 219 "scanner.l"
+return MOPRC;
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 213 "scanner.l"
-return ISO;
+#line 220 "scanner.l"
+return MOPDL;
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 214 "scanner.l"
-return ESIS;
+#line 222 "scanner.l"
+return ISO;
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 215 "scanner.l"
+#line 223 "scanner.l"
 return ESIS;
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 216 "scanner.l"
-return ISIS;
+#line 224 "scanner.l"
+return ESIS;
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 217 "scanner.l"
+#line 225 "scanner.l"
 return ISIS;
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 218 "scanner.l"
-return L1;
+#line 226 "scanner.l"
+return ISIS;
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 219 "scanner.l"
-return L2;
+#line 227 "scanner.l"
+return L1;
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 220 "scanner.l"
-return IIH;
+#line 228 "scanner.l"
+return L2;
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 221 "scanner.l"
-return LSP;
+#line 229 "scanner.l"
+return IIH;
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 222 "scanner.l"
-return SNP;
+#line 230 "scanner.l"
+return LSP;
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 223 "scanner.l"
-return CSNP;
+#line 231 "scanner.l"
+return SNP;
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 224 "scanner.l"
-return PSNP;
+#line 232 "scanner.l"
+return CSNP;
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 226 "scanner.l"
-return CLNP;
+#line 233 "scanner.l"
+return PSNP;
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 228 "scanner.l"
-return STP;
+#line 235 "scanner.l"
+return CLNP;
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 230 "scanner.l"
-return IPX;
+#line 237 "scanner.l"
+return STP;
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 232 "scanner.l"
-return NETBEUI;
+#line 239 "scanner.l"
+return IPX;
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 234 "scanner.l"
-return HOST;
+#line 241 "scanner.l"
+return NETBEUI;
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 235 "scanner.l"
-return NET;
+#line 243 "scanner.l"
+return HOST;
 	YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 236 "scanner.l"
-return NETMASK;
+#line 244 "scanner.l"
+return NET;
 	YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 237 "scanner.l"
-return PORT;
+#line 245 "scanner.l"
+return NETMASK;
 	YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 238 "scanner.l"
-return PORTRANGE;
+#line 246 "scanner.l"
+return PORT;
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 239 "scanner.l"
-return PROTO;
+#line 247 "scanner.l"
+return PORTRANGE;
 	YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 240 "scanner.l"
+#line 248 "scanner.l"
+return PROTO;
+	YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 249 "scanner.l"
 {
 #ifdef NO_PROTOCHAIN
 		  bpf_error("%s not supported", pcap_text);
@@ -2998,293 +3303,377 @@
 #endif
 		}
 	YY_BREAK
-case 51:
-YY_RULE_SETUP
-#line 248 "scanner.l"
-return GATEWAY;
-	YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 250 "scanner.l"
-return LESS;
+#line 257 "scanner.l"
+return GATEWAY;
 	YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 251 "scanner.l"
-return GREATER;
+#line 259 "scanner.l"
+return TYPE;
 	YY_BREAK
 case 54:
 YY_RULE_SETUP
-#line 252 "scanner.l"
-return CBYTE;
+#line 260 "scanner.l"
+return SUBTYPE;
 	YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 253 "scanner.l"
-return TK_BROADCAST;
+#line 261 "scanner.l"
+return DIR;
 	YY_BREAK
 case 56:
 YY_RULE_SETUP
-#line 254 "scanner.l"
-return TK_MULTICAST;
+#line 262 "scanner.l"
+return ADDR1;
 	YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 256 "scanner.l"
-return AND;
+#line 263 "scanner.l"
+return ADDR2;
 	YY_BREAK
 case 58:
 YY_RULE_SETUP
-#line 257 "scanner.l"
-return OR;
+#line 264 "scanner.l"
+return ADDR3;
 	YY_BREAK
 case 59:
 YY_RULE_SETUP
-#line 258 "scanner.l"
-return '!';
+#line 265 "scanner.l"
+return ADDR4;
 	YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 260 "scanner.l"
-return LEN;
+#line 266 "scanner.l"
+return RA;
 	YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 261 "scanner.l"
-return INBOUND;
+#line 267 "scanner.l"
+return TA;
 	YY_BREAK
 case 62:
 YY_RULE_SETUP
-#line 262 "scanner.l"
-return OUTBOUND;
+#line 269 "scanner.l"
+return LESS;
 	YY_BREAK
 case 63:
 YY_RULE_SETUP
-#line 264 "scanner.l"
-return VLAN;
+#line 270 "scanner.l"
+return GREATER;
 	YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 265 "scanner.l"
-return MPLS;
+#line 271 "scanner.l"
+return CBYTE;
 	YY_BREAK
 case 65:
 YY_RULE_SETUP
-#line 266 "scanner.l"
-return PPPOED;
+#line 272 "scanner.l"
+return TK_BROADCAST;
 	YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 267 "scanner.l"
-return PPPOES;
+#line 273 "scanner.l"
+return TK_MULTICAST;
 	YY_BREAK
 case 67:
 YY_RULE_SETUP
-#line 269 "scanner.l"
-return LANE;
+#line 275 "scanner.l"
+return AND;
 	YY_BREAK
 case 68:
 YY_RULE_SETUP
-#line 270 "scanner.l"
-return LLC;
+#line 276 "scanner.l"
+return OR;
 	YY_BREAK
 case 69:
 YY_RULE_SETUP
-#line 271 "scanner.l"
-return METAC;
+#line 277 "scanner.l"
+return '!';
 	YY_BREAK
 case 70:
 YY_RULE_SETUP
-#line 272 "scanner.l"
-return BCC;
+#line 279 "scanner.l"
+return LEN;
 	YY_BREAK
 case 71:
 YY_RULE_SETUP
-#line 273 "scanner.l"
-return OAM;
+#line 280 "scanner.l"
+return INBOUND;
 	YY_BREAK
 case 72:
 YY_RULE_SETUP
-#line 274 "scanner.l"
-return OAMF4;
+#line 281 "scanner.l"
+return OUTBOUND;
 	YY_BREAK
 case 73:
 YY_RULE_SETUP
-#line 275 "scanner.l"
-return OAMF4EC;
+#line 283 "scanner.l"
+return VLAN;
 	YY_BREAK
 case 74:
 YY_RULE_SETUP
-#line 276 "scanner.l"
-return OAMF4SC;
+#line 284 "scanner.l"
+return MPLS;
 	YY_BREAK
 case 75:
 YY_RULE_SETUP
-#line 277 "scanner.l"
-return SC;
+#line 285 "scanner.l"
+return PPPOED;
 	YY_BREAK
 case 76:
 YY_RULE_SETUP
-#line 278 "scanner.l"
-return ILMIC;
+#line 286 "scanner.l"
+return PPPOES;
 	YY_BREAK
 case 77:
 YY_RULE_SETUP
-#line 279 "scanner.l"
-return VPI;
+#line 288 "scanner.l"
+return LANE;
 	YY_BREAK
 case 78:
 YY_RULE_SETUP
-#line 280 "scanner.l"
-return VCI;
+#line 289 "scanner.l"
+return LLC;
 	YY_BREAK
 case 79:
 YY_RULE_SETUP
-#line 281 "scanner.l"
-return CONNECTMSG;
+#line 290 "scanner.l"
+return METAC;
 	YY_BREAK
 case 80:
 YY_RULE_SETUP
-#line 282 "scanner.l"
-return METACONNECT;
+#line 291 "scanner.l"
+return BCC;
 	YY_BREAK
 case 81:
 YY_RULE_SETUP
-#line 284 "scanner.l"
-return PF_IFNAME;
+#line 292 "scanner.l"
+return OAM;
 	YY_BREAK
 case 82:
 YY_RULE_SETUP
-#line 285 "scanner.l"
-return PF_RSET;
+#line 293 "scanner.l"
+return OAMF4;
 	YY_BREAK
 case 83:
 YY_RULE_SETUP
-#line 286 "scanner.l"
-return PF_RNR;
+#line 294 "scanner.l"
+return OAMF4EC;
 	YY_BREAK
 case 84:
 YY_RULE_SETUP
-#line 287 "scanner.l"
-return PF_SRNR;
+#line 295 "scanner.l"
+return OAMF4SC;
 	YY_BREAK
 case 85:
 YY_RULE_SETUP
-#line 288 "scanner.l"
-return PF_REASON;
+#line 296 "scanner.l"
+return SC;
 	YY_BREAK
 case 86:
 YY_RULE_SETUP
-#line 289 "scanner.l"
-return PF_ACTION;
+#line 297 "scanner.l"
+return ILMIC;
 	YY_BREAK
 case 87:
 YY_RULE_SETUP
-#line 291 "scanner.l"
-return FISU;
+#line 298 "scanner.l"
+return VPI;
 	YY_BREAK
 case 88:
 YY_RULE_SETUP
-#line 292 "scanner.l"
-return LSSU;
+#line 299 "scanner.l"
+return VCI;
 	YY_BREAK
 case 89:
 YY_RULE_SETUP
-#line 293 "scanner.l"
-return LSSU;
+#line 300 "scanner.l"
+return CONNECTMSG;
 	YY_BREAK
 case 90:
 YY_RULE_SETUP
-#line 294 "scanner.l"
-return MSU;
+#line 301 "scanner.l"
+return METACONNECT;
 	YY_BREAK
 case 91:
 YY_RULE_SETUP
-#line 295 "scanner.l"
-return SIO;
+#line 303 "scanner.l"
+return PF_IFNAME;
 	YY_BREAK
 case 92:
 YY_RULE_SETUP
-#line 296 "scanner.l"
-return OPC;
+#line 304 "scanner.l"
+return PF_RSET;
 	YY_BREAK
 case 93:
 YY_RULE_SETUP
-#line 297 "scanner.l"
-return DPC;
+#line 305 "scanner.l"
+return PF_RNR;
 	YY_BREAK
 case 94:
 YY_RULE_SETUP
-#line 298 "scanner.l"
-return SLS;
+#line 306 "scanner.l"
+return PF_SRNR;
 	YY_BREAK
 case 95:
-/* rule 95 can match eol */
 YY_RULE_SETUP
-#line 300 "scanner.l"
-;
+#line 307 "scanner.l"
+return PF_REASON;
 	YY_BREAK
 case 96:
 YY_RULE_SETUP
-#line 301 "scanner.l"
-return pcap_text[0];
+#line 308 "scanner.l"
+return PF_ACTION;
 	YY_BREAK
 case 97:
 YY_RULE_SETUP
-#line 302 "scanner.l"
-return GEQ;
+#line 310 "scanner.l"
+return FISU;
 	YY_BREAK
 case 98:
 YY_RULE_SETUP
-#line 303 "scanner.l"
-return LEQ;
+#line 311 "scanner.l"
+return LSSU;
 	YY_BREAK
 case 99:
 YY_RULE_SETUP
-#line 304 "scanner.l"
-return NEQ;
+#line 312 "scanner.l"
+return LSSU;
 	YY_BREAK
 case 100:
 YY_RULE_SETUP
-#line 305 "scanner.l"
-return '=';
+#line 313 "scanner.l"
+return MSU;
 	YY_BREAK
 case 101:
 YY_RULE_SETUP
-#line 306 "scanner.l"
-return LSH;
+#line 314 "scanner.l"
+return HFISU;
 	YY_BREAK
 case 102:
 YY_RULE_SETUP
-#line 307 "scanner.l"
-return RSH;
+#line 315 "scanner.l"
+return HLSSU;
 	YY_BREAK
 case 103:
 YY_RULE_SETUP
-#line 308 "scanner.l"
-{ yylval.e = pcap_ether_aton(((char *)pcap_text)+1);
-			  return AID; }
+#line 316 "scanner.l"
+return HMSU;
 	YY_BREAK
 case 104:
 YY_RULE_SETUP
-#line 310 "scanner.l"
-{ yylval.i = stoi((char *)pcap_text); return NUM; }
+#line 317 "scanner.l"
+return SIO;
 	YY_BREAK
 case 105:
 YY_RULE_SETUP
-#line 311 "scanner.l"
-{
-			yylval.s = sdup((char *)pcap_text); return HID; }
+#line 318 "scanner.l"
+return OPC;
 	YY_BREAK
 case 106:
 YY_RULE_SETUP
-#line 313 "scanner.l"
-{ yylval.e = pcap_ether_aton((char *)pcap_text);
-			  return EID; }
+#line 319 "scanner.l"
+return DPC;
 	YY_BREAK
 case 107:
 YY_RULE_SETUP
-#line 315 "scanner.l"
+#line 320 "scanner.l"
+return SLS;
+	YY_BREAK
+case 108:
+YY_RULE_SETUP
+#line 321 "scanner.l"
+return HSIO;
+	YY_BREAK
+case 109:
+YY_RULE_SETUP
+#line 322 "scanner.l"
+return HOPC;
+	YY_BREAK
+case 110:
+YY_RULE_SETUP
+#line 323 "scanner.l"
+return HDPC;
+	YY_BREAK
+case 111:
+YY_RULE_SETUP
+#line 324 "scanner.l"
+return HSLS;
+	YY_BREAK
+case 112:
+/* rule 112 can match eol */
+YY_RULE_SETUP
+#line 326 "scanner.l"
+;
+	YY_BREAK
+case 113:
+YY_RULE_SETUP
+#line 327 "scanner.l"
+return pcap_text[0];
+	YY_BREAK
+case 114:
+YY_RULE_SETUP
+#line 328 "scanner.l"
+return GEQ;
+	YY_BREAK
+case 115:
+YY_RULE_SETUP
+#line 329 "scanner.l"
+return LEQ;
+	YY_BREAK
+case 116:
+YY_RULE_SETUP
+#line 330 "scanner.l"
+return NEQ;
+	YY_BREAK
+case 117:
+YY_RULE_SETUP
+#line 331 "scanner.l"
+return '=';
+	YY_BREAK
+case 118:
+YY_RULE_SETUP
+#line 332 "scanner.l"
+return LSH;
+	YY_BREAK
+case 119:
+YY_RULE_SETUP
+#line 333 "scanner.l"
+return RSH;
+	YY_BREAK
+case 120:
+YY_RULE_SETUP
+#line 334 "scanner.l"
+{ yylval.e = pcap_ether_aton(((char *)pcap_text)+1);
+			  if (yylval.e == NULL)
+				bpf_error("malloc");
+			  return AID; }
+	YY_BREAK
+case 121:
+YY_RULE_SETUP
+#line 338 "scanner.l"
+{ yylval.e = pcap_ether_aton((char *)pcap_text);
+			  if (yylval.e == NULL)
+				bpf_error("malloc");
+			  return EID; }
+	YY_BREAK
+case 122:
+YY_RULE_SETUP
+#line 342 "scanner.l"
+{ yylval.i = stoi((char *)pcap_text); return NUM; }
+	YY_BREAK
+case 123:
+YY_RULE_SETUP
+#line 343 "scanner.l"
+{
+			yylval.s = sdup((char *)pcap_text); return HID; }
+	YY_BREAK
+case 124:
+YY_RULE_SETUP
+#line 345 "scanner.l"
 {
 #ifdef INET6
 			  struct addrinfo hints, *res;
@@ -3294,6 +3683,7 @@
 			  if (getaddrinfo(pcap_text, NULL, &hints, &res))
 				bpf_error("bogus IPv6 address %s", pcap_text);
 			  else {
+				freeaddrinfo(res);
 				yylval.s = sdup((char *)pcap_text); return HID6;
 			  }
 #else
@@ -3301,159 +3691,159 @@
 #endif /*INET6*/
 			}
 	YY_BREAK
-case 108:
-YY_RULE_SETUP
-#line 330 "scanner.l"
-{ bpf_error("bogus ethernet address %s", pcap_text); }
-	YY_BREAK
-case 109:
-YY_RULE_SETUP
-#line 331 "scanner.l"
-{ yylval.i = 0; return NUM; }
-	YY_BREAK
-case 110:
-YY_RULE_SETUP
-#line 332 "scanner.l"
-{ yylval.i = 1; return NUM; }
-	YY_BREAK
-case 111:
-YY_RULE_SETUP
-#line 333 "scanner.l"
-{ yylval.i = 0; return NUM; }
-	YY_BREAK
-case 112:
-YY_RULE_SETUP
-#line 334 "scanner.l"
-{ yylval.i = 3; return NUM; }
-	YY_BREAK
-case 113:
-YY_RULE_SETUP
-#line 335 "scanner.l"
-{ yylval.i = 4; return NUM; }
-	YY_BREAK
-case 114:
-YY_RULE_SETUP
-#line 336 "scanner.l"
-{ yylval.i = 5; return NUM; }
-	YY_BREAK
-case 115:
-YY_RULE_SETUP
-#line 337 "scanner.l"
-{ yylval.i = 8; return NUM; }
-	YY_BREAK
-case 116:
-YY_RULE_SETUP
-#line 338 "scanner.l"
-{ yylval.i = 9; return NUM; }
-	YY_BREAK
-case 117:
-YY_RULE_SETUP
-#line 339 "scanner.l"
-{ yylval.i = 10; return NUM; }
-	YY_BREAK
-case 118:
-YY_RULE_SETUP
-#line 340 "scanner.l"
-{ yylval.i = 11; return NUM; }
-	YY_BREAK
-case 119:
-YY_RULE_SETUP
-#line 341 "scanner.l"
-{ yylval.i = 12; return NUM; }
-	YY_BREAK
-case 120:
-YY_RULE_SETUP
-#line 342 "scanner.l"
-{ yylval.i = 13; return NUM; }
-	YY_BREAK
-case 121:
-YY_RULE_SETUP
-#line 343 "scanner.l"
-{ yylval.i = 14; return NUM; }
-	YY_BREAK
-case 122:
-YY_RULE_SETUP
-#line 344 "scanner.l"
-{ yylval.i = 15; return NUM; }
-	YY_BREAK
-case 123:
-YY_RULE_SETUP
-#line 345 "scanner.l"
-{ yylval.i = 16; return NUM; }
-	YY_BREAK
-case 124:
-YY_RULE_SETUP
-#line 346 "scanner.l"
-{ yylval.i = 17; return NUM; }
-	YY_BREAK
 case 125:
 YY_RULE_SETUP
-#line 347 "scanner.l"
-{ yylval.i = 18; return NUM; }
+#line 361 "scanner.l"
+{ bpf_error("bogus ethernet address %s", pcap_text); }
 	YY_BREAK
 case 126:
 YY_RULE_SETUP
-#line 348 "scanner.l"
-{ yylval.i = 13; return NUM; }
+#line 362 "scanner.l"
+{ yylval.i = 0; return NUM; }
 	YY_BREAK
 case 127:
 YY_RULE_SETUP
-#line 349 "scanner.l"
-{ yylval.i = 0x01; return NUM; }
+#line 363 "scanner.l"
+{ yylval.i = 1; return NUM; }
 	YY_BREAK
 case 128:
 YY_RULE_SETUP
-#line 350 "scanner.l"
-{ yylval.i = 0x02; return NUM; }
+#line 364 "scanner.l"
+{ yylval.i = 0; return NUM; }
 	YY_BREAK
 case 129:
 YY_RULE_SETUP
-#line 351 "scanner.l"
-{ yylval.i = 0x04; return NUM; }
+#line 365 "scanner.l"
+{ yylval.i = 3; return NUM; }
 	YY_BREAK
 case 130:
 YY_RULE_SETUP
-#line 352 "scanner.l"
-{ yylval.i = 0x08; return NUM; }
+#line 366 "scanner.l"
+{ yylval.i = 4; return NUM; }
 	YY_BREAK
 case 131:
 YY_RULE_SETUP
-#line 353 "scanner.l"
-{ yylval.i = 0x10; return NUM; }
+#line 367 "scanner.l"
+{ yylval.i = 5; return NUM; }
 	YY_BREAK
 case 132:
 YY_RULE_SETUP
-#line 354 "scanner.l"
-{ yylval.i = 0x20; return NUM; }
+#line 368 "scanner.l"
+{ yylval.i = 8; return NUM; }
 	YY_BREAK
 case 133:
 YY_RULE_SETUP
-#line 355 "scanner.l"
-{
-			 yylval.s = sdup((char *)pcap_text); return ID; }
+#line 369 "scanner.l"
+{ yylval.i = 9; return NUM; }
 	YY_BREAK
 case 134:
 YY_RULE_SETUP
-#line 357 "scanner.l"
-{ yylval.s = sdup((char *)pcap_text + 1); return ID; }
+#line 370 "scanner.l"
+{ yylval.i = 10; return NUM; }
 	YY_BREAK
 case 135:
 YY_RULE_SETUP
-#line 358 "scanner.l"
-{
-			bpf_error("illegal token: %s", pcap_text); }
+#line 371 "scanner.l"
+{ yylval.i = 11; return NUM; }
 	YY_BREAK
 case 136:
 YY_RULE_SETUP
-#line 360 "scanner.l"
-{ bpf_error("illegal char '%c'", *pcap_text); }
+#line 372 "scanner.l"
+{ yylval.i = 12; return NUM; }
 	YY_BREAK
 case 137:
 YY_RULE_SETUP
-#line 361 "scanner.l"
+#line 373 "scanner.l"
+{ yylval.i = 13; return NUM; }
+	YY_BREAK
+case 138:
+YY_RULE_SETUP
+#line 374 "scanner.l"
+{ yylval.i = 14; return NUM; }
+	YY_BREAK
+case 139:
+YY_RULE_SETUP
+#line 375 "scanner.l"
+{ yylval.i = 15; return NUM; }
+	YY_BREAK
+case 140:
+YY_RULE_SETUP
+#line 376 "scanner.l"
+{ yylval.i = 16; return NUM; }
+	YY_BREAK
+case 141:
+YY_RULE_SETUP
+#line 377 "scanner.l"
+{ yylval.i = 17; return NUM; }
+	YY_BREAK
+case 142:
+YY_RULE_SETUP
+#line 378 "scanner.l"
+{ yylval.i = 18; return NUM; }
+	YY_BREAK
+case 143:
+YY_RULE_SETUP
+#line 379 "scanner.l"
+{ yylval.i = 13; return NUM; }
+	YY_BREAK
+case 144:
+YY_RULE_SETUP
+#line 380 "scanner.l"
+{ yylval.i = 0x01; return NUM; }
+	YY_BREAK
+case 145:
+YY_RULE_SETUP
+#line 381 "scanner.l"
+{ yylval.i = 0x02; return NUM; }
+	YY_BREAK
+case 146:
+YY_RULE_SETUP
+#line 382 "scanner.l"
+{ yylval.i = 0x04; return NUM; }
+	YY_BREAK
+case 147:
+YY_RULE_SETUP
+#line 383 "scanner.l"
+{ yylval.i = 0x08; return NUM; }
+	YY_BREAK
+case 148:
+YY_RULE_SETUP
+#line 384 "scanner.l"
+{ yylval.i = 0x10; return NUM; }
+	YY_BREAK
+case 149:
+YY_RULE_SETUP
+#line 385 "scanner.l"
+{ yylval.i = 0x20; return NUM; }
+	YY_BREAK
+case 150:
+YY_RULE_SETUP
+#line 386 "scanner.l"
+{
+			 yylval.s = sdup((char *)pcap_text); return ID; }
+	YY_BREAK
+case 151:
+YY_RULE_SETUP
+#line 388 "scanner.l"
+{ yylval.s = sdup((char *)pcap_text + 1); return ID; }
+	YY_BREAK
+case 152:
+YY_RULE_SETUP
+#line 389 "scanner.l"
+{
+			bpf_error("illegal token: %s", pcap_text); }
+	YY_BREAK
+case 153:
+YY_RULE_SETUP
+#line 391 "scanner.l"
+{ bpf_error("illegal char '%c'", *pcap_text); }
+	YY_BREAK
+case 154:
+YY_RULE_SETUP
+#line 392 "scanner.l"
 ECHO;
 	YY_BREAK
-#line 3457 "<stdout>"
+#line 3847 "scanner.c"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -3684,7 +4074,7 @@
 
 		/* Read in more data. */
 		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
-			(yy_n_chars), num_to_read );
+			(yy_n_chars), (size_t) num_to_read );
 
 		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
 		}
@@ -3708,6 +4098,14 @@
 	else
 		ret_val = EOB_ACT_CONTINUE_SCAN;
 
+	if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+		/* Extend the array by 50%, plus the number we really need. */
+		yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) pcap_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size  );
+		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+	}
+
 	(yy_n_chars) += number_to_move;
 	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
 	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
@@ -3737,7 +4135,7 @@
 		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 1330 )
+			if ( yy_current_state >= 1459 )
 				yy_c = yy_meta[(unsigned int) yy_c];
 			}
 		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -3765,52 +4163,15 @@
 	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 1330 )
+		if ( yy_current_state >= 1459 )
 			yy_c = yy_meta[(unsigned int) yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-	yy_is_jam = (yy_current_state == 1329);
+	yy_is_jam = (yy_current_state == 1458);
 
 	return yy_is_jam ? 0 : yy_current_state;
 }
 
-    static void yyunput (int c, register char * yy_bp )
-{
-	register char *yy_cp;
-    
-    yy_cp = (yy_c_buf_p);
-
-	/* undo effects of setting up pcap_text */
-	*yy_cp = (yy_hold_char);
-
-	if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
-		{ /* need to shift things up to make room */
-		/* +2 for EOB chars. */
-		register int number_to_move = (yy_n_chars) + 2;
-		register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
-					YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
-		register char *source =
-				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
-
-		while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
-			*--dest = *--source;
-
-		yy_cp += (int) (dest - source);
-		yy_bp += (int) (dest - source);
-		YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
-			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
-
-		if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
-			YY_FATAL_ERROR( "flex scanner push-back overflow" );
-		}
-
-	*--yy_cp = (char) c;
-
-	(yytext_ptr) = yy_bp;
-	(yy_hold_char) = *yy_cp;
-	(yy_c_buf_p) = yy_cp;
-}
-
 #ifndef YY_NO_INPUT
 #ifdef __cplusplus
     static int yyinput (void)
@@ -4123,7 +4484,9 @@
 		(yy_buffer_stack) = (struct yy_buffer_state**)pcap_alloc
 								(num_to_alloc * sizeof(struct yy_buffer_state*)
 								);
-		
+		if ( ! (yy_buffer_stack) )
+			YY_FATAL_ERROR( "out of dynamic memory in pcap_ensure_buffer_stack()" );
+								  
 		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
 				
 		(yy_buffer_stack_max) = num_to_alloc;
@@ -4141,6 +4504,8 @@
 								((yy_buffer_stack),
 								num_to_alloc * sizeof(struct yy_buffer_state*)
 								);
+		if ( ! (yy_buffer_stack) )
+			YY_FATAL_ERROR( "out of dynamic memory in pcap_ensure_buffer_stack()" );
 
 		/* zero only the new slots.*/
 		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
@@ -4185,26 +4550,26 @@
 
 /** Setup the input buffer state to scan a string. The next call to pcap_lex() will
  * scan from a @e copy of @a str.
- * @param str a NUL-terminated string to scan
+ * @param yystr a NUL-terminated string to scan
  * 
  * @return the newly allocated buffer state object.
  * @note If you want to scan bytes that may contain NUL values, then use
  *       pcap__scan_bytes() instead.
  */
-YY_BUFFER_STATE pcap__scan_string (yyconst char * yy_str )
+YY_BUFFER_STATE pcap__scan_string (yyconst char * yystr )
 {
     
-	return pcap__scan_bytes(yy_str,strlen(yy_str) );
+	return pcap__scan_bytes(yystr,strlen(yystr) );
 }
 
 /** Setup the input buffer state to scan the given bytes. The next call to pcap_lex() will
  * scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
  * 
  * @return the newly allocated buffer state object.
  */
-YY_BUFFER_STATE pcap__scan_bytes  (yyconst char * bytes, int  len )
+YY_BUFFER_STATE pcap__scan_bytes  (yyconst char * yybytes, int  _yybytes_len )
 {
 	YY_BUFFER_STATE b;
 	char *buf;
@@ -4212,15 +4577,15 @@
 	int i;
     
 	/* Get memory for full buffer, including space for trailing EOB's. */
-	n = len + 2;
+	n = _yybytes_len + 2;
 	buf = (char *) pcap_alloc(n  );
 	if ( ! buf )
 		YY_FATAL_ERROR( "out of dynamic memory in pcap__scan_bytes()" );
 
-	for ( i = 0; i < len; ++i )
-		buf[i] = bytes[i];
+	for ( i = 0; i < _yybytes_len; ++i )
+		buf[i] = yybytes[i];
 
-	buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
 
 	b = pcap__scan_buffer(buf,n );
 	if ( ! b )
@@ -4263,74 +4628,10 @@
 
 /* Accessor  methods (get/set functions) to struct members. */
 
-/** Get the current line number.
- * 
- */
-int pcap_get_lineno  (void)
-{
-        
-    return pcap_lineno;
-}
-
-/** Get the input stream.
- * 
- */
-FILE *pcap_get_in  (void)
-{
-        return pcap_in;
-}
-
-/** Get the output stream.
- * 
- */
-FILE *pcap_get_out  (void)
-{
-        return pcap_out;
-}
-
-/** Get the length of the current token.
- * 
- */
-int pcap_get_leng  (void)
-{
-        return pcap_leng;
-}
-
 /** Get the current token.
  * 
  */
 
-char *pcap_get_text  (void)
-{
-        return pcap_text;
-}
-
-/** Set the current line number.
- * @param line_number
- * 
- */
-void pcap_set_lineno (int  line_number )
-{
-    
-    pcap_lineno = line_number;
-}
-
-/** Set the input stream. This does not discard the current
- * input buffer.
- * @param in_str A readable stream.
- * 
- * @see pcap__switch_to_buffer
- */
-void pcap_set_in (FILE *  in_str )
-{
-        pcap_in = in_str ;
-}
-
-void pcap_set_out (FILE *  out_str )
-{
-        pcap_out = out_str ;
-}
-
 int pcap_get_debug  (void)
 {
         return pcap__flex_debug;
@@ -4341,6 +4642,34 @@
         pcap__flex_debug = bdebug ;
 }
 
+static int yy_init_globals (void)
+{
+        /* Initialization is the same as for the non-reentrant scanner.
+     * This function is called from pcap_lex_destroy(), so don't allocate here.
+     */
+
+    (yy_buffer_stack) = 0;
+    (yy_buffer_stack_top) = 0;
+    (yy_buffer_stack_max) = 0;
+    (yy_c_buf_p) = (char *) 0;
+    (yy_init) = 0;
+    (yy_start) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+    pcap_in = stdin;
+    pcap_out = stdout;
+#else
+    pcap_in = (FILE *) 0;
+    pcap_out = (FILE *) 0;
+#endif
+
+    /* For future reference: Set errno on error, since we are called by
+     * pcap_lex_init()
+     */
+    return 0;
+}
+
 /* pcap_lex_destroy is for both reentrant and non-reentrant scanners. */
 int pcap_lex_destroy  (void)
 {
@@ -4356,6 +4685,10 @@
 	pcap_free((yy_buffer_stack) );
 	(yy_buffer_stack) = NULL;
 
+    /* Reset the globals. This is important in a non-reentrant scanner so the next time
+     * pcap_lex() is called, initialization will occur. */
+    yy_init_globals( );
+
     return 0;
 }
 
@@ -4367,7 +4700,7 @@
 static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
 {
 	register int i;
-    	for ( i = 0; i < n; ++i )
+	for ( i = 0; i < n; ++i )
 		s1[i] = s2[i];
 }
 #endif
@@ -4376,7 +4709,7 @@
 static int yy_flex_strlen (yyconst char * s )
 {
 	register int n;
-    	for ( n = 0; s[n]; ++n )
+	for ( n = 0; s[n]; ++n )
 		;
 
 	return n;
@@ -4407,19 +4740,7 @@
 
 #define YYTABLES_NAME "yytables"
 
-#undef YY_NEW_FILE
-#undef YY_FLUSH_BUFFER
-#undef yy_set_bol
-#undef yy_new_buffer
-#undef yy_set_interactive
-#undef yytext_ptr
-#undef YY_DO_BEFORE_ACTION
-
-#ifdef YY_DECL_IS_OURS
-#undef YY_DECL_IS_OURS
-#undef YY_DECL
-#endif
-#line 361 "scanner.l"
+#line 392 "scanner.l"
 
 
 void
diff --git a/scanner.h b/scanner.h
new file mode 100644
index 0000000..934ca4c
--- /dev/null
+++ b/scanner.h
@@ -0,0 +1,6 @@
+/* This is generated by runlex.sh.  Do not edit it. */
+
+#ifndef YY_DECL
+#define YY_DECL int yylex(void)
+#endif  
+YY_DECL;
diff --git a/scanner.l b/scanner.l
index 01face1..daa5eae 100644
--- a/scanner.l
+++ b/scanner.l
@@ -22,13 +22,27 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/scanner.l,v 1.99.2.9 2007/06/11 09:52:05 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/scanner.l,v 1.112 2008-02-06 10:21:30 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 <string.h>
 
@@ -40,7 +54,7 @@
 #include <pcap-stdinc.h>
 
 #ifdef __MINGW32__
-#include "IP6_misc.h"
+#include "ip6_misc.h"
 #endif
 #else /* WIN32 */
 #include <sys/socket.h>	/* for "struct sockaddr" in "struct addrinfo" */
@@ -52,7 +66,7 @@
 #define AI_NUMERICHOST 0x04
 #endif
 #endif /*INET6*/
-#include <pcap-namedb.h>
+#include <pcap/namedb.h>
 #include "tokdefs.h"
 
 #ifdef HAVE_OS_PROTO_H
@@ -63,10 +77,11 @@
 static inline int xdtoi(int);
 
 #ifdef FLEX_SCANNER
+#define YY_NO_INPUT
 #define YY_NO_UNPUT
 static YY_BUFFER_STATE in_buffer;
 #else
-static char *in_buffer;
+static const char *in_buffer;
 
 #undef getc
 #define getc(fp)  (*in_buffer == 0 ? EOF : *in_buffer++)
@@ -79,6 +94,7 @@
 
 N		([0-9]+|(0X|0x)[0-9A-Fa-f]+)
 B		([0-9A-Fa-f][0-9A-Fa-f]?)
+B2		([0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f])
 W		([0-9A-Fa-f][0-9A-Fa-f]?[0-9A-Fa-f]?[0-9A-Fa-f]?)
 
 %a 18400
@@ -166,6 +182,10 @@
 
 V6		({V680}|{V670}|{V671}|{V672}|{V673}|{V674}|{V675}|{V676}|{V677}|{V660}|{V661}|{V662}|{V663}|{V664}|{V665}|{V666}|{V650}|{V651}|{V652}|{V653}|{V654}|{V655}|{V640}|{V641}|{V642}|{V643}|{V644}|{V630}|{V631}|{V632}|{V633}|{V620}|{V621}|{V622}|{V610}|{V611}|{V600}|{V6604}|{V6504}|{V6514}|{V6524}|{V6534}|{V6544}|{V6554}|{V6404}|{V6414}|{V6424}|{V6434}|{V6444}|{V6304}|{V6314}|{V6324}|{V6334}|{V6204}|{V6214}|{V6224}|{V6104}|{V6114}|{V6004})
 
+MAC		({B}:{B}:{B}:{B}:{B}:{B}|{B}\-{B}\-{B}\-{B}\-{B}\-{B}|{B}\.{B}\.{B}\.{B}\.{B}\.{B}|{B2}\.{B2}\.{B2}|{B2}{3})
+
+
+
 %%
 dst		return DST;
 src		return SRC;
@@ -183,22 +203,11 @@
 igrp		return IGRP;
 pim		return PIM;
 vrrp		return VRRP;
+carp		return CARP;
 radio		return RADIO;
 
-ip6		{
-#ifdef INET6
-		return IPV6;
-#else
-		bpf_error("%s not supported", yytext);
-#endif
-		}
-icmp6		{
-#ifdef INET6
-		return ICMPV6;
-#else
-		bpf_error("%s not supported", yytext);
-#endif
-		}
+ip6		return IPV6;
+icmp6		return ICMPV6;
 ah		return AH;
 esp		return ESP;
 
@@ -247,6 +256,16 @@
 
 gateway		return GATEWAY;
 
+type		return TYPE;
+subtype		return SUBTYPE;
+direction|dir	return DIR;
+address1|addr1	return ADDR1;
+address2|addr2	return ADDR2;
+address3|addr3	return ADDR3;
+address4|addr4	return ADDR4;
+ra		return RA;
+ta		return TA;
+
 less		return LESS;
 greater		return GREATER;
 byte		return CBYTE;
@@ -292,10 +311,17 @@
 lssu		return LSSU;
 lsu		return LSSU;
 msu		return MSU;
+hfisu		return HFISU;
+hlssu		return HLSSU;
+hmsu		return HMSU;
 sio		return SIO;
 opc		return OPC;
 dpc		return DPC;
 sls		return SLS;
+hsio		return HSIO;
+hopc		return HOPC;
+hdpc		return HDPC;
+hsls		return HSLS;
 
 [ \r\n\t]		;
 [+\-*/:\[\]!<>()&|=]	return yytext[0];
@@ -306,12 +332,16 @@
 "<<"			return LSH;
 ">>"			return RSH;
 ${B}			{ yylval.e = pcap_ether_aton(((char *)yytext)+1);
+			  if (yylval.e == NULL)
+				bpf_error("malloc");
 			  return AID; }
+{MAC}			{ yylval.e = pcap_ether_aton((char *)yytext);
+			  if (yylval.e == NULL)
+				bpf_error("malloc");
+			  return EID; }
 {N}			{ yylval.i = stoi((char *)yytext); return NUM; }
 ({N}\.{N})|({N}\.{N}\.{N})|({N}\.{N}\.{N}\.{N})	{
 			yylval.s = sdup((char *)yytext); return HID; }
-{B}:{B}:{B}:{B}:{B}:{B} { yylval.e = pcap_ether_aton((char *)yytext);
-			  return EID; }
 {V6}			{
 #ifdef INET6
 			  struct addrinfo hints, *res;
@@ -321,6 +351,7 @@
 			  if (getaddrinfo(yytext, NULL, &hints, &res))
 				bpf_error("bogus IPv6 address %s", yytext);
 			  else {
+				freeaddrinfo(res);
 				yylval.s = sdup((char *)yytext); return HID6;
 			  }
 #else
diff --git a/sf-pcap-ng.c b/sf-pcap-ng.c
new file mode 100644
index 0000000..e0c1fb1
--- /dev/null
+++ b/sf-pcap-ng.c
@@ -0,0 +1,1276 @@
+/*
+ * 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.
+ *
+ * sf-pcap-ng.c - pcap-ng-file-format-specific code from savefile.c
+ */
+
+#ifndef lint
+static const char rcsid[] _U_ =
+    "@(#) $Header$ (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 <errno.h>
+#include <memory.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "pcap-int.h"
+
+#include "pcap-common.h"
+
+#ifdef HAVE_OS_PROTO_H
+#include "os-proto.h"
+#endif
+
+#include "sf-pcap-ng.h"
+
+/*
+ * Block types.
+ */
+
+/*
+ * Common part at the beginning of all blocks.
+ */
+struct block_header {
+	bpf_u_int32	block_type;
+	bpf_u_int32	total_length;
+};
+
+/*
+ * Common trailer at the end of all blocks.
+ */
+struct block_trailer {
+	bpf_u_int32	total_length;
+};
+
+/*
+ * Common options.
+ */
+#define OPT_ENDOFOPT	0	/* end of options */
+#define OPT_COMMENT	1	/* comment string */
+
+/*
+ * Option header.
+ */
+struct option_header {
+	u_short		option_code;
+	u_short		option_length;
+};
+
+/*
+ * Structures for the part of each block type following the common
+ * part.
+ */
+
+/*
+ * Section Header Block.
+ */
+#define BT_SHB			0x0A0D0D0A
+
+struct section_header_block {
+	bpf_u_int32	byte_order_magic;
+	u_short		major_version;
+	u_short		minor_version;
+	u_int64_t	section_length;
+	/* followed by options and trailer */
+};
+
+/*
+ * Byte-order magic value.
+ */
+#define BYTE_ORDER_MAGIC	0x1A2B3C4D
+
+/*
+ * Current version number.  If major_version isn't PCAP_NG_VERSION_MAJOR,
+ * that means that this code can't read the file.
+ */
+#define PCAP_NG_VERSION_MAJOR	1
+
+/*
+ * Interface Description Block.
+ */
+#define BT_IDB			0x00000001
+
+struct interface_description_block {
+	u_short		linktype;
+	u_short		reserved;
+	bpf_u_int32	snaplen;
+	/* followed by options and trailer */
+};
+
+/*
+ * Options in the IDB.
+ */
+#define IF_NAME		2	/* interface name string */
+#define IF_DESCRIPTION	3	/* interface description string */
+#define IF_IPV4ADDR	4	/* interface's IPv4 address and netmask */
+#define IF_IPV6ADDR	5	/* interface's IPv6 address and prefix length */
+#define IF_MACADDR	6	/* interface's MAC address */
+#define IF_EUIADDR	7	/* interface's EUI address */
+#define IF_SPEED	8	/* interface's speed, in bits/s */
+#define IF_TSRESOL	9	/* interface's time stamp resolution */
+#define IF_TZONE	10	/* interface's time zone */
+#define IF_FILTER	11	/* filter used when capturing on interface */
+#define IF_OS		12	/* string OS on which capture on this interface was done */
+#define IF_FCSLEN	13	/* FCS length for this interface */
+#define IF_TSOFFSET	14	/* time stamp offset for this interface */
+
+/*
+ * Enhanced Packet Block.
+ */
+#define BT_EPB			0x00000006
+
+struct enhanced_packet_block {
+	bpf_u_int32	interface_id;
+	bpf_u_int32	timestamp_high;
+	bpf_u_int32	timestamp_low;
+	bpf_u_int32	caplen;
+	bpf_u_int32	len;
+	/* followed by packet data, options, and trailer */
+};
+
+/*
+ * Simple Packet Block.
+ */
+#define BT_SPB			0x00000003
+
+struct simple_packet_block {
+	bpf_u_int32	len;
+	/* followed by packet data and trailer */
+};
+
+/*
+ * Packet Block.
+ */
+#define BT_PB			0x00000002
+
+struct packet_block {
+	u_short		interface_id;
+	u_short		drops_count;
+	bpf_u_int32	timestamp_high;
+	bpf_u_int32	timestamp_low;
+	bpf_u_int32	caplen;
+	bpf_u_int32	len;
+	/* followed by packet data, options, and trailer */
+};
+
+/*
+ * Block cursor - used when processing the contents of a block.
+ * Contains a pointer into the data being processed and a count
+ * of bytes remaining in the block.
+ */
+struct block_cursor {
+	u_char		*data;
+	size_t		data_remaining;
+	bpf_u_int32	block_type;
+};
+
+typedef enum {
+	PASS_THROUGH,
+	SCALE_UP,
+	SCALE_DOWN
+} tstamp_scale_type_t;
+
+/*
+ * Per-interface information.
+ */
+struct pcap_ng_if {
+	u_int tsresol;			/* time stamp resolution */
+	u_int64_t tsoffset;		/* time stamp offset */
+	tstamp_scale_type_t scale_type;	/* how to scale */
+};
+
+struct pcap_ng_sf {
+	u_int user_tsresol;		/* time stamp resolution requested by the user */
+	bpf_u_int32 ifcount;		/* number of interfaces seen in this capture */
+	bpf_u_int32 ifaces_size;	/* size of arrary below */
+	struct pcap_ng_if *ifaces;	/* array of interface information */
+};
+
+static void pcap_ng_cleanup(pcap_t *p);
+static int pcap_ng_next_packet(pcap_t *p, struct pcap_pkthdr *hdr,
+    u_char **data);
+
+static int
+read_bytes(FILE *fp, void *buf, size_t bytes_to_read, int fail_on_eof,
+    char *errbuf)
+{
+	size_t amt_read;
+
+	amt_read = fread(buf, 1, bytes_to_read, fp);
+	if (amt_read != bytes_to_read) {
+		if (ferror(fp)) {
+			snprintf(errbuf, PCAP_ERRBUF_SIZE,
+			    "error reading dump file: %s",
+			    pcap_strerror(errno));
+		} else {
+			if (amt_read == 0 && !fail_on_eof)
+				return (0);	/* EOF */
+			snprintf(errbuf, PCAP_ERRBUF_SIZE,
+			    "truncated dump file; tried to read %lu bytes, only got %lu",
+			    (unsigned long)bytes_to_read,
+			    (unsigned long)amt_read);
+		}
+		return (-1);
+	}
+	return (1);
+}
+
+static int
+read_block(FILE *fp, pcap_t *p, struct block_cursor *cursor, char *errbuf)
+{
+	int status;
+	struct block_header bhdr;
+
+	status = read_bytes(fp, &bhdr, sizeof(bhdr), 0, errbuf);
+	if (status <= 0)
+		return (status);	/* error or EOF */
+
+	if (p->swapped) {
+		bhdr.block_type = SWAPLONG(bhdr.block_type);
+		bhdr.total_length = SWAPLONG(bhdr.total_length);
+	}
+
+	/*
+	 * Is this block "too big"?
+	 *
+	 * We choose 16MB as "too big", for now, so that we handle
+	 * "reasonably" large buffers but don't chew up all the
+	 * memory if we read a malformed file.
+	 */
+	if (bhdr.total_length > 16*1024*1024) {
+		snprintf(errbuf, PCAP_ERRBUF_SIZE,
+		    "pcap-ng block size %u > maximum %u",
+		    bhdr.total_length, 16*1024*1024);
+		    return (-1);
+	}
+
+	/*
+	 * Is this block "too small" - i.e., is it shorter than a block
+	 * header plus a block trailer?
+	 */
+	if (bhdr.total_length < sizeof(struct block_header) +
+	    sizeof(struct block_trailer)) {
+		snprintf(errbuf, PCAP_ERRBUF_SIZE,
+		    "block in pcap-ng dump file has a length of %u < %lu",
+		    bhdr.total_length,
+		    (unsigned long)(sizeof(struct block_header) + sizeof(struct block_trailer)));
+		return (-1);
+	}
+
+	/*
+	 * Is the buffer big enough?
+	 */
+	if (p->bufsize < bhdr.total_length) {
+		/*
+		 * No - make it big enough.
+		 */
+		p->buffer = realloc(p->buffer, bhdr.total_length);
+		if (p->buffer == NULL) {
+			snprintf(errbuf, PCAP_ERRBUF_SIZE, "out of memory");
+			return (-1);
+		}
+	}
+
+	/*
+	 * Copy the stuff we've read to the buffer, and read the rest
+	 * of the block.
+	 */
+	memcpy(p->buffer, &bhdr, sizeof(bhdr));
+	if (read_bytes(fp, p->buffer + sizeof(bhdr),
+	    bhdr.total_length - sizeof(bhdr), 1, errbuf) == -1)
+		return (-1);
+
+	/*
+	 * Initialize the cursor.
+	 */
+	cursor->data = p->buffer + sizeof(bhdr);
+	cursor->data_remaining = bhdr.total_length - sizeof(bhdr) -
+	    sizeof(struct block_trailer);
+	cursor->block_type = bhdr.block_type;
+	return (1);
+}
+
+static void *
+get_from_block_data(struct block_cursor *cursor, size_t chunk_size,
+    char *errbuf)
+{
+	void *data;
+
+	/*
+	 * Make sure we have the specified amount of data remaining in
+	 * the block data.
+	 */
+	if (cursor->data_remaining < chunk_size) {
+		snprintf(errbuf, PCAP_ERRBUF_SIZE,
+		    "block of type %u in pcap-ng dump file is too short",
+		    cursor->block_type);
+		return (NULL);
+	}
+
+	/*
+	 * Return the current pointer, and skip past the chunk.
+	 */
+	data = cursor->data;
+	cursor->data += chunk_size;
+	cursor->data_remaining -= chunk_size;
+	return (data);
+}
+
+static struct option_header *
+get_opthdr_from_block_data(pcap_t *p, struct block_cursor *cursor, char *errbuf)
+{
+	struct option_header *opthdr;
+
+	opthdr = get_from_block_data(cursor, sizeof(*opthdr), errbuf);
+	if (opthdr == NULL) {
+		/*
+		 * Option header is cut short.
+		 */
+		return (NULL);
+	}
+
+	/*
+	 * Byte-swap it if necessary.
+	 */
+	if (p->swapped) {
+		opthdr->option_code = SWAPSHORT(opthdr->option_code);
+		opthdr->option_length = SWAPSHORT(opthdr->option_length);
+	}
+
+	return (opthdr);
+}
+
+static void *
+get_optvalue_from_block_data(struct block_cursor *cursor,
+    struct option_header *opthdr, char *errbuf)
+{
+	size_t padded_option_len;
+	void *optvalue;
+
+	/* Pad option length to 4-byte boundary */
+	padded_option_len = opthdr->option_length;
+	padded_option_len = ((padded_option_len + 3)/4)*4;
+
+	optvalue = get_from_block_data(cursor, padded_option_len, errbuf);
+	if (optvalue == NULL) {
+		/*
+		 * Option value is cut short.
+		 */
+		return (NULL);
+	}
+
+	return (optvalue);
+}
+
+static int
+process_idb_options(pcap_t *p, struct block_cursor *cursor, u_int *tsresol,
+    u_int64_t *tsoffset, char *errbuf)
+{
+	struct option_header *opthdr;
+	void *optvalue;
+	int saw_tsresol, saw_tsoffset;
+	u_char tsresol_opt;
+	u_int i;
+
+	saw_tsresol = 0;
+	saw_tsoffset = 0;
+	while (cursor->data_remaining != 0) {
+		/*
+		 * Get the option header.
+		 */
+		opthdr = get_opthdr_from_block_data(p, cursor, errbuf);
+		if (opthdr == NULL) {
+			/*
+			 * Option header is cut short.
+			 */
+			return (-1);
+		}
+
+		/*
+		 * Get option value.
+		 */
+		optvalue = get_optvalue_from_block_data(cursor, opthdr,
+		    errbuf);
+		if (optvalue == NULL) {
+			/*
+			 * Option value is cut short.
+			 */
+			return (-1);
+		}
+
+		switch (opthdr->option_code) {
+
+		case OPT_ENDOFOPT:
+			if (opthdr->option_length != 0) {
+				snprintf(errbuf, PCAP_ERRBUF_SIZE,
+				    "Interface Description Block has opt_endofopt option with length %u != 0",
+				    opthdr->option_length);
+				return (-1);
+			}
+			goto done;
+
+		case IF_TSRESOL:
+			if (opthdr->option_length != 1) {
+				snprintf(errbuf, PCAP_ERRBUF_SIZE,
+				    "Interface Description Block has if_tsresol option with length %u != 1",
+				    opthdr->option_length);
+				return (-1);
+			}
+			if (saw_tsresol) {
+				snprintf(errbuf, PCAP_ERRBUF_SIZE,
+				    "Interface Description Block has more than one if_tsresol option");
+				return (-1);
+			}
+			saw_tsresol = 1;
+			tsresol_opt = *(u_int *)optvalue;
+			if (tsresol_opt & 0x80) {
+				/*
+				 * Resolution is negative power of 2.
+				 */
+				*tsresol = 1 << (tsresol_opt & 0x7F);
+			} else {
+				/*
+				 * Resolution is negative power of 10.
+				 */
+				*tsresol = 1;
+				for (i = 0; i < tsresol_opt; i++)
+					*tsresol *= 10;
+			}
+			if (*tsresol == 0) {
+				/*
+				 * Resolution is too high.
+				 */
+				if (tsresol_opt & 0x80) {
+					snprintf(errbuf, PCAP_ERRBUF_SIZE,
+					    "Interface Description Block if_tsresol option resolution 2^-%u is too high",
+					    tsresol_opt & 0x7F);
+				} else {
+					snprintf(errbuf, PCAP_ERRBUF_SIZE,
+					    "Interface Description Block if_tsresol option resolution 10^-%u is too high",
+					    tsresol_opt);
+				}
+				return (-1);
+			}
+			break;
+
+		case IF_TSOFFSET:
+			if (opthdr->option_length != 8) {
+				snprintf(errbuf, PCAP_ERRBUF_SIZE,
+				    "Interface Description Block has if_tsoffset option with length %u != 8",
+				    opthdr->option_length);
+				return (-1);
+			}
+			if (saw_tsoffset) {
+				snprintf(errbuf, PCAP_ERRBUF_SIZE,
+				    "Interface Description Block has more than one if_tsoffset option");
+				return (-1);
+			}
+			saw_tsoffset = 1;
+			memcpy(tsoffset, optvalue, sizeof(*tsoffset));
+			if (p->swapped)
+				*tsoffset = SWAPLL(*tsoffset);
+			break;
+
+		default:
+			break;
+		}
+	}
+
+done:
+	return (0);
+}
+
+static int
+add_interface(pcap_t *p, struct block_cursor *cursor, char *errbuf)
+{
+	struct pcap_ng_sf *ps;
+	u_int tsresol;
+	u_int64_t tsoffset;
+
+	ps = p->priv;
+
+	/*
+	 * Count this interface.
+	 */
+	ps->ifcount++;
+
+	/*
+	 * Grow the array of per-interface information as necessary.
+	 */
+	if (ps->ifcount > ps->ifaces_size) {
+		/*
+		 * We need to grow the array.
+		 */
+		if (ps->ifaces == NULL) {
+			/*
+			 * It's currently empty.
+			 */
+			ps->ifaces_size = 1;
+			ps->ifaces = malloc(sizeof (struct pcap_ng_if));
+		} else {
+			/*
+			 * It's not currently empty; double its size.
+			 * (Perhaps overkill once we have a lot of interfaces.)
+			 */
+			ps->ifaces_size *= 2;
+			ps->ifaces = realloc(ps->ifaces, ps->ifaces_size * sizeof (struct pcap_ng_if));
+		}
+		if (ps->ifaces == NULL) {
+			/*
+			 * We ran out of memory.
+			 * Give up.
+			 */
+			snprintf(errbuf, PCAP_ERRBUF_SIZE,
+			    "out of memory for per-interface information (%u interfaces)",
+			    ps->ifcount);
+			return (0);
+		}
+	}
+
+	/*
+	 * Set the default time stamp resolution and offset.
+	 */
+	tsresol = 1000000;	/* microsecond resolution */
+	tsoffset = 0;		/* absolute timestamps */
+
+	/*
+	 * Now look for various time stamp options, so we know
+	 * how to interpret the time stamps for this interface.
+	 */
+	if (process_idb_options(p, cursor, &tsresol, &tsoffset, errbuf) == -1)
+		return (0);
+
+	ps->ifaces[ps->ifcount - 1].tsresol = tsresol;
+	ps->ifaces[ps->ifcount - 1].tsoffset = tsoffset;
+
+	/*
+	 * Determine whether we're scaling up or down or not
+	 * at all for this interface.
+	 */
+	switch (p->opt.tstamp_precision) {
+
+	case PCAP_TSTAMP_PRECISION_MICRO:
+		if (tsresol == 1000000) {
+			/*
+			 * The resolution is 1 microsecond,
+			 * so we don't have to do scaling.
+			 */
+			ps->ifaces[ps->ifcount - 1].scale_type = PASS_THROUGH;
+		} else if (tsresol > 1000000) {
+			/*
+			 * The resolution is greater than
+			 * 1 microsecond, so we have to
+			 * scale the timestamps down.
+			 */
+			ps->ifaces[ps->ifcount - 1].scale_type = SCALE_DOWN;
+		} else {
+			/*
+			 * The resolution is less than 1
+			 * microsecond, so we have to scale
+			 * the timestamps up.
+			 */
+			ps->ifaces[ps->ifcount - 1].scale_type = SCALE_UP;
+		}
+		break;
+
+	case PCAP_TSTAMP_PRECISION_NANO:
+		if (tsresol == 1000000000) {
+			/*
+			 * The resolution is 1 nanosecond,
+			 * so we don't have to do scaling.
+			 */
+			ps->ifaces[ps->ifcount - 1].scale_type = PASS_THROUGH;
+		} else if (tsresol > 1000000000) {
+			/*
+			 * The resolution is greater than
+			 * 1 nanosecond, so we have to
+			 * scale the timestamps down.
+			 */
+			ps->ifaces[ps->ifcount - 1].scale_type = SCALE_DOWN;
+		} else {
+			/*
+			 * The resolution is less than 1
+			 * nanosecond, so we have to scale
+			 * the timestamps up.
+			 */
+			ps->ifaces[ps->ifcount - 1].scale_type = SCALE_UP;
+		}
+		break;
+	}
+	return (1);
+}
+
+/*
+ * Check whether this is a pcap-ng savefile and, if it is, extract the
+ * relevant information from the header.
+ */
+pcap_t *
+pcap_ng_check_header(bpf_u_int32 magic, FILE *fp, u_int precision, char *errbuf,
+    int *err)
+{
+	size_t amt_read;
+	bpf_u_int32 total_length;
+	bpf_u_int32 byte_order_magic;
+	struct block_header *bhdrp;
+	struct section_header_block *shbp;
+	pcap_t *p;
+	int swapped = 0;
+	struct pcap_ng_sf *ps;
+	int status;
+	struct block_cursor cursor;
+	struct interface_description_block *idbp;
+
+	/*
+	 * Assume no read errors.
+	 */
+	*err = 0;
+
+	/*
+	 * Check whether the first 4 bytes of the file are the block
+	 * type for a pcap-ng savefile. 
+	 */
+	if (magic != BT_SHB) {
+		/*
+		 * XXX - check whether this looks like what the block
+		 * type would be after being munged by mapping between
+		 * UN*X and DOS/Windows text file format and, if it
+		 * does, look for the byte-order magic number in
+		 * the appropriate place and, if we find it, report
+		 * this as possibly being a pcap-ng file transferred
+		 * between UN*X and Windows in text file format?
+		 */
+		return (NULL);	/* nope */
+	}
+
+	/*
+	 * OK, they are.  However, that's just \n\r\r\n, so it could,
+	 * conceivably, be an ordinary text file.
+	 *
+	 * It could not, however, conceivably be any other type of
+	 * capture file, so we can read the rest of the putative
+	 * Section Header Block; put the block type in the common
+	 * header, read the rest of the common header and the
+	 * fixed-length portion of the SHB, and look for the byte-order
+	 * magic value.
+	 */
+	amt_read = fread(&total_length, 1, sizeof(total_length), fp);
+	if (amt_read < sizeof(total_length)) {
+		if (ferror(fp)) {
+			snprintf(errbuf, PCAP_ERRBUF_SIZE,
+			    "error reading dump file: %s",
+			    pcap_strerror(errno));
+			*err = 1;
+			return (NULL);	/* fail */
+		}
+
+		/*
+		 * Possibly a weird short text file, so just say
+		 * "not pcap-ng".
+		 */
+		return (NULL);
+	}
+	amt_read = fread(&byte_order_magic, 1, sizeof(byte_order_magic), fp);
+	if (amt_read < sizeof(byte_order_magic)) {
+		if (ferror(fp)) {
+			snprintf(errbuf, PCAP_ERRBUF_SIZE,
+			    "error reading dump file: %s",
+			    pcap_strerror(errno));
+			*err = 1;
+			return (NULL);	/* fail */
+		}
+
+		/*
+		 * Possibly a weird short text file, so just say
+		 * "not pcap-ng".
+		 */
+		return (NULL);
+	}
+	if (byte_order_magic != BYTE_ORDER_MAGIC) {
+		byte_order_magic = SWAPLONG(byte_order_magic);
+		if (byte_order_magic != BYTE_ORDER_MAGIC) {
+			/*
+			 * Not a pcap-ng file.
+			 */
+			return (NULL);
+		}
+		swapped = 1;
+		total_length = SWAPLONG(total_length);
+	}
+
+	/*
+	 * Check the sanity of the total length.
+	 */
+	if (total_length < sizeof(*bhdrp) + sizeof(*shbp) + sizeof(struct block_trailer)) {
+		snprintf(errbuf, PCAP_ERRBUF_SIZE,
+		    "Section Header Block in pcap-ng dump file has a length of %u < %lu",
+		    total_length,
+		    (unsigned long)(sizeof(*bhdrp) + sizeof(*shbp) + sizeof(struct block_trailer)));
+		*err = 1;
+		return (NULL);
+	}
+
+	/*
+	 * OK, this is a good pcap-ng file.
+	 * Allocate a pcap_t for it.
+	 */
+	p = pcap_open_offline_common(errbuf, sizeof (struct pcap_ng_sf));
+	if (p == NULL) {
+		/* Allocation failed. */
+		*err = 1;
+		return (NULL);
+	}
+	p->swapped = swapped;
+	ps = p->priv;
+
+	/*
+	 * What precision does the user want?
+	 */
+	switch (precision) {
+
+	case PCAP_TSTAMP_PRECISION_MICRO:
+		ps->user_tsresol = 1000000;
+		break;
+
+	case PCAP_TSTAMP_PRECISION_NANO:
+		ps->user_tsresol = 1000000000;
+		break;
+
+	default:
+		snprintf(errbuf, PCAP_ERRBUF_SIZE,
+		    "unknown time stamp resolution %u", precision);
+		free(p);
+		*err = 1;
+		return (NULL);
+	}
+
+	p->opt.tstamp_precision = precision;
+
+	/*
+	 * Allocate a buffer into which to read blocks.  We default to
+	 * the maximum of:
+	 *
+	 *	the total length of the SHB for which we read the header;
+	 *
+	 *	2K, which should be more than large enough for an Enhanced
+	 *	Packet Block containing a full-size Ethernet frame, and
+	 *	leaving room for some options.
+	 *
+	 * If we find a bigger block, we reallocate the buffer.
+	 */
+	p->bufsize = 2048;
+	if (p->bufsize < total_length)
+		p->bufsize = total_length;
+	p->buffer = malloc(p->bufsize);
+	if (p->buffer == NULL) {
+		snprintf(errbuf, PCAP_ERRBUF_SIZE, "out of memory");
+		free(p);
+		*err = 1;
+		return (NULL);
+	}
+
+	/*
+	 * Copy the stuff we've read to the buffer, and read the rest
+	 * of the SHB.
+	 */
+	bhdrp = (struct block_header *)p->buffer;
+	shbp = (struct section_header_block *)(p->buffer + sizeof(struct block_header));
+	bhdrp->block_type = magic;
+	bhdrp->total_length = total_length;
+	shbp->byte_order_magic = byte_order_magic;
+	if (read_bytes(fp,
+	    p->buffer + (sizeof(magic) + sizeof(total_length) + sizeof(byte_order_magic)),
+	    total_length - (sizeof(magic) + sizeof(total_length) + sizeof(byte_order_magic)),
+	    1, errbuf) == -1)
+		goto fail;
+
+	if (p->swapped) {
+		/*
+		 * Byte-swap the fields we've read.
+		 */
+		shbp->major_version = SWAPSHORT(shbp->major_version);
+		shbp->minor_version = SWAPSHORT(shbp->minor_version);
+
+		/*
+		 * XXX - we don't care about the section length.
+		 */
+	}
+	if (shbp->major_version != PCAP_NG_VERSION_MAJOR) {
+		snprintf(errbuf, PCAP_ERRBUF_SIZE,
+		    "unknown pcap-ng savefile major version number %u",
+		    shbp->major_version);
+		goto fail;
+	}
+	p->version_major = shbp->major_version;
+	p->version_minor = shbp->minor_version;
+
+	/*
+	 * Save the time stamp resolution the user requested.
+	 */
+	p->opt.tstamp_precision = precision;
+
+	/*
+	 * Now start looking for an Interface Description Block.
+	 */
+	for (;;) {
+		/*
+		 * Read the next block.
+		 */
+		status = read_block(fp, p, &cursor, errbuf);
+		if (status == 0) {
+			/* EOF - no IDB in this file */
+			snprintf(errbuf, PCAP_ERRBUF_SIZE,
+			    "the capture file has no Interface Description Blocks");
+			goto fail;
+		}
+		if (status == -1)
+			goto fail;	/* error */
+		switch (cursor.block_type) {
+
+		case BT_IDB:
+			/*
+			 * Get a pointer to the fixed-length portion of the
+			 * IDB.
+			 */
+			idbp = get_from_block_data(&cursor, sizeof(*idbp),
+			    errbuf);
+			if (idbp == NULL)
+				goto fail;	/* error */
+
+			/*
+			 * Byte-swap it if necessary.
+			 */
+			if (p->swapped) {
+				idbp->linktype = SWAPSHORT(idbp->linktype);
+				idbp->snaplen = SWAPLONG(idbp->snaplen);
+			}
+
+			/*
+			 * Try to add this interface.
+			 */
+			if (!add_interface(p, &cursor, errbuf))
+				goto fail;
+			goto done;
+
+		case BT_EPB:
+		case BT_SPB:
+		case BT_PB:
+			/*
+			 * Saw a packet before we saw any IDBs.  That's
+			 * not valid, as we don't know what link-layer
+			 * encapsulation the packet has.
+			 */
+			snprintf(errbuf, PCAP_ERRBUF_SIZE,
+			    "the capture file has a packet block before any Interface Description Blocks");
+			goto fail;
+
+		default:
+			/*
+			 * Just ignore it.
+			 */
+			break;
+		}
+	}
+
+done:
+	p->tzoff = 0;	/* XXX - not used in pcap */
+	p->snapshot = idbp->snaplen;
+	p->linktype = linktype_to_dlt(idbp->linktype);
+	p->linktype_ext = 0;
+
+	p->next_packet_op = pcap_ng_next_packet;
+	p->cleanup_op = pcap_ng_cleanup;
+
+	return (p);
+
+fail:
+	free(ps->ifaces);
+	free(p->buffer);
+	free(p);
+	*err = 1;
+	return (NULL);
+}
+
+static void
+pcap_ng_cleanup(pcap_t *p)
+{
+	struct pcap_ng_sf *ps = p->priv;
+
+	free(ps->ifaces);
+	sf_cleanup(p);
+}
+
+/*
+ * Read and return the next packet from the savefile.  Return the header
+ * in hdr and a pointer to the contents in data.  Return 0 on success, 1
+ * if there were no more packets, and -1 on an error.
+ */
+static int
+pcap_ng_next_packet(pcap_t *p, struct pcap_pkthdr *hdr, u_char **data)
+{
+	struct pcap_ng_sf *ps = p->priv;
+	struct block_cursor cursor;
+	int status;
+	struct enhanced_packet_block *epbp;
+	struct simple_packet_block *spbp;
+	struct packet_block *pbp;
+	bpf_u_int32 interface_id = 0xFFFFFFFF;
+	struct interface_description_block *idbp;
+	struct section_header_block *shbp;
+	FILE *fp = p->rfile;
+	u_int64_t t, sec, frac;
+
+	/*
+	 * Look for an Enhanced Packet Block, a Simple Packet Block,
+	 * or a Packet Block.
+	 */
+	for (;;) {
+		/*
+		 * Read the block type and length; those are common
+		 * to all blocks.
+		 */
+		status = read_block(fp, p, &cursor, p->errbuf);
+		if (status == 0)
+			return (1);	/* EOF */
+		if (status == -1)
+			return (-1);	/* error */
+		switch (cursor.block_type) {
+
+		case BT_EPB:
+			/*
+			 * Get a pointer to the fixed-length portion of the
+			 * EPB.
+			 */
+			epbp = get_from_block_data(&cursor, sizeof(*epbp),
+			    p->errbuf);
+			if (epbp == NULL)
+				return (-1);	/* error */
+
+			/*
+			 * Byte-swap it if necessary.
+			 */
+			if (p->swapped) {
+				/* these were written in opposite byte order */
+				interface_id = SWAPLONG(epbp->interface_id);
+				hdr->caplen = SWAPLONG(epbp->caplen);
+				hdr->len = SWAPLONG(epbp->len);
+				t = ((u_int64_t)SWAPLONG(epbp->timestamp_high)) << 32 |
+				    SWAPLONG(epbp->timestamp_low);
+			} else {
+				interface_id = epbp->interface_id;
+				hdr->caplen = epbp->caplen;
+				hdr->len = epbp->len;
+				t = ((u_int64_t)epbp->timestamp_high) << 32 |
+				    epbp->timestamp_low;
+			}
+			goto found;
+			
+		case BT_SPB:
+			/*
+			 * Get a pointer to the fixed-length portion of the
+			 * SPB.
+			 */
+			spbp = get_from_block_data(&cursor, sizeof(*spbp),
+			    p->errbuf);
+			if (spbp == NULL)
+				return (-1);	/* error */
+
+			/*
+			 * SPB packets are assumed to have arrived on
+			 * the first interface.
+			 */
+			interface_id = 0;
+
+			/*
+			 * Byte-swap it if necessary.
+			 */
+			if (p->swapped) {
+				/* these were written in opposite byte order */
+				hdr->len = SWAPLONG(spbp->len);
+			} else
+				hdr->len = spbp->len;
+
+			/*
+			 * The SPB doesn't give the captured length;
+			 * it's the minimum of the snapshot length
+			 * and the packet length.
+			 */
+			hdr->caplen = hdr->len;
+			if (hdr->caplen > p->snapshot)
+				hdr->caplen = p->snapshot;
+			t = 0;	/* no time stamps */
+			goto found;
+
+		case BT_PB:
+			/*
+			 * Get a pointer to the fixed-length portion of the
+			 * PB.
+			 */
+			pbp = get_from_block_data(&cursor, sizeof(*pbp),
+			    p->errbuf);
+			if (pbp == NULL)
+				return (-1);	/* error */
+
+			/*
+			 * Byte-swap it if necessary.
+			 */
+			if (p->swapped) {
+				/* these were written in opposite byte order */
+				interface_id = SWAPSHORT(pbp->interface_id);
+				hdr->caplen = SWAPLONG(pbp->caplen);
+				hdr->len = SWAPLONG(pbp->len);
+				t = ((u_int64_t)SWAPLONG(pbp->timestamp_high)) << 32 |
+				    SWAPLONG(pbp->timestamp_low);
+			} else {
+				interface_id = pbp->interface_id;
+				hdr->caplen = pbp->caplen;
+				hdr->len = pbp->len;
+				t = ((u_int64_t)pbp->timestamp_high) << 32 |
+				    pbp->timestamp_low;
+			}
+			goto found;
+
+		case BT_IDB:
+			/*
+			 * Interface Description Block.  Get a pointer
+			 * to its fixed-length portion.
+			 */
+			idbp = get_from_block_data(&cursor, sizeof(*idbp),
+			    p->errbuf);
+			if (idbp == NULL)
+				return (-1);	/* error */
+
+			/*
+			 * Byte-swap it if necessary.
+			 */
+			if (p->swapped) {
+				idbp->linktype = SWAPSHORT(idbp->linktype);
+				idbp->snaplen = SWAPLONG(idbp->snaplen);
+			}
+
+			/*
+			 * If the link-layer type or snapshot length
+			 * differ from the ones for the first IDB we
+			 * saw, quit.
+			 *
+			 * XXX - just discard packets from those
+			 * interfaces?
+			 */
+			if (p->linktype != idbp->linktype) {
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				    "an interface has a type %u different from the type of the first interface",
+				    idbp->linktype);
+				return (-1);
+			}
+			if (p->snapshot != idbp->snaplen) {
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				    "an interface has a snapshot length %u different from the type of the first interface",
+				    idbp->snaplen);
+				return (-1);
+			}
+
+			/*
+			 * Try to add this interface.
+			 */
+			if (!add_interface(p, &cursor, p->errbuf))
+				return (-1);
+			break;
+
+		case BT_SHB:
+			/*
+			 * Section Header Block.  Get a pointer
+			 * to its fixed-length portion.
+			 */
+			shbp = get_from_block_data(&cursor, sizeof(*shbp),
+			    p->errbuf);
+			if (shbp == NULL)
+				return (-1);	/* error */
+
+			/*
+			 * Assume the byte order of this section is
+			 * the same as that of the previous section.
+			 * We'll check for that later.
+			 */
+			if (p->swapped) {
+				shbp->byte_order_magic =
+				    SWAPLONG(shbp->byte_order_magic);
+				shbp->major_version =
+				    SWAPSHORT(shbp->major_version);
+			}
+
+			/*
+			 * Make sure the byte order doesn't change;
+			 * pcap_is_swapped() shouldn't change its
+			 * return value in the middle of reading a capture.
+			 */
+			switch (shbp->byte_order_magic) {
+
+			case BYTE_ORDER_MAGIC:
+				/*
+				 * OK.
+				 */
+				break;
+
+			case SWAPLONG(BYTE_ORDER_MAGIC):
+				/*
+				 * Byte order changes.
+				 */
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				    "the file has sections with different byte orders");
+				return (-1);
+
+			default:
+				/*
+				 * Not a valid SHB.
+				 */
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				    "the file has a section with a bad byte order magic field");
+				return (-1);
+			}
+
+			/*
+			 * Make sure the major version is the version
+			 * we handle.
+			 */
+			if (shbp->major_version != PCAP_NG_VERSION_MAJOR) {
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				    "unknown pcap-ng savefile major version number %u",
+				    shbp->major_version);
+				return (-1);
+			}
+
+			/*
+			 * Reset the interface count; this section should
+			 * have its own set of IDBs.  If any of them
+			 * don't have the same interface type, snapshot
+			 * length, or resolution as the first interface
+			 * we saw, we'll fail.  (And if we don't see
+			 * any IDBs, we'll fail when we see a packet
+			 * block.)
+			 */
+			ps->ifcount = 0;
+			break;
+
+		default:
+			/*
+			 * Not a packet block, IDB, or SHB; ignore it.
+			 */
+			break;
+		}		 
+	}
+
+found:
+	/*
+	 * Is the interface ID an interface we know?
+	 */
+	if (interface_id >= ps->ifcount) {
+		/*
+		 * Yes.  Fail.
+		 */
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+		    "a packet arrived on interface %u, but there's no Interface Description Block for that interface",
+		    interface_id);
+		return (-1);
+	}
+
+	/*
+	 * Convert the time stamp to a struct timeval.
+	 */
+	sec = t / ps->ifaces[interface_id].tsresol + ps->ifaces[interface_id].tsoffset;
+	frac = t % ps->ifaces[interface_id].tsresol;
+	switch (ps->ifaces[interface_id].scale_type) {
+
+	case PASS_THROUGH:
+		/*
+		 * The interface resolution is what the user wants,
+		 * so we're done.
+		 */
+		break;
+
+	case SCALE_UP:
+		/*
+		 * The interface resolution is less than what the user
+		 * wants; scale up to that resolution.
+		 *
+		 * XXX - if ps->ifaces[interface_id].tsresol is a power
+		 * of 10, we could just multiply by the quotient of
+		 * ps->ifaces[interface_id].tsresol and ps->user_tsresol,
+		 * as we know that's an integer.  That runs less risk of
+		 * overflow.
+		 *
+		 * Is there something clever we could do if
+		 * ps->ifaces[interface_id].tsresol is a power of 2?
+		 */
+		frac *= ps->ifaces[interface_id].tsresol;
+		frac /= ps->user_tsresol;
+		break;
+
+	case SCALE_DOWN:
+		/*
+		 * The interface resolution is greater than what the user
+		 * wants; scale down to that resolution.
+		 *
+		 * XXX - if ps->ifaces[interface_id].tsresol is a power
+		 * of 10, we could just divide by the quotient of
+		 * ps->user_tsresol and ps->ifaces[interface_id].tsresol,
+		 * as we know that's an integer.  That runs less risk of
+		 * overflow.
+		 *
+		 * Is there something clever we could do if
+		 * ps->ifaces[interface_id].tsresol is a power of 2?
+		 */
+		frac *= ps->user_tsresol;
+		frac /= ps->ifaces[interface_id].tsresol;
+		break;
+	}
+	hdr->ts.tv_sec = sec;
+	hdr->ts.tv_usec = frac;
+
+	/*
+	 * Get a pointer to the packet data.
+	 */
+	*data = get_from_block_data(&cursor, hdr->caplen, p->errbuf);
+	if (*data == NULL)
+		return (-1);
+
+	if (p->swapped)
+		swap_pseudo_headers(p->linktype, hdr, *data);
+
+	return (0);
+}
diff --git a/sf-pcap-ng.h b/sf-pcap-ng.h
new file mode 100644
index 0000000..3c93498
--- /dev/null
+++ b/sf-pcap-ng.h
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ *
+ * sf-pcap-ng.h - pcap-ng-file-format-specific routines
+ *
+ * Used to read pcap-ng savefiles.
+ */
+
+#ifndef sf_pcap_ng_h
+#define	sf_pcap_ng_h
+
+extern pcap_t *pcap_ng_check_header(bpf_u_int32 magic, FILE *fp,
+    u_int precision, char *errbuf, int *err);
+
+#endif
diff --git a/sf-pcap.c b/sf-pcap.c
new file mode 100644
index 0000000..b298131
--- /dev/null
+++ b/sf-pcap.c
@@ -0,0 +1,732 @@
+/*
+ * 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.
+ *
+ * sf-pcap.c - libpcap-file-format-specific code from savefile.c
+ *	Extraction/creation by Jeffrey Mogul, DECWRL
+ *	Modified by Steve McCanne, LBL.
+ *
+ * Used to save the received packet headers, after filtering, to
+ * a file, and then read them later.
+ * The first record in the file contains saved values for the machine
+ * dependent values so we can print the dump file on any architecture.
+ */
+
+#ifndef lint
+static const char rcsid[] _U_ =
+    "@(#) $Header$ (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 <errno.h>
+#include <memory.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "pcap-int.h"
+
+#include "pcap-common.h"
+
+#ifdef HAVE_OS_PROTO_H
+#include "os-proto.h"
+#endif
+
+#include "sf-pcap.h"
+
+/*
+ * Setting O_BINARY on DOS/Windows is a bit tricky
+ */
+#if defined(WIN32)
+  #define SET_BINMODE(f)  _setmode(_fileno(f), _O_BINARY)
+#elif defined(MSDOS)
+  #if defined(__HIGHC__)
+  #define SET_BINMODE(f)  setmode(f, O_BINARY)
+  #else
+  #define SET_BINMODE(f)  setmode(fileno(f), O_BINARY)
+  #endif
+#endif
+
+/*
+ * Standard libpcap format.
+ */
+#define TCPDUMP_MAGIC		0xa1b2c3d4
+
+/*
+ * Alexey Kuznetzov's modified libpcap format.
+ */
+#define KUZNETZOV_TCPDUMP_MAGIC	0xa1b2cd34
+
+/*
+ * Reserved for Francisco Mesquita <francisco.mesquita@radiomovel.pt>
+ * for another modified format.
+ */
+#define FMESQUITA_TCPDUMP_MAGIC	0xa1b234cd
+
+/*
+ * Navtel Communcations' format, with nanosecond timestamps,
+ * as per a request from Dumas Hwang <dumas.hwang@navtelcom.com>.
+ */
+#define NAVTEL_TCPDUMP_MAGIC	0xa12b3c4d
+
+/*
+ * Normal libpcap format, except for seconds/nanoseconds timestamps,
+ * as per a request by Ulf Lamping <ulf.lamping@web.de>
+ */
+#define NSEC_TCPDUMP_MAGIC	0xa1b23c4d
+
+/*
+ * Mechanism for storing information about a capture in the upper
+ * 6 bits of a linktype value in a capture file.
+ *
+ * LT_LINKTYPE_EXT(x) extracts the additional information.
+ *
+ * The rest of the bits are for a value describing the link-layer
+ * value.  LT_LINKTYPE(x) extracts that value.
+ */
+#define LT_LINKTYPE(x)		((x) & 0x03FFFFFF)
+#define LT_LINKTYPE_EXT(x)	((x) & 0xFC000000)
+
+static int pcap_next_packet(pcap_t *p, struct pcap_pkthdr *hdr, u_char **datap);
+
+/*
+ * Private data for reading pcap savefiles.
+ */
+typedef enum {
+	NOT_SWAPPED,
+	SWAPPED,
+	MAYBE_SWAPPED
+} swapped_type_t;
+
+typedef enum {
+	PASS_THROUGH,
+	SCALE_UP,
+	SCALE_DOWN
+} tstamp_scale_type_t;
+
+struct pcap_sf {
+	size_t hdrsize;
+	swapped_type_t lengths_swapped;
+	tstamp_scale_type_t scale_type;
+};
+
+/*
+ * Check whether this is a pcap savefile and, if it is, extract the
+ * relevant information from the header.
+ */
+pcap_t *
+pcap_check_header(bpf_u_int32 magic, FILE *fp, u_int precision, char *errbuf,
+    int *err)
+{
+	struct pcap_file_header hdr;
+	size_t amt_read;
+	pcap_t *p;
+	int swapped = 0;
+	struct pcap_sf *ps;
+
+	/*
+	 * Assume no read errors.
+	 */
+	*err = 0;
+
+	/*
+	 * Check whether the first 4 bytes of the file are the magic
+	 * number for a pcap savefile, or for a byte-swapped pcap
+	 * savefile.
+	 */
+	if (magic != TCPDUMP_MAGIC && magic != KUZNETZOV_TCPDUMP_MAGIC &&
+	    magic != NSEC_TCPDUMP_MAGIC) {
+		magic = SWAPLONG(magic);
+		if (magic != TCPDUMP_MAGIC && magic != KUZNETZOV_TCPDUMP_MAGIC &&
+		    magic != NSEC_TCPDUMP_MAGIC)
+			return (NULL);	/* nope */
+		swapped = 1;
+	}
+
+	/*
+	 * They are.  Put the magic number in the header, and read
+	 * the rest of the header.
+	 */
+	hdr.magic = magic;
+	amt_read = fread(((char *)&hdr) + sizeof hdr.magic, 1,
+	    sizeof(hdr) - sizeof(hdr.magic), fp);
+	if (amt_read != sizeof(hdr) - sizeof(hdr.magic)) {
+		if (ferror(fp)) {
+			snprintf(errbuf, PCAP_ERRBUF_SIZE,
+			    "error reading dump file: %s",
+			    pcap_strerror(errno));
+		} else {
+			snprintf(errbuf, PCAP_ERRBUF_SIZE,
+			    "truncated dump file; tried to read %lu file header bytes, only got %lu",
+			    (unsigned long)sizeof(hdr),
+			    (unsigned long)amt_read);
+		}
+		*err = 1;
+		return (NULL);
+	}
+
+	/*
+	 * If it's a byte-swapped capture file, byte-swap the header.
+	 */
+	if (swapped) {
+		hdr.version_major = SWAPSHORT(hdr.version_major);
+		hdr.version_minor = SWAPSHORT(hdr.version_minor);
+		hdr.thiszone = SWAPLONG(hdr.thiszone);
+		hdr.sigfigs = SWAPLONG(hdr.sigfigs);
+		hdr.snaplen = SWAPLONG(hdr.snaplen);
+		hdr.linktype = SWAPLONG(hdr.linktype);
+	}
+
+	if (hdr.version_major < PCAP_VERSION_MAJOR) {
+		snprintf(errbuf, PCAP_ERRBUF_SIZE,
+		    "archaic pcap savefile format");
+		*err = 1;
+		return (NULL);
+	}
+
+	/*
+	 * OK, this is a good pcap file.
+	 * Allocate a pcap_t for it.
+	 */
+	p = pcap_open_offline_common(errbuf, sizeof (struct pcap_sf));
+	if (p == NULL) {
+		/* Allocation failed. */
+		*err = 1;
+		return (NULL);
+	}
+	p->swapped = swapped;
+	p->version_major = hdr.version_major;
+	p->version_minor = hdr.version_minor;
+	p->tzoff = hdr.thiszone;
+	p->snapshot = hdr.snaplen;
+	p->linktype = linktype_to_dlt(LT_LINKTYPE(hdr.linktype));
+	p->linktype_ext = LT_LINKTYPE_EXT(hdr.linktype);
+
+	p->next_packet_op = pcap_next_packet;
+
+	ps = p->priv;
+
+	p->opt.tstamp_precision = precision;
+
+	/*
+	 * Will we need to scale the timestamps to match what the
+	 * user wants?
+	 */
+	switch (precision) {
+
+	case PCAP_TSTAMP_PRECISION_MICRO:
+		if (magic == NSEC_TCPDUMP_MAGIC) {
+			/*
+			 * The file has nanoseconds, the user
+			 * wants microseconds; scale the
+			 * precision down.
+			 */
+			ps->scale_type = SCALE_DOWN;
+		} else {
+			/*
+			 * The file has microseconds, the
+			 * user wants microseconds; nothing to do.
+			 */
+			ps->scale_type = PASS_THROUGH;
+		}
+		break;
+
+	case PCAP_TSTAMP_PRECISION_NANO:
+		if (magic == NSEC_TCPDUMP_MAGIC) {
+			/*
+			 * The file has nanoseconds, the
+			 * user wants nanoseconds; nothing to do.
+			 */
+			ps->scale_type = PASS_THROUGH;
+		} else {
+			/*
+			 * The file has microoseconds, the user
+			 * wants nanoseconds; scale the
+			 * precision up.
+			 */
+			ps->scale_type = SCALE_UP;
+		}
+		break;
+
+	default:
+		snprintf(errbuf, PCAP_ERRBUF_SIZE,
+		    "unknown time stamp resolution %u", precision);
+		free(p);
+		*err = 1;
+		return (NULL);
+	}
+
+	/*
+	 * We interchanged the caplen and len fields at version 2.3,
+	 * in order to match the bpf header layout.  But unfortunately
+	 * some files were written with version 2.3 in their headers
+	 * but without the interchanged fields.
+	 *
+	 * In addition, DG/UX tcpdump writes out files with a version
+	 * number of 543.0, and with the caplen and len fields in the
+	 * pre-2.3 order.
+	 */
+	switch (hdr.version_major) {
+
+	case 2:
+		if (hdr.version_minor < 3)
+			ps->lengths_swapped = SWAPPED;
+		else if (hdr.version_minor == 3)
+			ps->lengths_swapped = MAYBE_SWAPPED;
+		else
+			ps->lengths_swapped = NOT_SWAPPED;
+		break;
+
+	case 543:
+		ps->lengths_swapped = SWAPPED;
+		break;
+
+	default:
+		ps->lengths_swapped = NOT_SWAPPED;
+		break;
+	}
+
+	if (magic == KUZNETZOV_TCPDUMP_MAGIC) {
+		/*
+		 * XXX - the patch that's in some versions of libpcap
+		 * changes the packet header but not the magic number,
+		 * and some other versions with this magic number have
+		 * some extra debugging information in the packet header;
+		 * we'd have to use some hacks^H^H^H^H^Hheuristics to
+		 * detect those variants.
+		 *
+		 * Ethereal does that, but it does so by trying to read
+		 * the first two packets of the file with each of the
+		 * record header formats.  That currently means it seeks
+		 * backwards and retries the reads, which doesn't work
+		 * on pipes.  We want to be able to read from a pipe, so
+		 * that strategy won't work; we'd have to buffer some
+		 * data ourselves and read from that buffer in order to
+		 * make that work.
+		 */
+		ps->hdrsize = sizeof(struct pcap_sf_patched_pkthdr);
+
+		if (p->linktype == DLT_EN10MB) {
+			/*
+			 * This capture might have been done in raw mode
+			 * or cooked mode.
+			 *
+			 * If it was done in cooked mode, p->snapshot was
+			 * passed to recvfrom() as the buffer size, meaning
+			 * that the most packet data that would be copied
+			 * would be p->snapshot.  However, a faked Ethernet
+			 * header would then have been added to it, so the
+			 * most data that would be in a packet in the file
+			 * would be p->snapshot + 14.
+			 *
+			 * We can't easily tell whether the capture was done
+			 * in raw mode or cooked mode, so we'll assume it was
+			 * cooked mode, and add 14 to the snapshot length.
+			 * That means that, for a raw capture, the snapshot
+			 * length will be misleading if you use it to figure
+			 * out why a capture doesn't have all the packet data,
+			 * but there's not much we can do to avoid that.
+			 */
+			p->snapshot += 14;
+		}
+	} else
+		ps->hdrsize = sizeof(struct pcap_sf_pkthdr);
+
+	/*
+	 * Allocate a buffer for the packet data.
+	 */
+	p->bufsize = p->snapshot;
+	if (p->bufsize <= 0) {
+		/*
+		 * Bogus snapshot length; use 64KiB as a fallback.
+		 */
+		p->bufsize = 65536;
+	}
+	p->buffer = malloc(p->bufsize);
+	if (p->buffer == NULL) {
+		snprintf(errbuf, PCAP_ERRBUF_SIZE, "out of memory");
+		free(p);
+		*err = 1;
+		return (NULL);
+	}
+
+	p->cleanup_op = sf_cleanup;
+
+	return (p);
+}
+
+/*
+ * Read and return the next packet from the savefile.  Return the header
+ * in hdr and a pointer to the contents in data.  Return 0 on success, 1
+ * if there were no more packets, and -1 on an error.
+ */
+static int
+pcap_next_packet(pcap_t *p, struct pcap_pkthdr *hdr, u_char **data)
+{
+	struct pcap_sf *ps = p->priv;
+	struct pcap_sf_patched_pkthdr sf_hdr;
+	FILE *fp = p->rfile;
+	size_t amt_read;
+	bpf_u_int32 t;
+
+	/*
+	 * Read the packet header; the structure we use as a buffer
+	 * is the longer structure for files generated by the patched
+	 * libpcap, but if the file has the magic number for an
+	 * unpatched libpcap we only read as many bytes as the regular
+	 * header has.
+	 */
+	amt_read = fread(&sf_hdr, 1, ps->hdrsize, fp);
+	if (amt_read != ps->hdrsize) {
+		if (ferror(fp)) {
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+			    "error reading dump file: %s",
+			    pcap_strerror(errno));
+			return (-1);
+		} else {
+			if (amt_read != 0) {
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				    "truncated dump file; tried to read %lu header bytes, only got %lu",
+				    (unsigned long)ps->hdrsize,
+				    (unsigned long)amt_read);
+				return (-1);
+			}
+			/* EOF */
+			return (1);
+		}
+	}
+
+	if (p->swapped) {
+		/* these were written in opposite byte order */
+		hdr->caplen = SWAPLONG(sf_hdr.caplen);
+		hdr->len = SWAPLONG(sf_hdr.len);
+		hdr->ts.tv_sec = SWAPLONG(sf_hdr.ts.tv_sec);
+		hdr->ts.tv_usec = SWAPLONG(sf_hdr.ts.tv_usec);
+	} else {
+		hdr->caplen = sf_hdr.caplen;
+		hdr->len = sf_hdr.len;
+		hdr->ts.tv_sec = sf_hdr.ts.tv_sec;
+		hdr->ts.tv_usec = sf_hdr.ts.tv_usec;
+	}
+
+	switch (ps->scale_type) {
+
+	case PASS_THROUGH:
+		/*
+		 * Just pass the time stamp through.
+		 */
+		break;
+
+	case SCALE_UP:
+		/*
+		 * File has microseconds, user wants nanoseconds; convert
+		 * it.
+		 */
+		hdr->ts.tv_usec = hdr->ts.tv_usec * 1000;
+		break;
+
+	case SCALE_DOWN:
+		/*
+		 * File has nanoseconds, user wants microseconds; convert
+		 * it.
+		 */
+		hdr->ts.tv_usec = hdr->ts.tv_usec / 1000;
+		break;
+	}
+
+	/* Swap the caplen and len fields, if necessary. */
+	switch (ps->lengths_swapped) {
+
+	case NOT_SWAPPED:
+		break;
+
+	case MAYBE_SWAPPED:
+		if (hdr->caplen <= hdr->len) {
+			/*
+			 * The captured length is <= the actual length,
+			 * so presumably they weren't swapped.
+			 */
+			break;
+		}
+		/* FALLTHROUGH */
+
+	case SWAPPED:
+		t = hdr->caplen;
+		hdr->caplen = hdr->len;
+		hdr->len = t;
+		break;
+	}
+
+	if (hdr->caplen > p->bufsize) {
+		/*
+		 * This can happen due to Solaris 2.3 systems tripping
+		 * over the BUFMOD problem and not setting the snapshot
+		 * correctly in the savefile header.  If the caplen isn't
+		 * grossly wrong, try to salvage.
+		 */
+		static u_char *tp = NULL;
+		static size_t tsize = 0;
+
+		if (hdr->caplen > 65535) {
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+			    "bogus savefile header");
+			return (-1);
+		}
+
+		if (tsize < hdr->caplen) {
+			tsize = ((hdr->caplen + 1023) / 1024) * 1024;
+			if (tp != NULL)
+				free((u_char *)tp);
+			tp = (u_char *)malloc(tsize);
+			if (tp == NULL) {
+				tsize = 0;
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				    "BUFMOD hack malloc");
+				return (-1);
+			}
+		}
+		amt_read = fread((char *)tp, 1, hdr->caplen, fp);
+		if (amt_read != hdr->caplen) {
+			if (ferror(fp)) {
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				    "error reading dump file: %s",
+				    pcap_strerror(errno));
+			} else {
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				    "truncated dump file; tried to read %u captured bytes, only got %lu",
+				    hdr->caplen, (unsigned long)amt_read);
+			}
+			return (-1);
+		}
+		/*
+		 * We can only keep up to p->bufsize bytes.  Since
+		 * caplen > p->bufsize is exactly how we got here,
+		 * we know we can only keep the first p->bufsize bytes
+		 * and must drop the remainder.  Adjust caplen accordingly,
+		 * so we don't get confused later as to how many bytes we
+		 * have to play with.
+		 */
+		hdr->caplen = p->bufsize;
+		memcpy(p->buffer, (char *)tp, p->bufsize);
+	} else {
+		/* read the packet itself */
+		amt_read = fread(p->buffer, 1, hdr->caplen, fp);
+		if (amt_read != hdr->caplen) {
+			if (ferror(fp)) {
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				    "error reading dump file: %s",
+				    pcap_strerror(errno));
+			} else {
+				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+				    "truncated dump file; tried to read %u captured bytes, only got %lu",
+				    hdr->caplen, (unsigned long)amt_read);
+			}
+			return (-1);
+		}
+	}
+	*data = p->buffer;
+
+	if (p->swapped)
+		swap_pseudo_headers(p->linktype, hdr, *data);
+
+	return (0);
+}
+
+static int
+sf_write_header(pcap_t *p, FILE *fp, int linktype, int thiszone, int snaplen)
+{
+	struct pcap_file_header hdr;
+
+	hdr.magic = p->opt.tstamp_precision == PCAP_TSTAMP_PRECISION_NANO ? NSEC_TCPDUMP_MAGIC : TCPDUMP_MAGIC;
+	hdr.version_major = PCAP_VERSION_MAJOR;
+	hdr.version_minor = PCAP_VERSION_MINOR;
+
+	hdr.thiszone = thiszone;
+	hdr.snaplen = snaplen;
+	hdr.sigfigs = 0;
+	hdr.linktype = linktype;
+
+	if (fwrite((char *)&hdr, sizeof(hdr), 1, fp) != 1)
+		return (-1);
+
+	return (0);
+}
+
+/*
+ * Output a packet to the initialized dump file.
+ */
+void
+pcap_dump(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
+{
+	register FILE *f;
+	struct pcap_sf_pkthdr sf_hdr;
+
+	f = (FILE *)user;
+	sf_hdr.ts.tv_sec  = h->ts.tv_sec;
+	sf_hdr.ts.tv_usec = h->ts.tv_usec;
+	sf_hdr.caplen     = h->caplen;
+	sf_hdr.len        = h->len;
+	/* XXX we should check the return status */
+	(void)fwrite(&sf_hdr, sizeof(sf_hdr), 1, f);
+	(void)fwrite(sp, h->caplen, 1, f);
+}
+
+static pcap_dumper_t *
+pcap_setup_dump(pcap_t *p, int linktype, FILE *f, const char *fname)
+{
+
+#if defined(WIN32) || defined(MSDOS)
+	/*
+	 * If we're writing to the standard output, put it in binary
+	 * mode, as savefiles are binary files.
+	 *
+	 * Otherwise, we turn off buffering.
+	 * XXX - why?  And why not on the standard output?
+	 */
+	if (f == stdout)
+		SET_BINMODE(f);
+	else
+		setbuf(f, NULL);
+#endif
+	if (sf_write_header(p, f, linktype, p->tzoff, p->snapshot) == -1) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "Can't write to %s: %s",
+		    fname, pcap_strerror(errno));
+		if (f != stdout)
+			(void)fclose(f);
+		return (NULL);
+	}
+	return ((pcap_dumper_t *)f);
+}
+
+/*
+ * Initialize so that sf_write() will output to the file named 'fname'.
+ */
+pcap_dumper_t *
+pcap_dump_open(pcap_t *p, const char *fname)
+{
+	FILE *f;
+	int linktype;
+
+	/*
+	 * If this pcap_t hasn't been activated, it doesn't have a
+	 * link-layer type, so we can't use it.
+	 */
+	if (!p->activated) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: not-yet-activated pcap_t passed to pcap_dump_open",
+		    fname);
+		return (NULL);
+	}
+	linktype = dlt_to_linktype(p->linktype);
+	if (linktype == -1) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+		    "%s: link-layer type %d isn't supported in savefiles",
+		    fname, p->linktype);
+		return (NULL);
+	}
+	linktype |= p->linktype_ext;
+
+	if (fname[0] == '-' && fname[1] == '\0') {
+		f = stdout;
+		fname = "standard output";
+	} else {
+#if !defined(WIN32) && !defined(MSDOS)
+		f = fopen(fname, "w");
+#else
+		f = fopen(fname, "wb");
+#endif
+		if (f == NULL) {
+			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "%s: %s",
+			    fname, pcap_strerror(errno));
+			return (NULL);
+		}
+	}
+	return (pcap_setup_dump(p, linktype, f, fname));
+}
+
+/*
+ * Initialize so that sf_write() will output to the given stream.
+ */
+pcap_dumper_t *
+pcap_dump_fopen(pcap_t *p, FILE *f)
+{	
+	int linktype;
+
+	linktype = dlt_to_linktype(p->linktype);
+	if (linktype == -1) {
+		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
+		    "stream: link-layer type %d isn't supported in savefiles",
+		    p->linktype);
+		return (NULL);
+	}
+	linktype |= p->linktype_ext;
+
+	return (pcap_setup_dump(p, linktype, f, "stream"));
+}
+
+FILE *
+pcap_dump_file(pcap_dumper_t *p)
+{
+	return ((FILE *)p);
+}
+
+long
+pcap_dump_ftell(pcap_dumper_t *p)
+{
+	return (ftell((FILE *)p));
+}
+
+int
+pcap_dump_flush(pcap_dumper_t *p)
+{
+
+	if (fflush((FILE *)p) == EOF)
+		return (-1);
+	else
+		return (0);
+}
+
+void
+pcap_dump_close(pcap_dumper_t *p)
+{
+
+#ifdef notyet
+	if (ferror((FILE *)p))
+		return-an-error;
+	/* XXX should check return from fclose() too */
+#endif
+	(void)fclose((FILE *)p);
+}
diff --git a/sf-pcap.h b/sf-pcap.h
new file mode 100644
index 0000000..e9c7eaf
--- /dev/null
+++ b/sf-pcap.h
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ *
+ * sf-pcap.h - libpcap-file-format-specific routines
+ *	Extraction/creation by Jeffrey Mogul, DECWRL
+ *	Modified by Steve McCanne, LBL.
+ *
+ * Used to save the received packet headers, after filtering, to
+ * a file, and then read them later.
+ * The first record in the file contains saved values for the machine
+ * dependent values so we can print the dump file on any architecture.
+ */
+
+#ifndef sf_pcap_h
+#define	sf_pcap_h
+
+extern pcap_t *pcap_check_header(bpf_u_int32 magic, FILE *fp,
+    u_int precision, char *errbuf, int *err);
+
+#endif
diff --git a/sunatmpos.h b/sunatmpos.h
index 7538b2a..916017f 100644
--- a/sunatmpos.h
+++ b/sunatmpos.h
@@ -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/sunatmpos.h,v 1.1 2002/07/11 09:06:47 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/sunatmpos.h,v 1.1 2002-07-11 09:06:47 guy Exp $ (LBL)
  */
 
 /* SunATM header for ATM packet */
diff --git a/tests/filtertest.c b/tests/filtertest.c
new file mode 100644
index 0000000..a56d1e4
--- /dev/null
+++ b/tests/filtertest.c
@@ -0,0 +1,266 @@
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
+ *	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.
+ */
+
+#ifndef lint
+static const char copyright[] _U_ =
+    "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
+The Regents of the University of California.  All rights reserved.\n";
+static const char rcsid[] _U_ =
+    "@(#) $Header: /tcpdump/master/libpcap/filtertest.c,v 1.2 2005-08-08 17:50:13 guy Exp $ (LBL)";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <pcap.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <arpa/inet.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifndef HAVE___ATTRIBUTE__
+#define __attribute__(x)
+#endif
+
+static char *program_name;
+
+/* Forwards */
+static void usage(void) __attribute__((noreturn));
+static void error(const char *, ...)
+    __attribute__((noreturn, format (printf, 1, 2)));
+
+extern int optind;
+extern int opterr;
+extern char *optarg;
+
+/*
+ * On Windows, we need to open the file in binary mode, so that
+ * we get all the bytes specified by the size we get from "fstat()".
+ * On UNIX, that's not necessary.  O_BINARY is defined on Windows;
+ * we define it as 0 if it's not defined, so it does nothing.
+ */
+#ifndef O_BINARY
+#define O_BINARY	0
+#endif
+
+static char *
+read_infile(char *fname)
+{
+	register int i, fd, cc;
+	register char *cp;
+	struct stat buf;
+
+	fd = open(fname, O_RDONLY|O_BINARY);
+	if (fd < 0)
+		error("can't open %s: %s", fname, pcap_strerror(errno));
+
+	if (fstat(fd, &buf) < 0)
+		error("can't stat %s: %s", fname, pcap_strerror(errno));
+
+	cp = malloc((u_int)buf.st_size + 1);
+	if (cp == NULL)
+		error("malloc(%d) for %s: %s", (u_int)buf.st_size + 1,
+			fname, pcap_strerror(errno));
+	cc = read(fd, cp, (u_int)buf.st_size);
+	if (cc < 0)
+		error("read %s: %s", fname, pcap_strerror(errno));
+	if (cc != buf.st_size)
+		error("short read %s (%d != %d)", fname, cc, (int)buf.st_size);
+
+	close(fd);
+	/* replace "# comment" with spaces */
+	for (i = 0; i < cc; i++) {
+		if (cp[i] == '#')
+			while (i < cc && cp[i] != '\n')
+				cp[i++] = ' ';
+	}
+	cp[cc] = '\0';
+	return (cp);
+}
+
+/* VARARGS */
+static void
+error(const char *fmt, ...)
+{
+	va_list ap;
+
+	(void)fprintf(stderr, "%s: ", program_name);
+	va_start(ap, fmt);
+	(void)vfprintf(stderr, fmt, ap);
+	va_end(ap);
+	if (*fmt) {
+		fmt += strlen(fmt);
+		if (fmt[-1] != '\n')
+			(void)fputc('\n', stderr);
+	}
+	exit(1);
+	/* NOTREACHED */
+}
+
+/*
+ * Copy arg vector into a new buffer, concatenating arguments with spaces.
+ */
+static char *
+copy_argv(register char **argv)
+{
+	register char **p;
+	register u_int len = 0;
+	char *buf;
+	char *src, *dst;
+
+	p = argv;
+	if (*p == 0)
+		return 0;
+
+	while (*p)
+		len += strlen(*p++) + 1;
+
+	buf = (char *)malloc(len);
+	if (buf == NULL)
+		error("copy_argv: malloc");
+
+	p = argv;
+	dst = buf;
+	while ((src = *p++) != NULL) {
+		while ((*dst++ = *src++) != '\0')
+			;
+		dst[-1] = ' ';
+	}
+	dst[-1] = '\0';
+
+	return buf;
+}
+
+int
+main(int argc, char **argv)
+{
+	char *cp;
+	int op;
+	int dflag;
+	char *infile;
+	int Oflag;
+	long snaplen;
+	int dlt;
+	bpf_u_int32 netmask = PCAP_NETMASK_UNKNOWN;
+	char *cmdbuf;
+	pcap_t *pd;
+	struct bpf_program fcode;
+
+#ifdef WIN32
+	if(wsockinit() != 0) return 1;
+#endif /* WIN32 */
+
+	dflag = 1;
+	infile = NULL;
+	Oflag = 1;
+	snaplen = 68;
+  
+	if ((cp = strrchr(argv[0], '/')) != NULL)
+		program_name = cp + 1;
+	else
+		program_name = argv[0];
+
+	opterr = 0;
+	while ((op = getopt(argc, argv, "dF:m:Os:")) != -1) {
+		switch (op) {
+
+		case 'd':
+			++dflag;
+			break;
+
+		case 'F':
+			infile = optarg;
+			break;
+
+		case 'O':
+			Oflag = 0;
+			break;
+
+		case 'm': {
+			in_addr_t addr;
+
+			addr = inet_addr(optarg);
+			if (addr == INADDR_NONE)
+				error("invalid netmask %s", optarg);
+			netmask = addr;
+			break;
+		}
+
+		case 's': {
+			char *end;
+
+			snaplen = strtol(optarg, &end, 0);
+			if (optarg == end || *end != '\0'
+			    || snaplen < 0 || snaplen > 65535)
+				error("invalid snaplen %s", optarg);
+			else if (snaplen == 0)
+				snaplen = 65535;
+			break;
+		}
+
+		default:
+			usage();
+			/* NOTREACHED */
+		}
+	}
+
+	if (optind >= argc) {
+		usage();
+		/* NOTREACHED */
+	}
+
+	dlt = pcap_datalink_name_to_val(argv[optind]);
+	if (dlt < 0)
+		error("invalid data link type %s", argv[optind]);
+	
+	if (infile)
+		cmdbuf = read_infile(infile);
+	else
+		cmdbuf = copy_argv(&argv[optind+1]);
+
+	pd = pcap_open_dead(dlt, snaplen);
+	if (pd == NULL)
+		error("Can't open fake pcap_t");
+
+	if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
+		error("%s", pcap_geterr(pd));
+	bpf_dump(&fcode, dflag);
+	pcap_close(pd);
+	exit(0);
+}
+
+static void
+usage(void)
+{
+	(void)fprintf(stderr, "%s, with %s\n", program_name,
+	    pcap_lib_version());
+	(void)fprintf(stderr,
+	    "Usage: %s [-dO] [ -F file ] [ -m netmask] [ -s snaplen ] dlt [ expression ]\n",
+	    program_name);
+	exit(1);
+}
diff --git a/tests/findalldevstest.c b/tests/findalldevstest.c
new file mode 100644
index 0000000..ec7c950
--- /dev/null
+++ b/tests/findalldevstest.c
@@ -0,0 +1,131 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+
+#include <pcap.h>
+
+static void ifprint(pcap_if_t *d);
+static char *iptos(bpf_u_int32 in);
+
+int main(int argc, char **argv)
+{
+  pcap_if_t *alldevs;
+  pcap_if_t *d;
+  char *s;
+  bpf_u_int32 net, mask;
+  
+  char errbuf[PCAP_ERRBUF_SIZE+1];
+  if (pcap_findalldevs(&alldevs, errbuf) == -1)
+  {
+    fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);
+    exit(1);
+  }
+  for(d=alldevs;d;d=d->next)
+  {
+    ifprint(d);
+  }
+
+  if ( (s = pcap_lookupdev(errbuf)) == NULL)
+  {
+    fprintf(stderr,"Error in pcap_lookupdev: %s\n",errbuf);
+  }
+  else
+  {
+    printf("Preferred device name: %s\n",s);
+  }
+
+  if (pcap_lookupnet(s, &net, &mask, errbuf) < 0)
+  {
+    fprintf(stderr,"Error in pcap_lookupnet: %s\n",errbuf);
+  }
+  else
+  {
+    printf("Preferred device is on network: %s/%s\n",iptos(net), iptos(mask));
+  }
+  
+  exit(0);
+}
+
+static void ifprint(pcap_if_t *d)
+{
+  pcap_addr_t *a;
+#ifdef INET6
+  char ntop_buf[INET6_ADDRSTRLEN];
+#endif
+
+  printf("%s\n",d->name);
+  if (d->description)
+    printf("\tDescription: %s\n",d->description);
+  printf("\tLoopback: %s\n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no");
+
+  for(a=d->addresses;a;a=a->next) {
+    switch(a->addr->sa_family)
+    {
+      case AF_INET:
+        printf("\tAddress Family: AF_INET\n");
+        if (a->addr)
+          printf("\t\tAddress: %s\n",
+            inet_ntoa(((struct sockaddr_in *)(a->addr))->sin_addr));
+        if (a->netmask)
+          printf("\t\tNetmask: %s\n",
+            inet_ntoa(((struct sockaddr_in *)(a->netmask))->sin_addr));
+        if (a->broadaddr)
+          printf("\t\tBroadcast Address: %s\n",
+            inet_ntoa(((struct sockaddr_in *)(a->broadaddr))->sin_addr));
+        if (a->dstaddr)
+          printf("\t\tDestination Address: %s\n",
+            inet_ntoa(((struct sockaddr_in *)(a->dstaddr))->sin_addr));
+        break;
+#ifdef INET6
+      case AF_INET6:
+        printf("\tAddress Family: AF_INET6\n");
+        if (a->addr)
+          printf("\t\tAddress: %s\n",
+            inet_ntop(AF_INET6,
+               ((struct sockaddr_in6 *)(a->addr))->sin6_addr.s6_addr,
+               ntop_buf, sizeof ntop_buf));
+        if (a->netmask)
+          printf("\t\tNetmask: %s\n",
+            inet_ntop(AF_INET6,
+              ((struct sockaddr_in6 *)(a->netmask))->sin6_addr.s6_addr,
+               ntop_buf, sizeof ntop_buf));
+        if (a->broadaddr)
+          printf("\t\tBroadcast Address: %s\n",
+            inet_ntop(AF_INET6,
+              ((struct sockaddr_in6 *)(a->broadaddr))->sin6_addr.s6_addr,
+               ntop_buf, sizeof ntop_buf));
+        if (a->dstaddr)
+          printf("\t\tDestination Address: %s\n",
+            inet_ntop(AF_INET6,
+              ((struct sockaddr_in6 *)(a->dstaddr))->sin6_addr.s6_addr,
+               ntop_buf, sizeof ntop_buf));
+        break;
+#endif
+      default:
+        printf("\tAddress Family: Unknown (%d)\n", a->addr->sa_family);
+        break;
+    }
+  }
+  printf("\n");
+}
+
+/* From tcptraceroute */
+#define IPTOSBUFFERS	12
+static char *iptos(bpf_u_int32 in)
+{
+	static char output[IPTOSBUFFERS][3*4+3+1];
+	static short which;
+	u_char *p;
+
+	p = (u_char *)&in;
+	which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
+	sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
+	return output[which];
+}
diff --git a/tests/nonblocktest.c b/tests/nonblocktest.c
new file mode 100644
index 0000000..70a6bfd
--- /dev/null
+++ b/tests/nonblocktest.c
@@ -0,0 +1,226 @@
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
+ *	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.
+ */
+
+#ifndef lint
+static const char copyright[] =
+    "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
+The Regents of the University of California.  All rights reserved.\n";
+#endif
+
+#include <pcap.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/select.h>
+#include <poll.h>
+
+char *program_name;
+
+/* Forwards */
+static void countme(u_char *, const struct pcap_pkthdr *, const u_char *);
+static void usage(void) __attribute__((noreturn));
+static void error(const char *, ...);
+static void warning(const char *, ...);
+static char *copy_argv(char **);
+
+static pcap_t *pd;
+
+extern int optind;
+extern int opterr;
+extern char *optarg;
+
+int
+main(int argc, char **argv)
+{
+	register int op;
+	bpf_u_int32 localnet, netmask;
+	register char *cp, *cmdbuf, *device;
+	struct bpf_program fcode;
+	char ebuf[PCAP_ERRBUF_SIZE];
+	int status;
+	int packet_count;
+
+	device = NULL;
+	if ((cp = strrchr(argv[0], '/')) != NULL)
+		program_name = cp + 1;
+	else
+		program_name = argv[0];
+
+	opterr = 0;
+	while ((op = getopt(argc, argv, "i:")) != -1) {
+		switch (op) {
+
+		case 'i':
+			device = optarg;
+			break;
+
+		default:
+			usage();
+			/* NOTREACHED */
+		}
+	}
+
+	if (device == NULL) {
+		device = pcap_lookupdev(ebuf);
+		if (device == NULL)
+			error("%s", ebuf);
+	}
+	*ebuf = '\0';
+	pd = pcap_open_live(device, 65535, 0, 1000, ebuf);
+	if (pd == NULL)
+		error("%s", ebuf);
+	else if (*ebuf)
+		warning("%s", ebuf);
+	if (pcap_lookupnet(device, &localnet, &netmask, ebuf) < 0) {
+		localnet = 0;
+		netmask = 0;
+		warning("%s", ebuf);
+	}
+	cmdbuf = copy_argv(&argv[optind]);
+
+	if (pcap_compile(pd, &fcode, cmdbuf, 1, netmask) < 0)
+		error("%s", pcap_geterr(pd));
+
+	if (pcap_setfilter(pd, &fcode) < 0)
+		error("%s", pcap_geterr(pd));
+	if (pcap_setnonblock(pd, 1, ebuf) == -1)
+		error("pcap_setnonblock failed: %s", ebuf);
+	printf("Listening on %s\n", device);
+	for (;;) {
+		packet_count = 0;
+		status = pcap_dispatch(pd, -1, countme,
+		    (u_char *)&packet_count);
+		if (status < 0)
+			break;
+		if (status != 0) {
+			printf("%d packets seen, %d packets counted after pcap_dispatch returns\n",
+			    status, packet_count);
+		}
+	}
+	if (status == -2) {
+		/*
+		 * We got interrupted, so perhaps we didn't
+		 * manage to finish a line we were printing.
+		 * Print an extra newline, just in case.
+		 */
+		putchar('\n');
+	}
+	(void)fflush(stdout);
+	if (status == -1) {
+		/*
+		 * Error.  Report it.
+		 */
+		(void)fprintf(stderr, "%s: pcap_loop: %s\n",
+		    program_name, pcap_geterr(pd));
+	}
+	pcap_close(pd);
+	exit(status == -1 ? 1 : 0);
+}
+
+static void
+countme(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
+{
+	int *counterp = (int *)user;
+
+	(*counterp)++;
+}
+
+static void
+usage(void)
+{
+	(void)fprintf(stderr, "Usage: %s [ -sptn ] [ -i interface ] [expression]\n",
+	    program_name);
+	exit(1);
+}
+
+/* VARARGS */
+static void
+error(const char *fmt, ...)
+{
+	va_list ap;
+
+	(void)fprintf(stderr, "%s: ", program_name);
+	va_start(ap, fmt);
+	(void)vfprintf(stderr, fmt, ap);
+	va_end(ap);
+	if (*fmt) {
+		fmt += strlen(fmt);
+		if (fmt[-1] != '\n')
+			(void)fputc('\n', stderr);
+	}
+	exit(1);
+	/* NOTREACHED */
+}
+
+/* VARARGS */
+static void
+warning(const char *fmt, ...)
+{
+	va_list ap;
+
+	(void)fprintf(stderr, "%s: WARNING: ", program_name);
+	va_start(ap, fmt);
+	(void)vfprintf(stderr, fmt, ap);
+	va_end(ap);
+	if (*fmt) {
+		fmt += strlen(fmt);
+		if (fmt[-1] != '\n')
+			(void)fputc('\n', stderr);
+	}
+}
+
+/*
+ * Copy arg vector into a new buffer, concatenating arguments with spaces.
+ */
+static char *
+copy_argv(register char **argv)
+{
+	register char **p;
+	register u_int len = 0;
+	char *buf;
+	char *src, *dst;
+
+	p = argv;
+	if (*p == 0)
+		return 0;
+
+	while (*p)
+		len += strlen(*p++) + 1;
+
+	buf = (char *)malloc(len);
+	if (buf == NULL)
+		error("copy_argv: malloc");
+
+	p = argv;
+	dst = buf;
+	while ((src = *p++) != NULL) {
+		while ((*dst++ = *src++) != '\0')
+			;
+		dst[-1] = ' ';
+	}
+	dst[-1] = '\0';
+
+	return buf;
+}
diff --git a/tests/opentest.c b/tests/opentest.c
new file mode 100644
index 0000000..0c91531
--- /dev/null
+++ b/tests/opentest.c
@@ -0,0 +1,216 @@
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
+ *	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.
+ */
+
+#ifndef lint
+static const char copyright[] =
+    "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
+The Regents of the University of California.  All rights reserved.\n";
+#endif
+
+#include <pcap.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <errno.h>
+
+#define MAXIMUM_SNAPLEN		65535
+
+static char *program_name;
+
+/* Forwards */
+static void usage(void) __attribute__((noreturn));
+static void error(const char *, ...);
+static void warning(const char *, ...);
+
+extern int optind;
+extern int opterr;
+extern char *optarg;
+
+int
+main(int argc, char **argv)
+{
+	register int op;
+	register char *cp, *device;
+	int dorfmon, dopromisc, snaplen, useactivate, bufsize;
+	char ebuf[PCAP_ERRBUF_SIZE];
+	pcap_t *pd;
+	int status = 0;
+
+	device = NULL;
+	dorfmon = 0;
+	dopromisc = 0;
+	snaplen = MAXIMUM_SNAPLEN;
+	bufsize = 0;
+	useactivate = 0;
+	if ((cp = strrchr(argv[0], '/')) != NULL)
+		program_name = cp + 1;
+	else
+		program_name = argv[0];
+
+	opterr = 0;
+	while ((op = getopt(argc, argv, "i:Ips:aB:")) != -1) {
+		switch (op) {
+
+		case 'i':
+			device = optarg;
+			break;
+
+		case 'I':
+			dorfmon = 1;
+			useactivate = 1;	/* required for rfmon */
+			break;
+
+		case 'p':
+			dopromisc = 1;
+			break;
+
+		case 's': {
+			char *end;
+
+			snaplen = strtol(optarg, &end, 0);
+			if (optarg == end || *end != '\0'
+			    || snaplen < 0 || snaplen > MAXIMUM_SNAPLEN)
+				error("invalid snaplen %s", optarg);
+			else if (snaplen == 0)
+				snaplen = MAXIMUM_SNAPLEN;
+			break;
+		}
+
+		case 'B':
+			bufsize = atoi(optarg)*1024;
+			if (bufsize <= 0)
+				error("invalid packet buffer size %s", optarg);
+			useactivate = 1;	/* required for bufsize */
+			break;
+
+		case 'a':
+			useactivate = 1;
+			break;
+
+		default:
+			usage();
+			/* NOTREACHED */
+		}
+	}
+
+	if (useactivate) {
+		pd = pcap_create(device, ebuf);
+		if (pd == NULL)
+			error("%s", ebuf);
+		status = pcap_set_snaplen(pd, snaplen);
+		if (status != 0)
+			error("%s: pcap_set_snaplen failed: %s",
+			    device, pcap_statustostr(status));
+		if (dopromisc) {
+			status = pcap_set_promisc(pd, 1);
+			if (status != 0)
+				error("%s: pcap_set_promisc failed: %s",
+				    device, pcap_statustostr(status));
+		}
+		if (dorfmon) {
+			status = pcap_set_rfmon(pd, 1);
+			if (status != 0)
+				error("%s: pcap_set_rfmon failed: %s",
+				    device, pcap_statustostr(status));
+		}
+		status = pcap_set_timeout(pd, 1000);
+		if (status != 0)
+			error("%s: pcap_set_timeout failed: %s",
+			    device, pcap_statustostr(status));
+		if (bufsize != 0) {
+			status = pcap_set_buffer_size(pd, bufsize);
+			if (status != 0)
+				error("%s: pcap_set_buffer_size failed: %s",
+				    device, pcap_statustostr(status));
+		}
+		status = pcap_activate(pd);
+		if (status < 0) {
+			/*
+			 * pcap_activate() failed.
+			 */
+			error("%s: %s\n(%s)", device,
+			    pcap_statustostr(status), pcap_geterr(pd));
+		} else if (status > 0) {
+			/*
+			 * pcap_activate() succeeded, but it's warning us
+			 * of a problem it had.
+			 */
+			warning("%s: %s\n(%s)", device,
+			    pcap_statustostr(status), pcap_geterr(pd));
+		}
+	} else {
+		*ebuf = '\0';
+		pd = pcap_open_live(device, 65535, 0, 1000, ebuf);
+		if (pd == NULL)
+			error("%s", ebuf);
+		else if (*ebuf)
+			warning("%s", ebuf);
+	}
+	pcap_close(pd);
+	exit(status < 0 ? 1 : 0);
+}
+
+static void
+usage(void)
+{
+	(void)fprintf(stderr,
+	    "Usage: %s [ -Ipa ] [ -i interface ] [ -s snaplen ] [ -B bufsize ]\n",
+	    program_name);
+	exit(1);
+}
+
+/* VARARGS */
+static void
+error(const char *fmt, ...)
+{
+	va_list ap;
+
+	(void)fprintf(stderr, "%s: ", program_name);
+	va_start(ap, fmt);
+	(void)vfprintf(stderr, fmt, ap);
+	va_end(ap);
+	if (*fmt) {
+		fmt += strlen(fmt);
+		if (fmt[-1] != '\n')
+			(void)fputc('\n', stderr);
+	}
+	exit(1);
+	/* NOTREACHED */
+}
+
+/* VARARGS */
+static void
+warning(const char *fmt, ...)
+{
+	va_list ap;
+
+	(void)fprintf(stderr, "%s: WARNING: ", program_name);
+	va_start(ap, fmt);
+	(void)vfprintf(stderr, fmt, ap);
+	va_end(ap);
+	if (*fmt) {
+		fmt += strlen(fmt);
+		if (fmt[-1] != '\n')
+			(void)fputc('\n', stderr);
+	}
+}
diff --git a/tests/pcap_compile_test.c b/tests/pcap_compile_test.c
new file mode 100644
index 0000000..e80ad62
--- /dev/null
+++ b/tests/pcap_compile_test.c
@@ -0,0 +1,11 @@
+   pcap = pcap_open_dead(link, snaplen); 
+   /* todo: hook together argv to a single string */ 
+   prog = argv[0]; 
+   if (pcap_compile(pcap, &p, prog, optimize, 0) < 0) { 
+      fprintf(stderr, pcap_geterr(pcap)); 
+      exit(1); 
+   } 
+   bpf_dump(&p, option); 
+   pcap_freecode(&p); 
+   pcap_close(pcap); 
+ 
diff --git a/tests/reactivatetest.c b/tests/reactivatetest.c
new file mode 100644
index 0000000..9031a64
--- /dev/null
+++ b/tests/reactivatetest.c
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
+ *	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.
+ */
+
+#ifndef lint
+static const char copyright[] =
+    "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
+The Regents of the University of California.  All rights reserved.\n";
+#endif
+
+#include <pcap.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+/* Forwards */
+static void error(const char *, ...);
+
+int
+main(void)
+{
+	char ebuf[PCAP_ERRBUF_SIZE];
+	pcap_t *pd;
+	int status = 0;
+
+	pd = pcap_open_live("lo0", 65535, 0, 1000, ebuf);
+	if (pd == NULL) {
+		pd = pcap_open_live("lo", 65535, 0, 1000, ebuf);
+		if (pd == NULL) {
+			error("Neither lo0 nor lo could be opened: %s",
+			    ebuf);
+			return 2;
+		}
+	}
+	status = pcap_activate(pd);
+	if (status != PCAP_ERROR_ACTIVATED) {
+		if (status == 0)
+			error("pcap_activate() of opened pcap_t succeeded");
+		else if (status == PCAP_ERROR)
+			error("pcap_activate() of opened pcap_t failed with %s, not PCAP_ERROR_ACTIVATED",
+			    pcap_geterr(pd));
+		else
+			error("pcap_activate() of opened pcap_t failed with %s, not PCAP_ERROR_ACTIVATED",
+			    pcap_statustostr(status));
+	}
+	return 0;
+}
+
+/* VARARGS */
+static void
+error(const char *fmt, ...)
+{
+	va_list ap;
+
+	(void)fprintf(stderr, "reactivatetest: ");
+	va_start(ap, fmt);
+	(void)vfprintf(stderr, fmt, ap);
+	va_end(ap);
+	if (*fmt) {
+		fmt += strlen(fmt);
+		if (fmt[-1] != '\n')
+			(void)fputc('\n', stderr);
+	}
+	exit(1);
+	/* NOTREACHED */
+}
diff --git a/tests/selpolltest.c b/tests/selpolltest.c
new file mode 100644
index 0000000..d94fb56
--- /dev/null
+++ b/tests/selpolltest.c
@@ -0,0 +1,350 @@
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
+ *	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.
+ */
+
+#ifndef lint
+static const char copyright[] =
+    "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
+The Regents of the University of California.  All rights reserved.\n";
+#endif
+
+#include <pcap.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/select.h>
+#include <poll.h>
+
+char *program_name;
+
+/* Forwards */
+static void countme(u_char *, const struct pcap_pkthdr *, const u_char *);
+static void usage(void) __attribute__((noreturn));
+static void error(const char *, ...);
+static void warning(const char *, ...);
+static char *copy_argv(char **);
+
+static pcap_t *pd;
+
+extern int optind;
+extern int opterr;
+extern char *optarg;
+
+int
+main(int argc, char **argv)
+{
+	register int op;
+	bpf_u_int32 localnet, netmask;
+	register char *cp, *cmdbuf, *device;
+	int doselect, dopoll, dotimeout, dononblock;
+	struct bpf_program fcode;
+	char ebuf[PCAP_ERRBUF_SIZE];
+	int selectable_fd;
+	int status;
+	int packet_count;
+
+	device = NULL;
+	doselect = 0;
+	dopoll = 0;
+	dotimeout = 0;
+	dononblock = 0;
+	if ((cp = strrchr(argv[0], '/')) != NULL)
+		program_name = cp + 1;
+	else
+		program_name = argv[0];
+
+	opterr = 0;
+	while ((op = getopt(argc, argv, "i:sptn")) != -1) {
+		switch (op) {
+
+		case 'i':
+			device = optarg;
+			break;
+
+		case 's':
+			doselect = 1;
+			break;
+
+		case 'p':
+			dopoll = 1;
+			break;
+
+		case 't':
+			dotimeout = 1;
+			break;
+
+		case 'n':
+			dononblock = 1;
+			break;
+
+		default:
+			usage();
+			/* NOTREACHED */
+		}
+	}
+
+	if (doselect && dopoll) {
+		fprintf(stderr, "selpolltest: choose select (-s) or poll (-p), but not both\n");
+		return 1;
+	}
+	if (dotimeout && !doselect && !dopoll) {
+		fprintf(stderr, "selpolltest: timeout (-t) requires select (-s) or poll (-p)\n");
+		return 1;
+	}
+	if (device == NULL) {
+		device = pcap_lookupdev(ebuf);
+		if (device == NULL)
+			error("%s", ebuf);
+	}
+	*ebuf = '\0';
+	pd = pcap_open_live(device, 65535, 0, 1000, ebuf);
+	if (pd == NULL)
+		error("%s", ebuf);
+	else if (*ebuf)
+		warning("%s", ebuf);
+	if (pcap_lookupnet(device, &localnet, &netmask, ebuf) < 0) {
+		localnet = 0;
+		netmask = 0;
+		warning("%s", ebuf);
+	}
+	cmdbuf = copy_argv(&argv[optind]);
+
+	if (pcap_compile(pd, &fcode, cmdbuf, 1, netmask) < 0)
+		error("%s", pcap_geterr(pd));
+
+	if (pcap_setfilter(pd, &fcode) < 0)
+		error("%s", pcap_geterr(pd));
+	if (pcap_get_selectable_fd(pd) == -1)
+		error("pcap_get_selectable_fd() fails");
+	if (dononblock) {
+		if (pcap_setnonblock(pd, 1, ebuf) == -1)
+			error("pcap_setnonblock failed: %s", ebuf);
+	}
+	selectable_fd = pcap_get_selectable_fd(pd);
+	printf("Listening on %s\n", device);
+	if (doselect) {
+		for (;;) {
+			fd_set setread, setexcept;
+			struct timeval seltimeout;
+
+			FD_ZERO(&setread);
+			FD_SET(selectable_fd, &setread);
+			FD_ZERO(&setexcept);
+			FD_SET(selectable_fd, &setexcept);
+			if (dotimeout) {
+				seltimeout.tv_sec = 0;
+				seltimeout.tv_usec = 1000;
+				status = select(selectable_fd + 1, &setread,
+				    NULL, &setexcept, &seltimeout);
+			} else {
+				status = select(selectable_fd + 1, &setread,
+				    NULL, &setexcept, NULL);
+			}
+			if (status == -1) {
+				printf("Select returns error (%s)\n",
+				    strerror(errno));
+			} else {
+				if (status == 0)
+					printf("Select timed out: ");
+				else
+					printf("Select returned a descriptor: ");
+				if (FD_ISSET(selectable_fd, &setread))
+					printf("readable, ");
+				else
+					printf("not readable, ");
+				if (FD_ISSET(selectable_fd, &setexcept))
+					printf("exceptional condition\n");
+				else
+					printf("no exceptional condition\n");
+				packet_count = 0;
+				status = pcap_dispatch(pd, -1, countme,
+				    (u_char *)&packet_count);
+				if (status < 0)
+					break;
+				printf("%d packets seen, %d packets counted after select returns\n",
+				    status, packet_count);
+			}
+		}
+	} else if (dopoll) {
+		for (;;) {
+			struct pollfd fd;
+			int polltimeout;
+
+			fd.fd = selectable_fd;
+			fd.events = POLLIN;
+			if (dotimeout)
+				polltimeout = 1;
+			else
+				polltimeout = -1;
+			status = poll(&fd, 1, polltimeout);
+			if (status == -1) {
+				printf("Poll returns error (%s)\n",
+				    strerror(errno));
+			} else {
+				if (status == 0)
+					printf("Poll timed out\n");
+				else {
+					printf("Poll returned a descriptor: ");
+					if (fd.revents & POLLIN)
+						printf("readable, ");
+					else
+						printf("not readable, ");
+					if (fd.revents & POLLERR)
+						printf("exceptional condition, ");
+					else
+						printf("no exceptional condition, ");
+					if (fd.revents & POLLHUP)
+						printf("disconnect, ");
+					else
+						printf("no disconnect, ");
+					if (fd.revents & POLLNVAL)
+						printf("invalid\n");
+					else
+						printf("not invalid\n");
+				}
+				packet_count = 0;
+				status = pcap_dispatch(pd, -1, countme,
+				    (u_char *)&packet_count);
+				if (status < 0)
+					break;
+				printf("%d packets seen, %d packets counted after poll returns\n",
+				    status, packet_count);
+			}
+		}
+	} else {
+		for (;;) {
+			packet_count = 0;
+			status = pcap_dispatch(pd, -1, countme,
+			    (u_char *)&packet_count);
+			if (status < 0)
+				break;
+			printf("%d packets seen, %d packets counted after pcap_dispatch returns\n",
+			    status, packet_count);
+		}
+	}
+	if (status == -2) {
+		/*
+		 * We got interrupted, so perhaps we didn't
+		 * manage to finish a line we were printing.
+		 * Print an extra newline, just in case.
+		 */
+		putchar('\n');
+	}
+	(void)fflush(stdout);
+	if (status == -1) {
+		/*
+		 * Error.  Report it.
+		 */
+		(void)fprintf(stderr, "%s: pcap_loop: %s\n",
+		    program_name, pcap_geterr(pd));
+	}
+	pcap_close(pd);
+	exit(status == -1 ? 1 : 0);
+}
+
+static void
+countme(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
+{
+	int *counterp = (int *)user;
+
+	(*counterp)++;
+}
+
+static void
+usage(void)
+{
+	(void)fprintf(stderr, "Usage: %s [ -sptn ] [ -i interface ] [expression]\n",
+	    program_name);
+	exit(1);
+}
+
+/* VARARGS */
+static void
+error(const char *fmt, ...)
+{
+	va_list ap;
+
+	(void)fprintf(stderr, "%s: ", program_name);
+	va_start(ap, fmt);
+	(void)vfprintf(stderr, fmt, ap);
+	va_end(ap);
+	if (*fmt) {
+		fmt += strlen(fmt);
+		if (fmt[-1] != '\n')
+			(void)fputc('\n', stderr);
+	}
+	exit(1);
+	/* NOTREACHED */
+}
+
+/* VARARGS */
+static void
+warning(const char *fmt, ...)
+{
+	va_list ap;
+
+	(void)fprintf(stderr, "%s: WARNING: ", program_name);
+	va_start(ap, fmt);
+	(void)vfprintf(stderr, fmt, ap);
+	va_end(ap);
+	if (*fmt) {
+		fmt += strlen(fmt);
+		if (fmt[-1] != '\n')
+			(void)fputc('\n', stderr);
+	}
+}
+
+/*
+ * Copy arg vector into a new buffer, concatenating arguments with spaces.
+ */
+static char *
+copy_argv(register char **argv)
+{
+	register char **p;
+	register u_int len = 0;
+	char *buf;
+	char *src, *dst;
+
+	p = argv;
+	if (*p == 0)
+		return 0;
+
+	while (*p)
+		len += strlen(*p++) + 1;
+
+	buf = (char *)malloc(len);
+	if (buf == NULL)
+		error("copy_argv: malloc");
+
+	p = argv;
+	dst = buf;
+	while ((src = *p++) != NULL) {
+		while ((*dst++ = *src++) != '\0')
+			;
+		dst[-1] = ' ';
+	}
+	dst[-1] = '\0';
+
+	return buf;
+}
diff --git a/tests/valgrindtest.c b/tests/valgrindtest.c
new file mode 100644
index 0000000..0d454d1
--- /dev/null
+++ b/tests/valgrindtest.c
@@ -0,0 +1,408 @@
+/*
+ * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
+ *	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.
+ */
+
+#ifndef lint
+static const char copyright[] _U_ =
+    "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
+The Regents of the University of California.  All rights reserved.\n";
+static const char rcsid[] _U_ =
+    "@(#) $Header: /tcpdump/master/libpcap/filtertest.c,v 1.2 2005-08-08 17:50:13 guy Exp $ (LBL)";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <arpa/inet.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
+/* BSD-flavored OS - use BPF */
+#define USE_BPF
+#elif defined(linux)
+/* Linux - use socket filters */
+#define USE_SOCKET_FILTERS
+#else
+#error "Unknown platform or platform that doesn't support Valgrind"
+#endif
+
+#if defined(USE_BPF)
+
+#include <sys/ioctl.h>
+#include <net/bpf.h>
+
+/*
+ * Make "pcap.h" not include "pcap/bpf.h"; we are going to include the
+ * native OS version, as we're going to be doing our own ioctls to
+ * make sure that, in the uninitialized-data tests, the filters aren't
+ * checked by libpcap before being handed to BPF.
+ */
+#define PCAP_DONT_INCLUDE_PCAP_BPF_H
+
+#elif defined(USE_SOCKET_FILTERS)
+
+#include <sys/socket.h>
+#include <linux/types.h>
+#include <linux/filter.h>
+
+#endif
+
+#include <pcap.h>
+#ifndef HAVE___ATTRIBUTE__
+#define __attribute__(x)
+#endif
+
+static char *program_name;
+
+/* Forwards */
+static void usage(void) __attribute__((noreturn));
+static void error(const char *, ...)
+    __attribute__((noreturn, format (printf, 1, 2)));
+static void warning(const char *, ...)
+    __attribute__((format (printf, 1, 2)));
+
+extern int optind;
+extern int opterr;
+extern char *optarg;
+
+/*
+ * On Windows, we need to open the file in binary mode, so that
+ * we get all the bytes specified by the size we get from "fstat()".
+ * On UNIX, that's not necessary.  O_BINARY is defined on Windows;
+ * we define it as 0 if it's not defined, so it does nothing.
+ */
+#ifndef O_BINARY
+#define O_BINARY	0
+#endif
+
+static char *
+read_infile(char *fname)
+{
+	register int i, fd, cc;
+	register char *cp;
+	struct stat buf;
+
+	fd = open(fname, O_RDONLY|O_BINARY);
+	if (fd < 0)
+		error("can't open %s: %s", fname, pcap_strerror(errno));
+
+	if (fstat(fd, &buf) < 0)
+		error("can't stat %s: %s", fname, pcap_strerror(errno));
+
+	cp = malloc((u_int)buf.st_size + 1);
+	if (cp == NULL)
+		error("malloc(%d) for %s: %s", (u_int)buf.st_size + 1,
+			fname, pcap_strerror(errno));
+	cc = read(fd, cp, (u_int)buf.st_size);
+	if (cc < 0)
+		error("read %s: %s", fname, pcap_strerror(errno));
+	if (cc != buf.st_size)
+		error("short read %s (%d != %d)", fname, cc, (int)buf.st_size);
+
+	close(fd);
+	/* replace "# comment" with spaces */
+	for (i = 0; i < cc; i++) {
+		if (cp[i] == '#')
+			while (i < cc && cp[i] != '\n')
+				cp[i++] = ' ';
+	}
+	cp[cc] = '\0';
+	return (cp);
+}
+
+/* VARARGS */
+static void
+error(const char *fmt, ...)
+{
+	va_list ap;
+
+	(void)fprintf(stderr, "%s: ", program_name);
+	va_start(ap, fmt);
+	(void)vfprintf(stderr, fmt, ap);
+	va_end(ap);
+	if (*fmt) {
+		fmt += strlen(fmt);
+		if (fmt[-1] != '\n')
+			(void)fputc('\n', stderr);
+	}
+	exit(1);
+	/* NOTREACHED */
+}
+
+/* VARARGS */
+static void
+warning(const char *fmt, ...)
+{
+	va_list ap;
+
+	(void)fprintf(stderr, "%s: WARNING: ", program_name);
+	va_start(ap, fmt);
+	(void)vfprintf(stderr, fmt, ap);
+	va_end(ap);
+	if (*fmt) {
+		fmt += strlen(fmt);
+		if (fmt[-1] != '\n')
+			(void)fputc('\n', stderr);
+	}
+}
+
+/*
+ * Copy arg vector into a new buffer, concatenating arguments with spaces.
+ */
+static char *
+copy_argv(register char **argv)
+{
+	register char **p;
+	register u_int len = 0;
+	char *buf;
+	char *src, *dst;
+
+	p = argv;
+	if (*p == 0)
+		return 0;
+
+	while (*p)
+		len += strlen(*p++) + 1;
+
+	buf = (char *)malloc(len);
+	if (buf == NULL)
+		error("copy_argv: malloc");
+
+	p = argv;
+	dst = buf;
+	while ((src = *p++) != NULL) {
+		while ((*dst++ = *src++) != '\0')
+			;
+		dst[-1] = ' ';
+	}
+	dst[-1] = '\0';
+
+	return buf;
+}
+
+#define INSN_COUNT	17
+
+int
+main(int argc, char **argv)
+{
+	char *cp, *device;
+	int op;
+	int dorfmon, useactivate;
+	char ebuf[PCAP_ERRBUF_SIZE];
+	char *infile;
+	char *cmdbuf;
+	pcap_t *pd;
+	int status = 0;
+	int pcap_fd;
+#if defined(USE_BPF)
+	struct bpf_program bad_fcode;
+	struct bpf_insn uninitialized[INSN_COUNT];
+#elif defined(USE_SOCKET_FILTERS)
+	struct sock_fprog bad_fcode;
+	struct sock_filter uninitialized[INSN_COUNT];
+#endif
+	struct bpf_program fcode;
+
+	device = NULL;
+	dorfmon = 0;
+	useactivate = 0;
+	infile = NULL;
+  
+	if ((cp = strrchr(argv[0], '/')) != NULL)
+		program_name = cp + 1;
+	else
+		program_name = argv[0];
+
+	opterr = 0;
+	while ((op = getopt(argc, argv, "aF:i:I")) != -1) {
+		switch (op) {
+
+		case 'a':
+			useactivate = 1;
+			break;
+
+		case 'F':
+			infile = optarg;
+			break;
+
+		case 'i':
+			device = optarg;
+			break;
+
+		case 'I':
+			dorfmon = 1;
+			useactivate = 1;	/* required for rfmon */
+			break;
+
+		default:
+			usage();
+			/* NOTREACHED */
+		}
+	}
+
+	if (device == NULL) {
+		/*
+		 * No interface specified; get whatever pcap_lookupdev()
+		 * finds.
+		 */
+		device = pcap_lookupdev(ebuf);
+		if (device == NULL) {
+			error("couldn't find interface to use: %s",
+			    ebuf);
+		}
+	}
+
+	if (infile != NULL) {
+		/*
+		 * Filter specified with "-F" and a file containing
+		 * a filter.
+		 */
+		cmdbuf = read_infile(infile);
+	} else {
+		if (optind < argc) {
+			/*
+			 * Filter specified with arguments on the
+			 * command line.
+			 */
+			cmdbuf = copy_argv(&argv[optind+1]);
+		} else {
+			/*
+			 * No filter specified; use an empty string, which
+			 * compiles to an "accept all" filter.
+			 */
+			cmdbuf = "";
+		}
+	}
+
+	if (useactivate) {
+		pd = pcap_create(device, ebuf);
+		if (pd == NULL)
+			error("%s: pcap_create() failed: %s", device, ebuf);
+		status = pcap_set_snaplen(pd, 65535);
+		if (status != 0)
+			error("%s: pcap_set_snaplen failed: %s",
+			    device, pcap_statustostr(status));
+		status = pcap_set_promisc(pd, 1);
+		if (status != 0)
+			error("%s: pcap_set_promisc failed: %s",
+			    device, pcap_statustostr(status));
+		if (dorfmon) {
+			status = pcap_set_rfmon(pd, 1);
+			if (status != 0)
+				error("%s: pcap_set_rfmon failed: %s",
+				    device, pcap_statustostr(status));
+		}
+		status = pcap_set_timeout(pd, 1000);
+		if (status != 0)
+			error("%s: pcap_set_timeout failed: %s",
+			    device, pcap_statustostr(status));
+		status = pcap_activate(pd);
+		if (status < 0) {
+			/*
+			 * pcap_activate() failed.
+			 */
+			error("%s: %s\n(%s)", device,
+			    pcap_statustostr(status), pcap_geterr(pd));
+		} else if (status > 0) {
+			/*
+			 * pcap_activate() succeeded, but it's warning us
+			 * of a problem it had.
+			 */
+			warning("%s: %s\n(%s)", device,
+			    pcap_statustostr(status), pcap_geterr(pd));
+		}
+	} else {
+		*ebuf = '\0';
+		pd = pcap_open_live(device, 65535, 1, 1000, ebuf);
+		if (pd == NULL)
+			error("%s", ebuf);
+		else if (*ebuf)
+			warning("%s", ebuf);
+	}
+
+	pcap_fd = pcap_fileno(pd);
+
+	/*
+	 * Try setting a filter with an uninitialized bpf_program
+	 * structure.  This should cause valgrind to report a
+	 * problem.
+	 *
+	 * We don't check for errors, because it could get an
+	 * error due to a bad pointer or count.
+	 */
+#if defined(USE_BPF)
+	ioctl(pcap_fd, BIOCSETF, &bad_fcode);
+#elif defined(USE_SOCKET_FILTERS)
+	setsockopt(pcap_fd, SOL_SOCKET, SO_ATTACH_FILTER, &bad_fcode,
+	    sizeof(bad_fcode));
+#endif
+
+	/*
+	 * Try setting a filter with an initialized bpf_program
+	 * structure that points to an uninitialized program.
+	 * That should also cause valgrind to report a problem.
+	 *
+	 * We don't check for errors, because it could get an
+	 * error due to a bad pointer or count.
+	 */
+#if defined(USE_BPF)
+	bad_fcode.bf_len = INSN_COUNT;
+	bad_fcode.bf_insns = uninitialized;
+	ioctl(pcap_fd, BIOCSETF, &bad_fcode);
+#elif defined(USE_SOCKET_FILTERS)
+	bad_fcode.len = INSN_COUNT;
+	bad_fcode.filter = uninitialized;
+	setsockopt(pcap_fd, SOL_SOCKET, SO_ATTACH_FILTER, &bad_fcode,
+	    sizeof(bad_fcode));
+#endif
+
+	/*
+	 * Now compile a filter and set the filter with that.
+	 * That should *not* cause valgrind to report a
+	 * problem.
+	 */
+	if (pcap_compile(pd, &fcode, cmdbuf, 1, 0) < 0)
+		error("can't compile filter: %s", pcap_geterr(pd));
+	if (pcap_setfilter(pd, &fcode) < 0)
+		error("can't set filter: %s", pcap_geterr(pd));
+
+	pcap_close(pd);
+	exit(status < 0 ? 1 : 0);
+}
+
+static void
+usage(void)
+{
+	(void)fprintf(stderr, "%s, with %s\n", program_name,
+	    pcap_lib_version());
+	(void)fprintf(stderr,
+	    "Usage: %s [-aI] [ -F file ] [ -I interface ] [ expression ]\n",
+	    program_name);
+	exit(1);
+}
diff --git a/tokdefs.h b/tokdefs.h
index 3ef6c55..75671d3 100644
--- a/tokdefs.h
+++ b/tokdefs.h
@@ -1,27 +1,35 @@
-/* A Bison parser, made by GNU Bison 2.1.  */
+/* A Bison parser, made by GNU Bison 2.5.  */
 
-/* Skeleton parser for Yacc-like parsing with Bison,
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-
-   This program is free software; you can redistribute it and/or modify
+/* Bison interface for Yacc-like parsers in C
+   
+      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+   
+   This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+   
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-
+   
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-/* As a special exception, when this file is copied by Bison into a
-   Bison output file, you may use that output file without restriction.
-   This special exception was added by the Free Software Foundation
-   in version 1.24 of Bison.  */
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+   
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
 
 /* Tokens.  */
 #ifndef YYTOKENTYPE
@@ -53,83 +61,100 @@
      IGRP = 279,
      PIM = 280,
      VRRP = 281,
-     ATALK = 282,
-     AARP = 283,
-     DECNET = 284,
-     LAT = 285,
-     SCA = 286,
-     MOPRC = 287,
-     MOPDL = 288,
-     TK_BROADCAST = 289,
-     TK_MULTICAST = 290,
-     NUM = 291,
-     INBOUND = 292,
-     OUTBOUND = 293,
-     PF_IFNAME = 294,
-     PF_RSET = 295,
-     PF_RNR = 296,
-     PF_SRNR = 297,
-     PF_REASON = 298,
-     PF_ACTION = 299,
-     LINK = 300,
-     GEQ = 301,
-     LEQ = 302,
-     NEQ = 303,
-     ID = 304,
-     EID = 305,
-     HID = 306,
-     HID6 = 307,
-     AID = 308,
-     LSH = 309,
-     RSH = 310,
-     LEN = 311,
-     IPV6 = 312,
-     ICMPV6 = 313,
-     AH = 314,
-     ESP = 315,
-     VLAN = 316,
-     MPLS = 317,
-     PPPOED = 318,
-     PPPOES = 319,
-     ISO = 320,
-     ESIS = 321,
-     CLNP = 322,
-     ISIS = 323,
-     L1 = 324,
-     L2 = 325,
-     IIH = 326,
-     LSP = 327,
-     SNP = 328,
-     CSNP = 329,
-     PSNP = 330,
-     STP = 331,
-     IPX = 332,
-     NETBEUI = 333,
-     LANE = 334,
-     LLC = 335,
-     METAC = 336,
-     BCC = 337,
-     SC = 338,
-     ILMIC = 339,
-     OAMF4EC = 340,
-     OAMF4SC = 341,
-     OAM = 342,
-     OAMF4 = 343,
-     CONNECTMSG = 344,
-     METACONNECT = 345,
-     VPI = 346,
-     VCI = 347,
-     RADIO = 348,
-     FISU = 349,
-     LSSU = 350,
-     MSU = 351,
-     SIO = 352,
-     OPC = 353,
-     DPC = 354,
-     SLS = 355,
-     AND = 356,
-     OR = 357,
-     UMINUS = 358
+     CARP = 282,
+     ATALK = 283,
+     AARP = 284,
+     DECNET = 285,
+     LAT = 286,
+     SCA = 287,
+     MOPRC = 288,
+     MOPDL = 289,
+     TK_BROADCAST = 290,
+     TK_MULTICAST = 291,
+     NUM = 292,
+     INBOUND = 293,
+     OUTBOUND = 294,
+     PF_IFNAME = 295,
+     PF_RSET = 296,
+     PF_RNR = 297,
+     PF_SRNR = 298,
+     PF_REASON = 299,
+     PF_ACTION = 300,
+     TYPE = 301,
+     SUBTYPE = 302,
+     DIR = 303,
+     ADDR1 = 304,
+     ADDR2 = 305,
+     ADDR3 = 306,
+     ADDR4 = 307,
+     RA = 308,
+     TA = 309,
+     LINK = 310,
+     GEQ = 311,
+     LEQ = 312,
+     NEQ = 313,
+     ID = 314,
+     EID = 315,
+     HID = 316,
+     HID6 = 317,
+     AID = 318,
+     LSH = 319,
+     RSH = 320,
+     LEN = 321,
+     IPV6 = 322,
+     ICMPV6 = 323,
+     AH = 324,
+     ESP = 325,
+     VLAN = 326,
+     MPLS = 327,
+     PPPOED = 328,
+     PPPOES = 329,
+     ISO = 330,
+     ESIS = 331,
+     CLNP = 332,
+     ISIS = 333,
+     L1 = 334,
+     L2 = 335,
+     IIH = 336,
+     LSP = 337,
+     SNP = 338,
+     CSNP = 339,
+     PSNP = 340,
+     STP = 341,
+     IPX = 342,
+     NETBEUI = 343,
+     LANE = 344,
+     LLC = 345,
+     METAC = 346,
+     BCC = 347,
+     SC = 348,
+     ILMIC = 349,
+     OAMF4EC = 350,
+     OAMF4SC = 351,
+     OAM = 352,
+     OAMF4 = 353,
+     CONNECTMSG = 354,
+     METACONNECT = 355,
+     VPI = 356,
+     VCI = 357,
+     RADIO = 358,
+     FISU = 359,
+     LSSU = 360,
+     MSU = 361,
+     HFISU = 362,
+     HLSSU = 363,
+     HMSU = 364,
+     SIO = 365,
+     OPC = 366,
+     DPC = 367,
+     SLS = 368,
+     HSIO = 369,
+     HOPC = 370,
+     HDPC = 371,
+     HSLS = 372,
+     AND = 373,
+     OR = 374,
+     UMINUS = 375
    };
 #endif
 /* Tokens.  */
@@ -157,90 +182,111 @@
 #define IGRP 279
 #define PIM 280
 #define VRRP 281
-#define ATALK 282
-#define AARP 283
-#define DECNET 284
-#define LAT 285
-#define SCA 286
-#define MOPRC 287
-#define MOPDL 288
-#define TK_BROADCAST 289
-#define TK_MULTICAST 290
-#define NUM 291
-#define INBOUND 292
-#define OUTBOUND 293
-#define PF_IFNAME 294
-#define PF_RSET 295
-#define PF_RNR 296
-#define PF_SRNR 297
-#define PF_REASON 298
-#define PF_ACTION 299
-#define LINK 300
-#define GEQ 301
-#define LEQ 302
-#define NEQ 303
-#define ID 304
-#define EID 305
-#define HID 306
-#define HID6 307
-#define AID 308
-#define LSH 309
-#define RSH 310
-#define LEN 311
-#define IPV6 312
-#define ICMPV6 313
-#define AH 314
-#define ESP 315
-#define VLAN 316
-#define MPLS 317
-#define PPPOED 318
-#define PPPOES 319
-#define ISO 320
-#define ESIS 321
-#define CLNP 322
-#define ISIS 323
-#define L1 324
-#define L2 325
-#define IIH 326
-#define LSP 327
-#define SNP 328
-#define CSNP 329
-#define PSNP 330
-#define STP 331
-#define IPX 332
-#define NETBEUI 333
-#define LANE 334
-#define LLC 335
-#define METAC 336
-#define BCC 337
-#define SC 338
-#define ILMIC 339
-#define OAMF4EC 340
-#define OAMF4SC 341
-#define OAM 342
-#define OAMF4 343
-#define CONNECTMSG 344
-#define METACONNECT 345
-#define VPI 346
-#define VCI 347
-#define RADIO 348
-#define FISU 349
-#define LSSU 350
-#define MSU 351
-#define SIO 352
-#define OPC 353
-#define DPC 354
-#define SLS 355
-#define AND 356
-#define OR 357
-#define UMINUS 358
+#define CARP 282
+#define ATALK 283
+#define AARP 284
+#define DECNET 285
+#define LAT 286
+#define SCA 287
+#define MOPRC 288
+#define MOPDL 289
+#define TK_BROADCAST 290
+#define TK_MULTICAST 291
+#define NUM 292
+#define INBOUND 293
+#define OUTBOUND 294
+#define PF_IFNAME 295
+#define PF_RSET 296
+#define PF_RNR 297
+#define PF_SRNR 298
+#define PF_REASON 299
+#define PF_ACTION 300
+#define TYPE 301
+#define SUBTYPE 302
+#define DIR 303
+#define ADDR1 304
+#define ADDR2 305
+#define ADDR3 306
+#define ADDR4 307
+#define RA 308
+#define TA 309
+#define LINK 310
+#define GEQ 311
+#define LEQ 312
+#define NEQ 313
+#define ID 314
+#define EID 315
+#define HID 316
+#define HID6 317
+#define AID 318
+#define LSH 319
+#define RSH 320
+#define LEN 321
+#define IPV6 322
+#define ICMPV6 323
+#define AH 324
+#define ESP 325
+#define VLAN 326
+#define MPLS 327
+#define PPPOED 328
+#define PPPOES 329
+#define ISO 330
+#define ESIS 331
+#define CLNP 332
+#define ISIS 333
+#define L1 334
+#define L2 335
+#define IIH 336
+#define LSP 337
+#define SNP 338
+#define CSNP 339
+#define PSNP 340
+#define STP 341
+#define IPX 342
+#define NETBEUI 343
+#define LANE 344
+#define LLC 345
+#define METAC 346
+#define BCC 347
+#define SC 348
+#define ILMIC 349
+#define OAMF4EC 350
+#define OAMF4SC 351
+#define OAM 352
+#define OAMF4 353
+#define CONNECTMSG 354
+#define METACONNECT 355
+#define VPI 356
+#define VCI 357
+#define RADIO 358
+#define FISU 359
+#define LSSU 360
+#define MSU 361
+#define HFISU 362
+#define HLSSU 363
+#define HMSU 364
+#define SIO 365
+#define OPC 366
+#define DPC 367
+#define SLS 368
+#define HSIO 369
+#define HOPC 370
+#define HDPC 371
+#define HSLS 372
+#define AND 373
+#define OR 374
+#define UMINUS 375
 
 
 
 
-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 138 "grammar.y"
-typedef union YYSTYPE {
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+{
+
+/* Line 2068 of yacc.c  */
+#line 242 "grammar.y"
+
 	int i;
 	bpf_u_int32 h;
 	u_char *e;
@@ -254,15 +300,17 @@
 		struct block *b;
 	} blk;
 	struct block *rblk;
+
+
+
+/* Line 2068 of yacc.c  */
+#line 308 "y.tab.h"
 } YYSTYPE;
-/* Line 1447 of yacc.c.  */
-#line 260 "y.tab.h"
+# define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
 #endif
 
 extern YYSTYPE pcap_lval;
 
 
-
diff --git a/version.c b/version.c
index 5953bcd..795bf1e 100644
--- a/version.c
+++ b/version.c
@@ -1 +1 @@
-char pcap_version[] = "0.9.8";
+char pcap_version[] = "1.5.2";
diff --git a/version.h b/version.h
index 2fa02b6..29c81da 100644
--- a/version.h
+++ b/version.h
@@ -1 +1 @@
-static const char pcap_version_string[] = "libpcap version 0.9.8";
+static const char pcap_version_string[] = "libpcap version 1.5.2";
diff --git a/wlan_filtering.patch b/wlan_filtering.patch
deleted file mode 100644
index 681745a..0000000
--- a/wlan_filtering.patch
+++ /dev/null
@@ -1,384 +0,0 @@
---- gencode.c.cvs	2007-06-14 13:54:12.000000000 -0700
-+++ gencode.c	2007-06-14 13:56:27.531250000 -0700
-@@ -24,6 +24,8 @@
-     "@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.221.2.51 2007/06/14 20:54:12 gianluca Exp $ (LBL)";
- #endif
- 
-+#define ENABLE_WLAN_FILTERING_PATCH
-+
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
-@@ -144,7 +146,8 @@
- 	OR_NET,		/* relative to the network-layer header */
- 	OR_NET_NOSNAP,	/* relative to the network-layer header, with no SNAP header at the link layer */
- 	OR_TRAN_IPV4,	/* relative to the transport-layer header, with IPv4 network layer */
--	OR_TRAN_IPV6	/* relative to the transport-layer header, with IPv6 network layer */
-+	OR_TRAN_IPV6,	/* relative to the transport-layer header, with IPv6 network layer */
-+	OR_LINK_AFTER_WIRELESS_HDR /* After the 802.11 variable length header */
- };
- 
- /*
-@@ -199,6 +202,7 @@
- static struct block *gen_linktype(int);
- static struct block *gen_snap(bpf_u_int32, bpf_u_int32, u_int);
- static struct block *gen_llc_linktype(int);
-+static struct block *gen_802_11_llc_linktype(int);
- static struct block *gen_hostop(bpf_u_int32, bpf_u_int32, int, int, u_int, u_int);
- #ifdef INET6
- static struct block *gen_hostop6(struct in6_addr *, struct in6_addr *, int, int, u_int, u_int);
-@@ -242,6 +246,7 @@
- static struct slist *xfer_to_a(struct arth *);
- static struct block *gen_mac_multicast(int);
- static struct block *gen_len(int, int);
-+static struct block *gen_check_802_11_data_frame();
- 
- static struct block *gen_ppi_dlt_check();
- static struct block *gen_msg_abbrev(int type);
-@@ -1345,6 +1350,138 @@
- 	return s;
- }
- 
-+/*
-+ * Load a value relative to the beginning of the link-layer header after the 802.11
-+ * header, i.e. LLC_SNAP.
-+ * The link-layer header doesn't necessarily begin at the beginning
-+ * of the packet data; there might be a variable-length prefix containing
-+ * radio information.
-+ */
-+static struct slist *
-+gen_load_ll_after_802_11_rel(offset, size)
-+	u_int offset, size;
-+{
-+	struct slist *s, *s_load_fc;
-+	struct slist *sjset_qos;
-+	struct slist *s_load;
-+	struct slist *s_ld_a_2;
-+	struct slist *s_add_a_x;
-+	struct slist *s_a_to_x;
-+	struct slist *sjset_data_frame_1;
-+	struct slist *sjset_data_frame_2;
-+	struct slist *s_load_x_0;	
-+
-+	/*
-+	 * This code is not compatible with the optimizer, as
-+	 * we are generating jmp instructions within a normal
-+	 * slist of instructions
-+	 *
-+	 */
-+	no_optimize = 1;
-+	
-+	s = gen_llprefixlen();
-+
-+	/*
-+	 * If "s" is non-null, it has code to arrange that the X register
-+	 * contains the length of the prefix preceding the link-layer
-+	 * header.
-+	 *
-+	 * Otherwise, the length of the prefix preceding the link-layer
-+	 * header is "off_ll".
-+	 */
-+	if (s != NULL) {
-+		/*
-+		 * There's a variable-length prefix preceding the
-+		 * link-layer header.  "s" points to a list of statements
-+		 * that put the length of that prefix into the X register.
-+		 * do an indirect load, to use the X register as an offset.
-+		 */
-+
-+		/*
-+		 * Load the Frame Control field
-+		 */
-+		s_load_fc = new_stmt(BPF_LD|BPF_IND|BPF_B);
-+		s_load_fc->s.k = 0;
-+	} else {
-+		/*
-+		 * There is no variable-length header preceding the
-+		 * link-layer header; add in off_ll, which, if there's
-+		 * a fixed-length header preceding the link-layer header,
-+		 * is the length of that header.
-+		 */
-+
-+		/*
-+		 * We need to load the Frame control directly, and
-+		 * then load X with a fake 0, i.e. the length of the 
-+		 * non-existing prepended header
-+		 */
-+
-+		/*
-+		 * TODO GV: I'm not sure if 0 is the right constant in this
-+		 * case. If the link layer has a fixed length prepended header,
-+		 * that should be the value that we put here
-+		 */
-+
-+		/* Load 0 into X */
-+		s_load_x_0 = new_stmt(BPF_LDX|BPF_IMM);
-+		s_load_x_0->s.k = 0;
-+
-+		/*
-+		 * TODO GV: I'm not sure if 0 is the right constant in this
-+		 * case. If the link layer has a fixed length prepended header,
-+		 * that should be the value that we put here
-+		 */
-+
-+		/*
-+		 * load the Frame Control with absolute access
-+		 */
-+		s_load_fc = new_stmt(BPF_LD|BPF_ABS|BPF_B);
-+		s_load_fc->s.k = 0;
-+		s = s_load_x_0;
-+	}
-+
-+	/*
-+	 * Generate the common instructions to check if it's a data frame
-+	 * and if so compute the 802.11 header length
-+	 */
-+	sjset_data_frame_1 = new_stmt(JMP(BPF_JSET));	// b3 should be 1
-+	sjset_data_frame_1->s.k = 0x8;
-+		
-+	sjset_data_frame_2 = new_stmt(JMP(BPF_JSET));	// b2 should be 0
-+	sjset_data_frame_2->s.k = 0x04;
-+
-+	sjset_qos = new_stmt(JMP(BPF_JSET));
-+	sjset_qos->s.k = 0x80; //QOS bit
-+		
-+	s_ld_a_2 = new_stmt(BPF_LD|BPF_IMM);
-+	s_ld_a_2->s.k = 2;
-+
-+	s_add_a_x = new_stmt(BPF_ALU|BPF_ADD|BPF_X);
-+	s_a_to_x = new_stmt(BPF_MISC|BPF_TAX);
-+
-+	s_load = new_stmt(BPF_LD|BPF_IND|size);
-+	s_load->s.k = offset;
-+
-+	sjset_data_frame_1->s.jt = sjset_data_frame_2;
-+	sjset_data_frame_1->s.jf = s_load;
-+		
-+	sjset_data_frame_2->s.jt = s_load;
-+	sjset_data_frame_2->s.jf = sjset_qos;
-+		
-+	sjset_qos->s.jt = s_ld_a_2;
-+	sjset_qos->s.jf = s_load;
-+
-+	sappend(s, s_load_fc);
-+	sappend(s_load_fc, sjset_data_frame_1);
-+	sappend(sjset_data_frame_1, sjset_data_frame_2);
-+	sappend(sjset_data_frame_2, sjset_qos);
-+	sappend(sjset_qos, s_ld_a_2);
-+	sappend(s_ld_a_2, s_add_a_x);
-+	sappend(s_add_a_x,s_a_to_x);
-+	sappend(s_a_to_x, s_load);
-+	
-+	return s;
-+}
- 
- /*
-  * Load a value relative to the beginning of the specified header.
-@@ -1367,6 +1504,22 @@
- 		s = gen_load_llrel(offset, size);
- 		break;
- 
-+#ifdef ENABLE_WLAN_FILTERING_PATCH
-+
-+	case OR_LINK_AFTER_WIRELESS_HDR:
-+		if (linktype != DLT_IEEE802_11_RADIO 
-+			&& linktype != DLT_PPI 
-+			&& linktype != DLT_IEEE802_11 
-+			&& linktype != DLT_PRISM_HEADER
-+			&& linktype != DLT_IEEE802_11_RADIO_AVS)
-+		{
-+			abort();
-+			return NULL;
-+		}
-+		s = gen_load_ll_after_802_11_rel(offset + 24, size);
-+		break;
-+#endif /* ENABLE_WLAN_FILTERING_PATCH */
-+
- 	case OR_NET:
- 		s = gen_load_llrel(off_nl + offset, size);
- 		break;
-@@ -2163,11 +2316,17 @@
- 		break;
- 
- 	case DLT_PPI:
-+	case DLT_IEEE802_11_RADIO:
-+	case DLT_IEEE802_11:
-+#ifdef ENABLE_WLAN_FILTERING_PATCH
-+		return gen_802_11_llc_linktype(proto);
-+		/*NOTREACHED*/
-+		break;
-+#endif /* ENABLE_WLAN_FILTERING_PATCH */
-+
- 	case DLT_FDDI:
- 	case DLT_IEEE802:
--	case DLT_IEEE802_11:
- 	case DLT_IEEE802_11_RADIO_AVS:
--	case DLT_IEEE802_11_RADIO:
- 	case DLT_PRISM_HEADER:
- 	case DLT_ATM_RFC1483:
- 	case DLT_ATM_CLIP:
-@@ -2711,6 +2870,113 @@
- 	}
- }
- 
-+/*
-+ * Generate code to match a particular packet type, for link-layer types
-+ * using 802.2 LLC headers.
-+ *
-+ * This is *NOT* used for Ethernet; "gen_ether_linktype()" is used
-+ * for that - it handles the D/I/X Ethernet vs. 802.3+802.2 issues.
-+ *
-+ * "proto" is an Ethernet type value, if > ETHERMTU, or an LLC SAP
-+ * value, if <= ETHERMTU.  We use that to determine whether to
-+ * match the DSAP or both DSAP and LSAP or to check the OUI and
-+ * protocol ID in a SNAP header.
-+ */
-+static struct block *
-+gen_802_11_llc_linktype(proto)
-+	int proto;
-+{
-+	struct block *b_check_data_frame;
-+	struct block *b_check_linktype;
-+
-+	b_check_data_frame = gen_check_802_11_data_frame();
-+
-+	/*
-+	 * XXX - generate the code that discards non data frames
-+	 */
-+	switch (proto) {
-+
-+	case LLCSAP_IP:
-+	case LLCSAP_ISONS:
-+	case LLCSAP_NETBEUI:
-+		/*
-+		 * XXX - should we check both the DSAP and the
-+		 * SSAP, like this, or should we check just the
-+		 * DSAP, as we do for other types <= ETHERMTU
-+		 * (i.e., other SAP values)?
-+		 */
-+		b_check_linktype = gen_cmp(OR_LINK_AFTER_WIRELESS_HDR, 0, BPF_H, (bpf_u_int32)
-+			     ((proto << 8) | proto));
-+		break;
-+
-+	case LLCSAP_IPX:
-+		/*
-+		 * XXX - are there ever SNAP frames for IPX on
-+		 * non-Ethernet 802.x networks?
-+		 */
-+		b_check_linktype = gen_cmp(OR_LINK_AFTER_WIRELESS_HDR, 0, BPF_B,
-+		    (bpf_int32)LLCSAP_IPX);
-+
-+		break;
-+
-+#if 0
-+	case ETHERTYPE_ATALK:
-+		/*
-+		 * 802.2-encapsulated ETHERTYPE_ATALK packets are
-+		 * SNAP packets with an organization code of
-+		 * 0x080007 (Apple, for Appletalk) and a protocol
-+		 * type of ETHERTYPE_ATALK (Appletalk).
-+		 *
-+		 * XXX - check for an organization code of
-+		 * encapsulated Ethernet as well?
-+		 */
-+		return gen_snap(0x080007, ETHERTYPE_ATALK, off_linktype);
-+#endif
-+	default:
-+		/*
-+		 * XXX - we don't have to check for IPX 802.3
-+		 * here, but should we check for the IPX Ethertype?
-+		 */
-+		if (proto <= ETHERMTU) {
-+			/*
-+			 * This is an LLC SAP value, so check
-+			 * the DSAP.
-+			 */
-+			b_check_linktype = gen_cmp(OR_LINK_AFTER_WIRELESS_HDR, 0, BPF_B,
-+			    (bpf_int32)proto);
-+		} else {
-+			/*
-+			 * This is an Ethernet type; we assume that it's
-+			 * unlikely that it'll appear in the right place
-+			 * at random, and therefore check only the
-+			 * location that would hold the Ethernet type
-+			 * in a SNAP frame with an organization code of
-+			 * 0x000000 (encapsulated Ethernet).
-+			 *
-+			 * XXX - if we were to check for the SNAP DSAP and
-+			 * LSAP, as per XXX, and were also to check for an
-+			 * organization code of 0x000000 (encapsulated
-+			 * Ethernet), we'd do
-+			 *
-+			 *	return gen_snap(0x000000, proto,
-+			 *	    off_linktype);
-+			 *
-+			 * here; for now, we don't, as per the above.
-+			 * I don't know whether it's worth the extra CPU
-+			 * time to do the right check or not.
-+			 */
-+			b_check_linktype = gen_cmp(OR_LINK_AFTER_WIRELESS_HDR, 0+6, BPF_H,
-+			    (bpf_int32)proto);
-+		}
-+	}
-+
-+	gen_and(b_check_data_frame, b_check_linktype);
-+	return b_check_linktype;
-+
-+}
-+
-+
-+
- static struct block *
- gen_hostop(addr, mask, dir, proto, src_off, dst_off)
- 	bpf_u_int32 addr;
-@@ -2925,6 +3191,17 @@
- 	register struct block *b0, *b1, *b2;
- 	register struct slist *s;
- 
-+#ifdef ENABLE_WLAN_FILTERING_PATCH
-+	/*
-+	 * TODO GV 20070613
-+	 * We need to disable the optimizer because the optimizer is buggy
-+	 * and wipes out some LD instructions generated by the below
-+	 * code to validate the Frame Control bits
-+	 *
-+	 */
-+	no_optimize = 1;
-+#endif /* ENABLE_WLAN_FILTERING_PATCH */
-+
- 	switch (dir) {
- 	case Q_SRC:
- 		/*
-@@ -4713,6 +4990,32 @@
- #endif
- }
- 
-+static struct block *
-+gen_check_802_11_data_frame()
-+{
-+	struct slist *s;
-+	struct block *b0, *b1;
-+	/*
-+	* Now check for a data frame.
-+	* I.e, check "link[0] & 0x08".
-+	*/
-+	s = gen_load_a(OR_LINK, 0, BPF_B);
-+	b0 = new_block(JMP(BPF_JSET));
-+	b0->s.k = 0x08;
-+	b0->stmts = s;
-+	
-+	s = gen_load_a(OR_LINK, 0, BPF_B);
-+	b1 = new_block(JMP(BPF_JSET));
-+	b1->s.k = 0x04;
-+	b1->stmts = s;
-+	gen_not(b1);
-+	
-+
-+	gen_and(b1, b0);
-+
-+	return b0;
-+}
-+
- 
- /*
-  * Generate code that checks whether the packet is a packet for protocol