Endace DAG devices.
optimize.c
pcap-bpf.c
pcap-bpf.h
+pcap-dag.c
+pcap-dag.h
pcap-dlpi.c
pcap-enet.c
pcap-int.h
-@(#) $Header: /tcpdump/master/libpcap/INSTALL.txt,v 1.5 2003-03-11 06:23:52 guy Exp $ (LBL)
+@(#) $Header: /tcpdump/master/libpcap/INSTALL.txt,v 1.6 2003-07-23 05:29:19 guy Exp $ (LBL)
To build libpcap, run "./configure" (a shell script). The configure
script will determine your system attributes and generate an
net - symlink to bpf/net
optimize.c - BPF optimization routines
pcap-bpf.c - BSD Packet Filter support
+pcap-bpf.h - BPF definitions
+pcap-dag.c - Endace DAG device capture support
+pcap-dag.h - Endace DAG device capture support
pcap-dlpi.c - Data Link Provider Interface support
pcap-enet.c - enet support
pcap-int.h - internal libpcap definitions
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
-# @(#) $Header: /tcpdump/master/libpcap/Makefile.in,v 1.95 2003-02-21 03:19:19 guy Exp $ (LBL)
+# @(#) $Header: /tcpdump/master/libpcap/Makefile.in,v 1.96 2003-07-23 05:29:20 guy Exp $ (LBL)
#
# Various configurable paths (remember to edit Makefile.in, not Makefile)
CC = @CC@
CCOPT = @V_CCOPT@
INCLS = -I. @V_INCLS@
-DEFS = @DEFS@
+DEFS = @DEFS@ @V_DEFS@
+LIBS = @V_LIBS@
# Standard CFLAGS
CFLAGS = $(CCOPT) $(INCLS) $(DEFS)
+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
LIBOBJS = @LIBOBJS@
-SRC = $(PSRC) $(FSRC) $(CSRC) $(GENSRC)
+SRC = $(PSRC) $(FSRC) $(CSRC) $(SSRC) $(GENSRC)
# 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) $(GENSRC:.c=.o) # $(LIBOBJS)
+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 = \
libpcap.a: $(OBJ)
@rm -f $@
- ar rc $@ $(OBJ)
+ ar rc $@ $(OBJ) $(LIBS)
$(RANLIB) $@
scanner.c: $(srcdir)/scanner.l
/* define if you have a /proc/net/dev */
#undef HAVE_PROC_NET_DEV
+/* define if you have a DAG API */
+#undef HAVE_DAG_API
+
/* define on AIX to get certain functions */
#undef _SUN
#! /bin/sh
-# From configure.in Revision: 1.98
+# From configure.in Revision: 1.99
--enable-optimizer-dbg build optimizer debugging code"
ac_help="$ac_help
--enable-yydebug build parser debugging code"
+ac_help="$ac_help
+ --with-dag=DIR include DAG support from DIR"
ac_help="$ac_help
--without-flex don't use flex"
ac_help="$ac_help
fi
echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:638: checking host system type" >&5
+echo "configure:640: checking host system type" >&5
host_alias=$host
case "$host_alias" in
echo "$ac_t""$host" 1>&6
echo $ac_n "checking target system type""... $ac_c" 1>&6
-echo "configure:659: checking target system type" >&5
+echo "configure:661: checking target system type" >&5
target_alias=$target
case "$target_alias" in
echo "$ac_t""$target" 1>&6
echo $ac_n "checking build system type""... $ac_c" 1>&6
-echo "configure:677: checking build system type" >&5
+echo "configure:679: checking build system type" >&5
build_alias=$build
case "$build_alias" in
# Extract the first word of "shlicc2", so it can be a program name with args.
set dummy shlicc2; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:725: checking for $ac_word" >&5
+echo "configure:727: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_SHLICC2'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:766: checking for $ac_word" >&5
+echo "configure:768: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:796: checking for $ac_word" >&5
+echo "configure:798: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
# Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:847: checking for $ac_word" >&5
+echo "configure:849: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:879: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:881: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
cat > conftest.$ac_ext << EOF
-#line 890 "configure"
+#line 892 "configure"
#include "confdefs.h"
main(){return(0);}
EOF
-if { (eval echo configure:895: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:897: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:921: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:923: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:926: checking whether we are using GNU C" >&5
+echo "configure:928: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
yes;
#endif
EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:935: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:937: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:954: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:956: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
V_CCOPT="-O2"
else
echo $ac_n "checking gcc version""... $ac_c" 1>&6
-echo "configure:991: checking gcc version" >&5
+echo "configure:993: checking gcc version" >&5
if eval "test \"`echo '$''{'ac_cv_lbl_gcc_vers'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
fi
else
echo $ac_n "checking that $CC handles ansi prototypes""... $ac_c" 1>&6
-echo "configure:1009: checking that $CC handles ansi prototypes" >&5
+echo "configure:1011: checking that $CC handles ansi prototypes" >&5
if eval "test \"`echo '$''{'ac_cv_lbl_cc_ansi_prototypes'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1014 "configure"
+#line 1016 "configure"
#include "confdefs.h"
#include <sys/types.h>
int main() {
int frob(int, char *)
; return 0; }
EOF
-if { (eval echo configure:1021: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1023: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_lbl_cc_ansi_prototypes=yes
else
hpux*)
echo $ac_n "checking for HP-UX ansi compiler ($CC -Aa -D_HPUX_SOURCE)""... $ac_c" 1>&6
-echo "configure:1039: checking for HP-UX ansi compiler ($CC -Aa -D_HPUX_SOURCE)" >&5
+echo "configure:1041: checking for HP-UX ansi compiler ($CC -Aa -D_HPUX_SOURCE)" >&5
savedcflags="$CFLAGS"
CFLAGS="-Aa -D_HPUX_SOURCE $CFLAGS"
if eval "test \"`echo '$''{'ac_cv_lbl_cc_hpux_cc_aa'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1046 "configure"
+#line 1048 "configure"
#include "confdefs.h"
#include <sys/types.h>
int main() {
int frob(int, char *)
; return 0; }
EOF
-if { (eval echo configure:1053: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1055: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_lbl_cc_hpux_cc_aa=yes
else
ultrix*)
echo $ac_n "checking that Ultrix $CC hacks const in prototypes""... $ac_c" 1>&6
-echo "configure:1097: checking that Ultrix $CC hacks const in prototypes" >&5
+echo "configure:1099: checking that Ultrix $CC hacks const in prototypes" >&5
if eval "test \"`echo '$''{'ac_cv_lbl_cc_const_proto'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1102 "configure"
+#line 1104 "configure"
#include "confdefs.h"
#include <sys/types.h>
int main() {
void c(const struct a *)
; return 0; }
EOF
-if { (eval echo configure:1110: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1112: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_lbl_cc_const_proto=yes
else
fi
echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:1134: checking for inline" >&5
+echo "configure:1136: checking for inline" >&5
if eval "test \"`echo '$''{'ac_cv_lbl_inline'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
for ac_lbl_inline in inline __inline__ __inline
do
cat > conftest.$ac_ext <<EOF
-#line 1144 "configure"
+#line 1146 "configure"
#include "confdefs.h"
#define inline $ac_lbl_inline
static inline struct iltest *foo(void);
; return 0; }
EOF
-if { (eval echo configure:1164: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1166: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_lbl_cc_inline=yes
else
echo $ac_n "checking for __attribute__""... $ac_c" 1>&6
-echo "configure:1192: checking for __attribute__" >&5
+echo "configure:1194: checking for __attribute__" >&5
if eval "test \"`echo '$''{'ac_cv___attribute__'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1198 "configure"
+#line 1200 "configure"
#include "confdefs.h"
#include <stdlib.h>
; return 0; }
EOF
-if { (eval echo configure:1215: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1217: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv___attribute__=yes
else
echo $ac_n "checking for u_int8_t using $CC""... $ac_c" 1>&6
-echo "configure:1237: checking for u_int8_t using $CC" >&5
+echo "configure:1239: checking for u_int8_t using $CC" >&5
if eval "test \"`echo '$''{'ac_cv_lbl_have_u_int8_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1242 "configure"
+#line 1244 "configure"
#include "confdefs.h"
# include "confdefs.h"
u_int8_t i
; return 0; }
EOF
-if { (eval echo configure:1255: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1257: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_lbl_have_u_int8_t=yes
else
fi
echo $ac_n "checking for u_int16_t using $CC""... $ac_c" 1>&6
-echo "configure:1275: checking for u_int16_t using $CC" >&5
+echo "configure:1277: checking for u_int16_t using $CC" >&5
if eval "test \"`echo '$''{'ac_cv_lbl_have_u_int16_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1280 "configure"
+#line 1282 "configure"
#include "confdefs.h"
# include "confdefs.h"
u_int16_t i
; return 0; }
EOF
-if { (eval echo configure:1293: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1295: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_lbl_have_u_int16_t=yes
else
fi
echo $ac_n "checking for u_int32_t using $CC""... $ac_c" 1>&6
-echo "configure:1313: checking for u_int32_t using $CC" >&5
+echo "configure:1315: checking for u_int32_t using $CC" >&5
if eval "test \"`echo '$''{'ac_cv_lbl_have_u_int32_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1318 "configure"
+#line 1320 "configure"
#include "confdefs.h"
# include "confdefs.h"
u_int32_t i
; return 0; }
EOF
-if { (eval echo configure:1331: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1333: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_lbl_have_u_int32_t=yes
else
fi
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1352: checking how to run the C preprocessor" >&5
+echo "configure:1354: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
-#line 1367 "configure"
+#line 1369 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1373: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1375: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
-#line 1384 "configure"
+#line 1386 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1390: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1392: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
rm -rf conftest*
CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF
-#line 1401 "configure"
+#line 1403 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1407: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1409: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1435: checking for $ac_hdr" >&5
+echo "configure:1437: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1440 "configure"
+#line 1442 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1445: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1447: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
if test "$GCC" = yes ; then
echo $ac_n "checking for ANSI ioctl definitions""... $ac_c" 1>&6
-echo "configure:1474: checking for ANSI ioctl definitions" >&5
+echo "configure:1476: checking for ANSI ioctl definitions" >&5
if eval "test \"`echo '$''{'ac_cv_lbl_gcc_fixincludes'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1479 "configure"
+#line 1481 "configure"
#include "confdefs.h"
/*
* This generates a "duplicate case value" when fixincludes
}
; return 0; }
EOF
-if { (eval echo configure:1498: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1500: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_lbl_gcc_fixincludes=yes
else
for ac_func in ether_hostton strerror strlcpy
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:1521: checking for $ac_func" >&5
+echo "configure:1523: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1526 "configure"
+#line 1528 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
; return 0; }
EOF
-if { (eval echo configure:1549: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1551: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
echo $ac_n "checking if --disable-protochain option is specified""... $ac_c" 1>&6
-echo "configure:1575: checking if --disable-protochain option is specified" >&5
+echo "configure:1577: checking if --disable-protochain option is specified" >&5
# Check whether --enable-protochain or --disable-protochain was given.
if test "${enable_protochain+set}" = set; then
enableval="$enable_protochain"
fi
echo $ac_n "checking packet capture type""... $ac_c" 1>&6
-echo "configure:1606: checking packet capture type" >&5
+echo "configure:1608: checking packet capture type" >&5
if test ! -z "$with_pcap" ; then
V_PCAP="$withval"
elif test -r /dev/bpf0 ; then
echo "$ac_t""$V_PCAP" 1>&6
echo $ac_n "checking for getifaddrs""... $ac_c" 1>&6
-echo "configure:1644: checking for getifaddrs" >&5
+echo "configure:1646: checking for getifaddrs" >&5
if eval "test \"`echo '$''{'ac_cv_func_getifaddrs'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1649 "configure"
+#line 1651 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char getifaddrs(); below. */
; return 0; }
EOF
-if { (eval echo configure:1672: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1674: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_getifaddrs=yes"
else
# or it might be some other OS, with just SIOCGIFCONF.
#
echo $ac_n "checking whether we have SIOCGLIFCONF""... $ac_c" 1>&6
-echo "configure:1710: checking whether we have SIOCGLIFCONF" >&5
+echo "configure:1712: checking whether we have SIOCGLIFCONF" >&5
if eval "test \"`echo '$''{'ac_cv_lbl_have_siocglifconf'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1715 "configure"
+#line 1717 "configure"
#include "confdefs.h"
#include <sys/param.h>
#include <sys/file.h>
ioctl(0, SIOCGLIFCONF, (char *)0);
; return 0; }
EOF
-if { (eval echo configure:1726: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1728: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_lbl_have_siocglifconf=yes
else
echo $ac_n "checking if --enable-ipv6 option is specified""... $ac_c" 1>&6
-echo "configure:1768: checking if --enable-ipv6 option is specified" >&5
+echo "configure:1770: checking if --enable-ipv6 option is specified" >&5
# Check whether --enable-ipv6 or --disable-ipv6 was given.
if test "${enable_ipv6+set}" = set; then
enableval="$enable_ipv6"
echo "$ac_t""${enable_ipv6-no}" 1>&6
echo $ac_n "checking whether to build optimizer debugging code""... $ac_c" 1>&6
-echo "configure:1784: checking whether to build optimizer debugging code" >&5
+echo "configure:1786: checking whether to build optimizer debugging code" >&5
# Check whether --enable-optimizer-dbg or --disable-optimizer-dbg was given.
if test "${enable_optimizer_dbg+set}" = set; then
enableval="$enable_optimizer_dbg"
echo "$ac_t""${enable_optimizer_dbg-no}" 1>&6
echo $ac_n "checking whether to build parser debugging code""... $ac_c" 1>&6
-echo "configure:1800: checking whether to build parser debugging code" >&5
+echo "configure:1802: checking whether to build parser debugging code" >&5
# Check whether --enable-yydebug or --disable-yydebug was given.
if test "${enable_yydebug+set}" = set; then
enableval="$enable_yydebug"
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1822: checking for $ac_hdr" >&5
+echo "configure:1824: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1827 "configure"
+#line 1829 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1832: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1834: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
done
echo $ac_n "checking for /dev/dlpi device""... $ac_c" 1>&6
-echo "configure:1859: checking for /dev/dlpi device" >&5
+echo "configure:1861: checking for /dev/dlpi device" >&5
if test -c /dev/dlpi ; then
echo "$ac_t""yes" 1>&6
cat >> confdefs.h <<\EOF
echo "$ac_t""no" 1>&6
dir="/dev/dlpi"
echo $ac_n "checking for $dir directory""... $ac_c" 1>&6
-echo "configure:1870: checking for $dir directory" >&5
+echo "configure:1872: checking for $dir directory" >&5
if test -d $dir ; then
echo "$ac_t""yes" 1>&6
cat >> confdefs.h <<EOF
linux)
echo $ac_n "checking Linux kernel version""... $ac_c" 1>&6
-echo "configure:1885: checking Linux kernel version" >&5
+echo "configure:1887: checking Linux kernel version" >&5
if test "$cross_compiling" = yes; then
if eval "test \"`echo '$''{'ac_cv_linux_vers'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
{ echo "configure: error: version 2 or higher required; see the INSTALL doc for more info" 1>&2; exit 1; }
fi
echo $ac_n "checking if if_packet.h has tpacket_stats defined""... $ac_c" 1>&6
-echo "configure:1910: checking if if_packet.h has tpacket_stats defined" >&5
+echo "configure:1912: checking if if_packet.h has tpacket_stats defined" >&5
if eval "test \"`echo '$''{'ac_cv_lbl_tpacket_stats'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1915 "configure"
+#line 1917 "configure"
#include "confdefs.h"
# include <linux/if_packet.h>
struct tpacket_stats stats
; return 0; }
EOF
-if { (eval echo configure:1923: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1925: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_lbl_tpacket_stats=yes
else
fi
;;
+dag)
+ V_DEFS="$V_DEFS -DDAG_ONLY"
+ ;;
+
null)
echo "configure: warning: cannot determine packet capture interface" 1>&2
echo "configure: warning: (see the INSTALL doc for more info)" 1>&2
esac
echo $ac_n "checking whether we have /proc/net/dev""... $ac_c" 1>&6
-echo "configure:1952: checking whether we have /proc/net/dev" >&5
+echo "configure:1958: checking whether we have /proc/net/dev" >&5
if test -r /proc/net/dev ; then
ac_cv_lbl_proc_net_dev=yes
else
fi
echo "$ac_t""$ac_cv_lbl_proc_net_dev" 1>&6
+# Check whether --with-dag or --without-dag was given.
+if test "${with_dag+set}" = set; then
+ withval="$with_dag"
+ :
+fi
+
+ac_cv_lbl_dag_api=no
+if test "$with_dag" != no; then
+
+ case "$V_PCAP" in
+ linux|bpf|dag)
+ ;;
+ *)
+ { echo "configure: error: DAG support only available with 'linux' 'bpf' and 'dag' packet capture types" 1>&2; exit 1; }
+ ;;
+ esac
+
+ echo $ac_n "checking whether we have DAG API""... $ac_c" 1>&6
+echo "configure:1990: checking whether we have DAG API" >&5
+
+ if test -z "$with_dag" -o "$with_dag" = yes; then
+ dag_root=$srcdir/../dag
+ else
+ dag_root=$with_dag
+ fi
+
+ if test -r "$dag_root/tools" -a -r "$dag_root/include"; then
+ dag_tools_dir="$dag_root/tools"
+ dag_include_dir="$dag_root/include"
+ else
+ dag_tools_dir="$dag_root"
+ dag_include_dir="$dag_root"
+ fi
+
+ if test -r "$dag_include_dir/dagapi.h" -a -r "$dag_tools_dir/dagapi.o"; then
+ V_INCLS="$V_INCLS -I $dag_include_dir"
+ V_LIBS="$V_LIBS $dag_tools_dir/dagapi.o $dag_tools_dir/dagopts.o"
+ if test "$V_PCAP" != dag ; then
+ SSRC="pcap-dag.c"
+ fi
+ ac_cv_lbl_dag_api=yes
+ else
+ ac_cv_lbl_dag_api=no
+ fi
+ echo "$ac_t""$ac_cv_lbl_dag_api" 1>&6
+ if test $ac_cv_lbl_dag_api = no; then
+ if test ! -z "$with_dag"; then
+ { echo "configure: error: DAG API not found under directory $dag_root; use --without-dag" 1>&2; exit 1; }
+ fi
+ else
+ cat >> confdefs.h <<\EOF
+#define HAVE_DAG_API 1
+EOF
+
+ fi
+fi
+
+if test "$V_PCAP" = dag -a "$ac_cv_lbl_dag_api" = no; then
+ { echo "configure: error: Specifying the capture type as 'dag' requires the DAG API to be present; use --with-dag=DIR" 1>&2; exit 1; }
+fi
+
+
# Check whether --with-flex or --without-flex was given.
if test "${with_flex+set}" = set; then
withval="$with_flex"
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1986: checking for $ac_word" >&5
+echo "configure:2054: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_V_LEX'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test "$V_LEX" = flex ; then
# The -V flag was added in 2.4
echo $ac_n "checking for flex 2.4 or higher""... $ac_c" 1>&6
-echo "configure:2020: checking for flex 2.4 or higher" >&5
+echo "configure:2088: checking for flex 2.4 or higher" >&5
if eval "test \"`echo '$''{'ac_cv_lbl_flex_v24'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2046: checking for $ac_word" >&5
+echo "configure:2114: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_V_YACC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
# Some versions of lex can't handle the definitions section of scanner.l .
# Try lexing it and complain if it can't deal.
echo $ac_n "checking for capable lex""... $ac_c" 1>&6
-echo "configure:2093: checking for capable lex" >&5
+echo "configure:2161: checking for capable lex" >&5
if eval "test \"`echo '$''{'tcpdump_cv_capable_lex'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
sinix*)
echo $ac_n "checking if SINIX compiler defines sinix""... $ac_c" 1>&6
-echo "configure:2144: checking if SINIX compiler defines sinix" >&5
+echo "configure:2212: checking if SINIX compiler defines sinix" >&5
if eval "test \"`echo '$''{'ac_cv_cc_sinix_defined'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2149 "configure"
+#line 2217 "configure"
#include "confdefs.h"
int main() {
int i = sinix;
; return 0; }
EOF
-if { (eval echo configure:2156: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2224: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_cc_sinix_defined=yes
else
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2188: checking for $ac_word" >&5
+echo "configure:2256: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
fi
echo $ac_n "checking if sockaddr struct has sa_len member""... $ac_c" 1>&6
-echo "configure:2256: checking if sockaddr struct has sa_len member" >&5
+echo "configure:2324: checking if sockaddr struct has sa_len member" >&5
if eval "test \"`echo '$''{'ac_cv_lbl_sockaddr_has_sa_len'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2261 "configure"
+#line 2329 "configure"
#include "confdefs.h"
# include <sys/types.h>
u_int i = sizeof(((struct sockaddr *)0)->sa_len)
; return 0; }
EOF
-if { (eval echo configure:2270: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2338: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_lbl_sockaddr_has_sa_len=yes
else
fi
echo $ac_n "checking if sockaddr_storage struct exists""... $ac_c" 1>&6
-echo "configure:2291: checking if sockaddr_storage struct exists" >&5
+echo "configure:2359: checking if sockaddr_storage struct exists" >&5
if eval "test \"`echo '$''{'ac_cv_lbl_has_sockaddr_storage'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2296 "configure"
+#line 2364 "configure"
#include "confdefs.h"
# include <sys/types.h>
u_int i = sizeof (struct sockaddr_storage)
; return 0; }
EOF
-if { (eval echo configure:2305: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2373: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_lbl_has_sockaddr_storage=yes
else
fi
echo $ac_n "checking if dl_hp_ppa_info_t struct has dl_module_id_1 member""... $ac_c" 1>&6
-echo "configure:2326: checking if dl_hp_ppa_info_t struct has dl_module_id_1 member" >&5
+echo "configure:2394: checking if dl_hp_ppa_info_t struct has dl_module_id_1 member" >&5
if eval "test \"`echo '$''{'ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2331 "configure"
+#line 2399 "configure"
#include "confdefs.h"
# include <sys/types.h>
u_int i = sizeof(((dl_hp_ppa_info_t *)0)->dl_module_id_1)
; return 0; }
EOF
-if { (eval echo configure:2341: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2409: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_lbl_dl_hp_ppa_info_t_has_dl_module_id_1=yes
else
fi
echo $ac_n "checking if unaligned accesses fail""... $ac_c" 1>&6
-echo "configure:2362: checking if unaligned accesses fail" >&5
+echo "configure:2430: checking if unaligned accesses fail" >&5
if eval "test \"`echo '$''{'ac_cv_lbl_unaligned_fail'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
+
+
+
# 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:
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:2479: checking for a BSD compatible install" >&5
+echo "configure:2550: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
s%@V_YACC@%$V_YACC%g
s%@RANLIB@%$RANLIB%g
s%@V_CCOPT@%$V_CCOPT%g
+s%@V_DEFS@%$V_DEFS%g
s%@V_INCLS@%$V_INCLS%g
+s%@V_LIBS@%$V_LIBS%g
s%@V_PCAP@%$V_PCAP%g
s%@V_FINDALLDEVS@%$V_FINDALLDEVS%g
s%@V_RANLIB@%$V_RANLIB%g
+s%@SSRC@%$SSRC%g
s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
s%@INSTALL_DATA@%$INSTALL_DATA%g
-dnl @(#) $Header: /tcpdump/master/libpcap/configure.in,v 1.98 2003-02-11 06:21:00 guy Exp $ (LBL)
+dnl @(#) $Header: /tcpdump/master/libpcap/configure.in,v 1.99 2003-07-23 05:29:20 guy Exp $ (LBL)
dnl
dnl Copyright (c) 1994, 1995, 1996, 1997
dnl The Regents of the University of California. All rights reserved.
dnl Process this file with autoconf to produce a configure script.
dnl
-AC_REVISION($Revision: 1.98 $)
+AC_REVISION($Revision: 1.99 $)
AC_INIT(pcap.c)
AC_CANONICAL_SYSTEM
-AC_LBL_C_INIT(V_CCOPT, V_INCLS)
+AC_LBL_C_INIT(V_CCOPT, V_INCLS, V_LIBS)
AC_LBL_C_INLINE
AC_C___ATTRIBUTE__
AC_LBL_TPACKET_STATS
;;
+dag)
+ V_DEFS="$V_DEFS -DDAG_ONLY"
+ ;;
+
null)
AC_MSG_WARN(cannot determine packet capture interface)
AC_MSG_WARN((see the INSTALL doc for more info))
fi
AC_MSG_RESULT($ac_cv_lbl_proc_net_dev)
+AC_ARG_WITH(dag, [ --with-dag=DIR include DAG support from DIR])
+ac_cv_lbl_dag_api=no
+if test "$with_dag" != no; then
+
+ case "$V_PCAP" in
+ linux|bpf|dag)
+ ;;
+ *)
+ AC_MSG_ERROR(DAG support only available with 'linux' 'bpf' and 'dag' packet capture types)
+ ;;
+ esac
+
+ AC_MSG_CHECKING(whether we have DAG API)
+
+ if test -z "$with_dag" -o "$with_dag" = yes; then
+ dag_root=$srcdir/../dag
+ else
+ dag_root=$with_dag
+ fi
+
+ if test -r "$dag_root/tools" -a -r "$dag_root/include"; then
+ dag_tools_dir="$dag_root/tools"
+ dag_include_dir="$dag_root/include"
+ else
+ dag_tools_dir="$dag_root"
+ dag_include_dir="$dag_root"
+ fi
+
+ if test -r "$dag_include_dir/dagapi.h" -a -r "$dag_tools_dir/dagapi.o"; then
+ V_INCLS="$V_INCLS -I $dag_include_dir"
+ V_LIBS="$V_LIBS $dag_tools_dir/dagapi.o $dag_tools_dir/dagopts.o"
+ if test "$V_PCAP" != dag ; then
+ SSRC="pcap-dag.c"
+ fi
+ ac_cv_lbl_dag_api=yes
+ else
+ ac_cv_lbl_dag_api=no
+ fi
+ AC_MSG_RESULT($ac_cv_lbl_dag_api)
+ if test $ac_cv_lbl_dag_api = no; then
+ if test ! -z "$with_dag"; then
+ AC_MSG_ERROR(DAG API not found under directory $dag_root; use --without-dag)
+ fi
+ else
+ AC_DEFINE(HAVE_DAG_API, 1, [define if you have a DAG API])
+ fi
+fi
+
+if test "$V_PCAP" = dag -a "$ac_cv_lbl_dag_api" = no; then
+ AC_MSG_ERROR(Specifying the capture type as 'dag' requires the DAG API to be present; use --with-dag=DIR)
+fi
+
+
AC_LBL_LEX_AND_YACC(V_LEX, V_YACC, pcap_)
if test "$V_LEX" = lex ; then
# Some versions of lex can't handle the definitions section of scanner.l .
ln -s ${srcdir}/bpf/net net
AC_SUBST(V_CCOPT)
+AC_SUBST(V_DEFS)
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_YACC)
+AC_SUBST(SSRC)
AC_PROG_INSTALL
#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/libpcap/inet.c,v 1.55 2003-02-04 09:51:38 risso Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/libpcap/inet.c,v 1.56 2003-07-23 05:29:20 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
* has the network address and -mask "0.0.0.0" therefore catching
* all traffic. Using NULL for the interface is the same as "any".
*/
- if (!device || strcmp(device, "any") == 0) {
+ if (!device || strcmp(device, "any") == 0
+#ifdef HAVE_DAG_API
+ || strstr(device, "dag") != NULL
+#endif
+ ) {
*netp = *maskp = 0;
return 0;
}
*/
#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/libpcap/pcap-bpf.c,v 1.60 2003-04-17 06:35:34 guy Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/libpcap/pcap-bpf.c,v 1.61 2003-07-23 05:29:21 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
#include "pcap-int.h"
+#ifdef HAVE_DAG_API
+#include "pcap-dag.h"
+#endif /* HAVE_DAG_API */
+
#ifdef HAVE_OS_PROTO_H
#include "os-proto.h"
#endif
{
struct bpf_stat s;
+#ifdef HAVE_DAG_API
+ if (p->md.is_dag) {
+ return dag_stats(p, ps);
+ }
+#endif /* HAVE_DAG_API */
+
/*
* "ps_recv" counts packets handed to the filter, not packets
* that passed the filter. This includes packets later dropped
int n = 0;
register u_char *bp, *ep;
+#ifdef HAVE_DAG_API
+ if (p->md.is_dag) {
+ return dag_read(p, cnt, callback, user);
+ }
+#endif /* HAVE_DAG_API */
+
again:
cc = p->cc;
if (p->cc == 0) {
u_int v;
pcap_t *p;
+#ifdef HAVE_DAG_API
+ if (strstr(device, "dag")) {
+ return dag_open_live(device, snaplen, promisc, to_ms, ebuf);
+ }
+#endif /* HAVE_DAG_API */
+
#ifdef BIOCGDLTLIST
bzero(&bdl, sizeof(bdl));
#endif
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);
}
int
pcap_setfilter(pcap_t *p, struct bpf_program *fp)
{
+#ifdef HAVE_DAG_API
+ if (p->md.is_dag) {
+ return dag_setfilter(p, fp);
+ }
+#endif /* HAVE_DAG_API */
+
/*
* It looks that BPF code generated by gen_protochain() is not
* compatible with some of kernel BPF code (for example BSD/OS 3.1).
int
pcap_set_datalink_platform(pcap_t *p, int dlt)
{
+#ifdef HAVE_DAG_API
+ if (p->md.is_dag) {
+ return dag_set_datalink_platform(p, dlt);
+ }
+#endif /* HAVE_DAG_API */
+
#ifdef BIOCSDLT
if (ioctl(p->fd, BIOCSDLT, &dlt) == -1) {
(void) snprintf(p->errbuf, sizeof(p->errbuf),
--- /dev/null
+/*
+ * pcap-dag.c: Packet capture interface for Endace DAG card.
+ *
+ * The functionality of this code attempts to mimic that of pcap-linux as much
+ * as possible. This code is compiled in several different ways depending on
+ * whether DAG_ONLY and HAVE_DAG_API are defined. If HAVE_DAG_API is not
+ * defined it should not get compiled in, otherwise if DAG_ONLY is defined then
+ * the 'dag_' function calls are renamed to 'pcap_' equivalents. If DAG_ONLY
+ * is not defined then nothing is altered - the dag_ functions will be
+ * called as required from their pcap-linux/bpf equivalents.
+ *
+ * Author: Richard Littin, Sean Irvine ({richard,sean}@reeltwo.com)
+ *
+ * Modifications:
+ * Code shuffled around to suit fad-xxx.c structure
+ * Added atexit() handler to stop DAG if application is too lazy
+ */
+
+#ifndef lint
+static const char rcsid[] =
+ "@(#) $Header: /tcpdump/master/libpcap/pcap-dag.c,v 1.1 2003-07-23 05:29:21 guy Exp $ (LBL)";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/param.h> /* optionally get BSD define */
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include "pcap-int.h"
+
+#include <sys/mman.h>
+#include <sys/socket.h>
+
+struct mbuf; /* Squelch compiler warnings on some platforms for */
+struct rtentry; /* declarations in <net/if.h> */
+#include <net/if.h>
+
+#include <dagnew.h>
+#include <dagapi.h>
+
+#define MAX_DAG_SNAPLEN 2040
+
+typedef struct pcap_dag_node {
+ struct pcap_dag_node *next;
+ pcap_t *p;
+} pcap_dag_node_t;
+
+static pcap_dag_node_t *pcap_dags = NULL;
+static int atexit_handler_installed = 0;
+
+#ifdef DAG_ONLY
+/* This code is reguired when compiling for a DAG device only. */
+#include "pcap-dag.h"
+
+/* Replace dag function names with pcap equivalent. */
+#define dag_stats pcap_stats
+#define dag_read pcap_read
+#define dag_open_live pcap_open_live
+#define dag_platform_finddevs pcap_platform_finddevs
+#define dag_setfilter pcap_setfilter
+#define dag_set_datalink_platform pcap_set_datalink_platform
+#define dag_platform_close pcap_platform_close
+#endif /* DAG_ONLY */
+
+static void delete_pcap_dag(pcap_t *p) {
+ pcap_dag_node_t *curr = NULL, *prev = NULL;
+
+ for (prev = NULL, curr = pcap_dags;
+ curr != NULL && curr->p != p;
+ prev = curr, curr = curr->next) {
+ /* empty */
+ }
+
+ if (curr != NULL && curr->p == p) {
+ if (prev != NULL) {
+ prev->next = curr->next;
+ } else {
+ pcap_dags = curr->next;
+ }
+ }
+}
+
+/*
+ * Performs a graceful shutdown of the DAG card and frees dynamic memory held
+ * in the pcap_t structure.
+ */
+
+void dag_platform_close(pcap_t *p) {
+
+#ifdef linux
+ if (p != NULL && p->md.is_dag && p->md.device != NULL) {
+ if(dag_stop(p->fd) < 0)
+ fprintf(stderr,"dag_stop %s: %s\n", p->md.device, strerror(errno));
+ if(dag_close(p->fd) < 0)
+ fprintf(stderr,"dag_close %s: %s\n", p->md.device, strerror(errno));
+
+ free(p->md.device);
+ }
+#else
+ if (p != NULL && p->md.is_dag) {
+ if(dag_stop(p->fd) < 0)
+ fprintf(stderr,"dag_stop: %s\n", strerror(errno));
+ if(dag_close(p->fd) < 0)
+ fprintf(stderr,"dag_close: %s\n", strerror(errno));
+ }
+#endif
+ delete_pcap_dag(p);
+}
+
+static void atexit_handler(void) {
+ while (pcap_dags != NULL) {
+ dag_platform_close(pcap_dags->p);
+ }
+}
+
+static int new_pcap_dag(pcap_t *p) {
+ pcap_dag_node_t *node = NULL;
+
+ if ((node = malloc(sizeof(pcap_dag_node_t))) == NULL) {
+ return -1;
+ }
+
+ if (!atexit_handler_installed) {
+ atexit(atexit_handler);
+ atexit_handler_installed = 1;
+ }
+
+ node->next = pcap_dags;
+ node->p = p;
+
+ return 0;
+}
+
+/*
+ * Get pointer to the ERF header for the next packet in the input
+ * stream. This function blocks until a packet becomes available.
+ */
+static dag_record_t *get_next_dag_header(pcap_t *p) {
+ register dag_record_t *record;
+ int rlen;
+
+ if (p->md.dag_mem_top - p->md.dag_mem_bottom < dag_record_size) {
+ p->md.dag_mem_top = dag_offset(p->fd, &(p->md.dag_mem_bottom), 0);
+ }
+
+ record = (dag_record_t *)(p->md.dag_mem_base + p->md.dag_mem_bottom);
+ rlen = ntohs(record->rlen);
+ while (p->md.dag_mem_top - p->md.dag_mem_bottom < rlen) {
+ p->md.dag_mem_top = dag_offset(p->fd, &(p->md.dag_mem_bottom), 0);
+ record = (dag_record_t *)(p->md.dag_mem_base + p->md.dag_mem_bottom);
+ rlen = ntohs(record->rlen);
+ }
+
+ p->md.dag_mem_bottom += rlen;
+
+ return record;
+}
+
+/* Size of payload in ATM packets */
+#define ATM_CAPTURE_SIZE 48
+
+/* Size of payload of Ethernet packet */
+#define ETHERNET_LENGTH(h) min(ntohs((h)->wlen) - 4, ntohs((h)->rlen) - dag_record_size - 2 - (ntohs((h)->wlen) & 0x3))
+
+/* Size of HDLC packet */
+#define HDLC_LENGTH(h) min(ntohs((h)->wlen) - 4, ntohs((h)->rlen) - dag_record_size)
+
+#ifndef min
+#define min(a, b) ((a) > (b) ? (b) : (a))
+#endif
+
+/*
+ * Swap byte ordering of unsigned long long on a big endian
+ * machine.
+ */
+static unsigned long long swapll(unsigned long long ull) {
+#if (BYTE_ORDER == BIG_ENDIAN)
+ return ((ull & 0xff00000000000000LL) >> 56) |
+ ((ull & 0x00ff000000000000LL) >> 40) |
+ ((ull & 0x0000ff0000000000LL) >> 24) |
+ ((ull & 0x000000ff00000000LL) >> 8) |
+ ((ull & 0x00000000ff000000LL) << 8) |
+ ((ull & 0x0000000000ff0000LL) << 24) |
+ ((ull & 0x000000000000ff00LL) << 40) |
+ ((ull & 0x00000000000000ffLL) << 56) ;
+#else
+ return ull;
+#endif
+}
+
+/*
+ * Read at most max_packets from the capture stream and call the callback
+ * for each of them. Returns the number of packets handled or -1 if an
+ * error occured. A blocking
+ */
+int dag_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user) {
+ u_char *dp = NULL;
+ int packet_len = 0, caplen = 0;
+ struct pcap_pkthdr pcap_header;
+
+ dag_record_t *header;
+ register unsigned long long ts;
+
+ /* Receive a single packet from the kernel */
+ header = get_next_dag_header(p);
+ dp = ((u_char *)header) + dag_record_size;
+
+ switch(header->type) {
+ case TYPE_ATM:
+ packet_len = ATM_CAPTURE_SIZE;
+ caplen = ATM_CAPTURE_SIZE;
+ break;
+ case TYPE_ETH:
+ packet_len = ntohs(header->wlen);
+ caplen = ETHERNET_LENGTH(header);
+ dp += 2;
+ break;
+ case TYPE_HDLC_POS:
+ packet_len = ntohs(header->wlen);
+ caplen = HDLC_LENGTH(header);
+ break;
+ }
+
+ if (caplen > p->snapshot)
+ caplen = p->snapshot;
+
+ /* Run the packet filter if not using kernel filter */
+ if (p->fcode.bf_insns) {
+ if (bpf_filter(p->fcode.bf_insns, dp, packet_len, caplen) == 0) {
+ /* rejected by filter */
+ return 0;
+ }
+ }
+
+ /* convert between timestamp formats */
+ ts = swapll(header->ts);
+ pcap_header.ts.tv_sec = ts >> 32;
+ ts = ((ts & 0xffffffffULL) * 1000 * 1000);
+ ts += (ts & 0x80000000ULL) << 1; /* rounding */
+ pcap_header.ts.tv_usec = ts >> 32;
+ if (pcap_header.ts.tv_usec >= 1000000) {
+ pcap_header.ts.tv_usec -= 1000000;
+ pcap_header.ts.tv_sec += 1;
+ }
+
+ /* Fill in our own header data */
+ pcap_header.caplen = caplen;
+ pcap_header.len = packet_len;
+
+ /*
+ * Count the packet.
+ */
+ p->md.stat.ps_recv++;
+
+ /* Call the user supplied callback function */
+ callback(user, &pcap_header, dp);
+
+ return 1;
+}
+
+/*
+ * 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.
+ *
+ * See also pcap(3).
+ */
+pcap_t *dag_open_live(const char *device, int snaplen, int promisc, int to_ms, char *ebuf) {
+ char conf[30]; /* dag configure string */
+ pcap_t *handle;
+
+ if (device == NULL) {
+ snprintf(ebuf, PCAP_ERRBUF_SIZE, "device is NULL: %s", pcap_strerror(errno));
+ return NULL;
+ }
+ /* 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));
+
+ if (strstr(device, "/dev") == NULL) {
+ char * newDev = (char *)malloc(strlen(device) + 6);
+ newDev[0] = '\0';
+ strcat(newDev, "/dev/");
+ strcat(newDev,device);
+ device = newDev;
+ }
+
+ /* setup device parameters */
+ if((handle->fd = dag_open((char *)device)) < 0) {
+ snprintf(ebuf, PCAP_ERRBUF_SIZE, "dag_open %s: %s", device, pcap_strerror(errno));
+ return NULL;
+ }
+
+ /* set the card snap length as specified by the specified snaplen parameter */
+ if (snaplen > MAX_DAG_SNAPLEN) {
+ snaplen = MAX_DAG_SNAPLEN;
+ }
+ snprintf(conf, 30, "varlen slen=%d", (snaplen % 4) ? (snaplen + 3) & ~3 : snaplen); /* snap len has to be a multiple of 4 */
+ fprintf(stderr, "Configuring DAG with '%s'.\n", conf);
+ if(dag_configure(handle->fd, conf) < 0) {
+ snprintf(ebuf, PCAP_ERRBUF_SIZE,"dag_configure %s: %s\n", device, pcap_strerror(errno));
+ return NULL;
+ }
+
+ 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));
+ return NULL;
+ }
+
+ if(dag_start(handle->fd) < 0) {
+ snprintf(ebuf, PCAP_ERRBUF_SIZE, "dag_start %s: %s\n", device, pcap_strerror(errno));
+ return NULL;
+ }
+
+ /*
+ * Important! You have to ensure bottom is properly
+ * 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.is_dag = 1;
+
+ handle->snapshot = snaplen;
+ /*handle->md.timeout = to_ms; */
+
+#ifdef linux
+ if (device) {
+ handle->md.device = strdup(device);
+ }
+
+ if (handle->md.device == NULL) {
+ snprintf(ebuf, PCAP_ERRBUF_SIZE, "str_dup %s: %s\n", device, pcap_strerror(errno));
+ free(handle);
+ return NULL;
+ }
+#endif
+
+ /* set link type */
+
+ /* Check the type through a dagapi call.
+ */
+ switch(dag_linktype(handle->fd)) {
+ case TYPE_HDLC_POS:
+ handle->linktype = DLT_CHDLC;
+ fprintf(stderr, "Set DAG linktype to %d (DLT_CHDLC)\n", handle->linktype);
+ break;
+ case TYPE_ETH:
+ handle->linktype = DLT_EN10MB;
+ fprintf(stderr, "Set DAG linktype to %d (DLT_EN10MB)\n", handle->linktype);
+ break;
+ case TYPE_ATM:
+ handle->linktype = DLT_ATM_RFC1483;
+ fprintf(stderr, "Set DAG linktype to %d (DLT_ATM_RFC1483)\n", handle->linktype);
+ break;
+ case TYPE_LEGACY:
+ handle->linktype = DLT_NULL;
+ fprintf(stderr, "Set DAG linktype to %d (DLT_NULL)\n", handle->linktype);
+ break;
+ default:
+ snprintf(ebuf, PCAP_ERRBUF_SIZE, "dag_open_live %s: unknown linktype %d\n", device, dag_linktype(handle->fd));
+ return NULL;
+ }
+
+ handle->bufsize = 0;/*handle->snapshot;*/
+
+ if (new_pcap_dag(handle) < 0) {
+ snprintf(ebuf, PCAP_ERRBUF_SIZE, "new_pcap_dag %s: %s\n", device, pcap_strerror(errno));
+ return NULL;
+ }
+
+ return handle;
+}
+
+int dag_stats(pcap_t *p, struct pcap_stat *ps) {
+ /* 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;*/
+
+ *ps = p->md.stat;
+
+ return 0;
+}
+
+/*
+ * Get from "/proc/dag" 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.
+ *
+ * We also don't fail if we couldn't open "/proc/dag"; we just leave
+ * the list of interfaces as is.
+ */
+int
+dag_platform_finddevs(pcap_if_t **devlistp, char *errbuf)
+{
+ FILE *proc_dag_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;
+
+ /* Quick exit if /proc/dag not readable */
+ proc_dag_f = fopen("/proc/dag", "r");
+ if (proc_dag_f == NULL)
+ {
+ int i, fd;
+ char dev[16] = "dagx";
+
+ for (i = '0'; ret == 0 && i <= '9'; i++) {
+ dev[3] = i;
+ if (pcap_add_if(devlistp, dev, 0, NULL, errbuf) == -1) {
+ /*
+ * Failure.
+ */
+ ret = -1;
+ }
+ }
+
+ return (ret);
+ }
+
+ for (linenum = 1;
+ fgets(linebuf, sizeof linebuf, proc_dag_f) != NULL; linenum++) {
+
+ /*
+ * Skip the first two lines - they're headers.
+ */
+ if (linenum <= 2)
+ continue;
+
+ p = &linebuf[0];
+
+ if (*p == '\0' || *p == '\n' || *p != 'D')
+ continue; /* not a Dag line */
+
+ /*
+ * Get the interface name.
+ */
+ q = &name[0];
+ while (*p != '\0' && *p != ':') {
+ if (*p != ' ')
+ *q++ = tolower(*p++);
+ else
+ p++;
+ }
+ *q = '\0';
+
+ /*
+ * Add an entry for this interface, with no addresses.
+ */
+ p[strlen(p) - 1] = '\0'; /* get rid of \n */
+ if (pcap_add_if(devlistp, name, 0, strdup(p + 2), 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_dag_f)) {
+ (void)snprintf(errbuf, PCAP_ERRBUF_SIZE,
+ "Error reading /proc/dag: %s",
+ pcap_strerror(errno));
+ ret = -1;
+ }
+ }
+
+ (void)fclose(proc_dag_f);
+ return (ret);
+}
+
+/*
+ * Installs the gven bpf filter program in the given pcap structure. There is
+ * no attempt to store the filter in kernel memory as that is not supported
+ * with DAG cards.
+ */
+int dag_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) {
+ snprintf(p->errbuf, sizeof(p->errbuf),
+ "malloc: %s", pcap_strerror(errno));
+ return -1;
+ }
+
+ p->md.use_bpf = 0;
+
+ return (0);
+}
+
+int
+dag_set_datalink_platform(pcap_t *p, int dlt)
+{
+ return (0);
+}
--- /dev/null
+/*
+ * pcap-dag.c: Packet capture interface for Endace DAG card.
+ *
+ * The functionality of this code attempts to mimic that of pcap-linux as much
+ * as possible. This code is only needed when compiling in the DAG card code
+ * at the same time as another type of device.
+ *
+ * Author: Richard Littin, Sean Irvine ({richard,sean}@reeltwo.com)
+ *
+ * @(#) $Header: /tcpdump/master/libpcap/pcap-dag.h,v 1.1 2003-07-23 05:29:21 guy Exp $ (LBL)
+ */
+
+int dag_stats(pcap_t *p, struct pcap_stat *ps);
+int dag_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user);
+pcap_t *dag_open_live(const char *device, int snaplen, int promisc, int to_ms, char *ebuf);
+int dag_setfilter(pcap_t *p, struct bpf_program *fp);
+void dag_platform_close(pcap_t *p);
+
* 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.46 2003-04-10 06:07:08 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/libpcap/pcap-int.h,v 1.47 2003-07-23 05:29:21 guy Exp $ (LBL)
*/
#ifndef pcap_int_h
char *device; /* device name */
struct pcap *next; /* list of open promiscuous sock_packet pcaps */
#endif
+
+#ifdef HAVE_DAG_API
+ int is_dag; /* this is a dag card handle */
+ void *dag_mem_base; /* DAG card memory base address */
+ u_int dag_mem_bottom; /* DAG card current memory bottom pointer */
+ u_int dag_mem_top; /* DAG card current memory top pointer */
+#endif
};
struct pcap {
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
+
#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/libpcap/pcap-linux.c,v 1.89 2003-04-09 07:19:49 guy Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/libpcap/pcap-linux.c,v 1.90 2003-07-23 05:29:22 guy Exp $ (LBL)";
#endif
/*
#include "pcap-int.h"
#include "sll.h"
+#ifdef HAVE_DAG_API
+#include "pcap-dag.h"
+#endif /* HAVE_DAG_API */
+
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
int live_open_ok = 0;
struct utsname utsname;
+#ifdef HAVE_DAG_API
+ if (strstr(device, "dag")) {
+ return dag_open_live(device, snaplen, promisc, to_ms, ebuf);
+ }
+#endif /* HAVE_DAG_API */
+
/* Allocate a handle for this session. */
handle = malloc(sizeof(*handle));
int
pcap_read(pcap_t *handle, int max_packets, pcap_handler callback, u_char *user)
{
+#ifdef HAVE_DAG_API
+ if (handle->md.is_dag) {
+ return dag_read(handle, max_packets, callback, user);
+ }
+#endif /* HAVE_DAG_API */
+
/*
* Currently, on Linux only one packet is delivered per read,
* so we don't loop.
#ifdef HAVE_TPACKET_STATS
struct tpacket_stats kstats;
socklen_t len = sizeof (struct tpacket_stats);
+#endif
+
+#ifdef HAVE_DAG_API
+ if (handle->md.is_dag) {
+ return dag_stats(handle, stats);
+ }
+#endif /* HAVE_DAG_API */
+#ifdef HAVE_TPACKET_STATS
/*
* Try to get the packet counts from the kernel.
*/
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 */
+
return (0);
}
int err = 0;
#endif
+#ifdef HAVE_DAG_API
+ if (handle->md.is_dag) {
+ return dag_setfilter(handle, filter);
+ }
+#endif /* HAVE_DAG_API */
+
if (!handle)
return -1;
if (!filter) {
struct pcap *p, *prevp;
struct ifreq ifr;
+#ifdef HAVE_DAG_API
+ if (handle->md.is_dag) {
+ /* close actions will be done in dag_platform_close() */
+ return;
+ }
+#endif /* HAVE_DAG_API */
+
if (handle->md.clear_promisc) {
/*
* We put the interface into promiscuous mode; take
int
pcap_set_datalink_platform(pcap_t *p, int dlt)
{
+#ifdef HAVE_DAG_API
+ if (p->md.is_dag) {
+ return dag_set_datalink_platform(p, dlt);
+ }
+#endif /* HAVE_DAG_API */
+
return (0);
}
#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/libpcap/pcap.c,v 1.55 2003-06-07 10:26:04 guy Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/libpcap/pcap.c,v 1.56 2003-07-23 05:29:22 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
if (p->fd >= 0) {
#ifdef linux
pcap_close_linux(p);
+#endif
+#ifdef HAVE_DAG_API
+ dag_platform_close(p);
#endif
close(p->fd);
}