Ethereal-dev: [ethereal-dev] SNMP diff

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Gilbert Ramirez <gramirez@xxxxxxxxxx>
Date: Fri, 30 Apr 1999 11:49:14 -0500
Here is the patch against the very latest CVS image (which is available
at http://verdict.uthscsa.edu/gram/ethereal/ethereal-990430.tar.gz)
which introduces SNMP decoding to ethereal.  I found the file in
Gerald's directory on pow.zing.org, and modified it only so that it will
compile with the changes in ethereal made since the creation of this
code.

I sent e-mail to Didier Jorand <Didier.Jorand@xxxxxxxxxx>, the author of
this code, to see if he has worked on it any more, but I have not
received a response.

I quickly hacked the configure.in script to try to properly link in the
SNMP library by default. I have not tried this script on a computer w/o
the UCD snmp library, so I do not know if the script correctly
determines the absence.

--gilbert
diff -urN ethereal/Makefile.am ethereal-new/Makefile.am
--- ethereal/Makefile.am	Fri Apr 30 11:14:31 1999
+++ ethereal-new/Makefile.am	Thu Apr 29 16:14:49 1999
@@ -45,6 +45,7 @@
 	packet-ppp.c   \
 	packet-raw.c   \
 	packet-rip.c   \
+	packet-snmp.c  \
 	packet-tcp.c   \
 	packet-telnet.c \
 	packet-tftp.c  \
@@ -86,7 +87,7 @@
 	snprintf-imp.h
 
 ethereal_DEPENDENCIES = @SNPRINTF_O@ @LIBWIRETAP_A@
-ethereal_LDADD = @SNPRINTF_O@ @LIBWIRETAP_A@
+ethereal_LDADD = @SNPRINTF_O@ @LIBWIRETAP_A@ @SNMP_A@
 
 ps.c: print.ps rdps
 	./rdps print.ps ps.c
diff -urN ethereal/Makefile.in ethereal-new/Makefile.in
--- ethereal/Makefile.in	Fri Apr 30 11:16:22 1999
+++ ethereal-new/Makefile.in	Fri Apr 30 11:31:04 1999
@@ -68,6 +68,7 @@
 MAKEINFO = @MAKEINFO@
 PACKAGE = @PACKAGE@
 RANLIB = @RANLIB@
+SNMP_A = @SNMP_A@
 SNPRINTF_C = @SNPRINTF_C@
 SNPRINTF_O = @SNPRINTF_O@
 VERSION = @VERSION@
@@ -78,14 +79,14 @@
 
 sysconf_DATA = manuf
 
-ethereal_SOURCES =  	capture.c      	column.c       	ethereal.c     	ethertype.c    	file.c         	filter.c       	follow.c       	gtkpacket.c    	menu.c         	packet.c       	packet-aarp.c  	packet-arp.c   	packet-atalk.c 	packet-bootp.c 	packet-cdp.c   	packet-data.c  	packet-dns.c   	packet-eth.c   	packet-ftp.c   	packet-fddi.c  	packet-giop.c  	packet-http.c  	packet-ip.c    	packet-icmpv6.c 	packet-ipsec.c 	packet-ipv6.c  	packet-ipx.c   	packet-llc.c   	packet-lpd.c   	packet-nbipx.c 	packet-nbns.c  	packet-ncp.c   	packet-nntp.c  	packet-null.c  	packet-osi.c   	packet-ospf.c  	packet-pop.c   	packet-ppp.c   	packet-raw.c   	packet-rip.c   	packet-tcp.c   	packet-telnet.c 	packet-tftp.c  	packet-tr.c    	packet-trmac.c 	packet-udp.c   	packet-vines.c 	prefs.c        	print.c        	ps.c           	resolv.c       	util.c         	capture.h      	column.h       	config.h       	ethereal.h     	etypes.h       	file.h         	filter.h       	follow.h       	menu.h !
        	packet.h       	packet-dns.h   	packet-ipv6.h  	packet-ipx.h   	packet-ncp.h   	packet-ospf.h  	packet-rip.h   	packet-vines.h 	prefs.h        	print.h        	ps.h           	resolv.h       	util.h
+ethereal_SOURCES =  	capture.c      	column.c       	ethereal.c     	ethertype.c    	file.c         	filter.c       	follow.c       	gtkpacket.c    	menu.c         	packet.c       	packet-aarp.c  	packet-arp.c   	packet-atalk.c 	packet-bootp.c 	packet-cdp.c   	packet-data.c  	packet-dns.c   	packet-eth.c   	packet-ftp.c   	packet-fddi.c  	packet-giop.c  	packet-http.c  	packet-ip.c    	packet-icmpv6.c 	packet-ipsec.c 	packet-ipv6.c  	packet-ipx.c   	packet-llc.c   	packet-lpd.c   	packet-nbipx.c 	packet-nbns.c  	packet-ncp.c   	packet-nntp.c  	packet-null.c  	packet-osi.c   	packet-ospf.c  	packet-pop.c   	packet-ppp.c   	packet-raw.c   	packet-rip.c   	packet-snmp.c  	packet-tcp.c   	packet-telnet.c 	packet-tftp.c  	packet-tr.c    	packet-trmac.c 	packet-udp.c   	packet-vines.c 	prefs.c        	print.c        	ps.c           	resolv.c       	util.c         	capture.h      	column.h       	config.h       	ethereal.h     	etypes.h       	file.h         	filter.h       	follow.!
h       	menu.h         	packet.h       	packet-dns.h   	packet-ipv6.h  	packet-ipx.h   	packet-ncp.h   	packet-ospf.h  	packet-rip.h   	packet-vines.h 	prefs.h        	print.h        	ps.h           	resolv.h       	util.h
 
 
 EXTRA_ethereal_SOURCES =  	snprintf.c           	snprintf.h           	snprintf-imp.h
 
 
 ethereal_DEPENDENCIES = @SNPRINTF_O@ @LIBWIRETAP_A@
-ethereal_LDADD = @SNPRINTF_O@ @LIBWIRETAP_A@
+ethereal_LDADD = @SNPRINTF_O@ @LIBWIRETAP_A@ @SNMP_A@
 
 DISTCLEANFILES =  	rdps 						ps.c 						*~
 
@@ -112,9 +113,9 @@
 packet-http.o packet-ip.o packet-icmpv6.o packet-ipsec.o packet-ipv6.o \
 packet-ipx.o packet-llc.o packet-lpd.o packet-nbipx.o packet-nbns.o \
 packet-ncp.o packet-nntp.o packet-null.o packet-osi.o packet-ospf.o \
-packet-pop.o packet-ppp.o packet-raw.o packet-rip.o packet-tcp.o \
-packet-telnet.o packet-tftp.o packet-tr.o packet-trmac.o packet-udp.o \
-packet-vines.o prefs.o print.o ps.o resolv.o util.o
+packet-pop.o packet-ppp.o packet-raw.o packet-rip.o packet-snmp.o \
+packet-tcp.o packet-telnet.o packet-tftp.o packet-tr.o packet-trmac.o \
+packet-udp.o packet-vines.o prefs.o print.o ps.o resolv.o util.o
 ethereal_LDFLAGS = 
 CFLAGS = @CFLAGS@
 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -148,10 +149,11 @@
 .deps/packet-nbns.P .deps/packet-ncp.P .deps/packet-nntp.P \
 .deps/packet-null.P .deps/packet-osi.P .deps/packet-ospf.P \
 .deps/packet-pop.P .deps/packet-ppp.P .deps/packet-raw.P \
-.deps/packet-rip.P .deps/packet-tcp.P .deps/packet-telnet.P \
-.deps/packet-tftp.P .deps/packet-tr.P .deps/packet-trmac.P \
-.deps/packet-udp.P .deps/packet-vines.P .deps/packet.P .deps/prefs.P \
-.deps/print.P .deps/ps.P .deps/resolv.P .deps/snprintf.P .deps/util.P
+.deps/packet-rip.P .deps/packet-snmp.P .deps/packet-tcp.P \
+.deps/packet-telnet.P .deps/packet-tftp.P .deps/packet-tr.P \
+.deps/packet-trmac.P .deps/packet-udp.P .deps/packet-vines.P \
+.deps/packet.P .deps/prefs.P .deps/print.P .deps/ps.P .deps/resolv.P \
+.deps/snprintf.P .deps/util.P
 SOURCES = $(ethereal_SOURCES) $(EXTRA_ethereal_SOURCES)
 OBJECTS = $(ethereal_OBJECTS)
 
diff -urN ethereal/config.h.in ethereal-new/config.h.in
--- ethereal/config.h.in	Fri Apr 30 11:16:35 1999
+++ ethereal-new/config.h.in	Fri Apr 30 11:31:16 1999
@@ -22,6 +22,9 @@
 /* Define if you have the <netinet/in.h> header file.  */
 #undef HAVE_NETINET_IN_H
 
+/* Define if you have the <snmp/snmp.h> header file.  */
+#undef HAVE_SNMP_SNMP_H
+
 /* Define if you have the <stdarg.h> header file.  */
 #undef HAVE_STDARG_H
 
@@ -36,6 +39,9 @@
 
 /* Define if you have the <sys/types.h> header file.  */
 #undef HAVE_SYS_TYPES_H
+
+/* Define if you have the <ucd-snmp/snmp.h> header file.  */
+#undef HAVE_UCD_SNMP_SNMP_H
 
 /* Define if you have the <unistd.h> header file.  */
 #undef HAVE_UNISTD_H
diff -urN ethereal/configure ethereal-new/configure
--- ethereal/configure	Fri Apr 30 11:16:23 1999
+++ ethereal-new/configure	Fri Apr 30 11:31:04 1999
@@ -22,6 +22,8 @@
   --without-wiretap       Don't include wiretap library (default)"
 ac_help="$ac_help
   --enable-ipv6           use ipv6 name resolution, if available.  [default=yes]"
+ac_help="$ac_help
+  --enable-snmp           use SNMP library, if available.  [default=yes]"
 
 # Initialize some variables set by options.
 # The variables have the same names as the options, with
@@ -564,7 +566,7 @@
 # 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:568: checking for a BSD compatible install" >&5
+echo "configure:570: 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
@@ -617,7 +619,7 @@
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
-echo "configure:621: checking whether build environment is sane" >&5
+echo "configure:623: checking whether build environment is sane" >&5
 # Just in case
 sleep 1
 echo timestamp > conftestfile
@@ -674,7 +676,7 @@
 test "$program_transform_name" = "" && program_transform_name="s,x,x,"
 
 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:678: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:680: checking whether ${MAKE-make} sets \${MAKE}" >&5
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -720,7 +722,7 @@
 
 missing_dir=`cd $ac_aux_dir && pwd`
 echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
-echo "configure:724: checking for working aclocal" >&5
+echo "configure:726: checking for working aclocal" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -733,7 +735,7 @@
 fi
 
 echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
-echo "configure:737: checking for working autoconf" >&5
+echo "configure:739: checking for working autoconf" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -746,7 +748,7 @@
 fi
 
 echo $ac_n "checking for working automake""... $ac_c" 1>&6
-echo "configure:750: checking for working automake" >&5
+echo "configure:752: checking for working automake" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -759,7 +761,7 @@
 fi
 
 echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
-echo "configure:763: checking for working autoheader" >&5
+echo "configure:765: checking for working autoheader" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -772,7 +774,7 @@
 fi
 
 echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
-echo "configure:776: checking for working makeinfo" >&5
+echo "configure:778: checking for working makeinfo" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -793,7 +795,7 @@
 fi
 
 echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:797: checking host system type" >&5
+echo "configure:799: checking host system type" >&5
 
 host_alias=$host
 case "$host_alias" in
@@ -817,7 +819,7 @@
 # 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:821: checking for $ac_word" >&5
+echo "configure:823: 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
@@ -847,7 +849,7 @@
   # 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:851: checking for $ac_word" >&5
+echo "configure:853: 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
@@ -898,7 +900,7 @@
       # 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:902: checking for $ac_word" >&5
+echo "configure:904: 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
@@ -930,7 +932,7 @@
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:934: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:936: 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.
@@ -941,12 +943,12 @@
 
 cat > conftest.$ac_ext << EOF
 
-#line 945 "configure"
+#line 947 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:950: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:952: \"$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
@@ -972,12 +974,12 @@
   { 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:976: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:978: 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:981: checking whether we are using GNU C" >&5
+echo "configure:983: 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
@@ -986,7 +988,7 @@
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:990: \"$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:992: \"$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
@@ -1005,7 +1007,7 @@
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1009: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:1011: 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
@@ -1039,7 +1041,7 @@
 # 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:1043: checking for $ac_word" >&5
+echo "configure:1045: 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
@@ -1069,7 +1071,7 @@
 
 # If we're running gcc, add '-Wall' to CFLAGS.
 echo $ac_n "checking to see if we can add '-Wall' to CFLAGS""... $ac_c" 1>&6
-echo "configure:1073: checking to see if we can add '-Wall' to CFLAGS" >&5
+echo "configure:1075: checking to see if we can add '-Wall' to CFLAGS" >&5
 if test x$GCC != x ; then
   CFLAGS="-Wall $CFLAGS"
   echo "$ac_t""yes" 1>&6
@@ -1095,7 +1097,7 @@
 case "$host_os" in
   solaris*)
     echo $ac_n "checking for LD_LIBRARY_PATH""... $ac_c" 1>&6
-echo "configure:1099: checking for LD_LIBRARY_PATH" >&5
+echo "configure:1101: checking for LD_LIBRARY_PATH" >&5
     if test x$LD_LIBRARY_PATH != x ; then
       LIBS="$LIBS -R$LD_LIBRARY_PATH"
       echo "$ac_t""yes -- added LD_LIBRARY_PATH to run-time linker path" 1>&6
@@ -1156,7 +1158,7 @@
   # Extract the first word of "gtk-config", so it can be a program name with args.
 set dummy gtk-config; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1160: checking for $ac_word" >&5
+echo "configure:1162: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GTK_CONFIG'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1191,7 +1193,7 @@
 
   min_gtk_version=1.0.0
   echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6
-echo "configure:1195: checking for GTK - version >= $min_gtk_version" >&5
+echo "configure:1197: checking for GTK - version >= $min_gtk_version" >&5
   no_gtk=""
   if test "$GTK_CONFIG" = "no" ; then
     no_gtk=yes
@@ -1214,7 +1216,7 @@
   echo $ac_n "cross compiling; assumed OK... $ac_c"
 else
   cat > conftest.$ac_ext <<EOF
-#line 1218 "configure"
+#line 1220 "configure"
 #include "confdefs.h"
 
 #include <gtk/gtk.h>
@@ -1292,7 +1294,7 @@
 }
 
 EOF
-if { (eval echo configure:1296: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1298: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -1326,7 +1328,7 @@
           CFLAGS="$CFLAGS $GTK_CFLAGS"
           LIBS="$LIBS $GTK_LIBS"
           cat > conftest.$ac_ext <<EOF
-#line 1330 "configure"
+#line 1332 "configure"
 #include "confdefs.h"
 
 #include <gtk/gtk.h>
@@ -1336,7 +1338,7 @@
  return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); 
 ; return 0; }
 EOF
-if { (eval echo configure:1340: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1342: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
    echo "*** The test program compiled, but did not run. This usually means"
           echo "*** that the run-time linker is not finding GTK or finding the wrong"
@@ -1377,7 +1379,7 @@
 
 # Evidently, some systems have pcap.h, etc. in */include/pcap
 echo $ac_n "checking for extraneous pcap header directories""... $ac_c" 1>&6
-echo "configure:1381: checking for extraneous pcap header directories" >&5
+echo "configure:1383: checking for extraneous pcap header directories" >&5
 found_pcap_dir=""
 for pcap_dir in /usr/include/pcap /usr/local/include/pcap
 do
@@ -1397,7 +1399,7 @@
 
 # Pcap checks
 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1401: checking how to run the C preprocessor" >&5
+echo "configure:1403: checking how to run the C preprocessor" >&5
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -1412,13 +1414,13 @@
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 1416 "configure"
+#line 1418 "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:1422: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1424: \"$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
   :
@@ -1429,13 +1431,13 @@
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 1433 "configure"
+#line 1435 "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:1439: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1441: \"$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
   :
@@ -1446,13 +1448,13 @@
   rm -rf conftest*
   CPP="${CC-cc} -nologo -E"
   cat > conftest.$ac_ext <<EOF
-#line 1450 "configure"
+#line 1452 "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:1456: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1458: \"$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
   :
@@ -1478,17 +1480,17 @@
 
 ac_safe=`echo "net/bpf.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for net/bpf.h""... $ac_c" 1>&6
-echo "configure:1482: checking for net/bpf.h" >&5
+echo "configure:1484: checking for net/bpf.h" >&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 1487 "configure"
+#line 1489 "configure"
 #include "confdefs.h"
 #include <net/bpf.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1492: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1494: \"$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*
@@ -1512,17 +1514,17 @@
 
 ac_safe=`echo "pcap.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for pcap.h""... $ac_c" 1>&6
-echo "configure:1516: checking for pcap.h" >&5
+echo "configure:1518: checking for pcap.h" >&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 1521 "configure"
+#line 1523 "configure"
 #include "confdefs.h"
 #include <pcap.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1526: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1528: \"$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*
@@ -1545,7 +1547,7 @@
 fi
 
 echo $ac_n "checking for pcap_open_offline in -lpcap""... $ac_c" 1>&6
-echo "configure:1549: checking for pcap_open_offline in -lpcap" >&5
+echo "configure:1551: checking for pcap_open_offline in -lpcap" >&5
 ac_lib_var=`echo pcap'_'pcap_open_offline | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1553,7 +1555,7 @@
   ac_save_LIBS="$LIBS"
 LIBS="-lpcap  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1557 "configure"
+#line 1559 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1564,7 +1566,7 @@
 pcap_open_offline()
 ; return 0; }
 EOF
-if { (eval echo configure:1568: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1570: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -1595,7 +1597,7 @@
 
 # Wiretap check
 echo $ac_n "checking whether to include wiretap library""... $ac_c" 1>&6
-echo "configure:1599: checking whether to include wiretap library" >&5
+echo "configure:1601: checking whether to include wiretap library" >&5
 # Check whether --with-wiretap or --without-wiretap was given.
 if test "${with_wiretap+set}" = set; then
   withval="$with_wiretap"
@@ -1637,7 +1639,7 @@
 
 
 echo $ac_n "checking whether to enable ipv6 name resolution if available""... $ac_c" 1>&6
-echo "configure:1641: checking whether to enable ipv6 name resolution if available" >&5
+echo "configure:1643: checking whether to enable ipv6 name resolution if available" >&5
 if test "x$enable_ipv6" = "xno" ; then
 	echo "$ac_t""no" 1>&6
 else
@@ -1647,12 +1649,12 @@
 	v6lib=none
 
 	echo $ac_n "checking ipv6 stack type""... $ac_c" 1>&6
-echo "configure:1651: checking ipv6 stack type" >&5
+echo "configure:1653: checking ipv6 stack type" >&5
 	for i in v6d toshiba kame inria zeta linux; do
 		case $i in
 		v6d)
 			cat > conftest.$ac_ext <<EOF
-#line 1656 "configure"
+#line 1658 "configure"
 #include "confdefs.h"
 dnl
 #include </usr/local/v6/include/sys/types.h>
@@ -1672,7 +1674,7 @@
 			;;
 		toshiba)
 			cat > conftest.$ac_ext <<EOF
-#line 1676 "configure"
+#line 1678 "configure"
 #include "confdefs.h"
 dnl
 #include <sys/param.h>
@@ -1692,7 +1694,7 @@
 			;;
 		kame)
 			cat > conftest.$ac_ext <<EOF
-#line 1696 "configure"
+#line 1698 "configure"
 #include "confdefs.h"
 dnl
 #include <netinet/in.h>
@@ -1712,7 +1714,7 @@
 			;;
 		inria)
 			cat > conftest.$ac_ext <<EOF
-#line 1716 "configure"
+#line 1718 "configure"
 #include "confdefs.h"
 dnl
 #include <netinet/in.h>
@@ -1730,7 +1732,7 @@
 			;;
 		zeta)
 			cat > conftest.$ac_ext <<EOF
-#line 1734 "configure"
+#line 1736 "configure"
 #include "confdefs.h"
 dnl
 #include <sys/param.h>
@@ -1779,12 +1781,12 @@
 
 
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:1783: checking for ANSI C header files" >&5
+echo "configure:1785: checking for ANSI C header files" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1788 "configure"
+#line 1790 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -1792,7 +1794,7 @@
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1796: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1798: \"$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*
@@ -1809,7 +1811,7 @@
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 1813 "configure"
+#line 1815 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -1827,7 +1829,7 @@
 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 <<EOF
-#line 1831 "configure"
+#line 1833 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -1848,7 +1850,7 @@
   :
 else
   cat > conftest.$ac_ext <<EOF
-#line 1852 "configure"
+#line 1854 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -1859,7 +1861,7 @@
 exit (0); }
 
 EOF
-if { (eval echo configure:1863: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1865: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -1886,17 +1888,17 @@
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1890: checking for $ac_hdr" >&5
+echo "configure:1892: 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 1895 "configure"
+#line 1897 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1900: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1902: \"$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*
@@ -1927,17 +1929,17 @@
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1931: checking for $ac_hdr" >&5
+echo "configure:1933: 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 1936 "configure"
+#line 1938 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1941: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1943: \"$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*
@@ -1964,18 +1966,119 @@
 done
 
 
+
+# Check whether --enable-snmp or --disable-snmp was given.
+if test "${enable_snmp+set}" = set; then
+  enableval="$enable_snmp"
+  :
+else
+  enable_snmp=yes
+fi
+
+
+SNMP_A=''
+echo $ac_n "checking whether to use SNMP library if available""... $ac_c" 1>&6
+echo "configure:1982: checking whether to use SNMP library if available" >&5
+if test "x$enable_snmp" = "xno" ; then
+	echo "$ac_t""no" 1>&6
+else
+	echo "$ac_t""yes" 1>&6
+	for ac_hdr in ucd-snmp/snmp.h snmp/snmp.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1991: 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 1996 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2001: \"$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*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ 
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+	echo $ac_n "checking for asn_parse_header in -lsnmp""... $ac_c" 1>&6
+echo "configure:2028: checking for asn_parse_header in -lsnmp" >&5
+ac_lib_var=`echo snmp'_'asn_parse_header | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lsnmp  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2036 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char asn_parse_header();
+
+int main() {
+asn_parse_header()
+; return 0; }
+EOF
+if { (eval echo configure:2047: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  SNMP_A=-lsnmp
+else
+  echo "$ac_t""no" 1>&6
+{ echo "configure: error: Library snmp not found." 1>&2; exit 1; }
+fi
+
+fi
+
+
 # AC_C_CONST
 
 # We need to know whether "struct sockaddr" has an "sa_len" member
 # for get_interface_list().
 
 echo $ac_n "checking for sa_len in struct sockaddr""... $ac_c" 1>&6
-echo "configure:1974: checking for sa_len in struct sockaddr" >&5
+echo "configure:2077: checking for sa_len in struct sockaddr" >&5
 if eval "test \"`echo '$''{'ac_cv_ethereal_struct_sa_len'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1979 "configure"
+#line 2082 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -1983,7 +2086,7 @@
 struct sockaddr s; s.sa_len;
 ; return 0; }
 EOF
-if { (eval echo configure:1987: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2090: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_ethereal_struct_sa_len=yes
 else
@@ -2006,14 +2109,14 @@
 
 # We must know our byte order
 echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
-echo "configure:2010: checking whether byte ordering is bigendian" >&5
+echo "configure:2113: checking whether byte ordering is bigendian" >&5
 if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   ac_cv_c_bigendian=unknown
 # See if sys/param.h defines the BYTE_ORDER macro.
 cat > conftest.$ac_ext <<EOF
-#line 2017 "configure"
+#line 2120 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/param.h>
@@ -2024,11 +2127,11 @@
 #endif
 ; return 0; }
 EOF
-if { (eval echo configure:2028: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2131: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   # It does; now see whether it defined to BIG_ENDIAN or not.
 cat > conftest.$ac_ext <<EOF
-#line 2032 "configure"
+#line 2135 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/param.h>
@@ -2039,7 +2142,7 @@
 #endif
 ; return 0; }
 EOF
-if { (eval echo configure:2043: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2146: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_bigendian=yes
 else
@@ -2059,7 +2162,7 @@
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 2063 "configure"
+#line 2166 "configure"
 #include "confdefs.h"
 main () {
   /* Are we little or big endian?  From Harbison&Steele.  */
@@ -2072,7 +2175,7 @@
   exit (u.c[sizeof (long) - 1] == 1);
 }
 EOF
-if { (eval echo configure:2076: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2179: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_c_bigendian=no
 else
@@ -2098,13 +2201,13 @@
 
 if test $ac_cv_prog_gcc = yes; then
     echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6
-echo "configure:2102: checking whether ${CC-cc} needs -traditional" >&5
+echo "configure:2205: checking whether ${CC-cc} needs -traditional" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
     ac_pattern="Autoconf.*'x'"
   cat > conftest.$ac_ext <<EOF
-#line 2108 "configure"
+#line 2211 "configure"
 #include "confdefs.h"
 #include <sgtty.h>
 Autoconf TIOCGETP
@@ -2122,7 +2225,7 @@
 
   if test $ac_cv_prog_gcc_traditional = no; then
     cat > conftest.$ac_ext <<EOF
-#line 2126 "configure"
+#line 2229 "configure"
 #include "confdefs.h"
 #include <termio.h>
 Autoconf TCGETA
@@ -2144,12 +2247,12 @@
 fi
 
 echo $ac_n "checking for socket""... $ac_c" 1>&6
-echo "configure:2148: checking for socket" >&5
+echo "configure:2251: checking for socket" >&5
 if eval "test \"`echo '$''{'ac_cv_func_socket'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2153 "configure"
+#line 2256 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char socket(); below.  */
@@ -2172,7 +2275,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:2176: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2279: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_socket=yes"
 else
@@ -2198,12 +2301,12 @@
 SNPRINTF_C=""
 SNPRINTF_O=""
 echo $ac_n "checking for snprintf""... $ac_c" 1>&6
-echo "configure:2202: checking for snprintf" >&5
+echo "configure:2305: checking for snprintf" >&5
 if eval "test \"`echo '$''{'ac_cv_func_snprintf'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2207 "configure"
+#line 2310 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char snprintf(); below.  */
@@ -2226,7 +2329,7 @@
 
 ; return 0; }
 EOF
-if { (eval echo configure:2230: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2333: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_snprintf=yes"
 else
@@ -2421,6 +2524,7 @@
 s%@CPP@%$CPP%g
 s%@LIBWIRETAP_A@%$LIBWIRETAP_A%g
 s%@SUBDIRS@%$SUBDIRS%g
+s%@SNMP_A@%$SNMP_A%g
 s%@SNPRINTF_C@%$SNPRINTF_C%g
 s%@SNPRINTF_O@%$SNPRINTF_O%g
 s%@subdirs@%$subdirs%g
diff -urN ethereal/configure.in ethereal-new/configure.in
--- ethereal/configure.in	Fri Apr 30 11:14:38 1999
+++ ethereal-new/configure.in	Fri Apr 30 11:30:16 1999
@@ -118,6 +118,24 @@
 
 AC_CHECK_HEADERS(sys/sockio.h sys/types.h netinet/in.h)
 
+
+dnl SNMP Check
+AC_ARG_ENABLE(snmp,
+[  --enable-snmp           use SNMP library, if available.  [default=yes]],,enable_snmp=yes)
+
+SNMP_A=''
+AC_MSG_CHECKING(whether to use SNMP library if available)
+if test "x$enable_snmp" = "xno" ; then
+	AC_MSG_RESULT(no)
+else
+	AC_MSG_RESULT(yes)
+	AC_CHECK_HEADERS(ucd-snmp/snmp.h snmp/snmp.h)
+	AC_CHECK_LIB(snmp, asn_parse_header,
+		SNMP_A=-lsnmp,
+		AC_MSG_ERROR(Library snmp not found.))
+fi
+AC_SUBST(SNMP_A)
+
 dnl Checks for typedefs, structures, and compiler characteristics.
 # AC_C_CONST
 
diff -urN ethereal/packet-snmp.c ethereal-new/packet-snmp.c
--- ethereal/packet-snmp.c	Wed Dec 31 19:00:00 1969
+++ ethereal-new/packet-snmp.c	Thu Apr 29 17:11:02 1999
@@ -0,0 +1,883 @@
+/* packet-snmp.c
+ * Routines for SNMP (simple network management protocol)
+ * D.Jorand (c) 1998
+ *
+ * $Id: packet-snmp.c,v 1.1 1999/02/22 11:49:53 root Exp root $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@xxxxxxxxxx>
+ * Copyright 1998 Didier Jorand
+ *
+ * 
+ * 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
+ * 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#define WITH_SNMP_UCD 1
+
+#if defined(HAVE_UCD_SNMP_SNMP_H)
+  #define WITH_SNMP_UCD 1
+#elif defined(HAVE_SNMP_SNMP_H)
+  #defined WITH_SNMP_UCD 1
+#endif
+
+#if defined(WITH_SNMP_CMU) || defined(WITH_SNMP_UCD)
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+#include <glib.h>
+#include "packet.h"
+
+#define in_addr_t u_int
+
+#ifdef WITH_SNMP_UCD
+/* should be defined only if supported in ucd-snmp */
+#define OPAQUE_SPECIAL_TYPES 1
+#include <ucd-snmp/asn1.h>
+#include <ucd-snmp/snmp.h>
+#include <ucd-snmp/snmp_api.h>
+#include <ucd-snmp/snmp_impl.h>
+#include <ucd-snmp/mib.h>
+
+typedef long SNMP_INT;
+typedef unsigned  long SNMP_UINT;
+#define OID_FORMAT_STRING "%ld"
+#define OID_FORMAT_STRING1 ".%ld"
+
+#endif
+#ifdef WITH_SNMP_CMU
+#include <snmp/snmp.h>
+
+#define SNMP_MSG_GET GET_REQ_MSG
+#define SNMP_MSG_GETNEXT GETNEXT_REQ_MSG
+#define SNMP_MSG_RESPONSE GET_RSP_MSG
+#define SNMP_MSG_SET SET_REQ_MSG	    
+#define SNMP_MSG_TRAP TRP_REQ_MSG
+#define SNMP_MSG_GETBULK SNMP_PDU_GETBULK
+#define SNMP_MSG_INFORM SNMP_PDU_INFORM
+#define SNMP_MSG_TRAP2 SNMP_PDU_V2TRAP
+#define SNMP_MSG_REPORT SNMP_PDU_REPORT
+
+#ifndef SNMP_VERSION_2c
+#define SNMP_VERSION_2c 1
+#endif
+#ifndef SNMP_VERSION_2u
+#define SNMP_VERSION_2u 2
+#endif
+#ifndef SNMP_VERSION_3
+#define SNMP_VERSION_3 3
+#endif
+
+#define SNMP_TRAP_AUTHFAIL SNMP_TRAP_AUTHENTICATIONFAILURE
+
+#ifndef COMMUNITY_MAX_LEN
+#define COMMUNITY_MAX_LEN 256
+#endif
+
+#ifndef ASN_INTEGER
+#define ASN_INTEGER SMI_INTEGER
+#endif
+#ifndef ASN_OCTET_STR
+#define ASN_OCTET_STR SMI_STRING
+#endif
+#ifndef ASN_OBJECT_ID
+#define ASN_OBJECT_ID SMI_OBJID
+#endif
+#ifndef ASN_NULL
+#define ASN_NULL SMI_NULLOBJ
+#endif
+#ifndef ASN_IPADDRESS
+#define ASN_IPADDRESS SMI_IPADDRESS
+#endif
+#ifndef ASN_COUNTER
+#define ASN_COUNTER SMI_COUNTER32
+#endif
+#ifndef ASN_GAUGE
+#define ASN_GAUGE SMI_GAUGE32
+#endif
+#ifndef ASN_TIMETICKS
+#define ASN_TIMETICKS SMI_TIMETICKS
+#endif
+#ifndef ASN_OPAQUE
+#define ASN_OPAQUE SMI_OPAQUE
+#endif
+#ifndef ASN_COUNTER64
+#define ASN_COUNTER64 SMI_COUNTER64
+#endif
+#ifndef ASN_UINTEGER
+/* historic: should not be used! */
+#define ASN_UINTEGER (ASN_APPLICATION | 7)
+#endif
+#ifndef ASN_NSAP
+/* historic: should not be used! */
+#define ASN_NSAP (ASN_APPLICATION | 5)
+#endif
+#ifndef SNMP_NOSUCHOBJECT
+#define SNMP_NOSUCHOBJECT SMI_NOSUCHOBJECT
+#endif
+#ifndef SNMP_NOSUCHINSTANCE
+#define SNMP_NOSUCHINSTANCE SMI_NOSUCHINSTANCE
+#endif
+#ifndef SNMP_ENDOFMIBVIEW
+#define SNMP_ENDOFMIBVIEW SMI_ENDOFMIBVIEW
+#endif
+
+
+typedef int SNMP_INT;
+typedef unsigned int SNMP_UINT;
+#define OID_FORMAT_STRING "%d"
+#define OID_FORMAT_STRING1 ".%d"
+
+#endif
+
+static const char *get_version(int version)
+{
+	switch(version) {
+	 case SNMP_VERSION_1:
+		return "VERSION 1";
+		break;
+	 case SNMP_VERSION_2c:
+		return "VERSION 2C";
+		break;
+	 case SNMP_VERSION_2u:
+		return "VERSION 2U";
+		break;	   
+	 case SNMP_VERSION_3:
+		return "VERSION 3";
+		break;		
+	 default:
+		return "UNKNOWN";
+		break;
+	}
+	return "";
+}
+	
+static const char *get_pdu_type(u_char pdu_type)
+{
+	switch(pdu_type) {
+	 case SNMP_MSG_GET:
+		return "GET";
+		break;
+	 case SNMP_MSG_GETNEXT:
+		return "GET-NEXT";
+		break;
+	 case SNMP_MSG_SET:
+		return "SET";
+		break;
+	 case SNMP_MSG_RESPONSE:
+		return "RESPONSE";
+		break;
+	 case SNMP_MSG_TRAP:
+		return "TRAP-V1";
+		break;
+	 case SNMP_MSG_GETBULK:
+		return "GETBULK";
+		break;
+	 case SNMP_MSG_INFORM:
+		return "INFORM";
+		break;
+	 case SNMP_MSG_TRAP2:
+		return "TRAP-V2";
+		break;
+	 case SNMP_MSG_REPORT:
+		return "REPORT";
+		break;
+	 default:
+		return "UNKNOWN";
+		break;
+	}
+	return "";
+}
+
+static const char *get_error_status(long status)
+{
+	switch(status) {
+	 case SNMP_ERR_NOERROR:
+		return "NO ERROR";
+		break;
+	 case SNMP_ERR_TOOBIG:
+		return "ERROR: TOOBIG";
+		break;
+	 case SNMP_ERR_NOSUCHNAME:
+		return "ERROR: NO SUCH NAME";
+		break;
+	 case SNMP_ERR_BADVALUE:
+		return "ERROR: BAD VALUE";
+		break;
+	 case SNMP_ERR_READONLY:
+		return "ERROR: READ ONLY";
+		break;
+	 case SNMP_ERR_GENERR:
+		return "ERROR: GENERIC ERROR";
+		break;
+	 case SNMP_ERR_NOACCESS:
+		return "ERROR: NO ACCESS";
+		break;
+	 case SNMP_ERR_WRONGTYPE:
+		return "ERROR: WRONG TYPE";
+		break;
+	 case SNMP_ERR_WRONGLENGTH:
+		return "ERROR: WRONG LENGTH";
+		break;
+	 case SNMP_ERR_WRONGENCODING:
+		return "ERROR: WRONG ENCODING";
+		break;
+	 case SNMP_ERR_WRONGVALUE:
+		return "ERROR: WRONG VALUE";
+		break;
+	 case SNMP_ERR_NOCREATION:
+		return "ERROR: NO CREATION";
+		break;
+	 case SNMP_ERR_INCONSISTENTVALUE:
+		return "ERROR: INCONSISTENT VALUE";
+		break;
+	 case SNMP_ERR_RESOURCEUNAVAILABLE:
+		return "ERROR: RESOURCE UNAVAILABLE";
+		break;
+	 case SNMP_ERR_COMMITFAILED:
+		return "ERROR: COMMIT FAILED";
+		break;
+	 case SNMP_ERR_UNDOFAILED:
+		return "ERROR: UNDO FAILED";
+		break;
+	 case SNMP_ERR_AUTHORIZATIONERROR:
+		return "ERROR: AUTHORIZATION ERROR";
+		break;
+	 case SNMP_ERR_NOTWRITABLE:
+		return "ERROR: NOT WRITABLE";
+		break;
+	 case SNMP_ERR_INCONSISTENTNAME:
+		return "ERROR: INCONSISTENT NAME";
+		break;
+	 default:
+		return "ERROR: UNKNOWN";
+		break;
+	}
+	return "";
+}
+
+static const char *get_trap_type(long trap_type)
+{
+	switch(trap_type) {
+	 case SNMP_TRAP_COLDSTART:
+		return "COLD START";
+		break;
+	 case SNMP_TRAP_WARMSTART:
+		return "WARM START";
+		break;
+	 case SNMP_TRAP_LINKDOWN:
+		return "LINK DOWN";
+		break;
+	 case SNMP_TRAP_LINKUP:
+		return "LINK UP";
+		break;
+	 case SNMP_TRAP_AUTHFAIL:
+		return "AUTHENTICATION FAILED";
+		break;
+	 case SNMP_TRAP_EGPNEIGHBORLOSS:
+		return "EGP NEIGHBORLOSS";
+		break;
+	 case SNMP_TRAP_ENTERPRISESPECIFIC:
+		return "ENTERPRISE SPECIFIC";
+		break;
+	 default:
+		return "UNKNOWN";
+		break;
+	}
+	return "";
+}
+
+void
+dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) 
+{
+	int length=fd->pkt_len-offset;
+	u_char *data, *tmp_data;
+
+	int all_length, header_length;
+	u_char type, pdu_type;
+	int pdu_type_length;
+	SNMP_INT request_id, error_status, error_index;
+	int request_id_length, error_status_length, error_index_length;
+	
+	SNMP_INT version;
+    u_char community[COMMUNITY_MAX_LEN];
+    int community_length = COMMUNITY_MAX_LEN;
+
+	oid enterprise[MAX_NAME_LEN];
+	int enterprise_length;
+	SNMP_INT trap_type, specific_type;
+	SNMP_UINT timestamp;
+	
+	int tmp_length;
+	oid vb_name[MAX_NAME_LEN];
+	int vb_name_length;
+	int vb_index;
+	u_char vb_type;
+	char vb_string[MAX_NAME_LEN*6]; /* TBC */
+	char vb_string2[2048]; /* TBC */
+	char tmp_string[12];
+	SNMP_INT vb_integer_value;
+	SNMP_UINT vb_unsigned_value;
+#ifdef WITH_SNMP_UCD	
+	struct counter64 vb_counter64_value;
+#endif	
+	oid vb_oid_value[MAX_NAME_LEN];
+	int vb_oid_value_length;
+	unsigned char vb_string_value[128];
+	int vb_string_value_length;
+#ifdef WITH_SNMP_UCD	
+	float vb_float_value;
+	double vb_double_value;
+#endif
+	
+	int i;
+	
+	proto_tree *snmp_tree=NULL;
+	proto_item *item=NULL;
+
+	/* NOTE: we have to parse the message piece by piece, since the
+	 * capture length may be less than the message length: a 'global'
+	 * parsing is likely to fail.
+	 */
+	
+#ifdef WITH_SNMP_UCD	
+	/* parse the SNMP header */
+	  if(NULL == asn_parse_header( &pd[offset], &length, &type)) {
+		fprintf(stderr, "<1> asn_parse_header failed\n");
+		dissect_data(pd, offset, fd, tree);
+		return;
+	}
+	
+	if (type != (ASN_SEQUENCE | ASN_CONSTRUCTOR)) {
+		fprintf(stderr, "<2> not a snmp pdu\n");
+		dissect_data(pd, offset, fd, tree);
+		return;
+	}
+	
+	/* authenticates message */
+	length=fd->pkt_len-offset;
+	header_length=length;
+	data = snmp_comstr_parse(&pd[offset], &length, community, &community_length,&version);
+	if(NULL == data) {
+		fprintf(stderr, "<3> authentication failed\n");
+		dissect_data(pd, offset, fd, tree);
+		return;
+	}
+#endif
+#ifdef WITH_SNMP_CMU
+	/* initialize length variables */
+	/* length=fd->pkt_len-offset; */
+	header_length=length;	
+
+	/* parse the SNMP header */
+	data = asn_parse_header( &pd[offset], &length, &type);
+	if(NULL == data) {
+		fprintf(stderr, "<1> asn_parse_header failed\n");
+		dissect_data(pd, offset, fd, tree);
+		return;
+	}
+	
+	if (type != (ASN_SEQUENCE | ASN_CONSTRUCTOR)) {
+		fprintf(stderr, "<2> not a snmp pdu\n");
+		dissect_data(pd, offset, fd, tree);
+		return;
+	}
+
+	data = asn_parse_int(data, &length, &type, &version, sizeof(SNMP_INT));
+	if(NULL == data) {
+		fprintf(stderr, "<2.1> parse snmp version failed\n");
+		dissect_data(pd, offset, fd, tree);
+		return;
+	}
+	data = asn_parse_string(data, &length, &type, community, &community_length);
+	if(NULL == data) {
+		fprintf(stderr, "<2.1> parse snmp community failed\n");
+		dissect_data(pd, offset, fd, tree);
+		return;
+	}
+	community[community_length] = '\0';	
+#endif	  
+
+	header_length-=length;
+	/* printf("Community is %s, version is %d (header length is %d)\n", community, version, header_length); */
+	if(version != SNMP_VERSION_1) {
+		fprintf(stderr, "<4> only SNMP V1 is supported\n");
+		dissect_data(pd, offset, fd, tree);
+		return;
+	}
+
+	pdu_type_length=length;
+    data = asn_parse_header(data, &length, &pdu_type);
+    if (data == NULL) {
+		fprintf(stderr, "<5> parsing of pdu type failed\n");
+		dissect_data(pd, offset, fd, tree);
+		return;
+	}
+	pdu_type_length-=length;
+	/* printf("pdu type is %#x (length is %d)\n", type, pdu_type_length); */
+	
+	/* get the fields in the PDU preceeding the variable-bindings sequence */
+    if (pdu_type != SNMP_MSG_TRAP){
+
+        /* request id */
+		request_id_length=length;
+		data = asn_parse_int(data, &length, &type, &request_id, sizeof(request_id));
+		if (data == NULL) {
+			fprintf(stderr, "<6> parsing of request-id failed\n");
+			dissect_data(pd, offset, fd, tree);
+			return;
+		}
+		request_id_length-=length;
+		/* printf("request id is %#lx (length is %d)\n", request_id, request_id_length); */
+		
+        /* error status (getbulk non-repeaters) */
+		error_status_length=length;
+		data = asn_parse_int(data, &length, &type, &error_status, sizeof(error_status));
+		if (data == NULL) {
+			fprintf(stderr, "<7> parsing of error-status failed\n");
+			dissect_data(pd, offset, fd, tree);
+			return;
+		}
+		error_status_length-=length;
+
+        /* error index (getbulk max-repetitions) */
+		error_index_length=length;
+		data = asn_parse_int(data, &length, &type, &error_index, sizeof(error_index));
+		if (data == NULL) {
+			fprintf(stderr, "<8> parsing of error-index failed\n");
+			dissect_data(pd, offset, fd, tree);
+			return;
+		}
+		error_index_length-=length;
+
+		if(tree) {
+			/* all_length=header_length+pdu_type_length+request_id_length+error_status_length+error_index_length; */
+			all_length=fd->pkt_len-offset;
+			item = proto_tree_add_item(tree, offset, all_length, "Simple Network Management Protocol");
+			snmp_tree = proto_tree_new();
+			proto_item_add_subtree(item, snmp_tree, ETT_SNMP);
+			proto_tree_add_item(snmp_tree, offset, header_length, "Community: \"%s\", Version: %s", community, get_version(version));
+			offset+=header_length;
+			proto_tree_add_item(snmp_tree, offset, pdu_type_length, "Pdu type: %s (%#x)", get_pdu_type(pdu_type), pdu_type);
+			offset+=pdu_type_length;
+			proto_tree_add_item(snmp_tree, offset, request_id_length, "Request Id.: %#x", (unsigned int)request_id);
+			offset+=request_id_length;
+			proto_tree_add_item(snmp_tree, offset, error_status_length, "Error Status: %s (%d)", get_error_status(error_status), (int)error_status);
+			offset+=error_status_length;
+			proto_tree_add_item(snmp_tree, offset, error_index_length, "Error Index: %d", (int)error_index);
+			offset+=error_index_length;
+		} else {
+			offset+=header_length;
+			offset+=pdu_type_length;
+			offset+=request_id_length;
+			offset+=error_status_length;
+			offset+=error_index_length;		
+		}
+		
+    } else {
+        /* an SNMPv1 trap PDU */
+		if(tree) {
+			all_length=fd->pkt_len-offset;
+			item = proto_tree_add_item(tree, offset, all_length, "Simple Network Management Protocol");
+			snmp_tree = proto_tree_new();
+			proto_item_add_subtree(item, snmp_tree, ETT_SNMP);
+			proto_tree_add_item(snmp_tree, offset, header_length, "Community: \"%s\", Version: %s", community, get_version(version));
+			offset+=header_length;
+			proto_tree_add_item(snmp_tree, offset, pdu_type_length, "Pdu type: %s (%#x)", get_pdu_type(pdu_type), pdu_type);
+			offset+=pdu_type_length;
+        } else {
+			offset+=header_length;
+			offset+=pdu_type_length;
+		}
+		
+		/* enterprise */
+		enterprise_length = MAX_NAME_LEN;
+		tmp_length=length;
+		data = asn_parse_objid(data, &length, &type, enterprise,  &enterprise_length);
+		if (data == NULL) {
+			fprintf(stderr, "<9> parsing of enterprise oid failed\n");
+			dissect_data(pd, offset, fd, tree);
+			return;
+		}
+		tmp_length-=length;
+
+		sprintf(vb_string, OID_FORMAT_STRING, enterprise[0]);
+		for(i=1; i<enterprise_length;i++) {
+			sprintf(tmp_string, OID_FORMAT_STRING1, enterprise[i]);
+			strcat(vb_string,tmp_string);
+		}
+		if(tree) {
+			proto_tree_add_item(snmp_tree, offset, tmp_length, "Enterprise: %s", vb_string);
+		}
+		offset+=tmp_length;
+
+        /* agent address */
+		vb_string_value_length = 4;
+		tmp_length=length;
+		data = asn_parse_string(data, &length, &type, vb_string_value, &vb_string_value_length);
+		if (data == NULL) {
+			fprintf(stderr, "<10> parsing of agent address failed\n");
+			dissect_data(pd, offset, fd, tree);
+			return;
+		}
+		tmp_length-=length;
+		if(tree) {
+			proto_tree_add_item(snmp_tree, offset, tmp_length, "Agent address: %d.%d.%d.%d",
+							 vb_string_value[0],vb_string_value[1],vb_string_value[2],vb_string_value[3]);
+		}
+		offset+=tmp_length;
+		
+        /* generic trap */
+		tmp_length=length;
+		data = asn_parse_int(data, &length, &type, &trap_type, sizeof(trap_type));
+		if (data == NULL) {
+			fprintf(stderr, "<11> parsing of trap type failed\n");
+			dissect_data(pd, offset, fd, tree);
+			return;
+		}
+		tmp_length-=length;
+		if(tree) {
+			proto_tree_add_item(snmp_tree, offset, tmp_length, "Trap type: %s (%ld)", get_trap_type(trap_type), (long)trap_type);
+		}		
+		offset+=tmp_length;
+		
+        /* specific trap */
+		tmp_length=length;
+		data = asn_parse_int(data, &length, &type, &specific_type, sizeof(specific_type));
+		if (data == NULL) {
+			fprintf(stderr, "<12> parsing of specific trap type failed\n");
+			dissect_data(pd, offset, fd, tree);
+			return;
+		}
+		tmp_length-=length;
+		if(tree) {
+			proto_tree_add_item(snmp_tree, offset, tmp_length, "Specific trap type: %ld (%#lx)", (long)specific_type, (long)specific_type);
+		}		
+		offset+=tmp_length;
+		
+        /* timestamp  */
+		tmp_length=length;
+		data = asn_parse_unsigned_int(data, &length, &type, &timestamp, sizeof(timestamp));
+		if (data == NULL) {
+			fprintf(stderr, "<13> parsing of timestamp failed\n");
+			dissect_data(pd, offset, fd, tree);
+			return;
+		}
+		tmp_length-=length;
+		if(tree) {
+			proto_tree_add_item(snmp_tree, offset, tmp_length, "Timestamp: %lu", (unsigned long)timestamp);
+		}		
+		offset+=tmp_length;
+    }
+	
+	/* variable bindings */
+    /* get header for variable-bindings sequence */
+	tmp_length=length;
+    data = asn_parse_header(data, &length, &type);
+    if (data == NULL) {
+		fprintf(stderr, "<+> parsing of variable-bindings header failed\n");
+		dissect_data(pd, offset, fd, tree);
+		return;
+	}
+	tmp_length-=length;
+    if (type != (u_char)(ASN_SEQUENCE | ASN_CONSTRUCTOR)) {
+		fprintf(stderr, "<+> bad type for variable-bindings header\n");
+		dissect_data(pd, offset, fd, tree);
+		return;
+	}
+	offset+=tmp_length;
+	/* printf("VB header: offset is %d; length is %d.\n", offset, tmp_length); */
+
+	/* loop on variable bindings */
+	vb_index=0;
+	while(length>0) {
+		vb_index++;
+		/* printf("VB index is %d (offset=%d; length=%d).\n", vb_index, offset, length); */
+		/* parse type */
+		tmp_length=length;
+		tmp_data=data;
+		data = asn_parse_header(data, &tmp_length, &type);
+		if (data == NULL) {
+			fprintf(stderr, "<20> parsing of variable-binding header failed\n");
+			dissect_data(pd, offset, fd, tree);
+			return;
+		}
+		if (type != (u_char)(ASN_SEQUENCE | ASN_CONSTRUCTOR)) {
+			fprintf(stderr, "<21> bad type for variable-binding header (%#x)\n", type);
+			dissect_data(pd, offset, fd, tree);
+			return;
+		}
+		tmp_length=(int)(data-tmp_data);
+		length-=tmp_length;
+		offset+=tmp_length;
+		
+		/* parse object identifier */
+		vb_name_length=MAX_NAME_LEN;
+		tmp_length=length;
+		data = asn_parse_objid(data, &length, &type, vb_name, &vb_name_length);
+		if (data == NULL) {
+			fprintf(stderr, "<22> no object-identifier for variable-binding\n");
+			dissect_data(pd, offset, fd, tree);
+			return;
+		}
+
+		if (type != (u_char)(ASN_UNIVERSAL | ASN_PRIMITIVE | ASN_OBJECT_ID)) {
+			fprintf(stderr, "<23> bad type for variable-binding (%#x)\n", type);
+			dissect_data(pd, offset, fd, tree);
+			return;
+		}
+		tmp_length-=length;
+
+		if(tree) {
+			sprintf(vb_string, OID_FORMAT_STRING, vb_name[0]);
+			for(i=1; i<vb_name_length;i++) {
+				sprintf(tmp_string, OID_FORMAT_STRING1, vb_name[i]);
+				strcat(vb_string,tmp_string);
+			}
+			
+			sprint_objid(vb_string2, vb_name, vb_name_length);
+			
+			proto_tree_add_item(snmp_tree, offset, tmp_length, "Object identifier %d: %s (%s)", vb_index, vb_string, vb_string2);
+		}
+		offset+=tmp_length;
+				
+		/* parse the type of the object */
+		tmp_length=length;
+		if (NULL == asn_parse_header(data, &tmp_length, &vb_type)){
+			fprintf(stderr, "<24> no type for variable-binding value\n");
+			dissect_data(pd, offset, fd, tree);
+			return;
+		}
+
+		/* parse the value */
+		switch(vb_type) {
+		 case ASN_NULL:
+			tmp_length=length;
+			data=asn_parse_null(data, &length, &type);
+			tmp_length-=length;
+			if (data == NULL){
+				fprintf(stderr, "<25> parsing failed for null value\n");
+				dissect_data(pd, offset, fd, tree);
+				return;
+			}
+			if(tree) {
+				proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: NULL");
+			}
+			offset+=tmp_length;
+			break;
+			
+		 case ASN_INTEGER:
+			tmp_length=length;
+			data=asn_parse_int(data,  &length, &type, &vb_integer_value, sizeof(vb_integer_value));
+			tmp_length-=length;
+			if (data == NULL){
+				fprintf(stderr, "<26> parsing failed for integer value\n");
+				dissect_data(pd, offset, fd, tree);
+				return;
+			}
+			if(tree) {
+				proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: <i> %ld (%#lx)", (long)vb_integer_value, (long)vb_integer_value);
+			}
+			offset+=tmp_length;
+			break;
+
+		 case ASN_COUNTER:
+		 case ASN_GAUGE:
+		 case ASN_TIMETICKS:
+		 case ASN_UINTEGER:
+			tmp_length=length;
+			data=asn_parse_unsigned_int(data, &length, &type, &vb_unsigned_value, sizeof(vb_unsigned_value));
+			tmp_length-=length;
+			if (data == NULL){
+				fprintf(stderr, "<27> parsing failed for unsigned value\n");
+				dissect_data(pd, offset, fd, tree);
+				return;
+			}
+			if(tree) {
+				proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: <u> %lu (%#lx)", (unsigned long)vb_unsigned_value, (unsigned long)vb_unsigned_value);
+			}
+			offset+=tmp_length;
+			break;
+
+#ifdef WITH_SNMP_UCD
+			/* only ucd support 64bits types */
+		 case ASN_COUNTER64:
+#ifdef OPAQUE_SPECIAL_TYPES
+		 case ASN_OPAQUE_COUNTER64:
+		 case ASN_OPAQUE_U64:
+#endif /* OPAQUE_SPECIAL_TYPES */
+			tmp_length=length;
+			data=asn_parse_unsigned_int64(data, &length, &type, &vb_counter64_value, sizeof(vb_counter64_value));
+			tmp_length-=length;
+			if (data == NULL){
+				fprintf(stderr, "<28> parsing failed for counter64 value\n");
+				dissect_data(pd, offset, fd, tree);
+				return;
+			}
+			if(tree) {
+				proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: <i64> %lu:%lu (%#lx:%lx)",
+								 vb_counter64_value.high,
+								 vb_counter64_value.low,
+								 vb_counter64_value.high,
+								 vb_counter64_value.low);
+			}
+			offset+=tmp_length;
+			break;
+#endif /* WITH_SNMP_UCD */
+			
+		 case ASN_OBJECT_ID:
+			vb_oid_value_length = MAX_NAME_LEN;
+			tmp_length=length;
+			data=asn_parse_objid(data, &length, &type, vb_oid_value, &vb_oid_value_length);
+			tmp_length-=length;
+			if (data == NULL){
+				fprintf(stderr, "<29> parsing failed for oid value\n");
+				dissect_data(pd, offset, fd, tree);
+				return;
+			}
+			if(tree) {
+				sprintf(vb_string, OID_FORMAT_STRING, vb_oid_value[0]);
+				for(i=1; i<vb_oid_value_length;i++) {
+					sprintf(tmp_string, OID_FORMAT_STRING1, vb_oid_value[i]);
+					strcat(vb_string,tmp_string);
+				}
+				proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: <oid> %s", vb_string);
+			}			
+			offset+=tmp_length;
+			break;
+		 case ASN_OCTET_STR:
+		 case ASN_IPADDRESS:
+		 case ASN_OPAQUE:
+		 case ASN_NSAP:
+			vb_string_value_length=128;
+			tmp_length=length;
+			data=asn_parse_string(data, &length, &type, vb_string_value, &vb_string_value_length);
+			tmp_length-=length;
+			if (data == NULL){
+				fprintf(stderr, "<30> parsing failed for octet string value\n");
+				dissect_data(pd, offset, fd, tree);
+				return;
+			}
+			if(tree) {
+				vb_string_value[vb_string_value_length]=0;
+				/* if some characters are not printable, display the string as
+				 * bytes */
+				for(i=0; i<vb_string_value_length; i++) {
+					if(!(isprint(vb_string_value[i]) || isspace(vb_string_value[i]))) break;
+				}
+				if(i<vb_string_value_length) {
+					sprintf(vb_string, "%03d", (int)vb_string_value[0]);
+					for(i=1; i<vb_string_value_length; i++) {
+						sprintf(tmp_string, ".%03d", (int)vb_string_value[i]);
+						strcat(vb_string,tmp_string);
+					}
+					proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: <str> %s", vb_string);
+				}else {
+					proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: <str> %s", vb_string_value);
+				}
+			}
+			offset+=tmp_length;
+			break;			
+
+#ifdef OPAQUE_SPECIAL_TYPES
+		 case ASN_OPAQUE_I64:
+			tmp_length=length;
+			data=asn_parse_signed_int64(data, &length, &type, &vb_counter64_value, sizeof(vb_counter64_value));
+			tmp_length-=length;
+			if (data == NULL){
+				fprintf(stderr, "<31> parsing failed for integer64 value\n");
+				dissect_data(pd, offset, fd, tree);
+				return;
+			}
+			if(tree) {
+				proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: <i64> %ld:%lu (%#lx:%lx)",
+								 vb_counter64_value.high,
+								 vb_counter64_value.low,
+								 vb_counter64_value.high,
+								 vb_counter64_value.low);
+			}
+			offset+=tmp_length;
+			break;
+			break;
+
+		 case ASN_OPAQUE_FLOAT:
+			tmp_length=length;
+			data=asn_parse_float(data, &length, &type,&vb_float_value, sizeof(vb_float_value));
+			tmp_length-=length;
+			if (data == NULL){
+				fprintf(stderr, "<32> parsing failed for float value\n");
+				dissect_data(pd, offset, fd, tree);
+				return;
+			}
+			if(tree) {
+				proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: <f> %f", (double)vb_float_value);
+			}
+			offset+=tmp_length;
+			break;
+			
+	    case ASN_OPAQUE_DOUBLE:
+			tmp_length=length;
+			data=asn_parse_double(data, &length, &type,&vb_double_value, sizeof(vb_double_value));
+			tmp_length-=length;
+			if (data == NULL){
+				fprintf(stderr, "<32> parsing failed for double value\n");
+				dissect_data(pd, offset, fd, tree);
+				return;
+			}
+			if(tree) {
+				proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: <d> %f", vb_double_value);
+			}
+			offset+=tmp_length;
+			break;
+#endif /* OPAQUE_SPECIAL_TYPES */
+			
+		 case SNMP_NOSUCHOBJECT:
+			if(tree) {
+				proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: <err> no such object");
+			}			
+			break;
+		 case SNMP_NOSUCHINSTANCE:
+			if(tree) {
+				proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: <err> no such instance");
+			}			
+			break;
+		 case SNMP_ENDOFMIBVIEW:
+			if(tree) {
+				proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: <err> end of mib view");
+			}			
+			break;
+			
+		 default:
+			fprintf(stderr, "<=> unsupported type for variable-binding value: %#x\n", vb_type);
+			dissect_data(pd, offset, fd, tree);
+			return;
+		}			
+	}
+}
+
+#endif /* WITH_SNMP: CMU or UCD */
diff -urN ethereal/packet-udp.c ethereal-new/packet-udp.c
--- ethereal/packet-udp.c	Fri Apr 30 11:14:54 1999
+++ ethereal-new/packet-udp.c	Tue Apr 27 16:59:56 1999
@@ -61,6 +61,7 @@
 #define UDP_PORT_IPX    213
 #define UDP_PORT_NBNS	137
 #define UDP_PORT_NBDGM	138
+#define UDP_PORT_SNMP   161
 #define UDP_PORT_RIP    520
 #define UDP_PORT_VINES	573
 
@@ -218,6 +219,9 @@
       break;
     case UDP_PORT_IPX: /* RFC 1234 */
       dissect_ipx(pd, offset, fd, tree);
+      break;
+    case UDP_PORT_SNMP:
+      dissect_snmp(pd, offset, fd, tree);
       break;
     case UDP_PORT_VINES:
       /* FIXME: AFAIK, src and dst port must be the same */
diff -urN ethereal/packet.h ethereal-new/packet.h
--- ethereal/packet.h	Fri Apr 30 11:14:56 1999
+++ ethereal-new/packet.h	Fri Apr 30 08:29:24 1999
@@ -223,6 +223,7 @@
 	ETT_TELNET,
 	ETT_TELNET_SUBOPT,
 	ETT_NNTP,
+	ETT_SNMP,
 	ETT_NBSS,
 	ETT_NBSS_FLAGS,
 	NUM_TREE_TYPES	/* last item number plus one */