Created a new protocol tree implementation and a new display filter
authorGilbert Ramirez <gram@alumni.rice.edu>
Wed, 7 Jul 1999 22:52:57 +0000 (22:52 -0000)
committerGilbert Ramirez <gram@alumni.rice.edu>
Wed, 7 Jul 1999 22:52:57 +0000 (22:52 -0000)
mechanism that is built into ethereal. Wiretap is now used to read all
file formats. Libpcap is used only for capturing.

svn path=/trunk/; revision=342

102 files changed:
Makefile.am
Makefile.in
README
acconfig.h
aclocal.m4
config.h.in
configure
configure.in
dfilter-grammar.y [new file with mode: 0644]
dfilter.c [new file with mode: 0644]
dfilter.h [new file with mode: 0644]
doc/proto_tree [new file with mode: 0644]
ethereal.c
ethertype.c
file.c
file.h
follow.c
gtkpacket.c
gtkpacket.h
menu.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-fddi.c
packet-ftp.c
packet-giop.c
packet-gre.c
packet-http.c
packet-icmpv6.c
packet-ip.c
packet-ipsec.c
packet-ipv6.c
packet-ipx.c
packet-isakmp.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-pppoe.c
packet-pptp.c
packet-raw.c
packet-rip.c
packet-rsvp.c
packet-rtsp.c
packet-sdp.c
packet-smb.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
packet.c
packet.h
print.c
proto.c [new file with mode: 0644]
proto.h [new file with mode: 0644]
resolv.c
resolv.h
summary.c
summary.h
wiretap/ChangeLog
wiretap/Makefile.am
wiretap/Makefile.in
wiretap/aclocal.m4
wiretap/bpf-engine.c [deleted file]
wiretap/bpf-engine.h [deleted file]
wiretap/bpf.c [deleted file]
wiretap/bpf.h [deleted file]
wiretap/configure
wiretap/configure.in
wiretap/ct-compile.c [deleted file]
wiretap/ct-compile.h [deleted file]
wiretap/ct-grammar.y [deleted file]
wiretap/ct-main.c [deleted file]
wiretap/ct-scanner.l [deleted file]
wiretap/file.c
wiretap/filter-eth [deleted file]
wiretap/filter-tr [deleted file]
wiretap/glib-new.c [deleted file]
wiretap/glib-new.h [deleted file]
wiretap/rt-compile.c [deleted file]
wiretap/rt-compile.h [deleted file]
wiretap/rt-global.h [deleted file]
wiretap/rt-grammar-skel.y [deleted file]
wiretap/rt-scanner-skel.l [deleted file]
wiretap/wtap.c
wiretap/wtap.h

index e9ae9d17a4c9fd71e92fa9bba0f47165e2534a1a..e1a979325b828e4f67ca60af20c85b89192b2077 100644 (file)
@@ -4,6 +4,8 @@ man_MANS = ethereal.1
 
 sysconf_DATA = manuf
 
+YFLAGS=-d
+
 ethereal_SOURCES = \
        alignment.h    \
        capture.c      \
@@ -11,6 +13,9 @@ ethereal_SOURCES = \
        column.c       \
        column.h       \
        config.h       \
+       dfilter-grammar.y \
+       dfilter.c      \
+       dfilter.h      \
        display.c      \
        display.h      \
        ethereal.c     \
@@ -87,15 +92,17 @@ ethereal_SOURCES = \
        prefs.h        \
        print.c        \
        print.h        \
+       proto.c        \
+       proto.h        \
        ps.c           \
        ps.h           \
        resolv.c       \
        resolv.h       \
        smb.h          \
-        summary.h      \
-        summary.c      \
        timestamp.h    \
        util.c         \
+        summary.c      \
+        summary.h      \
        util.h
 
 EXTRA_ethereal_SOURCES = \
@@ -106,8 +113,8 @@ EXTRA_ethereal_SOURCES = \
        strerror.c      \
        strerror.h
 
-ethereal_DEPENDENCIES = @SNMP_O@ @SNPRINTF_O@ @STRERROR_O@ @LIBWIRETAP_A@
-ethereal_LDADD = @SNMP_O@ @SNPRINTF_O@ @STRERROR_O@ @LIBWIRETAP_A@ @SNMP_A@
+ethereal_DEPENDENCIES = @SNMP_O@ @SNPRINTF_O@ @STRERROR_O@ wiretap/libwiretap.a
+ethereal_LDADD = @SNMP_O@ @SNPRINTF_O@ @STRERROR_O@ wiretap/libwiretap.a @SNMP_A@
 
 ps.c: print.ps rdps
        ./rdps print.ps ps.c
@@ -134,7 +141,7 @@ EXTRA_DIST =                \
        ylwrap                  \
        VERSION
 
-SUBDIRS = @SUBDIRS@
+SUBDIRS = wiretap @SUBDIRS@
 
 ethereal.1: doc/ethereal.pod VERSION
        (cd doc ; \
index b1e2f49be9249e07e737903396072ed3c781b5eb..51fdb8b92df0e574fc6134668df167636a370cb0 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated automatically by automake 1.4 from Makefile.am
+# Makefile.in generated automatically by automake 1.4a from Makefile.am
 
 # Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
@@ -46,9 +46,10 @@ AUTOMAKE = @AUTOMAKE@
 AUTOHEADER = @AUTOHEADER@
 
 INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_FLAG =
 transform = @program_transform_name@
 
 NORMAL_INSTALL = :
@@ -64,7 +65,6 @@ DATAFILE_DIR = @DATAFILE_DIR@
 GTK_CFLAGS = @GTK_CFLAGS@
 GTK_CONFIG = @GTK_CONFIG@
 GTK_LIBS = @GTK_LIBS@
-LIBWIRETAP_A = @LIBWIRETAP_A@
 MAKEINFO = @MAKEINFO@
 PACKAGE = @PACKAGE@
 RANLIB = @RANLIB@
@@ -75,6 +75,7 @@ SNPRINTF_O = @SNPRINTF_O@
 STRERROR_C = @STRERROR_C@
 STRERROR_O = @STRERROR_O@
 VERSION = @VERSION@
+YACC = @YACC@
 
 bin_PROGRAMS = ethereal
 
@@ -82,14 +83,16 @@ man_MANS = ethereal.1
 
 sysconf_DATA = manuf
 
-ethereal_SOURCES =     alignment.h     capture.c       capture.h       column.c        column.h        config.h        display.c       display.h       ethereal.c      ethereal.h      ethertype.c     etypes.h        file.c          file.h          filter.c        filter.h        follow.c        follow.h        gtkpacket.c     gtkpacket.h     menu.c          menu.h          packet-aarp.c   packet-arp.c    packet-atalk.c  packet-bootp.c  packet-cdp.c    packet-data.c   packet-dns.c    packet-dns.h    packet-eth.c    packet-fddi.c   packet-ftp.c    packet-giop.c   packet-gre.c    packet-http.c   packet-icmpv6.c         packet-ip.c     packet-ip.h     packet-ipsec.c  packet-ipv6.c   packet-ipv6.h   packet-ipx.c    packet-ipx.h    packet-isakmp.c         packet-llc.c    packet-lpd.c    packet-nbipx.c  packet-nbns.c   packet-ncp.c    packet-ncp.h    packet-nntp.c   packet-null.c   packet-osi.c    packet-ospf.c   packet-ospf.h   packet-pop.c    packet-ppp.c    packet-pppoe.c  packet-pptp.c   packet-raw.c    packet-rip.c    packet-rip.h    packet-rsvp.c   packet-rsvp.h   packet-rtsp.c   packet-sdp.c    packet-smb.c    packet-tcp.c    packet-telnet.c         packet-tftp.c   packet-tr.c     packet-trmac.c  packet-udp.c    packet-vines.c  packet-vines.h  packet.c        packet.h        prefs.c         prefs.h         print.c         print.h         ps.c            ps.h            resolv.c        resolv.h        smb.h                  summary.h              summary.c         timestamp.h     util.c          util.h
+YFLAGS = -d
+
+ethereal_SOURCES =     alignment.h     capture.c       capture.h       column.c        column.h        config.h        dfilter-grammar.y       dfilter.c       dfilter.h       display.c       display.h       ethereal.c      ethereal.h      ethertype.c     etypes.h        file.c          file.h          filter.c        filter.h        follow.c        follow.h        gtkpacket.c     gtkpacket.h     menu.c          menu.h          packet-aarp.c   packet-arp.c    packet-atalk.c  packet-bootp.c  packet-cdp.c    packet-data.c   packet-dns.c    packet-dns.h    packet-eth.c    packet-fddi.c   packet-ftp.c    packet-giop.c   packet-gre.c    packet-http.c   packet-icmpv6.c         packet-ip.c     packet-ip.h     packet-ipsec.c  packet-ipv6.c   packet-ipv6.h   packet-ipx.c    packet-ipx.h    packet-isakmp.c         packet-llc.c    packet-lpd.c    packet-nbipx.c  packet-nbns.c   packet-ncp.c    packet-ncp.h    packet-nntp.c   packet-null.c   packet-osi.c    packet-ospf.c   packet-ospf.h   packet-pop.c    packet-ppp.c    packet-pppoe.c  packet-pptp.c   packet-raw.c    packet-rip.c    packet-rip.h    packet-rsvp.c   packet-rsvp.h   packet-rtsp.c   packet-sdp.c    packet-smb.c    packet-tcp.c    packet-telnet.c         packet-tftp.c   packet-tr.c     packet-trmac.c  packet-udp.c    packet-vines.c  packet-vines.h  packet.c        packet.h        prefs.c         prefs.h         print.c         print.h         proto.c         proto.h         ps.c            ps.h            resolv.c        resolv.h        smb.h           timestamp.h     util.c                 summary.c              summary.h         util.h
 
 
 EXTRA_ethereal_SOURCES =       packet-snmp.c           snprintf.c              snprintf.h              snprintf-imp.h          strerror.c              strerror.h
 
 
-ethereal_DEPENDENCIES = @SNMP_O@ @SNPRINTF_O@ @STRERROR_O@ @LIBWIRETAP_A@
-ethereal_LDADD = @SNMP_O@ @SNPRINTF_O@ @STRERROR_O@ @LIBWIRETAP_A@ @SNMP_A@
+ethereal_DEPENDENCIES = @SNMP_O@ @SNPRINTF_O@ @STRERROR_O@ wiretap/libwiretap.a
+ethereal_LDADD = @SNMP_O@ @SNPRINTF_O@ @STRERROR_O@ wiretap/libwiretap.a @SNMP_A@
 
 DISTCLEANFILES =       rdps                    ps.c                    *~
 
@@ -97,7 +100,7 @@ DISTCLEANFILES =     rdps                    ps.c                    *~
 EXTRA_DIST =   doc/Makefile                    doc/ethereal.pod                ethereal.1                      ethereal.spec                   image/icon-excl.xpm             image/icon-ethereal.xpm         manuf                           print.ps                        README.tru64                    rdps.c                          ylwrap                          VERSION
 
 
-SUBDIRS = @SUBDIRS@
+SUBDIRS = wiretap @SUBDIRS@
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = config.h
@@ -109,18 +112,19 @@ DEFS = @DEFS@ -I. -I$(srcdir) -I.
 CPPFLAGS = @CPPFLAGS@
 LDFLAGS = @LDFLAGS@
 LIBS = @LIBS@
-ethereal_OBJECTS =  capture.o column.o display.o ethereal.o ethertype.o \
-file.o filter.o follow.o gtkpacket.o menu.o packet-aarp.o packet-arp.o \
-packet-atalk.o packet-bootp.o packet-cdp.o packet-data.o packet-dns.o \
-packet-eth.o packet-fddi.o packet-ftp.o packet-giop.o packet-gre.o \
-packet-http.o packet-icmpv6.o packet-ip.o packet-ipsec.o packet-ipv6.o \
-packet-ipx.o packet-isakmp.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-pppoe.o packet-pptp.o \
-packet-raw.o packet-rip.o packet-rsvp.o packet-rtsp.o packet-sdp.o \
-packet-smb.o packet-tcp.o packet-telnet.o packet-tftp.o packet-tr.o \
-packet-trmac.o packet-udp.o packet-vines.o packet.o prefs.o print.o \
-ps.o resolv.o summary.o util.o
+ethereal_OBJECTS =  capture.o column.o dfilter-grammar.o dfilter.o \
+display.o ethereal.o ethertype.o file.o filter.o follow.o gtkpacket.o \
+menu.o packet-aarp.o packet-arp.o packet-atalk.o packet-bootp.o \
+packet-cdp.o packet-data.o packet-dns.o packet-eth.o packet-fddi.o \
+packet-ftp.o packet-giop.o packet-gre.o packet-http.o packet-icmpv6.o \
+packet-ip.o packet-ipsec.o packet-ipv6.o packet-ipx.o packet-isakmp.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-pppoe.o packet-pptp.o packet-raw.o packet-rip.o \
+packet-rsvp.o packet-rtsp.o packet-sdp.o packet-smb.o packet-tcp.o \
+packet-telnet.o packet-tftp.o packet-tr.o packet-trmac.o packet-udp.o \
+packet-vines.o packet.o prefs.o print.o proto.o ps.o resolv.o util.o \
+summary.o
 ethereal_LDFLAGS = 
 CFLAGS = @CFLAGS@
 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -134,40 +138,41 @@ DATA =  $(sysconf_DATA)
 
 DIST_COMMON =  README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \
 Makefile.am Makefile.in NEWS acconfig.h acinclude.m4 aclocal.m4 \
-config.guess config.h.in config.sub configure configure.in install-sh \
-missing mkinstalldirs ylwrap
+config.guess config.h.in config.sub configure configure.in \
+dfilter-grammar.c install-sh missing mkinstalldirs ylwrap
 
 
 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
 
-TAR = tar
+TAR = gtar
 GZIP_ENV = --best
-DEP_FILES =  .deps/capture.P .deps/column.P .deps/display.P \
-.deps/ethereal.P .deps/ethertype.P .deps/file.P .deps/filter.P \
-.deps/follow.P .deps/gtkpacket.P .deps/menu.P .deps/packet-aarp.P \
-.deps/packet-arp.P .deps/packet-atalk.P .deps/packet-bootp.P \
-.deps/packet-cdp.P .deps/packet-data.P .deps/packet-dns.P \
-.deps/packet-eth.P .deps/packet-fddi.P .deps/packet-ftp.P \
-.deps/packet-giop.P .deps/packet-gre.P .deps/packet-http.P \
-.deps/packet-icmpv6.P .deps/packet-ip.P .deps/packet-ipsec.P \
-.deps/packet-ipv6.P .deps/packet-ipx.P .deps/packet-isakmp.P \
-.deps/packet-llc.P .deps/packet-lpd.P .deps/packet-nbipx.P \
-.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-pppoe.P \
-.deps/packet-pptp.P .deps/packet-raw.P .deps/packet-rip.P \
-.deps/packet-rsvp.P .deps/packet-rtsp.P .deps/packet-sdp.P \
-.deps/packet-smb.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/strerror.P .deps/summary.P .deps/util.P
+DEP_FILES =  .deps/capture.P .deps/column.P .deps/dfilter-grammar.P \
+.deps/dfilter.P .deps/display.P .deps/ethereal.P .deps/ethertype.P \
+.deps/file.P .deps/filter.P .deps/follow.P .deps/gtkpacket.P \
+.deps/menu.P .deps/packet-aarp.P .deps/packet-arp.P \
+.deps/packet-atalk.P .deps/packet-bootp.P .deps/packet-cdp.P \
+.deps/packet-data.P .deps/packet-dns.P .deps/packet-eth.P \
+.deps/packet-fddi.P .deps/packet-ftp.P .deps/packet-giop.P \
+.deps/packet-gre.P .deps/packet-http.P .deps/packet-icmpv6.P \
+.deps/packet-ip.P .deps/packet-ipsec.P .deps/packet-ipv6.P \
+.deps/packet-ipx.P .deps/packet-isakmp.P .deps/packet-llc.P \
+.deps/packet-lpd.P .deps/packet-nbipx.P .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-pppoe.P .deps/packet-pptp.P \
+.deps/packet-raw.P .deps/packet-rip.P .deps/packet-rsvp.P \
+.deps/packet-rtsp.P .deps/packet-sdp.P .deps/packet-smb.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/proto.P .deps/ps.P .deps/resolv.P .deps/snprintf.P \
+.deps/strerror.P .deps/summary.P .deps/util.P
 SOURCES = $(ethereal_SOURCES) $(EXTRA_ethereal_SOURCES)
 OBJECTS = $(ethereal_OBJECTS)
 
 all: all-redirect
 .SUFFIXES:
-.SUFFIXES: .S .c .o .s
+.SUFFIXES: .S .c .o .s .y
 $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
        cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile
 
@@ -225,8 +230,8 @@ install-binPROGRAMS: $(bin_PROGRAMS)
        $(mkinstalldirs) $(DESTDIR)$(bindir)
        @list='$(bin_PROGRAMS)'; for p in $$list; do \
          if test -f $$p; then \
-           echo "  $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
-            $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+           echo "  $(INSTALL_PROGRAM) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+            $(INSTALL_PROGRAM) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
          else :; fi; \
        done
 
@@ -255,6 +260,13 @@ maintainer-clean-compile:
 ethereal: $(ethereal_OBJECTS) $(ethereal_DEPENDENCIES)
        @rm -f ethereal
        $(LINK) $(ethereal_LDFLAGS) $(ethereal_OBJECTS) $(ethereal_LDADD) $(LIBS)
+.y.c:
+       $(YACC) $(AM_YFLAGS) $(YFLAGS) $< && mv y.tab.c $*.c
+       if test -f y.tab.h; then \
+       if cmp -s y.tab.h $*.h; then rm -f y.tab.h; else mv y.tab.h $*.h; fi; \
+       else :; fi
+dfilter-grammar.h: dfilter-grammar.c
+
 
 install-man1:
        $(mkinstalldirs) $(DESTDIR)$(man1dir)
@@ -450,7 +462,7 @@ distdir: $(DISTFILES)
        @for file in $(DISTFILES); do \
          d=$(srcdir); \
          if test -d $$d/$$file; then \
-           cp -pr $$/$$file $(distdir)/$$file; \
+           cp -pr $$d/$$file $(distdir)/$$file; \
          else \
            test -f $(distdir)/$$file \
            || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
@@ -524,7 +536,7 @@ uninstall: uninstall-recursive
 all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) config.h
 all-redirect: all-recursive-am
 install-strip:
-       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install
 installdirs: installdirs-recursive
 installdirs-am:
        $(mkinstalldirs)  $(DESTDIR)$(bindir) $(DESTDIR)$(mandir)/man1 \
@@ -541,6 +553,7 @@ distclean-generic:
        -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
 
 maintainer-clean-generic:
+       -test -z "dfilter-grammarhdfilter-grammarc" || rm -f dfilter-grammarh dfilter-grammarc
 mostlyclean-am:  mostlyclean-hdr mostlyclean-binPROGRAMS \
                mostlyclean-compile mostlyclean-tags mostlyclean-depend \
                mostlyclean-generic
diff --git a/README b/README
index cdce480c4af4077e03ff62ca5f7fe0650eec57b4..8f9296d5239aac6ccb685082069d042ec05ce16a 100644 (file)
--- a/README
+++ b/README
@@ -31,19 +31,6 @@ Ethereal is known to compile and run on the following systems:
 
 It should run on other systems without too much trouble.
 
-NOTE: the Makefile appears to depend on GNU "make"; it doesn't appear to
-work with the "make" that comes with Solaris 7 nor the BSD "make".
-
-In addition, wiretap (see below) requires "flex" - it cannot be built
-with vanilla "lex" - and either "bison" or the Berkeley "yacc"; whilst
-the "yacc" that comes with Solaris 7 has a "-p" flag to replace "yy" in
-various variable names with a specified prefix, to allow multiple
-yacc-built parsers in the same program, it doesn't replace "yy" in the
-"y.tab.h" file, so the lexical analyzer has no clue that "yylval" has
-been renamed to "wtap_lval".  (What *were* they thinking?)
-
-You must therefore install GNU "make", "flex", and either "bison" or
-Berkeley "yacc" on systems that lack them.
 
 Full installation instructions can be found in the INSTALL file.
          
index a202da07a4cec12ce81ad0608f7dc967d8152596..f08f72e3ecad439998bb964ed22bcb61b7bfe208 100644 (file)
@@ -10,5 +10,3 @@
 
 #undef NEED_STRERROR_H
 
-/* Define this to use the wiretap library */
-#undef WITH_WIRETAP
index 5fd4db5b31931668903fe906ac566e05b48b1276..fba6b3a302e656bffb8c582aa5e403583c228cc5 100644 (file)
@@ -1,4 +1,4 @@
-dnl aclocal.m4 generated automatically by aclocal 1.4
+dnl aclocal.m4 generated automatically by aclocal 1.4a
 
 dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
@@ -183,6 +183,8 @@ dnl AM_INIT_AUTOMAKE(package,version, [no-define])
 
 AC_DEFUN(AM_INIT_AUTOMAKE,
 [AC_REQUIRE([AC_PROG_INSTALL])
+dnl We require 2.13 because we rely on SHELL being computed by configure.
+AC_PREREQ([2.13])
 PACKAGE=[$1]
 AC_SUBST(PACKAGE)
 VERSION=[$2]
index 2d45d36077b74668726dd022bc1dc2fbb0aca50d..2e51ea4df0be3e19de03279b7f595ffa518ab9f0 100644 (file)
@@ -15,9 +15,6 @@
 
 #undef NEED_STRERROR_H
 
-/* Define this to use the wiretap library */
-#undef WITH_WIRETAP
-
 /* Define if you have the <fcntl.h> header file.  */
 #undef HAVE_FCNTL_H
 
index 404517069b1778cffec86bff13aee2a29d6fd733..9cffa43b1df8b4cb88a9ef7b60e42ca76887ece4 100755 (executable)
--- a/configure
+++ b/configure
@@ -17,9 +17,6 @@ ac_help="$ac_help
   --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)"
 ac_help="$ac_help
   --disable-gtktest       Do not try to compile and run a test GTK program"
-ac_help="$ac_help
-  --with-wiretap          Include wiretap library.
-  --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
@@ -566,7 +563,7 @@ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
 # 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:570: checking for a BSD compatible install" >&5
+echo "configure:567: 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
@@ -619,7 +616,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
-echo "configure:623: checking whether build environment is sane" >&5
+echo "configure:620: checking whether build environment is sane" >&5
 # Just in case
 sleep 1
 echo timestamp > conftestfile
@@ -676,7 +673,7 @@ test "$program_suffix" != NONE &&
 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:680: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:677: 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
@@ -703,6 +700,7 @@ else
 fi
 
 
+
 PACKAGE=ethereal
 
 VERSION=0.6.3
@@ -722,7 +720,7 @@ EOF
 
 missing_dir=`cd $ac_aux_dir && pwd`
 echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
-echo "configure:726: checking for working aclocal" >&5
+echo "configure:724: 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.
@@ -735,7 +733,7 @@ else
 fi
 
 echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
-echo "configure:739: checking for working autoconf" >&5
+echo "configure:737: 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.
@@ -748,7 +746,7 @@ else
 fi
 
 echo $ac_n "checking for working automake""... $ac_c" 1>&6
-echo "configure:752: checking for working automake" >&5
+echo "configure:750: 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.
@@ -761,7 +759,7 @@ else
 fi
 
 echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
-echo "configure:765: checking for working autoheader" >&5
+echo "configure:763: 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.
@@ -774,7 +772,7 @@ else
 fi
 
 echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
-echo "configure:778: checking for working makeinfo" >&5
+echo "configure:776: 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.
@@ -795,7 +793,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
 fi
 
 echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:799: checking host system type" >&5
+echo "configure:797: checking host system type" >&5
 
 host_alias=$host
 case "$host_alias" in
@@ -819,7 +817,7 @@ echo "$ac_t""$host" 1>&6
 # 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:823: checking for $ac_word" >&5
+echo "configure:821: 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
@@ -849,7 +847,7 @@ if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:853: checking for $ac_word" >&5
+echo "configure:851: 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
@@ -900,7 +898,7 @@ fi
       # 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:904: checking for $ac_word" >&5
+echo "configure:902: 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
@@ -932,7 +930,7 @@ fi
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:936: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:934: 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.
@@ -943,12 +941,12 @@ cross_compiling=$ac_cv_prog_cc_cross
 
 cat > conftest.$ac_ext << EOF
 
-#line 947 "configure"
+#line 945 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:952: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:950: \"$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
@@ -974,12 +972,12 @@ if test $ac_cv_prog_cc_works = no; 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:978: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:976: 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:983: checking whether we are using GNU C" >&5
+echo "configure:981: 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
@@ -988,7 +986,7 @@ else
   yes;
 #endif
 EOF
-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
+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
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -1007,7 +1005,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1011: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:1009: 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
@@ -1041,7 +1039,7 @@ fi
 # 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:1045: checking for $ac_word" >&5
+echo "configure:1043: 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
@@ -1068,10 +1066,45 @@ else
   echo "$ac_t""no" 1>&6
 fi
 
+for ac_prog in 'bison -y' byacc
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1075: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$YACC"; then
+  ac_cv_prog_YACC="$YACC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_YACC="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+YACC="$ac_cv_prog_YACC"
+if test -n "$YACC"; then
+  echo "$ac_t""$YACC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$YACC" && break
+done
+test -n "$YACC" || YACC="yacc"
+
 
 # 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:1075: checking to see if we can add '-Wall' to CFLAGS" >&5
+echo "configure:1108: 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
@@ -1079,6 +1112,8 @@ else
   echo "$ac_t""no" 1>&6
 fi
 
+CFLAGS="$CFLAGS -Iwiretap"
+
 # Create DATAFILE_DIR #define for config.h
 DATAFILE_DIR=$sysconfdir
 DATAFILE_DIR=`(
@@ -1097,7 +1132,7 @@ EOF
 case "$host_os" in
   solaris*)
     echo $ac_n "checking for LD_LIBRARY_PATH""... $ac_c" 1>&6
-echo "configure:1101: checking for LD_LIBRARY_PATH" >&5
+echo "configure:1136: 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
@@ -1158,7 +1193,7 @@ fi
   # 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:1162: checking for $ac_word" >&5
+echo "configure:1197: 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,9 +1226,9 @@ else
   echo "$ac_t""no" 1>&6
 fi
 
-  min_gtk_version=1.0.0
+  min_gtk_version=1.2.0
   echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6
-echo "configure:1197: checking for GTK - version >= $min_gtk_version" >&5
+echo "configure:1232: checking for GTK - version >= $min_gtk_version" >&5
   no_gtk=""
   if test "$GTK_CONFIG" = "no" ; then
     no_gtk=yes
@@ -1216,7 +1251,7 @@ echo "configure:1197: checking for GTK - version >= $min_gtk_version" >&5
   echo $ac_n "cross compiling; assumed OK... $ac_c"
 else
   cat > conftest.$ac_ext <<EOF
-#line 1220 "configure"
+#line 1255 "configure"
 #include "confdefs.h"
 
 #include <gtk/gtk.h>
@@ -1294,7 +1329,7 @@ main ()
 }
 
 EOF
-if { (eval echo configure:1298: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1333: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -1328,7 +1363,7 @@ fi
           CFLAGS="$CFLAGS $GTK_CFLAGS"
           LIBS="$LIBS $GTK_LIBS"
           cat > conftest.$ac_ext <<EOF
-#line 1332 "configure"
+#line 1367 "configure"
 #include "confdefs.h"
 
 #include <gtk/gtk.h>
@@ -1338,7 +1373,7 @@ int main() {
  return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); 
 ; return 0; }
 EOF
-if { (eval echo configure:1342: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1377: \"$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"
@@ -1379,7 +1414,7 @@ rm -f conftest*
 
 # 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:1383: checking for extraneous pcap header directories" >&5
+echo "configure:1418: checking for extraneous pcap header directories" >&5
 found_pcap_dir=""
 for pcap_dir in /usr/include/pcap /usr/local/include/pcap
 do
@@ -1399,7 +1434,7 @@ fi
 
 # Pcap checks
 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1403: checking how to run the C preprocessor" >&5
+echo "configure:1438: checking how to run the C preprocessor" >&5
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -1414,13 +1449,13 @@ else
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 1418 "configure"
+#line 1453 "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:1424: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1459: \"$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
   :
@@ -1431,13 +1466,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 1435 "configure"
+#line 1470 "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:1441: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1476: \"$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
   :
@@ -1448,13 +1483,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -nologo -E"
   cat > conftest.$ac_ext <<EOF
-#line 1452 "configure"
+#line 1487 "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:1458: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1493: \"$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
   :
@@ -1480,17 +1515,17 @@ echo "$ac_t""$CPP" 1>&6
 
 ac_safe=`echo "net/bpf.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for net/bpf.h""... $ac_c" 1>&6
-echo "configure:1484: checking for net/bpf.h" >&5
+echo "configure:1519: 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 1489 "configure"
+#line 1524 "configure"
 #include "confdefs.h"
 #include <net/bpf.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1494: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1529: \"$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*
@@ -1514,17 +1549,17 @@ fi
 
 ac_safe=`echo "pcap.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for pcap.h""... $ac_c" 1>&6
-echo "configure:1518: checking for pcap.h" >&5
+echo "configure:1553: 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 1523 "configure"
+#line 1558 "configure"
 #include "confdefs.h"
 #include <pcap.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1528: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1563: \"$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*
@@ -1547,7 +1582,7 @@ else
 fi
 
 echo $ac_n "checking for pcap_open_offline in -lpcap""... $ac_c" 1>&6
-echo "configure:1551: checking for pcap_open_offline in -lpcap" >&5
+echo "configure:1586: 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
@@ -1555,7 +1590,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lpcap  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1559 "configure"
+#line 1594 "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
@@ -1566,7 +1601,7 @@ int main() {
 pcap_open_offline()
 ; return 0; }
 EOF
-if { (eval echo configure:1570: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1605: \"$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,38 +1630,6 @@ else
 fi
 
 
-# Wiretap check
-echo $ac_n "checking whether to include wiretap library""... $ac_c" 1>&6
-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"
-   case "$withval" in
-               yes)
-                       echo "$ac_t""yes" 1>&6
-                       cat >> confdefs.h <<\EOF
-#define WITH_WIRETAP 1
-EOF
-
-                       WIRETAP_DIR="wiretap"
-                       if test x$WIRETAP_DIR != x ; then
-                               CFLAGS="$CFLAGS -Iwiretap"
-                               LIBWIRETAP_A="wiretap/libwiretap.a"
-                               SUBDIRS="$SUBDIRS wiretap"
-                       fi
-                       ;;
-               *)
-                       echo "$ac_t""no" 1>&6
-                       LIBWIRETAP_A=""
-                       WIRETAP_DIR=""
-                       ;;
-       esac 
-else
-  echo "$ac_t""no" 1>&6
-
-fi
-
-
 
 
 # Check whether --enable-ipv6 or --disable-ipv6 was given.
@@ -1639,7 +1642,7 @@ fi
 
 
 echo $ac_n "checking whether to enable ipv6 name resolution if available""... $ac_c" 1>&6
-echo "configure:1643: checking whether to enable ipv6 name resolution if available" >&5
+echo "configure:1646: checking whether to enable ipv6 name resolution if available" >&5
 if test "x$enable_ipv6" = "xno" ; then
        echo "$ac_t""no" 1>&6
 else
@@ -1649,12 +1652,12 @@ else
        v6lib=none
 
        echo $ac_n "checking ipv6 stack type""... $ac_c" 1>&6
-echo "configure:1653: checking ipv6 stack type" >&5
+echo "configure:1656: 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 1658 "configure"
+#line 1661 "configure"
 #include "confdefs.h"
 dnl
 #include </usr/local/v6/include/sys/types.h>
@@ -1674,7 +1677,7 @@ rm -f conftest*
                        ;;
                toshiba)
                        cat > conftest.$ac_ext <<EOF
-#line 1678 "configure"
+#line 1681 "configure"
 #include "confdefs.h"
 dnl
 #include <sys/param.h>
@@ -1694,7 +1697,7 @@ rm -f conftest*
                        ;;
                kame)
                        cat > conftest.$ac_ext <<EOF
-#line 1698 "configure"
+#line 1701 "configure"
 #include "confdefs.h"
 dnl
 #include <netinet/in.h>
@@ -1714,7 +1717,7 @@ rm -f conftest*
                        ;;
                inria)
                        cat > conftest.$ac_ext <<EOF
-#line 1718 "configure"
+#line 1721 "configure"
 #include "confdefs.h"
 dnl
 #include <netinet/in.h>
@@ -1732,7 +1735,7 @@ rm -f conftest*
                        ;;
                zeta)
                        cat > conftest.$ac_ext <<EOF
-#line 1736 "configure"
+#line 1739 "configure"
 #include "confdefs.h"
 dnl
 #include <sys/param.h>
@@ -1781,12 +1784,12 @@ fi
 
 
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:1785: checking for ANSI C header files" >&5
+echo "configure:1788: 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 1790 "configure"
+#line 1793 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -1794,7 +1797,7 @@ else
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1798: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1801: \"$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*
@@ -1811,7 +1814,7 @@ rm -f conftest*
 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 1815 "configure"
+#line 1818 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -1829,7 +1832,7 @@ fi
 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 1833 "configure"
+#line 1836 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -1850,7 +1853,7 @@ if test "$cross_compiling" = yes; then
   :
 else
   cat > conftest.$ac_ext <<EOF
-#line 1854 "configure"
+#line 1857 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -1861,7 +1864,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
 exit (0); }
 
 EOF
-if { (eval echo configure:1865: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:1868: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -1888,17 +1891,17 @@ for ac_hdr in fcntl.h sys/ioctl.h sys/time.h unistd.h stdarg.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1892: checking for $ac_hdr" >&5
+echo "configure:1895: 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 1897 "configure"
+#line 1900 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1902: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1905: \"$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*
@@ -1929,17 +1932,17 @@ for ac_hdr in sys/sockio.h sys/types.h netinet/in.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1933: checking for $ac_hdr" >&5
+echo "configure:1936: 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 1938 "configure"
+#line 1941 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1943: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1946: \"$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*
@@ -1979,7 +1982,7 @@ fi
 SNMP_A=''
 SNMP_O=''
 echo $ac_n "checking whether to use SNMP library if available""... $ac_c" 1>&6
-echo "configure:1983: checking whether to use SNMP library if available" >&5
+echo "configure:1986: checking whether to use SNMP library if available" >&5
 if test "x$enable_snmp" = "xno" ; then
        echo "$ac_t""no" 1>&6
 else
@@ -1988,17 +1991,17 @@ else
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:1992: checking for $ac_hdr" >&5
+echo "configure:1995: 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 1997 "configure"
+#line 2000 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2002: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2005: \"$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*
@@ -2025,7 +2028,7 @@ fi
 done
 
        echo $ac_n "checking for asn_parse_header in -lsnmp""... $ac_c" 1>&6
-echo "configure:2029: checking for asn_parse_header in -lsnmp" >&5
+echo "configure:2032: 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
@@ -2033,7 +2036,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lsnmp  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2037 "configure"
+#line 2040 "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
@@ -2044,7 +2047,7 @@ int main() {
 asn_parse_header()
 ; return 0; }
 EOF
-if { (eval echo configure:2048: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2051: \"$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
@@ -2077,12 +2080,12 @@ fi
 # for get_interface_list().
 
 echo $ac_n "checking for sa_len in struct sockaddr""... $ac_c" 1>&6
-echo "configure:2081: checking for sa_len in struct sockaddr" >&5
+echo "configure:2084: 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 2086 "configure"
+#line 2089 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -2090,7 +2093,7 @@ int main() {
 struct sockaddr s; s.sa_len;
 ; return 0; }
 EOF
-if { (eval echo configure:2094: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2097: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_ethereal_struct_sa_len=yes
 else
@@ -2113,14 +2116,14 @@ fi
 
 # We must know our byte order
 echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
-echo "configure:2117: checking whether byte ordering is bigendian" >&5
+echo "configure:2120: 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 2124 "configure"
+#line 2127 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/param.h>
@@ -2131,11 +2134,11 @@ int main() {
 #endif
 ; return 0; }
 EOF
-if { (eval echo configure:2135: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2138: \"$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 2139 "configure"
+#line 2142 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/param.h>
@@ -2146,7 +2149,7 @@ int main() {
 #endif
 ; return 0; }
 EOF
-if { (eval echo configure:2150: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2153: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_bigendian=yes
 else
@@ -2166,7 +2169,7 @@ if test "$cross_compiling" = yes; then
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 2170 "configure"
+#line 2173 "configure"
 #include "confdefs.h"
 main () {
   /* Are we little or big endian?  From Harbison&Steele.  */
@@ -2179,7 +2182,7 @@ main () {
   exit (u.c[sizeof (long) - 1] == 1);
 }
 EOF
-if { (eval echo configure:2183: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2186: \"$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
@@ -2205,13 +2208,13 @@ fi
 
 if test $ac_cv_prog_gcc = yes; then
     echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6
-echo "configure:2209: checking whether ${CC-cc} needs -traditional" >&5
+echo "configure:2212: 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 2215 "configure"
+#line 2218 "configure"
 #include "confdefs.h"
 #include <sgtty.h>
 Autoconf TIOCGETP
@@ -2229,7 +2232,7 @@ rm -f conftest*
 
   if test $ac_cv_prog_gcc_traditional = no; then
     cat > conftest.$ac_ext <<EOF
-#line 2233 "configure"
+#line 2236 "configure"
 #include "confdefs.h"
 #include <termio.h>
 Autoconf TCGETA
@@ -2251,12 +2254,12 @@ echo "$ac_t""$ac_cv_prog_gcc_traditional" 1>&6
 fi
 
 echo $ac_n "checking for socket""... $ac_c" 1>&6
-echo "configure:2255: checking for socket" >&5
+echo "configure:2258: 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 2260 "configure"
+#line 2263 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char socket(); below.  */
@@ -2279,7 +2282,7 @@ socket();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2283: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2286: \"$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
@@ -2305,12 +2308,12 @@ fi
 SNPRINTF_C=""
 SNPRINTF_O=""
 echo $ac_n "checking for snprintf""... $ac_c" 1>&6
-echo "configure:2309: checking for snprintf" >&5
+echo "configure:2312: 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 2314 "configure"
+#line 2317 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char snprintf(); below.  */
@@ -2333,7 +2336,7 @@ snprintf();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2337: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2340: \"$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
@@ -2364,12 +2367,12 @@ fi
 
 
 echo $ac_n "checking for strerror""... $ac_c" 1>&6
-echo "configure:2368: checking for strerror" >&5
+echo "configure:2371: checking for strerror" >&5
 if eval "test \"`echo '$''{'ac_cv_func_strerror'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2373 "configure"
+#line 2376 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char strerror(); below.  */
@@ -2392,7 +2395,7 @@ strerror();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2396: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2399: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_strerror=yes"
 else
@@ -2425,10 +2428,8 @@ fi
 
 
 
-if test x$WIRETAP_DIR != x ; then
-       subdirs="$WIRETAP_DIR"
+subdirs="wiretap"
 
-fi
 trap '' 1 2 15
 cat > confcache <<\EOF
 # This file is a shell script that caches the results of configure
@@ -2580,12 +2581,12 @@ s%@host_vendor@%$host_vendor%g
 s%@host_os@%$host_os%g
 s%@CC@%$CC%g
 s%@RANLIB@%$RANLIB%g
+s%@YACC@%$YACC%g
 s%@DATAFILE_DIR@%$DATAFILE_DIR%g
 s%@GTK_CONFIG@%$GTK_CONFIG%g
 s%@GTK_CFLAGS@%$GTK_CFLAGS%g
 s%@GTK_LIBS@%$GTK_LIBS%g
 s%@CPP@%$CPP%g
-s%@LIBWIRETAP_A@%$LIBWIRETAP_A%g
 s%@SUBDIRS@%$SUBDIRS%g
 s%@SNMP_A@%$SNMP_A%g
 s%@SNMP_O@%$SNMP_O%g
@@ -2840,7 +2841,7 @@ if test "$no_recursion" != yes; then
     esac
   done
 
-  for ac_config_dir in $WIRETAP_DIR; do
+  for ac_config_dir in wiretap; do
 
     # Do not complain, so a configure script can configure whichever
     # parts of a large source tree are present.
index 7a583025cf62bd1394f2c47e19f9bcb1f37dd9b4..916bf848e0e8827b7411adb56b2492806f0c0c1f 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: configure.in,v 1.27 1999/06/24 16:25:58 gram Exp $
+# $Id: configure.in,v 1.28 1999/07/07 22:51:36 gram Exp $
 dnl Process this file with autoconf to produce a configure script.
 AC_INIT(etypes.h)
 
@@ -10,6 +10,7 @@ AC_CANONICAL_HOST
 dnl Checks for programs.
 AC_PROG_CC
 AC_PROG_RANLIB
+AC_PROG_YACC
 
 # If we're running gcc, add '-Wall' to CFLAGS.
 AC_MSG_CHECKING(to see if we can add '-Wall' to CFLAGS)
@@ -20,6 +21,8 @@ else
   AC_MSG_RESULT(no)
 fi
 
+CFLAGS="$CFLAGS -Iwiretap"
+
 # Create DATAFILE_DIR #define for config.h
 DATAFILE_DIR=$sysconfdir
 DATAFILE_DIR=`(
@@ -45,7 +48,7 @@ case "$host_os" in
 esac
 
 # GTK checks
-AM_PATH_GTK(1.0.0, CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$LIBS $GTK_LIBS",
+AM_PATH_GTK(1.2.0, CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$LIBS $GTK_LIBS",
                    AC_MSG_ERROR(GTK+ distribution not found.))
 
 # Evidently, some systems have pcap.h, etc. in */include/pcap
@@ -72,31 +75,6 @@ AC_CHECK_HEADER(net/bpf.h,, AC_MSG_ERROR(Header file net/bpf.h not found.))
 AC_CHECK_HEADER(pcap.h,, AC_MSG_ERROR(Header file pcap.h not found.))
 AC_CHECK_LIB(pcap, pcap_open_offline,, AC_MSG_ERROR(Library libpcap not found.))
 
-# Wiretap check
-AC_MSG_CHECKING(whether to include wiretap library)
-AC_ARG_WITH(wiretap,
-[  --with-wiretap          Include wiretap library.
-  --without-wiretap       Don't include wiretap library (default)],
-       [ case "$withval" in
-               yes)
-                       AC_MSG_RESULT(yes)
-                       AC_DEFINE(WITH_WIRETAP)
-                       WIRETAP_DIR="wiretap"
-                       if test x$WIRETAP_DIR != x ; then
-                               CFLAGS="$CFLAGS -Iwiretap"
-                               LIBWIRETAP_A="wiretap/libwiretap.a"
-                               SUBDIRS="$SUBDIRS wiretap"
-                       fi
-                       ;;
-               *)
-                       AC_MSG_RESULT(no)
-                       LIBWIRETAP_A=""
-                       WIRETAP_DIR=""
-                       ;;
-       esac ],
-       AC_MSG_RESULT(no)
-)
-AC_SUBST(LIBWIRETAP_A)
 AC_SUBST(SUBDIRS)
 
 dnl ipv6 check
@@ -178,7 +156,5 @@ AC_SUBST(STRERROR_C)
 AC_SUBST(STRERROR_O)
 
 AM_CONFIG_HEADER(config.h)
-if test x$WIRETAP_DIR != x ; then
-       AC_CONFIG_SUBDIRS($WIRETAP_DIR)
-fi
+AC_CONFIG_SUBDIRS(wiretap)
 AC_OUTPUT(Makefile)
diff --git a/dfilter-grammar.y b/dfilter-grammar.y
new file mode 100644 (file)
index 0000000..8349024
--- /dev/null
@@ -0,0 +1,640 @@
+%{
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+#ifndef __GLIB_H__
+#include <glib.h>
+#endif
+
+#include <string.h> /* during testing */
+
+#ifndef _STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifndef __PROTO_H__
+#include "proto.h"
+#endif
+
+#ifndef __PACKET_H__
+#include "packet.h"
+#endif
+
+#ifndef __DFILTER_H__
+#include "dfilter.h"
+#endif
+
+#ifndef __RESOLV_H__
+#include "resolv.h"
+#endif
+
+void dfilter_yacc_init(void);
+static void dfilter_print_parse_tree(GNode *gnode);
+static GNode* dfilter_mknode_join(GNode *n1, enum node_type ntype, int operand, GNode *n2);
+static GNode* dfilter_mknode_unary(int operand, GNode *n2);
+static GNode* dfilter_mknode_numeric_variable(gint id);
+static GNode* dfilter_mknode_numeric_value(guint32 val);
+static GNode* dfilter_mknode_ether_value(char *a, char *b, char *c, char *d, char *e, char *f);
+static GNode* dfilter_mknode_ether_variable(gint id);
+static GNode* dfilter_mknode_ipv4_value(char *host);
+static GNode* dfilter_mknode_ipv4_variable(gint id);
+static GNode* dfilter_mknode_existence(gint id);
+static GNode* dfilter_mknode_bytes_value(GByteArray *barray);
+static GNode* dfilter_mknode_bytes_variable(gint id, gint offset, gint length);
+static GNode* dfilter_mknode_boolean_value(gint truth_value);
+static GNode* dfilter_mknode_boolean_variable(gint id);
+
+static guint32 string_to_value(char *s);
+
+/* space for dfilter_nodes */
+GMemChunk *gmc_dfilter_nodes = NULL;
+
+/* this is how we pass display filter tree (dfcode) back to calling routine */
+GNode *dfilter_tree = NULL;
+
+/* list of byte arrays we allocate during parse. We can traverse this list
+ * faster than the tree when we go back and free the byte arrays */
+GSList *dfilter_list_byte_arrays = NULL;
+
+%}
+
+%union {
+       gint            operand;        /* logical, relation, alternation */
+       gint            variable;
+       GNode*          node;
+       gchar*          id;
+       GByteArray*     bytes;
+}
+
+%type <node>   statement expression relation
+%type <node>   numeric_value numeric_variable
+%type <node>   ether_value ether_variable
+%type <node>   ipv4_value ipv4_variable
+%type <node>   protocol_name
+%type <node>   bytes_value bytes_variable
+%type <node>   boolean_value boolean_variable
+
+%type <operand>        numeric_relation
+%type <operand>        ether_relation
+%type <operand>        bytes_relation
+%type <operand>        boolean_relation
+
+%type <bytes>          byte_range
+%type <variable>       any_variable_type
+%type <operand>                exists_operand
+
+%token <variable>      T_FT_UINT8
+%token <variable>      T_FT_UINT16
+%token <variable>      T_FT_UINT32
+%token <variable>      T_FT_ETHER
+%token <variable>      T_FT_IPv4
+%token <variable>      T_FT_NONE
+%token <variable>      T_FT_BYTES
+%token <variable>      T_FT_BOOLEAN
+%token <variable>      T_FT_STRING
+
+%token <id>            T_VAL_ID
+
+%token <operand>       TOK_AND TOK_OR TOK_NOT TOK_XOR
+%token <operand>       TOK_EQ TOK_NE TOK_GT TOK_GE TOK_LT TOK_LE
+%token <operand>       TOK_EXIST TOK_EXISTS
+%token <operand>       TOK_TRUE TOK_FALSE
+
+%type <operand>                type_eq
+%type <operand>                type_ne
+%type <operand>                type_gt
+%type <operand>                type_ge
+%type <operand>                type_lt
+%type <operand>                type_le
+
+%left TOK_AND
+%left TOK_OR
+%left TOK_XOR
+%nonassoc TOK_NOT
+
+%%
+
+statement: expression
+               {
+                       dfilter_tree = $1;
+               }
+       |       /* NULL */ { dfilter_tree = NULL; }
+       ;
+
+expression:    '(' expression ')' { $$ = $2; }
+       |       expression TOK_AND expression { $$ = dfilter_mknode_join($1, logical, $2, $3); }
+       |       expression TOK_OR expression { $$ = dfilter_mknode_join($1, logical, $2, $3); }
+       |       TOK_NOT expression { $$ = dfilter_mknode_unary(TOK_NOT, $2); }
+       |       relation { $$ = $1; }
+       |       protocol_name { $$ = $1; }
+       ;
+
+relation:      numeric_variable numeric_relation numeric_value
+               {
+                       $$ = dfilter_mknode_join($1, relation, $2, $3);
+               }
+       |       numeric_value numeric_relation numeric_variable
+               {
+                       $$ = dfilter_mknode_join($1, relation, $2, $3);
+               }
+       |       numeric_variable numeric_relation numeric_variable
+               {
+                       $$ = dfilter_mknode_join($1, relation, $2, $3);
+               }
+
+       |       ether_variable ether_relation ether_value
+               {
+                       $$ = dfilter_mknode_join($1, relation, $2, $3);
+               }
+       |       ether_value ether_relation ether_variable
+               {
+                       $$ = dfilter_mknode_join($1, relation, $2, $3);
+               }
+       |       ether_variable ether_relation ether_variable
+               {
+                       $$ = dfilter_mknode_join($1, relation, $2, $3);
+               }
+
+
+       |       ipv4_variable numeric_relation ipv4_value
+               {
+                       $$ = dfilter_mknode_join($1, relation, $2, $3);
+               }
+       |       ipv4_value numeric_relation ipv4_variable
+               {
+                       $$ = dfilter_mknode_join($1, relation, $2, $3);
+               }
+       |       ipv4_variable numeric_relation ipv4_variable
+               {
+                       $$ = dfilter_mknode_join($1, relation, $2, $3);
+               }
+
+       |       bytes_variable bytes_relation bytes_value
+               {
+                       $$ = dfilter_mknode_join($1, relation, $2, $3);
+               }
+       |       bytes_value bytes_relation bytes_variable
+               {
+                       $$ = dfilter_mknode_join($1, relation, $2, $3);
+               }
+       |       bytes_variable bytes_relation bytes_variable
+               {
+                       $$ = dfilter_mknode_join($1, relation, $2, $3);
+               }
+
+       |       boolean_variable boolean_relation boolean_value
+               {
+                       $$ = dfilter_mknode_join($1, relation, $2, $3);
+               }
+       |       boolean_value boolean_relation boolean_variable
+               {
+                       $$ = dfilter_mknode_join($1, relation, $2, $3);
+               }
+       |       boolean_variable boolean_relation boolean_variable
+               {
+                       $$ = dfilter_mknode_join($1, relation, $2, $3);
+               }
+
+       |       exists_operand any_variable_type        { $$ = dfilter_mknode_existence($2); }
+
+       ;
+
+
+numeric_value: T_VAL_ID                { $$ = dfilter_mknode_numeric_value(string_to_value($1)); }
+       ;
+
+ether_value:   T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID ':' T_VAL_ID
+               {
+                       $$ = dfilter_mknode_ether_value($1, $3, $5, $7, $9, $11);
+                       g_free($1);
+                       g_free($3);
+                       g_free($5);
+                       g_free($7);
+                       g_free($9);
+                       g_free($11);
+               }
+       ;
+
+ipv4_value:    T_VAL_ID                { $$ = dfilter_mknode_ipv4_value($1); }
+       ;
+
+bytes_value:   numeric_variable
+       |       byte_range              { $$ = dfilter_mknode_bytes_value($1); }
+       ;
+
+byte_range:    T_VAL_ID ':' T_VAL_ID
+               {
+                       GByteArray      *barray = g_byte_array_new();
+                       guint8          val;
+                       char            *endptr;
+
+                       dfilter_list_byte_arrays = g_slist_append(dfilter_list_byte_arrays, barray);
+                       val = (guint8) strtoul($1, &endptr, 16);
+                       g_byte_array_append(barray, &val, 1);
+                       val = (guint8) strtoul($3, &endptr, 16);
+                       $$ = g_byte_array_append(barray, &val, 1);
+               }
+
+       |       byte_range ':' T_VAL_ID
+               {
+                       guint8          val;
+                       char            *endptr;
+
+                       val = (guint8) strtoul($3, &endptr, 16);
+                       $$ = g_byte_array_append($1, &val, 1);
+               }
+       ;
+
+boolean_value: TOK_TRUE                { $$ = dfilter_mknode_boolean_value($1); }
+       |       TOK_FALSE               { $$ = dfilter_mknode_boolean_value($1); }
+       ;
+
+
+numeric_variable:      T_FT_UINT8      { $$ = dfilter_mknode_numeric_variable($1); }
+       |               T_FT_UINT16     { $$ = dfilter_mknode_numeric_variable($1); }
+       |               T_FT_UINT32     { $$ = dfilter_mknode_numeric_variable($1); }
+       ;
+
+ether_variable:                T_FT_ETHER      { $$ = dfilter_mknode_ether_variable($1); }
+       ;
+
+ipv4_variable:         T_FT_IPv4       { $$ = dfilter_mknode_ipv4_variable($1); }
+       ;
+
+protocol_name:         T_FT_NONE               { $$ = dfilter_mknode_existence($1); }
+       ;
+
+bytes_variable:                any_variable_type '[' T_VAL_ID ':' T_VAL_ID ']'
+               {
+                       $$ = dfilter_mknode_bytes_variable($1, string_to_value($3), string_to_value($5));
+               }
+       |               any_variable_type '[' T_VAL_ID ']'
+               {
+                       $$ = dfilter_mknode_bytes_variable($1, string_to_value($3), 0);
+               }
+       ;
+
+boolean_variable:      T_FT_BOOLEAN    { $$ = dfilter_mknode_boolean_variable($1); }
+       ;
+
+any_variable_type:     T_FT_UINT8 { $$ = $1; }
+       |               T_FT_UINT16 { $$ = $1; }
+       |               T_FT_UINT32 { $$ = $1; }
+       |               T_FT_ETHER { $$ = $1; }
+       |               T_FT_IPv4 { $$ = $1; }
+       |               T_FT_NONE { $$ = $1; }
+       |               T_FT_BYTES { $$ = $1; }
+       |               T_FT_BOOLEAN { $$ = $1; }
+       |               T_FT_STRING { $$ = $1; }
+       ;
+
+numeric_relation:      type_eq { $$ = $1; }
+       |               type_ne { $$ = $1; }
+       |               type_gt { $$ = $1; }
+       |               type_ge { $$ = $1; }
+       |               type_lt { $$ = $1; }
+       |               type_le { $$ = $1; }
+       ;
+
+ether_relation:                type_eq { $$ = $1; }
+       |               type_ne { $$ = $1; }
+       ;
+
+bytes_relation:                type_eq { $$ = $1; }
+       |               type_ne { $$ = $1; }
+       |               type_gt { $$ = $1; }
+       |               type_lt { $$ = $1; }
+       ;
+
+boolean_relation:      type_eq { $$ = $1; }
+       |               type_ne { $$ = $1; }
+       ;
+
+exists_operand:                TOK_EXIST       { $$ = $1; }
+       |               TOK_EXISTS      { $$ = $1; }
+       |               '?'             { $$ = TOK_EXIST; }
+       ;
+
+type_eq:               TOK_EQ  { $$ = $1; }
+       |               '=' '=' { $$ = TOK_EQ; }
+       ;
+
+type_ne:               TOK_NE  { $$ = $1; }
+       |               '!' '=' { $$ = TOK_NE; }
+       ;
+
+type_gt:               TOK_GT  { $$ = $1; }
+       |               '>'     { $$ = TOK_GT; }
+       ;
+
+type_ge:               TOK_GE  { $$ = $1; }
+       |               '>' '=' { $$ = TOK_GE; }
+       ;
+
+type_lt:               TOK_LT  { $$ = $1; }
+       |               '<'     { $$ = TOK_LT; }
+       ;
+
+type_le:               TOK_LE  { $$ = $1; }
+       |               '<' '=' { $$ = TOK_LE; }
+       ;
+
+
+%%
+
+void
+dfilter_yacc_init(void)
+{
+       if (gmc_dfilter_nodes)
+               g_mem_chunk_destroy(gmc_dfilter_nodes);
+
+       gmc_dfilter_nodes = g_mem_chunk_new("gmc_dfilter_nodes",
+               sizeof(dfilter_node), 50 * sizeof(dfilter_node),
+               G_ALLOC_ONLY);
+
+       if (dfilter_list_byte_arrays) {
+               /* clear the byte arrays */
+               g_slist_free(dfilter_list_byte_arrays);
+       }
+               
+}
+
+void
+dfilter_yacc_cleanup(void)
+{
+       if (gmc_dfilter_nodes)
+               g_mem_chunk_destroy(gmc_dfilter_nodes);
+}
+
+
+static GNode*
+dfilter_mknode_join(GNode *n1, enum node_type ntype, int operand, GNode *n2)
+{
+       dfilter_node    *node_root;
+       GNode           *gnode_root;
+
+       node_root = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node_root->ntype = ntype;
+       node_root->elem_size = 0;
+       node_root->fill_array_func = NULL;
+       node_root->check_relation_func = NULL;
+       if (ntype == relation) {
+               node_root->value.relation = operand;
+       }
+       else if (ntype == logical) {
+               node_root->value.logical = operand;
+       }
+       else {
+               g_assert_not_reached();
+       }
+
+       gnode_root = g_node_new(node_root);
+       g_node_append(gnode_root, n1);
+       g_node_append(gnode_root, n2);
+
+       return gnode_root;
+}
+
+static GNode*
+dfilter_mknode_unary(int operand, GNode *n2)
+{
+       dfilter_node    *node_root;
+       GNode           *gnode_root;
+
+       node_root = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node_root->ntype = logical;
+       node_root->value.logical = operand;
+       node_root->elem_size = 0;
+       node_root->fill_array_func = NULL;
+       node_root->check_relation_func = NULL;
+
+       gnode_root = g_node_new(node_root);
+       g_node_append(gnode_root, n2);
+
+       return gnode_root;
+}
+
+
+static GNode*
+dfilter_mknode_numeric_variable(gint id)
+{
+       dfilter_node    *node;
+       GNode           *gnode;
+
+       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node->ntype = variable;
+       node->elem_size = sizeof(guint32);
+       node->fill_array_func = fill_array_numeric_variable;
+       node->check_relation_func = check_relation_numeric;
+       node->value.variable = id;
+       gnode = g_node_new(node);
+
+       return gnode;
+}
+
+static GNode*
+dfilter_mknode_ether_variable(gint id)
+{
+       dfilter_node    *node;
+       GNode           *gnode;
+
+       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node->ntype = variable;
+       node->elem_size = sizeof(guint8) * 6;
+       node->fill_array_func = fill_array_ether_variable;
+       node->check_relation_func = check_relation_ether;
+       node->value.variable = id;
+       gnode = g_node_new(node);
+
+       return gnode;
+}
+
+static GNode*
+dfilter_mknode_ipv4_variable(gint id)
+{
+       dfilter_node    *node;
+       GNode           *gnode;
+
+       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node->ntype = variable;
+       node->elem_size = sizeof(guint32);
+       node->fill_array_func = fill_array_numeric_variable; /* cheating ! */
+       node->check_relation_func = check_relation_numeric; /* cheating ! */
+       node->value.variable = id;
+       gnode = g_node_new(node);
+
+       return gnode;
+}
+
+static GNode*
+dfilter_mknode_bytes_variable(gint id, gint offset, gint length)
+{
+       dfilter_node    *node;
+       GNode           *gnode;
+
+       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node->ntype = variable;
+       /*node->elem_size = length * sizeof(guint8);*/
+       node->elem_size = sizeof(GByteArray*);
+       node->fill_array_func = fill_array_bytes_variable;
+       node->check_relation_func = check_relation_bytes;
+       node->value.variable = id;
+       node->offset = offset;
+       node->length = length;
+       gnode = g_node_new(node);
+
+       return gnode;
+}
+
+static GNode*
+dfilter_mknode_boolean_variable(gint id)
+{
+       dfilter_node    *node;
+       GNode           *gnode;
+
+       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node->ntype = variable;
+       node->elem_size = sizeof(guint32);
+       node->fill_array_func = fill_array_boolean_variable; /* cheating ! */
+       node->check_relation_func = check_relation_boolean; /* cheating ! */
+       node->value.variable = id;
+       gnode = g_node_new(node);
+
+       return gnode;
+}
+
+static GNode*
+dfilter_mknode_numeric_value(guint32 val)
+{
+       dfilter_node    *node;
+       GNode           *gnode;
+
+       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node->ntype = numeric;
+       node->elem_size = sizeof(guint32);
+       node->fill_array_func = fill_array_numeric_value;
+       node->check_relation_func = check_relation_numeric;
+       node->value.numeric = val;
+       gnode = g_node_new(node);
+
+       return gnode;
+}
+
+static GNode*
+dfilter_mknode_ether_value(char *a, char *b, char *c, char *d, char *e, char *f)
+{
+       dfilter_node    *node;
+       GNode           *gnode;
+       char            *endptr;
+
+       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node->ntype = ether;
+       node->elem_size = sizeof(guint8) * 6;
+       node->fill_array_func = fill_array_ether_value;
+       node->check_relation_func = check_relation_ether;
+
+       node->value.ether[0] = (guint8) strtoul(a, &endptr, 16);
+       node->value.ether[1] = (guint8) strtoul(b, &endptr, 16);
+       node->value.ether[2] = (guint8) strtoul(c, &endptr, 16);
+       node->value.ether[3] = (guint8) strtoul(d, &endptr, 16);
+       node->value.ether[4] = (guint8) strtoul(e, &endptr, 16);
+       node->value.ether[5] = (guint8) strtoul(f, &endptr, 16);
+
+       gnode = g_node_new(node);
+
+       return gnode;
+}
+
+static GNode*
+dfilter_mknode_ipv4_value(char *host)
+{
+       dfilter_node    *node;
+       GNode           *gnode;
+
+       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node->ntype = numeric;
+       node->elem_size = sizeof(guint32);
+       node->fill_array_func = fill_array_numeric_value; /* cheating ! */
+       node->check_relation_func = check_relation_numeric; /* cheating ! */
+       node->value.numeric = get_host_ipaddr(host);
+       node->value.numeric = htonl(node->value.numeric);
+       gnode = g_node_new(node);
+
+       return gnode;
+}
+
+static GNode*
+dfilter_mknode_bytes_value(GByteArray *barray)
+{
+       dfilter_node    *node;
+       GNode           *gnode;
+
+       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node->ntype = bytes;
+       /*node->elem_size = barray->len * sizeof(guint8);*/
+       node->elem_size = sizeof(GByteArray*);
+       node->fill_array_func = fill_array_bytes_value;
+       node->check_relation_func = check_relation_bytes;
+       node->value.bytes = barray;
+       node->offset = G_MAXINT;
+       node->length = barray->len;
+       gnode = g_node_new(node);
+
+       return gnode;
+}
+
+static GNode*
+dfilter_mknode_boolean_value(gint truth_value)
+{
+       dfilter_node    *node;
+       GNode           *gnode;
+
+       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node->ntype = numeric;
+       node->elem_size = sizeof(guint32);
+       node->fill_array_func = fill_array_boolean_value;
+       node->check_relation_func = check_relation_boolean;
+       node->value.boolean = truth_value == TOK_TRUE ? TRUE : FALSE;
+       gnode = g_node_new(node);
+
+       return gnode;
+}
+
+static guint32
+string_to_value(char *s)
+{
+       char    *endptr;
+       guint32 val;
+
+       val = strtoul(s, &endptr, 0);
+       /* I should probably check errno here */
+
+       return (guint32)val;
+}
+       
+static GNode*
+dfilter_mknode_existence(gint id)
+{
+       dfilter_node    *node;
+       GNode           *gnode;
+
+       node = g_mem_chunk_alloc(gmc_dfilter_nodes);
+       node->ntype = existence;
+       node->elem_size = sizeof(guint32);
+       node->fill_array_func = NULL;
+       node->check_relation_func = NULL;
+       node->value.variable = id;
+       gnode = g_node_new(node);
+
+       return gnode;
+}
diff --git a/dfilter.c b/dfilter.c
new file mode 100644 (file)
index 0000000..91d1bc5
--- /dev/null
+++ b/dfilter.c
@@ -0,0 +1,806 @@
+/* dfilter.c
+ * Routines for display filters
+ *
+ * $Id: dfilter.c,v 1.1 1999/07/07 22:51:37 gram Exp $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@zing.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * 
+ * 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
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#ifndef _STDIO_H
+#include <stdio.h>
+#endif
+
+#ifndef _STRING_H
+#include <string.h>
+#endif
+
+#ifndef __G_LIB_H__
+#include <glib.h>
+#endif
+
+#ifndef __PROTO_H__
+#include "proto.h"
+#endif
+
+#ifndef __DFILTER_H__
+#include "dfilter.h"
+#endif
+#include "dfilter-grammar.h"
+
+int yyparse(void); /* yacc entry-point */
+
+#define DFILTER_LEX_SYMBOL_OFFSET      1000
+#define DFILTER_LEX_ABBREV_OFFSET      2000
+
+#define DFILTER_LEX_SCOPE_ANY          0
+       
+GScanner *scanner;
+
+/* Silly global variables used to pass parameter to check_relation_bytes() */
+int bytes_offset = 0;
+int bytes_length = 0;
+
+YYSTYPE yylval;
+/* in dfilter-grammar.y */
+extern GMemChunk *gmc_dfilter_nodes; 
+extern GNode *dfilter_tree;
+extern GSList *dfilter_list_byte_arrays;
+
+static gboolean dfilter_apply_node(GNode *gnode, proto_tree *ptree, guint8 *pd);
+static gboolean check_relation(gint operand, GNode *a, GNode *b, proto_tree *ptree, guint8 *pd);
+static gboolean check_logical(gint operand, GNode *a, GNode *b, proto_tree *ptree, guint8 *pd);
+static GArray* get_values_from_ptree(dfilter_node *dnode, proto_tree *ptree, guint8 *pd);
+static GArray* get_values_from_dfilter(dfilter_node *dnode, GNode *gnode);
+static gboolean check_existence_in_ptree(dfilter_node *dnode, proto_tree *ptree);
+static void clear_byte_array(gpointer data, gpointer user_data);
+
+/* this is not so pretty. I need my own g_array "function" (macro) to
+ * retreive the pointer to the data stored in an array cell. I need this
+ * for type ether.. GArray makes it easy for me to store 6 bytes inside an array
+ * cell, but hard to retrieve it.
+ */
+#define g_array_index_ptr(a,s,i)      (((guint8*) (a)->data) + (i*s))
+
+static const GScannerConfig dfilter_scanner_config =
+{
+  (
+   " \t\n"
+   )                    /* cset_skip_characters */,
+
+  /* I wish I didn't have to start strings with numeric
+       digits, but if I don't, strings like MAC and IPv4
+       addresses get really hard to handle */
+  (
+   G_CSET_a_2_z
+   "_0123456789"
+   G_CSET_A_2_Z
+   )                    /* cset_identifier_first */,
+  (
+   G_CSET_a_2_z
+   ".-_0123456789"
+   G_CSET_A_2_Z
+   )                    /* cset_identifier_nth */,
+  ( "#\n" )             /* cpair_comment_single */,
+
+  FALSE                  /* case_sensitive */,
+
+  FALSE                  /* skip_comment_multi */,
+  FALSE                  /* skip_comment_single */,
+  TRUE                  /* scan_comment_multi */,
+  TRUE                  /* scan_identifier */,
+  TRUE                  /* scan_identifier_1char */,
+  FALSE                 /* scan_identifier_NULL */,
+  TRUE                  /* scan_symbols */,
+  TRUE                  /* scan_binary */,
+  TRUE                  /* scan_octal */,
+  TRUE                  /* scan_float */,
+  TRUE                  /* scan_hex */,
+  TRUE                  /* scan_hex_dollar */,
+  TRUE                  /* scan_string_sq */,
+  FALSE                 /* scan_string_dq */,
+  TRUE                  /* numbers_2_int */,
+  FALSE                 /* int_2_float */,
+  FALSE                 /* identifier_2_string */,
+  TRUE                  /* char_2_token */,
+  TRUE                  /* symbol_2_token */,
+  FALSE                 /* scope_0_fallback */,
+};
+
+typedef struct symtab_record {
+       int     id;
+       char    *token;
+} symtab_record;
+
+symtab_record operator_symtab[] = {
+       { TOK_AND,              "and" },
+       { TOK_OR,               "or" },
+       { TOK_NOT,              "not" },
+       { TOK_XOR,              "xor" },
+       { TOK_EQ,               "eq" },
+       { TOK_NE,               "ne" },
+       { TOK_GT,               "gt" },
+       { TOK_GE,               "ge" },
+       { TOK_LT,               "lt" },
+       { TOK_LE,               "le" },
+       { TOK_EXIST,            "exist" },
+       { TOK_EXISTS,           "exists" },
+       { TOK_TRUE,             "true" },
+       { TOK_FALSE,            "false" },
+       { 0,                    NULL }
+};
+
+
+void
+dfilter_init(void)
+{
+       int num_symbols, i, symbol;
+       char *s;
+       symtab_record *symrec;
+
+       scanner = g_scanner_new(&dfilter_scanner_config);
+       scanner->input_name = "Ethereal Display Filter";
+
+       g_scanner_freeze_symbol_table(scanner);
+
+       /* Add the header field and protocol abbrevs to the symbol table */
+       num_symbols = proto_registrar_n();
+       for (i=0; i < num_symbols; i++) {
+               s = proto_registrar_get_abbrev(i);
+               if (s) {
+                       symbol = DFILTER_LEX_ABBREV_OFFSET + i;
+                       g_scanner_scope_add_symbol(scanner,
+                               DFILTER_LEX_SCOPE_ANY, s, GINT_TO_POINTER(symbol));
+               }
+       }
+
+       /* Add the operators to the symbol table */
+       for (symrec=operator_symtab; symrec->token != NULL; symrec++) {
+               symbol = DFILTER_LEX_SYMBOL_OFFSET + symrec->id;
+               g_scanner_scope_add_symbol(scanner, DFILTER_LEX_SCOPE_ANY,
+                       symrec->token, GINT_TO_POINTER(symbol));
+       }
+       g_scanner_thaw_symbol_table(scanner);
+}
+
+int
+dfilter_compile(char *dfilter_text, GNode **p_dfcode)
+{
+       int retval;
+
+       g_assert(dfilter_text != NULL);
+       g_scanner_input_text(scanner, dfilter_text, strlen(dfilter_text));
+
+       if (dfilter_tree) {
+               /* clear tree */
+               dfilter_tree = NULL;
+       }
+
+       g_mem_chunk_reset(gmc_dfilter_nodes);
+
+       if (dfilter_list_byte_arrays) {
+               g_slist_foreach(dfilter_list_byte_arrays, clear_byte_array, NULL);
+               g_slist_free(dfilter_list_byte_arrays);
+               dfilter_list_byte_arrays = NULL;
+       }
+
+       retval = yyparse();
+       *p_dfcode = dfilter_tree;
+       return retval;
+}
+
+static void
+clear_byte_array(gpointer data, gpointer user_data)
+{
+       GByteArray *barray = data;
+
+       g_byte_array_free(barray, TRUE);
+}
+
+int
+yylex(void)
+{
+       guint           token;
+
+       if (g_scanner_peek_next_token(scanner) == G_TOKEN_EOF) {
+               return 0;
+       }
+       else {
+               token = g_scanner_get_next_token(scanner);
+       }
+
+       /* Set the yacc-defined tokens back to their yacc-defined values */
+       if (token >= DFILTER_LEX_SYMBOL_OFFSET && token <= DFILTER_LEX_ABBREV_OFFSET) {
+               token -= DFILTER_LEX_SYMBOL_OFFSET;
+               yylval.operand = token;
+       }
+       /* Handle our dynamically-created list of header field abbrevs */
+       else if (token >= DFILTER_LEX_ABBREV_OFFSET) {
+               yylval.variable = token;
+               switch (proto_registrar_get_ftype(token - DFILTER_LEX_ABBREV_OFFSET)) {
+               case FT_UINT8:
+               case FT_VALS_UINT8:
+                       token = T_FT_UINT8;
+                       break;
+               case FT_UINT16:
+               case FT_VALS_UINT16:
+                       token = T_FT_UINT16;
+                       break;
+               case FT_UINT32:
+               case FT_VALS_UINT32:
+               case FT_VALS_UINT24:
+                       token = T_FT_UINT32;
+                       break;
+               case FT_ETHER:
+                       token = T_FT_ETHER;
+                       break;
+               case FT_IPv4:
+                       token = T_FT_IPv4;
+                       break;
+               case FT_NONE:
+                       token = T_FT_NONE;
+                       break;
+               case FT_BYTES:
+                       token = T_FT_BYTES;
+                       break;
+               case FT_BOOLEAN:
+                       token = T_FT_BOOLEAN;
+                       break;
+               default:
+                       token = 0;
+                       break;
+               }
+       }
+       /* unidentified strings. that's how I make numbers come in! */
+       else if (token == G_TOKEN_IDENTIFIER || token == G_TOKEN_IDENTIFIER_NULL) {
+               token = T_VAL_ID;
+               yylval.id = g_strdup(scanner->value.v_identifier);
+       }
+       else {
+               printf("(unknown) token = %d\n", token);
+       }
+
+       return token;
+}
+
+void
+yyerror(char *s)
+{
+       fprintf(stderr, "%s\n", s);
+}
+
+void
+dfilter_yyerror(char *fmt, ...)
+{
+       dfilter_tree = NULL;
+       yyerror(fmt);
+}
+
+gboolean
+dfilter_apply(GNode *dfcode, proto_tree *ptree, guint8* pd)
+{
+       gboolean retval;
+       retval = dfilter_apply_node(dfcode, ptree, pd);
+       return retval;
+}
+
+static gboolean
+dfilter_apply_node(GNode *gnode, proto_tree *ptree, guint8* pd)
+{
+       GNode           *gnode_a, *gnode_b;
+       dfilter_node    *dnode = (dfilter_node*) (gnode->data);
+
+       /* We'll get 2 NULLs if we don't have children */
+       gnode_a = g_node_nth_child(gnode, 0);
+       gnode_b = g_node_nth_child(gnode, 1);
+
+       switch(dnode->ntype) {
+       case variable:
+               /* the only time we'll see a 'variable' at this point is if the display filter
+                * checks the value of a single field: "tr.sr", for example. Inside a relation,
+                * the relation code will retrieve the value of the variable
+                 */
+               g_assert(!gnode_a && !gnode_b);
+               g_assert_not_reached();
+               /*return check_single_variable(gnode, ptree, pd);*/
+
+       case logical:
+               return check_logical(dnode->value.logical, gnode_a, gnode_b, ptree, pd);
+
+       case relation:
+               g_assert(gnode_a && gnode_b);
+               return check_relation(dnode->value.relation, gnode_a, gnode_b, ptree, pd);
+
+       case alternation:
+               g_assert_not_reached();
+               /* not coded yet */
+       
+       case numeric:
+       case ipv4:
+       case boolean:
+       case ether:
+       case ether_vendor:
+       case string:
+       case abs_time:
+       case bytes:
+               /* the only time we'll see these at this point is if the display filter
+                * is really wacky. Just return TRUE */
+               g_assert(!gnode_a && !gnode_b);
+               return TRUE;
+
+       case existence: /* checking the existence of a protocol or hf*/
+               g_assert(!gnode_a && !gnode_b);
+               return check_existence_in_ptree(dnode, ptree);
+       }
+
+       g_assert_not_reached();
+       return FALSE;
+}
+
+static gboolean
+check_logical(gint operand, GNode *a, GNode *b, proto_tree *ptree, guint8 *pd)
+{
+       switch(operand) {
+       case TOK_AND:
+               return (dfilter_apply_node(a, ptree, pd) && dfilter_apply_node(b, ptree, pd));
+       case TOK_OR:
+               return (dfilter_apply_node(a, ptree, pd) || dfilter_apply_node(b, ptree, pd));
+       case TOK_XOR:
+               return (dfilter_apply_node(a, ptree, pd) || dfilter_apply_node(b, ptree, pd));
+       case TOK_NOT:
+               return (!dfilter_apply_node(a, ptree, pd));
+       default:
+               g_assert_not_reached();
+       }       
+       g_assert_not_reached();
+       return FALSE;
+}
+
+/* this is inefficient. I get arrays for both a and b that represent all the values present. That is,
+ * if a is bootp.option, e.g., i'll get an array showing all the bootp.option values in the protocol
+ * tree. Then I'll get an array for b, which more than likely is a single int, and then I'll compare
+ * them all. It makes my coding easier in the beginning, but I should change this to make it run
+ * faster.
+ */
+static gboolean
+check_relation(gint operand, GNode *a, GNode *b, proto_tree *ptree, guint8* pd)
+{
+       dfilter_node    *node_a = (dfilter_node*) (a->data);
+       dfilter_node    *node_b = (dfilter_node*) (b->data);
+       GArray          *vals_a, *vals_b;
+       gboolean        retval;
+
+
+       bytes_length = MIN(node_a->length, node_b->length);
+       bytes_offset = MIN(node_a->offset, node_b->offset);
+       if (node_a->ntype == variable)
+               vals_a = get_values_from_ptree(node_a, ptree, pd);
+       else
+               vals_a = get_values_from_dfilter(node_a, a);
+
+       if (node_b->ntype == variable)
+               vals_b = get_values_from_ptree(node_b, ptree, pd);
+       else
+               vals_b = get_values_from_dfilter(node_b, b);
+
+       retval =  node_a->check_relation_func(operand, vals_a, vals_b);
+
+       g_array_free(vals_a, FALSE);
+       g_array_free(vals_b, FALSE);
+
+       return retval;
+}
+
+#if 0
+static gboolean
+check_single_variable(GNode *gnode, proto_tree *ptree, guint8* pd)
+{
+       dfilter_node    *node = (dfilter_node*) (gnode->data);
+       GArray          *vals;
+       gboolean        retval;
+
+
+       bytes_length = node->length;
+       bytes_offset = node->offset;
+       vals = get_values_from_ptree(node, ptree, pd);
+
+       retval =  node_a->check_relation_func(operand, vals_a, vals_b);
+
+       g_array_free(vals, FALSE);
+
+       return retval;
+}
+#endif
+
+static gboolean
+check_existence_in_ptree(dfilter_node *dnode, proto_tree *ptree)
+{
+       int             target_field;
+       proto_tree      *subtree;
+
+       target_field = dnode->value.variable - DFILTER_LEX_ABBREV_OFFSET;
+       /*subtree = proto_find_protocol(ptree, target_field);*/
+       subtree = proto_find_field(ptree, target_field);
+
+       if (subtree)
+               return TRUE;
+       else
+               return FALSE;
+}
+
+static GArray*
+get_values_from_ptree(dfilter_node *dnode, proto_tree *ptree, guint8 *pd)
+{
+       GArray          *array;
+       int             parent_protocol;
+       int             target_field;
+       proto_tree      *subtree = NULL; /* where the parent protocol's sub-tree starts */
+       proto_tree_search_info sinfo;
+
+       g_assert(dnode->elem_size > 0);
+       array = g_array_new(FALSE, FALSE, dnode->elem_size);
+
+       target_field = dnode->value.variable - DFILTER_LEX_ABBREV_OFFSET;
+
+       /* Find the proto_tree subtree where we should start searching.*/
+       if (proto_registrar_is_protocol(target_field)) {
+               subtree = proto_find_protocol(ptree, target_field);
+       }
+       else {
+               parent_protocol = proto_registrar_get_parent(target_field);
+               if (parent_protocol >= 0) {
+                       subtree = proto_find_protocol(ptree, parent_protocol);
+               }
+       }
+
+       if (subtree) {
+               sinfo.target_field = target_field;
+               sinfo.result_array = array;
+               sinfo.packet_data = pd;
+               proto_get_field_values(subtree, dnode->fill_array_func, &sinfo);
+       }
+
+       return array;
+}
+
+static GArray*
+get_values_from_dfilter(dfilter_node *dnode, GNode *gnode)
+{
+       GArray          *array;
+
+       g_assert(dnode->elem_size > 0);
+       array = g_array_new(FALSE, FALSE, dnode->elem_size);
+
+       g_node_traverse(gnode, G_IN_ORDER, G_TRAVERSE_ALL, -1, dnode->fill_array_func, array);
+/*     dnode->fill_array_func(gnode, array);*/
+       return array;
+}
+
+gboolean fill_array_numeric_variable(GNode *gnode, gpointer data)
+{
+       proto_tree_search_info  *sinfo = (proto_tree_search_info*)data;
+       field_info              *fi = (field_info*) (gnode->data);
+
+       if (fi->hfinfo->id == sinfo->target_field) {
+               g_array_append_val(sinfo->result_array, fi->value.numeric);
+       }
+
+       return FALSE; /* FALSE = do not end traversal of GNode tree */
+}
+
+gboolean fill_array_ether_variable(GNode *gnode, gpointer data)
+{
+       proto_tree_search_info  *sinfo = (proto_tree_search_info*)data;
+       field_info              *fi = (field_info*) (gnode->data);
+
+       if (fi->hfinfo->id == sinfo->target_field) {
+               g_array_append_val(sinfo->result_array, fi->value.ether);
+       }
+
+       return FALSE; /* FALSE = do not end traversal of GNode tree */
+}
+
+gboolean fill_array_bytes_variable(GNode *gnode, gpointer data)
+{
+       proto_tree_search_info  *sinfo = (proto_tree_search_info*)data;
+       field_info              *fi = (field_info*) (gnode->data);
+       GByteArray              *barray;
+
+       if (fi->hfinfo->id == sinfo->target_field) {
+               barray = g_byte_array_new();
+               /*dfilter_list_byte_arrays = g_slist_append(dfilter_list_byte_arrays, barray);*/
+               g_byte_array_append(barray, sinfo->packet_data + fi->start + bytes_offset, bytes_length);
+               g_array_append_val(sinfo->result_array, barray);
+       }
+
+       return FALSE; /* FALSE = do not end traversal of GNode tree */
+}
+
+gboolean fill_array_boolean_variable(GNode *gnode, gpointer data)
+{
+       proto_tree_search_info  *sinfo = (proto_tree_search_info*)data;
+       field_info              *fi = (field_info*) (gnode->data);
+
+       if (fi->hfinfo->id == sinfo->target_field) {
+               g_array_append_val(sinfo->result_array, fi->value.boolean);
+       }
+
+       return FALSE; /* FALSE = do not end traversal of GNode tree */
+}
+
+gboolean fill_array_numeric_value(GNode *gnode, gpointer data)
+{
+       GArray          *array = (GArray*)data;
+       dfilter_node    *dnode = (dfilter_node*) (gnode->data);
+
+       g_array_append_val(array, dnode->value.numeric);
+
+       return FALSE; /* FALSE = do not end traversal of GNode tree */
+}
+
+gboolean fill_array_ether_value(GNode *gnode, gpointer data)
+{
+       GArray          *array = (GArray*)data;
+       dfilter_node    *dnode = (dfilter_node*) (gnode->data);
+
+       g_array_append_val(array, dnode->value.ether);
+
+       return FALSE; /* FALSE = do not end traversal of GNode tree */
+}
+
+gboolean fill_array_bytes_value(GNode *gnode, gpointer data)
+{
+       GArray          *array = (GArray*)data;
+       dfilter_node    *dnode = (dfilter_node*) (gnode->data);
+       GByteArray      *barray = dnode->value.bytes;
+
+       g_array_append_val(array, barray);
+
+       return FALSE; /* FALSE = do not end traversal of GNode tree */
+}
+
+gboolean fill_array_boolean_value(GNode *gnode, gpointer data)
+{
+       GArray          *array = (GArray*)data;
+       dfilter_node    *dnode = (dfilter_node*) (gnode->data);
+
+       g_array_append_val(array, dnode->value.boolean);
+
+       return FALSE; /* FALSE = do not end traversal of GNode tree */
+}
+
+
+gboolean check_relation_numeric(gint operand, GArray *a, GArray *b)
+{
+       int     i, j, len_a, len_b;
+       guint32 val_a;
+
+       len_a = a->len;
+       len_b = b->len;
+
+
+       switch(operand) {
+       case TOK_EQ:
+               for(i = 0; i < len_a; i++) {
+                       val_a = g_array_index(a, guint32, i);
+                       for (j = 0; j < len_b; j++) {
+                               if (val_a == g_array_index(b, guint32, j))
+                                       return TRUE;
+                       }
+               }
+               return FALSE;
+
+       case TOK_NE:
+               for(i = 0; i < len_a; i++) {
+                       val_a = g_array_index(a, guint32, i);
+                       for (j = 0; j < len_b; j++) {
+                               if (val_a != g_array_index(b, guint32, j))
+                                       return TRUE;
+                       }
+               }
+               return FALSE;
+
+       case TOK_GT:
+               for(i = 0; i < len_a; i++) {
+                       val_a = g_array_index(a, guint32, i);
+                       for (j = 0; j < len_b; j++) {
+                               if (val_a > g_array_index(b, guint32, j))
+                                       return TRUE;
+                       }
+               }
+               return FALSE;
+
+       case TOK_GE:
+               for(i = 0; i < len_a; i++) {
+                       val_a = g_array_index(a, guint32, i);
+                       for (j = 0; j < len_b; j++) {
+                               if (val_a >= g_array_index(b, guint32, j))
+                                       return TRUE;
+                       }
+               }
+               return FALSE;
+
+       case TOK_LT:
+               for(i = 0; i < len_a; i++) {
+                       val_a = g_array_index(a, guint32, i);
+                       for (j = 0; j < len_b; j++) {
+                               if (val_a < g_array_index(b, guint32, j))
+                                       return TRUE;
+                       }
+               }
+               return FALSE;
+
+       case TOK_LE:
+               for(i = 0; i < len_a; i++) {
+                       val_a = g_array_index(a, guint32, i);
+                       for (j = 0; j < len_b; j++) {
+                               if (val_a <= g_array_index(b, guint32, j))
+                                       return TRUE;
+                       }
+               }
+               return FALSE;
+
+       default:
+               g_assert_not_reached();
+       }
+
+       g_assert_not_reached();
+       return FALSE;
+}
+
+
+gboolean check_relation_ether(gint operand, GArray *a, GArray *b)
+{
+       int     i, j, len_a, len_b;
+       guint8* ptr_a;
+
+       len_a = a->len;
+       len_b = b->len;
+
+
+       switch(operand) {
+       case TOK_EQ:
+               for(i = 0; i < len_a; i++) {
+                       ptr_a = g_array_index_ptr(a, 6, i);
+                       for (j = 0; j < len_b; j++) {
+                               if (memcmp(ptr_a, g_array_index_ptr(b, 6, j), 6) == 0)
+                                       return TRUE;
+                       }
+               }
+               return FALSE;
+
+       case TOK_NE:
+               for(i = 0; i < len_a; i++) {
+                       ptr_a = g_array_index_ptr(a, 6, i);
+                       for (j = 0; j < len_b; j++) {
+                               if (memcmp(ptr_a, g_array_index_ptr(b, 6, j), 6) != 0)
+                                       return TRUE;
+                       }
+               }
+               return FALSE;
+       }
+
+       g_assert_not_reached();
+       return FALSE;
+}
+
+gboolean check_relation_bytes(gint operand, GArray *a, GArray *b)
+{
+       int     i, j, len_a, len_b;
+       GByteArray      *ptr_a,*ptr_b;
+
+       len_a = a->len;
+       len_b = b->len;
+
+
+       switch(operand) {
+       case TOK_EQ:
+               for(i = 0; i < len_a; i++) {
+                       ptr_a = g_array_index(a, GByteArray*, i);
+                       for (j = 0; j < len_b; j++) {
+                               ptr_b = g_array_index(b, GByteArray*, j);
+                               if (memcmp(ptr_a->data, ptr_b->data, bytes_length) == 0)
+                                       return TRUE;
+                       }
+               }
+               return FALSE;
+
+       case TOK_NE:
+               for(i = 0; i < len_a; i++) {
+                       ptr_a = g_array_index(a, GByteArray*, i);
+                       for (j = 0; j < len_b; j++) {
+                               ptr_b = g_array_index(b, GByteArray*, j);
+                               if (memcmp(ptr_a->data, ptr_b->data, bytes_length) != 0)
+                                       return TRUE;
+                       }
+               }
+               return FALSE;
+
+       case TOK_GT:
+               for(i = 0; i < len_a; i++) {
+                       ptr_a = g_array_index(a, GByteArray*, i);
+                       for (j = 0; j < len_b; j++) {
+                               ptr_b = g_array_index(b, GByteArray*, j);
+                               if (memcmp(ptr_a->data, ptr_b->data, bytes_length) > 0)
+                                       return TRUE;
+                       }
+               }
+               return FALSE;
+
+       case TOK_LT:
+               for(i = 0; i < len_a; i++) {
+                       ptr_a = g_array_index(a, GByteArray*, i);
+                       for (j = 0; j < len_b; j++) {
+                               ptr_b = g_array_index(b, GByteArray*, j);
+                               if (memcmp(ptr_a->data, ptr_b->data, bytes_length) < 0)
+                                       return TRUE;
+                       }
+               }
+               return FALSE;
+       }
+
+       g_assert_not_reached();
+       return FALSE;
+}
+
+gboolean check_relation_boolean(gint operand, GArray *a, GArray *b)
+{
+       int     i, j, len_a, len_b;
+       guint32 val_a;
+
+       len_a = a->len;
+       len_b = b->len;
+
+
+       switch(operand) {
+       case TOK_EQ:
+               for(i = 0; i < len_a; i++) {
+                       val_a = g_array_index(a, guint32, i);
+                       for (j = 0; j < len_b; j++) {
+                               if (val_a == g_array_index(b, guint32, j))
+                                       return TRUE;
+                       }
+               }
+               return FALSE;
+
+       case TOK_NE:
+               for(i = 0; i < len_a; i++) {
+                       val_a = g_array_index(a, guint32, i);
+                       for (j = 0; j < len_b; j++) {
+                               if (val_a != g_array_index(b, guint32, j))
+                                       return TRUE;
+                       }
+               }
+               return FALSE;
+
+       default:
+               g_assert_not_reached();
+       }
+
+       g_assert_not_reached();
+       return FALSE;
+}
diff --git a/dfilter.h b/dfilter.h
new file mode 100644 (file)
index 0000000..6a60af5
--- /dev/null
+++ b/dfilter.h
@@ -0,0 +1,105 @@
+/* dfilter.h
+ * Definitions for display filters
+ *
+ * $Id: dfilter.h,v 1.1 1999/07/07 22:51:37 gram Exp $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@zing.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * 
+ * 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.
+ */
+
+#ifndef __DFILTER_H__
+#define __DFILTER_H__
+
+void dfilter_init(void);
+void dfilter_cleanup(void);
+int dfilter_compile(char* dfilter_text, GNode** p_dfcode);
+gboolean dfilter_apply(GNode *dfcode, proto_tree *ptree, guint8* pd);
+
+/* Here we provide interfaces to make our scanner act and look like lex */
+int yylex(void);
+void yyerror(char *s);
+void dfilter_yyerror(char *fmt, ...);
+
+/* functions that dfilter-grammar.y needs during parsing*/
+gboolean check_relation_numeric(gint operand, GArray *a, GArray *b);
+gboolean check_relation_ether(gint operand, GArray *a, GArray *b);
+gboolean check_relation_bytes(gint operand, GArray *a, GArray *b);
+gboolean check_relation_boolean(gint operand, GArray *a, GArray *b);
+
+gboolean fill_array_numeric_value(GNode *gnode, gpointer data);
+gboolean fill_array_numeric_variable(GNode *gnode, gpointer data);
+gboolean fill_array_ether_value(GNode *gnode, gpointer data);
+gboolean fill_array_ether_variable(GNode *gnode, gpointer data);
+gboolean fill_array_bytes_value(GNode *gnode, gpointer data);
+gboolean fill_array_bytes_variable(GNode *gnode, gpointer data);
+gboolean fill_array_boolean_value(GNode *gnode, gpointer data);
+gboolean fill_array_boolean_variable(GNode *gnode, gpointer data);
+
+enum node_type {
+       relation,       /* eq, ne, gt, ge, lt, le */
+       logical,        /* and, or, not, xor */
+       variable,       /* protocol or header field id */
+       existence,      /* existence of a variable (protocol or hf) */
+       alternation,    /* &, | */
+       boolean,        /* true, false */
+       numeric,        /* uint8, uint16, or uint32 value */
+       abs_time,
+       string,
+       ether,
+       ether_vendor,
+       bytes,
+       ipv4
+};
+
+typedef gboolean(*CheckRelationFunc) (gint operand, GArray *a, GArray *b);
+
+/* This struct is the parse tree node created by this grammary and used
+ * directly in the display filter routines to filter packets.
+ */
+typedef struct dfilter_node {
+       enum node_type                  ntype; /* from dfilter-grammar.h */
+       int                             elem_size; /* computed at dfilter parse time rather than
+                                               when finding elements for each packet. Saves time
+                                               in get_values_from_ptree() */
+       CheckRelationFunc               check_relation_func;
+       GNodeTraverseFunc               fill_array_func;
+
+       /* copied from proto.h */
+       union {
+               gint            relation; /* if type == relation (eq, ne, gt, ge, lt, le) */
+               gint            logical;  /* if type == logical (and, or, not, xor) */
+               gint            variable; /* if type == variable (protocol or header field abbrev) */
+               gint            alternation; /* if type == alternation (& or |) */
+
+               gboolean        boolean;
+               guint32         numeric;
+               struct timeval  abs_time; /* the whole struct, not a pointer */
+               gchar           *string;
+               guint8          ether[6];
+               GByteArray      *bytes;
+       }                               value;
+
+       /* used for byte-ranges */
+       int                             offset;
+       int                             length;
+} dfilter_node;
+
+
+
+#endif /* ! __DFILTER_H__ */
diff --git a/doc/proto_tree b/doc/proto_tree
new file mode 100644 (file)
index 0000000..4f20865
--- /dev/null
@@ -0,0 +1,235 @@
+The Ethereal Protocol Tree
+==========================
+
+Up until version 0.6.3 of ethereal, the protocol tree that is displayed
+in the middle pane of the ethereal GUI had been created by having the
+protocol dissection routines add strings to a GTK+ tree. This GUI
+container was not easily manipulated; the print routines had to reach
+inside what should be an opaque structure and pull out the data. The
+tree of strings also did not lend itself to filtering on the data
+available in the tree.
+
+Mostly to solve the display filter problem, I decided to have the
+protocol dissection routines put their data into a logical tree instead
+of a GUI tree. This tree structure would provide a generic way for
+multiple routines, like the dissection routines, the display filter
+routines, and the print routines, to retrieve data about the protocol
+fields. The GUI routines would then be modified to draw the GUI tree
+based on the data in the logical tree. By structuring this logical tree
+well, with well-defined field types, ethereal can have a very powerful
+display filter option. No longer would display filters be limited to the
+ability of the BPF compiler (libpcap or wiretap), but would have access to the
+full range of C field types available within ethereal.
+
+The dissection routines are still passed a proto_tree pointer, but a
+proto_tree is no longer the same as a GtkTree. Now a proto_tree is a
+GNode, the N-way tree structure available within GLIB. Of course the
+protocol dissectors don't care what a proto_tree really is; they just
+pass the proto_tree pointer as an argument to the routines which allow
+them to add items and new branches to the tree.
+
+In packet_list_select_cb() you'll now find this:
+
+    if (protocol_tree)
+        proto_tree_free(protocol_tree);
+    protocol_tree = proto_tree_create_root();
+    dissect_packet(cf.pd, fd, protocol_tree);
+    proto_tree_draw(protocol_tree, tree_view);
+
+When a packet is selected in the packet-list pane, a new logical
+protocol tree (proto_tree) is created. The pointer to the proto_tree (in
+this case, 'protocol tree'), is passed to the top-level protocol
+dissector, and then the GUI tree is drawn via proto_tree_draw().
+
+Programming for the proto_tree
+==============================
+The logical proto_tree now needs to know detail information about the
+protocols and fields about which information will be collected from the
+dissection routines. No longer will is the data just a bunch of strings.
+Now the data will be typed so that searching and filtering on protocol
+header fields will be possible. This means that the for every protocol
+and field (which I also call "header fields", since they are fields in
+the protocol headers) which might be attached to a tree, some
+information is needed.
+
+Every dissector routine will need to register its protocols and fields
+with the central protocol routines (in proto.c). At first I thought I
+might keep all the protocol and field information about all the
+dissectors in one file, but decentralization seemed like a better idea.
+That one file would have gotten very large; one small change would have
+required a re-compilation of the entire file. Also, by allowing
+registration of protocols and fields at run-time, loadable modules of
+protocol dissectors (perhaps even user-supplied) is feasible.
+
+For every protocol or field that a dissector wants to register, a variable of
+type int needs to be used to keep track of the protocol. The IDs are
+needed for establishing parent/child relationships between protocols and
+fields, as well as associating data with a particular field so that it
+can be stored in the logical tree and displayed in the GUI protocol
+tree.
+
+Some dissectors will need to create branches within their tree to help
+organize header fields. These branches should be registered as header
+fields. Only true protocols should be registered as protocols. This is
+so that a display filter user interface knows how to distinguish
+protocols from fields.
+
+A protocol is registered with the name of the protocol and its
+abbreviation.
+
+Here is how the frame "protocol" is registered.
+
+       int proto_frame;
+
+        proto_frame = proto_register_protocol (
+                /* name */      "Frame",
+                /* abbrev */    "frame" );
+
+
+A header field is also registered with its name and abbreviation, but
+information about the its data type is needed. Some fields will use
+value_strings to represent their values, so the value_string
+is also passed. And of course the parent protocol for the field is indicated
+during registration.
+
+       int hf_frame_arrival_time;
+
+        hf_frame_arrival_time = proto_register_field (
+                /* name */      "Arrival Time",
+                /* abbrev */    "frame.time",
+                /* ftype */     FT_ABSOLUTE_TIME,
+                /* parent */    proto_frame,
+                /* vals[] */    NULL );
+
+The name can be used in any type of display, either in the GUI tree, or
+in a display filter UI. The abbreviation is used when representing a
+display filter as a string. For example, the following strings could be a
+valid display filter, depending upon the implementation of the display
+filter parser and engine.
+
+       frame[20:1] = 0x0a
+       frame.time > 'May 21, 1999 13:15:00'
+
+The field type come from an enum. Currently, enum ftenum is comprised
+of:
+
+/* field types */
+enum ftenum {
+        FT_NONE,        /* used for protocol labels (thus no field type) */
+        FT_UINT8,
+        FT_UINT16,
+        FT_UINT32,
+        FT_ABSOLUTE_TIME,
+        FT_RELATIVE_TIME,
+        FT_STRING,
+        FT_ETHER,
+        FT_BYTES,
+        FT_IPv4,
+        FT_IPv6,
+        FT_IPXSERVER,
+        FT_VALS_UINT8,
+        FT_VALS_UINT16,
+        FT_VALS_UINT24,
+        FT_VALS_UINT32,
+        NUM_FIELD_TYPES /* last item number plus one */
+};
+
+Previously, the sequence needed within a dissector to add a new branch
+to the GUI tree was this:
+
+       item = proto_tree_add_item(....);
+       new_tree = proto_tree_new();
+       proto_item_add_subtree(item, new_tree, tree_type);
+
+With the new system, the call to proto_tree_new() is no longer needed,
+as proto_item_add_subtree creates the new tree for you. The change was
+necessary so that the proto_tree routines could maintain the
+parent/child relationship within the logical tree. But it has a nice
+side-effect of cleaning up the dissector code. The new method is like
+this:
+
+       item = proto_tree_add_item(....);
+       new_tree = proto_item_add_subtree(item, tree_type);
+
+There are now 4 functions that the programmer can use to add either
+protocol or field labels to the proto_tree:
+
+       proto_item*
+       proto_tree_add_item(tree, id, start, length, value);
+
+       proto_item*
+       proto_tree_add_item_format(tree, id, start, length,
+               value, format, ...);
+
+       proto_item*
+       proto_tree_add_item_hidden(tree, id, start, length, value);
+
+       proto_item*
+       proto_tree_add_text(tree, start, length, format, ...);
+
+The first function, proto_tree_add_item, is used when you wish to do no
+special formatting. The item added to the GUI tree will contain the name
+(as passed in the proto_register_*() function) and any value. If your
+field does have a value, it is passed after the length variable (notice
+the ellipsis in the function prototype).
+
+The second function, proto_tree_add_free_format(), is used when the
+dissector routines wants complete control over how the field and value
+will be represented on the GUI tree. The caller must pass include the
+name of the protocol or field; it is not added automatically as in
+proto_tree_add_item().
+
+The third function is used to add fields and values to a tree, but not
+show them on a GUI tree. The caller may want a value to be included in a
+tree so that the packet can be filtered on this field, but the
+representation of that field in the tree is not appropriate. An example
+is the token-ring routing information field (RIF). The best way to show the
+RIF in a GUI is by a sequence of ring and bridge numbers. Rings are
+3-digit hex numbers, and bridges are single hex digits:
+
+       RIF: 001-A-013-9-C0F-B-555
+
+In the case of RIF, the programmer should use a field with no value and
+use proto_tree_add_item_format() to build the above representation. The
+programmer can then add the ring and bridge values, one-by-one, with
+proto_tree_add_item_hidden() so that the user can then filter on or
+search for a particular ring or bridge. Here's a skeleton of how the
+programmer might code this.
+
+       char *rif;
+       rif = create_rif_string(...);
+
+       proto_tree_add_item_format(tree, hf_tr_rif_label,..., "RIF: %s", rif);
+
+       for(i = 0; i < num_rings; i++) {
+               proto_tree_add_item_hidden(tree, hf_tr_rif_ring, ..., ring[i]);
+       }
+       for(i = 0; i < num_rings - 1; i++) {
+               proto_tree_add_item_hidden(tree, hf_tr_rif_ring, ..., bridge[i]);
+       }
+
+The logical tree has these items:
+
+       hf_tr_rif_label, text="RIF: 001-A-013-9-C0F-B-555", value = NONE
+       hf_tr_rif_ring,  hidden, value=0x001
+       hf_tr_rif_bridge, hidden, value=0xA
+       hf_tr_rif_ring,  hidden, value=0x013
+       hf_tr_rif_bridge, hidden, value=0x9
+       hf_tr_rif_ring,  hidden, value=0xC0F
+       hf_tr_rif_bridge, hidden, value=0xB
+       hf_tr_rif_ring,  hidden, value=0x555
+
+GUI or print code will not display the hidden fields, but a display
+filter or "packet grep" routine will still see the values. The possible
+filter is then possible:
+
+       tr.rif_ring eq 0x013
+
+The fourth function, proto_tree_add_text(), is used to add a label to the GUI tree.
+It will contain no value, so it is not searchable in the display filter process.
+This function was needed in the transition from the old-style proto_tree to this
+new-style proto_tree so that ethereal would still decode all protocols w/o being
+able to filter on all protocols and fields. Otherwise we would have had to
+cripple ethereal's functionality while we converted all the old-style proto_tree
+calls to the new-style proto_tree calls.
+
index 50994f566d6420b2499eced38cbb3e836c4ece5f..3f6a2f4183a7c4df4ed4b035f1598d21a8943fd6 100644 (file)
@@ -1,6 +1,6 @@
 /* ethereal.c
  *
- * $Id: ethereal.c,v 1.47 1999/07/07 00:34:57 guy Exp $
+ * $Id: ethereal.c,v 1.48 1999/07/07 22:51:37 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -86,6 +86,7 @@
 #include "follow.h"
 #include "util.h"
 #include "gtkpacket.h"
+#include "dfilter.h"
 
 static void file_save_ok_cb(GtkWidget *w, GtkFileSelection *fs);
 static void file_save_as_ok_cb(GtkWidget *w, GtkFileSelection *fs);
@@ -93,6 +94,7 @@ static void file_save_as_ok_cb(GtkWidget *w, GtkFileSelection *fs);
 FILE        *data_out_file = NULL;
 packet_info  pi;
 capture_file cf;
+proto_tree     *protocol_tree = NULL;
 GtkWidget   *file_sel, *packet_list, *tree_view, *byte_view, *prog_bar,
             *info_bar;
 GdkFont     *m_r_font, *m_b_font;
@@ -303,14 +305,7 @@ follow_stream_cb( GtkWidget *w, gpointer data ) {
 void
 match_selected_cb(GtkWidget *w, gpointer data)
 {
-#ifndef WITH_WIRETAP
-    int i;
-    unsigned char *c;
-#endif
     char *buf = malloc(1024);
-#ifndef WITH_WIRETAP
-    char *ptr;
-#endif
     GtkWidget *filter_te = NULL;
 
     if (w)
@@ -323,12 +318,7 @@ match_selected_cb(GtkWidget *w, gpointer data)
                      "view to be matched.");
        return;
     }
-
-#ifdef WITH_WIRETAP
-    simple_dialog(ESD_TYPE_WARN, NULL,
-                 "This functionality currently unsupported with Wiretap");
-    return;
-#else
+#if 0
     switch (cf.lnk_t) {
     case DLT_EN10MB :
        c="ether";
@@ -337,10 +327,12 @@ match_selected_cb(GtkWidget *w, gpointer data)
        c="fddi";
        break;
     default :
+#endif
        simple_dialog(ESD_TYPE_WARN, NULL,
                      "Unsupported frame type format. Only Ethernet and FDDI\n"
                      "frame formats are supported.");
        return;
+#if 0
     }
 
     sprintf(buf, "("); ptr = buf+strlen(buf);
@@ -364,7 +356,6 @@ match_selected_cb(GtkWidget *w, gpointer data)
     }
 
     sprintf(ptr, "))");
-#endif
 
     if( cf.dfilter != NULL ) {
       /* get rid of this one */
@@ -382,6 +373,7 @@ match_selected_cb(GtkWidget *w, gpointer data)
       g_free( cf.dfilter );
       cf.dfilter = NULL;
     }
+#endif
 }
 
 /* Open a file */
@@ -549,28 +541,30 @@ file_print_cmd_cb(GtkWidget *widget, gpointer data) {
 /* What to do when a list item is selected/unselected */
 void
 packet_list_select_cb(GtkWidget *w, gint row, gint col, gpointer evt) {
-  GList      *l;
 
   if (!sync_mode) {
-#ifdef WITH_WIRETAP
   if (cf.wth) return; 
-#else
-  if (cf.pfh) return;
-#endif
   }
   blank_packetinfo();
   gtk_text_freeze(GTK_TEXT(byte_view));
   gtk_text_set_point(GTK_TEXT(byte_view), 0);
   gtk_text_forward_delete(GTK_TEXT(byte_view),
-    gtk_text_get_length(GTK_TEXT(byte_view)));
-  l = g_list_nth(cf.plist, row);
-  if (l) {
-    fd = (frame_data *) l->data;
-    fseek(cf.fh, fd->file_off, SEEK_SET);
-    fread(cf.pd, sizeof(guint8), fd->cap_len, cf.fh);
-    dissect_packet(cf.pd, fd, (proto_tree*)tree_view);
-    packet_hex_print(GTK_TEXT(byte_view), cf.pd, fd->cap_len, -1, -1);
-  }
+  gtk_text_get_length(GTK_TEXT(byte_view)));
+
+  /* get the frame data struct pointer for this frame */
+  fd = (frame_data *) gtk_clist_get_row_data(GTK_CLIST(w), row);
+  fseek(cf.fh, fd->file_off, SEEK_SET);
+  fread(cf.pd, sizeof(guint8), fd->cap_len, cf.fh);
+
+  /* create the logical protocol tree */
+  if (protocol_tree)
+      proto_tree_free(protocol_tree);
+  protocol_tree = proto_tree_create_root();
+  dissect_packet(cf.pd, fd, protocol_tree);
+
+  /* display the GUI protocol tree and hex dump */
+  proto_tree_draw(protocol_tree, tree_view);
+  packet_hex_print(GTK_TEXT(byte_view), cf.pd, fd->cap_len, -1, -1);
   gtk_text_thaw(GTK_TEXT(byte_view));
 }
 
@@ -642,11 +636,12 @@ sigusr2_handler(int sig) {
   signal(SIGUSR2, sigusr2_handler);
 }
 
+/* call initialization routines at program startup time */
 static void
 ethereal_proto_init(void) {
-
+  proto_init();
   init_dissect_udp();
-
+  dfilter_init();
 }
 
 static void 
@@ -703,14 +698,11 @@ main(int argc, char *argv[])
     
   /* Initialize the capture file struct */
   cf.plist             = NULL;
-#ifdef WITH_WIRETAP
   cf.wth               = NULL;
-#else
-  cf.pfh               = NULL;
-#endif
   cf.fh                        = NULL;
   cf.dfilter           = NULL;
   cf.cfilter           = NULL;
+  cf.dfcode            = NULL;
   cf.iface             = NULL;
   cf.save_file         = NULL;
   cf.user_saved                = 0;
@@ -725,16 +717,12 @@ main(int argc, char *argv[])
   /* Assemble the compile-time options */
   snprintf(comp_info_str, 256,
 #ifdef GTK_MAJOR_VERSION
-    "GTK+ %d.%d.%d and %s", GTK_MAJOR_VERSION, GTK_MINOR_VERSION,
-    GTK_MICRO_VERSION,
-#else
-    "GTK+ (version unknown) and %s",
-#endif
-#ifdef WITH_WIRETAP
-    "wiretap");
+    "GTK+ %d.%d.%d", GTK_MAJOR_VERSION, GTK_MINOR_VERSION,
+    GTK_MICRO_VERSION
 #else
-    "libpcap");
+    "GTK+ (version unknown)"
 #endif
+   );
 
   /* Now get our args */
   while ((opt = getopt(argc, argv, "b:B:c:f:Fhi:km:nP:Qr:Ss:t:T:w:v")) != EOF) {
index e9ad98e2f048e64725ba6f85695bc29f5afba99f..a7455fc5e683c2b97c95a29992aba82acf05ad33 100644 (file)
@@ -2,7 +2,7 @@
  * Routines for calling the right protocol for the ethertype.
  * This is called by both packet-eth.c (Ethernet II) and packet-llc.c (SNAP)
  *
- * $Id: ethertype.c,v 1.15 1999/06/22 22:02:11 gram Exp $
+ * $Id: ethertype.c,v 1.16 1999/07/07 22:51:38 gram Exp $
  *
  * Gilbert Ramirez <gram@verdict.uthscsa.edu>
  *
 #include "packet.h"
 #include "etypes.h"
 
-gchar *
-ethertype_to_str(guint16 etype, const char *fmt)
-{
-  static const value_string etype_vals[] = {
+const value_string etype_vals[] = {
     {ETHERTYPE_IP,     "IP"             },
     {ETHERTYPE_IPv6,   "IPv6"           },
     {ETHERTYPE_ARP,    "ARP"            },
@@ -53,13 +50,10 @@ ethertype_to_str(guint16 etype, const char *fmt)
     {ETHERTYPE_CDP,    "CDP"            }, /* Cisco Discovery Protocol */
     {ETHERTYPE_TRAIN,   "Netmon Train"  },
     {ETHERTYPE_LOOP,   "Loopback"       }, /* Ethernet Loopback */
-               {ETHERTYPE_PPPOED, "PPPoE Discovery"}, 
-               {ETHERTYPE_PPPOES, "PPPoE Session"  }, 
+    {ETHERTYPE_PPPOED, "PPPoE Discovery"}, 
+    {ETHERTYPE_PPPOES, "PPPoE Session"  }, 
     {0,                 NULL            } };
 
-    return val_to_str(etype, etype_vals, fmt);
-}
-
 void
 capture_ethertype(guint16 etype, int offset,
                const u_char *pd, guint32 cap_len, packet_counts *ld)
@@ -77,11 +71,10 @@ capture_ethertype(guint16 etype, int offset,
 void
 ethertype(guint16 etype, int offset,
                const u_char *pd, frame_data *fd, proto_tree *tree, proto_tree
-               *fh_tree)
+               *fh_tree, int item_id)
 {
   if (tree) {
-    proto_tree_add_item(fh_tree, offset - 2, 2, "Type: %s (0x%04x)",
-      ethertype_to_str(etype, "Unknown"), etype);
+       proto_tree_add_item(fh_tree, item_id, offset - 2, 2, etype);
   }
   switch (etype) {
     case ETHERTYPE_IP:
@@ -115,12 +108,12 @@ ethertype(guint16 etype, int offset,
       dissect_data(pd, offset, fd, tree);
       if (check_col(fd, COL_PROTOCOL)) { col_add_fstr(fd, COL_PROTOCOL, "LOOP"); }
       break;
-               case ETHERTYPE_PPPOED:
-                       dissect_pppoed(pd, offset, fd, tree);
-                       break;
-               case ETHERTYPE_PPPOES:
-                       dissect_pppoes(pd, offset, fd, tree);
-                       break;
+    case ETHERTYPE_PPPOED:
+      dissect_pppoed(pd, offset, fd, tree);
+      break;
+    case ETHERTYPE_PPPOES:
+      dissect_pppoes(pd, offset, fd, tree);
+      break;
     default:
       dissect_data(pd, offset, fd, tree);
       if (check_col(fd, COL_PROTOCOL)) { col_add_fstr(fd, COL_PROTOCOL, "0x%04x", etype); }
diff --git a/file.c b/file.c
index 24670409c5eb951331bfacdb958c3cf309ff6879..5ccd43d3aa86a1b9ac93b11f58051ab50845cc5f 100644 (file)
--- a/file.c
+++ b/file.c
@@ -1,7 +1,7 @@
 /* file.c
  * File I/O routines
  *
- * $Id: file.c,v 1.33 1999/06/22 22:02:11 gram Exp $
+ * $Id: file.c,v 1.34 1999/07/07 22:51:38 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -29,9 +29,7 @@
 
 #include <gtk/gtk.h>
 
-#ifdef WITH_WIRETAP
 #include <pcap.h>
-#endif
 
 #include <stdio.h>
 #include <unistd.h>
@@ -67,6 +65,7 @@
 #include "packet.h"
 #include "file.h"
 #include "util.h"
+#include "dfilter.h"
 
 #include "packet-ncp.h"
 
@@ -83,13 +82,11 @@ guint cap_input_id, tail_timeout_id;
 static guint32 firstsec, firstusec;
 static guint32 lastsec, lastusec;
 
-#ifdef WITH_WIRETAP
+/* Used when applying a display filter */
+static proto_tree *dfilter_proto_tree = NULL;
+
 static void wtap_dispatch_cb(u_char *, const struct wtap_pkthdr *, int,
     const u_char *);
-#else
-static void pcap_dispatch_cb(u_char *, const struct pcap_pkthdr *,
-    const u_char *);
-#endif
 
 static void init_col_widths(capture_file *);
 static void set_col_widths(capture_file *);
@@ -98,10 +95,6 @@ static gint tail_timeout_cb(gpointer);
 
 int
 open_cap_file(char *fname, capture_file *cf) {
-#ifndef WITH_WIRETAP
-  guint32     magic[2];
-  char        err_str[PCAP_ERRBUF_SIZE];
-#endif
   struct stat cf_stat;
 
   /* First, make sure the file is valid */
@@ -117,24 +110,13 @@ open_cap_file(char *fname, capture_file *cf) {
 
   fseek(cf->fh, 0L, SEEK_END);
   cf->f_len = ftell(cf->fh);
-#ifndef WITH_WIRETAP
-  fseek(cf->fh, 0L, SEEK_SET);
-  fread(magic, sizeof(guint32), 2, cf->fh);
-  fseek(cf->fh, 0L, SEEK_SET);
-#endif
   fclose(cf->fh);
   cf->fh = NULL;
   /* set the file name beacuse we need it to set the follow stream filter */
   cf->filename = g_strdup( fname );
 
   /* Next, find out what type of file we're dealing with */
-#ifdef WITH_WIRETAP 
   cf->cd_t  = WTAP_FILE_UNKNOWN;
-#else
-  cf->cd_t  = CD_UNKNOWN;
-  cf->lnk_t = DLT_NULL;
-  cf->swap  = 0;
-#endif
   cf->count = 0;
   cf->drops = 0;
   cf->esec  = 0;
@@ -143,16 +125,8 @@ open_cap_file(char *fname, capture_file *cf) {
   firstsec = 0, firstusec = 0;
   lastsec = 0, lastusec = 0;
  
-#ifndef WITH_WIRETAP
-  if (magic[0] == PCAP_MAGIC || magic[0] == SWAP32(PCAP_MAGIC)) {
-
-    /* Pcap/Tcpdump file */
-    cf->pfh = pcap_open_offline(fname, err_str);
-    if (cf->pfh == NULL) {
-#else
        cf->wth = wtap_open_offline(fname);
        if (cf->wth == NULL) {
-#endif
 
       /* XXX - we assume that, because we were able to open it above,
          this must have failed because it's not a capture file in
@@ -160,47 +134,16 @@ open_cap_file(char *fname, capture_file *cf) {
       return (OPEN_CAP_FILE_UNKNOWN_FORMAT);
     }
 
-#ifndef WITH_WIRETAP
     if (cf->dfilter) {
-      if (pcap_compile(cf->pfh, &cf->fcode, cf->dfilter, 1, 0) < 0) {
+       dfilter_compile(cf->dfilter, &cf->dfcode);
+/*      if (wtap_offline_filter(cf->wth, cf->dfilter) < 0) {
         simple_dialog(ESD_TYPE_WARN, NULL, "Unable to parse filter string "
           "\"%s\".", cf->dfilter);
-      } else if (pcap_setfilter(cf->pfh, &cf->fcode) < 0) {
-        simple_dialog(ESD_TYPE_WARN, NULL, "Can't install filter.");
-      }
-    }
-
-    cf->fh   = pcap_file(cf->pfh);
-    cf->swap = pcap_is_swapped(cf->pfh);    
-    if ((cf->swap && BYTE_ORDER == BIG_ENDIAN) ||
-      (!cf->swap && BYTE_ORDER == LITTLE_ENDIAN)) {
-      /* Data is big-endian */
-      cf->cd_t = CD_PCAP_BE;
-    } else {
-      cf->cd_t = CD_PCAP_LE;
-    }
-    cf->vers  = ( ((pcap_major_version(cf->pfh) & 0x0000ffff) << 16) |
-                  pcap_minor_version(cf->pfh) );
-    cf->snap  = pcap_snapshot(cf->pfh);
-    cf->lnk_t = pcap_datalink(cf->pfh);
-  } else if (ntohl(magic[0]) == SNOOP_MAGIC_1 && ntohl(magic[1]) == SNOOP_MAGIC_2) {
-    return (OPEN_CAP_FILE_UNKNOWN_FORMAT);
-  }
-  
-  if (cf->cd_t == CD_UNKNOWN)
-    return (OPEN_CAP_FILE_UNKNOWN_FORMAT);
-#else
-    if (cf->dfilter) {
-      if (wtap_offline_filter(cf->wth, cf->dfilter) < 0) {
-        simple_dialog(ESD_TYPE_WARN, NULL, "Unable to parse filter string "
-          "\"%s\".", cf->dfilter);
-      }
+      }*/
     }
   cf->fh = wtap_file(cf->wth);
   cf->cd_t = wtap_file_type(cf->wth);
   cf->snap = wtap_snapshot_length(cf->wth);
-#endif
-
   return (0);
 }
 
@@ -217,17 +160,10 @@ close_cap_file(capture_file *cf, void *w, guint context) {
     fclose(cf->fh);
     cf->fh = NULL;
   }
-#ifdef WITH_WIRETAP
   if (cf->wth) {
     wtap_close(cf->wth);
     cf->wth = NULL;
   }
-#else
-  if (cf->pfh) {
-    pcap_close(cf->pfh);
-    cf->pfh = NULL;
-  }
-#endif
   if (cf->plist) {
     g_list_foreach(cf->plist, free_packets_cb, NULL);
     g_list_free(cf->plist);
@@ -258,7 +194,7 @@ load_cap_file(char *fname, capture_file *cf) {
 
   close_cap_file(cf, info_bar, file_ctx);
 
-  /* Initialize protocol-specific variables */
+  /* Initialize protocol-speficic variables */
   ncp_init_protocol();
 
   if ((name_ptr = (gchar *) strrchr(fname, '/')) == NULL)
@@ -272,22 +208,15 @@ load_cap_file(char *fname, capture_file *cf) {
   timeout = gtk_timeout_add(250, file_progress_cb, (gpointer) &cf);
   
   err = open_cap_file(fname, cf);
-#ifdef WITH_WIRETAP
   if ((err == 0) && (cf->cd_t != WTAP_FILE_UNKNOWN)) {
-#else
-  if ((err == 0) && (cf->cd_t != CD_UNKNOWN)) {
-#endif
+
+    if (dfilter_proto_tree)
+
     gtk_clist_freeze(GTK_CLIST(packet_list));
     init_col_widths(cf);
-#ifdef WITH_WIRETAP
     wtap_loop(cf->wth, 0, wtap_dispatch_cb, (u_char *) cf);
     wtap_close(cf->wth);
     cf->wth = NULL;
-#else
-    pcap_loop(cf->pfh, 0, pcap_dispatch_cb, (u_char *) cf);
-    pcap_close(cf->pfh);
-    cf->pfh = NULL;
-#endif
     cf->fh = fopen(fname, "r");
 
     set_col_widths(cf);
@@ -360,22 +289,13 @@ cap_file_input_cb (gpointer data, gint source, GdkInputCondition condition) {
     /* process data until end of file and stop capture (restore menu items) */
     gtk_clist_freeze(GTK_CLIST(packet_list));
     init_col_widths(cf);
-#ifdef WITH_WIRETAP
     wtap_loop(cf->wth, 0, wtap_dispatch_cb, (u_char *) cf);      
-#else
-    pcap_loop(cf->pfh, 0, pcap_dispatch_cb, (u_char *) cf);
-#endif
 
     set_col_widths(cf);
     gtk_clist_thaw(GTK_CLIST(packet_list));
 
-#ifdef WITH_WIRETAP
     wtap_close(cf->wth);
     cf->wth = NULL;
-#else
-    pcap_close(cf->pfh);
-    cf->pfh = NULL;
-#endif
 #ifdef USE_ITEM
     set_menu_sensitivity("/File/Open...", TRUE);
     set_menu_sensitivity("/File/Close", TRUE);
@@ -400,11 +320,7 @@ cap_file_input_cb (gpointer data, gint source, GdkInputCondition condition) {
 
   gtk_clist_freeze(GTK_CLIST(packet_list));
   init_col_widths(cf);
-#ifdef WITH_WIRETAP
   wtap_loop(cf->wth, 0, wtap_dispatch_cb, (u_char *) cf);      
-#else
-  pcap_loop(cf->pfh, 0, pcap_dispatch_cb, (u_char *) cf);
-#endif
 
   set_col_widths(cf);
   gtk_clist_thaw(GTK_CLIST(packet_list));
@@ -432,11 +348,7 @@ tail_timeout_cb(gpointer data) {
 
   gtk_clist_freeze(GTK_CLIST(packet_list));
   init_col_widths(cf);
-#ifdef WITH_WIRETAP
   wtap_loop(cf->wth, 0, wtap_dispatch_cb, (u_char *) cf);      
-#else
-  pcap_loop(cf->pfh, 0, pcap_dispatch_cb, (u_char *) cf);
-#endif
 
   set_col_widths(cf);
   gtk_clist_thaw(GTK_CLIST(packet_list));
@@ -459,13 +371,9 @@ tail_cap_file(char *fname, capture_file *cf) {
 
   /* Initialize protocol-speficic variables */
   ncp_init_protocol();
-  
+
   err = open_cap_file(fname, cf);
-#ifdef WITH_WIRETAP
   if ((err == 0) && (cf->cd_t != WTAP_FILE_UNKNOWN)) {
-#else
-  if ((err == 0) && (cf->cd_t != CD_UNKNOWN)) {
-#endif
 
 #ifdef USE_ITEM
     set_menu_sensitivity("/File/Open...", FALSE);
@@ -593,7 +501,7 @@ change_time_format_in_packet_list(frame_data *fdata, capture_file *cf)
 static void
 add_packet_to_packet_list(frame_data *fdata, capture_file *cf, const u_char *buf)
 {
-  gint          i, row, col_width;
+  gint          i, col_width, row;
 
   compute_time_stamps(fdata, cf);
 
@@ -609,19 +517,19 @@ add_packet_to_packet_list(frame_data *fdata, capture_file *cf, const u_char *buf
     if (col_width > fdata->cinfo->col_width[i])
       fdata->cinfo->col_width[i] = col_width;
   }
-  row = gtk_clist_append(GTK_CLIST(packet_list), fdata->cinfo->col_data);
+  if (fdata->passed_dfilter) {
+       row = gtk_clist_append(GTK_CLIST(packet_list), fdata->cinfo->col_data);
+       gtk_clist_set_row_data(GTK_CLIST(packet_list), row, fdata);
+  }
   fdata->cinfo = NULL;
 }
 
 static void
-#ifdef WITH_WIRETAP
 wtap_dispatch_cb(u_char *user, const struct wtap_pkthdr *phdr, int offset,
-#else
-pcap_dispatch_cb(u_char *user, const struct pcap_pkthdr *phdr,
-#endif
   const u_char *buf) {
   frame_data   *fdata;
   capture_file *cf = (capture_file *) user;
+  proto_tree *protocol_tree = NULL;
 
   while (gtk_events_pending())
     gtk_main_iteration();
@@ -635,60 +543,23 @@ pcap_dispatch_cb(u_char *user, const struct pcap_pkthdr *phdr,
 
   fdata->pkt_len  = phdr->len;
   fdata->cap_len  = phdr->caplen;
-#ifdef WITH_WIRETAP
   fdata->file_off = offset;
   fdata->lnk_t = phdr->pkt_encap;
-#else
-  fdata->file_off = ftell(pcap_file(cf->pfh)) - phdr->caplen;
-#endif
   fdata->abs_secs  = phdr->ts.tv_sec;
   fdata->abs_usecs = phdr->ts.tv_usec;
+  fdata->cinfo = NULL;
 
-  add_packet_to_packet_list(fdata, cf, buf);
-}
-
-static void
-filter_packets_cb(gpointer data, gpointer user_data)
-{
-  frame_data *fd = data;
-  capture_file *cf = user_data;
-
-  cf->cur = fd;
-  cf->count++;
-
-  fseek(cf->fh, fd->file_off, SEEK_SET);
-  fread(cf->pd, sizeof(guint8), fd->cap_len, cf->fh);
-
-  add_packet_to_packet_list(fd, cf, cf->pd);
-}
-
-void
-filter_packets(capture_file *cf)
-{
-  /* Freeze the packet list while we redo it, so we don't get any
-     screen updates while it happens. */
-  gtk_clist_freeze(GTK_CLIST(packet_list));
-
-  /* Clear it out. */
-  gtk_clist_clear(GTK_CLIST(packet_list));
-
-  /*
-   * Iterate through the list of packets, calling a routine
-   * to run the filter on the packet, see if it matches, and
-   * put it in the display list if so.
-   *
-   * XXX - we don't yet have anything to run a filter on a packet;
-   * this code awaits the arrival of display filter code.
-   */
-  firstsec = 0;
-  firstusec = 0;
-  lastsec = 0;
-  lastusec = 0;
-  cf->count = 0;
-  g_list_foreach(cf->plist, filter_packets_cb, cf);
+  /* Apply the display filter */
+  if (cf->dfcode) {
+       protocol_tree = proto_tree_create_root();
+       dissect_packet(buf, fdata, protocol_tree);
+       fdata->passed_dfilter = dfilter_apply(cf->dfcode, protocol_tree, buf);
+  }
+  else {
+       fdata->passed_dfilter = TRUE;
+  }
 
-  /* Unfreeze the packet list. */
-  gtk_clist_thaw(GTK_CLIST(packet_list));
+  add_packet_to_packet_list(fdata, cf, buf);
 }
 
 static void
diff --git a/file.h b/file.h
index 1da016cc402f339675ebbb9027e53bac7f10e24d..9662204a21a88638a787957ce559be5b170eb525 100644 (file)
--- a/file.h
+++ b/file.h
@@ -1,7 +1,7 @@
 /* file.h
  * Definitions for file structures and routines
  *
- * $Id: file.h,v 1.17 1999/06/22 22:02:12 gram Exp $
+ * $Id: file.h,v 1.18 1999/07/07 22:51:39 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
 #include <sys/types.h>
 #include <sys/time.h>
 
-#ifdef WITH_WIRETAP
- #include <wtap.h>
- #include <pcap.h>
-#else
- #include <pcap.h>
-
-  /* Data file formats */
-  #define CD_UNKNOWN    0
-  #define CD_WIRE       1
-  #define CD_SNOOP      2
-  #define CD_PCAP_BE    3
-  #define CD_PCAP_LE    4
-  #define CD_NA_UNCOMPR 5
-
-  /* Data file magic info */
-  #define SNOOP_MAGIC_1 0x736e6f6f /* 'snoop' in ASCII */
-  #define SNOOP_MAGIC_2 0x70000000
-  #define PCAP_MAGIC    0xa1b2c3d4
-
-  /* Data file format versions we can handle */
-  #define SNOOP_MIN_VERSION 2
-  #define SNOOP_MAX_VERSION 2
-
-  /* Link types (removed in favor of the DLT_* defines from bpf.h */
-#endif
+#include <wtap.h>
+#include <pcap.h>
 
 typedef struct bpf_program bpf_prog;
 
@@ -61,14 +38,8 @@ typedef struct _capture_file {
   FILE       *fh;        /* Capture file */
   gchar      *filename;  /* filename */
   long        f_len;     /* File length */
-#ifndef WITH_WIRETAP
-  int         swap;      /* Swap data bytes? */
-#endif
   guint16     cd_t;      /* Capture data type */
   guint32     vers;      /* Version.  For tcpdump minor is appended to major */
-#ifndef WITH_WIRETAP
-  guint32     lnk_t;     /* Network link type */
-#endif
   guint32     count;     /* Packet count */
   guint32     drops;     /* Dropped packets */
   guint32     esec;      /* Elapsed seconds */
@@ -77,14 +48,11 @@ typedef struct _capture_file {
   gchar      *iface;     /* Interface */
   gchar      *save_file; /* File that user saved capture to */
   gint        user_saved;/* Was capture file saved by user yet? */
-#ifdef WITH_WIRETAP
-  wtap     *wth;         /* Wiretap session */
-#else
-  pcap_t     *pfh;       /* Pcap session */
-#endif
+  wtap       *wth;       /* Wiretap session */
   gchar      *dfilter;   /* Display filter string */
   gchar      *cfilter;   /* Capture filter string */
-  bpf_prog    fcode;     /* Compiled filter program */
+  bpf_prog    fcode;     /* Compiled capture filter program */
+  GNode      *dfcode;    /* Compiled display filter program */ 
   /* XXX - I'm cheating for now. I'll hardcode 65536 here until I re-arrange
    * more header files so that ethereal.h is split up into two files, a
    * generic header and a gtk+-speficic header (or the gtk+ definitions are
@@ -97,25 +65,6 @@ typedef struct _capture_file {
   column_info  cinfo;    /* Column formatting information */
 } capture_file;
 
-/* Taken from RFC 1761 */
-
-#ifndef WITH_WIRETAP
-typedef struct _snoop_file_hdr {
-  guint32 magic1;
-  guint32 magic2;
-  guint32 vers;
-  guint32 s_lnk_t;
-} snoop_file_hdr;
-
-typedef struct _snoop_frame_hdr {
-  guint32 orig_len;
-  guint32 inc_len;
-  guint32 pr_len;
-  guint32 drops;
-  guint32 secs;
-  guint32 usecs;
-} snoop_frame_hdr;
-#endif
 
 /*
  * "open_cap_file()" can return:
index 006b62dd2a4b18d1202d60b1590b5b143f7608d5..cce5ffafca2c1a4b6e6e448e0ccf8fc871956b2e 100644 (file)
--- a/follow.c
+++ b/follow.c
@@ -1,6 +1,6 @@
 /* follow.c
  *
- * $Id: follow.c,v 1.9 1999/07/07 01:41:15 guy Exp $
+ * $Id: follow.c,v 1.10 1999/07/07 22:51:39 gram Exp $
  *
  * Copyright 1998 Mike Hall <mlh@io.com>
  *
@@ -39,6 +39,7 @@
 # include <sys/types.h>
 #endif
 
+#include <glib.h>
 #include "ethereal.h"
 #include "packet.h"
 #include "follow.h"
index 35b3c3413006a735471506fd83769be10e5833c6..2b81e5d6d7498fb7c1409b46a86b1cb446972a5a 100644 (file)
@@ -1,7 +1,7 @@
 /* gtkpacket.c
  * Routines for GTK+ packet display
  *
- * $Id: gtkpacket.c,v 1.5 1999/05/01 05:39:06 gram Exp $
+ * $Id: gtkpacket.c,v 1.6 1999/07/07 22:51:39 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -54,6 +54,9 @@
 extern GtkWidget    *byte_view;
 extern GdkFont      *m_r_font, *m_b_font;
 
+static void
+proto_tree_draw_node(GNode *node, gpointer data);
+
 void
 packet_hex_print(GtkText *bv, guint8 *pd, gint len, gint bstart, gint blen) {
   gint     i = 0, j, k, cur;
@@ -136,49 +139,53 @@ set_item_style(GtkWidget *widget, gpointer dummy)
   gtk_widget_set_style(widget, item_style);
 }
 
-proto_item *
-proto_tree_add_item(proto_tree *tree, gint start, gint len,
-  gchar *format, ...) {
-  GtkWidget *ti;
-  va_list    ap;
-  gchar      label_str[256];
-
-  if (!tree)
-    return(NULL);
-  
-  va_start(ap, format);
-  vsnprintf(label_str, 256, format, ap);
-  ti = gtk_tree_item_new_with_label(label_str);
-  gtk_container_foreach(GTK_CONTAINER(ti), set_item_style, NULL);
-  gtk_object_set_data(GTK_OBJECT(ti), E_TREEINFO_START_KEY, (gpointer) start);
-  gtk_object_set_data(GTK_OBJECT(ti), E_TREEINFO_LEN_KEY, (gpointer) len);
-  gtk_tree_append(GTK_TREE(tree), ti);
-  gtk_widget_show(ti);
-
-  return (proto_item*) ti;
-}
-
 void
-proto_item_set_len(proto_item *ti, gint len)
+proto_tree_draw(proto_tree *protocol_tree, GtkWidget *tree_view)
 {
-  gtk_object_set_data(GTK_OBJECT(ti), E_TREEINFO_LEN_KEY, (gpointer) len);
+       g_node_children_foreach((GNode*) protocol_tree, G_TRAVERSE_ALL,
+               proto_tree_draw_node, tree_view);
 }
 
-void
-proto_item_add_subtree(proto_item *ti, proto_tree *subtree, gint idx) {
-  static gint tree_type[NUM_TREE_TYPES];
-
-  gtk_tree_item_set_subtree(GTK_TREE_ITEM(ti), GTK_WIDGET(subtree));
-  if (tree_type[idx])
-    gtk_tree_item_expand(GTK_TREE_ITEM(ti));
-  gtk_signal_connect(GTK_OBJECT(ti), "expand", (GtkSignalFunc) expand_tree,
-    (gpointer) &tree_type[idx]);
-  gtk_signal_connect(GTK_OBJECT(ti), "collapse", (GtkSignalFunc) collapse_tree,
-    (gpointer) &tree_type[idx]);
-}
-
-proto_tree*
-proto_tree_new(void)
+static void
+proto_tree_draw_node(GNode *node, gpointer data)
 {
-       return (proto_tree*) gtk_tree_new();
+       GtkWidget       *tree_view = (GtkWidget*) data;
+       field_info      *fi = (field_info*) (node->data);
+       GtkWidget       *ti, *subtree;
+       gchar           label_str[ITEM_LABEL_LENGTH];
+       gchar           *label_ptr;
+       static gint     tree_type[NUM_TREE_TYPES];
+
+       if (!fi->visible)
+               return;
+
+       /* was a free format label produced? */
+       if (fi->representation) {
+               label_ptr = fi->representation;
+       }
+       else { /* no, make a generic label */
+               label_ptr = label_str;
+               proto_item_fill_label(fi, label_str);
+       }
+               
+       ti = gtk_tree_item_new_with_label(label_ptr);
+       gtk_container_foreach(GTK_CONTAINER(ti), set_item_style, NULL);
+       gtk_object_set_data(GTK_OBJECT(ti), E_TREEINFO_START_KEY, (gpointer) fi->start);
+       gtk_object_set_data(GTK_OBJECT(ti), E_TREEINFO_LEN_KEY, (gpointer) fi->length);
+       gtk_tree_append(GTK_TREE(tree_view), ti);
+       gtk_widget_show(ti);
+
+       if (g_node_n_children(node) > 0) {
+               subtree = gtk_tree_new();
+               gtk_tree_item_set_subtree(GTK_TREE_ITEM(ti), GTK_WIDGET(subtree));
+               if (tree_type[fi->tree_type])
+                       gtk_tree_item_expand(GTK_TREE_ITEM(ti));
+               gtk_signal_connect(GTK_OBJECT(ti), "expand", (GtkSignalFunc) expand_tree,
+                       (gpointer) &tree_type[fi->tree_type]);
+               gtk_signal_connect(GTK_OBJECT(ti), "collapse", (GtkSignalFunc) collapse_tree,
+                       (gpointer) &tree_type[fi->tree_type]);
+
+               g_node_children_foreach(node, G_TRAVERSE_ALL,
+                       proto_tree_draw_node, subtree);
+       }
 }
index 6ffe649fa7c7ef527405f19cf469a6ce8a1d52cb..3344aa9fe39dc88f9c34701c30dbbab2a89b3991 100644 (file)
@@ -1,7 +1,7 @@
 /* gtkpacket.h
  * Definitions for GTK+ packet display structures and routines
  *
- * $Id: gtkpacket.h,v 1.1 1999/03/23 03:14:35 gram Exp $
+ * $Id: gtkpacket.h,v 1.2 1999/07/07 22:51:39 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -32,4 +32,6 @@ void       packet_hex_print(GtkText *, guint8 *, gint, gint, gint);
 #define E_TREEINFO_START_KEY "tree_info_start"
 #define E_TREEINFO_LEN_KEY   "tree_info_len"
 
+void proto_tree_draw(proto_tree *protocol_tree, GtkWidget *tree_view);
+
 #endif
diff --git a/menu.c b/menu.c
index d908eab9c7f0d7e118bb8df80dcc6393ccd33274..647e57a9e860171e8a868456e0ef0cb459931ba3 100644 (file)
--- a/menu.c
+++ b/menu.c
@@ -1,7 +1,7 @@
 /* menu.c
  * Menu routines
  *
- * $Id: menu.c,v 1.22 1999/06/24 16:25:59 gram Exp $
+ * $Id: menu.c,v 1.23 1999/07/07 22:51:40 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -213,10 +213,9 @@ menus_init(void) {
     set_menu_sensitivity("/Edit/Find", FALSE);
     set_menu_sensitivity("/Tools/Graph", FALSE);
     set_menu_sensitivity("/Tools/Summary", FALSE);
-#ifdef WITH_WIRETAP
+
     set_menu_sensitivity("/Tools/Follow TCP Stream", FALSE);
     set_menu_sensitivity("/Display/Match Selected", FALSE);
-#endif
     
 #else
     factory = gtk_menu_factory_new(GTK_MENU_FACTORY_MENU_BAR);
@@ -235,10 +234,10 @@ menus_init(void) {
     set_menu_sensitivity("<Main>/Edit/Find", FALSE);
     set_menu_sensitivity("<Main>/Tools/Graph", FALSE);
     set_menu_sensitivity("<Main>/Tools/Summary", FALSE);
-#ifdef WITH_WIRETAP
+
     set_menu_sensitivity("<Main>/Tools/Follow TCP Stream", FALSE);
     set_menu_sensitivity("<Main>/Display/Match Selected", FALSE);
-#endif
+
     if ((mp = gtk_menu_factory_find(factory, "<Main>/Help")) != NULL) {
       gtk_menu_item_right_justify((GtkMenuItem *) mp->widget);
     }
index ba53ade473fe880a66eb5f04eedbc242b1edfe37..053ab0b3ba3472cd4f9f50017133e6fd60bfe99c 100644 (file)
@@ -96,29 +96,28 @@ dissect_aarp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
   
   if (tree) {
     if ((op_str = match_strval(ea.op, op_vals)))
-      ti = proto_tree_add_item(tree, offset, 28, op_str);
+      ti = proto_tree_add_text(tree, offset, 28, op_str);
     else
-      ti = proto_tree_add_item(tree, offset, 28,
+      ti = proto_tree_add_text(tree, offset, 28,
         "Unknown AARP (opcode 0x%04x)", ea.op);
-    aarp_tree = proto_tree_new();
-    proto_item_add_subtree(ti, aarp_tree, ETT_AARP);
-    proto_tree_add_item(aarp_tree, offset,      2,
+    aarp_tree = proto_item_add_subtree(ti, ETT_AARP);
+    proto_tree_add_text(aarp_tree, offset,      2,
       "Hardware type: 0x%04x", ea.htype);
-    proto_tree_add_item(aarp_tree, offset +  2, 2,
+    proto_tree_add_text(aarp_tree, offset +  2, 2,
       "Protocol type: 0x%04x", ea.ptype);
-    proto_tree_add_item(aarp_tree, offset +  4, 1,
+    proto_tree_add_text(aarp_tree, offset +  4, 1,
       "Hardware size: 0x%02x", ea.halen);
-    proto_tree_add_item(aarp_tree, offset +  5, 1,
+    proto_tree_add_text(aarp_tree, offset +  5, 1,
       "Protocol size: 0x%02x", ea.palen);
-    proto_tree_add_item(aarp_tree, offset +  6, 2,
+    proto_tree_add_text(aarp_tree, offset +  6, 2,
       "Opcode: 0x%04x (%s)", ea.op, op_str ? op_str : "Unknown");
-    proto_tree_add_item(aarp_tree, offset +  8, 6,
+    proto_tree_add_text(aarp_tree, offset +  8, 6,
       "Sender ether: %s", ether_to_str((guint8 *) ea.hsaddr));
-    proto_tree_add_item(aarp_tree, offset + 14, 4,
+    proto_tree_add_text(aarp_tree, offset + 14, 4,
       "Sender ID: %s", atalkid_to_str((guint8 *) ea.psaddr));
-    proto_tree_add_item(aarp_tree, offset + 18, 6,
+    proto_tree_add_text(aarp_tree, offset + 18, 6,
       "Target ether: %s", ether_to_str((guint8 *) ea.hdaddr));
-    proto_tree_add_item(aarp_tree, offset + 24, 4,
+    proto_tree_add_text(aarp_tree, offset + 24, 4,
       "Target ID: %s", atalkid_to_str((guint8 *) ea.pdaddr));
   }
 
index 18f79261ef817d5e3e27e801fad3c136526aa06f..b3ddf2149dec2b35f97dc1103008c9d6825e7f49 100644 (file)
@@ -1,7 +1,7 @@
 /* packet-arp.c
  * Routines for ARP packet disassembly
  *
- * $Id: packet-arp.c,v 1.13 1999/05/11 08:21:39 guy Exp $
+ * $Id: packet-arp.c,v 1.14 1999/07/07 22:51:40 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -216,30 +216,29 @@ dissect_arp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
 
   if (tree) {
     if ((op_str = match_strval(ar_op, op_vals)))
-      ti = proto_tree_add_item(tree, offset, 8 + 2*ar_hln + 2*ar_pln,
+      ti = proto_tree_add_text(tree, offset, 8 + 2*ar_hln + 2*ar_pln,
         op_str);
     else
-      ti = proto_tree_add_item(tree, offset, 8 + 2*ar_hln + 2*ar_pln,
+      ti = proto_tree_add_text(tree, offset, 8 + 2*ar_hln + 2*ar_pln,
         "Unknown ARP (opcode 0x%04x)", ar_op);
-    arp_tree = proto_tree_new();
-    proto_item_add_subtree(ti, arp_tree, ETT_ARP);
-    proto_tree_add_item(arp_tree, offset + AR_HRD, 2,
+    arp_tree = proto_item_add_subtree(ti, ETT_ARP);
+    proto_tree_add_text(arp_tree, offset + AR_HRD, 2,
       "Hardware type: %s", arphrdtype_to_str(ar_hrd, "Unknown (0x%04x)"));
-    proto_tree_add_item(arp_tree, offset + AR_PRO, 2,
-      "Protocol type: %s", ethertype_to_str(ar_pro, "Unknown (0x%04x)"));
-    proto_tree_add_item(arp_tree, offset + AR_HLN, 1,
+    proto_tree_add_text(arp_tree, offset + AR_PRO, 2,
+      "Protocol type: %s", val_to_str(ar_pro, etype_vals, "Unknown (0x%04x)"));
+    proto_tree_add_text(arp_tree, offset + AR_HLN, 1,
       "Hardware size: %d", ar_hln);
-    proto_tree_add_item(arp_tree, offset + AR_PLN, 1,
+    proto_tree_add_text(arp_tree, offset + AR_PLN, 1,
       "Protocol size: %d", ar_pln);
-    proto_tree_add_item(arp_tree, offset + AR_OP,  2,
+    proto_tree_add_text(arp_tree, offset + AR_OP,  2,
       "Opcode: 0x%04x (%s)", ar_op, op_str ? op_str : "Unknown");
-    proto_tree_add_item(arp_tree, sha_offset, ar_hln,
+    proto_tree_add_text(arp_tree, sha_offset, ar_hln,
       "Sender hardware address: %s", sha_str);
-    proto_tree_add_item(arp_tree, spa_offset, ar_pln,
+    proto_tree_add_text(arp_tree, spa_offset, ar_pln,
       "Sender protocol address: %s", spa_str);
-    proto_tree_add_item(arp_tree, tha_offset, ar_hln,
+    proto_tree_add_text(arp_tree, tha_offset, ar_hln,
       "Target hardware address: %s", tha_str);
-    proto_tree_add_item(arp_tree, tpa_offset, ar_pln,
+    proto_tree_add_text(arp_tree, tpa_offset, ar_pln,
       "Target protocol address: %s", tpa_str);
   }
 }
index fbc4527d811887a2612ba18c36bb08e4177a5597..726d91cde4a3c4c374fdf52873cecc71978d369f 100644 (file)
@@ -91,19 +91,18 @@ dissect_ddp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
       val_to_str(ddp.type, op_vals, "Unknown DDP protocol (%02x)"));
   
   if (tree) {
-    ti = proto_tree_add_item(tree, offset, 13, "Datagram Delivery Protocol");
-    ddp_tree = proto_tree_new();
-    proto_item_add_subtree(ti, ddp_tree, ETT_IP);
-    proto_tree_add_item(ddp_tree, offset,      1, "Hop count: %d", ddp_hops(ddp.hops_len));
-    proto_tree_add_item(ddp_tree, offset,          2, "Datagram length: %d", ddp_len(ddp.hops_len));
-    proto_tree_add_item(ddp_tree, offset + 2,  2, "Checksum: %d",ddp.sum);
-    proto_tree_add_item(ddp_tree, offset + 4,  2, "Destination Net: %d",ddp.dnet);
-    proto_tree_add_item(ddp_tree, offset + 6,  2, "Source Net: %d",ddp.snet);
-    proto_tree_add_item(ddp_tree, offset + 8,  1, "Destination Node: %d",ddp.dnode);
-    proto_tree_add_item(ddp_tree, offset + 9,  1, "Source Node: %d",ddp.snode);
-    proto_tree_add_item(ddp_tree, offset + 10, 1, "Destination Socket: %d",ddp.dport);
-    proto_tree_add_item(ddp_tree, offset + 11, 1, "Source Socket: %d",ddp.sport);
-    proto_tree_add_item(ddp_tree, offset + 12, 1, "Type: %d",ddp.type);  
+    ti = proto_tree_add_text(tree, offset, 13, "Datagram Delivery Protocol");
+    ddp_tree = proto_item_add_subtree(ti, ETT_IP);
+    proto_tree_add_text(ddp_tree, offset,      1, "Hop count: %d", ddp_hops(ddp.hops_len));
+    proto_tree_add_text(ddp_tree, offset,          2, "Datagram length: %d", ddp_len(ddp.hops_len));
+    proto_tree_add_text(ddp_tree, offset + 2,  2, "Checksum: %d",ddp.sum);
+    proto_tree_add_text(ddp_tree, offset + 4,  2, "Destination Net: %d",ddp.dnet);
+    proto_tree_add_text(ddp_tree, offset + 6,  2, "Source Net: %d",ddp.snet);
+    proto_tree_add_text(ddp_tree, offset + 8,  1, "Destination Node: %d",ddp.dnode);
+    proto_tree_add_text(ddp_tree, offset + 9,  1, "Source Node: %d",ddp.snode);
+    proto_tree_add_text(ddp_tree, offset + 10, 1, "Destination Socket: %d",ddp.dport);
+    proto_tree_add_text(ddp_tree, offset + 11, 1, "Source Socket: %d",ddp.sport);
+    proto_tree_add_text(ddp_tree, offset + 12, 1, "Type: %d",ddp.type);  
   }
 
   offset += 13;
index c6046b96fbeb992e41afef15762948e46d7f63c5..19fcf4f4dc39916862a5c66257a70c39aae89f4b 100644 (file)
@@ -2,7 +2,7 @@
  * Routines for BOOTP/DHCP packet disassembly
  * Gilbert Ramirez <gram@verdict.uthscsa.edu>
  *
- * $Id: packet-bootp.c,v 1.16 1999/03/23 03:14:35 gram Exp $
+ * $Id: packet-bootp.c,v 1.17 1999/07/07 22:51:40 gram Exp $
  *
  * The information used comes from:
  * RFC 2132: DHCP Options and BOOTP Vendor Extensions
@@ -174,7 +174,7 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff)
                                }
                        }
                        i = i - voff;
-                       proto_tree_add_item(bp_tree, voff, i, "Padding");
+                       proto_tree_add_text(bp_tree, voff, i, "Padding");
                        consumed = i;
                        return consumed;
 
@@ -182,7 +182,7 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff)
                case 21:
                        /* one IP address pair */
                        if (vlen == 8) {
-                               proto_tree_add_item(bp_tree, voff, consumed,
+                               proto_tree_add_text(bp_tree, voff, consumed,
                                        "Option %d: %s = %s/%s", code, text,
                                        ip_to_str((guint8*)&pd[voff+2]),
                                        ip_to_str((guint8*)&pd[voff+6]));
@@ -190,12 +190,11 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff)
                        /* > 1 IP address pair. Let's make a sub-tree */
                        else {
 
-                               vti = proto_tree_add_item(bp_tree, voff,
+                               vti = proto_tree_add_text(bp_tree, voff,
                                        consumed, "Option %d: %s", code, text);
-                               v_tree = proto_tree_new();
-                               proto_item_add_subtree(vti, v_tree, ETT_BOOTP_OPTION);
+                               v_tree = proto_item_add_subtree(vti, ETT_BOOTP_OPTION);
                                for (i = voff + 2; i < voff + consumed; i += 8) {
-                                       proto_tree_add_item(v_tree, i, 8, "IP Address/Mask: %s/%s",
+                                       proto_tree_add_text(v_tree, i, 8, "IP Address/Mask: %s/%s",
                                                ip_to_str((guint8*)&pd[i]),
                                                ip_to_str((guint8*)&pd[i+4]));
                                }
@@ -206,7 +205,7 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff)
                case 33:
                        /* one IP address pair */
                        if (vlen == 8) {
-                               proto_tree_add_item(bp_tree, voff, consumed,
+                               proto_tree_add_text(bp_tree, voff, consumed,
                                        "Option %d: %s = %s/%s", code, text,
                                        ip_to_str((guint8*)&pd[voff+2]),
                                        ip_to_str((guint8*)&pd[voff+6]));
@@ -214,12 +213,11 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff)
                        /* > 1 IP address pair. Let's make a sub-tree */
                        else {
 
-                               vti = proto_tree_add_item(bp_tree, voff,
+                               vti = proto_tree_add_text(bp_tree, voff,
                                        consumed, "Option %d: %s", code, text);
-                               v_tree = proto_tree_new();
-                               proto_item_add_subtree(vti, v_tree, ETT_BOOTP_OPTION);
+                               v_tree = proto_item_add_subtree(vti, ETT_BOOTP_OPTION);
                                for (i = voff + 2; i < voff + consumed; i += 8) {
-                                       proto_tree_add_item(v_tree, i, 8,
+                                       proto_tree_add_text(v_tree, i, 8,
                                                "Destination IP Address/Router: %s/%s",
                                                ip_to_str((guint8*)&pd[i]),
                                                ip_to_str((guint8*)&pd[i+4]));
@@ -229,14 +227,14 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff)
 
                /* Vendor-Specific Info */
                case 43:
-                       proto_tree_add_item(bp_tree, voff, consumed,
+                       proto_tree_add_text(bp_tree, voff, consumed,
                                        "Option %d: %s", code, text);
                        break;
 
                /* NetBIOS-over-TCP/IP Node Type */
                case 46:
                        byte = pd[voff+2];
-                       proto_tree_add_item(bp_tree, voff, consumed,
+                       proto_tree_add_text(bp_tree, voff, consumed,
                                        "Option %d: %s = %s", code, text,
                                        val_to_str(byte, nbnt_vals,
                                            "Unknown (0x%02x)"));
@@ -251,24 +249,23 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff)
                        else {
                                i = 0;
                        }
-                       proto_tree_add_item(bp_tree, voff, 3, "Option %d: %s = DHCP %s",
+                       proto_tree_add_text(bp_tree, voff, 3, "Option %d: %s = DHCP %s",
                                code, text, opt53_text[i]);
                        break;
 
                /* Parameter Request List */
                case 55:
-                       vti = proto_tree_add_item(bp_tree, voff,
+                       vti = proto_tree_add_text(bp_tree, voff,
                                vlen + 2, "Option %d: %s", code, text);
-                       v_tree = proto_tree_new();
-                       proto_item_add_subtree(vti, v_tree, ETT_BOOTP_OPTION);
+                       v_tree = proto_item_add_subtree(vti, ETT_BOOTP_OPTION);
                        for (i = 0; i < vlen; i++) {
                                byte = pd[voff+2+i];
                                if (byte < NUM_OPT_INFOS) {
-                                       proto_tree_add_item(v_tree, voff+2+i, 1, "%d = %s",
+                                       proto_tree_add_text(v_tree, voff+2+i, 1, "%d = %s",
                                                        byte, opt[byte].text);
                                }
                                else {
-                                       proto_tree_add_item(vti, voff+2+i, 1,
+                                       proto_tree_add_text(vti, voff+2+i, 1,
                                                "Unknown Option Code: %d", byte);
                                }
                        }
@@ -280,29 +277,28 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff)
                                guess that the first is the hwtype, and the last 6 are
                                the hw addr */
                        if (vlen == 7) {
-                               vti = proto_tree_add_item(bp_tree, voff,
+                               vti = proto_tree_add_text(bp_tree, voff,
                                        consumed, "Option %d: %s", code, text);
-                               v_tree = proto_tree_new();
-                               proto_item_add_subtree(vti, v_tree, ETT_BOOTP_OPTION);
-                               proto_tree_add_item(v_tree, voff+2, 1,
+                               v_tree = proto_item_add_subtree(vti, ETT_BOOTP_OPTION);
+                               proto_tree_add_text(v_tree, voff+2, 1,
                                        "Hardware type: %s",
                                        arphrdtype_to_str(pd[voff+2],
                                                "Unknown (0x%02x)"));
-                               proto_tree_add_item(v_tree, voff+3, 6,
+                               proto_tree_add_text(v_tree, voff+3, 6,
                                        "Client hardware address: %s",
                                        arphrdaddr_to_str((guint8*)&pd[voff+3],
                                                6, pd[voff+2]));
                        }
                        /* otherwise, it's opaque data */
                        else {
-                               proto_tree_add_item(bp_tree, voff, consumed,
+                               proto_tree_add_text(bp_tree, voff, consumed,
                                        "Option %d: %s (%d bytes)", code, text, vlen);
                        }
                        break;
 
                /* End Option */
                case 255:
-                       proto_tree_add_item(bp_tree, voff, 1, "End Option");
+                       proto_tree_add_text(bp_tree, voff, 1, "End Option");
                        consumed = 1;
                        return consumed;
 
@@ -323,19 +319,18 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff)
                        case ipv4:
                                /* one IP address */
                                if (vlen == 4) {
-                                       proto_tree_add_item(bp_tree, voff, consumed,
+                                       proto_tree_add_text(bp_tree, voff, consumed,
                                                "Option %d: %s = %s", code, text,
                                                ip_to_str((guint8*)&pd[voff+2]));
                                }
                                /* > 1 IP addresses. Let's make a sub-tree */
                                else {
 
-                                       vti = proto_tree_add_item(bp_tree, voff,
+                                       vti = proto_tree_add_text(bp_tree, voff,
                                                consumed, "Option %d: %s", code, text);
-                                       v_tree = proto_tree_new();
-                                       proto_item_add_subtree(vti, v_tree, ETT_BOOTP_OPTION);
+                                       v_tree = proto_item_add_subtree(vti, ETT_BOOTP_OPTION);
                                        for (i = voff + 2; i < voff + consumed; i += 4) {
-                                               proto_tree_add_item(v_tree, i, 4, "IP Address: %s",
+                                               proto_tree_add_text(v_tree, i, 4, "IP Address: %s",
                                                        ip_to_str((guint8*)&pd[i]));
                                        }
                                }
@@ -345,12 +340,12 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff)
                                /* Fix for non null-terminated string supplied by
                                 * John Lines <John.Lines@aeat.co.uk>
                                 */
-                               proto_tree_add_item(bp_tree, voff, consumed,
+                               proto_tree_add_text(bp_tree, voff, consumed,
                                                "Option %d: %s = %.*s", code, text, vlen, &pd[voff+2]);
                                break;
 
                        case opaque:
-                               proto_tree_add_item(bp_tree, voff, consumed,
+                               proto_tree_add_text(bp_tree, voff, consumed,
                                                "Option %d: %s (%d bytes)",
                                                code, text, vlen);
                                break;
@@ -358,43 +353,42 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff)
                        case val_u_short:
                                /* one IP address */
                                if (vlen == 2) {
-                                       proto_tree_add_item(bp_tree, voff, consumed,
+                                       proto_tree_add_text(bp_tree, voff, consumed,
                                                        "Option %d: %s = %d", code, text,
                                                        pntohs(&pd[voff+2]));
                                }
                                /* > 1 u_short */
                                else {
-                                       vti = proto_tree_add_item(bp_tree, voff,
+                                       vti = proto_tree_add_text(bp_tree, voff,
                                                consumed, "Option %d: %s", code, text);
-                                       v_tree = proto_tree_new();
-                                       proto_item_add_subtree(vti, v_tree, ETT_BOOTP_OPTION);
+                                       v_tree = proto_item_add_subtree(vti, ETT_BOOTP_OPTION);
                                        for (i = voff + 2; i < voff + consumed; i += 2) {
-                                               proto_tree_add_item(v_tree, i, 4, "Value: %d",
+                                               proto_tree_add_text(v_tree, i, 4, "Value: %d",
                                                        pntohs(&pd[i]));
                                        }
                                }
                                break;
 
                        case val_u_long:
-                               proto_tree_add_item(bp_tree, voff, consumed,
+                               proto_tree_add_text(bp_tree, voff, consumed,
                                                "Option %d: %s = %d", code, text,
                                                pntohl(&pd[voff+2]));
                                break;
 
                        case val_u_byte:
-                               proto_tree_add_item(bp_tree, voff, consumed,
+                               proto_tree_add_text(bp_tree, voff, consumed,
                                                "Option %d: %s = %d", code, text, pd[voff+2]);
                                break;
 
                        case toggle:
                                i = pd[voff+2];
                                if (i != 0 && i != 1) {
-                                       proto_tree_add_item(bp_tree, voff, consumed,
+                                       proto_tree_add_text(bp_tree, voff, consumed,
                                                        "Option %d: %s = Invalid Value %d", code, text,
                                                        pd[voff+2]);
                                }
                                else {
-                                       proto_tree_add_item(bp_tree, voff, consumed,
+                                       proto_tree_add_text(bp_tree, voff, consumed,
                                                        "Option %d: %s = %s", code, text,
                                                        pd[voff+2] == 0 ? "Disabled" : "Enabled");
                                }
@@ -403,12 +397,12 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff)
                        case yes_no:
                                i = pd[voff+2];
                                if (i != 0 && i != 1) {
-                                       proto_tree_add_item(bp_tree, voff, consumed,
+                                       proto_tree_add_text(bp_tree, voff, consumed,
                                                        "Option %d: %s = Invalid Value %d", code, text,
                                                        pd[voff+2]);
                                }
                                else {
-                                       proto_tree_add_item(bp_tree, voff, consumed,
+                                       proto_tree_add_text(bp_tree, voff, consumed,
                                                        "Option %d: %s = %s", code, text,
                                                        pd[voff+2] == 0 ? "No" : "Yes");
                                }
@@ -416,7 +410,7 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff)
 
                        case time_in_secs:
                                time_secs = pntohl(&pd[voff+2]);
-                               proto_tree_add_item(bp_tree, voff, consumed,
+                               proto_tree_add_text(bp_tree, voff, consumed,
                                        "Option %d: %s = %s", code, text,
                                        ((time_secs == 0xffffffff) ?
                                            "infinity" :
@@ -424,12 +418,12 @@ bootp_option(const u_char *pd, proto_tree *bp_tree, int voff, int eoff)
                                break;
 
                        default:
-                               proto_tree_add_item(bp_tree, voff, consumed,
+                               proto_tree_add_text(bp_tree, voff, consumed,
                                                "Option %d: %s (%d bytes)", code, text, vlen);
                }
        }
        else {
-               proto_tree_add_item(bp_tree, voff, consumed,
+               proto_tree_add_text(bp_tree, voff, consumed,
                                "Unknown Option Code: %d (%d bytes)", code, vlen);
        }
 
@@ -458,66 +452,65 @@ dissect_bootp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
        }
 
        if (tree) {
-               ti = proto_tree_add_item(tree, offset, END_OF_FRAME,
+               ti = proto_tree_add_text(tree, offset, END_OF_FRAME,
                  "Bootstrap Protocol");
-               bp_tree = proto_tree_new();
-               proto_item_add_subtree(ti, bp_tree, ETT_BOOTP);
+               bp_tree = proto_item_add_subtree(ti, ETT_BOOTP);
 
-               proto_tree_add_item(bp_tree, offset, 1, pd[offset] == 1 ?
+               proto_tree_add_text(bp_tree, offset, 1, pd[offset] == 1 ?
                        "Boot Request" : "Boot Reply");
-               proto_tree_add_item(bp_tree, offset + 1, 1,
+               proto_tree_add_text(bp_tree, offset + 1, 1,
                        "Hardware type: %s",
                        arphrdtype_to_str(pd[offset+1], "Unknown (0x%02x)"));
-               proto_tree_add_item(bp_tree, offset + 2, 1,
+               proto_tree_add_text(bp_tree, offset + 2, 1,
                        "Hardware address length: %d", pd[offset+2]);
-               proto_tree_add_item(bp_tree, offset + 3, 1,
+               proto_tree_add_text(bp_tree, offset + 3, 1,
                        "Hops: %d", pd[offset+3]);
-               proto_tree_add_item(bp_tree, offset + 4, 4,
+               proto_tree_add_text(bp_tree, offset + 4, 4,
                        "Transaction ID: 0x%08x", pntohl(&pd[offset+4]));
-               proto_tree_add_item(bp_tree, offset + 8, 2,
+               proto_tree_add_text(bp_tree, offset + 8, 2,
                        "Seconds elapsed: %d", pntohs(&pd[offset+8]));
-               proto_tree_add_item(bp_tree, offset + 10, 2,
+               proto_tree_add_text(bp_tree, offset + 10, 2,
                        "Broadcast flag: %d", pd[offset+10] & 1);
-               proto_tree_add_item(bp_tree, offset + 12, 4,
+               proto_tree_add_text(bp_tree, offset + 12, 4,
                        "Client IP address: %s", ip_to_str((guint8*)&pd[offset+12]));
-               proto_tree_add_item(bp_tree, offset + 16, 4,
+               proto_tree_add_text(bp_tree, offset + 16, 4,
                        "Your (client) IP address: %s", ip_to_str((guint8*)&pd[offset+16]));
-               proto_tree_add_item(bp_tree, offset + 20, 4,
+               proto_tree_add_text(bp_tree, offset + 20, 4,
                        "Next server IP address: %s", ip_to_str((guint8*)&pd[offset+20]));
-               proto_tree_add_item(bp_tree, offset + 24, 4,
+               proto_tree_add_text(bp_tree, offset + 24, 4,
                        "Relay agent IP address: %s", ip_to_str((guint8*)&pd[offset+24]));
 
-               proto_tree_add_item(bp_tree, offset + 28, pd[offset+2],
+               proto_tree_add_text(bp_tree, offset + 28, pd[offset+2],
                        "Client hardware address: %s",
                        arphrdaddr_to_str((guint8*)&pd[offset+28],
                                pd[offset+2], pd[offset+1]));
 
                /* The server host name is optional */
                if (pd[offset+44]) {
-                       proto_tree_add_item(bp_tree, offset + 44, 64,
+                       proto_tree_add_text(bp_tree, offset + 44, 64,
                                "Server host name: %s", &pd[offset+44]);
                }
                else {
-                       proto_tree_add_item(bp_tree, offset + 44, 64,
+                       proto_tree_add_text(bp_tree, offset + 44, 64,
                                "Server host name not given");
                }
 
                /* Boot file */
                if (pd[offset+108]) {
-                       proto_tree_add_item(bp_tree, offset + 108, 128,
+                       proto_tree_add_text(bp_tree, offset + 108, 128,
                                "Boot file name: %s", &pd[offset+108]);
                }
                else {
-                       proto_tree_add_item(bp_tree, offset + 108, 128,
+                       proto_tree_add_text(bp_tree, offset + 108, 128,
                                "Boot file name not given");
                }
 
                if (pntohl(&pd[offset+236]) == 0x63825363) {
-                       proto_tree_add_item(bp_tree, offset + 236, 4,
+                       proto_tree_add_text(bp_tree, offset + 236, 4,
                                "Magic cookie: (OK)");
                }
                else {
-                       proto_tree_add_item(bp_tree, offset + 236, 4,
+                       proto_tree_add_text(bp_tree, offset + 236, 4,
                                "Magic cookie: %s",
                                        ip_to_str((guint8*)&pd[offset+236]));
                }
index 45e1fb13cc7017079d650178263ac2c098f01f65..8874e048e26210d530371268dc1bd74ffc1c9a71 100644 (file)
@@ -2,7 +2,7 @@
  * Routines for the disassembly of the "Cisco Discovery Protocol"
  * (c) Copyright Hannes R. Boehm <hannes@boehm.org>
  *
- * $Id: packet-cdp.c,v 1.8 1999/03/23 03:14:36 gram Exp $
+ * $Id: packet-cdp.c,v 1.9 1999/07/07 22:51:41 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -66,16 +66,15 @@ dissect_cdp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
         col_add_str(fd, COL_INFO, "Cisco Discovery Protocol"); 
 
     if(tree){
-        ti = proto_tree_add_item(tree, offset, (fd->cap_len - offset), 
+        ti = proto_tree_add_text(tree, offset, (fd->cap_len - offset), 
                                                           "Cisco Discovery Protocol");
-       cdp_tree = proto_tree_new(); 
-       proto_item_add_subtree(ti, cdp_tree, ETT_CDP);
+       cdp_tree = proto_item_add_subtree(ti, ETT_CDP);
        
        /* CDP header */
        cdp_hdr = (e_cdp_hdr *) &pd[offset];
-       proto_tree_add_item(cdp_tree, offset, 1, "Version: %d", cdp_hdr->version);
-       proto_tree_add_item(cdp_tree, offset+1, 1, "Flags (unknown)");
-       proto_tree_add_item(cdp_tree, offset+2, 2, "TTL (unknown)");
+       proto_tree_add_text(cdp_tree, offset, 1, "Version: %d", cdp_hdr->version);
+       proto_tree_add_text(cdp_tree, offset+1, 1, "Flags (unknown)");
+       proto_tree_add_text(cdp_tree, offset+2, 2, "TTL (unknown)");
        offset+=4;
 
        /* CVS -> exit here 
@@ -91,7 +90,7 @@ dissect_cdp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
                                offset+=length + 4;
                                break;
                        case 1: /* ??? Chassis ID */
-                               proto_tree_add_item(cdp_tree, offset + 4,
+                               proto_tree_add_text(cdp_tree, offset + 4,
                                    length - 4, "Chassis ID: %s", &pd[offset+4] );
                                offset+=length;
                                break;
@@ -102,7 +101,7 @@ dissect_cdp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
                                offset+=4; 
                                break;
                        case 3: /* ??? Port  */    
-                               proto_tree_add_item(cdp_tree, offset + 4,
+                               proto_tree_add_text(cdp_tree, offset + 4,
                                  length - 4, "Sent through Interface: %s", &pd[offset+4] );
                                offset+=length;
                                break;
@@ -117,13 +116,13 @@ dissect_cdp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
                                stringmem = malloc(length);
                                memset(stringmem, '\0', length);
                                memcpy(stringmem, &pd[offset+4], length - 4 );
-                               proto_tree_add_item(cdp_tree, offset + 4, length - 4, 
+                               proto_tree_add_text(cdp_tree, offset + 4, length - 4, 
                                                      "Platform: %s", stringmem );
                                free(stringmem);
                                offset+=length;
                                break;
                        case 0x01cc: /* ??? Mgmt Addr */
-                               proto_tree_add_item(cdp_tree, offset + 4, length, 
+                               proto_tree_add_text(cdp_tree, offset + 4, length, 
                                                      "Mgmt IP: %s",
                                                     ip_to_str(&pd[offset+4]) );
                                offset+=length + 4;
@@ -136,11 +135,11 @@ dissect_cdp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
                                }
 */
 /*
-                               proto_tree_add_item(cdp_tree, offset + TLV_TYPE,
+                               proto_tree_add_text(cdp_tree, offset + TLV_TYPE,
                                    2, "Type: %d", type);
-                               proto_tree_add_item(cdp_tree, offset + TLV_LENGTH,
+                               proto_tree_add_text(cdp_tree, offset + TLV_LENGTH,
                                    2, "Length: %d", length);
-                               proto_tree_add_item(cdp_tree, offset + 4,
+                               proto_tree_add_text(cdp_tree, offset + 4,
                                    length - 4, "Data");
 */
 
@@ -179,7 +178,7 @@ add_multi_line_string_to_tree(proto_tree *tree, gint start, gint len,
            line_len = strlen(p);
            data_len = line_len;
        }
-       proto_tree_add_item(tree, start, data_len, "%s%.*s", prefix,
+       proto_tree_add_text(tree, start, data_len, "%s%.*s", prefix,
           line_len, p);
        if (q == NULL)
            break;
index bf546baadc00a3d2220dc80f67895e2d6bebb39e..f28300f16a8b3e61785e316264c0f057caee6bb8 100644 (file)
@@ -2,7 +2,7 @@
  * Routines for raw data (default case)
  * Gilbert Ramirez <gram@verdict.uthscsa.edu>
  *
- * $Id: packet-data.c,v 1.8 1999/03/23 03:14:36 gram Exp $
+ * $Id: packet-data.c,v 1.9 1999/07/07 22:51:41 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@unicom.net>
 #include <glib.h>
 #include "packet.h"
 
+int proto_data = -1;
+
 void
 dissect_data(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
 
        if (fd->cap_len > offset && tree) {
-               proto_tree_add_item(tree, offset, END_OF_FRAME,
-                       "Data (%d bytes)", END_OF_FRAME);
+               proto_tree_add_item_format(tree, proto_data, offset,
+                       END_OF_FRAME, NULL, "Data (%d bytes)", END_OF_FRAME);
        }
 }
 
+void
+proto_register_data(void)
+{
+       proto_data = proto_register_protocol (
+               /* name */      "Data",
+               /* abbrev */    "data" );
+}
index 4a087fde4d479de11e603a26f055172bd3860e35..66eec34107bf48885f5c04560cbdb8327871e0d3 100644 (file)
@@ -1,7 +1,7 @@
 /* packet-dns.c
  * Routines for DNS packet disassembly
  *
- * $Id: packet-dns.c,v 1.18 1999/05/27 05:35:07 guy Exp $
+ * $Id: packet-dns.c,v 1.19 1999/07/07 22:51:41 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -416,18 +416,17 @@ dissect_dns_query(const u_char *dns_data_ptr, const u_char *pd, int offset,
   class_name = dns_class_name(class);
   long_type_name = dns_long_type_name(type);
 
-  tq = proto_tree_add_item(dns_tree, offset, len, "%s: type %s, class %s", 
+  tq = proto_tree_add_text(dns_tree, offset, len, "%s: type %s, class %s", 
                   name, type_name, class_name);
-  q_tree = proto_tree_new();
-  proto_item_add_subtree(tq, q_tree, ETT_DNS_QD);
+  q_tree = proto_item_add_subtree(tq, ETT_DNS_QD);
 
-  proto_tree_add_item(q_tree, offset, name_len, "Name: %s", name);
+  proto_tree_add_text(q_tree, offset, name_len, "Name: %s", name);
   offset += name_len;
 
-  proto_tree_add_item(q_tree, offset, 2, "Type: %s", long_type_name);
+  proto_tree_add_text(q_tree, offset, 2, "Type: %s", long_type_name);
   offset += 2;
 
-  proto_tree_add_item(q_tree, offset, 2, "Class: %s", class_name);
+  proto_tree_add_text(q_tree, offset, 2, "Class: %s", class_name);
   offset += 2;
   
   return dptr - data_start;
@@ -441,18 +440,17 @@ add_rr_to_tree(proto_item *trr, int rr_type, int offset, const char *name,
 {
   proto_tree *rr_tree;
 
-  rr_tree = proto_tree_new();
-  proto_item_add_subtree(trr, rr_tree, rr_type);
-  proto_tree_add_item(rr_tree, offset, namelen, "Name: %s", name);
+  rr_tree = proto_item_add_subtree(trr, rr_type);
+  proto_tree_add_text(rr_tree, offset, namelen, "Name: %s", name);
   offset += namelen;
-  proto_tree_add_item(rr_tree, offset, 2, "Type: %s", type_name);
+  proto_tree_add_text(rr_tree, offset, 2, "Type: %s", type_name);
   offset += 2;
-  proto_tree_add_item(rr_tree, offset, 2, "Class: %s", class_name);
+  proto_tree_add_text(rr_tree, offset, 2, "Class: %s", class_name);
   offset += 2;
-  proto_tree_add_item(rr_tree, offset, 4, "Time to live: %s",
+  proto_tree_add_text(rr_tree, offset, 4, "Time to live: %s",
                                                time_secs_to_str(ttl));
   offset += 4;
-  proto_tree_add_item(rr_tree, offset, 2, "Data length: %u", data_len);
+  proto_tree_add_text(rr_tree, offset, 2, "Data length: %u", data_len);
   return rr_tree;
 }
 
@@ -494,14 +492,14 @@ dissect_dns_answer(const u_char *dns_data_ptr, const u_char *pd, int offset,
 
   switch (type) {
   case T_A:
-    trr = proto_tree_add_item(dns_tree, offset, (dptr - data_start) + data_len,
+    trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len,
                     "%s: type %s, class %s, addr %s",
                     name, type_name, class_name,
                     ip_to_str((guint8 *)dptr));
     rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len,
                      long_type_name, class_name, ttl, data_len);
     offset += (dptr - data_start);
-    proto_tree_add_item(rr_tree, offset, 4, "Addr: %s",
+    proto_tree_add_text(rr_tree, offset, 4, "Addr: %s",
                      ip_to_str((guint8 *)dptr));
     break;
 
@@ -511,13 +509,13 @@ dissect_dns_answer(const u_char *dns_data_ptr, const u_char *pd, int offset,
       int ns_name_len;
       
       ns_name_len = get_dns_name(dns_data_ptr, dptr, ns_name, sizeof(ns_name));
-      trr = proto_tree_add_item(dns_tree, offset, (dptr - data_start) + data_len,
+      trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len,
                       "%s: type %s, class %s, ns %s",
                       name, type_name, class_name, ns_name);
       rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len,
                        long_type_name, class_name, ttl, data_len);
       offset += (dptr - data_start);
-      proto_tree_add_item(rr_tree, offset, ns_name_len, "Name server: %s", ns_name);
+      proto_tree_add_text(rr_tree, offset, ns_name_len, "Name server: %s", ns_name);
     }
     break;
 
@@ -527,13 +525,13 @@ dissect_dns_answer(const u_char *dns_data_ptr, const u_char *pd, int offset,
       int cname_len;
       
       cname_len = get_dns_name(dns_data_ptr, dptr, cname, sizeof(cname));
-      trr = proto_tree_add_item(dns_tree, offset, (dptr - data_start) + data_len,
+      trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len,
                     "%s: type %s, class %s, cname %s",
                     name, type_name, class_name, cname);
       rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len,
                        long_type_name, class_name, ttl, data_len);
       offset += (dptr - data_start);
-      proto_tree_add_item(rr_tree, offset, cname_len, "Primary name: %s", cname);
+      proto_tree_add_text(rr_tree, offset, cname_len, "Primary name: %s", cname);
     }
     break;
 
@@ -552,42 +550,42 @@ dissect_dns_answer(const u_char *dns_data_ptr, const u_char *pd, int offset,
       rrptr = dptr;
       mname_len = get_dns_name(dns_data_ptr, rrptr, mname, sizeof(mname));
       rrptr += mname_len;
-      trr = proto_tree_add_item(dns_tree, offset, (dptr - data_start) + data_len,
+      trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len,
                     "%s: type %s, class %s, mname %s",
                     name, type_name, class_name, mname);
       rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len,
                        long_type_name, class_name, ttl, data_len);
       offset += (dptr - data_start);
-      proto_tree_add_item(rr_tree, offset, mname_len, "Primary name server: %s",
+      proto_tree_add_text(rr_tree, offset, mname_len, "Primary name server: %s",
                        mname);
       offset += mname_len;
       rname_len = get_dns_name(dns_data_ptr, rrptr, rname, sizeof(rname));
-      proto_tree_add_item(rr_tree, offset, rname_len, "Responsible authority's mailbox: %s",
+      proto_tree_add_text(rr_tree, offset, rname_len, "Responsible authority's mailbox: %s",
                        rname);
       rrptr += rname_len;
       offset += rname_len;
       serial = pntohl(rrptr);
-      proto_tree_add_item(rr_tree, offset, 4, "Serial number: %u",
+      proto_tree_add_text(rr_tree, offset, 4, "Serial number: %u",
                        serial);
       rrptr += 4;
       offset += 4;
       refresh = pntohl(rrptr);
-      proto_tree_add_item(rr_tree, offset, 4, "Refresh interval: %s",
+      proto_tree_add_text(rr_tree, offset, 4, "Refresh interval: %s",
                        time_secs_to_str(refresh));
       rrptr += 4;
       offset += 4;
       retry = pntohl(rrptr);
-      proto_tree_add_item(rr_tree, offset, 4, "Retry interval: %s",
+      proto_tree_add_text(rr_tree, offset, 4, "Retry interval: %s",
                        time_secs_to_str(retry));
       rrptr += 4;
       offset += 4;
       expire = pntohl(rrptr);
-      proto_tree_add_item(rr_tree, offset, 4, "Expiration limit: %s",
+      proto_tree_add_text(rr_tree, offset, 4, "Expiration limit: %s",
                        time_secs_to_str(expire));
       rrptr += 4;
       offset += 4;
       minimum = pntohl(rrptr);
-      proto_tree_add_item(rr_tree, offset, 4, "Minimum TTL: %s",
+      proto_tree_add_text(rr_tree, offset, 4, "Minimum TTL: %s",
                        time_secs_to_str(minimum));
     }
     break;
@@ -598,13 +596,13 @@ dissect_dns_answer(const u_char *dns_data_ptr, const u_char *pd, int offset,
       int pname_len;
       
       pname_len = get_dns_name(dns_data_ptr, dptr, pname, sizeof(pname));
-      trr = proto_tree_add_item(dns_tree, offset, (dptr - data_start) + data_len,
+      trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len,
                     "%s: type %s, class %s, ptr %s",
                     name, type_name, class_name, pname);
       rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len,
                        long_type_name, class_name, ttl, data_len);
       offset += (dptr - data_start);
-      proto_tree_add_item(rr_tree, offset, pname_len, "Domain name: %s", pname);
+      proto_tree_add_text(rr_tree, offset, pname_len, "Domain name: %s", pname);
       break;
     }
     break;
@@ -612,13 +610,13 @@ dissect_dns_answer(const u_char *dns_data_ptr, const u_char *pd, int offset,
     /* TODO: parse more record types */
 
   default:
-    trr = proto_tree_add_item(dns_tree, offset, (dptr - data_start) + data_len,
+    trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len,
                      "%s: type %s, class %s",
                     name, type_name, class_name);
     rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len,
                        long_type_name, class_name, ttl, data_len);
     offset += (dptr - data_start);
-    proto_tree_add_item(rr_tree, offset, data_len, "Data");
+    proto_tree_add_text(rr_tree, offset, data_len, "Data");
   }
   
   dptr += data_len;
@@ -635,9 +633,8 @@ dissect_query_records(const u_char *dns_data_ptr, int count, const u_char *pd,
   proto_item *ti;
   
   start_off = cur_off;
-  ti = proto_tree_add_item(dns_tree, start_off, 0, "Queries");
-  qatree = proto_tree_new();
-  proto_item_add_subtree(ti, qatree, ETT_DNS_QRY);
+  ti = proto_tree_add_text(dns_tree, start_off, 0, "Queries");
+  qatree = proto_item_add_subtree(ti, ETT_DNS_QRY);
   while (count-- > 0)
     cur_off += dissect_dns_query(dns_data_ptr, pd, cur_off, qatree);
   proto_item_set_len(ti, cur_off - start_off);
@@ -657,9 +654,8 @@ dissect_answer_records(const u_char *dns_data_ptr, int count,
   proto_item *ti;
   
   start_off = cur_off;
-  ti = proto_tree_add_item(dns_tree, start_off, 0, name);
-  qatree = proto_tree_new();
-  proto_item_add_subtree(ti, qatree, ETT_DNS_ANS);
+  ti = proto_tree_add_text(dns_tree, start_off, 0, name);
+  qatree = proto_item_add_subtree(ti, ETT_DNS_ANS);
   while (count-- > 0)
     cur_off += dissect_dns_answer(dns_data_ptr, pd, cur_off, qatree);
   proto_item_set_len(ti, cur_off - start_off);
@@ -710,13 +706,12 @@ dissect_dns(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
   }
   
   if (tree) {
-    ti = proto_tree_add_item(tree, offset, 4,
+    ti = proto_tree_add_text(tree, offset, 4,
                          (flags & F_RESPONSE) ? "DNS response" : "DNS query");
     
-    dns_tree = proto_tree_new();
-    proto_item_add_subtree(ti, dns_tree, ETT_DNS);
+    dns_tree = proto_item_add_subtree(ti, ETT_DNS);
     
-    proto_tree_add_item(dns_tree, offset + DNS_ID, 2, "Transaction ID: 0x%04x",
+    proto_tree_add_text(dns_tree, offset + DNS_ID, 2, "Transaction ID: 0x%04x",
                        id);
 
     strcpy(buf, val_to_str(flags & F_OPCODE, opcode_vals, "Unknown operation"));
@@ -726,47 +721,46 @@ dissect_dns(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
       strcat(buf, val_to_str(flags & F_RCODE, rcode_vals,
             "Unknown error"));
     }
-    tf = proto_tree_add_item(dns_tree, offset + DNS_FLAGS, 2, "Flags: 0x%04x (%s)",
+    tf = proto_tree_add_text(dns_tree, offset + DNS_FLAGS, 2, "Flags: 0x%04x (%s)",
                           flags, buf);
-    field_tree = proto_tree_new();
-    proto_item_add_subtree(tf, field_tree, ETT_DNS_FLAGS);
-    proto_tree_add_item(field_tree, offset + DNS_FLAGS, 2, "%s",
+    field_tree = proto_item_add_subtree(tf, ETT_DNS_FLAGS);
+    proto_tree_add_text(field_tree, offset + DNS_FLAGS, 2, "%s",
        decode_boolean_bitfield(flags, F_RESPONSE,
             2*8, "Response", "Query"));
-    proto_tree_add_item(field_tree, offset + DNS_FLAGS, 2, "%s",
+    proto_tree_add_text(field_tree, offset + DNS_FLAGS, 2, "%s",
        decode_enumerated_bitfield(flags, F_OPCODE,
             2*8, opcode_vals, "%s"));
     if (flags & F_RESPONSE) {
-      proto_tree_add_item(field_tree, offset + DNS_FLAGS, 2, "%s",
+      proto_tree_add_text(field_tree, offset + DNS_FLAGS, 2, "%s",
          decode_boolean_bitfield(flags, F_AUTHORITATIVE,
               2*8,
               "Server is an authority for domain",
               "Server isn't an authority for domain"));
     }
-    proto_tree_add_item(field_tree, offset + DNS_FLAGS, 2, "%s",
+    proto_tree_add_text(field_tree, offset + DNS_FLAGS, 2, "%s",
        decode_boolean_bitfield(flags, F_TRUNCATED,
             2*8,
             "Message is truncated",
             "Message is not truncated"));
-    proto_tree_add_item(field_tree, offset + DNS_FLAGS, 2, "%s",
+    proto_tree_add_text(field_tree, offset + DNS_FLAGS, 2, "%s",
        decode_boolean_bitfield(flags, F_RECDESIRED,
             2*8,
             "Do query recursively",
             "Don't do query recursively"));
     if (flags & F_RESPONSE) {
-      proto_tree_add_item(field_tree, offset + DNS_FLAGS, 2, "%s",
+      proto_tree_add_text(field_tree, offset + DNS_FLAGS, 2, "%s",
          decode_boolean_bitfield(flags, F_RECAVAIL,
               2*8,
               "Server can do recursive queries",
               "Server can't do recursive queries"));
-      proto_tree_add_item(field_tree, offset + DNS_FLAGS, 2, "%s",
+      proto_tree_add_text(field_tree, offset + DNS_FLAGS, 2, "%s",
          decode_enumerated_bitfield(flags, F_RCODE,
               2*8, rcode_vals, "%s"));
     }
-    proto_tree_add_item(dns_tree, offset + DNS_QUEST, 2, "Questions: %d", quest);
-    proto_tree_add_item(dns_tree, offset + DNS_ANS, 2, "Answer RRs: %d", ans);
-    proto_tree_add_item(dns_tree, offset + DNS_AUTH, 2, "Authority RRs: %d", auth);
-    proto_tree_add_item(dns_tree, offset + DNS_ADD, 2, "Additional RRs: %d", add);
+    proto_tree_add_text(dns_tree, offset + DNS_QUEST, 2, "Questions: %d", quest);
+    proto_tree_add_text(dns_tree, offset + DNS_ANS, 2, "Answer RRs: %d", ans);
+    proto_tree_add_text(dns_tree, offset + DNS_AUTH, 2, "Authority RRs: %d", auth);
+    proto_tree_add_text(dns_tree, offset + DNS_ADD, 2, "Additional RRs: %d", add);
 
     cur_off = offset + DNS_HDRLEN;
     
index ea018989acf92d9f83e56ed34e306cf4805e2ad1..9ee7489bcd6215d2565e6bb47a6cbbc08031176f 100644 (file)
@@ -1,7 +1,7 @@
 /* packet-eth.c
  * Routines for ethernet packet disassembly
  *
- * $Id: packet-eth.c,v 1.9 1999/03/23 03:14:37 gram Exp $
+ * $Id: packet-eth.c,v 1.10 1999/07/07 22:51:42 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
 #include "etypes.h"
 #include "resolv.h"
 
+extern const value_string etype_vals[];
+
+/* protocols and header fields */
+int proto_eth = -1;
+int hf_eth_dst = -1;
+int hf_eth_dst_vendor = -1;
+int hf_eth_src = -1;
+int hf_eth_src_vendor = -1;
+int hf_eth_len = -1;
+int hf_eth_type = -1;
+
 #define IEEE_802_3_MAX_LEN 1500
 
 /* These are the Netware-ish names for the different Ethernet frame types.
@@ -135,32 +146,36 @@ dissect_eth(const u_char *pd, frame_data *fd, proto_tree *tree) {
     if (check_col(fd, COL_INFO))
       col_add_str(fd, COL_INFO, "802.3");
     if (tree) {
-      ti = proto_tree_add_item(tree, 0, offset,
-        "IEEE 802.3 %s", (ethhdr_type == ETHERNET_802_3 ? "Raw " : ""));
-
-      fh_tree = proto_tree_new();
-      proto_item_add_subtree(ti, fh_tree, ETT_IEEE8023);
-      proto_tree_add_item(fh_tree, 0, 6, "Destination: %s (%s)",
-       ether_to_str((guint8 *) &pd[0]),
-        get_ether_name((u_char *) &pd[0]));
-      proto_tree_add_item(fh_tree, 6, 6, "Source: %s (%s)",
-       ether_to_str((guint8 *) &pd[6]),
-       get_ether_name((u_char *)&pd[6]));
-      proto_tree_add_item(fh_tree, 12, 2, "Length: %d", length);
+
+       ti = proto_tree_add_item_format(tree, proto_eth, 0, offset,
+               NULL, "IEEE 802.3 %s", (ethhdr_type == ETHERNET_802_3 ? "Raw " : ""));
+
+       fh_tree = proto_item_add_subtree(ti, ETT_IEEE8023);
+
+       proto_tree_add_item(fh_tree, hf_eth_dst, 0, 6, &pd[0]);
+       proto_tree_add_item_hidden(fh_tree, hf_eth_dst_vendor, 0, 3, &pd[0]);
+       proto_tree_add_item(fh_tree, hf_eth_src, 6, 6, &pd[6]);
+       proto_tree_add_item_hidden(fh_tree, hf_eth_src_vendor, 6, 3, &pd[6]);
+       proto_tree_add_item(fh_tree, hf_eth_len, 12, 2, length);
     }
 
   } else {
     ethhdr_type = ETHERNET_II;
     if (tree) {
-      ti = proto_tree_add_item(tree, 0, 14, "Ethernet II");
-      fh_tree = proto_tree_new();
-      proto_item_add_subtree(ti, fh_tree, ETT_ETHER2);
-      proto_tree_add_item(fh_tree, 0, 6, "Destination: %s (%s)",
-       ether_to_str((guint8 *) &pd[0]),
-       get_ether_name((u_char *)&pd[0]));
-      proto_tree_add_item(fh_tree, 6, 6, "Source: %s (%s)",
-        ether_to_str((guint8 *) &pd[6]),
-        get_ether_name((u_char *)&pd[6]));
+
+       ti = proto_tree_add_item_format(tree, proto_eth, 0, 14, NULL,
+               "Ethernet II");
+
+       fh_tree = proto_item_add_subtree(ti, ETT_ETHER2);
+
+       proto_tree_add_item_format(fh_tree, hf_eth_dst, 0, 6, &pd[0],
+               "Destination: %s (%s)", ether_to_str((guint8 *) &pd[0]),
+               get_ether_name((u_char *) &pd[0]));
+
+       proto_tree_add_item_format(fh_tree, hf_eth_src, 6, 6, &pd[6],
+               "Source: %s (%s)", ether_to_str((guint8 *) &pd[6]),
+               get_ether_name((u_char *) &pd[6]));
+
     }
   }
 
@@ -172,8 +187,58 @@ dissect_eth(const u_char *pd, frame_data *fd, proto_tree *tree) {
       dissect_llc(pd, offset, fd, tree);
       break;
     case ETHERNET_II:
-      ethertype(etype, offset, pd, fd, tree, fh_tree);
+      ethertype(etype, offset, pd, fd, tree, fh_tree, hf_eth_type);
       break;
   }
 }
 
+void
+proto_register_eth(void)
+{
+       proto_eth = proto_register_protocol (
+               /* name */      "Ethernet",
+               /* abbrev */    "eth" );
+
+       hf_eth_dst = proto_register_field (
+               /* name */      "Destination",
+               /* abbrev */    "eth.dst",
+               /* ftype */     FT_ETHER,
+               /* parent */    proto_eth,
+               /* vals[] */    NULL );
+
+       hf_eth_src = proto_register_field (
+               /* name */      "Source",
+               /* abbrev */    "eth.src",
+               /* ftype */     FT_ETHER,
+               /* parent */    proto_eth,
+               /* vals[] */    NULL );
+
+       hf_eth_dst_vendor = proto_register_field (
+               /* name */      "Destination Hardware Vendor",
+               /* abbrev */    "eth.dst_vendor",
+               /* ftype */     FT_ETHER_VENDOR,
+               /* parent */    proto_eth,
+               /* vals[] */    NULL );
+
+       hf_eth_src_vendor = proto_register_field (
+               /* name */      "Source Hardware Vendor",
+               /* abbrev */    "eth.src_vendor",
+               /* ftype */     FT_ETHER_VENDOR,
+               /* parent */    proto_eth,
+               /* vals[] */    NULL );
+
+       hf_eth_len = proto_register_field (
+               /* name */      "Length",
+               /* abbrev */    "eth.len",
+               /* ftype */     FT_UINT16,
+               /* parent */    proto_eth,
+               /* vals[] */    NULL );
+       
+       /* registered here but handled in ethertype.c */        
+       hf_eth_type = proto_register_field (
+               /* name */      "Type",
+               /* abbrev */    "eth.type",
+               /* ftype */     FT_VALS_UINT16,
+               /* parent */    proto_eth,
+               /* vals[] */    VALS(etype_vals) );
+}
index d11f3c1f985ade07001314759a37d2c46d9b10a9..147922af73a24db639c8137fd4961c6870dc1582 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Laurent Deniel <deniel@worldnet.fr>
  *
- * $Id: packet-fddi.c,v 1.11 1999/03/23 03:14:37 gram Exp $
+ * $Id: packet-fddi.c,v 1.12 1999/07/07 22:51:42 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
 #include "packet.h"
 #include "resolv.h"
 
+int proto_fddi = -1;
+int hf_fddi_fc = -1;
+int hf_fddi_dst = -1;
+int hf_fddi_dst_vendor = -1;
+int hf_fddi_src = -1;
+int hf_fddi_src_vendor = -1;
+
 /* FDDI Frame Control values */
 
 #define FDDI_FC_VOID           0x00            /* Void frame */
@@ -128,6 +135,17 @@ static void get_mac_addr(u_char *swapped_addr, const u_char *addr)
   }
 }
 
+static void
+swap_mac_addr(u_char *swapped_addr, const u_char *orig_addr)
+{
+       int i;
+
+       for (i = 0; i < 6; i++) {
+               swapped_addr[i] = swaptab[orig_addr[i]];
+       }
+}
+
+
 void
 capture_fddi(const u_char *pd, guint32 cap_len, packet_counts *ld) {
   int        offset = 0, fc;
@@ -162,7 +180,6 @@ capture_fddi(const u_char *pd, guint32 cap_len, packet_counts *ld) {
     case FDDI_FC_LLC_ASYNC + 15 :
       capture_llc(pd, offset, cap_len, ld);
       return;
-      
     default :
       ld->other++;
       return;
@@ -177,6 +194,7 @@ void dissect_fddi(const u_char *pd, frame_data *fd, proto_tree *tree)
   proto_tree *fh_tree;
   proto_item *ti;
   u_char     src[6], dst[6];
+  u_char     src_swapped[6], dst_swapped[6];
 
   if (fd->cap_len < FDDI_HEADER_SIZE) {
     dissect_data(pd, offset, fd, tree);
@@ -206,20 +224,28 @@ void dissect_fddi(const u_char *pd, frame_data *fd, proto_tree *tree)
   offset = FDDI_HEADER_SIZE;
 
   if (tree) {
-    ti = proto_tree_add_item(tree, 0, offset,
-                         "FDDI %s",
-                         (fc >= FDDI_FC_LLC_ASYNC_MIN && fc <= FDDI_FC_LLC_ASYNC_MAX) ?
+       ti = proto_tree_add_item_format(tree, proto_fddi, 0, offset, NULL,
+               "Fiber Distributed Data Interface, %s",
+               (fc >= FDDI_FC_LLC_ASYNC_MIN && fc <= FDDI_FC_LLC_ASYNC_MAX) ?
                          "Async LLC" : "unsupported FC");
 
-      fh_tree = proto_tree_new();
-      proto_item_add_subtree(ti, fh_tree, ETT_FDDI);
-      proto_tree_add_item(fh_tree, FDDI_P_FC, 1, "Frame Control: 0x%02x", fc);
-      proto_tree_add_item(fh_tree, FDDI_P_DHOST, 6, "Destination: %s (%s)",
-                      ether_to_str(dst), get_ether_name(dst));
-      proto_tree_add_item(fh_tree, FDDI_P_SHOST, 6, "Source: %s (%s)",
-                      ether_to_str(src), get_ether_name(src));
-    }
+      swap_mac_addr(dst_swapped, (u_char*)&pd[FDDI_P_DHOST]);
+      swap_mac_addr(src_swapped, (u_char*)&pd[FDDI_P_SHOST]);
 
+      fh_tree = proto_item_add_subtree(ti, ETT_FDDI);
+      proto_tree_add_item(fh_tree, hf_fddi_fc, FDDI_P_FC, 1, fc);
+      proto_tree_add_item(fh_tree, hf_fddi_dst, FDDI_P_DHOST, 6, dst);
+      proto_tree_add_item_hidden(fh_tree, hf_fddi_dst_vendor, FDDI_P_DHOST, 3, dst);
+      proto_tree_add_item(fh_tree, hf_fddi_src, FDDI_P_SHOST, 6, src);
+      proto_tree_add_item_hidden(fh_tree, hf_fddi_src_vendor, FDDI_P_SHOST, 3, src);
+
+      /* hide some bit-swapped mac address fields in the proto_tree, just in case */
+      proto_tree_add_item_hidden(fh_tree, hf_fddi_dst, FDDI_P_DHOST, 6, dst_swapped);
+      proto_tree_add_item_hidden(fh_tree, hf_fddi_dst, FDDI_P_SHOST, 6, src_swapped);
+      proto_tree_add_item_hidden(fh_tree, hf_fddi_dst_vendor, FDDI_P_DHOST, 3, dst_swapped);
+      proto_tree_add_item_hidden(fh_tree, hf_fddi_src_vendor, FDDI_P_SHOST, 3, src_swapped);
+
+    }
   switch (fc) {
 
     /* From now, only 802.2 SNAP (Async. LCC frame) is supported */
@@ -248,5 +274,47 @@ void dissect_fddi(const u_char *pd, frame_data *fd, proto_tree *tree)
       return;
 
   } /* fc */
-
 } /* dissect_fddi */
+
+void
+proto_register_fddi(void)
+{
+       proto_fddi = proto_register_protocol (
+               /* name */      "Fiber Distributed Data Interface",
+               /* abbrev */    "fddi" );
+
+       hf_fddi_fc = proto_register_field (
+               /* name */      "Frame Control",
+               /* abbrev */    "fddi.fc",
+               /* ftype */     FT_UINT8,
+               /* parent */    proto_fddi,
+               /* vals[] */    NULL );
+
+       hf_fddi_dst = proto_register_field (
+               /* name */      "Destination",
+               /* abbrev */    "fddi.dst",
+               /* ftype */     FT_ETHER,
+               /* parent */    proto_fddi,
+               /* vals[] */    NULL );
+
+       hf_fddi_src = proto_register_field (
+               /* name */      "Source",
+               /* abbrev */    "fddi.src",
+               /* ftype */     FT_ETHER,
+               /* parent */    proto_fddi,
+               /* vals[] */    NULL );
+
+       hf_fddi_dst_vendor = proto_register_field (
+               /* name */      "Destination Hardware Vendor",
+               /* abbrev */    "fddi.dst_vendor",
+               /* ftype */     FT_ETHER_VENDOR,
+               /* parent */    proto_fddi,
+               /* vals[] */    NULL );
+
+       hf_fddi_src_vendor = proto_register_field (
+               /* name */      "Source Hardware Vendor",
+               /* abbrev */    "fddi.src_vendor",
+               /* ftype */     FT_ETHER_VENDOR,
+               /* parent */    proto_fddi,
+               /* vals[] */    NULL );
+}
index a8feed5afd087bf34e163d86e3f73aa49ceeee48..7dddacd7a3df0eb9f9152fd20986b944aba1b9c7 100644 (file)
@@ -2,7 +2,7 @@
  * Routines for ftp packet dissection
  * Copyright 1999, Richard Sharpe <rsharpe@ns.aus.com>
  *
- * $Id: packet-ftp.c,v 1.3 1999/05/13 01:05:11 sharpe Exp $
+ * $Id: packet-ftp.c,v 1.4 1999/07/07 22:51:43 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@unicom.net>
@@ -92,23 +92,22 @@ dissect_ftp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int
 
        if (tree) {
 
-         ti = proto_tree_add_item(tree, offset, END_OF_FRAME,
+         ti = proto_tree_add_text(tree, offset, END_OF_FRAME,
                                "File Transfer Protocol");
-         ftp_tree = proto_tree_new();
-         proto_item_add_subtree(ti, ftp_tree, ETT_FTP);
+         ftp_tree = proto_item_add_subtree(ti, ETT_FTP);
 
          if (pi.match_port == pi.destport) { /* Request */
 
-           proto_tree_add_item(ftp_tree, offset, i1, "Request: %s", rr);
+           proto_tree_add_text(ftp_tree, offset, i1, "Request: %s", rr);
 
-           proto_tree_add_item(ftp_tree, offset + i1 + 1, END_OF_FRAME, "Request Arg: %s", rd);
+           proto_tree_add_text(ftp_tree, offset + i1 + 1, END_OF_FRAME, "Request Arg: %s", rd);
 
          }
          else {
 
-           proto_tree_add_item(ftp_tree, offset, i1, "Response: %s", rr);
+           proto_tree_add_text(ftp_tree, offset, i1, "Response: %s", rr);
 
-           proto_tree_add_item(ftp_tree, offset + i1 + 1, END_OF_FRAME, "Response Arg: %s", rd);
+           proto_tree_add_text(ftp_tree, offset + i1 + 1, END_OF_FRAME, "Response Arg: %s", rd);
          }
 
        }
@@ -130,7 +129,7 @@ dissect_ftpdata(const u_char *pd, int offset, frame_data *fd, proto_tree *tree,
 
        if (tree) {
 
-         ti = proto_tree_add_item(tree, offset, END_OF_FRAME,
+         ti = proto_tree_add_text(tree, offset, END_OF_FRAME,
                                "File Transfer Protocol Data");
 
        }
index 7db6594b2cf4b92214e854e9ad52f310c4059dba..376afe8cba3691b56b996aa2aa28aefc8aa2af86 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Laurent Deniel <deniel@worldnet.fr>
  *
- * $Id: packet-giop.c,v 1.2 1999/03/23 03:14:37 gram Exp $
+ * $Id: packet-giop.c,v 1.3 1999/07/07 22:51:43 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -258,27 +258,26 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
   }
 
   if (tree) {
-    ti = proto_tree_add_item(tree, offset, 
+    ti = proto_tree_add_text(tree, offset, 
                          GIOP_HEADER_SIZE + message_size,
                          "General Inter-ORB Protocol");
-    clnp_tree = proto_tree_new();
-    proto_item_add_subtree(ti, clnp_tree, ETT_GIOP);
-    proto_tree_add_item(clnp_tree, offset,      4,
+    clnp_tree = proto_item_add_subtree(ti, ETT_GIOP);
+    proto_tree_add_text(clnp_tree, offset,      4,
                     "Magic number: %s", GIOP_MAGIC);
-    proto_tree_add_item(clnp_tree, offset +  4, 2, 
+    proto_tree_add_text(clnp_tree, offset +  4, 2, 
                     "Version: %d.%d", 
                     header.GIOP_version.major,
                     header.GIOP_version.minor);
     switch(minor_version) {
       case 1  :
-       proto_tree_add_item(clnp_tree, offset +  6, 1, 
+       proto_tree_add_text(clnp_tree, offset +  6, 1, 
                         "Flags: 0x%02x (%s%s)", 
                         header.flags,
                         (big_endian) ? "little" : "big",
                         (header.flags & 0x02) ? " fragment" : "");
        break;
       case 0  :
-       proto_tree_add_item(clnp_tree, offset +  6, 1, 
+       proto_tree_add_text(clnp_tree, offset +  6, 1, 
                         "Byte ordering: %s endian",
                         (big_endian) ? "little" : "big");
        break;
@@ -286,7 +285,7 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
        break;
     } /* minor_version */
 
-    proto_tree_add_item(clnp_tree, offset +  7, 1, 
+    proto_tree_add_text(clnp_tree, offset +  7, 1, 
                     "Message type: %s",
                     (header.message_type == Request) ? "Request" :
                     (header.message_type == Reply) ? "Reply" :
@@ -297,7 +296,7 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
                     (header.message_type == MessageError) ? "MessageError" :
                     (header.message_type == Fragment) ? "Fragment" : "?");
 
-    proto_tree_add_item(clnp_tree, offset +  8, 4, 
+    proto_tree_add_text(clnp_tree, offset +  8, 4, 
                     "Message size: %d", message_size);
 
   } /* tree */
@@ -332,12 +331,12 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
        }
 
        if (tree) {
-         proto_tree_add_item(clnp_tree, offset, sizeof(context_id),
+         proto_tree_add_text(clnp_tree, offset, sizeof(context_id),
                           "Context id: %d", context_id);
-         proto_tree_add_item(clnp_tree, offset + sizeof(context_id),
+         proto_tree_add_text(clnp_tree, offset + sizeof(context_id),
                           sizeof(sequence_length),
                           "Sequence length: %d", sequence_length);
-         proto_tree_add_item(clnp_tree,
+         proto_tree_add_text(clnp_tree,
                           offset + 
                           sizeof(context_id) + sizeof(sequence_length),
                           sequence_length,
@@ -367,13 +366,13 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
          request_id = (big_endian)? pntohl(&request_1_1.request_id) :
            pletohl(&request_1_1.request_id);
          if (tree) {
-           proto_tree_add_item(clnp_tree, offset, sizeof(request_id),
+           proto_tree_add_text(clnp_tree, offset, sizeof(request_id),
                             "Request id: %d", request_id);
-           proto_tree_add_item(clnp_tree, offset + sizeof(request_id),
+           proto_tree_add_text(clnp_tree, offset + sizeof(request_id),
                             sizeof(request_1_1.response_expected),
                             "Response expected: %d", 
                             response_expected);
-           proto_tree_add_item(clnp_tree, offset + sizeof(request_id) +
+           proto_tree_add_text(clnp_tree, offset + sizeof(request_id) +
                             sizeof(request_1_1.response_expected),
                             3,
                             "Reserved");
@@ -387,9 +386,9 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
          request_id = (big_endian)? pntohl(&request_1_0.request_id) :
            pletohl(&request_1_0.request_id);
          if (tree) {
-           proto_tree_add_item(clnp_tree, offset, sizeof(request_id),
+           proto_tree_add_text(clnp_tree, offset, sizeof(request_id),
                             "Request id: %d", request_id);
-           proto_tree_add_item(clnp_tree, offset + sizeof(request_id),
+           proto_tree_add_text(clnp_tree, offset + sizeof(request_id),
                             sizeof(request_1_0.response_expected),
                             "Response expected: %d", 
                             response_expected);
@@ -412,9 +411,9 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
        pntohl(&pd[offset]) : pletohl(&pd[offset]);
 
       if (tree) {
-       proto_tree_add_item(clnp_tree, offset, sizeof(sequence_length),
+       proto_tree_add_text(clnp_tree, offset, sizeof(sequence_length),
                         "Object key length: %d", sequence_length);
-       proto_tree_add_item(clnp_tree, offset + sizeof(sequence_length),
+       proto_tree_add_text(clnp_tree, offset + sizeof(sequence_length),
                         sequence_length,
                         "Object key: %s",
                         print_object_key(sequence_length, 
@@ -435,13 +434,13 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
       }
        
       if (tree) {
-       proto_tree_add_item(clnp_tree, offset, sizeof(sequence_length),
+       proto_tree_add_text(clnp_tree, offset, sizeof(sequence_length),
                         "Operation length: %d", sequence_length);
-       proto_tree_add_item(clnp_tree, offset + sizeof(sequence_length), 
+       proto_tree_add_text(clnp_tree, offset + sizeof(sequence_length), 
                         sequence_length,
                         "Operation: %s",
                         &pd[offset+sizeof(sequence_length)]);
-       proto_tree_add_item(clnp_tree, offset +
+       proto_tree_add_text(clnp_tree, offset +
                         sizeof(sequence_length)+ sequence_length,
                         message_size - END_OF_GIOP_MESSAGE - 
                         sizeof(sequence_length) - sequence_length,
@@ -466,9 +465,9 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
        pntohl(&reply.reply_status) : pletohl(&reply.reply_status);
 
       if (tree) {
-       proto_tree_add_item(clnp_tree, offset, sizeof(request_id),
+       proto_tree_add_text(clnp_tree, offset, sizeof(request_id),
                         "Request id: %d", request_id);
-       proto_tree_add_item(clnp_tree, offset + sizeof(request_id), 
+       proto_tree_add_text(clnp_tree, offset + sizeof(request_id), 
                         sizeof(reply_status),
                         "Reply status: %s",
                         reply_status == NO_EXCEPTION ? "no exception" :
@@ -504,9 +503,9 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
        }
 
        if (tree) {
-         proto_tree_add_item(clnp_tree, offset, sizeof(sequence_length),
+         proto_tree_add_text(clnp_tree, offset, sizeof(sequence_length),
                           "Exception length: %d", sequence_length);
-         proto_tree_add_item(clnp_tree, offset + sizeof(sequence_length), 
+         proto_tree_add_text(clnp_tree, offset + sizeof(sequence_length), 
                           sequence_length,
                           "Exception id: %s",
                           &pd[offset+sizeof(sequence_length)]);
@@ -522,9 +521,9 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
          pletohl(&pd[offset+sizeof(minor_code_value)]);
        
        if (tree) {
-         proto_tree_add_item(clnp_tree, offset, sizeof(minor_code_value),
+         proto_tree_add_text(clnp_tree, offset, sizeof(minor_code_value),
                           "Minor code value: %d", minor_code_value);
-         proto_tree_add_item(clnp_tree, offset + sizeof(minor_code_value),
+         proto_tree_add_text(clnp_tree, offset + sizeof(minor_code_value),
                           sizeof(completion_status),
                           "Completion Status: %d",
                           completion_status);
@@ -543,9 +542,9 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
        }
 
        if (tree) {
-         proto_tree_add_item(clnp_tree, offset, sizeof(sequence_length),
+         proto_tree_add_text(clnp_tree, offset, sizeof(sequence_length),
                           "Exception length: %d", sequence_length);
-         proto_tree_add_item(clnp_tree, offset + sizeof(sequence_length), 
+         proto_tree_add_text(clnp_tree, offset + sizeof(sequence_length), 
                           sequence_length,
                           "Exception id: %s",
                           &pd[offset+sizeof(sequence_length)]);
@@ -563,9 +562,9 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
        }
 
        if (tree && sequence_length) {
-         proto_tree_add_item(clnp_tree, offset, sizeof(sequence_length),
+         proto_tree_add_text(clnp_tree, offset, sizeof(sequence_length),
                           "Exception member length: %d", sequence_length);
-         proto_tree_add_item(clnp_tree, offset + sizeof(sequence_length), 
+         proto_tree_add_text(clnp_tree, offset + sizeof(sequence_length), 
                           sequence_length,
                           "Exception member: %s",
                           &pd[offset+sizeof(sequence_length)]);
@@ -577,7 +576,7 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
       else {
        
        if (tree) {
-         proto_tree_add_item(clnp_tree, offset,
+         proto_tree_add_text(clnp_tree, offset,
                           message_size - END_OF_GIOP_MESSAGE,
                           "Reply body: <not shown>");
        }
@@ -597,13 +596,13 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
        pletohl(&pd[offset+sizeof(request_id)]);
 
       if (tree) {
-       proto_tree_add_item(clnp_tree, offset, sizeof(request_id),
+       proto_tree_add_text(clnp_tree, offset, sizeof(request_id),
                         "Request id: %d", request_id);
-       proto_tree_add_item(clnp_tree, offset + sizeof(request_id), 
+       proto_tree_add_text(clnp_tree, offset + sizeof(request_id), 
                         sizeof(sequence_length),
                         "Object key length: %d", sequence_length);
        offset += sizeof(request_id) + sizeof(sequence_length);
-       proto_tree_add_item(clnp_tree,
+       proto_tree_add_text(clnp_tree,
                         offset,
                         sequence_length,
                         "Object key: %s", 
@@ -626,14 +625,14 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
        pntohl(&locate_rep.locate_status) : pletohl(&locate_rep.locate_status);
 
       if (tree) {
-       proto_tree_add_item(clnp_tree, offset, sizeof(request_id),
+       proto_tree_add_text(clnp_tree, offset, sizeof(request_id),
                         "Request id: %d", request_id);
-       proto_tree_add_item(clnp_tree, offset + sizeof(request_id), 
+       proto_tree_add_text(clnp_tree, offset + sizeof(request_id), 
                         sizeof(locate_status),
                         "Locate status: %d", locate_status);
        offset += sizeof(request_id) + sizeof(locate_status);
        if (locate_status == OBJECT_FORWARD) {
-         proto_tree_add_item(clnp_tree, offset,
+         proto_tree_add_text(clnp_tree, offset,
                           message_size - END_OF_GIOP_MESSAGE,
                           "Locate reply body: <not shown>");
        }
@@ -655,7 +654,7 @@ void dissect_giop(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
        pntohl(&pd[offset]) : pletohl(&pd[offset]);
 
       if (tree) {
-       proto_tree_add_item(clnp_tree, offset, sizeof(request_id),
+       proto_tree_add_text(clnp_tree, offset, sizeof(request_id),
                         "Request id: %d", request_id);
       }
 
index c03d8ddcbf5b3b7f25e30ff27e23ff804b799119..b56ebdc2a969c33437a75747a2e259facd427b82 100644 (file)
@@ -2,7 +2,7 @@
  * Routines for the Generic Routing Encapsulation (GRE) protocol
  * Brad Robel-Forrest <brad.robel-forrest@watchguard.com>
  *
- * $Id: packet-gre.c,v 1.1 1999/06/11 15:30:37 gram Exp $
+ * $Id: packet-gre.c,v 1.2 1999/07/07 22:51:43 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@unicom.net>
@@ -80,38 +80,36 @@ dissect_gre(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
 
     if (type == GRE_PPP) {
       is_ppp = 1;
-      ti = proto_tree_add_item(tree, offset, calc_len(flags_and_ver, 1),
+      ti = proto_tree_add_text(tree, offset, calc_len(flags_and_ver, 1),
        "Generic Routing Encapsulation (PPP)");
-      gre_tree = proto_tree_new();
-      proto_item_add_subtree(ti, gre_tree, ETT_GRE);
+      gre_tree = proto_item_add_subtree(ti, ETT_GRE);
       add_flags_and_ver(gre_tree, flags_and_ver, offset, 1);
     }
     else {
       is_ppp = 0;
-      ti = proto_tree_add_item(tree, offset, calc_len(flags_and_ver, 1),
+      ti = proto_tree_add_text(tree, offset, calc_len(flags_and_ver, 1),
        "Generic Routing Encapsulation");
-      gre_tree = proto_tree_new();
-      proto_item_add_subtree(ti, gre_tree, ETT_GRE);
+      gre_tree = proto_item_add_subtree(ti, ETT_GRE);
       add_flags_and_ver(gre_tree, flags_and_ver, offset, 0);
     }
 
     offset += sizeof(flags_and_ver);
 
-    proto_tree_add_item(gre_tree, offset, sizeof(type),
+    proto_tree_add_text(gre_tree, offset, sizeof(type),
                        "Protocol Type: %s (%#04x)",
                        val_to_str(type, typevals, "Unknown"), type);
     offset += sizeof(type);    
 
     if (flags_and_ver & GH_B_C || flags_and_ver & GH_B_R) {
       guint16 checksum = pntohs(pd + offset);
-      proto_tree_add_item(gre_tree, offset, sizeof(checksum),
+      proto_tree_add_text(gre_tree, offset, sizeof(checksum),
                          "Checksum: %u", checksum);
       offset += sizeof(checksum);
     }
     
     if (flags_and_ver & GH_B_C || flags_and_ver & GH_B_R) {
       guint16 rtoffset = pntohs(pd + offset);
-      proto_tree_add_item(gre_tree, offset, sizeof(rtoffset),
+      proto_tree_add_text(gre_tree, offset, sizeof(rtoffset),
                          "Offset: %u", rtoffset);
       offset += sizeof(rtoffset);
     }
@@ -122,18 +120,18 @@ dissect_gre(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
        guint16 callid;
        
        paylen = pntohs(pd + offset);
-       proto_tree_add_item(gre_tree, offset, sizeof(paylen),
+       proto_tree_add_text(gre_tree, offset, sizeof(paylen),
                            "Payload length: %u", paylen);
        offset += sizeof(paylen);
 
        callid = pntohs(pd + offset);
-       proto_tree_add_item(gre_tree, offset, sizeof(callid),
+       proto_tree_add_text(gre_tree, offset, sizeof(callid),
                            "Call ID: %u", callid);
        offset += sizeof(callid);
       }
       else {
        guint32 key = pntohl(pd + offset);
-       proto_tree_add_item(gre_tree, offset, sizeof(key),
+       proto_tree_add_text(gre_tree, offset, sizeof(key),
                            "Key: %u", key);
        offset += sizeof(key);
       }
@@ -141,25 +139,25 @@ dissect_gre(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
     
     if (flags_and_ver & GH_B_S) {
       guint32 seqnum = pntohl(pd + offset);
-      proto_tree_add_item(gre_tree, offset, sizeof(seqnum),
+      proto_tree_add_text(gre_tree, offset, sizeof(seqnum),
                          "Sequence number: %u", seqnum);
       offset += sizeof(seqnum);
     }
 
     if (is_ppp && flags_and_ver & GH_P_A) {
       guint32 acknum = pntohl(pd + offset);
-      proto_tree_add_item(gre_tree, offset, sizeof(acknum),
+      proto_tree_add_text(gre_tree, offset, sizeof(acknum),
                          "Acknowledgement number: %u", acknum);
       offset += sizeof(acknum);
     }
 
     if (flags_and_ver & GH_B_R) {
-      proto_tree_add_item(gre_tree, offset, sizeof(guint16),
+      proto_tree_add_text(gre_tree, offset, sizeof(guint16),
                          "Address family: %u", pntohs(pd + offset));
       offset += sizeof(guint16);
-      proto_tree_add_item(gre_tree, offset, 1,
+      proto_tree_add_text(gre_tree, offset, 1,
                          "SRE offset: %u", pd[offset++]);
-      proto_tree_add_item(gre_tree, offset, 1,
+      proto_tree_add_text(gre_tree, offset, 1,
                          "SRE length: %u", pd[offset++]);
     }
 
@@ -193,44 +191,43 @@ add_flags_and_ver(proto_tree *tree, guint16 flags_and_ver, int offset, int is_pp
   proto_tree * fv_tree;
   int          nbits = sizeof(flags_and_ver) * 8;
   
-  ti = proto_tree_add_item(tree, offset, 2, 
+  ti = proto_tree_add_text(tree, offset, 2, 
                           "Flags and version: %#08x", flags_and_ver);
-  fv_tree = proto_tree_new();
-  proto_item_add_subtree(ti, fv_tree, ETT_GRE_FLAGS);
+  fv_tree = proto_item_add_subtree(ti, ETT_GRE_FLAGS);
   
-  proto_tree_add_item(fv_tree, offset, sizeof(flags_and_ver), "%s",
+  proto_tree_add_text(fv_tree, offset, sizeof(flags_and_ver), "%s",
                      decode_boolean_bitfield(flags_and_ver, GH_B_C, nbits,
                                              "Checksum", "No checksum"));
-  proto_tree_add_item(fv_tree, offset, sizeof(flags_and_ver), "%s",
+  proto_tree_add_text(fv_tree, offset, sizeof(flags_and_ver), "%s",
                      decode_boolean_bitfield(flags_and_ver, GH_B_R, nbits,
                                              "Routing", "No routing"));
-  proto_tree_add_item(fv_tree, offset, sizeof(flags_and_ver), "%s",
+  proto_tree_add_text(fv_tree, offset, sizeof(flags_and_ver), "%s",
                      decode_boolean_bitfield(flags_and_ver, GH_B_K, nbits,
                                              "Key", "No key"));
-  proto_tree_add_item(fv_tree, offset, sizeof(flags_and_ver), "%s",
+  proto_tree_add_text(fv_tree, offset, sizeof(flags_and_ver), "%s",
                      decode_boolean_bitfield(flags_and_ver, GH_B_S, nbits,
                                              "Sequence number", "No sequence number"));
-  proto_tree_add_item(fv_tree, offset, sizeof(flags_and_ver), "%s",
+  proto_tree_add_text(fv_tree, offset, sizeof(flags_and_ver), "%s",
                      decode_boolean_bitfield(flags_and_ver, GH_B_s, nbits,
                                              "Strict source route", "No strict source route"));
-  proto_tree_add_item(fv_tree, offset, sizeof(flags_and_ver), "%s",
+  proto_tree_add_text(fv_tree, offset, sizeof(flags_and_ver), "%s",
                      decode_numeric_bitfield(flags_and_ver, GH_B_RECUR, nbits,
                                              "Recursion control: %u"));
   if (is_ppp) {
-    proto_tree_add_item(fv_tree, offset, sizeof(flags_and_ver), "%s",
+    proto_tree_add_text(fv_tree, offset, sizeof(flags_and_ver), "%s",
                        decode_boolean_bitfield(flags_and_ver, GH_P_A, nbits,
                                                "Acknowledgment number", "No acknowledgment number"));
-    proto_tree_add_item(fv_tree, offset, sizeof(flags_and_ver), "%s",
+    proto_tree_add_text(fv_tree, offset, sizeof(flags_and_ver), "%s",
                        decode_numeric_bitfield(flags_and_ver, GH_P_FLAGS, nbits,
                                                "Flags: %u"));
   }
   else {
-    proto_tree_add_item(fv_tree, offset, sizeof(flags_and_ver), "%s",
+    proto_tree_add_text(fv_tree, offset, sizeof(flags_and_ver), "%s",
                        decode_numeric_bitfield(flags_and_ver, GH_R_FLAGS, nbits,
                                                "Flags: %u"));
   }
 
-  proto_tree_add_item(fv_tree, offset, sizeof(flags_and_ver), "%s",
+  proto_tree_add_text(fv_tree, offset, sizeof(flags_and_ver), "%s",
                      decode_numeric_bitfield(flags_and_ver, GH_B_VER, nbits,
                                              "Version: %u"));
  }
index b229c7ae89ca3b87492ebceda77eae9d9d86f4c6..53c7fac1a9cacb508e065738bf63e74a1ad9dded 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Guy Harris <guy@netapp.com>
  *
- * $Id: packet-http.c,v 1.3 1999/03/30 04:41:01 guy Exp $
+ * $Id: packet-http.c,v 1.4 1999/07/07 22:51:43 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -70,10 +70,9 @@ void dissect_http(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
        }
 
        if (tree) {
-               ti = proto_tree_add_item(tree, offset, END_OF_FRAME,
+               ti = proto_tree_add_text(tree, offset, END_OF_FRAME,
                  "Hypertext Transfer Protocol");
-               http_tree = proto_tree_new();
-               proto_item_add_subtree(ti, http_tree, ETT_HTTP);
+               http_tree = proto_item_add_subtree(ti, ETT_HTTP);
 
                while (data < dataend) {
                        /*
@@ -160,14 +159,14 @@ void dissect_http(const u_char *pd, int offset, frame_data *fd, proto_tree *tree
                        /*
                         * Put this line.
                         */
-                       proto_tree_add_item(http_tree, offset, linelen, "%s",
+                       proto_tree_add_text(http_tree, offset, linelen, "%s",
                            format_text(data, linelen));
                        offset += linelen;
                        data = lineend;
                }
 
                if (data < dataend) {
-                       proto_tree_add_item(http_tree, offset, END_OF_FRAME,
+                       proto_tree_add_text(http_tree, offset, END_OF_FRAME,
                            "Data (%d bytes)", END_OF_FRAME);
                }
        }
index b34186b270d330cff8ba574d458c9834a7f3eccd..182522ebf31fde18688b5d93c5c5a6b168b9721b 100644 (file)
@@ -1,7 +1,7 @@
 /* packet-icmpv6.c
  * Routines for ICMPv6 packet disassembly 
  *
- * $Id: packet-icmpv6.c,v 1.2 1999/03/29 02:24:29 gram Exp $
+ * $Id: packet-icmpv6.c,v 1.3 1999/07/07 22:51:44 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
@@ -79,9 +79,8 @@ again:
     len = opt->nd_opt_len << 3;
 
     /* !!! specify length */
-    ti = proto_tree_add_item(tree, offset, len, "ICMPv6 options");
-    icmp6opt_tree = proto_tree_new();
-    proto_item_add_subtree(ti, icmp6opt_tree, ETT_ICMPv6OPT);
+    ti = proto_tree_add_text(tree, offset, len, "ICMPv6 options");
+    icmp6opt_tree = proto_item_add_subtree(ti, ETT_ICMPv6OPT);
 
     switch (opt->nd_opt_type) {
     case ND_OPT_SOURCE_LINKADDR:
@@ -104,10 +103,10 @@ again:
        break;
     }
 
-    proto_tree_add_item(icmp6opt_tree,
+    proto_tree_add_text(icmp6opt_tree,
        offset + offsetof(struct nd_opt_hdr, nd_opt_type), 1,
        "Type: 0x%02x (%s)", opt->nd_opt_type, typename);
-    proto_tree_add_item(icmp6opt_tree,
+    proto_tree_add_text(icmp6opt_tree,
        offset + offsetof(struct nd_opt_hdr, nd_opt_len), 1,
        "Length: %d bytes (0x%02x)", opt->nd_opt_len << 3, opt->nd_opt_len);
 
@@ -128,7 +127,7 @@ again:
                t[i * 3 - 1] = ':';
            sprintf(&t[i * 3], "%02x", p[i] & 0xff);
        }
-       proto_tree_add_item(icmp6opt_tree,
+       proto_tree_add_text(icmp6opt_tree,
            offset + sizeof(*opt), len, "Link-layer address: %s", t);
        break;
       }
@@ -136,37 +135,36 @@ again:
       {
        struct nd_opt_prefix_info *pi = (struct nd_opt_prefix_info *)opt;
        int flagoff;
-       proto_tree_add_item(icmp6opt_tree,
+       proto_tree_add_text(icmp6opt_tree,
            offset + offsetof(struct nd_opt_prefix_info, nd_opt_pi_prefix_len),
            1, "Prefix length: %d", pi->nd_opt_pi_prefix_len);
 
        flagoff = offsetof(struct nd_opt_prefix_info, nd_opt_pi_flags_reserved);
-       tf = proto_tree_add_item(icmp6opt_tree, flagoff, 1, "Flags: 0x%02x",
+       tf = proto_tree_add_text(icmp6opt_tree, flagoff, 1, "Flags: 0x%02x",
            pntohl(&pi->nd_opt_pi_flags_reserved));
-       field_tree = proto_tree_new();
-       proto_item_add_subtree(tf, field_tree, ETT_ICMPv6FLAG);
-       proto_tree_add_item(field_tree, flagoff, 1, "%s",
+       field_tree = proto_item_add_subtree(tf, ETT_ICMPv6FLAG);
+       proto_tree_add_text(field_tree, flagoff, 1, "%s",
            decode_boolean_bitfield(pi->nd_opt_pi_flags_reserved,
                    0x80, 8, "Onlink", "Not onlink"));
-       proto_tree_add_item(field_tree, flagoff, 1, "%s",
+       proto_tree_add_text(field_tree, flagoff, 1, "%s",
            decode_boolean_bitfield(pi->nd_opt_pi_flags_reserved,
                    0x40, 8, "Auto", "Not auto"));
 
-       proto_tree_add_item(icmp6opt_tree,
+       proto_tree_add_text(icmp6opt_tree,
            offset + offsetof(struct nd_opt_prefix_info, nd_opt_pi_valid_time),
            4, "Valid lifetime: 0x%08x",
            pntohl(&pi->nd_opt_pi_valid_time));
-       proto_tree_add_item(icmp6opt_tree,
+       proto_tree_add_text(icmp6opt_tree,
            offset + offsetof(struct nd_opt_prefix_info, nd_opt_pi_preferred_time),
            4, "Preferred lifetime: 0x%08x",
            pntohl(&pi->nd_opt_pi_preferred_time));
-       proto_tree_add_item(icmp6opt_tree,
+       proto_tree_add_text(icmp6opt_tree,
            offset + offsetof(struct nd_opt_prefix_info, nd_opt_pi_prefix),
            16, "Prefix: %s", ip6_to_str(&pi->nd_opt_pi_prefix));
        break;
       }
     case ND_OPT_REDIRECTED_HEADER:
-       proto_tree_add_item(icmp6opt_tree,
+       proto_tree_add_text(icmp6opt_tree,
            offset + 8, (opt->nd_opt_len << 3) - 8, "Redirected packet");
        /* tiny sanity check */
        if ((pd[offset + 8] & 0xf0) == 0x60)
@@ -177,7 +175,7 @@ again:
     case ND_OPT_MTU:
       {
        struct nd_opt_mtu *pi = (struct nd_opt_mtu *)opt;
-       proto_tree_add_item(icmp6opt_tree,
+       proto_tree_add_text(icmp6opt_tree,
            offset + offsetof(struct nd_opt_mtu, nd_opt_mtu_mtu), 4,
            "MTU: %d", pi->nd_opt_mtu_mtu);
        break;
@@ -332,20 +330,19 @@ dissect_icmpv6(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
 
     if (tree) {
        /* !!! specify length */
-       ti = proto_tree_add_item(tree, offset, len,
+       ti = proto_tree_add_text(tree, offset, len,
            "ICMPv6");
-       icmp6_tree = proto_tree_new();
-       proto_item_add_subtree(ti, icmp6_tree, ETT_ICMPv6);
+       icmp6_tree = proto_item_add_subtree(ti, ETT_ICMPv6);
 
-       proto_tree_add_item(icmp6_tree,
+       proto_tree_add_text(icmp6_tree,
            offset + offsetof(struct icmp6_hdr, icmp6_type), 1,
            "Type: 0x%02x (%s)", dp->icmp6_type, typename);
        if (codename) {
-           proto_tree_add_item(icmp6_tree,
+           proto_tree_add_text(icmp6_tree,
                offset + offsetof(struct icmp6_hdr, icmp6_code), 1,
                "Code: 0x%02x (%s)", dp->icmp6_code, codename);
        }
-       proto_tree_add_item(icmp6_tree,
+       proto_tree_add_text(icmp6_tree,
            offset + offsetof(struct icmp6_hdr, icmp6_cksum), 2,
            "Checksum: 0x%04x", (guint16)htons(dp->icmp6_cksum));
 
@@ -361,7 +358,7 @@ dissect_icmpv6(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
            }
            break;
        case ICMP6_PACKET_TOO_BIG:
-           proto_tree_add_item(icmp6_tree,
+           proto_tree_add_text(icmp6_tree,
                offset + offsetof(struct icmp6_hdr, icmp6_mtu), 4,
                "MTU: %d", pntohl(&dp->icmp6_mtu));
            /* tiny sanity check */
@@ -372,7 +369,7 @@ dissect_icmpv6(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
            }
            break;
        case ICMP6_PARAM_PROB:
-           proto_tree_add_item(icmp6_tree,
+           proto_tree_add_text(icmp6_tree,
                offset + offsetof(struct icmp6_hdr, icmp6_pptr), 4,
                "Problem pointer: 0x%04x", pntohl(&dp->icmp6_pptr));
            /* tiny sanity check */
@@ -384,10 +381,10 @@ dissect_icmpv6(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
            break;
        case ICMP6_ECHO_REQUEST:
        case ICMP6_ECHO_REPLY:
-           proto_tree_add_item(icmp6_tree,
+           proto_tree_add_text(icmp6_tree,
                offset + offsetof(struct icmp6_hdr, icmp6_id), 2,
                "ID: 0x%04x", (guint16)ntohs(dp->icmp6_id));
-           proto_tree_add_item(icmp6_tree,
+           proto_tree_add_text(icmp6_tree,
                offset + offsetof(struct icmp6_hdr, icmp6_seq), 2,
                "Sequence: 0x%04x", (guint16)ntohs(dp->icmp6_seq));
            dissect_data(pd, offset + sizeof(*dp), fd, icmp6_tree);
@@ -395,11 +392,11 @@ dissect_icmpv6(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
        case ICMP6_MEMBERSHIP_QUERY:
        case ICMP6_MEMBERSHIP_REPORT:
        case ICMP6_MEMBERSHIP_REDUCTION:
-           proto_tree_add_item(icmp6_tree,
+           proto_tree_add_text(icmp6_tree,
                offset + offsetof(struct icmp6_hdr, icmp6_maxdelay), 2,
                "Maximum response delay: %d",
                (guint16)ntohs(dp->icmp6_maxdelay));
-           proto_tree_add_item(icmp6_tree, offset + sizeof(*dp), 16,
+           proto_tree_add_text(icmp6_tree, offset + sizeof(*dp), 16,
                "Multicast Address: %s",
                ip6_to_str((struct e_in6_addr *)(dp + 1)));
            break;
@@ -412,30 +409,29 @@ dissect_icmpv6(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
            int flagoff;
            guint32 ra_flags;
 
-           proto_tree_add_item(icmp6_tree,
+           proto_tree_add_text(icmp6_tree,
                offset + offsetof(struct nd_router_advert, nd_ra_curhoplimit),
                1, "Cur hop limit: %d", ra->nd_ra_curhoplimit);
 
            flagoff = offset + offsetof(struct nd_router_advert, nd_ra_flags_reserved);
            ra_flags = pntohl(&pd[flagoff]);
-           tf = proto_tree_add_item(icmp6_tree, flagoff, 4, "Flags: 0x%08x", ra_flags);
-           field_tree = proto_tree_new();
-           proto_item_add_subtree(tf, field_tree, ETT_ICMPv6FLAG);
-           proto_tree_add_item(field_tree, flagoff, 4, "%s",
+           tf = proto_tree_add_text(icmp6_tree, flagoff, 4, "Flags: 0x%08x", ra_flags);
+           field_tree = proto_item_add_subtree(tf, ETT_ICMPv6FLAG);
+           proto_tree_add_text(field_tree, flagoff, 4, "%s",
                decode_boolean_bitfield(ra_flags,
                        0x80000000, 32, "Managed", "Not managed"));
-           proto_tree_add_item(field_tree, flagoff, 4, "%s",
+           proto_tree_add_text(field_tree, flagoff, 4, "%s",
                decode_boolean_bitfield(ra_flags,
                        0x40000000, 32, "Other", "Not other"));
 
-           proto_tree_add_item(icmp6_tree,
+           proto_tree_add_text(icmp6_tree,
                offset + offsetof(struct nd_router_advert, nd_ra_router_lifetime),
                2, "Router lifetime: %d",
                (guint16)ntohs(ra->nd_ra_router_lifetime));
-           proto_tree_add_item(icmp6_tree,
+           proto_tree_add_text(icmp6_tree,
                offset + offsetof(struct nd_router_advert, nd_ra_reachable), 4,
                "Reachable time: %d", pntohl(&ra->nd_ra_reachable));
-           proto_tree_add_item(icmp6_tree,
+           proto_tree_add_text(icmp6_tree,
                offset + offsetof(struct nd_router_advert, nd_ra_retransmit), 4,
                "Retrans time: %d", pntohl(&ra->nd_ra_retransmit));
            dissect_icmpv6opt(pd, offset + sizeof(struct nd_router_advert), fd, icmp6_tree);
@@ -445,7 +441,7 @@ dissect_icmpv6(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
          {
            struct nd_neighbor_solicit *ns = (struct nd_neighbor_solicit *)dp;
 
-           proto_tree_add_item(icmp6_tree,
+           proto_tree_add_text(icmp6_tree,
                        offset + offsetof(struct nd_neighbor_solicit, nd_ns_target), 16,
 #ifdef INET6
                        "Target: %s (%s)",
@@ -467,22 +463,21 @@ dissect_icmpv6(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
            flagoff = offset + offsetof(struct nd_neighbor_advert, nd_na_flags_reserved);
            na_flags = pntohl(&pd[flagoff]);
 
-           tf = proto_tree_add_item(icmp6_tree, flagoff, 4, "Flags: 0x%08x", na_flags);
-           field_tree = proto_tree_new();
-           proto_item_add_subtree(tf, field_tree, ETT_ICMPv6FLAG);
-           proto_tree_add_item(field_tree, flagoff, 4, "%s",
+           tf = proto_tree_add_text(icmp6_tree, flagoff, 4, "Flags: 0x%08x", na_flags);
+           field_tree = proto_item_add_subtree(tf, ETT_ICMPv6FLAG);
+           proto_tree_add_text(field_tree, flagoff, 4, "%s",
                decode_boolean_bitfield(na_flags,
                        0x80000000, 32, "Router", "Not router"));
-           proto_tree_add_item(field_tree, flagoff, 4, "%s",
+           proto_tree_add_text(field_tree, flagoff, 4, "%s",
                decode_boolean_bitfield(na_flags,
                        0x40000000, 32, "Solicited", "Not adverted"));
-           proto_tree_add_item(field_tree, flagoff, 4, "%s",
+           proto_tree_add_text(field_tree, flagoff, 4, "%s",
                decode_boolean_bitfield(na_flags,
                        0x20000000, 32, "Override", "Not override"));
 
                targetoff = offset + offsetof(struct nd_neighbor_advert, nd_na_target);
            na_target_p = (struct e_in6_addr*) &pd[targetoff];
-           proto_tree_add_item(icmp6_tree, targetoff, 16,
+           proto_tree_add_text(icmp6_tree, targetoff, 16,
 #ifdef INET6
                        "Target: %s (%s)",
                        get_hostname6(na_target_p),
@@ -498,7 +493,7 @@ dissect_icmpv6(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
          {
            struct nd_redirect *rd = (struct nd_redirect *)dp;
 
-           proto_tree_add_item(icmp6_tree,
+           proto_tree_add_text(icmp6_tree,
                        offset + offsetof(struct nd_redirect, nd_rd_target), 16,
 #ifdef INET6
                        "Target: %s (%s)",
@@ -508,7 +503,7 @@ dissect_icmpv6(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
 #endif
                        ip6_to_str(&rd->nd_rd_target));
 
-           proto_tree_add_item(icmp6_tree,
+           proto_tree_add_text(icmp6_tree,
                        offset + offsetof(struct nd_redirect, nd_rd_dst), 16,
 #ifdef INET6
                        "Destination: %s (%s)",
@@ -525,36 +520,35 @@ dissect_icmpv6(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
          {
            struct icmp6_router_renum *rr = (struct icmp6_router_renum *)dp;
            int flagoff;
-           proto_tree_add_item(icmp6_tree,
+           proto_tree_add_text(icmp6_tree,
                offset + offsetof(struct icmp6_router_renum, rr_seqnum), 4,
                /*"Sequence number: 0x%08x", (u_int32_t)htonl(rr->rr_seqnum));*/
                "Sequence number: 0x%08x", pntohl(&rr->rr_seqnum));
-           proto_tree_add_item(icmp6_tree,
+           proto_tree_add_text(icmp6_tree,
                offset + offsetof(struct icmp6_router_renum, rr_segnum), 1,
                "Segment number: 0x%02x", rr->rr_segnum);
 
            flagoff = offset + offsetof(struct icmp6_router_renum, rr_segnum) + 1;
-           tf = proto_tree_add_item(icmp6_tree, flagoff, 4, "Flags: 0x%08x",
+           tf = proto_tree_add_text(icmp6_tree, flagoff, 4, "Flags: 0x%08x",
                pd[flagoff]);
-           field_tree = proto_tree_new();
-           proto_item_add_subtree(tf, field_tree, ETT_ICMPv6FLAG);
-           proto_tree_add_item(field_tree, flagoff, 1, "%s",
+           field_tree = proto_item_add_subtree(tf, ETT_ICMPv6FLAG);
+           proto_tree_add_text(field_tree, flagoff, 1, "%s",
                decode_boolean_bitfield(pd[flagoff], 0x80, 8,
                    "Test command", "Not test command"));
-           proto_tree_add_item(field_tree, flagoff, 1, "%s",
+           proto_tree_add_text(field_tree, flagoff, 1, "%s",
                decode_boolean_bitfield(pd[flagoff], 0x40, 8,
                    "Result requested", "Result not requested"));
-           proto_tree_add_item(field_tree, flagoff, 1, "%s",
+           proto_tree_add_text(field_tree, flagoff, 1, "%s",
                decode_boolean_bitfield(pd[flagoff], 0x20, 8,
                    "All interfaces", "Not all interfaces"));
-           proto_tree_add_item(field_tree, flagoff, 1, "%s",
+           proto_tree_add_text(field_tree, flagoff, 1, "%s",
                decode_boolean_bitfield(pd[flagoff], 0x10, 8,
                    "Site specific", "Not site specific"));
-           proto_tree_add_item(field_tree, flagoff, 1, "%s",
+           proto_tree_add_text(field_tree, flagoff, 1, "%s",
                decode_boolean_bitfield(pd[flagoff], 0x08, 8,
                    "Processed previously", "Complete result"));
 
-           proto_tree_add_item(icmp6_tree,
+           proto_tree_add_text(icmp6_tree,
                offset + offsetof(struct icmp6_router_renum, rr_segnum), 2,
                "Max delay: 0x%04x", pntohs(&rr->rr_maxdelay));
            dissect_data(pd, offset + sizeof(*rr), fd, tree);   /*XXX*/
index 67574c3f1821083d6d3bfeb25ed3bba8d9c7659e..3d7585ff84ad1d1f65798e6e8af43f76472ef672 100644 (file)
@@ -1,7 +1,7 @@
 /* packet-ip.c
  * Routines for IP and miscellaneous IP protocol packet disassembly
  *
- * $Id: packet-ip.c,v 1.26 1999/06/21 16:20:18 gram Exp $
+ * $Id: packet-ip.c,v 1.27 1999/07/07 22:51:44 gram Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
 #endif
 
 extern packet_info pi;
+       
+int proto_ip = -1;
+int hf_ip_version = -1;
+int hf_ip_hdr_len = -1;
+int hf_ip_tos = -1;
+int hf_ip_tos_precedence = -1;
+int hf_ip_dst = -1;
+int hf_ip_src = -1;
 
 /* ICMP structs and definitions */
 typedef struct _e_icmp {
@@ -236,29 +244,28 @@ dissect_ipopt_security(proto_tree *opt_tree, const char *name,
     {IPSEC_RESERVED8,    "Reserved"    },
     {0,                  NULL          } };
 
-  tf = proto_tree_add_item(opt_tree, offset,      optlen, "%s:", name);
-  field_tree = proto_tree_new();
-  proto_item_add_subtree(tf, field_tree, ETT_IP_OPTION_SEC);
+  tf = proto_tree_add_text(opt_tree, offset,      optlen, "%s:", name);
+  field_tree = proto_item_add_subtree(tf, ETT_IP_OPTION_SEC);
   offset += 2;
 
   val = pntohs(opd);
-  proto_tree_add_item(field_tree, offset,       2,
+  proto_tree_add_text(field_tree, offset,       2,
               "Security: %s", val_to_str(val, secl_vals, "Unknown (0x%x)"));
   offset += 2;
   opd += 2;
 
   val = pntohs(opd);
-  proto_tree_add_item(field_tree, offset,         2,
+  proto_tree_add_text(field_tree, offset,         2,
               "Compartments: %d", val);
   offset += 2;
   opd += 2;
 
-  proto_tree_add_item(field_tree, offset,         2,
+  proto_tree_add_text(field_tree, offset,         2,
               "Handling restrictions: %c%c", opd[0], opd[1]);
   offset += 2;
   opd += 2;
 
-  proto_tree_add_item(field_tree, offset,         3,
+  proto_tree_add_text(field_tree, offset,         3,
               "Transmission control code: %c%c%c", opd[0], opd[1], opd[2]);
 }
 
@@ -272,16 +279,15 @@ dissect_ipopt_route(proto_tree *opt_tree, const char *name,
   int optoffset = 0;
   struct in_addr addr;
 
-  tf = proto_tree_add_item(opt_tree, offset,      optlen, "%s (%d bytes)", name,
+  tf = proto_tree_add_text(opt_tree, offset,      optlen, "%s (%d bytes)", name,
               optlen);
-  field_tree = proto_tree_new();
-  proto_item_add_subtree(tf, field_tree, ETT_IP_OPTION_ROUTE);
+  field_tree = proto_item_add_subtree(tf, ETT_IP_OPTION_ROUTE);
 
   optoffset += 2;      /* skip past type and length */
   optlen -= 2;         /* subtract size of type and length */
 
   ptr = *opd;
-  proto_tree_add_item(field_tree, offset + optoffset, 1,
+  proto_tree_add_text(field_tree, offset + optoffset, 1,
               "Pointer: %d%s", ptr,
               ((ptr < 4) ? " (points before first address)" :
                ((ptr & 3) ? " (points to middle of address)" : "")));
@@ -292,7 +298,7 @@ dissect_ipopt_route(proto_tree *opt_tree, const char *name,
 
   while (optlen > 0) {
     if (optlen < 4) {
-      proto_tree_add_item(field_tree, offset,      optlen,
+      proto_tree_add_text(field_tree, offset,      optlen,
         "(suboption would go past end of option)");
       break;
     }
@@ -300,7 +306,7 @@ dissect_ipopt_route(proto_tree *opt_tree, const char *name,
     /* Avoids alignment problems on many architectures. */
     memcpy((char *)&addr, (char *)opd, sizeof(addr));
 
-    proto_tree_add_item(field_tree, offset + optoffset, 4,
+    proto_tree_add_text(field_tree, offset + optoffset, 4,
               "%s%s",
               ((addr.s_addr == 0) ? "-" : (char *)get_hostname(addr.s_addr)),
               ((optoffset == ptr) ? " <- (current)" : ""));
@@ -314,7 +320,7 @@ static void
 dissect_ipopt_sid(proto_tree *opt_tree, const char *name, const u_char *opd,
     int offset, guint optlen)
 {
-  proto_tree_add_item(opt_tree, offset,      optlen,
+  proto_tree_add_text(opt_tree, offset,      optlen,
     "%s: %d", name, pntohs(opd));
   return;
 }
@@ -337,15 +343,14 @@ dissect_ipopt_timestamp(proto_tree *opt_tree, const char *name, const u_char *op
   struct in_addr addr;
   guint ts;
 
-  tf = proto_tree_add_item(opt_tree, offset,      optlen, "%s:", name);
-  field_tree = proto_tree_new();
-  proto_item_add_subtree(tf, field_tree, ETT_IP_OPTION_TIMESTAMP);
+  tf = proto_tree_add_text(opt_tree, offset,      optlen, "%s:", name);
+  field_tree = proto_item_add_subtree(tf, ETT_IP_OPTION_TIMESTAMP);
 
   optoffset += 2;      /* skip past type and length */
   optlen -= 2;         /* subtract size of type and length */
 
   ptr = *opd;
-  proto_tree_add_item(field_tree, offset + optoffset, 1,
+  proto_tree_add_text(field_tree, offset + optoffset, 1,
               "Pointer: %d%s", ptr,
               ((ptr < 5) ? " (points before first address)" :
                (((ptr - 1) & 3) ? " (points to middle of address)" : "")));
@@ -355,10 +360,10 @@ dissect_ipopt_timestamp(proto_tree *opt_tree, const char *name, const u_char *op
   ptr--;       /* ptr is 1-origin */
 
   flg = *opd;
-  proto_tree_add_item(field_tree, offset + optoffset,   1,
+  proto_tree_add_text(field_tree, offset + optoffset,   1,
         "Overflow: %d", flg >> 4);
   flg &= 0xF;
-  proto_tree_add_item(field_tree, offset + optoffset, 1,
+  proto_tree_add_text(field_tree, offset + optoffset, 1,
         "Flag: %s", val_to_str(flg, flag_vals, "Unknown (0x%x)"));
   optoffset++;
   opd++;
@@ -367,7 +372,7 @@ dissect_ipopt_timestamp(proto_tree *opt_tree, const char *name, const u_char *op
   while (optlen > 0) {
     if (flg == IPOPT_TS_TSANDADDR) {
       if (optlen < 4) {
-        proto_tree_add_item(field_tree, offset + optoffset, optlen,
+        proto_tree_add_text(field_tree, offset + optoffset, optlen,
           "(suboption would go past end of option)");
         break;
       }
@@ -376,7 +381,7 @@ dissect_ipopt_timestamp(proto_tree *opt_tree, const char *name, const u_char *op
       opd += 4;
       optlen -= 4;
       if (optlen < 4) {
-        proto_tree_add_item(field_tree, offset + optoffset, optlen,
+        proto_tree_add_text(field_tree, offset + optoffset, optlen,
           "(suboption would go past end of option)");
         break;
       }
@@ -384,14 +389,14 @@ dissect_ipopt_timestamp(proto_tree *opt_tree, const char *name, const u_char *op
       memcpy((char *)&addr, (char *)opd, sizeof(addr));
       opd += 4;
       optlen -= 4;
-      proto_tree_add_item(field_tree, offset,      8,
+      proto_tree_add_text(field_tree, offset,      8,
           "Address = %s, time stamp = %u",
           ((addr.s_addr == 0) ? "-" :  (char *)get_hostname(addr.s_addr)),
           ts);
       optoffset += 8;
     } else {
       if (optlen < 4) {
-        proto_tree_add_item(field_tree, offset + optoffset, optlen,
+        proto_tree_add_text(field_tree, offset + optoffset, optlen,
           "(suboption would go past end of option)");
         break;
       }
@@ -399,7 +404,7 @@ dissect_ipopt_timestamp(proto_tree *opt_tree, const char *name, const u_char *op
       ts = pntohl(opd);
       opd += 4;
       optlen -= 4;
-      proto_tree_add_item(field_tree, offset + optoffset, 4,
+      proto_tree_add_text(field_tree, offset + optoffset, 4,
           "Time stamp = %u", ts);
       optoffset += 4;
     }
@@ -483,7 +488,7 @@ dissect_ip_tcp_options(proto_tree *opt_tree, const u_char *opd, int offset,
         break;
     }
     if (optp == &opttab[nopts]) {
-      proto_tree_add_item(opt_tree, offset,      1, "Unknown");
+      proto_tree_add_text(opt_tree, offset,      1, "Unknown");
       /* We don't know how long this option is, so we don't know how much
          of it to skip, so we just bail. */
       return;
@@ -494,7 +499,7 @@ dissect_ip_tcp_options(proto_tree *opt_tree, const u_char *opd, int offset,
       if (length == 0) {
         /* Bogus - packet must at least include option code byte and
            length byte! */
-        proto_tree_add_item(opt_tree, offset,      1,
+        proto_tree_add_text(opt_tree, offset,      1,
               "%s (length byte past end of header)", optp->name);
         return;
       }
@@ -503,25 +508,25 @@ dissect_ip_tcp_options(proto_tree *opt_tree, const u_char *opd, int offset,
       if (len < 2) {
         /* Bogus - option length is too short to include option code and
            option length. */
-        proto_tree_add_item(opt_tree, offset,      2,
+        proto_tree_add_text(opt_tree, offset,      2,
               "%s (with too-short option length = %u bytes)", optp->name, 2);
         return;
       } else if (len - 2 > length) {
         /* Bogus - option goes past the end of the header. */
-        proto_tree_add_item(opt_tree, offset,      length,
+        proto_tree_add_text(opt_tree, offset,      length,
               "%s (option goes past end of header)", optp->name);
         return;
       } else if (optp->len_type == FIXED_LENGTH && len != optp->optlen) {
         /* Bogus - option length isn't what it's supposed to be for this
            option. */
-        proto_tree_add_item(opt_tree, offset,      len,
+        proto_tree_add_text(opt_tree, offset,      len,
               "%s (with option length = %u bytes; should be %u)", optp->name,
               len, optp->optlen);
         return;
       } else if (optp->len_type == VARIABLE_LENGTH && len < optp->optlen) {
         /* Bogus - option length is less than what it's supposed to be for
            this option. */
-        proto_tree_add_item(opt_tree, offset,      len,
+        proto_tree_add_text(opt_tree, offset,      len,
               "%s (with option length = %u bytes; should be >= %u)", optp->name,
               len, optp->optlen);
         return;
@@ -531,7 +536,7 @@ dissect_ip_tcp_options(proto_tree *opt_tree, const u_char *opd, int offset,
           (*optp->dissect)(opt_tree, optp->name, opd, offset, len);
         } else {
           /* Option has no data, hence no dissector. */
-          proto_tree_add_item(opt_tree, offset,      len, "%s", optp->name);
+          proto_tree_add_text(opt_tree, offset,      len, "%s", optp->name);
         }
         len -= 2;      /* subtract size of type and length */
         offset += 2 + len;
@@ -539,7 +544,7 @@ dissect_ip_tcp_options(proto_tree *opt_tree, const u_char *opd, int offset,
       opd += len;
       length -= len;
     } else {
-      proto_tree_add_item(opt_tree, offset,      1, "%s", optp->name);
+      proto_tree_add_text(opt_tree, offset,      1, "%s", optp->name);
       offset += 1;
     }
     if (opt == eol)
@@ -547,20 +552,14 @@ dissect_ip_tcp_options(proto_tree *opt_tree, const u_char *opd, int offset,
   }
 }
 
-void
-dissect_ip(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
-  e_ip       iph;
-  proto_tree *ip_tree, *field_tree;
-  proto_item *ti, *tf;
-  gchar      tos_str[32];
-  guint      hlen, optlen;
-  static const value_string proto_vals[] = { {IP_PROTO_ICMP, "ICMP"},
-                                             {IP_PROTO_IGMP, "IGMP"},
-                                             {IP_PROTO_TCP,  "TCP" },
-                                             {IP_PROTO_UDP,  "UDP" },
-                                             {IP_PROTO_OSPF, "OSPF"},
-                                             {0,             NULL  } };
-  static const value_string precedence_vals[] = {
+static const value_string proto_vals[] = { {IP_PROTO_ICMP, "ICMP"},
+                                           {IP_PROTO_IGMP, "IGMP"},
+                                           {IP_PROTO_TCP,  "TCP" },
+                                           {IP_PROTO_UDP,  "UDP" },
+                                           {IP_PROTO_OSPF, "OSPF"},
+                                           {0,             NULL  } };
+
+static const value_string precedence_vals[] = {
                  { IPTOS_PREC_ROUTINE,         "routine"              },
                  { IPTOS_PREC_PRIORITY,        "priority"             },
                  { IPTOS_PREC_IMMEDIATE,       "immediate"            },
@@ -570,6 +569,24 @@ dissect_ip(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
                  { IPTOS_PREC_INTERNETCONTROL, "internetwork control" },
                  { IPTOS_PREC_NETCONTROL,      "network control"      },
                  { 0,                          NULL                   } };
+
+static const value_string iptos_vals[] = {
+       { IPTOS_NONE,           "None" },
+       { IPTOS_LOWCOST,        "Minimize cost" },
+       { IPTOS_RELIABILITY,    "Maximize reliability" },
+       { IPTOS_THROUGHPUT,     "Maximize throughput" },
+       { IPTOS_LOWDELAY,       "Minimize delay" },
+       { IPTOS_SECURITY,       "Maximize security" },
+       { 0,                    NULL }
+};
+
+void
+dissect_ip(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
+  e_ip       iph;
+  proto_tree *ip_tree, *field_tree;
+  proto_item *ti, *tf;
+  gchar      tos_str[32];
+  guint      hlen, optlen;
   int advance;
   guint8 nxt;
 
@@ -637,68 +654,65 @@ dissect_ip(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
         break;
     }
 
-    ti = proto_tree_add_item(tree, offset, hlen, "Internet Protocol");
-    ip_tree = proto_tree_new();
-    proto_item_add_subtree(ti, ip_tree, ETT_IP);
-    proto_tree_add_item(ip_tree, offset,      1, "Version: %d", hi_nibble(iph.ip_v_hl));
-    proto_tree_add_item(ip_tree, offset,      1, "Header length: %d bytes", hlen); 
-    tf = proto_tree_add_item(ip_tree, offset +  1, 1, "Type of service: 0x%02x (%s)",
-      iph.ip_tos, tos_str);
-    field_tree = proto_tree_new();
-    proto_item_add_subtree(tf, field_tree, ETT_IP_TOS);
-    proto_tree_add_item(field_tree, offset + 1, 1, "%s",
-       decode_enumerated_bitfield(iph.ip_tos, IPTOS_PREC_MASK,
-                                   sizeof (iph.ip_tos)*8, precedence_vals,
-                                   "%s precedence"));
-    proto_tree_add_item(field_tree, offset + 1, 1, "%s",
+    ti = proto_tree_add_item(tree, proto_ip, offset, hlen, NULL);
+    ip_tree = proto_item_add_subtree(ti, ETT_IP);
+
+    proto_tree_add_item(ip_tree, hf_ip_version, offset, 1, hi_nibble(iph.ip_v_hl));
+    proto_tree_add_item_format(ip_tree, hf_ip_hdr_len, offset, 1, hlen,
+       "Header length: %d bytes", hlen); 
+    tf = proto_tree_add_item_format(ip_tree, hf_ip_tos, offset + 1, 1, iph.ip_tos,
+       "Type of service: 0x%02x (%s)", iph.ip_tos,
+       val_to_str( IPTOS_TOS(iph.ip_tos), iptos_vals, "Unknown") );
+
+    field_tree = proto_item_add_subtree(tf, ETT_IP_TOS);
+    proto_tree_add_item_format(field_tree, hf_ip_tos_precedence, offset + 1, 1,
+       iph.ip_tos & IPTOS_PREC_MASK, decode_enumerated_bitfield(iph.ip_tos, IPTOS_PREC_MASK,
+                          sizeof (iph.ip_tos)*8, precedence_vals, "%s precedence"));
+
+    proto_tree_add_text(field_tree, offset + 1, 1, "%s",
        decode_boolean_bitfield(iph.ip_tos, IPTOS_LOWDELAY,
                 sizeof (iph.ip_tos)*8, "low delay", "normal delay"));
-    proto_tree_add_item(field_tree, offset + 1, 1, "%s",
+    proto_tree_add_text(field_tree, offset + 1, 1, "%s",
        decode_boolean_bitfield(iph.ip_tos, IPTOS_THROUGHPUT,
             sizeof (iph.ip_tos)*8, "high throughput", "normal throughput"));
-    proto_tree_add_item(field_tree, offset + 1, 1, "%s",
+    proto_tree_add_text(field_tree, offset + 1, 1, "%s",
        decode_boolean_bitfield(iph.ip_tos, IPTOS_RELIABILITY,
             sizeof (iph.ip_tos)*8, "high reliability", "normal reliability"));
-    proto_tree_add_item(field_tree, offset + 1, 1, "%s",
+    proto_tree_add_text(field_tree, offset + 1, 1, "%s",
        decode_boolean_bitfield(iph.ip_tos, IPTOS_LOWCOST,
             sizeof (iph.ip_tos)*8, "low cost", "normal cost"));
-    proto_tree_add_item(ip_tree, offset +  2, 2, "Total length: %d", iph.ip_len);
-    proto_tree_add_item(ip_tree, offset +  4, 2, "Identification: 0x%04x",
+    proto_tree_add_text(ip_tree, offset +  2, 2, "Total length: %d", iph.ip_len);
+    proto_tree_add_text(ip_tree, offset +  4, 2, "Identification: 0x%04x",
       iph.ip_id);
-    tf = proto_tree_add_item(ip_tree, offset +  6, 2, "Flags: 0x%x",
+    tf = proto_tree_add_text(ip_tree, offset +  6, 2, "Flags: 0x%x",
       (iph.ip_off & (IP_DF|IP_MF)) >> 12);
-    field_tree = proto_tree_new();
-    proto_item_add_subtree(tf, field_tree, ETT_IP_OFF);
-    proto_tree_add_item(field_tree, offset + 6, 2, "%s",
+    field_tree = proto_item_add_subtree(tf, ETT_IP_OFF);
+    proto_tree_add_text(field_tree, offset + 6, 2, "%s",
       decode_boolean_bitfield(iph.ip_off >> 8, IP_DF >> 8, 8, "don't fragment",
                                            "may fragment"));
-    proto_tree_add_item(field_tree, offset + 6, 2, "%s",
+    proto_tree_add_text(field_tree, offset + 6, 2, "%s",
       decode_boolean_bitfield(iph.ip_off >> 8, IP_MF >> 8, 8, "more fragments",
                                            "last fragment"));
-    proto_tree_add_item(ip_tree, offset +  6, 2, "Fragment offset: %d",
+    proto_tree_add_text(ip_tree, offset +  6, 2, "Fragment offset: %d",
       iph.ip_off & IP_OFFSET);
-    proto_tree_add_item(ip_tree, offset +  8, 1, "Time to live: %d",
+    proto_tree_add_text(ip_tree, offset +  8, 1, "Time to live: %d",
       iph.ip_ttl);
-    proto_tree_add_item(ip_tree, offset +  9, 1, "Protocol: %s",
+    proto_tree_add_text(ip_tree, offset +  9, 1, "Protocol: %s",
       val_to_str(iph.ip_p, proto_vals, "Unknown (0x%x)"));
-    proto_tree_add_item(ip_tree, offset + 10, 2, "Header checksum: 0x%04x",
+    proto_tree_add_text(ip_tree, offset + 10, 2, "Header checksum: 0x%04x",
       iph.ip_sum);
-    proto_tree_add_item(ip_tree, offset + 12, 4, "Source address: %s (%s)",
-                    get_hostname(iph.ip_src),
-                     ip_to_str((guint8 *) &iph.ip_src));
-    proto_tree_add_item(ip_tree, offset + 16, 4, "Destination address: %s (%s)",
-                    get_hostname(iph.ip_dst),
-                     ip_to_str((guint8 *) &iph.ip_dst));
+
+    proto_tree_add_item(ip_tree, hf_ip_src, offset + 12, 4, iph.ip_src);
+    proto_tree_add_item(ip_tree, hf_ip_dst, offset + 16, 4, iph.ip_dst);
 
     /* Decode IP options, if any. */
     if (hlen > sizeof (e_ip)) {
       /* There's more than just the fixed-length header.  Decode the
          options. */
       optlen = hlen - sizeof (e_ip);   /* length of options, in bytes */
-      tf = proto_tree_add_item(ip_tree, offset +  20, optlen,
+      tf = proto_tree_add_text(ip_tree, offset +  20, optlen,
         "Options: (%d bytes)", optlen);
-      field_tree = proto_tree_new();
-      proto_item_add_subtree(tf, field_tree, ETT_IP_OPTIONS);
+      field_tree = proto_item_add_subtree(tf, ETT_IP_OPTIONS);
       dissect_ip_tcp_options(field_tree, &pd[offset + 20], offset + 20, optlen,
          ipopts, N_IP_OPTS, IPOPT_END);
     }
@@ -882,17 +896,16 @@ dissect_icmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
     col_add_str(fd, COL_PROTOCOL, "ICMP");
   if (check_col(fd, COL_INFO))
     col_add_str(fd, COL_INFO, type_str);
-  
+
   if (tree) {
-    ti = proto_tree_add_item(tree, offset, 4,
+    ti = proto_tree_add_text(tree, offset, 4,
       "Internet Control Message Protocol");
-    icmp_tree = proto_tree_new();
-    proto_item_add_subtree(ti, icmp_tree, ETT_ICMP);
-    proto_tree_add_item(icmp_tree, offset,      1, "Type: %d (%s)",
+    icmp_tree = proto_item_add_subtree(ti, ETT_ICMP);
+    proto_tree_add_text(icmp_tree, offset,      1, "Type: %d (%s)",
       ih.icmp_type, type_str);
-    proto_tree_add_item(icmp_tree, offset +  1, 1, "Code: %d %s",
+    proto_tree_add_text(icmp_tree, offset +  1, 1, "Code: %d %s",
       ih.icmp_code, code_str);
-    proto_tree_add_item(icmp_tree, offset +  2, 2, "Checksum: 0x%04x",
+    proto_tree_add_text(icmp_tree, offset +  2, 2, "Checksum: 0x%04x",
       ih.icmp_cksum);
 
     /* Decode the second 4 bytes of the packet. */
@@ -905,30 +918,30 @@ dissect_icmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
       case ICMP_IREQREPLY:
       case ICMP_MASKREQ:
       case ICMP_MASKREPLY:
-       proto_tree_add_item(icmp_tree, offset +  4, 2, "Identifier: 0x%04x",
+       proto_tree_add_text(icmp_tree, offset +  4, 2, "Identifier: 0x%04x",
          pntohs(&pd[offset +  4]));
-       proto_tree_add_item(icmp_tree, offset +  6, 2, "Sequence number: %u",
+       proto_tree_add_text(icmp_tree, offset +  6, 2, "Sequence number: %u",
          pntohs(&pd[offset +  6]));
        break;
 
       case ICMP_RTRADVERT:
         num_addrs = pd[offset + 4];
-       proto_tree_add_item(icmp_tree, offset +  4, 1, "Number of addresses: %u",
+       proto_tree_add_text(icmp_tree, offset +  4, 1, "Number of addresses: %u",
          num_addrs);
        addr_entry_size = pd[offset + 5];
-       proto_tree_add_item(icmp_tree, offset +  5, 1, "Address entry size: %u",
+       proto_tree_add_text(icmp_tree, offset +  5, 1, "Address entry size: %u",
          addr_entry_size);
-       proto_tree_add_item(icmp_tree, offset +  6, 2, "Lifetime: %s",
+       proto_tree_add_text(icmp_tree, offset +  6, 2, "Lifetime: %s",
          time_secs_to_str(pntohs(&pd[offset +  6])));
        break;
 
       case ICMP_PARAMPROB:
-       proto_tree_add_item(icmp_tree, offset +  4, 1, "Pointer: %u",
+       proto_tree_add_text(icmp_tree, offset +  4, 1, "Pointer: %u",
          pd[offset +  4]);
        break;
 
       case ICMP_REDIRECT:
-       proto_tree_add_item(icmp_tree, offset +  4, 4, "Gateway address: %s",
+       proto_tree_add_text(icmp_tree, offset +  4, 4, "Gateway address: %s",
          ip_to_str((guint8 *)&pd[offset +  4]));
        break;
     }
@@ -956,10 +969,10 @@ dissect_icmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
       case ICMP_RTRADVERT:
         if (addr_entry_size == 2) {
          for (i = 0; i < num_addrs; i++) {
-           proto_tree_add_item(icmp_tree, offset + 8 + (i*8), 4,
+           proto_tree_add_text(icmp_tree, offset + 8 + (i*8), 4,
              "Router address: %s",
              ip_to_str((guint8 *)&pd[offset +  8 + (i*8)]));
-           proto_tree_add_item(icmp_tree, offset + 12 + (i*8), 4,
+           proto_tree_add_text(icmp_tree, offset + 12 + (i*8), 4,
              "Preference level: %d", pntohl(&pd[offset + 12 + (i*8)]));
          }
        } else
@@ -968,19 +981,19 @@ dissect_icmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
 
       case ICMP_TSTAMP:
       case ICMP_TSTAMPREPLY:
-       proto_tree_add_item(icmp_tree, offset +  8, 4, "Originate timestamp: %u",
+       proto_tree_add_text(icmp_tree, offset +  8, 4, "Originate timestamp: %u",
          pntohl(&pd[offset +  8]));
-       proto_tree_add_item(icmp_tree, offset + 12, 4, "Originate timestamp: %u",
+       proto_tree_add_text(icmp_tree, offset + 12, 4, "Originate timestamp: %u",
          pntohl(&pd[offset + 12]));
-       proto_tree_add_item(icmp_tree, offset + 16, 4, "Receive timestamp: %u",
+       proto_tree_add_text(icmp_tree, offset + 16, 4, "Receive timestamp: %u",
          pntohl(&pd[offset + 16]));
-       proto_tree_add_item(icmp_tree, offset + 20, 4, "Transmit timestamp: %u",
+       proto_tree_add_text(icmp_tree, offset + 20, 4, "Transmit timestamp: %u",
          pntohl(&pd[offset + 20]));
        break;
 
     case ICMP_MASKREQ:
     case ICMP_MASKREPLY:
-       proto_tree_add_item(icmp_tree, offset +  8, 4, "Address mask: %s (0x%8x)",
+       proto_tree_add_text(icmp_tree, offset +  8, 4, "Address mask: %s (0x%8x)",
          ip_to_str((guint8 *)&pd[offset +  8]), pntohl(&pd[offset +  8]));
        break;
     }
@@ -1033,21 +1046,69 @@ dissect_igmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
     col_add_str(fd, COL_PROTOCOL, "IGMP");
   if (check_col(fd, COL_INFO))
     col_add_str(fd, COL_INFO, type_str);
-  
   if (tree) {
-    ti = proto_tree_add_item(tree, offset, 4,
+    ti = proto_tree_add_text(tree, offset, 4,
       "Internet Group Management Protocol");
-    igmp_tree = proto_tree_new();
-    proto_item_add_subtree(ti, igmp_tree, ETT_IGMP);
-    proto_tree_add_item(igmp_tree, offset,     1, "Version: %d",
+    igmp_tree = proto_item_add_subtree(ti, ETT_IGMP);
+    proto_tree_add_text(igmp_tree, offset,     1, "Version: %d",
       hi_nibble(ih.igmp_v_t));
-    proto_tree_add_item(igmp_tree, offset    , 1, "Type: %d (%s)",
+    proto_tree_add_text(igmp_tree, offset    , 1, "Type: %d (%s)",
       lo_nibble(ih.igmp_v_t), type_str);
-    proto_tree_add_item(igmp_tree, offset + 1, 1, "Unused: 0x%02x",
+    proto_tree_add_text(igmp_tree, offset + 1, 1, "Unused: 0x%02x",
       ih.igmp_unused);
-    proto_tree_add_item(igmp_tree, offset + 2, 2, "Checksum: 0x%04x",
+    proto_tree_add_text(igmp_tree, offset + 2, 2, "Checksum: 0x%04x",
       ih.igmp_cksum);
-    proto_tree_add_item(igmp_tree, offset + 4, 4, "Group address: %s",
+    proto_tree_add_text(igmp_tree, offset + 4, 4, "Group address: %s",
       ip_to_str((guint8 *) &ih.igmp_gaddr));
   }
 }
+
+void
+proto_register_ip(void)
+{
+       proto_ip = proto_register_protocol (
+               /* name */      "Internet Protocol",
+               /* abbrev */    "ip" );
+
+       hf_ip_version = proto_register_field (
+               /* name */      "Version",
+               /* abbrev */    "ip.version",
+               /* ftype */     FT_UINT8,
+               /* parent */    proto_ip,
+               /* vals[] */    NULL );
+
+       hf_ip_hdr_len = proto_register_field (
+               /* name */      "Header Length",
+               /* abbrev */    "ip.hdr_len",
+               /* ftype */     FT_UINT8,
+               /* parent */    proto_ip,
+               /* vals[] */    NULL );
+
+       hf_ip_tos = proto_register_field (
+               /* name */      "Type of Service",
+               /* abbrev */    "ip.tos",
+              &n