From 07f42b5b31f9523deeb147226521f77a2c8dd797 Mon Sep 17 00:00:00 2001 From: Gilbert Ramirez Date: Wed, 7 Jul 1999 22:52:57 +0000 Subject: [PATCH] Created a new protocol tree implementation and a new display filter 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 --- Makefile.am | 17 +- Makefile.in | 107 ++--- README | 13 - acconfig.h | 2 - aclocal.m4 | 4 +- config.h.in | 3 - configure | 271 ++++++------- configure.in | 36 +- dfilter-grammar.y | 640 ++++++++++++++++++++++++++++++ dfilter.c | 806 ++++++++++++++++++++++++++++++++++++++ dfilter.h | 105 +++++ doc/proto_tree | 235 +++++++++++ ethereal.c | 74 ++-- ethertype.c | 31 +- file.c | 189 ++------- file.h | 63 +-- follow.c | 3 +- gtkpacket.c | 89 +++-- gtkpacket.h | 4 +- menu.c | 9 +- packet-aarp.c | 25 +- packet-arp.c | 29 +- packet-atalk.c | 25 +- packet-bootp.c | 131 +++---- packet-cdp.c | 29 +- packet-data.c | 15 +- packet-dns.c | 106 +++-- packet-eth.c | 111 ++++-- packet-fddi.c | 96 ++++- packet-ftp.c | 17 +- packet-giop.c | 81 ++-- packet-gre.c | 59 ++- packet-http.c | 11 +- packet-icmpv6.c | 114 +++--- packet-ip.c | 291 ++++++++------ packet-ipsec.c | 26 +- packet-ipv6.c | 30 +- packet-ipx.c | 88 ++--- packet-isakmp.c | 240 ++++++------ packet-llc.c | 194 +++++---- packet-lpd.c | 19 +- packet-nbipx.c | 21 +- packet-nbns.c | 238 ++++++----- packet-ncp.c | 56 ++- packet-nntp.c | 9 +- packet-null.c | 47 ++- packet-osi.c | 385 +++++++++--------- packet-ospf.c | 163 ++++---- packet-pop.c | 15 +- packet-ppp.c | 42 +- packet-pppoe.c | 43 +- packet-pptp.c | 199 +++++----- packet-raw.c | 9 +- packet-rip.c | 41 +- packet-rsvp.c | 324 ++++++++------- packet-rtsp.c | 11 +- packet-sdp.c | 13 +- packet-smb.c | 430 ++++++++++---------- packet-snmp.c | 64 ++- packet-tcp.c | 66 ++-- packet-telnet.c | 57 ++- packet-tftp.c | 39 +- packet-tr.c | 250 +++++++----- packet-trmac.c | 93 +++-- packet-udp.c | 15 +- packet-vines.c | 47 ++- packet.c | 165 +++++--- packet.h | 44 +-- print.c | 4 +- proto.c | 620 +++++++++++++++++++++++++++++ proto.h | 165 ++++++++ resolv.c | 25 +- resolv.h | 5 +- summary.c | 34 +- summary.h | 4 +- wiretap/ChangeLog | 4 + wiretap/Makefile.am | 71 +--- wiretap/Makefile.in | 166 ++------ wiretap/aclocal.m4 | 4 +- wiretap/bpf-engine.c | 318 --------------- wiretap/bpf-engine.h | 120 ------ wiretap/bpf.c | 373 ------------------ wiretap/bpf.h | 22 -- wiretap/configure | 146 +++---- wiretap/configure.in | 21 +- wiretap/ct-compile.c | 487 ----------------------- wiretap/ct-compile.h | 104 ----- wiretap/ct-grammar.y | 149 ------- wiretap/ct-main.c | 24 -- wiretap/ct-scanner.l | 74 ---- wiretap/file.c | 6 +- wiretap/filter-eth | 38 -- wiretap/filter-tr | 57 --- wiretap/glib-new.c | 105 ----- wiretap/glib-new.h | 30 -- wiretap/rt-compile.c | 82 ---- wiretap/rt-compile.h | 29 -- wiretap/rt-global.h | 23 -- wiretap/rt-grammar-skel.y | 134 ------- wiretap/rt-scanner-skel.l | 160 -------- wiretap/wtap.c | 32 +- wiretap/wtap.h | 14 +- 102 files changed, 5499 insertions(+), 5475 deletions(-) create mode 100644 dfilter-grammar.y create mode 100644 dfilter.c create mode 100644 dfilter.h create mode 100644 doc/proto_tree create mode 100644 proto.c create mode 100644 proto.h delete mode 100644 wiretap/bpf-engine.c delete mode 100644 wiretap/bpf-engine.h delete mode 100644 wiretap/bpf.c delete mode 100644 wiretap/bpf.h delete mode 100644 wiretap/ct-compile.c delete mode 100644 wiretap/ct-compile.h delete mode 100644 wiretap/ct-grammar.y delete mode 100644 wiretap/ct-main.c delete mode 100644 wiretap/ct-scanner.l delete mode 100644 wiretap/filter-eth delete mode 100644 wiretap/filter-tr delete mode 100644 wiretap/glib-new.c delete mode 100644 wiretap/glib-new.h delete mode 100644 wiretap/rt-compile.c delete mode 100644 wiretap/rt-compile.h delete mode 100644 wiretap/rt-global.h delete mode 100644 wiretap/rt-grammar-skel.y delete mode 100644 wiretap/rt-scanner-skel.l diff --git a/Makefile.am b/Makefile.am index e9ae9d17a4..e1a979325b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 ; \ diff --git a/Makefile.in b/Makefile.in index b1e2f49be9..51fdb8b92d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -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 cdce480c4a..8f9296d523 100644 --- 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. diff --git a/acconfig.h b/acconfig.h index a202da07a4..f08f72e3ec 100644 --- a/acconfig.h +++ b/acconfig.h @@ -10,5 +10,3 @@ #undef NEED_STRERROR_H -/* Define this to use the wiretap library */ -#undef WITH_WIRETAP diff --git a/aclocal.m4 b/aclocal.m4 index 5fd4db5b31..fba6b3a302 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -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] diff --git a/config.h.in b/config.h.in index 2d45d36077..2e51ea4df0 100644 --- a/config.h.in +++ b/config.h.in @@ -15,9 +15,6 @@ #undef NEED_STRERROR_H -/* Define this to use the wiretap library */ -#undef WITH_WIRETAP - /* Define if you have the header file. */ #undef HAVE_FCNTL_H diff --git a/configure b/configure index 404517069b..9cffa43b1d 100755 --- 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 < @@ -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 < @@ -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 < 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 < 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 < 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 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 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 <&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 < @@ -1674,7 +1677,7 @@ rm -f conftest* ;; toshiba) cat > conftest.$ac_ext < @@ -1694,7 +1697,7 @@ rm -f conftest* ;; kame) cat > conftest.$ac_ext < @@ -1714,7 +1717,7 @@ rm -f conftest* ;; inria) cat > conftest.$ac_ext < @@ -1732,7 +1735,7 @@ rm -f conftest* ;; zeta) cat > conftest.$ac_ext < @@ -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 < #include @@ -1794,7 +1797,7 @@ else #include 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 @@ -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 @@ -1850,7 +1853,7 @@ if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #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 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 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 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 <&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 < #include @@ -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 < #include @@ -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 < #include @@ -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 <&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 < Autoconf TIOCGETP @@ -2229,7 +2232,7 @@ rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat > conftest.$ac_ext < 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 <&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 <&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 <&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. diff --git a/configure.in b/configure.in index 7a583025cf..916bf848e0 100644 --- a/configure.in +++ b/configure.in @@ -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 index 0000000000..83490243f8 --- /dev/null +++ b/dfilter-grammar.y @@ -0,0 +1,640 @@ +%{ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_SYS_TYPES_H +# include +#endif + +#ifdef HAVE_NETINET_IN_H +# include +#endif + +#ifndef __GLIB_H__ +#include +#endif + +#include /* during testing */ + +#ifndef _STDLIB_H +#include +#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 statement expression relation +%type numeric_value numeric_variable +%type ether_value ether_variable +%type ipv4_value ipv4_variable +%type protocol_name +%type bytes_value bytes_variable +%type boolean_value boolean_variable + +%type numeric_relation +%type ether_relation +%type bytes_relation +%type boolean_relation + +%type byte_range +%type any_variable_type +%type exists_operand + +%token T_FT_UINT8 +%token T_FT_UINT16 +%token T_FT_UINT32 +%token T_FT_ETHER +%token T_FT_IPv4 +%token T_FT_NONE +%token T_FT_BYTES +%token T_FT_BOOLEAN +%token T_FT_STRING + +%token T_VAL_ID + +%token TOK_AND TOK_OR TOK_NOT TOK_XOR +%token TOK_EQ TOK_NE TOK_GT TOK_GE TOK_LT TOK_LE +%token TOK_EXIST TOK_EXISTS +%token TOK_TRUE TOK_FALSE + +%type type_eq +%type type_ne +%type type_gt +%type type_ge +%type type_lt +%type 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 index 0000000000..91d1bc57ab --- /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 + * 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 +#endif + +#ifndef _STDIO_H +#include +#endif + +#ifndef _STRING_H +#include +#endif + +#ifndef __G_LIB_H__ +#include +#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 index 0000000000..6a60af55ab --- /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 + * 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 index 0000000000..4f20865272 --- /dev/null +++ b/doc/proto_tree @@ -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. + diff --git a/ethereal.c b/ethereal.c index 50994f566d..3f6a2f4183 100644 --- a/ethereal.c +++ b/ethereal.c @@ -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 @@ -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) { diff --git a/ethertype.c b/ethertype.c index e9ad98e2f0..a7455fc5e6 100644 --- a/ethertype.c +++ b/ethertype.c @@ -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 * @@ -38,10 +38,7 @@ #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 24670409c5..5ccd43d3aa 100644 --- 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 @@ -29,9 +29,7 @@ #include -#ifdef WITH_WIRETAP #include -#endif #include #include @@ -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 1da016cc40..9662204a21 100644 --- 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 @@ -29,31 +29,8 @@ #include #include -#ifdef WITH_WIRETAP - #include - #include -#else - #include - - /* 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 +#include 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: diff --git a/follow.c b/follow.c index 006b62dd2a..cce5ffafca 100644 --- 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 * @@ -39,6 +39,7 @@ # include #endif +#include #include "ethereal.h" #include "packet.h" #include "follow.h" diff --git a/gtkpacket.c b/gtkpacket.c index 35b3c34130..2b81e5d6d7 100644 --- a/gtkpacket.c +++ b/gtkpacket.c @@ -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 @@ -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); + } } diff --git a/gtkpacket.h b/gtkpacket.h index 6ffe649fa7..3344aa9fe3 100644 --- a/gtkpacket.h +++ b/gtkpacket.h @@ -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 @@ -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 d908eab9c7..647e57a9e8 100644 --- 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 @@ -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("
/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 + if ((mp = gtk_menu_factory_find(factory, "
/Help")) != NULL) { gtk_menu_item_right_justify((GtkMenuItem *) mp->widget); } diff --git a/packet-aarp.c b/packet-aarp.c index ba53ade473..053ab0b3ba 100644 --- a/packet-aarp.c +++ b/packet-aarp.c @@ -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)); } diff --git a/packet-arp.c b/packet-arp.c index 18f79261ef..b3ddf2149d 100644 --- a/packet-arp.c +++ b/packet-arp.c @@ -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 @@ -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); } } diff --git a/packet-atalk.c b/packet-atalk.c index fbc4527d81..726d91cde4 100644 --- a/packet-atalk.c +++ b/packet-atalk.c @@ -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; diff --git a/packet-bootp.c b/packet-bootp.c index c6046b96fb..19fcf4f4dc 100644 --- a/packet-bootp.c +++ b/packet-bootp.c @@ -2,7 +2,7 @@ * Routines for BOOTP/DHCP packet disassembly * Gilbert Ramirez * - * $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 */ - 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])); } diff --git a/packet-cdp.c b/packet-cdp.c index 45e1fb13cc..8874e048e2 100644 --- a/packet-cdp.c +++ b/packet-cdp.c @@ -2,7 +2,7 @@ * Routines for the disassembly of the "Cisco Discovery Protocol" * (c) Copyright Hannes R. Boehm * - * $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 @@ -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; diff --git a/packet-data.c b/packet-data.c index bf546baadc..f28300f16a 100644 --- a/packet-data.c +++ b/packet-data.c @@ -2,7 +2,7 @@ * Routines for raw data (default case) * Gilbert Ramirez * - * $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 @@ -35,12 +35,21 @@ #include #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" ); +} diff --git a/packet-dns.c b/packet-dns.c index 4a087fde4d..66eec34107 100644 --- a/packet-dns.c +++ b/packet-dns.c @@ -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 @@ -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; diff --git a/packet-eth.c b/packet-eth.c index ea018989ac..9ee7489bcd 100644 --- a/packet-eth.c +++ b/packet-eth.c @@ -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 @@ -36,6 +36,17 @@ #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) ); +} diff --git a/packet-fddi.c b/packet-fddi.c index d11f3c1f98..147922af73 100644 --- a/packet-fddi.c +++ b/packet-fddi.c @@ -3,7 +3,7 @@ * * Laurent Deniel * - * $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 @@ -37,6 +37,13 @@ #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 ); +} diff --git a/packet-ftp.c b/packet-ftp.c index a8feed5afd..7dddacd7a3 100644 --- a/packet-ftp.c +++ b/packet-ftp.c @@ -2,7 +2,7 @@ * Routines for ftp packet dissection * Copyright 1999, Richard Sharpe * - * $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 @@ -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"); } diff --git a/packet-giop.c b/packet-giop.c index 7db6594b2c..376afe8cba 100644 --- a/packet-giop.c +++ b/packet-giop.c @@ -3,7 +3,7 @@ * * Laurent Deniel * - * $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 @@ -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: "); } @@ -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: "); } @@ -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); } diff --git a/packet-gre.c b/packet-gre.c index c03d8ddcbf..b56ebdc2a9 100644 --- a/packet-gre.c +++ b/packet-gre.c @@ -2,7 +2,7 @@ * Routines for the Generic Routing Encapsulation (GRE) protocol * Brad Robel-Forrest * - * $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 @@ -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")); } diff --git a/packet-http.c b/packet-http.c index b229c7ae89..53c7fac1a9 100644 --- a/packet-http.c +++ b/packet-http.c @@ -3,7 +3,7 @@ * * Guy Harris * - * $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 @@ -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); } } diff --git a/packet-icmpv6.c b/packet-icmpv6.c index b34186b270..182522ebf3 100644 --- a/packet-icmpv6.c +++ b/packet-icmpv6.c @@ -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 @@ -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*/ diff --git a/packet-ip.c b/packet-ip.c index 67574c3f18..3d7585ff84 100644 --- a/packet-ip.c +++ b/packet-ip.c @@ -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 @@ -47,6 +47,14 @@ #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", + /* ftype */ FT_UINT8, + /* parent */ proto_ip, + /* vals[] */ NULL ); + + hf_ip_tos_precedence = proto_register_field ( + /* name */ "Precedence", + /* abbrev */ "ip.tos_precedence", + /* ftype */ FT_VALS_UINT8, + /* parent */ proto_ip, + /* vals[] */ VALS(precedence_vals) ); + + hf_ip_dst = proto_register_field ( + /* name */ "Destination", + /* abbrev */ "ip.dst", + /* ftype */ FT_IPv4, + /* parent */ proto_ip, + /* vals[] */ NULL ); + + hf_ip_src = proto_register_field ( + /* name */ "Source", + /* abbrev */ "ip.src", + /* ftype */ FT_IPv4, + /* parent */ proto_ip, + /* vals[] */ NULL ); +} diff --git a/packet-ipsec.c b/packet-ipsec.c index 5d74f133ad..c4b54e4e5f 100644 --- a/packet-ipsec.c +++ b/packet-ipsec.c @@ -1,7 +1,7 @@ /* packet-ipsec.c * Routines for IPsec packet disassembly * - * $Id: packet-ipsec.c,v 1.1 1999/03/29 02:21:34 gram Exp $ + * $Id: packet-ipsec.c,v 1.2 1999/07/07 22:51:45 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -85,19 +85,18 @@ dissect_ah(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) if (tree) { /* !!! specify length */ - ti = proto_tree_add_item(tree, offset, advance, "Authentication Header"); - ah_tree = proto_tree_new(); - proto_item_add_subtree(ti, ah_tree, ETT_AH); + ti = proto_tree_add_text(tree, offset, advance, "Authentication Header"); + ah_tree = proto_item_add_subtree(ti, ETT_AH); - proto_tree_add_item(ah_tree, offset + offsetof(struct newah, ah_nxt), 1, + proto_tree_add_text(ah_tree, offset + offsetof(struct newah, ah_nxt), 1, "Next Header: %d", ah.ah_nxt); - proto_tree_add_item(ah_tree, offset + offsetof(struct newah, ah_len), 1, + proto_tree_add_text(ah_tree, offset + offsetof(struct newah, ah_len), 1, "Length: %d", ah.ah_len << 2); - proto_tree_add_item(ah_tree, offset + offsetof(struct newah, ah_spi), 4, + proto_tree_add_text(ah_tree, offset + offsetof(struct newah, ah_spi), 4, "SPI: %08x", (guint32)ntohl(ah.ah_spi)); - proto_tree_add_item(ah_tree, offset + offsetof(struct newah, ah_seq), 4, + proto_tree_add_text(ah_tree, offset + offsetof(struct newah, ah_seq), 4, "Sequence?: %08x", (guint32)ntohl(ah.ah_seq)); - proto_tree_add_item(ah_tree, offset + sizeof(ah), (ah.ah_len - 1) << 2, + proto_tree_add_text(ah_tree, offset + sizeof(ah), (ah.ah_len - 1) << 2, "ICV"); } @@ -130,12 +129,11 @@ dissect_esp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) * (ie none) */ if(tree) { - ti = proto_tree_add_item(tree, 0, 0, "Encapsulated Security Payload"); - esp_tree = proto_tree_new(); - proto_item_add_subtree(ti, esp_tree, ETT_ESP); - proto_tree_add_item(esp_tree, offset + offsetof(struct newesp, esp_spi), 4, + ti = proto_tree_add_text(tree, 0, 0, "Encapsulated Security Payload"); + esp_tree = proto_item_add_subtree(ti, ETT_ESP); + proto_tree_add_text(esp_tree, offset + offsetof(struct newesp, esp_spi), 4, "SPI: %08x", (guint32)ntohl(esp.esp_spi)); - proto_tree_add_item(esp_tree, offset + offsetof(struct newesp, esp_seq), 4, + proto_tree_add_text(esp_tree, offset + offsetof(struct newesp, esp_seq), 4, "Sequence?: %08x", (guint32)ntohl(esp.esp_seq)); } } diff --git a/packet-ipv6.c b/packet-ipv6.c index 99e1867cbd..991a54462c 100644 --- a/packet-ipv6.c +++ b/packet-ipv6.c @@ -1,7 +1,7 @@ /* packet-ipv6.c * Routines for IPv6 packet disassembly * - * $Id: packet-ipv6.c,v 1.8 1999/04/09 13:32:31 gram Exp $ + * $Id: packet-ipv6.c,v 1.9 1999/07/07 22:51:45 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -85,12 +85,11 @@ dissect_dstopts(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, "Destination Option Header"); - dstopt_tree = proto_tree_new(); - proto_item_add_subtree(ti, dstopt_tree, ETT_IPv6); + dstopt_tree = proto_item_add_subtree(ti, ETT_IPv6); - proto_tree_add_item(dstopt_tree, + proto_tree_add_text(dstopt_tree, offset + offsetof(struct ip6_dest, ip6d_len), 1, "Length: %d (%d bytes)", dstopt.ip6d_len, len); @@ -125,38 +124,37 @@ dissect_ipv6(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { if (tree) { /* !!! specify length */ - ti = proto_tree_add_item(tree, offset, 40, "Internet Protocol Version 6"); - ipv6_tree = proto_tree_new(); - proto_item_add_subtree(ti, ipv6_tree, ETT_IPv6); + ti = proto_tree_add_text(tree, offset, 40, "Internet Protocol Version 6"); + ipv6_tree = proto_item_add_subtree(ti, ETT_IPv6); /* !!! warning: version also contains 4 Bit priority */ - proto_tree_add_item(ipv6_tree, + proto_tree_add_text(ipv6_tree, offset + offsetof(struct ip6_hdr, ip6_vfc), 1, "Version: %d", ipv6.ip6_vfc >> 4); - proto_tree_add_item(ipv6_tree, + proto_tree_add_text(ipv6_tree, offset + offsetof(struct ip6_hdr, ip6_flow), 4, "Traffic class: 0x%02x", (ntohl(ipv6.ip6_flow) >> 20) & 0xff); /* there should be no alignment problems for ip6_flow, since it's the first guint32 in the ipv6 struct */ - proto_tree_add_item(ipv6_tree, + proto_tree_add_text(ipv6_tree, offset + offsetof(struct ip6_hdr, ip6_flow), 4, "Flowlabel: 0x%05x", ntohl(ipv6.ip6_flow & IPV6_FLOWLABEL_MASK)); - proto_tree_add_item(ipv6_tree, + proto_tree_add_text(ipv6_tree, offset + offsetof(struct ip6_hdr, ip6_plen), 2, "Payload Length: %d", ntohs(ipv6.ip6_plen)); - proto_tree_add_item(ipv6_tree, + proto_tree_add_text(ipv6_tree, offset + offsetof(struct ip6_hdr, ip6_nxt), 1, "Next Header: %d", ipv6.ip6_nxt); - proto_tree_add_item(ipv6_tree, + proto_tree_add_text(ipv6_tree, offset + offsetof(struct ip6_hdr, ip6_hlim), 1, "Hop limit: %d", ipv6.ip6_hlim); - proto_tree_add_item(ipv6_tree, + proto_tree_add_text(ipv6_tree, offset + offsetof(struct ip6_hdr, ip6_src), 16, #ifdef INET6 "Source address: %s (%s)", @@ -166,7 +164,7 @@ dissect_ipv6(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { #endif ip6_to_str(&ipv6.ip6_src)); - proto_tree_add_item(ipv6_tree, + proto_tree_add_text(ipv6_tree, offset + offsetof(struct ip6_hdr, ip6_dst), 16, #ifdef INET6 "Destination address: %s (%s)", diff --git a/packet-ipx.c b/packet-ipx.c index 440dad378b..3d5d3d5411 100644 --- a/packet-ipx.c +++ b/packet-ipx.c @@ -2,7 +2,7 @@ * Routines for NetWare's IPX * Gilbert Ramirez * - * $Id: packet-ipx.c,v 1.20 1999/05/10 20:51:36 gram Exp $ + * $Id: packet-ipx.c,v 1.21 1999/07/07 22:51:45 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -223,30 +223,29 @@ dissect_ipx(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { ipx_checksum = pntohs(&pd[offset]); ipx_hops = pd[offset+4]; - ti = proto_tree_add_item(tree, offset, 30, + ti = proto_tree_add_text(tree, offset, 30, "Internetwork Packet Exchange"); - ipx_tree = proto_tree_new(); - proto_item_add_subtree(ti, ipx_tree, ETT_IPX); - proto_tree_add_item(ipx_tree, offset, 2, "Checksum: 0x%04x", + ipx_tree = proto_item_add_subtree(ti, ETT_IPX); + proto_tree_add_text(ipx_tree, offset, 2, "Checksum: 0x%04x", ipx_checksum); - proto_tree_add_item(ipx_tree, offset+2, 2, "Length: %d bytes", + proto_tree_add_text(ipx_tree, offset+2, 2, "Length: %d bytes", ipx_length); - proto_tree_add_item(ipx_tree, offset+4, 1, "Transport Control: %d hops", + proto_tree_add_text(ipx_tree, offset+4, 1, "Transport Control: %d hops", ipx_hops); - proto_tree_add_item(ipx_tree, offset+5, 1, "Packet Type: %s", + proto_tree_add_text(ipx_tree, offset+5, 1, "Packet Type: %s", ipx_packet_type(ipx_type)); - proto_tree_add_item(ipx_tree, offset+6, 4, "Destination Network: %s", + proto_tree_add_text(ipx_tree, offset+6, 4, "Destination Network: %s", str_dnet); - proto_tree_add_item(ipx_tree, offset+10, 6, "Destination Node: %s", + proto_tree_add_text(ipx_tree, offset+10, 6, "Destination Node: %s", ether_to_str(ipx_dnode)); - proto_tree_add_item(ipx_tree, offset+16, 2, + proto_tree_add_text(ipx_tree, offset+16, 2, "Destination Socket: %s (0x%04X)", port_text(ipx_dsocket), ipx_dsocket); - proto_tree_add_item(ipx_tree, offset+18, 4, "Source Network: %s", + proto_tree_add_text(ipx_tree, offset+18, 4, "Source Network: %s", str_snet); - proto_tree_add_item(ipx_tree, offset+22, 6, "Source Node: %s", + proto_tree_add_text(ipx_tree, offset+22, 6, "Source Node: %s", ether_to_str(ipx_snode)); - proto_tree_add_item(ipx_tree, offset+28, 2, + proto_tree_add_text(ipx_tree, offset+28, 2, "Source Socket: %s (0x%04X)", port_text(ipx_ssocket), ipx_ssocket); } offset += 30; @@ -257,8 +256,11 @@ dissect_ipx(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { break; case 17: /* NCP */ + /* Is the destination node 00:00:00:00:00:01 ? */ if (pntohl(ipx_dnode) == 0 && pntohs(ipx_dnode + 4) == 1) nw_server_address = pntohl(ipx_dnet); + + /* Is the source node 00:00:00:00:00:01 ? */ else if (pntohl(ipx_snode) == 0 && pntohs(ipx_snode + 4) == 1) nw_server_address = pntohl(ipx_snet); else @@ -344,31 +346,30 @@ dissect_spx(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int col_add_str(fd, COL_INFO, "SPX"); if (tree) { - ti = proto_tree_add_item(tree, offset, 12, "Sequenced Packet Exchange"); - spx_tree = proto_tree_new(); - proto_item_add_subtree(ti, spx_tree, ETT_SPX); + ti = proto_tree_add_text(tree, offset, 12, "Sequenced Packet Exchange"); + spx_tree = proto_item_add_subtree(ti, ETT_SPX); - proto_tree_add_item(spx_tree, offset, 1, + proto_tree_add_text(spx_tree, offset, 1, "Connection Control: %s (0x%02X)", spx_conn_ctrl(pd[offset]), pd[offset]); - proto_tree_add_item(spx_tree, offset+1, 1, + proto_tree_add_text(spx_tree, offset+1, 1, "Datastream Type: %s (0x%02X)", spx_datastream(pd[offset+1]), pd[offset+1]); - proto_tree_add_item(spx_tree, offset+2, 2, + proto_tree_add_text(spx_tree, offset+2, 2, "Source Connection ID: %d", pntohs( &pd[offset+2] ) ); - proto_tree_add_item(spx_tree, offset+4, 2, + proto_tree_add_text(spx_tree, offset+4, 2, "Destination Connection ID: %d", pntohs( &pd[offset+4] ) ); - proto_tree_add_item(spx_tree, offset+6, 2, + proto_tree_add_text(spx_tree, offset+6, 2, "Sequence Number: %d", pntohs( &pd[offset+6] ) ); - proto_tree_add_item(spx_tree, offset+8, 2, + proto_tree_add_text(spx_tree, offset+8, 2, "Acknowledgment Number: %d", pntohs( &pd[offset+8] ) ); - proto_tree_add_item(spx_tree, offset+10, 2, + proto_tree_add_text(spx_tree, offset+10, 2, "Allocation Number: %d", pntohs( &pd[offset+10] ) ); offset += 12; @@ -405,17 +406,16 @@ dissect_ipxrip(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, "IPX Routing Information Protocol"); - rip_tree = proto_tree_new(); - proto_item_add_subtree(ti, rip_tree, ETT_IPXRIP); + rip_tree = proto_item_add_subtree(ti, ETT_IPXRIP); if (operation < 2) { - proto_tree_add_item(rip_tree, offset, 2, + proto_tree_add_text(rip_tree, offset, 2, "RIP packet type: %s", rip_type[operation]); } else { - proto_tree_add_item(rip_tree, offset, 2, "Unknown RIP packet type"); + proto_tree_add_text(rip_tree, offset, 2, "Unknown RIP packet type"); } for (cursor = offset + 2; cursor < fd->cap_len; cursor += 8) { @@ -424,14 +424,14 @@ dissect_ipxrip(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, route.ticks = pntohs(&pd[cursor+6]); if (operation == IPX_RIP_REQUEST - 1) { - proto_tree_add_item(rip_tree, cursor, 8, + proto_tree_add_text(rip_tree, cursor, 8, "Route Vector: %s, %d hop%s, %d tick%s", ipxnet_to_string((guint8*)&route.network), route.hops, route.hops == 1 ? "" : "s", route.ticks, route.ticks == 1 ? "" : "s"); } else { - proto_tree_add_item(rip_tree, cursor, 8, + proto_tree_add_text(rip_tree, cursor, 8, "Route Vector: %s, %d hop%s, %d tick%s (%d ms)", ipxnet_to_string((guint8*)&route.network), route.hops, route.hops == 1 ? "" : "s", @@ -527,16 +527,15 @@ dissect_sap(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, "Service Advertising Protocol"); - sap_tree = proto_tree_new(); - proto_item_add_subtree(ti, sap_tree, ETT_IPXSAP); + sap_tree = proto_item_add_subtree(ti, ETT_IPXSAP); if (query.query_type < 4) { - proto_tree_add_item(sap_tree, offset, 2, sap_type[query.query_type - 1]); + proto_tree_add_text(sap_tree, offset, 2, sap_type[query.query_type - 1]); } else { - proto_tree_add_item(sap_tree, offset, 2, + proto_tree_add_text(sap_tree, offset, 2, "Unknown SAP Packet Type %d", query.query_type); } @@ -551,26 +550,25 @@ dissect_sap(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, server.server_port = pntohs(&pd[cursor+60]); server.intermediate_network = pntohs(&pd[cursor+62]); - ti = proto_tree_add_item(sap_tree, cursor+2, 48, + ti = proto_tree_add_text(sap_tree, cursor+2, 48, "Server Name: %s", server.server_name); - s_tree = proto_tree_new(); - proto_item_add_subtree(ti, s_tree, ETT_IPXSAP_SERVER); + s_tree = proto_item_add_subtree(ti, ETT_IPXSAP_SERVER); - proto_tree_add_item(s_tree, cursor, 2, "Server Type: %s (0x%04X)", + proto_tree_add_text(s_tree, cursor, 2, "Server Type: %s (0x%04X)", server_type(server.server_type), server.server_type); - proto_tree_add_item(s_tree, cursor+50, 4, "Network: %s", + proto_tree_add_text(s_tree, cursor+50, 4, "Network: %s", ipxnet_to_string((guint8*)&pd[cursor+50])); - proto_tree_add_item(s_tree, cursor+54, 6, "Node: %s", + proto_tree_add_text(s_tree, cursor+54, 6, "Node: %s", ether_to_str((guint8*)&pd[cursor+54])); - proto_tree_add_item(s_tree, cursor+60, 2, "Socket: %s (0x%04X)", + proto_tree_add_text(s_tree, cursor+60, 2, "Socket: %s (0x%04X)", port_text(server.server_port), server.server_port); - proto_tree_add_item(s_tree, cursor+62, 2, + proto_tree_add_text(s_tree, cursor+62, 2, "Intermediate Networks: %d", server.intermediate_network); } } else { /* queries */ - proto_tree_add_item(sap_tree, offset+2, 2, "Server Type: %s (0x%04X)", + proto_tree_add_text(sap_tree, offset+2, 2, "Server Type: %s (0x%04X)", server_type(query.server_type), query.server_type); } } diff --git a/packet-isakmp.c b/packet-isakmp.c index 3db149a2d0..0effcdbb1c 100644 --- a/packet-isakmp.c +++ b/packet-isakmp.c @@ -2,7 +2,7 @@ * Routines for the Internet Security Association and Key Management Protocol (ISAKMP) * Brad Robel-Forrest * - * $Id: packet-isakmp.c,v 1.3 1999/07/06 06:10:31 guy Exp $ + * $Id: packet-isakmp.c,v 1.4 1999/07/07 22:51:46 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -287,30 +287,29 @@ void dissect_isakmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tr proto_item * ti; proto_tree * isakmp_tree; - ti = proto_tree_add_item(tree, offset, len, + ti = proto_tree_add_text(tree, offset, len, "Internet Security Association and Key Management Protocol"); - isakmp_tree = proto_tree_new(); - proto_item_add_subtree(ti, isakmp_tree, ETT_ISAKMP); + isakmp_tree = proto_item_add_subtree(ti, ETT_ISAKMP); - proto_tree_add_item(isakmp_tree, offset, sizeof(hdr->icookie), + proto_tree_add_text(isakmp_tree, offset, sizeof(hdr->icookie), "Initiator cookie"); offset += sizeof(hdr->icookie); - proto_tree_add_item(isakmp_tree, offset, sizeof(hdr->rcookie), + proto_tree_add_text(isakmp_tree, offset, sizeof(hdr->rcookie), "Responder cookie"); offset += sizeof(hdr->rcookie); - proto_tree_add_item(isakmp_tree, offset, sizeof(hdr->next_payload), + proto_tree_add_text(isakmp_tree, offset, sizeof(hdr->next_payload), "Next payload: %s (%u)", payloadtype2str(hdr->next_payload), hdr->next_payload); offset += sizeof(hdr->next_payload); - proto_tree_add_item(isakmp_tree, offset, sizeof(hdr->version), + proto_tree_add_text(isakmp_tree, offset, sizeof(hdr->version), "Version: %u.%u", hi_nibble(hdr->version), lo_nibble(hdr->version)); offset += sizeof(hdr->version); - proto_tree_add_item(isakmp_tree, offset, sizeof(hdr->exch_type), + proto_tree_add_text(isakmp_tree, offset, sizeof(hdr->exch_type), "Exchange type: %s (%u)", exchtype2str(hdr->exch_type), hdr->exch_type); offset += sizeof(hdr->exch_type); @@ -319,26 +318,25 @@ void dissect_isakmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tr proto_item * fti; proto_tree * ftree; - fti = proto_tree_add_item(isakmp_tree, offset, sizeof(hdr->flags), "Flags"); - ftree = proto_tree_new(); - proto_item_add_subtree(fti, ftree, ETT_ISAKMP_FLAGS); + fti = proto_tree_add_text(isakmp_tree, offset, sizeof(hdr->flags), "Flags"); + ftree = proto_item_add_subtree(fti, ETT_ISAKMP_FLAGS); - proto_tree_add_item(ftree, offset, 1, "%s", + proto_tree_add_text(ftree, offset, 1, "%s", decode_boolean_bitfield(hdr->flags, E_FLAG, sizeof(hdr->flags)*8, "Encryption", "No encryption")); - proto_tree_add_item(ftree, offset, 1, "%s", + proto_tree_add_text(ftree, offset, 1, "%s", decode_boolean_bitfield(hdr->flags, C_FLAG, sizeof(hdr->flags)*8, "Commit", "No commit")); - proto_tree_add_item(ftree, offset, 1, "%s", + proto_tree_add_text(ftree, offset, 1, "%s", decode_boolean_bitfield(hdr->flags, A_FLAG, sizeof(hdr->flags)*8, "Authentication", "No authentication")); offset += sizeof(hdr->flags); } - proto_tree_add_item(isakmp_tree, offset, sizeof(hdr->message_id), "Message ID"); + proto_tree_add_text(isakmp_tree, offset, sizeof(hdr->message_id), "Message ID"); offset += sizeof(hdr->message_id); - proto_tree_add_item(isakmp_tree, offset, sizeof(hdr->length), + proto_tree_add_text(isakmp_tree, offset, sizeof(hdr->length), "Length: %u", len); offset += sizeof(hdr->length); @@ -360,26 +358,26 @@ dissect_sa(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { guint16 length = pntohs(&hdr->length); guint32 doi = pntohl(&hdr->doi); guint32 situation = pntohl(&hdr->situation); - proto_item * ti = proto_tree_add_item(tree, offset, length, "Security Association payload"); - proto_tree * ntree = proto_tree_new(); + proto_item * ti = proto_tree_add_text(tree, offset, length, "Security Association payload"); + proto_tree * ntree; - proto_item_add_subtree(ti, ntree, ETT_ISAKMP_PAYLOAD); + ntree = proto_item_add_subtree(ti, ETT_ISAKMP_PAYLOAD); - proto_tree_add_item(ntree, offset, sizeof(hdr->next_payload), + proto_tree_add_text(ntree, offset, sizeof(hdr->next_payload), "Next payload: %s (%u)", payloadtype2str(hdr->next_payload), hdr->next_payload); offset += sizeof(hdr->next_payload) * 2; - proto_tree_add_item(ntree, offset, sizeof(length), + proto_tree_add_text(ntree, offset, sizeof(length), "Length: %u", length); offset += sizeof(length); - proto_tree_add_item(ntree, offset, sizeof(doi), + proto_tree_add_text(ntree, offset, sizeof(doi), "Domain of interpretation: %s (%u)", doitype2str(doi), doi); offset += sizeof(doi); - proto_tree_add_item(ntree, offset, sizeof(situation), + proto_tree_add_text(ntree, offset, sizeof(situation), "Situation: %s (%u)", situation2str(situation), situation); offset += sizeof(situation); @@ -398,40 +396,40 @@ dissect_proposal(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) struct proposal_hdr * hdr = (struct proposal_hdr *)(pd + offset); guint16 length = pntohs(&hdr->length); - proto_item * ti = proto_tree_add_item(tree, offset, length, "Proposal payload"); - proto_tree * ntree = proto_tree_new(); + proto_item * ti = proto_tree_add_text(tree, offset, length, "Proposal payload"); + proto_tree * ntree; guint8 i; - proto_item_add_subtree(ti, ntree, ETT_ISAKMP_PAYLOAD); + ntree = proto_item_add_subtree(ti, ETT_ISAKMP_PAYLOAD); - proto_tree_add_item(ntree, offset, sizeof(hdr->next_payload), + proto_tree_add_text(ntree, offset, sizeof(hdr->next_payload), "Next payload: %s (%u)", payloadtype2str(hdr->next_payload), hdr->next_payload); offset += sizeof(hdr->next_payload) * 2; - proto_tree_add_item(ntree, offset, sizeof(length), + proto_tree_add_text(ntree, offset, sizeof(length), "Length: %u", length); offset += sizeof(length); - proto_tree_add_item(ntree, offset, sizeof(hdr->proposal_num), + proto_tree_add_text(ntree, offset, sizeof(hdr->proposal_num), "Proposal number: %u", hdr->proposal_num); offset += sizeof(hdr->proposal_num); - proto_tree_add_item(ntree, offset, sizeof(hdr->protocol_id), + proto_tree_add_text(ntree, offset, sizeof(hdr->protocol_id), "Protocol ID: %s (%u)", proto2str(hdr->protocol_id), hdr->protocol_id); offset += sizeof(hdr->protocol_id); - proto_tree_add_item(ntree, offset, sizeof(hdr->spi_size), + proto_tree_add_text(ntree, offset, sizeof(hdr->spi_size), "SPI size: %u", hdr->spi_size); offset += sizeof(hdr->spi_size); if (hdr->spi_size) { - proto_tree_add_item(ntree, offset, hdr->spi_size, "SPI"); + proto_tree_add_text(ntree, offset, hdr->spi_size, "SPI"); offset += hdr->spi_size; } - proto_tree_add_item(ntree, offset, sizeof(hdr->num_transforms), + proto_tree_add_text(ntree, offset, sizeof(hdr->num_transforms), "Number of transforms: %u", hdr->num_transforms); offset += sizeof(hdr->num_transforms); @@ -451,25 +449,25 @@ dissect_transform(const u_char *pd, int offset, frame_data *fd, proto_tree *tree struct trans_hdr * hdr = (struct trans_hdr *)(pd + offset); guint16 length = pntohs(&hdr->length); - proto_item * ti = proto_tree_add_item(tree, offset, length, "Transform payload"); - proto_tree * ntree = proto_tree_new(); + proto_item * ti = proto_tree_add_text(tree, offset, length, "Transform payload"); + proto_tree * ntree; - proto_item_add_subtree(ti, ntree, ETT_ISAKMP_PAYLOAD); + ntree = proto_item_add_subtree(ti, ETT_ISAKMP_PAYLOAD); - proto_tree_add_item(ntree, offset, sizeof(hdr->next_payload), + proto_tree_add_text(ntree, offset, sizeof(hdr->next_payload), "Next payload: %s (%u)", payloadtype2str(hdr->next_payload), hdr->next_payload); offset += sizeof(hdr->next_payload) * 2; - proto_tree_add_item(ntree, offset, sizeof(length), + proto_tree_add_text(ntree, offset, sizeof(length), "Length: %u", length); offset += sizeof(length); - proto_tree_add_item(ntree, offset, sizeof(hdr->transform_num), + proto_tree_add_text(ntree, offset, sizeof(hdr->transform_num), "Transform number: %u", hdr->transform_num); offset += sizeof(hdr->transform_num); - proto_tree_add_item(ntree, offset, sizeof(hdr->transform_id), + proto_tree_add_text(ntree, offset, sizeof(hdr->transform_id), "Transform ID: %s (%u)", trans2str(hdr->transform_id), hdr->transform_id); offset += sizeof(hdr->transform_id) + sizeof(hdr->reserved2); @@ -480,7 +478,7 @@ dissect_transform(const u_char *pd, int offset, frame_data *fd, proto_tree *tree guint16 val_len = pntohs(pd + offset + 2); if (pd[offset] & 0xf0) { - proto_tree_add_item(ntree, offset, 4, + proto_tree_add_text(ntree, offset, 4, "%s (%u): %s (%u)", atttype2str(type), type, value2str(type, val_len), val_len); @@ -490,7 +488,7 @@ dissect_transform(const u_char *pd, int offset, frame_data *fd, proto_tree *tree else { guint16 pack_len = 4 + val_len; - proto_tree_add_item(ntree, offset, pack_len, + proto_tree_add_text(ntree, offset, pack_len, "%s (%u): %s", atttype2str(type), type, num2str(pd + offset + 4, val_len)); @@ -510,21 +508,21 @@ dissect_key_exch(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) struct ke_hdr * hdr = (struct ke_hdr *)(pd + offset); guint16 length = pntohs(&hdr->length); - proto_item * ti = proto_tree_add_item(tree, offset, length, "Key Exchange payload"); - proto_tree * ntree = proto_tree_new(); + proto_item * ti = proto_tree_add_text(tree, offset, length, "Key Exchange payload"); + proto_tree * ntree; - proto_item_add_subtree(ti, ntree, ETT_ISAKMP_PAYLOAD); + ntree = proto_item_add_subtree(ti, ETT_ISAKMP_PAYLOAD); - proto_tree_add_item(ntree, offset, sizeof(hdr->next_payload), + proto_tree_add_text(ntree, offset, sizeof(hdr->next_payload), "Next payload: %s (%u)", payloadtype2str(hdr->next_payload), hdr->next_payload); offset += sizeof(hdr->next_payload) * 2; - proto_tree_add_item(ntree, offset, sizeof(length), + proto_tree_add_text(ntree, offset, sizeof(length), "Length: %u", length); offset += sizeof(length); - proto_tree_add_item(ntree, offset, length - sizeof(*hdr), "Key Exchange Data"); + proto_tree_add_text(ntree, offset, length - sizeof(*hdr), "Key Exchange Data"); offset += (length - sizeof(*hdr)); if (hdr->next_payload < NUM_LOAD_TYPES) @@ -538,45 +536,45 @@ dissect_id(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct id_hdr * hdr = (struct id_hdr *)(pd + offset); guint16 length = pntohs(&hdr->length); - proto_item * ti = proto_tree_add_item(tree, offset, length, "Identification payload"); - proto_tree * ntree = proto_tree_new(); + proto_item * ti = proto_tree_add_text(tree, offset, length, "Identification payload"); + proto_tree * ntree; - proto_item_add_subtree(ti, ntree, ETT_ISAKMP_PAYLOAD); + ntree = proto_item_add_subtree(ti, ETT_ISAKMP_PAYLOAD); - proto_tree_add_item(ntree, offset, sizeof(hdr->next_payload), + proto_tree_add_text(ntree, offset, sizeof(hdr->next_payload), "Next payload: %s (%u)", payloadtype2str(hdr->next_payload), hdr->next_payload); offset += sizeof(hdr->next_payload) * 2; - proto_tree_add_item(ntree, offset, sizeof(length), + proto_tree_add_text(ntree, offset, sizeof(length), "Length: %u", length); offset += sizeof(length); - proto_tree_add_item(ntree, offset, sizeof(hdr->id_type), + proto_tree_add_text(ntree, offset, sizeof(hdr->id_type), "ID type: %s (%u)", id2str(hdr->id_type), hdr->id_type); offset += sizeof(hdr->id_type); - proto_tree_add_item(ntree, offset, sizeof(hdr->protocol_id), + proto_tree_add_text(ntree, offset, sizeof(hdr->protocol_id), "Protocol ID: %u", hdr->protocol_id); offset += sizeof(hdr->protocol_id); - proto_tree_add_item(ntree, offset, sizeof(hdr->port), + proto_tree_add_text(ntree, offset, sizeof(hdr->port), "Port: %u", pntohs(&hdr->port)); offset += sizeof(hdr->port); switch (hdr->id_type) { case 1: case 4: - proto_tree_add_item(ntree, offset, length-sizeof(*hdr), + proto_tree_add_text(ntree, offset, length-sizeof(*hdr), "Identification data: %s", ip_to_str(pd+offset)); break; case 2: case 3: - proto_tree_add_item(ntree, offset, length-sizeof(*hdr), + proto_tree_add_text(ntree, offset, length-sizeof(*hdr), "Identification data: %s", (char *)(pd+offset)); break; default: - proto_tree_add_item(ntree, offset, length - sizeof(*hdr), "Identification Data"); + proto_tree_add_text(ntree, offset, length - sizeof(*hdr), "Identification Data"); } offset += (length - sizeof(*hdr)); @@ -591,25 +589,25 @@ dissect_cert(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct cert_hdr * hdr = (struct cert_hdr *)(pd + offset); guint16 length = pntohs(&hdr->length); - proto_item * ti = proto_tree_add_item(tree, offset, length, "Certificate payload"); - proto_tree * ntree = proto_tree_new(); + proto_item * ti = proto_tree_add_text(tree, offset, length, "Certificate payload"); + proto_tree * ntree; - proto_item_add_subtree(ti, ntree, ETT_ISAKMP_PAYLOAD); + ntree = proto_item_add_subtree(ti, ETT_ISAKMP_PAYLOAD); - proto_tree_add_item(ntree, offset, sizeof(hdr->next_payload), + proto_tree_add_text(ntree, offset, sizeof(hdr->next_payload), "Next payload: %s (%u)", payloadtype2str(hdr->next_payload), hdr->next_payload); offset += sizeof(hdr->next_payload) * 2; - proto_tree_add_item(ntree, offset, sizeof(length), + proto_tree_add_text(ntree, offset, sizeof(length), "Length: %u", length); offset += sizeof(length); - proto_tree_add_item(ntree, offset, sizeof(hdr->cert_enc), + proto_tree_add_text(ntree, offset, sizeof(hdr->cert_enc), "Certificate encoding: %u", hdr->cert_enc); offset += sizeof(hdr->cert_enc); - proto_tree_add_item(ntree, offset, length - sizeof(*hdr), "Certificate Data"); + proto_tree_add_text(ntree, offset, length - sizeof(*hdr), "Certificate Data"); offset += (length - sizeof(*hdr)); if (hdr->next_payload < NUM_LOAD_TYPES) @@ -623,25 +621,25 @@ dissect_certreq(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) struct certreq_hdr * hdr = (struct certreq_hdr *)(pd + offset); guint16 length = pntohs(&hdr->length); - proto_item * ti = proto_tree_add_item(tree, offset, length, "Certificate Request payload"); - proto_tree * ntree = proto_tree_new(); + proto_item * ti = proto_tree_add_text(tree, offset, length, "Certificate Request payload"); + proto_tree * ntree; - proto_item_add_subtree(ti, ntree, ETT_ISAKMP_PAYLOAD); + ntree = proto_item_add_subtree(ti, ETT_ISAKMP_PAYLOAD); - proto_tree_add_item(ntree, offset, sizeof(hdr->next_payload), + proto_tree_add_text(ntree, offset, sizeof(hdr->next_payload), "Next payload: %s (%u)", payloadtype2str(hdr->next_payload), hdr->next_payload); offset += sizeof(hdr->next_payload) * 2; - proto_tree_add_item(ntree, offset, sizeof(length), + proto_tree_add_text(ntree, offset, sizeof(length), "Length: %u", length); offset += sizeof(length); - proto_tree_add_item(ntree, offset, sizeof(hdr->cert_type), + proto_tree_add_text(ntree, offset, sizeof(hdr->cert_type), "Certificate type: %u", hdr->cert_type); offset += sizeof(hdr->cert_type); - proto_tree_add_item(ntree, offset, length - sizeof(*hdr), "Certificate Authority"); + proto_tree_add_text(ntree, offset, length - sizeof(*hdr), "Certificate Authority"); offset += (length - sizeof(*hdr)); if (hdr->next_payload < NUM_LOAD_TYPES) @@ -655,21 +653,21 @@ dissect_hash(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct hash_hdr * hdr = (struct hash_hdr *)(pd + offset); guint16 length = pntohs(&hdr->length); - proto_item * ti = proto_tree_add_item(tree, offset, length, "Hash payload"); - proto_tree * ntree = proto_tree_new(); + proto_item * ti = proto_tree_add_text(tree, offset, length, "Hash payload"); + proto_tree * ntree; - proto_item_add_subtree(ti, ntree, ETT_ISAKMP_PAYLOAD); + ntree = proto_item_add_subtree(ti, ETT_ISAKMP_PAYLOAD); - proto_tree_add_item(ntree, offset, sizeof(hdr->next_payload), + proto_tree_add_text(ntree, offset, sizeof(hdr->next_payload), "Next payload: %s (%u)", payloadtype2str(hdr->next_payload), hdr->next_payload); offset += sizeof(hdr->next_payload) * 2; - proto_tree_add_item(ntree, offset, sizeof(length), + proto_tree_add_text(ntree, offset, sizeof(length), "Length: %u", length); offset += sizeof(length); - proto_tree_add_item(ntree, offset, length - sizeof(*hdr), "Hash Data"); + proto_tree_add_text(ntree, offset, length - sizeof(*hdr), "Hash Data"); offset += (length - sizeof(*hdr)); if (hdr->next_payload < NUM_LOAD_TYPES) @@ -683,21 +681,21 @@ dissect_sig(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct sig_hdr * hdr = (struct sig_hdr *)(pd + offset); guint16 length = pntohs(&hdr->length); - proto_item * ti = proto_tree_add_item(tree, offset, length, "Signature payload"); - proto_tree * ntree = proto_tree_new(); + proto_item * ti = proto_tree_add_text(tree, offset, length, "Signature payload"); + proto_tree * ntree; - proto_item_add_subtree(ti, ntree, ETT_ISAKMP_PAYLOAD); + ntree = proto_item_add_subtree(ti, ETT_ISAKMP_PAYLOAD); - proto_tree_add_item(ntree, offset, sizeof(hdr->next_payload), + proto_tree_add_text(ntree, offset, sizeof(hdr->next_payload), "Next payload: %s (%u)", payloadtype2str(hdr->next_payload), hdr->next_payload); offset += sizeof(hdr->next_payload) * 2; - proto_tree_add_item(ntree, offset, sizeof(length), + proto_tree_add_text(ntree, offset, sizeof(length), "Length: %u", length); offset += sizeof(length); - proto_tree_add_item(ntree, offset, length - sizeof(*hdr), "Signature Data"); + proto_tree_add_text(ntree, offset, length - sizeof(*hdr), "Signature Data"); offset += (length - sizeof(*hdr)); if (hdr->next_payload < NUM_LOAD_TYPES) @@ -711,21 +709,21 @@ dissect_nonce(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct nonce_hdr * hdr = (struct nonce_hdr *)(pd + offset); guint16 length = pntohs(&hdr->length); - proto_item * ti = proto_tree_add_item(tree, offset, length, "Nonce payload"); - proto_tree * ntree = proto_tree_new(); + proto_item * ti = proto_tree_add_text(tree, offset, length, "Nonce payload"); + proto_tree * ntree; - proto_item_add_subtree(ti, ntree, ETT_ISAKMP_PAYLOAD); + ntree = proto_item_add_subtree(ti, ETT_ISAKMP_PAYLOAD); - proto_tree_add_item(ntree, offset, sizeof(hdr->next_payload), + proto_tree_add_text(ntree, offset, sizeof(hdr->next_payload), "Next payload: %s (%u)", payloadtype2str(hdr->next_payload), hdr->next_payload); offset += sizeof(hdr->next_payload) * 2; - proto_tree_add_item(ntree, offset, sizeof(length), + proto_tree_add_text(ntree, offset, sizeof(length), "Length: %u", length); offset += sizeof(length); - proto_tree_add_item(ntree, offset, length - sizeof(*hdr), "Nonce Data"); + proto_tree_add_text(ntree, offset, length - sizeof(*hdr), "Nonce Data"); offset += (length - sizeof(*hdr)); if (hdr->next_payload < NUM_LOAD_TYPES) @@ -741,44 +739,44 @@ dissect_notif(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { guint16 length = pntohs(&hdr->length); guint32 doi = pntohl(&hdr->doi); guint16 msgtype = pntohs(&hdr->msgtype); - proto_item * ti = proto_tree_add_item(tree, offset, length, "Notification payload"); - proto_tree * ntree = proto_tree_new(); + proto_item * ti = proto_tree_add_text(tree, offset, length, "Notification payload"); + proto_tree * ntree; - proto_item_add_subtree(ti, ntree, ETT_ISAKMP_PAYLOAD); + ntree = proto_item_add_subtree(ti, ETT_ISAKMP_PAYLOAD); - proto_tree_add_item(ntree, offset, sizeof(hdr->next_payload), + proto_tree_add_text(ntree, offset, sizeof(hdr->next_payload), "Next payload: %s (%u)", payloadtype2str(hdr->next_payload), hdr->next_payload); offset += sizeof(hdr->next_payload) * 2; - proto_tree_add_item(ntree, offset, sizeof(length), + proto_tree_add_text(ntree, offset, sizeof(length), "Length: %u", length); offset += sizeof(length); - proto_tree_add_item(ntree, offset, sizeof(doi), + proto_tree_add_text(ntree, offset, sizeof(doi), "Domain of Interpretation: %s (%u)", doitype2str(doi), doi); offset += sizeof(doi); - proto_tree_add_item(ntree, offset, sizeof(hdr->protocol_id), + proto_tree_add_text(ntree, offset, sizeof(hdr->protocol_id), "Protocol ID: %s (%u)", proto2str(hdr->protocol_id), hdr->protocol_id); offset += sizeof(hdr->protocol_id); - proto_tree_add_item(ntree, offset, sizeof(hdr->spi_size), + proto_tree_add_text(ntree, offset, sizeof(hdr->spi_size), "SPI size: %u", hdr->spi_size); offset += sizeof(hdr->spi_size); - proto_tree_add_item(ntree, offset, sizeof(msgtype), + proto_tree_add_text(ntree, offset, sizeof(msgtype), "Message type: %s (%u)", msgtype2str(msgtype), msgtype); offset += sizeof(msgtype); if (hdr->spi_size) { - proto_tree_add_item(ntree, offset, hdr->spi_size, "Security Parameter Index"); + proto_tree_add_text(ntree, offset, hdr->spi_size, "Security Parameter Index"); offset += hdr->spi_size; } if (length - sizeof(*hdr)) { - proto_tree_add_item(ntree, offset, length - sizeof(*hdr) - hdr->spi_size, + proto_tree_add_text(ntree, offset, length - sizeof(*hdr) - hdr->spi_size, "Notification Data"); offset += (length - sizeof(*hdr) - hdr->spi_size); } @@ -796,40 +794,40 @@ dissect_delete(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { guint16 length = pntohs(&hdr->length); guint32 doi = pntohl(&hdr->doi); guint16 num_spis = pntohs(&hdr->num_spis); - proto_item * ti = proto_tree_add_item(tree, offset, length, "Delete payload"); - proto_tree * ntree = proto_tree_new(); + proto_item * ti = proto_tree_add_text(tree, offset, length, "Delete payload"); + proto_tree * ntree; guint16 i; - proto_item_add_subtree(ti, ntree, ETT_ISAKMP_PAYLOAD); + ntree = proto_item_add_subtree(ti, ETT_ISAKMP_PAYLOAD); - proto_tree_add_item(ntree, offset, sizeof(hdr->next_payload), + proto_tree_add_text(ntree, offset, sizeof(hdr->next_payload), "Next payload: %s (%u)", payloadtype2str(hdr->next_payload), hdr->next_payload); offset += sizeof(hdr->next_payload) * 2; - proto_tree_add_item(ntree, offset, sizeof(length), + proto_tree_add_text(ntree, offset, sizeof(length), "Length: %u", length); offset += sizeof(length); - proto_tree_add_item(ntree, offset, sizeof(doi), + proto_tree_add_text(ntree, offset, sizeof(doi), "Domain of Interpretation: %s (%u)", doitype2str(doi), doi); offset += sizeof(doi); - proto_tree_add_item(ntree, offset, sizeof(hdr->protocol_id), + proto_tree_add_text(ntree, offset, sizeof(hdr->protocol_id), "Protocol ID: %s (%u)", proto2str(hdr->protocol_id), hdr->protocol_id); offset += sizeof(hdr->protocol_id); - proto_tree_add_item(ntree, offset, sizeof(hdr->spi_size), + proto_tree_add_text(ntree, offset, sizeof(hdr->spi_size), "SPI size: %u", hdr->spi_size); offset += sizeof(hdr->spi_size); - proto_tree_add_item(ntree, offset, num_spis, + proto_tree_add_text(ntree, offset, num_spis, "Number of SPIs: %u", num_spis); offset += sizeof(hdr->num_spis); for (i = 0; i < num_spis; ++i) { - proto_tree_add_item(ntree, offset, hdr->spi_size, + proto_tree_add_text(ntree, offset, hdr->spi_size, "SPI (%d)", i); offset += hdr->spi_size; } @@ -845,21 +843,21 @@ dissect_vid(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct vid_hdr * hdr = (struct vid_hdr *)(pd + offset); guint16 length = pntohs(&hdr->length); - proto_item * ti = proto_tree_add_item(tree, offset, length, "Vendor ID payload"); - proto_tree * ntree = proto_tree_new(); + proto_item * ti = proto_tree_add_text(tree, offset, length, "Vendor ID payload"); + proto_tree * ntree; - proto_item_add_subtree(ti, ntree, ETT_ISAKMP_PAYLOAD); + ntree = proto_item_add_subtree(ti, ETT_ISAKMP_PAYLOAD); - proto_tree_add_item(ntree, offset, sizeof(hdr->next_payload), + proto_tree_add_text(ntree, offset, sizeof(hdr->next_payload), "Next payload: %s (%u)", payloadtype2str(hdr->next_payload), hdr->next_payload); offset += sizeof(hdr->next_payload) * 2; - proto_tree_add_item(ntree, offset, sizeof(length), + proto_tree_add_text(ntree, offset, sizeof(length), "Length: %u", length); offset += sizeof(length); - proto_tree_add_item(ntree, offset, length - sizeof(*hdr), "Vendor ID"); + proto_tree_add_text(ntree, offset, length - sizeof(*hdr), "Vendor ID"); offset += (length - sizeof(*hdr)); if (hdr->next_payload < NUM_LOAD_TYPES) @@ -1035,10 +1033,10 @@ num2str(const guint8 *pd, guint16 len) { snprintf(numstr, NUMSTR_LEN, "%u", pntohs(pd)); break; case 3: - snprintf(numstr, NUMSTR_LEN, "%u", pntohl(pd) & 0x0fff); + snprintf(numstr, NUMSTR_LEN, "%lu", pntohl(pd) & 0x0fff); break; case 4: - snprintf(numstr, NUMSTR_LEN, "%u", pntohl(pd)); + snprintf(numstr, NUMSTR_LEN, "%lu", pntohl(pd)); break; default: snprintf(numstr, NUMSTR_LEN, ""); diff --git a/packet-llc.c b/packet-llc.c index e339e3f0d0..3aba7cb71e 100644 --- a/packet-llc.c +++ b/packet-llc.c @@ -1,8 +1,8 @@ /* packet-llc.c * Routines for IEEE 802.2 LLC layer - * Gilbert Ramirez + * Gilbert Ramirez * - * $Id: packet-llc.c,v 1.14 1999/03/23 03:14:39 gram Exp $ + * $Id: packet-llc.c,v 1.15 1999/07/07 22:51:46 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -34,64 +34,105 @@ #include #include "packet.h" + +int proto_llc = -1; +int hf_llc_dsap = -1; +int hf_llc_ssap = -1; +int hf_llc_ctrl = -1; +int hf_llc_type = -1; +int hf_llc_oui = -1; typedef void (capture_func_t)(const u_char *, int, guint32, packet_counts *); typedef void (dissect_func_t)(const u_char *, int, frame_data *, proto_tree *); +/* The SAP info is split into two tables, one value_string table and one table of sap_info. This is + * so that the value_string can be used in the header field registration. + */ struct sap_info { guint8 sap; capture_func_t *capture_func; dissect_func_t *dissect_func; - char *text; }; -static struct sap_info saps[] = { - { 0x00, NULL, NULL, "NULL LSAP" }, - { 0x02, NULL, NULL, "LLC Sub-Layer Management Individual" }, - { 0x03, NULL, NULL, "LLC Sub-Layer Management Group" }, - { 0x04, NULL, NULL, "SNA Path Control Individual" }, - { 0x05, NULL, NULL, "SNA Path Control Group" }, - { 0x06, capture_ip, dissect_ip, "TCP/IP" }, - { 0x08, NULL, NULL, "SNA" }, - { 0x0C, NULL, NULL, "SNA" }, - { 0x42, NULL, NULL, "Spanning Tree BPDU" }, - { 0x7F, NULL, NULL, "ISO 802.2" }, - { 0x80, NULL, NULL, "XNS" }, - { 0xAA, NULL, NULL, "SNAP" }, - /*{ 0xBA, NULL, dissect_vines, "Banyan Vines" }, - { 0xBC, NULL, dissect_vines, "Banyan Vines" },*/ - { 0xBA, NULL, NULL, "Banyan Vines" }, - { 0xBC, NULL, NULL, "Banyan Vines" }, - { 0xE0, NULL, dissect_ipx, "NetWare" }, - { 0xF0, NULL, NULL, "NetBIOS" }, - { 0xF4, NULL, NULL, "IBM Net Management Individual" }, - { 0xF5, NULL, NULL, "IBM Net Management Group" }, - { 0xF8, NULL, NULL, "Remote Program Load" }, - { 0xFC, NULL, NULL, "Remote Program Load" }, - { 0xFE, NULL, dissect_osi, "ISO Network Layer" }, - { 0xFF, NULL, NULL, "Global LSAP" }, - { 0x00, NULL, NULL, NULL } +static const value_string sap_vals[] = { + { 0x00, "NULL LSAP" }, + { 0x02, "LLC Sub-Layer Management Individual" }, + { 0x03, "LLC Sub-Layer Management Group" }, + { 0x04, "SNA Path Control Individual" }, + { 0x05, "SNA Path Control Group" }, + { 0x06, "TCP/IP" }, + { 0x08, "SNA" }, + { 0x0C, "SNA" }, + { 0x42, "Spanning Tree BPDU" }, + { 0x7F, "ISO 802.2" }, + { 0x80, "XNS" }, + { 0xAA, "SNAP" }, + { 0xBA, "Banyan Vines" }, + { 0xBC, "Banyan Vines" }, + { 0xE0, "NetWare" }, + { 0xF0, "NetBIOS" }, + { 0xF4, "IBM Net Management Individual" }, + { 0xF5, "IBM Net Management Group" }, + { 0xF8, "Remote Program Load" }, + { 0xFC, "Remote Program Load" }, + { 0xFE, "ISO Network Layer" }, + { 0xFF, "Global LSAP" }, + { 0x00, NULL } }; +static struct sap_info saps[] = { + { 0x00, NULL, NULL }, + { 0x02, NULL, NULL }, + { 0x03, NULL, NULL }, + { 0x04, NULL, NULL }, + { 0x05, NULL, NULL }, + { 0x06, capture_ip, dissect_ip }, + { 0x08, NULL, NULL }, + { 0x0C, NULL, NULL }, + { 0x42, NULL, NULL }, + { 0x7F, NULL, NULL }, + { 0x80, NULL, NULL }, + { 0xAA, NULL, NULL }, + { 0xBA, NULL, NULL }, + { 0xBC, NULL, NULL }, + { 0xE0, NULL, dissect_ipx }, + { 0xF0, NULL, NULL }, + { 0xF4, NULL, NULL }, + { 0xF5, NULL, NULL }, + { 0xF8, NULL, NULL }, + { 0xFC, NULL, NULL }, + { 0xFE, NULL, dissect_osi }, + { 0xFF, NULL, NULL }, + { 0x00, NULL, NULL} +}; -static char* -sap_text(u_char sap) { - int i=0; +static const value_string llc_ctrl_vals[] = { + { 0, "Information Transfer" }, + { 1, "Supervisory" }, + { 2, "Unknown" }, + { 3, "Unnumbered Information" }, + { 0, NULL } +}; - while (saps[i].text != NULL) { - if (saps[i].sap == sap) { - return saps[i].text; - } - i++; - } - return "Unknown"; -} +static const value_string llc_oui_vals[] = { + { 0x000000, "Encapsulated Ethernet" }, +/* +http://www.cisco.com/univercd/cc/td/doc/product/software/ios113ed/113ed_cr/ibm_r/brprt1/brsrb.htm +*/ + { 0x0000f8, "Cisco 90-Compatible" }, + { 0x0000c0, "Cisco" }, + { 0x0080c2, "Bridged Frame-Relay" }, /* RFC 2427 */ + { 0, NULL } +}; static capture_func_t * sap_capture_func(u_char sap) { int i=0; - while (saps[i].text != NULL) { + /* look for the second record where sap == 0, which should + * be the last record + */ + while (saps[i].sap > 0 || i == 0) { if (saps[i].sap == sap) { return saps[i].capture_func; } @@ -104,7 +145,10 @@ static dissect_func_t * sap_dissect_func(u_char sap) { int i=0; - while (saps[i].text != NULL) { + /* look for the second record where sap == 0, which should + * be the last record + */ + while (saps[i].sap > 0 || i == 0) { if (saps[i].sap == sap) { return saps[i].dissect_func; } @@ -113,20 +157,6 @@ sap_dissect_func(u_char sap) { return dissect_data; } -static char* -llc_org(const u_char *ptr) { - - unsigned long org = (ptr[0] << 16) | (ptr[1] << 8) | ptr[2]; - char *llc_org[1] = { - "Encapsulated Ethernet"}; - - if (org > 0) { - return "Unknown"; - } - else { - return llc_org[org]; - } -} void capture_llc(const u_char *pd, int offset, guint32 cap_len, packet_counts *ld) { @@ -166,11 +196,6 @@ dissect_llc(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { int is_snap; dissect_func_t *dissect; - /* LLC Strings */ - char *llc_ctrl[4] = { - "Information Transfer", "Supervisory", - "", "Unnumbered Information" }; - is_snap = (pd[offset] == 0xAA) && (pd[offset+1] == 0xAA); if (check_col(fd, COL_PROTOCOL)) { @@ -178,16 +203,11 @@ dissect_llc(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { } if (tree) { - ti = proto_tree_add_item(tree, offset, (is_snap ? 8 : 3), - "Logical-Link Control"); - llc_tree = proto_tree_new(); - proto_item_add_subtree(ti, llc_tree, ETT_LLC); - proto_tree_add_item(llc_tree, offset, 1, "DSAP: %s (0x%02X)", - sap_text(pd[offset]), pd[offset]); - proto_tree_add_item(llc_tree, offset+1, 1, "SSAP: %s (0x%02X)", - sap_text(pd[offset+1]), pd[offset+1]); - proto_tree_add_item(llc_tree, offset+2, 1, "Control: %s", - llc_ctrl[pd[offset+2] & 3]); + ti = proto_tree_add_item(tree, proto_llc, offset, (is_snap ? 8 : 3), NULL); + llc_tree = proto_item_add_subtree(ti, ETT_LLC); + proto_tree_add_item(llc_tree, hf_llc_dsap, offset, 1, pd[offset]); + proto_tree_add_item(llc_tree, hf_llc_ssap, offset+1, 1, pd[offset+1]); + proto_tree_add_item(llc_tree, hf_llc_ctrl, offset+2, 1, pd[offset+2] & 3); } if (is_snap) { @@ -195,18 +215,18 @@ dissect_llc(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { col_add_str(fd, COL_INFO, "802.2 LLC (SNAP)"); } if (tree) { - proto_tree_add_item(llc_tree, offset+3, 3, - "Organization Code: %s (%02X-%02X-%02X)", - llc_org(&pd[offset+3]), - pd[offset+3], pd[offset+4], pd[offset+5]); + proto_tree_add_item(llc_tree, hf_llc_oui, offset+3, 3, + pd[offset+3] << 16 | pd[offset+4] << 8 | pd[offset+5]); } - etype = (pd[offset+6] << 8) | pd[offset+7]; + etype = pntohs(&pd[offset+6]); offset += 8; - ethertype(etype, offset, pd, fd, tree, llc_tree); + /* w/o even checking, assume OUI is ethertype */ + ethertype(etype, offset, pd, fd, tree, llc_tree, hf_llc_type); } else { if (check_col(fd, COL_INFO)) { - col_add_fstr(fd, COL_INFO, "802.2 LLC (%s)", sap_text(pd[offset])); + col_add_fstr(fd, COL_INFO, "802.2 LLC (%s)", + val_to_str(pd[offset], sap_vals, "%02x")); } dissect = sap_dissect_func(pd[offset]); @@ -223,3 +243,21 @@ dissect_llc(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { } } + +void +proto_register_llc(void) +{ + const hf_register_info hf[] = { + { "DSAP", "llc.dsap", &hf_llc_dsap, FT_VALS_UINT8, VALS(sap_vals) }, + { "SSAP", "llc.ssap", &hf_llc_ssap, FT_VALS_UINT8, VALS(sap_vals) }, + { "Control", "llc.control", &hf_llc_ctrl, FT_VALS_UINT8, VALS(llc_ctrl_vals) }, + + /* registered here but handled in ethertype.c */ + { "Type", "llc.type", &hf_llc_type, FT_VALS_UINT16, VALS(etype_vals) }, + + { "Organization Code", "llc.oui", &hf_llc_oui, FT_VALS_UINT24, VALS(llc_oui_vals) } + }; + + proto_llc = proto_register_protocol ("Logical-Link Control", "llc" ); + proto_register_field_array(proto_llc, hf, array_length(hf)); +} diff --git a/packet-lpd.c b/packet-lpd.c index b1164b611f..e4718488fb 100644 --- a/packet-lpd.c +++ b/packet-lpd.c @@ -2,7 +2,7 @@ * Routines for LPR and LPRng packet disassembly * Gilbert Ramirez * - * $Id: packet-lpd.c,v 1.7 1999/03/23 03:14:39 gram Exp $ + * $Id: packet-lpd.c,v 1.8 1999/07/07 22:51:47 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -93,18 +93,17 @@ dissect_lpd(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) } if (tree) { - ti = proto_tree_add_item(tree, offset, fd->cap_len - offset, + ti = proto_tree_add_text(tree, offset, fd->cap_len - offset, "Line Printer Daemon Protocol"); - lpd_tree = proto_tree_new(); - proto_item_add_subtree(ti, lpd_tree, ETT_LPD); + lpd_tree = proto_item_add_subtree(ti, ETT_LPD); if (lpr_packet_type == request) { if (pd[offset] <= 9) { - proto_tree_add_item(lpd_tree, offset, 1, + proto_tree_add_text(lpd_tree, offset, 1, lpd_client_code[pd[offset]]); } else { - proto_tree_add_item(lpd_tree, offset, 1, + proto_tree_add_text(lpd_tree, offset, 1, lpd_client_code[0]); } printer = g_strdup(&pd[offset+1]); @@ -113,14 +112,14 @@ dissect_lpd(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) if (printer[fd->cap_len - offset - 2] == 0x0a) { printer[fd->cap_len - offset - 2] = 0; } - proto_tree_add_item(lpd_tree, offset+1, fd->cap_len - (offset+1), + proto_tree_add_text(lpd_tree, offset+1, fd->cap_len - (offset+1), /*"Printer/options: %s", &pd[offset+1]);*/ "Printer/options: %s", printer); g_free(printer); } else { if (pd[offset] <= 3) { - proto_tree_add_item(lpd_tree, offset, 2, "Response: %s", + proto_tree_add_text(lpd_tree, offset, 2, "Response: %s", lpd_server_code[pd[offset]]); } else { @@ -130,13 +129,13 @@ dissect_lpd(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) while (fd->cap_len > curr_offset) { newline = strchr(line_pos, '\n'); if (!newline) { - proto_tree_add_item(lpd_tree, curr_offset, + proto_tree_add_text(lpd_tree, curr_offset, fd->cap_len - offset, "Text: %s", line_pos); break; } *newline = 0; substr_len = strlen(line_pos); - proto_tree_add_item(lpd_tree, curr_offset, substr_len + 1, + proto_tree_add_text(lpd_tree, curr_offset, substr_len + 1, "Text: %s", line_pos); curr_offset += substr_len + 1; line_pos = newline + 1; diff --git a/packet-nbipx.c b/packet-nbipx.c index b3543003c5..8a2b973f40 100644 --- a/packet-nbipx.c +++ b/packet-nbipx.c @@ -2,7 +2,7 @@ * Routines for NetBIOS over IPX packet disassembly * Gilbert Ramirez * - * $Id: packet-nbipx.c,v 1.7 1999/05/10 19:01:32 gram Exp $ + * $Id: packet-nbipx.c,v 1.8 1999/07/07 22:51:47 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -141,18 +141,17 @@ nbipx_ns(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, } if (tree) { - ti = proto_tree_add_item(tree, offset, 68, + ti = proto_tree_add_text(tree, offset, 68, "NetBIOS over IPX"); - nbipx_tree = proto_tree_new(); - proto_item_add_subtree(ti, nbipx_tree, ETT_NBIPX); + nbipx_tree = proto_item_add_subtree(ti, ETT_NBIPX); if (header.packet_type <= 1) { - proto_tree_add_item(nbipx_tree, offset+33, 1, + proto_tree_add_text(nbipx_tree, offset+33, 1, "Packet Type: %s (%02X)", packet_type[header.packet_type], header.packet_type); } else { - proto_tree_add_item(nbipx_tree, offset+33, 1, + proto_tree_add_text(nbipx_tree, offset+33, 1, "Packet Type: Unknown (%02X)", header.packet_type); } @@ -161,22 +160,22 @@ nbipx_ns(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, rtr_offset = offset + (i << 2); memcpy(&header.router[i], &pd[rtr_offset], 4); if (header.router[i] != 0) { - proto_tree_add_item(nbipx_tree, rtr_offset, 4, "IPX Network: %s", + proto_tree_add_text(nbipx_tree, rtr_offset, 4, "IPX Network: %s", ipxnet_to_string((guint8*)&header.router[i])); } } - proto_tree_add_item(nbipx_tree, offset+32, 1, "Name Type: %02X", + proto_tree_add_text(nbipx_tree, offset+32, 1, "Name Type: %02X", header.name_type); if (nbipx == NETBIOS_NETWARE) { - proto_tree_add_item(nbipx_tree, offset+name_offset, 16, + proto_tree_add_text(nbipx_tree, offset+name_offset, 16, "Name String: %s", header.name); } else { - proto_tree_add_item(nbipx_tree, offset+name_offset, 16, + proto_tree_add_text(nbipx_tree, offset+name_offset, 16, "Group Name String: %s", header.name); - proto_tree_add_item(nbipx_tree, offset+52, 16, + proto_tree_add_text(nbipx_tree, offset+52, 16, "Node Name String: %s", header.node_name); } diff --git a/packet-nbns.c b/packet-nbns.c index 0bf84e3ff8..c44de19a97 100644 --- a/packet-nbns.c +++ b/packet-nbns.c @@ -4,7 +4,7 @@ * Gilbert Ramirez * Much stuff added by Guy Harris * - * $Id: packet-nbns.c,v 1.21 1999/06/01 20:40:34 guy Exp $ + * $Id: packet-nbns.c,v 1.22 1999/07/07 22:51:47 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -303,18 +303,17 @@ dissect_nbns_query(const u_char *nbns_data_ptr, const u_char *pd, int offset, type_name = nbns_type_name(type); class_name = dns_class_name(class); - tq = proto_tree_add_item(nbns_tree, offset, len, "%s: type %s, class %s", + tq = proto_tree_add_text(nbns_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_NBNS_QD); + q_tree = proto_item_add_subtree(tq, ETT_NBNS_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", type_name); + proto_tree_add_text(q_tree, offset, 2, "Type: %s", 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; @@ -347,49 +346,48 @@ nbns_add_nbns_flags(proto_tree *nbns_tree, int offset, u_short flags, strcat(buf, val_to_str(flags & F_RCODE, rcode_vals, "Unknown error")); } - tf = proto_tree_add_item(nbns_tree, offset, 2, + tf = proto_tree_add_text(nbns_tree, offset, 2, "Flags: 0x%04x (%s)", flags, buf); - field_tree = proto_tree_new(); - proto_item_add_subtree(tf, field_tree, ETT_NBNS_FLAGS); - proto_tree_add_item(field_tree, offset, 2, "%s", + field_tree = proto_item_add_subtree(tf, ETT_NBNS_FLAGS); + proto_tree_add_text(field_tree, offset, 2, "%s", decode_boolean_bitfield(flags, F_RESPONSE, 2*8, "Response", "Query")); - proto_tree_add_item(field_tree, offset, 2, "%s", + proto_tree_add_text(field_tree, offset, 2, "%s", decode_enumerated_bitfield(flags, F_OPCODE, 2*8, opcode_vals, "%s")); if (flags & F_RESPONSE) { - proto_tree_add_item(field_tree, offset, 2, + proto_tree_add_text(field_tree, offset, 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, 2, "%s", + proto_tree_add_text(field_tree, offset, 2, "%s", decode_boolean_bitfield(flags, F_TRUNCATED, 2*8, "Message is truncated", "Message is not truncated")); - proto_tree_add_item(field_tree, offset, 2, "%s", + proto_tree_add_text(field_tree, offset, 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, 2, + proto_tree_add_text(field_tree, offset, 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, 2, "%s", + proto_tree_add_text(field_tree, offset, 2, "%s", decode_boolean_bitfield(flags, F_BROADCAST, 2*8, "Broadcast packet", "Not a broadcast packet")); if (flags & F_RESPONSE && !is_wack) { - proto_tree_add_item(field_tree, offset, 2, + proto_tree_add_text(field_tree, offset, 2, "%s", decode_enumerated_bitfield(flags, F_RCODE, 2*8, @@ -418,16 +416,15 @@ nbns_add_nb_flags(proto_tree *rr_tree, int offset, u_short flags) strcat(buf, "group"); else strcat(buf, "unique"); - tf = proto_tree_add_item(rr_tree, offset, 2, "Flags: 0x%x (%s)", flags, + tf = proto_tree_add_text(rr_tree, offset, 2, "Flags: 0x%x (%s)", flags, buf); - field_tree = proto_tree_new(); - proto_item_add_subtree(tf, field_tree, ETT_NBNS_NB_FLAGS); - proto_tree_add_item(field_tree, offset, 2, "%s", + field_tree = proto_item_add_subtree(tf, ETT_NBNS_NB_FLAGS); + proto_tree_add_text(field_tree, offset, 2, "%s", decode_boolean_bitfield(flags, NB_FLAGS_G, 2*8, "Group name", "Unique name")); - proto_tree_add_item(field_tree, offset, 2, "%s", + proto_tree_add_text(field_tree, offset, 2, "%s", decode_enumerated_bitfield(flags, NB_FLAGS_ONT, 2*8, nb_flags_ont_vals, "%s")); } @@ -460,34 +457,33 @@ nbns_add_name_flags(proto_tree *rr_tree, int offset, u_short flags) strcat(buf, ", active"); if (flags & NAME_FLAGS_PRM) strcat(buf, ", permanent node name"); - tf = proto_tree_add_item(rr_tree, offset, 2, "Name flags: 0x%x (%s)", + tf = proto_tree_add_text(rr_tree, offset, 2, "Name flags: 0x%x (%s)", flags, buf); - field_tree = proto_tree_new(); - proto_item_add_subtree(tf, field_tree, ETT_NBNS_NAME_FLAGS); - proto_tree_add_item(field_tree, offset, 2, "%s", + field_tree = proto_item_add_subtree(tf, ETT_NBNS_NAME_FLAGS); + proto_tree_add_text(field_tree, offset, 2, "%s", decode_boolean_bitfield(flags, NAME_FLAGS_G, 2*8, "Group name", "Unique name")); - proto_tree_add_item(field_tree, offset, 2, "%s", + proto_tree_add_text(field_tree, offset, 2, "%s", decode_enumerated_bitfield(flags, NAME_FLAGS_ONT, 2*8, name_flags_ont_vals, "%s")); - proto_tree_add_item(field_tree, offset, 2, "%s", + proto_tree_add_text(field_tree, offset, 2, "%s", decode_boolean_bitfield(flags, NAME_FLAGS_DRG, 2*8, "Name is being deregistered", "Name is not being deregistered")); - proto_tree_add_item(field_tree, offset, 2, "%s", + proto_tree_add_text(field_tree, offset, 2, "%s", decode_boolean_bitfield(flags, NAME_FLAGS_CNF, 2*8, "Name is in conflict", "Name is not in conflict")); - proto_tree_add_item(field_tree, offset, 2, "%s", + proto_tree_add_text(field_tree, offset, 2, "%s", decode_boolean_bitfield(flags, NAME_FLAGS_ACT, 2*8, "Name is active", "Name is not active")); - proto_tree_add_item(field_tree, offset, 2, "%s", + proto_tree_add_text(field_tree, offset, 2, "%s", decode_boolean_bitfield(flags, NAME_FLAGS_PRM, 2*8, "Permanent node name", @@ -530,7 +526,7 @@ dissect_nbns_answer(const u_char *nbns_data_ptr, const u_char *pd, int offset, switch (type) { case T_NB: /* "NB" record */ - trr = proto_tree_add_item(nbns_tree, offset, + trr = proto_tree_add_text(nbns_tree, offset, (dptr - data_start) + data_len, "%s: type %s, class %s", name, type_name, class_name); @@ -543,7 +539,7 @@ dissect_nbns_answer(const u_char *nbns_data_ptr, const u_char *pd, int offset, * same type of RR data as other T_NB * responses. */ if (data_len < 2) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } @@ -554,7 +550,7 @@ dissect_nbns_answer(const u_char *nbns_data_ptr, const u_char *pd, int offset, data_len -= 2; } else { if (data_len < 2) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } @@ -565,11 +561,11 @@ dissect_nbns_answer(const u_char *nbns_data_ptr, const u_char *pd, int offset, data_len -= 2; if (data_len < 4) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 4, + proto_tree_add_text(rr_tree, offset, 4, "Addr: %s", ip_to_str((guint8 *)dptr)); dptr += 4; @@ -585,7 +581,7 @@ dissect_nbns_answer(const u_char *nbns_data_ptr, const u_char *pd, int offset, char nbname[16+4+1]; /* 4 for [] */ u_short name_flags; - trr = proto_tree_add_item(nbns_tree, offset, + trr = proto_tree_add_text(nbns_tree, offset, (dptr - data_start) + data_len, "%s: type %s, class %s", name, type_name, class_name); @@ -593,32 +589,32 @@ dissect_nbns_answer(const u_char *nbns_data_ptr, const u_char *pd, int offset, name_len, type_name, class_name, ttl, data_len); offset += (dptr - data_start); if (data_len < 1) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } num_names = *dptr; dptr += 1; - proto_tree_add_item(rr_tree, offset, 2, + proto_tree_add_text(rr_tree, offset, 2, "Number of names: %u", num_names); offset += 1; while (num_names != 0) { if (data_len < 16) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); goto out; } memcpy(nbname, dptr, 16); dptr += 16; canonicalize_netbios_name(nbname); - proto_tree_add_item(rr_tree, offset, 16, + proto_tree_add_text(rr_tree, offset, 16, "Name: %s", nbname); offset += 16; data_len -= 16; if (data_len < 2) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); goto out; } @@ -632,11 +628,11 @@ dissect_nbns_answer(const u_char *nbns_data_ptr, const u_char *pd, int offset, } if (data_len < 6) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 6, + proto_tree_add_text(rr_tree, offset, 6, "Unit ID: %s", ether_to_str((guint8 *)dptr)); dptr += 6; @@ -644,181 +640,181 @@ dissect_nbns_answer(const u_char *nbns_data_ptr, const u_char *pd, int offset, data_len -= 6; if (data_len < 1) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 1, + proto_tree_add_text(rr_tree, offset, 1, "Jumpers: 0x%x", *dptr); dptr += 1; offset += 1; data_len -= 1; if (data_len < 1) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 1, + proto_tree_add_text(rr_tree, offset, 1, "Test result: 0x%x", *dptr); dptr += 1; offset += 1; data_len -= 1; if (data_len < 2) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 2, + proto_tree_add_text(rr_tree, offset, 2, "Version number: 0x%x", pntohs(dptr)); dptr += 2; offset += 2; data_len -= 2; if (data_len < 2) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 2, + proto_tree_add_text(rr_tree, offset, 2, "Period of statistics: 0x%x", pntohs(dptr)); dptr += 2; offset += 2; data_len -= 2; if (data_len < 2) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 2, + proto_tree_add_text(rr_tree, offset, 2, "Number of CRCs: %u", pntohs(dptr)); dptr += 2; offset += 2; data_len -= 2; if (data_len < 2) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 2, + proto_tree_add_text(rr_tree, offset, 2, "Number of alignment errors: %u", pntohs(dptr)); dptr += 2; offset += 2; data_len -= 2; if (data_len < 2) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 2, + proto_tree_add_text(rr_tree, offset, 2, "Number of collisions: %u", pntohs(dptr)); dptr += 2; offset += 2; data_len -= 2; if (data_len < 2) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 2, + proto_tree_add_text(rr_tree, offset, 2, "Number of send aborts: %u", pntohs(dptr)); dptr += 2; offset += 2; data_len -= 2; if (data_len < 4) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 4, + proto_tree_add_text(rr_tree, offset, 4, "Number of good sends: %u", pntohl(dptr)); dptr += 4; offset += 4; data_len -= 4; if (data_len < 4) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 4, + proto_tree_add_text(rr_tree, offset, 4, "Number of good receives: %u", pntohl(dptr)); dptr += 4; offset += 4; data_len -= 4; if (data_len < 2) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 2, + proto_tree_add_text(rr_tree, offset, 2, "Number of retransmits: %u", pntohs(dptr)); dptr += 2; offset += 2; data_len -= 2; if (data_len < 2) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 2, + proto_tree_add_text(rr_tree, offset, 2, "Number of no resource conditions: %u", pntohs(dptr)); dptr += 2; offset += 2; data_len -= 2; if (data_len < 2) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 2, + proto_tree_add_text(rr_tree, offset, 2, "Number of command blocks: %u", pntohs(dptr)); dptr += 2; offset += 2; data_len -= 2; if (data_len < 2) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 2, + proto_tree_add_text(rr_tree, offset, 2, "Number of pending sessions: %u", pntohs(dptr)); dptr += 2; offset += 2; data_len -= 2; if (data_len < 2) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 2, + proto_tree_add_text(rr_tree, offset, 2, "Max number of pending sessions: %u", pntohs(dptr)); dptr += 2; offset += 2; - proto_tree_add_item(rr_tree, offset, 2, + proto_tree_add_text(rr_tree, offset, 2, "Max total sessions possible: %u", pntohs(dptr)); dptr += 2; offset += 2; data_len -= 2; if (data_len < 2) { - proto_tree_add_item(rr_tree, offset, + proto_tree_add_text(rr_tree, offset, data_len, "(incomplete entry)"); break; } - proto_tree_add_item(rr_tree, offset, 2, + proto_tree_add_text(rr_tree, offset, 2, "Session data packet size: %u", pntohs(dptr)); dptr += 2; offset += 2; @@ -828,14 +824,14 @@ dissect_nbns_answer(const u_char *nbns_data_ptr, const u_char *pd, int offset, break; default: - trr = proto_tree_add_item(nbns_tree, offset, + trr = proto_tree_add_text(nbns_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_NBNS_RR, offset, name, name_len, 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"); break; } dptr += data_len; @@ -852,9 +848,8 @@ dissect_query_records(const u_char *nbns_data_ptr, int count, const u_char *pd, proto_item *ti; start_off = cur_off; - ti = proto_tree_add_item(nbns_tree, start_off, 0, "Queries"); - qatree = proto_tree_new(); - proto_item_add_subtree(ti, qatree, ETT_NBNS_QRY); + ti = proto_tree_add_text(nbns_tree, start_off, 0, "Queries"); + qatree = proto_item_add_subtree(ti, ETT_NBNS_QRY); while (count-- > 0) cur_off += dissect_nbns_query(nbns_data_ptr, pd, cur_off, qatree); proto_item_set_len(ti, cur_off - start_off); @@ -873,9 +868,8 @@ dissect_answer_records(const u_char *nbns_data_ptr, int count, proto_item *ti; start_off = cur_off; - ti = proto_tree_add_item(nbns_tree, start_off, 0, name); - qatree = proto_tree_new(); - proto_item_add_subtree(ti, qatree, ETT_NBNS_ANS); + ti = proto_tree_add_text(nbns_tree, start_off, 0, name); + qatree = proto_item_add_subtree(ti, ETT_NBNS_ANS); while (count-- > 0) cur_off += dissect_nbns_answer(nbns_data_ptr, pd, cur_off, qatree, opcode); @@ -912,25 +906,24 @@ dissect_nbns(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, "NetBIOS Name Service"); - nbns_tree = proto_tree_new(); - proto_item_add_subtree(ti, nbns_tree, ETT_NBNS); + nbns_tree = proto_item_add_subtree(ti, ETT_NBNS); - proto_tree_add_item(nbns_tree, offset + NBNS_ID, 2, + proto_tree_add_text(nbns_tree, offset + NBNS_ID, 2, "Transaction ID: 0x%04X", id); nbns_add_nbns_flags(nbns_tree, offset + NBNS_FLAGS, flags, 0); - proto_tree_add_item(nbns_tree, offset + NBNS_QUEST, 2, + proto_tree_add_text(nbns_tree, offset + NBNS_QUEST, 2, "Questions: %d", quest); - proto_tree_add_item(nbns_tree, offset + NBNS_ANS, 2, + proto_tree_add_text(nbns_tree, offset + NBNS_ANS, 2, "Answer RRs: %d", ans); - proto_tree_add_item(nbns_tree, offset + NBNS_AUTH, 2, + proto_tree_add_text(nbns_tree, offset + NBNS_AUTH, 2, "Authority RRs: %d", auth); - proto_tree_add_item(nbns_tree, offset + NBNS_ADD, 2, + proto_tree_add_text(nbns_tree, offset + NBNS_ADD, 2, "Additional RRs: %d", add); @@ -1052,25 +1045,24 @@ dissect_nbdgm(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, } if (tree) { - ti = proto_tree_add_item(tree, offset, header.dgm_length, + ti = proto_tree_add_text(tree, offset, header.dgm_length, "NetBIOS Datagram Service"); - nbdgm_tree = proto_tree_new(); - proto_item_add_subtree(ti, nbdgm_tree, ETT_NBDGM); + nbdgm_tree = proto_item_add_subtree(ti, ETT_NBDGM); - proto_tree_add_item(nbdgm_tree, offset, 1, "Message Type: %s", + proto_tree_add_text(nbdgm_tree, offset, 1, "Message Type: %s", message[message_index]); - proto_tree_add_item(nbdgm_tree, offset+1, 1, "More fragments follow: %s", + proto_tree_add_text(nbdgm_tree, offset+1, 1, "More fragments follow: %s", yesno[header.flags.more]); - proto_tree_add_item(nbdgm_tree, offset+1, 1, "This is first fragment: %s", + proto_tree_add_text(nbdgm_tree, offset+1, 1, "This is first fragment: %s", yesno[header.flags.first]); - proto_tree_add_item(nbdgm_tree, offset+1, 1, "Node Type: %s", + proto_tree_add_text(nbdgm_tree, offset+1, 1, "Node Type: %s", node[header.flags.node_type]); - proto_tree_add_item(nbdgm_tree, offset+2, 2, "Datagram ID: 0x%04X", + proto_tree_add_text(nbdgm_tree, offset+2, 2, "Datagram ID: 0x%04X", header.dgm_id); - proto_tree_add_item(nbdgm_tree, offset+4, 4, "Source IP: %s", + proto_tree_add_text(nbdgm_tree, offset+4, 4, "Source IP: %s", ip_to_str((guint8 *)&header.src_ip)); - proto_tree_add_item(nbdgm_tree, offset+8, 2, "Source Port: %d", + proto_tree_add_text(nbdgm_tree, offset+8, 2, "Source Port: %d", header.src_port); } @@ -1081,9 +1073,9 @@ dissect_nbdgm(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, header.msg_type == 0x11 || header.msg_type == 0x12) { if (tree) { - proto_tree_add_item(nbdgm_tree, offset, 2, + proto_tree_add_text(nbdgm_tree, offset, 2, "Datagram length: %d bytes", header.dgm_length); - proto_tree_add_item(nbdgm_tree, offset+2, 2, + proto_tree_add_text(nbdgm_tree, offset+2, 2, "Packet offset: %d bytes", header.pkt_offset); } @@ -1094,7 +1086,7 @@ dissect_nbdgm(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, len = get_nbns_name(&pd[offset], pd, offset, name); if (tree) { - proto_tree_add_item(nbdgm_tree, offset, len, "Source name: %s", + proto_tree_add_text(nbdgm_tree, offset, len, "Source name: %s", name); } offset += len; @@ -1104,7 +1096,7 @@ dissect_nbdgm(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, len = get_nbns_name(&pd[offset], pd, offset, name); if (tree) { - proto_tree_add_item(nbdgm_tree, offset, len, "Destination name: %s", + proto_tree_add_text(nbdgm_tree, offset, len, "Destination name: %s", name); } offset += len; @@ -1115,7 +1107,7 @@ dissect_nbdgm(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, } else if (header.msg_type == 0x13) { if (tree) { - proto_tree_add_item(nbdgm_tree, offset, 1, "Error code: %s", + proto_tree_add_text(nbdgm_tree, offset, 1, "Error code: %s", val_to_str(header.error_code, error_codes, "Unknown (0x%x)")); } } @@ -1125,7 +1117,7 @@ dissect_nbdgm(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, len = get_nbns_name(&pd[offset], pd, offset, name); if (tree) { - proto_tree_add_item(nbdgm_tree, offset, len, "Destination name: %s", + proto_tree_add_text(nbdgm_tree, offset, len, "Destination name: %s", name); } } @@ -1192,22 +1184,20 @@ dissect_nbss_packet(const u_char *pd, int offset, frame_data *fd, proto_tree *tr length += 65536; if (tree) { - ti = proto_tree_add_item(tree, offset, length + 4, + ti = proto_tree_add_text(tree, offset, length + 4, "NetBIOS Session Service"); - nbss_tree = proto_tree_new(); - proto_item_add_subtree(ti, nbss_tree, ETT_NBSS); + nbss_tree = proto_item_add_subtree(ti, ETT_NBSS); - proto_tree_add_item(nbss_tree, offset, 1, "Message Type: %s", + proto_tree_add_text(nbss_tree, offset, 1, "Message Type: %s", val_to_str(msg_type, message_types, "Unknown (%x)")); } offset += 1; if (tree) { - tf = proto_tree_add_item(nbss_tree, offset, 1, "Flags: 0x%04x", flags); - field_tree = proto_tree_new(); - proto_item_add_subtree(tf, field_tree, ETT_NBSS_FLAGS); - proto_tree_add_item(field_tree, offset, 1, "%s", + tf = proto_tree_add_text(nbss_tree, offset, 1, "Flags: 0x%04x", flags); + field_tree = proto_item_add_subtree(tf, ETT_NBSS_FLAGS); + proto_tree_add_text(field_tree, offset, 1, "%s", decode_boolean_bitfield(flags, NBSS_FLAGS_E, 8, "Add 65536 to length", "Add 0 to length")); } @@ -1215,7 +1205,7 @@ dissect_nbss_packet(const u_char *pd, int offset, frame_data *fd, proto_tree *tr offset += 1; if (tree) { - proto_tree_add_item(nbss_tree, offset, 2, "Length: %u", length); + proto_tree_add_text(nbss_tree, offset, 2, "Length: %u", length); } offset += 2; @@ -1225,35 +1215,35 @@ dissect_nbss_packet(const u_char *pd, int offset, frame_data *fd, proto_tree *tr case SESSION_REQUEST: len = get_nbns_name(&pd[offset], pd, offset, name); if (tree) - proto_tree_add_item(nbss_tree, offset, len, + proto_tree_add_text(nbss_tree, offset, len, "Called name: %s", name); offset += len; len = get_nbns_name(&pd[offset], pd, offset, name); if (tree) - proto_tree_add_item(nbss_tree, offset, len, + proto_tree_add_text(nbss_tree, offset, len, "Calling name: %s", name); break; case NEGATIVE_SESSION_RESPONSE: if (tree) - proto_tree_add_item(nbss_tree, offset, 1, + proto_tree_add_text(nbss_tree, offset, 1, "Error code: %s", val_to_str(pd[offset], error_codes, "Unknown (%x)")); break; case RETARGET_SESSION_RESPONSE: if (tree) - proto_tree_add_item(nbss_tree, offset, 4, + proto_tree_add_text(nbss_tree, offset, 4, "Retarget IP address: %s", ip_to_str((guint8 *)&pd[offset])); offset += 4; if (tree) - proto_tree_add_item(nbss_tree, offset, 2, + proto_tree_add_text(nbss_tree, offset, 2, "Retarget port: %u", pntohs(&pd[offset])); break; diff --git a/packet-ncp.c b/packet-ncp.c index ebca85db9b..ca376c09a6 100644 --- a/packet-ncp.c +++ b/packet-ncp.c @@ -2,7 +2,7 @@ * Routines for NetWare Core Protocol * Gilbert Ramirez * - * $Id: packet-ncp.c,v 1.15 1999/05/26 21:46:07 gram Exp $ + * $Id: packet-ncp.c,v 1.16 1999/07/07 22:51:48 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -60,9 +60,10 @@ parse_ncp_svc_fields(const u_char *pd, proto_tree *ncp_tree, int offset, /* Hash functions */ -gint ncp_equal (const gpointer v, const gpointer v2); -guint ncp_hash (const gpointer v); +gint ncp_equal (gconstpointer v, gconstpointer v2); +guint ncp_hash (gconstpointer v); +int ncp_packet_init_count = 200; /* The information in this module comes from: NetWare LAN Analysis, Second Edition @@ -343,7 +344,7 @@ GMemChunk *ncp_request_keys = NULL; GMemChunk *ncp_request_records = NULL; /* Hash Functions */ -gint ncp_equal (const gpointer v, const gpointer v2) +gint ncp_equal (gconstpointer v, gconstpointer v2) { struct ncp_request_key *val1 = (struct ncp_request_key*)v; struct ncp_request_key *val2 = (struct ncp_request_key*)v2; @@ -362,7 +363,7 @@ gint ncp_equal (const gpointer v, const gpointer v2) return 0; } -guint ncp_hash (const gpointer v) +guint ncp_hash (gconstpointer v) { struct ncp_request_key *ncp_key = (struct ncp_request_key*)v; #if defined(DEBUG_NCP_HASH) @@ -393,10 +394,10 @@ ncp_init_protocol(void) ncp_request_hash = g_hash_table_new(ncp_hash, ncp_equal); ncp_request_keys = g_mem_chunk_new("ncp_request_keys", sizeof(struct ncp_request_key), - 1000 * sizeof(struct ncp_request_key), G_ALLOC_AND_FREE); + ncp_packet_init_count * sizeof(struct ncp_request_key), G_ALLOC_AND_FREE); ncp_request_records = g_mem_chunk_new("ncp_request_records", sizeof(struct ncp_request_val), - 1000 * sizeof(struct ncp_request_val), G_ALLOC_AND_FREE); + ncp_packet_init_count * sizeof(struct ncp_request_val), G_ALLOC_AND_FREE); } static struct ncp2222_record * @@ -448,22 +449,21 @@ dissect_ncp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, nw_ncp_type = header.type; if (tree) { - ti = proto_tree_add_item(tree, offset, END_OF_FRAME, + ti = proto_tree_add_text(tree, offset, END_OF_FRAME, "NetWare Core Protocol"); - ncp_tree = proto_tree_new(); - proto_item_add_subtree(ti, ncp_tree, ETT_NCP); + ncp_tree = proto_item_add_subtree(ti, ETT_NCP); - proto_tree_add_item(ncp_tree, offset, 2, + proto_tree_add_text(ncp_tree, offset, 2, "Type: %s", val_to_str( header.type, request_reply_values, "Unknown (%04X)")); - proto_tree_add_item(ncp_tree, offset+2, 1, + proto_tree_add_text(ncp_tree, offset+2, 1, "Sequence Number: %d", header.sequence); - proto_tree_add_item(ncp_tree, offset+3, 3, + proto_tree_add_text(ncp_tree, offset+3, 3, "Connection Number: %d", nw_connection); - proto_tree_add_item(ncp_tree, offset+4, 1, + proto_tree_add_text(ncp_tree, offset+4, 1, "Task Number: %d", header.task); } @@ -508,16 +508,16 @@ dissect_ncp_request(const u_char *pd, int offset, frame_data *fd, } if (ncp_tree) { - proto_tree_add_item(ncp_tree, offset+6, 1, + proto_tree_add_text(ncp_tree, offset+6, 1, "Function Code: 0x%02X (%s)", request.function, description); if (ncp_request) { if (ncp_request->submask == SUBFUNC) { - proto_tree_add_item(ncp_tree, offset+7, 2, + proto_tree_add_text(ncp_tree, offset+7, 2, "Packet Length: %d bytes", pntohs(&pd[offset+7])); - proto_tree_add_item(ncp_tree, offset+9, 1, + proto_tree_add_text(ncp_tree, offset+9, 1, "Subfunction Code: 0x%02x", pd[offset+9]); offset += 7 + 3; } @@ -526,10 +526,9 @@ dissect_ncp_request(const u_char *pd, int offset, frame_data *fd, } if (ncp_request->req) { - ti = proto_tree_add_item(ncp_tree, offset, END_OF_FRAME, + ti = proto_tree_add_text(ncp_tree, offset, END_OF_FRAME, "NCP Request Packet"); - field_tree = proto_tree_new(); - proto_item_add_subtree(ti, field_tree, ETT_NCP_REQUEST_FIELDS); + field_tree = proto_item_add_subtree(ti, ETT_NCP_REQUEST_FIELDS); parse_ncp_svc_fields(pd, field_tree, offset, ncp_request->req); } @@ -596,26 +595,25 @@ dissect_ncp_reply(const u_char *pd, int offset, frame_data *fd, /* A completion code of 0 always means OK. Other values have different * meanings */ if (ncp_request) { - proto_tree_add_item(ncp_tree, offset+6, 1, + proto_tree_add_text(ncp_tree, offset+6, 1, "Completion Code: 0x%02x (%s)", reply.completion_code, ncp_completion_code(reply.completion_code, ncp_request->family)); } else { - proto_tree_add_item(ncp_tree, offset+6, 1, + proto_tree_add_text(ncp_tree, offset+6, 1, "Completion Code: 0x%02x (%s)", reply.completion_code, reply.completion_code == 0 ? "OK" : "Unknown"); } - proto_tree_add_item(ncp_tree, offset+7, 1, + proto_tree_add_text(ncp_tree, offset+7, 1, "Connection Status: %d", reply.connection_state); if (ncp_request) { if (ncp_request->rep) { - ti = proto_tree_add_item(ncp_tree, offset+8, END_OF_FRAME, + ti = proto_tree_add_text(ncp_tree, offset+8, END_OF_FRAME, "NCP Reply Packet"); - field_tree = proto_tree_new(); - proto_item_add_subtree(ti, field_tree, ETT_NCP_REPLY_FIELDS); + field_tree = proto_item_add_subtree(ti, ETT_NCP_REPLY_FIELDS); parse_ncp_svc_fields(pd, field_tree, offset+8, ncp_request->rep); } @@ -637,20 +635,20 @@ parse_ncp_svc_fields(const u_char *pd, proto_tree *ncp_tree, int offset, switch(rec->type) { case nbeshort: field_length = 2; - proto_tree_add_item(ncp_tree, field_offset, + proto_tree_add_text(ncp_tree, field_offset, field_length, rec->description, pntohs(&pd[field_offset])); break; case nasciile: field_length = pd[field_offset]; - proto_tree_add_item(ncp_tree, field_offset, + proto_tree_add_text(ncp_tree, field_offset, field_length + 1, rec->description, field_length, &pd[field_offset+1]); break; case nhex: field_length = rec->length; - proto_tree_add_item(ncp_tree, field_offset, + proto_tree_add_text(ncp_tree, field_offset, field_length, rec->description); break; diff --git a/packet-nntp.c b/packet-nntp.c index 7aabb1382e..d4fd4900aa 100644 --- a/packet-nntp.c +++ b/packet-nntp.c @@ -2,7 +2,7 @@ * Routines for nntp packet dissection * Copyright 1999, Richard Sharpe * - * $Id: packet-nntp.c,v 1.1 1999/04/06 02:02:11 guy Exp $ + * $Id: packet-nntp.c,v 1.2 1999/07/07 22:51:49 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -77,10 +77,9 @@ dissect_nntp(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, "Network News Transfer Protocol"); - nntp_tree = proto_tree_new(); - proto_item_add_subtree(ti, nntp_tree, ETT_NNTP); + nntp_tree = proto_item_add_subtree(ti, ETT_NNTP); /* * Show the request or response as text, a line at a time. @@ -100,7 +99,7 @@ dissect_nntp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int /* * Put this line. */ - proto_tree_add_item(nntp_tree, offset, linelen, "%s", + proto_tree_add_text(nntp_tree, offset, linelen, "%s", format_text(data, linelen)); offset += linelen; data = lineend; diff --git a/packet-null.c b/packet-null.c index bfc7b9944e..bb5f53c12a 100644 --- a/packet-null.c +++ b/packet-null.c @@ -1,7 +1,7 @@ /* packet-null.c * Routines for null packet disassembly * - * $Id: packet-null.c,v 1.7 1999/03/23 03:14:41 gram Exp $ + * $Id: packet-null.c,v 1.8 1999/07/07 22:51:49 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -36,6 +36,11 @@ #include #include "packet.h" + +int proto_null = -1; +int hf_null_next = -1; +int hf_null_len = -1; +int hf_null_family = -1; /* Null/loopback structs and definitions */ @@ -100,12 +105,11 @@ dissect_null( const u_char *pd, frame_data *fd, proto_tree *tree ) { /* populate a tree in the second pane with the status of the link layer (ie none) */ if(tree) { - ti = proto_tree_add_item(tree, 0, 4, "Null/Loopback" ); - fh_tree = proto_tree_new(); - proto_item_add_subtree(ti, fh_tree, ETT_NULL); - proto_tree_add_item(fh_tree, 0, 1, "Next: %02x", nh.null_next); - proto_tree_add_item(fh_tree, 1, 1, "Length: %02x", nh.null_len); - proto_tree_add_item(fh_tree, 2, 2, "Family: %04x", nh.null_family); + ti = proto_tree_add_item(tree, proto_null, 0, 4, NULL); + fh_tree = proto_item_add_subtree(ti, ETT_NULL); + proto_tree_add_item(fh_tree, hf_null_next, 0, 1, nh.null_next); + proto_tree_add_item(fh_tree, hf_null_len, 1, 1, nh.null_len); + proto_tree_add_item(fh_tree, hf_null_family, 2, 2, nh.null_family); } /* @@ -132,3 +136,32 @@ dissect_null( const u_char *pd, frame_data *fd, proto_tree *tree ) { break; } } + +void +proto_register_null(void) +{ + proto_null = proto_register_protocol ( + /* name */ "Null/Loopback", + /* abbrev */ "null" ); + + hf_null_next = proto_register_field ( + /* name */ "Next", + /* abbrev */ "null.next", + /* ftype */ FT_UINT8, + /* parent */ proto_null, + /* vals[] */ NULL ); + + hf_null_len = proto_register_field ( + /* name */ "Length", + /* abbrev */ "null.len", + /* ftype */ FT_UINT8, + /* parent */ proto_null, + /* vals[] */ NULL ); + + hf_null_family = proto_register_field ( + /* name */ "Family", + /* abbrev */ "null.family", + /* ftype */ FT_UINT16, + /* parent */ proto_null, + /* vals[] */ NULL ); +} diff --git a/packet-osi.c b/packet-osi.c index 50ecd382b6..933811b1ee 100644 --- a/packet-osi.c +++ b/packet-osi.c @@ -1,7 +1,7 @@ /* packet-osi.c * Routines for ISO/OSI network and transport protocol packet disassembly * - * $Id: packet-osi.c,v 1.6 1999/03/23 03:14:41 gram Exp $ + * $Id: packet-osi.c,v 1.7 1999/07/07 22:51:49 gram Exp $ * Laurent Deniel * * Ethereal - Network traffic analyzer @@ -245,18 +245,17 @@ static int osi_decode_DR(const u_char *pd, int offset, src_ref, dst_ref); if (tree) { - ti = proto_tree_add_item(tree, offset, li + 1, "ISO COTP"); - cotp_tree = proto_tree_new(); - proto_item_add_subtree(ti, cotp_tree, ETT_COTP); - proto_tree_add_item(cotp_tree, offset, 1, + ti = proto_tree_add_text(tree, offset, li + 1, "ISO COTP"); + cotp_tree = proto_item_add_subtree(ti, ETT_COTP); + proto_tree_add_text(cotp_tree, offset, 1, "Length indicator: %d", li); - proto_tree_add_item(cotp_tree, offset + 1, 1, + proto_tree_add_text(cotp_tree, offset + 1, 1, "TPDU code: Ox%x (DR)", tpdu); - proto_tree_add_item(cotp_tree, offset + 2, 2, + proto_tree_add_text(cotp_tree, offset + 2, 2, "Destination reference: 0x%04x", dst_ref); - proto_tree_add_item(cotp_tree, offset + 4, 2, + proto_tree_add_text(cotp_tree, offset + 4, 2, "Source reference: 0x%04x", src_ref); - proto_tree_add_item(cotp_tree, offset + 6, 1, + proto_tree_add_text(cotp_tree, offset + 6, 1, "Cause: %s", str); } @@ -338,63 +337,62 @@ static int osi_decode_DT(const u_char *pd, int offset, (fragment)? "(fragment)" : ""); if (tree) { - ti = proto_tree_add_item(tree, offset, li + 1, "ISO COTP"); - cotp_tree = proto_tree_new(); - proto_item_add_subtree(ti, cotp_tree, ETT_COTP); - proto_tree_add_item(cotp_tree, offset, 1, + ti = proto_tree_add_text(tree, offset, li + 1, "ISO COTP"); + cotp_tree = proto_item_add_subtree(ti, ETT_COTP); + proto_tree_add_text(cotp_tree, offset, 1, "Length indicator: %d", li); - proto_tree_add_item(cotp_tree, offset + 1, 1, + proto_tree_add_text(cotp_tree, offset + 1, 1, "TPDU code: Ox%x (DT)", tpdu); if (li != LI_NORMAL_DT_CLASS_01) - proto_tree_add_item(cotp_tree, offset + 2, 2, + proto_tree_add_text(cotp_tree, offset + 2, 2, "Destination reference: 0x%04x", dst_ref); switch (li) { case LI_NORMAL_DT_WITH_CHECKSUM : - proto_tree_add_item(cotp_tree, offset + 4, 1, + proto_tree_add_text(cotp_tree, offset + 4, 1, "TPDU number: 0x%02x (%s)", tpdu_nr, (fragment)? "fragment":"complete"); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NDT, 1, "Parameter code: 0x%02x (checksum)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NDT + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NDT + 2, length, "Checksum: 0x%04x", checksum); break; case LI_NORMAL_DT_WITHOUT_CHECKSUM : - proto_tree_add_item(cotp_tree, offset + 4, 1, + proto_tree_add_text(cotp_tree, offset + 4, 1, "TPDU number: 0x%02x (%s)", tpdu_nr, (fragment)? "fragment":"complete"); break; case LI_EXTENDED_DT_WITH_CHECKSUM : - proto_tree_add_item(cotp_tree, offset + 4, 4, + proto_tree_add_text(cotp_tree, offset + 4, 4, "TPDU number: 0x%08x (%s)", tpdu_nr, (fragment)? "fragment":"complete"); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EDT, 1, "Parameter code: 0x%02x (checksum)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EDT + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EDT + 2, length, "Checksum: 0x%04x", checksum); break; case LI_EXTENDED_DT_WITHOUT_CHECKSUM : - proto_tree_add_item(cotp_tree, offset + 4, 4, + proto_tree_add_text(cotp_tree, offset + 4, 4, "TPDU number: 0x%08x (%s)", tpdu_nr, (fragment)? "fragment":"complete"); break; case LI_NORMAL_DT_CLASS_01 : - proto_tree_add_item(cotp_tree, offset + 2, 1, + proto_tree_add_text(cotp_tree, offset + 2, 1, "TPDU number: 0x%02x (%s)", tpdu_nr, (fragment)? "fragment":"complete"); @@ -473,49 +471,48 @@ static int osi_decode_ED(const u_char *pd, int offset, col_add_fstr(fd, COL_INFO, "ED TPDU (%d) dst-ref: 0x%04x", tpdu_nr, dst_ref); if (tree) { - ti = proto_tree_add_item(tree, offset, li + 1, "ISO COTP"); - cotp_tree = proto_tree_new(); - proto_item_add_subtree(ti, cotp_tree, ETT_COTP); - proto_tree_add_item(cotp_tree, offset, 1, + ti = proto_tree_add_text(tree, offset, li + 1, "ISO COTP"); + cotp_tree = proto_item_add_subtree(ti, ETT_COTP); + proto_tree_add_text(cotp_tree, offset, 1, "Length indicator: %d", li); - proto_tree_add_item(cotp_tree, offset + 1, 1, + proto_tree_add_text(cotp_tree, offset + 1, 1, "TPDU code: Ox%x (ED)", tpdu); - proto_tree_add_item(cotp_tree, offset + 2, 2, + proto_tree_add_text(cotp_tree, offset + 2, 2, "Destination reference: 0x%04x", dst_ref); switch (li) { case LI_NORMAL_DT_WITH_CHECKSUM : - proto_tree_add_item(cotp_tree, offset + 4, 1, + proto_tree_add_text(cotp_tree, offset + 4, 1, "TPDU number: 0x%02x", tpdu_nr); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NDT, 1, "Parameter code: 0x%02x (checksum)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NDT + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NDT + 2, length, "Checksum: 0x%04x", checksum); break; case LI_NORMAL_DT_WITHOUT_CHECKSUM : - proto_tree_add_item(cotp_tree, offset + 4, 1, + proto_tree_add_text(cotp_tree, offset + 4, 1, "TPDU number: 0x%02x", tpdu_nr); break; case LI_EXTENDED_DT_WITH_CHECKSUM : - proto_tree_add_item(cotp_tree, offset + 4, 4, + proto_tree_add_text(cotp_tree, offset + 4, 4, "TPDU number: 0x%02x", tpdu_nr); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EDT, 1, "Parameter code: 0x%02x (checksum)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EDT + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EDT + 2, length, "Checksum: 0x%04x", checksum); break; case LI_EXTENDED_DT_WITHOUT_CHECKSUM : - proto_tree_add_item(cotp_tree, offset + 4, 4, + proto_tree_add_text(cotp_tree, offset + 4, 4, "TPDU number: 0x%02x", tpdu_nr); break; } @@ -556,25 +553,24 @@ static int osi_decode_RJ(const u_char *pd, int offset, col_add_fstr(fd, COL_INFO, "RJ TPDU (%d) dst-ref: 0x%04x", tpdu_nr, dst_ref); if (tree) { - ti = proto_tree_add_item(tree, offset, li + 1, "ISO COTP"); - cotp_tree = proto_tree_new(); - proto_item_add_subtree(ti, cotp_tree, ETT_COTP); - proto_tree_add_item(cotp_tree, offset, 1, + ti = proto_tree_add_text(tree, offset, li + 1, "ISO COTP"); + cotp_tree = proto_item_add_subtree(ti, ETT_COTP); + proto_tree_add_text(cotp_tree, offset, 1, "Length indicator: %d", li); - proto_tree_add_item(cotp_tree, offset + 1, 1, + proto_tree_add_text(cotp_tree, offset + 1, 1, "TPDU code: Ox%x (RJ)", tpdu); if (li == LI_NORMAL_RJ) - proto_tree_add_item(cotp_tree, offset + 1, 1, + proto_tree_add_text(cotp_tree, offset + 1, 1, "Credit: %d", cdt); - proto_tree_add_item(cotp_tree, offset + 2, 2, + proto_tree_add_text(cotp_tree, offset + 2, 2, "Destination reference: 0x%04x", dst_ref); if (li == LI_NORMAL_RJ) - proto_tree_add_item(cotp_tree, offset + 4, 1, + proto_tree_add_text(cotp_tree, offset + 4, 1, "Your TPDU number: 0x%02x", tpdu_nr); else { - proto_tree_add_item(cotp_tree, offset + 4, 4, + proto_tree_add_text(cotp_tree, offset + 4, 4, "Your TPDU number: 0x%02x", tpdu_nr); - proto_tree_add_item(cotp_tree, offset + 8, 2, + proto_tree_add_text(cotp_tree, offset + 8, 2, "Credit: 0x%02x", credit); } } @@ -645,19 +641,18 @@ static int osi_decode_CC(const u_char *pd, int offset, dst_ref); if (tree) { - ti = proto_tree_add_item(tree, offset, li + 1, "ISO COTP"); - cotp_tree = proto_tree_new(); - proto_item_add_subtree(ti, cotp_tree, ETT_COTP); - proto_tree_add_item(cotp_tree, offset, 1, + ti = proto_tree_add_text(tree, offset, li + 1, "ISO COTP"); + cotp_tree = proto_item_add_subtree(ti, ETT_COTP); + proto_tree_add_text(cotp_tree, offset, 1, "Length indicator: %d", li); - proto_tree_add_item(cotp_tree, offset + 1, 1, + proto_tree_add_text(cotp_tree, offset + 1, 1, "TPDU code: Ox%x (%s)", tpdu, (tpdu == CR_TPDU) ? "CR" : "CC"); - proto_tree_add_item(cotp_tree, offset + 2, 2, + proto_tree_add_text(cotp_tree, offset + 2, 2, "Destination reference: 0x%04x", dst_ref); - proto_tree_add_item(cotp_tree, offset + 4, 2, + proto_tree_add_text(cotp_tree, offset + 4, 2, "Source reference: 0x%04x", src_ref); - proto_tree_add_item(cotp_tree, offset + 6, 1, + proto_tree_add_text(cotp_tree, offset + 6, 1, "Class option: 0x%02x", class_option); } @@ -672,26 +667,26 @@ static int osi_decode_CC(const u_char *pd, int offset, case VP_CHECKSUM : length = pd[offset + P_VAR_PART_CC + i + 1]; checksum = EXTRACT_SHORT(&pd[offset + P_VAR_PART_CC + i + 2]); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i, 1, "Parameter code: 0x%02x (checksum)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, length, "Checksum: 0x%04x", checksum); i += length + 2; break; case VP_SRC_TSAP : length = pd[offset + P_VAR_PART_CC + i + 1]; - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i, 1, "Parameter code: 0x%02x (src-tsap)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, length, "Calling TSAP: 0x%s", print_tsap(&pd[offset + P_VAR_PART_CC + i + 2], @@ -700,13 +695,13 @@ static int osi_decode_CC(const u_char *pd, int offset, break; case VP_DST_TSAP : length = pd[offset + P_VAR_PART_CC + i + 1]; - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i, 1, "Parameter code: 0x%02x (dst-tsap)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, length, "Called TSAP: 0x%s", print_tsap(&pd[offset + P_VAR_PART_CC + i + 2], @@ -716,13 +711,13 @@ static int osi_decode_CC(const u_char *pd, int offset, case VP_TPDU_SIZE : length = pd[offset + P_VAR_PART_CC + i + 1]; c1 = pd[offset + P_VAR_PART_CC + i + 2] & 0x0F; - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i, 1, "Parameter code: 0x%02x (tpdu-size)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, length, "TPDU size: %d", 2 << c1); i += length + 2; @@ -730,45 +725,45 @@ static int osi_decode_CC(const u_char *pd, int offset, case VP_OPT_SEL : length = pd[offset + P_VAR_PART_CC + i + 1]; c1 = pd[offset + P_VAR_PART_CC + i + 2] & 0x0F; - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i, 1, "Parameter code: 0x%02x (options)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 1, 1, "Parameter length: 0x%02x", length); if (class_option == 1) { if (c1 & 0x8) - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, 1, "Use of network expedited data"); else - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, 1, "Non use of network expedited data"); if (c1 & 0x4) - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, 1, "Use of Receipt confirmation"); else - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, 1, "Use of explicit AK variant"); } else if (class_option == 4) { if (c1 & 0x2) - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, 1, "Use 16 bit checksum "); else - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, 1, "Non-use 16 bit checksum in class 4"); } if (c1 & 0x1) - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, 1, "Use of transport expedited data transfer\n"); else - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, 1, "Non-use of transport expedited data transfer"); i += length + 2; @@ -776,13 +771,13 @@ static int osi_decode_CC(const u_char *pd, int offset, case VP_ACK_TIME : length = pd[offset + P_VAR_PART_CC + i + 1]; s = EXTRACT_SHORT(&pd[offset + P_VAR_PART_CC + i + 2]); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i, 1, "Parameter code: 0x%02x (ack time)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, length, "Ack time (ms): %d", s); i += length + 2; @@ -793,22 +788,22 @@ static int osi_decode_CC(const u_char *pd, int offset, t2 = EXTRACT_LONG(&pd[offset + P_VAR_PART_CC + i + 4]); t3 = EXTRACT_LONG(&pd[offset + P_VAR_PART_CC + i + 7]); t4 = EXTRACT_LONG(&pd[offset + P_VAR_PART_CC + i + 10]); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i, 1, "Parameter code: 0x%02x (throughput)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, 4, "Target value / calling-called: %d o/s", t1); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 6, 4, "Minimum / calling-called: %d o/s", t2); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 10, 4, "Target value / called-calling: %d o/s", t3); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 14, 4, "Minimum / called-calling: %d o/s", t4); i += length + 2; @@ -819,22 +814,22 @@ static int osi_decode_CC(const u_char *pd, int offset, s2 = EXTRACT_SHORT(&pd[offset + P_VAR_PART_CC + i + 4]); s3 = EXTRACT_SHORT(&pd[offset + P_VAR_PART_CC + i + 6]); s4 = EXTRACT_SHORT(&pd[offset + P_VAR_PART_CC + i + 8]); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i, 1, "Parameter code: 0x%02x (transit delay)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, 2, "Target value / calling-called: %d ms", s1); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 4, 2, "Minimum / calling-called: %d ms", s2); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 6, 2, "Target value / called-calling: %d ms", s3); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 8, 2, "Minimum / called-calling: %d ms", s4); i += length + 2; @@ -842,13 +837,13 @@ static int osi_decode_CC(const u_char *pd, int offset, case VP_PRIORITY : length = pd[offset + P_VAR_PART_CC + i + 1]; s = EXTRACT_SHORT(&pd[offset + P_VAR_PART_CC + i + 2]); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i, 1, "Parameter code: 0x%02x (priority)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, length, "Priority: %d", s); i += length + 2; @@ -861,13 +856,13 @@ static int osi_decode_CC(const u_char *pd, int offset, case VP_PROTO_CLASS : default : /* no decoding */ length = pd[offset + P_VAR_PART_CC + i + 1]; - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 0, 1, "Parameter code: 0x%02x", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_CC + i + 2, length, "Parameter value: "); i += length + 2; @@ -918,25 +913,24 @@ static int osi_decode_DC(const u_char *pd, int offset, dst_ref); if (tree) { - ti = proto_tree_add_item(tree, offset, li + 1, "ISO COTP"); - cotp_tree = proto_tree_new(); - proto_item_add_subtree(ti, cotp_tree, ETT_COTP); - proto_tree_add_item(cotp_tree, offset, 1, + ti = proto_tree_add_text(tree, offset, li + 1, "ISO COTP"); + cotp_tree = proto_item_add_subtree(ti, ETT_COTP); + proto_tree_add_text(cotp_tree, offset, 1, "Length indicator: %d", li); - proto_tree_add_item(cotp_tree, offset + 1, 1, + proto_tree_add_text(cotp_tree, offset + 1, 1, "TPDU code: Ox%x (DC)", tpdu); - proto_tree_add_item(cotp_tree, offset + 2, 2, + proto_tree_add_text(cotp_tree, offset + 2, 2, "Destination reference: 0x%04x", dst_ref); - proto_tree_add_item(cotp_tree, offset + 4, 2, + proto_tree_add_text(cotp_tree, offset + 4, 2, "Source reference: 0x%04x", src_ref); if (code) { - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_DC + 0, 1, "Parameter code: 0x%02x (checksum)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_DC + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_DC + 2, 2, "Checksum: 0x%04x", checksum); } @@ -972,18 +966,17 @@ static int osi_decode_AK(const u_char *pd, int offset, tpdu_nr, dst_ref); if (tree) { - ti = proto_tree_add_item(tree, offset, li + 1, "ISO COTP"); - cotp_tree = proto_tree_new(); - proto_item_add_subtree(ti, cotp_tree, ETT_COTP); - proto_tree_add_item(cotp_tree, offset, 1, + ti = proto_tree_add_text(tree, offset, li + 1, "ISO COTP"); + cotp_tree = proto_item_add_subtree(ti, ETT_COTP); + proto_tree_add_text(cotp_tree, offset, 1, "Length indicator: %d", li); - proto_tree_add_item(cotp_tree, offset + 1, 1, + proto_tree_add_text(cotp_tree, offset + 1, 1, "TPDU code: Ox%x (AK)", tpdu); - proto_tree_add_item(cotp_tree, offset + 1, 1, + proto_tree_add_text(cotp_tree, offset + 1, 1, "Credit: %d", cdt); - proto_tree_add_item(cotp_tree, offset + 2, 2, + proto_tree_add_text(cotp_tree, offset + 2, 2, "Destination reference: 0x%04x", dst_ref); - proto_tree_add_item(cotp_tree, offset + 4, 1, + proto_tree_add_text(cotp_tree, offset + 4, 1, "Your TPDU number: 0x%02x", tpdu_nr); } @@ -993,13 +986,13 @@ static int osi_decode_AK(const u_char *pd, int offset, length = pd[offset + P_VAR_PART_NAK + i + 1]; checksum = EXTRACT_SHORT(&pd[offset + P_VAR_PART_NAK + i + 2]); if (tree) { - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NAK + i + 0, 1, "Parameter code: 0x%02x (checksum)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NAK + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NAK + i + 2, 2, "Checksum: 0x%04x", checksum); } @@ -1012,22 +1005,22 @@ static int osi_decode_AK(const u_char *pd, int offset, r_seq_nr = EXTRACT_SHORT(&pd[offset + P_VAR_PART_NAK + i + 6]); r_cdt = EXTRACT_SHORT(&pd[offset + P_VAR_PART_NAK + i + 8]); if (tree) { - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NAK + i + 0, 1, "Parameter code: 0x%02x (flow control)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NAK + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NAK + i + 2, 4, "Lower window edge: 0x%08x", r_lower_window_edge); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NAK + i + 6, 2, "Sequence number: 0x%04x", r_seq_nr); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NAK + i + 8, 2, "Credit: 0x%04x", r_cdt); @@ -1038,13 +1031,13 @@ static int osi_decode_AK(const u_char *pd, int offset, length = pd[offset + P_VAR_PART_NAK + i + 1]; seq_nr = EXTRACT_SHORT(&pd[offset + P_VAR_PART_NAK + i + 2]); if (tree) { - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NAK + i + 0, 1, "Parameter code: 0x%02x (seq number)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NAK + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NAK + i + 2, 2, "Sequence number: 0x%04x", seq_nr); } @@ -1053,13 +1046,13 @@ static int osi_decode_AK(const u_char *pd, int offset, default : length = pd[offset + P_VAR_PART_NAK + i + 1]; if (tree) { - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NAK + i + 0, 1, "Parameter code: 0x%02x (unknown)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NAK + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_NAK + i + 2, length, "Parameter value: "); } @@ -1079,18 +1072,17 @@ static int osi_decode_AK(const u_char *pd, int offset, tpdu_nr, dst_ref); if (tree) { - ti = proto_tree_add_item(tree, offset, li + 1, "ISO COTP"); - cotp_tree = proto_tree_new(); - proto_item_add_subtree(ti, cotp_tree, ETT_COTP); - proto_tree_add_item(cotp_tree, offset, 1, + ti = proto_tree_add_text(tree, offset, li + 1, "ISO COTP"); + cotp_tree = proto_item_add_subtree(ti, ETT_COTP); + proto_tree_add_text(cotp_tree, offset, 1, "Length indicator: %d", li); - proto_tree_add_item(cotp_tree, offset + 1, 1, + proto_tree_add_text(cotp_tree, offset + 1, 1, "TPDU code: Ox%x (AK)", tpdu); - proto_tree_add_item(cotp_tree, offset + 2, 2, + proto_tree_add_text(cotp_tree, offset + 2, 2, "Destination reference: 0x%04x", dst_ref); - proto_tree_add_item(cotp_tree, offset + 4, 4, + proto_tree_add_text(cotp_tree, offset + 4, 4, "Your TPDU number: 0x%08x", tpdu_nr); - proto_tree_add_item(cotp_tree, offset + 8, 2, + proto_tree_add_text(cotp_tree, offset + 8, 2, "Credit: 0x%04x", cdt_in_ak); } @@ -1100,13 +1092,13 @@ static int osi_decode_AK(const u_char *pd, int offset, length = pd[offset + P_VAR_PART_EAK + i + 1]; checksum = EXTRACT_SHORT(&pd[offset + P_VAR_PART_EAK + i + 2]); if (tree) { - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EAK + i + 0, 1, "Parameter code: 0x%02x (checksum)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EAK + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EAK + i + 2, 2, "Checksum: 0x%04x", checksum); } @@ -1119,22 +1111,22 @@ static int osi_decode_AK(const u_char *pd, int offset, r_seq_nr = EXTRACT_SHORT(&pd[offset + P_VAR_PART_EAK + i + 6]); r_cdt = EXTRACT_SHORT(&pd[offset + P_VAR_PART_EAK + i + 8]); if (tree) { - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EAK + i + 0, 1, "Parameter code: 0x%02x (flow control)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EAK + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EAK + i + 2, 4, "Lower window edge: 0x%08x", r_lower_window_edge); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EAK + i + 6, 2, "Sequence number: 0x%04x", r_seq_nr); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EAK + i + 8, 2, "Credit: 0x%04x", r_cdt); @@ -1145,13 +1137,13 @@ static int osi_decode_AK(const u_char *pd, int offset, length = pd[offset + P_VAR_PART_EAK + i + 1]; seq_nr = EXTRACT_SHORT(&pd[offset + P_VAR_PART_EAK + i + 2]); if (tree) { - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EAK + i + 0, 1, "Parameter code: 0x%02x (seq number)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EAK + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EAK + i + 2, 2, "Sequence number: 0x%04x", seq_nr); } @@ -1160,13 +1152,13 @@ static int osi_decode_AK(const u_char *pd, int offset, default : length = pd[offset + P_VAR_PART_EAK + i + 1]; if (tree) { - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EAK + i + 0, 1, "Parameter code: 0x%02x (unknown)", code); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EAK + i + 1, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, + proto_tree_add_text(cotp_tree, offset + P_VAR_PART_EAK + i + 2, length, "Parameter value: "); } @@ -1232,43 +1224,42 @@ static int osi_decode_EA(const u_char *pd, int offset, col_add_fstr(fd, COL_INFO, "EA TPDU (%d) dst-ref: 0x%04x", tpdu_nr, dst_ref); if (tree) { - ti = proto_tree_add_item(tree, offset, li + 1, "ISO COTP"); - cotp_tree = proto_tree_new(); - proto_item_add_subtree(ti, cotp_tree, ETT_COTP); - proto_tree_add_item(cotp_tree, offset, 1, + ti = proto_tree_add_text(tree, offset, li + 1, "ISO COTP"); + cotp_tree = proto_item_add_subtree(ti, ETT_COTP); + proto_tree_add_text(cotp_tree, offset, 1, "Length indicator: %d", li); - proto_tree_add_item(cotp_tree, offset + 1, 1, + proto_tree_add_text(cotp_tree, offset + 1, 1, "TPDU code: Ox%x (EA)", tpdu); - proto_tree_add_item(cotp_tree, offset + 2, 2, + proto_tree_add_text(cotp_tree, offset + 2, 2, "Destination reference: 0x%04x", dst_ref); switch (li) { case LI_NORMAL_EA_WITH_CHECKSUM : - proto_tree_add_item(cotp_tree, offset + 4, 1, + proto_tree_add_text(cotp_tree, offset + 4, 1, "Your TPDU number: 0x%02x", tpdu_nr); - proto_tree_add_item(cotp_tree, offset + 5, 1, + proto_tree_add_text(cotp_tree, offset + 5, 1, "Parameter code: 0x%02x (checksum)", code); - proto_tree_add_item(cotp_tree, offset + 6, 1, + proto_tree_add_text(cotp_tree, offset + 6, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, offset + 7, 2, + proto_tree_add_text(cotp_tree, offset + 7, 2, "Checksum: 0x%04x", checksum); break; case LI_NORMAL_EA_WITHOUT_CHECKSUM : - proto_tree_add_item(cotp_tree, offset + 4, 1, + proto_tree_add_text(cotp_tree, offset + 4, 1, "Your TPDU number: 0x%02x", tpdu_nr); break; case LI_EXTENDED_EA_WITH_CHECKSUM : - proto_tree_add_item(cotp_tree, offset + 4, 4, + proto_tree_add_text(cotp_tree, offset + 4, 4, "Your TPDU number: 0x%08x", tpdu_nr); - proto_tree_add_item(cotp_tree, offset + 8, 1, + proto_tree_add_text(cotp_tree, offset + 8, 1, "Parameter code: 0x%02x (checksum)", code); - proto_tree_add_item(cotp_tree, offset + 9, 1, + proto_tree_add_text(cotp_tree, offset + 9, 1, "Parameter length: 0x%02x", length); - proto_tree_add_item(cotp_tree, offset + 10, 2, + proto_tree_add_text(cotp_tree, offset + 10, 2, "Checksum: 0x%04x", checksum); break; case LI_EXTENDED_EA_WITHOUT_CHECKSUM : - proto_tree_add_item(cotp_tree, offset + 4, 4, + proto_tree_add_text(cotp_tree, offset + 4, 4, "Your TPDU number: 0x%08x", tpdu_nr); break; default : @@ -1318,16 +1309,15 @@ static int osi_decode_ER(const u_char *pd, int offset, col_add_fstr(fd, COL_INFO, "ER TPDU dst-ref: 0x%04x", dst_ref); if (tree) { - ti = proto_tree_add_item(tree, offset, li + 1, "ISO COTP"); - cotp_tree = proto_tree_new(); - proto_item_add_subtree(ti, cotp_tree, ETT_COTP); - proto_tree_add_item(cotp_tree, offset, 1, + ti = proto_tree_add_text(tree, offset, li + 1, "ISO COTP"); + cotp_tree = proto_item_add_subtree(ti, ETT_COTP); + proto_tree_add_text(cotp_tree, offset, 1, "Length indicator: %d", li); - proto_tree_add_item(cotp_tree, offset + 1, 1, + proto_tree_add_text(cotp_tree, offset + 1, 1, "TPDU code: Ox%x (ER)", tpdu); - proto_tree_add_item(cotp_tree, offset + 2, 2, + proto_tree_add_text(cotp_tree, offset + 2, 2, "Destination reference: 0x%04x", dst_ref); - proto_tree_add_item(cotp_tree, offset + 4, 1, + proto_tree_add_text(cotp_tree, offset + 4, 1, "Reject cause: %s", str); } @@ -1456,29 +1446,28 @@ void dissect_clnp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree /* fixed part decoding */ if (tree) { - ti = proto_tree_add_item(tree, offset, clnp.cnf_hdr_len, "ISO CLNP"); - clnp_tree = proto_tree_new(); - proto_item_add_subtree(ti, clnp_tree, ETT_CLNP); - proto_tree_add_item(clnp_tree, offset, 1, + ti = proto_tree_add_text(tree, offset, clnp.cnf_hdr_len, "ISO CLNP"); + clnp_tree = proto_item_add_subtree(ti, ETT_CLNP); + proto_tree_add_text(clnp_tree, offset, 1, "Protocol identifier: 0x%02x", clnp.cnf_proto_id); - proto_tree_add_item(clnp_tree, offset + 1, 1, + proto_tree_add_text(clnp_tree, offset + 1, 1, "Length: %d", clnp.cnf_hdr_len); - proto_tree_add_item(clnp_tree, offset + 2, 1, + proto_tree_add_text(clnp_tree, offset + 2, 1, "Version: %d", clnp.cnf_vers); - proto_tree_add_item(clnp_tree, offset + 3, 1, + proto_tree_add_text(clnp_tree, offset + 3, 1, "TTL: %d (%d secs)", clnp.cnf_ttl, clnp.cnf_ttl / 2); - proto_tree_add_item(clnp_tree, offset + 4, 1, + proto_tree_add_text(clnp_tree, offset + 4, 1, "Type code: 0x%02x (%s%s%s%s)", clnp.cnf_type, (clnp.cnf_type & CNF_SEG_OK) ? "S " : "", (clnp.cnf_type & CNF_MORE_SEGS) ? "M " : "", (clnp.cnf_type & CNF_ERR_OK) ? "E " : "", (clnp.cnf_type & CNF_TYPE) == DT_NPDU ? "DT" : "ER"); - proto_tree_add_item(clnp_tree, offset + 5, 2, + proto_tree_add_text(clnp_tree, offset + 5, 2, "PDU segment length: %d", EXTRACT_SHORT(&clnp.cnf_seglen_msb)); - proto_tree_add_item(clnp_tree, offset + 7, 2, + proto_tree_add_text(clnp_tree, offset + 7, 2, "Checksum: 0x%04x", EXTRACT_SHORT(&clnp.cnf_cksum_msb)); } /* tree */ @@ -1498,14 +1487,14 @@ void dissect_clnp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree src_len = pd[offset + dst_len + 1]; if (tree) { - proto_tree_add_item(clnp_tree, offset, 1, + proto_tree_add_text(clnp_tree, offset, 1, "Destination address length: 0x%02x", dst_len); - proto_tree_add_item(clnp_tree, offset + 1 , dst_len, + proto_tree_add_text(clnp_tree, offset + 1 , dst_len, "Destination address: %s", print_nsap(&pd[offset + 1], dst_len)); - proto_tree_add_item(clnp_tree, offset + 1 + dst_len, 1, + proto_tree_add_text(clnp_tree, offset + 1 + dst_len, 1, "Source address length: 0x%02x", src_len); - proto_tree_add_item(clnp_tree, offset + dst_len + 2, src_len, + proto_tree_add_text(clnp_tree, offset + dst_len + 2, src_len, "Source address: %s", print_nsap(&pd[offset + dst_len + 2], src_len)); } @@ -1525,13 +1514,13 @@ void dissect_clnp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree struct clnp_segment seg; memcpy(&seg, &pd[offset], sizeof(seg)); - proto_tree_add_item(clnp_tree, offset, 2, + proto_tree_add_text(clnp_tree, offset, 2, "Data unit identifier: 0x%04x", EXTRACT_SHORT(&pd[offset])); - proto_tree_add_item(clnp_tree, offset + 2 , 2, + proto_tree_add_text(clnp_tree, offset + 2 , 2, "Segment offset: 0x%04x", EXTRACT_SHORT(&pd[offset + 2])); - proto_tree_add_item(clnp_tree, offset + 4 , 2, + proto_tree_add_text(clnp_tree, offset + 4 , 2, "Total length: 0x%04x", EXTRACT_SHORT(&pd[offset + 4])); @@ -1541,7 +1530,7 @@ void dissect_clnp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree if (tree) { /* To do : decode options */ - proto_tree_add_item(clnp_tree, offset, + proto_tree_add_text(clnp_tree, offset, clnp.cnf_hdr_len + first_offset - offset, "Options/Data: "); } diff --git a/packet-ospf.c b/packet-ospf.c index 77e0095918..f4fd8b2584 100644 --- a/packet-ospf.c +++ b/packet-ospf.c @@ -2,7 +2,7 @@ * Routines for OSPF packet disassembly * (c) Copyright Hannes R. Boehm * - * $Id: packet-ospf.c,v 1.10 1999/03/23 03:14:42 gram Exp $ + * $Id: packet-ospf.c,v 1.11 1999/07/07 22:51:50 gram Exp $ * * At this time, this module is able to analyze OSPF * packets as specified in RFC2328. MOSPF (RFC1584) and other @@ -80,49 +80,47 @@ dissect_ospf(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { } if (tree) { - ti = proto_tree_add_item(tree, offset, ntohs(ospfh.length), "Open Shortest Path First"); - ospf_tree = proto_tree_new(); - proto_item_add_subtree(ti, ospf_tree, ETT_OSPF); + ti = proto_tree_add_text(tree, offset, ntohs(ospfh.length), "Open Shortest Path First"); + ospf_tree = proto_item_add_subtree(ti, ETT_OSPF); - ti = proto_tree_add_item(ospf_tree, offset, OSPF_HEADER_LENGTH, "OSPF Header"); - ospf_header_tree = proto_tree_new(); - proto_item_add_subtree(ti, ospf_header_tree, ETT_OSPF_HDR); + ti = proto_tree_add_text(ospf_tree, offset, OSPF_HEADER_LENGTH, "OSPF Header"); + ospf_header_tree = proto_item_add_subtree(ti, ETT_OSPF_HDR); - proto_tree_add_item(ospf_header_tree, offset, 1, "OSPF Version: %d", ospfh.version); - proto_tree_add_item(ospf_header_tree, offset + 1 , 1, "OSPF Packet Type: %d (%s)", + proto_tree_add_text(ospf_header_tree, offset, 1, "OSPF Version: %d", ospfh.version); + proto_tree_add_text(ospf_header_tree, offset + 1 , 1, "OSPF Packet Type: %d (%s)", ospfh.packet_type, (packet_type != NULL ? packet_type : "Unknown")); - proto_tree_add_item(ospf_header_tree, offset + 2 , 2, "Packet Length: %d", + proto_tree_add_text(ospf_header_tree, offset + 2 , 2, "Packet Length: %d", ntohs(ospfh.length)); - proto_tree_add_item(ospf_header_tree, offset + 4 , 4, "Source OSPF Router ID: %s", + proto_tree_add_text(ospf_header_tree, offset + 4 , 4, "Source OSPF Router ID: %s", ip_to_str((guint8 *) &(ospfh.routerid))); if (!(ospfh.area)) { - proto_tree_add_item(ospf_header_tree, offset + 8 , 4, "Area ID: Backbone"); + proto_tree_add_text(ospf_header_tree, offset + 8 , 4, "Area ID: Backbone"); } else { - proto_tree_add_item(ospf_header_tree, offset + 8 , 4, "Area ID: %s", ip_to_str((guint8 *) &(ospfh.area))); + proto_tree_add_text(ospf_header_tree, offset + 8 , 4, "Area ID: %s", ip_to_str((guint8 *) &(ospfh.area))); } - proto_tree_add_item(ospf_header_tree, offset + 12 , 2, "Packet Checksum: 0x%x", + proto_tree_add_text(ospf_header_tree, offset + 12 , 2, "Packet Checksum: 0x%x", ntohs(ospfh.checksum)); switch( ntohs(ospfh.auth_type) ) { case OSPF_AUTH_NONE: - proto_tree_add_item(ospf_header_tree, offset + 14 , 2, "Auth Type: none"); - proto_tree_add_item(ospf_header_tree, offset + 16 , 8, "Auth Data (none)"); + proto_tree_add_text(ospf_header_tree, offset + 14 , 2, "Auth Type: none"); + proto_tree_add_text(ospf_header_tree, offset + 16 , 8, "Auth Data (none)"); break; case OSPF_AUTH_SIMPLE: - proto_tree_add_item(ospf_header_tree, offset + 14 , 2, "Auth Type: simple"); + proto_tree_add_text(ospf_header_tree, offset + 14 , 2, "Auth Type: simple"); strncpy(auth_data, (char *) &ospfh.auth_data, 8); - proto_tree_add_item(ospf_header_tree, offset + 16 , 8, "Auth Data: %s", auth_data); + proto_tree_add_text(ospf_header_tree, offset + 16 , 8, "Auth Data: %s", auth_data); break; case OSPF_AUTH_CRYPT: - proto_tree_add_item(ospf_header_tree, offset + 14 , 2, "Auth Type: crypt"); - proto_tree_add_item(ospf_header_tree, offset + 16 , 8, "Auth Data (crypt)"); + proto_tree_add_text(ospf_header_tree, offset + 14 , 2, "Auth Type: crypt"); + proto_tree_add_text(ospf_header_tree, offset + 16 , 8, "Auth Data (crypt)"); break; default: - proto_tree_add_item(ospf_header_tree, offset + 14 , 2, "Auth Type (unknown)"); - proto_tree_add_item(ospf_header_tree, offset + 16 , 8, "Auth Data (unknown)"); + proto_tree_add_text(ospf_header_tree, offset + 14 , 2, "Auth Type (unknown)"); + proto_tree_add_text(ospf_header_tree, offset + 16 , 8, "Auth Data (unknown)"); } } @@ -163,13 +161,12 @@ dissect_ospf_hello(const u_char *pd, int offset, frame_data *fd, proto_tree *tre memcpy(&ospfhello, &pd[offset], sizeof(e_ospf_hello)); if (tree) { - ti = proto_tree_add_item(tree, offset, (fd->cap_len - offset) , "OSPF Hello Packet"); - ospf_hello_tree = proto_tree_new(); - proto_item_add_subtree(ti, ospf_hello_tree, ETT_OSPF_HELLO); + ti = proto_tree_add_text(tree, offset, (fd->cap_len - offset) , "OSPF Hello Packet"); + ospf_hello_tree = proto_item_add_subtree(ti, ETT_OSPF_HELLO); - proto_tree_add_item(ospf_hello_tree, offset , 4, "Network Mask: %s", ip_to_str((guint8 *) &ospfhello.network_mask)); - proto_tree_add_item(ospf_hello_tree, offset + 4, 2, "Hello Interval: %d seconds", ntohs(ospfhello.hellointervall)); + proto_tree_add_text(ospf_hello_tree, offset , 4, "Network Mask: %s", ip_to_str((guint8 *) &ospfhello.network_mask)); + proto_tree_add_text(ospf_hello_tree, offset + 4, 2, "Hello Interval: %d seconds", ntohs(ospfhello.hellointervall)); /* ATTENTION !!! no check for length of options string */ options_offset=0; @@ -194,18 +191,18 @@ dissect_ospf_hello(const u_char *pd, int offset, frame_data *fd, proto_tree *tre options_offset+=3; } - proto_tree_add_item(ospf_hello_tree, offset + 6, 1, "Options: %d (%s)", ospfhello.options, options); - proto_tree_add_item(ospf_hello_tree, offset + 7, 1, "Router Priority: %d", ospfhello.priority); - proto_tree_add_item(ospf_hello_tree, offset + 8, 4, "Router Dead Interval: %ld seconds", (long)ntohl(ospfhello.dead_interval)); - proto_tree_add_item(ospf_hello_tree, offset + 12, 4, "Designated Router: %s", ip_to_str((guint8 *) &ospfhello.drouter)); - proto_tree_add_item(ospf_hello_tree, offset + 16, 4, "Backup Designated Router: %s", ip_to_str((guint8 *) &ospfhello.bdrouter)); + proto_tree_add_text(ospf_hello_tree, offset + 6, 1, "Options: %d (%s)", ospfhello.options, options); + proto_tree_add_text(ospf_hello_tree, offset + 7, 1, "Router Priority: %d", ospfhello.priority); + proto_tree_add_text(ospf_hello_tree, offset + 8, 4, "Router Dead Interval: %ld seconds", (long)ntohl(ospfhello.dead_interval)); + proto_tree_add_text(ospf_hello_tree, offset + 12, 4, "Designated Router: %s", ip_to_str((guint8 *) &ospfhello.drouter)); + proto_tree_add_text(ospf_hello_tree, offset + 16, 4, "Backup Designated Router: %s", ip_to_str((guint8 *) &ospfhello.bdrouter)); offset+=20; while(((int)(fd->cap_len - offset)) >= 4){ printf("%d", fd->cap_len - offset); ospfneighbor=(guint32 *) &pd[offset]; - proto_tree_add_item(ospf_hello_tree, offset, 4, "Active Neighbor: %s", ip_to_str((guint8 *) ospfneighbor)); + proto_tree_add_text(ospf_hello_tree, offset, 4, "Active Neighbor: %s", ip_to_str((guint8 *) ospfneighbor)); offset+=4; } } @@ -225,11 +222,10 @@ dissect_ospf_db_desc(const u_char *pd, int offset, frame_data *fd, proto_tree *t memcpy(&ospf_dbd, &pd[offset], sizeof(e_ospf_dbd)); if (tree) { - ti = proto_tree_add_item(tree, offset, (fd->cap_len - offset) , "OSPF DB Description"); - ospf_db_desc_tree = proto_tree_new(); - proto_item_add_subtree(ti, ospf_db_desc_tree, ETT_OSPF_DESC); + ti = proto_tree_add_text(tree, offset, (fd->cap_len - offset) , "OSPF DB Description"); + ospf_db_desc_tree = proto_item_add_subtree(ti, ETT_OSPF_DESC); - proto_tree_add_item(ospf_db_desc_tree, offset, 2, "Interface MTU: %d", ntohs(ospf_dbd.interface_mtu) ); + proto_tree_add_text(ospf_db_desc_tree, offset, 2, "Interface MTU: %d", ntohs(ospf_dbd.interface_mtu) ); options_offset=0; @@ -254,7 +250,7 @@ dissect_ospf_db_desc(const u_char *pd, int offset, frame_data *fd, proto_tree *t options_offset+=3; } - proto_tree_add_item(ospf_db_desc_tree, offset + 2 , 1, "Options: %d (%s)", ospf_dbd.options, options ); + proto_tree_add_text(ospf_db_desc_tree, offset + 2 , 1, "Options: %d (%s)", ospf_dbd.options, options ); flags_offset=0; @@ -271,8 +267,8 @@ dissect_ospf_db_desc(const u_char *pd, int offset, frame_data *fd, proto_tree *t flags_offset+=3; } - proto_tree_add_item(ospf_db_desc_tree, offset + 3 , 1, "Flags: %d (%s)", ospf_dbd.flags, flags ); - proto_tree_add_item(ospf_db_desc_tree, offset + 4 , 4, "DD Sequence: %ld", (long)ntohl(ospf_dbd.dd_sequence) ); + proto_tree_add_text(ospf_db_desc_tree, offset + 3 , 1, "Flags: %d (%s)", ospf_dbd.flags, flags ); + proto_tree_add_text(ospf_db_desc_tree, offset + 4 , 4, "DD Sequence: %ld", (long)ntohl(ospf_dbd.dd_sequence) ); } /* LS Headers will be processed here */ /* skip to the end of DB-Desc header */ @@ -296,39 +292,38 @@ dissect_ospf_ls_req(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { while( ((int) ( fd->cap_len - offset)) >= OSPF_LS_REQ_LENGTH ){ memcpy(&ospf_lsr, &pd[offset], sizeof(e_ospf_ls_req)); - ti = proto_tree_add_item(tree, offset, OSPF_LS_REQ_LENGTH, "Link State Request"); - ospf_lsr_tree = proto_tree_new(); - proto_item_add_subtree(ti, ospf_lsr_tree, ETT_OSPF_LSR); + ti = proto_tree_add_text(tree, offset, OSPF_LS_REQ_LENGTH, "Link State Request"); + ospf_lsr_tree = proto_item_add_subtree(ti, ETT_OSPF_LSR); switch( ntohl( ospf_lsr.ls_type ) ){ case OSPF_LSTYPE_ROUTER: - proto_tree_add_item(ospf_lsr_tree, offset, 4, "LS Type: Router-LSA (%ld)", + proto_tree_add_text(ospf_lsr_tree, offset, 4, "LS Type: Router-LSA (%ld)", (long)ntohl( ospf_lsr.ls_type ) ); break; case OSPF_LSTYPE_NETWORK: - proto_tree_add_item(ospf_lsr_tree, offset, 4, "LS Type: Network-LSA (%ld)", + proto_tree_add_text(ospf_lsr_tree, offset, 4, "LS Type: Network-LSA (%ld)", (long)ntohl( ospf_lsr.ls_type ) ); break; case OSPF_LSTYPE_SUMMERY: - proto_tree_add_item(ospf_lsr_tree, offset, 4, "LS Type: Summary-LSA (IP network) (%ld)", + proto_tree_add_text(ospf_lsr_tree, offset, 4, "LS Type: Summary-LSA (IP network) (%ld)", (long)ntohl( ospf_lsr.ls_type ) ); break; case OSPF_LSTYPE_ASBR: - proto_tree_add_item(ospf_lsr_tree, offset, 4, "LS Type: Summary-LSA (ASBR) (%ld)", + proto_tree_add_text(ospf_lsr_tree, offset, 4, "LS Type: Summary-LSA (ASBR) (%ld)", (long)ntohl( ospf_lsr.ls_type ) ); break; case OSPF_LSTYPE_ASEXT: - proto_tree_add_item(ospf_lsr_tree, offset, 4, "LS Type: AS-External-LSA (ASBR) (%ld)", + proto_tree_add_text(ospf_lsr_tree, offset, 4, "LS Type: AS-External-LSA (ASBR) (%ld)", (long)ntohl( ospf_lsr.ls_type ) ); break; default: - proto_tree_add_item(ospf_lsr_tree, offset, 4, "LS Type: %ld (unknown)", + proto_tree_add_text(ospf_lsr_tree, offset, 4, "LS Type: %ld (unknown)", (long)ntohl( ospf_lsr.ls_type ) ); } - proto_tree_add_item(ospf_lsr_tree, offset + 4, 4, "Link State ID : %s", + proto_tree_add_text(ospf_lsr_tree, offset + 4, 4, "Link State ID : %s", ip_to_str((guint8 *) &(ospf_lsr.ls_id))); - proto_tree_add_item(ospf_lsr_tree, offset + 8, 4, "Advertising Router : %s", + proto_tree_add_text(ospf_lsr_tree, offset + 8, 4, "Advertising Router : %s", ip_to_str((guint8 *) &(ospf_lsr.adv_router))); offset+=12; @@ -346,11 +341,10 @@ dissect_ospf_ls_upd(const u_char *pd, int offset, frame_data *fd, proto_tree *tr memcpy(&upd_hdr, &pd[offset], sizeof(e_ospf_lsa_upd_hdr)); if (tree) { - ti = proto_tree_add_item(tree, offset, (fd->cap_len - offset) , "LS Update Packet"); - ospf_lsa_upd_tree = proto_tree_new(); - proto_item_add_subtree(ti, ospf_lsa_upd_tree, ETT_OSPF_LSA_UPD); + ti = proto_tree_add_text(tree, offset, (fd->cap_len - offset) , "LS Update Packet"); + ospf_lsa_upd_tree = proto_item_add_subtree(ti, ETT_OSPF_LSA_UPD); - proto_tree_add_item(ospf_lsa_upd_tree, offset, 4, "Nr oF LSAs: %ld", (long)ntohl(upd_hdr.lsa_nr) ); + proto_tree_add_text(ospf_lsa_upd_tree, offset, 4, "Nr oF LSAs: %ld", (long)ntohl(upd_hdr.lsa_nr) ); } /* skip to the beginning of the first LSA */ offset+=4; /* the LS Upd PAcket contains only a 32 bit #LSAs field */ @@ -427,29 +421,28 @@ dissect_ospf_lsa(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, if (tree) { if(disassemble_body){ - ti = proto_tree_add_item(tree, offset, ntohs(lsa_hdr.length), + ti = proto_tree_add_text(tree, offset, ntohs(lsa_hdr.length), "%s (Type: %d)", lsa_type, lsa_hdr.ls_type); } else { - ti = proto_tree_add_item(tree, offset, OSPF_LSA_HEADER_LENGTH, "LSA Header"); + ti = proto_tree_add_text(tree, offset, OSPF_LSA_HEADER_LENGTH, "LSA Header"); } - ospf_lsa_tree = proto_tree_new(); - proto_item_add_subtree(ti, ospf_lsa_tree, ETT_OSPF_LSA); + ospf_lsa_tree = proto_item_add_subtree(ti, ETT_OSPF_LSA); - proto_tree_add_item(ospf_lsa_tree, offset, 2, "LS Age: %d seconds", ntohs(lsa_hdr.ls_age)); - proto_tree_add_item(ospf_lsa_tree, offset + 2, 1, "Options: %d ", lsa_hdr.options); - proto_tree_add_item(ospf_lsa_tree, offset + 3, 1, "LSA Type: %d (%s)", lsa_hdr.ls_type, lsa_type); + proto_tree_add_text(ospf_lsa_tree, offset, 2, "LS Age: %d seconds", ntohs(lsa_hdr.ls_age)); + proto_tree_add_text(ospf_lsa_tree, offset + 2, 1, "Options: %d ", lsa_hdr.options); + proto_tree_add_text(ospf_lsa_tree, offset + 3, 1, "LSA Type: %d (%s)", lsa_hdr.ls_type, lsa_type); - proto_tree_add_item(ospf_lsa_tree, offset + 4, 4, "Linke State ID: %s ", + proto_tree_add_text(ospf_lsa_tree, offset + 4, 4, "Linke State ID: %s ", ip_to_str((guint8 *) &(lsa_hdr.ls_id))); - proto_tree_add_item(ospf_lsa_tree, offset + 8, 4, "Advertising Router: %s ", + proto_tree_add_text(ospf_lsa_tree, offset + 8, 4, "Advertising Router: %s ", ip_to_str((guint8 *) &(lsa_hdr.adv_router))); - proto_tree_add_item(ospf_lsa_tree, offset + 12, 4, "LS Sequence Number: 0x%04lx ", + proto_tree_add_text(ospf_lsa_tree, offset + 12, 4, "LS Sequence Number: 0x%04lx ", (unsigned long)ntohl(lsa_hdr.ls_seq)); - proto_tree_add_item(ospf_lsa_tree, offset + 16, 2, "LS Checksum: %d ", ntohs(lsa_hdr.ls_checksum)); + proto_tree_add_text(ospf_lsa_tree, offset + 16, 2, "LS Checksum: %d ", ntohs(lsa_hdr.ls_checksum)); - proto_tree_add_item(ospf_lsa_tree, offset + 18, 2, "Length: %d ", ntohs(lsa_hdr.length)); + proto_tree_add_text(ospf_lsa_tree, offset + 18, 2, "Length: %d ", ntohs(lsa_hdr.length)); if(!disassemble_body){ return OSPF_LSA_HEADER_LENGTH; @@ -463,8 +456,8 @@ dissect_ospf_lsa(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, memcpy(&router_lsa, &pd[offset], sizeof(e_ospf_router_lsa)); /* again: flags should be secified in detail */ - proto_tree_add_item(ospf_lsa_tree, offset, 1, "Flags: 0x%02x ", router_lsa.flags); - proto_tree_add_item(ospf_lsa_tree, offset + 2, 2, "Nr. of Links: %d ", + proto_tree_add_text(ospf_lsa_tree, offset, 1, "Flags: 0x%02x ", router_lsa.flags); + proto_tree_add_text(ospf_lsa_tree, offset + 2, 2, "Nr. of Links: %d ", ntohs(router_lsa.nr_links)); offset += 4; /* router_lsa.nr_links links follow @@ -496,17 +489,17 @@ dissect_ospf_lsa(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, link_id="unknown link id"; } - proto_tree_add_item(ospf_lsa_tree, offset, 4, "%s: %s", link_id, + proto_tree_add_text(ospf_lsa_tree, offset, 4, "%s: %s", link_id, ip_to_str((guint8 *) &(router_data.link_id))); /* link_data should be specified in detail (e.g. network mask) (depends on link type)*/ - proto_tree_add_item(ospf_lsa_tree, offset + 4, 4, "Link Data: %s", + proto_tree_add_text(ospf_lsa_tree, offset + 4, 4, "Link Data: %s", ip_to_str((guint8 *) &(router_data.link_data))); - proto_tree_add_item(ospf_lsa_tree, offset + 8, 1, "Link Type: %d - %s", + proto_tree_add_text(ospf_lsa_tree, offset + 8, 1, "Link Type: %d - %s", router_data.link_type, link_type); - proto_tree_add_item(ospf_lsa_tree, offset + 9, 1, "Nr. of TOS metrics: %d", router_data.nr_tos); - proto_tree_add_item(ospf_lsa_tree, offset + 10, 2, "TOS 0 metric: %d", ntohs( router_data.tos0_metric )); + proto_tree_add_text(ospf_lsa_tree, offset + 9, 1, "Nr. of TOS metrics: %d", router_data.nr_tos); + proto_tree_add_text(ospf_lsa_tree, offset + 10, 2, "TOS 0 metric: %d", ntohs( router_data.tos0_metric )); offset += 12; @@ -517,7 +510,7 @@ dissect_ospf_lsa(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, for(tos_counter = 1 ; link_counter <= ntohs(router_data.nr_tos); tos_counter++){ memcpy(&tos_data, &pd[offset], sizeof(e_ospf_router_metric)); - proto_tree_add_item(ospf_lsa_tree, offset, 1, "TOS: %d, Metric: %d", + proto_tree_add_text(ospf_lsa_tree, offset, 1, "TOS: %d, Metric: %d", tos_data.tos, ntohs(tos_data.metric)); offset += 4; } @@ -525,13 +518,13 @@ dissect_ospf_lsa(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, break; case(OSPF_LSTYPE_NETWORK): memcpy(&network_lsa, &pd[offset], sizeof(e_ospf_network_lsa)); - proto_tree_add_item(ospf_lsa_tree, offset, 4, "Netmask: %s", + proto_tree_add_text(ospf_lsa_tree, offset, 4, "Netmask: %s", ip_to_str((guint8 *) &(network_lsa.network_mask))); offset += 4; while( ((int) (fd->cap_len - offset)) >= 4){ attached_router = (guint32 *) &pd[offset]; - proto_tree_add_item(ospf_lsa_tree, offset, 4, "Attached Router: %s", + proto_tree_add_text(ospf_lsa_tree, offset, 4, "Attached Router: %s", ip_to_str((guint8 *) attached_router)); offset += 4; } @@ -540,22 +533,22 @@ dissect_ospf_lsa(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, /* Type 3 and 4 LSAs have the same format */ case(OSPF_LSTYPE_ASBR): memcpy(&summary_lsa, &pd[offset], sizeof(e_ospf_summary_lsa)); - proto_tree_add_item(ospf_lsa_tree, offset, 4, "Netmask: %s", + proto_tree_add_text(ospf_lsa_tree, offset, 4, "Netmask: %s", ip_to_str((guint8 *) &(summary_lsa.network_mask))); /* returns only the TOS 0 metric (even if there are more TOS metrics) */ break; case(OSPF_LSTYPE_ASEXT): memcpy(&summary_lsa, &pd[offset], sizeof(e_ospf_summary_lsa)); - proto_tree_add_item(ospf_lsa_tree, offset, 4, "Netmask: %s", + proto_tree_add_text(ospf_lsa_tree, offset, 4, "Netmask: %s", ip_to_str((guint8 *) &(summary_lsa.network_mask))); /* asext_lsa = (e_ospf_asexternal_lsa *) &pd[offset + 4]; */ memcpy(&asext_lsa, &pd[offset + 4], sizeof(asext_lsa)); if( (asext_lsa.options & 128) == 128 ) { /* check wether or not E bit is set */ - proto_tree_add_item(ospf_lsa_tree, offset, 1, + proto_tree_add_text(ospf_lsa_tree, offset, 1, "External Type: Type 2 (metric is larger than any other link state path)"); } else { - proto_tree_add_item(ospf_lsa_tree, offset + 4, 1, + proto_tree_add_text(ospf_lsa_tree, offset + 4, 1, "External Type: Type 1 (metric is specified in the same units as interface cost)"); } /* the metric field of a AS-external LAS is specified in 3 bytes -> not well aligned */ @@ -565,15 +558,15 @@ dissect_ospf_lsa(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, /* erase the leading 8 bits (the dont belong to the metric */ asext_metric = ntohl(asext_metric) & 0x00ffffff ; - proto_tree_add_item(ospf_lsa_tree, offset + 5, 3,"Metric: %d", asext_metric); - proto_tree_add_item(ospf_lsa_tree, offset + 8, 4,"Forwarding Address: %s", + proto_tree_add_text(ospf_lsa_tree, offset + 5, 3,"Metric: %d", asext_metric); + proto_tree_add_text(ospf_lsa_tree, offset + 8, 4,"Forwarding Address: %s", ip_to_str((guint8 *) &(asext_lsa.gateway))); - proto_tree_add_item(ospf_lsa_tree, offset + 12, 4,"External Route Tag: %ld", (long)ntohl(asext_lsa.external_tag)); + proto_tree_add_text(ospf_lsa_tree, offset + 12, 4,"External Route Tag: %ld", (long)ntohl(asext_lsa.external_tag)); break; default: /* unknown LSA type */ - proto_tree_add_item(ospf_lsa_tree, offset, (fd->cap_len - offset), "Unknown LSA Type"); + proto_tree_add_text(ospf_lsa_tree, offset, (fd->cap_len - offset), "Unknown LSA Type"); } } /* return the length of this LSA */ diff --git a/packet-pop.c b/packet-pop.c index 8b8af7836d..6a0485b2bd 100644 --- a/packet-pop.c +++ b/packet-pop.c @@ -2,7 +2,7 @@ * Routines for pop packet dissection * Copyright 1999, Richard Sharpe * - * $Id: packet-pop.c,v 1.3 1999/05/13 01:05:11 sharpe Exp $ + * $Id: packet-pop.c,v 1.4 1999/07/07 22:51:50 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -81,23 +81,22 @@ dissect_pop(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, "Post Office Protocol"); - pop_tree = proto_tree_new(); - proto_item_add_subtree(ti, pop_tree, ETT_POP); + pop_tree = proto_item_add_subtree(ti, ETT_POP); if (pi.match_port == pi.destport) { /* Request */ - proto_tree_add_item(pop_tree, offset, i1, "Request: %s", rr); + proto_tree_add_text(pop_tree, offset, i1, "Request: %s", rr); - proto_tree_add_item(pop_tree, offset + i1 + 1, END_OF_FRAME, "Request Arg: %s", rd); + proto_tree_add_text(pop_tree, offset + i1 + 1, END_OF_FRAME, "Request Arg: %s", rd); } else { - proto_tree_add_item(pop_tree, offset, i1, "Response: %s", rr); + proto_tree_add_text(pop_tree, offset, i1, "Response: %s", rr); - proto_tree_add_item(pop_tree, offset + i1 + 1, END_OF_FRAME, "Response Arg: %s", rd); + proto_tree_add_text(pop_tree, offset + i1 + 1, END_OF_FRAME, "Response Arg: %s", rd); } } diff --git a/packet-ppp.c b/packet-ppp.c index a96217f9cc..4dc8cc2c1e 100644 --- a/packet-ppp.c +++ b/packet-ppp.c @@ -1,7 +1,7 @@ /* packet-ppp.c * Routines for ppp packet disassembly * - * $Id: packet-ppp.c,v 1.11 1999/06/11 15:30:39 gram Exp $ + * $Id: packet-ppp.c,v 1.12 1999/07/07 22:51:50 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -207,14 +207,13 @@ dissect_ipcp( const u_char *pd, int offset, frame_data *fd, proto_tree *tree ) { val_to_str(ipcpcode, cp_vals, "Unknown")); if(tree) { - ti = proto_tree_add_item(tree, 0+offset, 4, "IP Control Protocol" ); - fh_tree = proto_tree_new(); - proto_item_add_subtree(ti, fh_tree, ETT_IPCP); - proto_tree_add_item(fh_tree, 0+offset, 1, "Code: %s (0x%02x)", + ti = proto_tree_add_text(tree, 0+offset, 4, "IP Control Protocol" ); + fh_tree = proto_item_add_subtree(ti, ETT_IPCP); + proto_tree_add_text(fh_tree, 0+offset, 1, "Code: %s (0x%02x)", val_to_str(ipcpcode, cp_vals, "Unknown"), ipcpcode); - proto_tree_add_item(fh_tree, 1+offset, 1, "Identifier: 0x%02x", + proto_tree_add_text(fh_tree, 1+offset, 1, "Identifier: 0x%02x", ipcpid); - proto_tree_add_item(fh_tree, 2+offset, 2, "Length: %d", + proto_tree_add_text(fh_tree, 2+offset, 2, "Length: %d", optionslength); } @@ -244,14 +243,13 @@ dissect_lcp( const u_char *pd, int offset, frame_data *fd, proto_tree *tree ) { val_to_str(lcpcode, lcp_vals, "Unknown")); if(tree) { - ti = proto_tree_add_item(tree, 0+offset, 4, "Link Control Protocol" ); - fh_tree = proto_tree_new(); - proto_item_add_subtree(ti, fh_tree, ETT_LCP); - proto_tree_add_item(fh_tree, 0+offset, 1, "Code: %s (0x%02x)", + ti = proto_tree_add_text(tree, 0+offset, 4, "Link Control Protocol" ); + fh_tree = proto_item_add_subtree(ti, ETT_LCP); + proto_tree_add_text(fh_tree, 0+offset, 1, "Code: %s (0x%02x)", val_to_str(lcpcode, lcp_vals, "Unknown"), lcpcode); - proto_tree_add_item(fh_tree, 1+offset, 1, "Identifier: 0x%02x", + proto_tree_add_text(fh_tree, 1+offset, 1, "Identifier: 0x%02x", lcpid); - proto_tree_add_item(fh_tree, 2+offset, 2, "Length: %d", + proto_tree_add_text(fh_tree, 2+offset, 2, "Length: %d", optionslength); } @@ -276,10 +274,9 @@ dissect_payload_ppp( const u_char *pd, int offset, frame_data *fd, proto_tree *t /* populate a tree in the second pane with the status of the link layer (ie none) */ if(tree) { - ti = proto_tree_add_item(tree, 0+offset, 2, "Point-to-Point Protocol" ); - fh_tree = proto_tree_new(); - proto_item_add_subtree(ti, fh_tree, ETT_PPP); - proto_tree_add_item(fh_tree, 0+offset, 2, "Protocol: %s (0x%04x)", + ti = proto_tree_add_text(tree, 0+offset, 2, "Point-to-Point Protocol" ); + fh_tree = proto_item_add_subtree(ti, ETT_PPP); + proto_tree_add_text(fh_tree, 0+offset, 2, "Protocol: %s (0x%04x)", val_to_str(ph.ppp_prot, ppp_vals, "Unknown"), ph.ppp_prot); } @@ -347,12 +344,11 @@ dissect_ppp( const u_char *pd, frame_data *fd, proto_tree *tree ) { /* populate a tree in the second pane with the status of the link layer (ie none) */ if(tree) { - ti = proto_tree_add_item(tree, 0, 4, "Point-to-Point Protocol" ); - fh_tree = proto_tree_new(); - proto_item_add_subtree(ti, fh_tree, ETT_PPP); - proto_tree_add_item(fh_tree, 0, 1, "Address: %02x", ph.ppp_addr); - proto_tree_add_item(fh_tree, 1, 1, "Control: %02x", ph.ppp_ctl); - proto_tree_add_item(fh_tree, 2, 2, "Protocol: %s (0x%04x)", + ti = proto_tree_add_text(tree, 0, 4, "Point-to-Point Protocol" ); + fh_tree = proto_item_add_subtree(ti, ETT_PPP); + proto_tree_add_text(fh_tree, 0, 1, "Address: %02x", ph.ppp_addr); + proto_tree_add_text(fh_tree, 1, 1, "Control: %02x", ph.ppp_ctl); + proto_tree_add_text(fh_tree, 2, 2, "Protocol: %s (0x%04x)", val_to_str(ph.ppp_prot, ppp_vals, "Unknown"), ph.ppp_prot); } diff --git a/packet-pppoe.c b/packet-pppoe.c index 9da3f40a05..f15551e681 100644 --- a/packet-pppoe.c +++ b/packet-pppoe.c @@ -1,7 +1,7 @@ /* packet-arp.c * Routines for ARP packet disassembly * - * $Id: packet-pppoe.c,v 1.1 1999/06/11 15:30:39 gram Exp $ + * $Id: packet-pppoe.c,v 1.2 1999/07/07 22:51:51 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -101,9 +101,8 @@ dissect_pppoe_tags(const u_char *pd, int offset, frame_data *fd, proto_tree *tre /* Start Decoding Here. */ if (tree) { - ti = proto_tree_add_item(tree,offset,payload_length,"PPPoE Tags"); - pppoe_tree = proto_tree_new(); - proto_item_add_subtree(ti, pppoe_tree, ETT_PPPOED_TAGS); + ti = proto_tree_add_text(tree,offset,payload_length,"PPPoE Tags"); + pppoe_tree = proto_item_add_subtree(ti, ETT_PPPOED_TAGS); tagstart = offset; while(tagstart <= payload_length-2 ) { @@ -111,7 +110,7 @@ dissect_pppoe_tags(const u_char *pd, int offset, frame_data *fd, proto_tree *tre poe_tag = pntohs(&pd[tagstart]); poe_tag_length = pntohs(&pd[tagstart + 2]); - proto_tree_add_item(pppoe_tree,tagstart,4, + proto_tree_add_text(pppoe_tree,tagstart,4, "Tag: %s", pppoetag_to_str(poe_tag,"Unknown (0x%02x)")); switch(poe_tag) { @@ -123,13 +122,13 @@ dissect_pppoe_tags(const u_char *pd, int offset, frame_data *fd, proto_tree *tre /* tag value should be interpreted as a utf-8 unterminated string.*/ if(poe_tag_length > 0 ) { /* really should do some limit checking here. :( */ - proto_tree_add_item(pppoe_tree,tagstart+4,poe_tag_length, + proto_tree_add_text(pppoe_tree,tagstart+4,poe_tag_length, " String Data: %s", format_text(&pd[tagstart+4],poe_tag_length )); } break; default: if(poe_tag_length > 0 ) { - proto_tree_add_item(pppoe_tree,tagstart+4,poe_tag_length, + proto_tree_add_text(pppoe_tree,tagstart+4,poe_tag_length, " Binary Data: (%d bytes)", poe_tag_length ); } } @@ -168,18 +167,17 @@ dissect_pppoed(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { } if (tree) { - ti = proto_tree_add_item(tree,offset,pppoe_length+6,"PPPoE Discovery"); - pppoe_tree = proto_tree_new(); - proto_item_add_subtree(ti, pppoe_tree, ETT_PPPOED); - proto_tree_add_item(pppoe_tree,offset,1, + ti = proto_tree_add_text(tree,offset,pppoe_length+6,"PPPoE Discovery"); + pppoe_tree = proto_item_add_subtree(ti, ETT_PPPOED); + proto_tree_add_text(pppoe_tree,offset,1, "Version: %d", pppoe_ver); - proto_tree_add_item(pppoe_tree,offset,1, + proto_tree_add_text(pppoe_tree,offset,1, "Type: %d", pppoe_type); - proto_tree_add_item(pppoe_tree,offset+1,1, + proto_tree_add_text(pppoe_tree,offset+1,1, "Code: %s", pppoecode_to_str(pppoe_code,"Unknown (0x%02x)")); - proto_tree_add_item(pppoe_tree,offset+2,2, + proto_tree_add_text(pppoe_tree,offset+2,2, "Session ID: %04x", pppoe_session_id); - proto_tree_add_item(pppoe_tree,offset+4,2, + proto_tree_add_text(pppoe_tree,offset+4,2, "Payload Length: %d", pppoe_length); } dissect_pppoe_tags(pd,offset+6,fd,tree,offset+6+pppoe_length); @@ -213,18 +211,17 @@ dissect_pppoes(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { } if (tree) { - ti = proto_tree_add_item(tree,offset,pppoe_length+6,"PPPoE Session"); - pppoe_tree = proto_tree_new(); - proto_item_add_subtree(ti, pppoe_tree, ETT_PPPOED); - proto_tree_add_item(pppoe_tree,offset,1, + ti = proto_tree_add_text(tree,offset,pppoe_length+6,"PPPoE Session"); + pppoe_tree = proto_item_add_subtree(ti, ETT_PPPOED); + proto_tree_add_text(pppoe_tree,offset,1, "Version: %d", pppoe_ver); - proto_tree_add_item(pppoe_tree,offset,1, + proto_tree_add_text(pppoe_tree,offset,1, "Type: %d", pppoe_type); - proto_tree_add_item(pppoe_tree,offset+1,1, + proto_tree_add_text(pppoe_tree,offset+1,1, "Code: %s", pppoecode_to_str(pppoe_code,"Unknown (0x%02x)")); - proto_tree_add_item(pppoe_tree,offset+2,2, + proto_tree_add_text(pppoe_tree,offset+2,2, "Session ID: %04x", pppoe_session_id); - proto_tree_add_item(pppoe_tree,offset+4,2, + proto_tree_add_text(pppoe_tree,offset+4,2, "Payload Length: %d", pppoe_length); } /* dissect_ppp is apparently done as a 'top level' dissector, diff --git a/packet-pptp.c b/packet-pptp.c index 06bfea9a09..10a6c3f619 100644 --- a/packet-pptp.c +++ b/packet-pptp.c @@ -2,7 +2,7 @@ * Routines for the Point-to-Point Tunnelling Protocol (PPTP) * Brad Robel-Forrest * - * $Id: packet-pptp.c,v 1.1 1999/06/11 15:30:39 gram Exp $ + * $Id: packet-pptp.c,v 1.2 1999/07/07 22:51:51 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -391,28 +391,27 @@ dissect_pptp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { proto_item * ti; proto_tree * pptp_tree; - ti = proto_tree_add_item(tree, offset, len, "PPTP Control Channel"); - pptp_tree = proto_tree_new(); - proto_item_add_subtree(ti, pptp_tree, ETT_PPTP); + ti = proto_tree_add_text(tree, offset, len, "PPTP Control Channel"); + pptp_tree = proto_item_add_subtree(ti, ETT_PPTP); - proto_tree_add_item(pptp_tree, offset, sizeof(hdr->len), + proto_tree_add_text(pptp_tree, offset, sizeof(hdr->len), "Length: %u", len); offset += sizeof(hdr->len); msg_type = pntohs(&hdr->type); - proto_tree_add_item(pptp_tree, offset, sizeof(hdr->type), + proto_tree_add_text(pptp_tree, offset, sizeof(hdr->type), "Message type: %s (%u)", msgtype2str(msg_type), msg_type); offset += sizeof(hdr->type); - proto_tree_add_item(pptp_tree, offset, sizeof(hdr->cookie), + proto_tree_add_text(pptp_tree, offset, sizeof(hdr->cookie), "Cookie: %#08x", pntohl(&hdr->cookie)); offset += sizeof(hdr->cookie); - proto_tree_add_item(pptp_tree, offset, sizeof(hdr->cntrl_type), + proto_tree_add_text(pptp_tree, offset, sizeof(hdr->cntrl_type), "Control type: %s (%u)", cntrltype2str(cntrl_type), cntrl_type); offset += sizeof(hdr->cntrl_type); - proto_tree_add_item(pptp_tree, offset, sizeof(hdr->resv), + proto_tree_add_text(pptp_tree, offset, sizeof(hdr->resv), "Reserved: %u", pntohs(&hdr->resv)); offset += sizeof(hdr->resv); @@ -435,37 +434,37 @@ dissect_cntrl_req(const u_char *pd, int offset, frame_data *fd, proto_tree *tree guint32 frame; guint32 bearer; - proto_tree_add_item(tree, offset, sizeof(hdr->major_ver) + sizeof(hdr->minor_ver), + proto_tree_add_text(tree, offset, sizeof(hdr->major_ver) + sizeof(hdr->minor_ver), "Protocol version: %u.%u", hdr->major_ver, hdr->minor_ver ); offset += sizeof(hdr->major_ver) + sizeof(hdr->minor_ver); - proto_tree_add_item(tree, offset, sizeof(hdr->resv), + proto_tree_add_text(tree, offset, sizeof(hdr->resv), "Reserved: %u", hdr->resv); offset += sizeof(hdr->resv); frame = pntohl(&hdr->frame); - proto_tree_add_item(tree, offset, sizeof(hdr->frame), + proto_tree_add_text(tree, offset, sizeof(hdr->frame), "Framing capabilities: %s (%u)", frametype2str(frame), frame); offset += sizeof(hdr->frame); bearer = pntohl(&hdr->bearer); - proto_tree_add_item(tree, offset, sizeof(hdr->bearer), + proto_tree_add_text(tree, offset, sizeof(hdr->bearer), "Bearer capabilities: %s (%u)", bearertype2str(bearer), bearer); offset += sizeof(hdr->bearer); - proto_tree_add_item(tree, offset, sizeof(hdr->max_chan), + proto_tree_add_text(tree, offset, sizeof(hdr->max_chan), "Maximum channels: %u", hdr->max_chan); offset += sizeof(hdr->max_chan); - proto_tree_add_item(tree, offset, sizeof(hdr->firm_rev), + proto_tree_add_text(tree, offset, sizeof(hdr->firm_rev), "Firmware revision: %u", hdr->firm_rev); offset += sizeof(hdr->firm_rev); - proto_tree_add_item(tree, offset, sizeof(hdr->host), + proto_tree_add_text(tree, offset, sizeof(hdr->host), "Hostname: %s", hdr->host); offset += sizeof(hdr->host); - proto_tree_add_item(tree, offset, sizeof(hdr->vendor), + proto_tree_add_text(tree, offset, sizeof(hdr->vendor), "Vendor: %s", hdr->vendor); } @@ -475,41 +474,41 @@ dissect_cntrl_reply(const u_char *pd, int offset, frame_data *fd, proto_tree *tr guint32 frame; guint32 bearer; - proto_tree_add_item(tree, offset, sizeof(hdr->major_ver) + sizeof(hdr->minor_ver), + proto_tree_add_text(tree, offset, sizeof(hdr->major_ver) + sizeof(hdr->minor_ver), "Protocol version: %u.%u", hdr->major_ver, hdr->minor_ver ); offset += sizeof(hdr->major_ver) + sizeof(hdr->minor_ver); - proto_tree_add_item(tree, offset, sizeof(hdr->result), + proto_tree_add_text(tree, offset, sizeof(hdr->result), "Result: %s (%u)", cntrlresulttype2str(hdr->result), hdr->result); offset += sizeof(hdr->result); - proto_tree_add_item(tree, offset, sizeof(hdr->error), + proto_tree_add_text(tree, offset, sizeof(hdr->error), "Error: %s (%u)", errortype2str(hdr->error), hdr->error); offset += sizeof(hdr->error); frame = pntohl(&hdr->frame); - proto_tree_add_item(tree, offset, sizeof(hdr->frame), + proto_tree_add_text(tree, offset, sizeof(hdr->frame), "Framing capabilities: %s (%u)", frametype2str(frame), frame); offset += sizeof(hdr->frame); bearer = pntohl(&hdr->bearer); - proto_tree_add_item(tree, offset, sizeof(hdr->bearer), + proto_tree_add_text(tree, offset, sizeof(hdr->bearer), "Bearer capabilities: %s (%u)", bearertype2str(bearer), bearer); offset += sizeof(hdr->bearer); - proto_tree_add_item(tree, offset, sizeof(hdr->max_chan), + proto_tree_add_text(tree, offset, sizeof(hdr->max_chan), "Maximum channels: %u", hdr->max_chan); offset += sizeof(hdr->max_chan); - proto_tree_add_item(tree, offset, sizeof(hdr->firm_rev), + proto_tree_add_text(tree, offset, sizeof(hdr->firm_rev), "Firmware revision: %u", hdr->firm_rev); offset += sizeof(hdr->firm_rev); - proto_tree_add_item(tree, offset, sizeof(hdr->host), + proto_tree_add_text(tree, offset, sizeof(hdr->host), "Hostname: %s", hdr->host); offset += sizeof(hdr->host); - proto_tree_add_item(tree, offset, sizeof(hdr->vendor), + proto_tree_add_text(tree, offset, sizeof(hdr->vendor), "Vendor: %s", hdr->vendor); } @@ -517,15 +516,15 @@ static void dissect_stop_req(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct stop_req * hdr = (struct stop_req *)(pd + offset); - proto_tree_add_item(tree, offset, sizeof(hdr->reason), + proto_tree_add_text(tree, offset, sizeof(hdr->reason), "Reason: %s (%u)", reasontype2str(hdr->reason), hdr->reason); offset += sizeof(hdr->reason); - proto_tree_add_item(tree, offset, sizeof(hdr->resv0), + proto_tree_add_text(tree, offset, sizeof(hdr->resv0), "Reserved: %u", hdr->resv0); offset += sizeof(hdr->resv0); - proto_tree_add_item(tree, offset, sizeof(hdr->resv1), + proto_tree_add_text(tree, offset, sizeof(hdr->resv1), "Reserved: %u", hdr->resv1); offset += sizeof(hdr->resv1); } @@ -534,15 +533,15 @@ static void dissect_stop_reply(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct stop_reply * hdr = (struct stop_reply *)(pd + offset); - proto_tree_add_item(tree, offset, sizeof(hdr->result), + proto_tree_add_text(tree, offset, sizeof(hdr->result), "Result: %s (%u)", stopresulttype2str(hdr->result), hdr->result); offset += sizeof(hdr->result); - proto_tree_add_item(tree, offset, sizeof(hdr->error), + proto_tree_add_text(tree, offset, sizeof(hdr->error), "Error: %s (%u)", errortype2str(hdr->error), hdr->error); offset += sizeof(hdr->error); - proto_tree_add_item(tree, offset, sizeof(hdr->resv), + proto_tree_add_text(tree, offset, sizeof(hdr->resv), "Reserved: %u", hdr->resv); offset += sizeof(hdr->resv); } @@ -551,7 +550,7 @@ static void dissect_echo_req(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct echo_req * hdr = (struct echo_req *)(pd + offset); - proto_tree_add_item(tree, offset, sizeof(hdr->ident), + proto_tree_add_text(tree, offset, sizeof(hdr->ident), "Identifier: %u", hdr->ident); offset += sizeof(hdr->ident); } @@ -560,19 +559,19 @@ static void dissect_echo_reply(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct echo_reply * hdr = (struct echo_reply *)(pd + offset); - proto_tree_add_item(tree, offset, sizeof(hdr->ident), + proto_tree_add_text(tree, offset, sizeof(hdr->ident), "Identifier: %u", hdr->ident); offset += sizeof(hdr->ident); - proto_tree_add_item(tree, offset, sizeof(hdr->result), + proto_tree_add_text(tree, offset, sizeof(hdr->result), "Result: %s (%u)", echoresulttype2str(hdr->result), hdr->result); offset += sizeof(hdr->result); - proto_tree_add_item(tree, offset, sizeof(hdr->error), + proto_tree_add_text(tree, offset, sizeof(hdr->error), "Error: %s (%u)", errortype2str(hdr->error), hdr->error); offset += sizeof(hdr->error); - proto_tree_add_item(tree, offset, sizeof(hdr->resv), + proto_tree_add_text(tree, offset, sizeof(hdr->resv), "Reserved: %u", hdr->resv); offset += sizeof(hdr->resv); } @@ -583,53 +582,53 @@ dissect_out_req(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) guint32 bearer; guint32 frame; - proto_tree_add_item(tree, offset, sizeof(hdr->call_id), + proto_tree_add_text(tree, offset, sizeof(hdr->call_id), "Call ID: %u", hdr->call_id); offset += sizeof(hdr->call_id); - proto_tree_add_item(tree, offset, sizeof(hdr->call_serial), + proto_tree_add_text(tree, offset, sizeof(hdr->call_serial), "Call Serial Number: %u", hdr->call_serial); offset += sizeof(hdr->call_serial); - proto_tree_add_item(tree, offset, sizeof(hdr->min_bps), + proto_tree_add_text(tree, offset, sizeof(hdr->min_bps), "Minimum BPS: %u", hdr->min_bps); offset += sizeof(hdr->min_bps); - proto_tree_add_item(tree, offset, sizeof(hdr->max_bps), + proto_tree_add_text(tree, offset, sizeof(hdr->max_bps), "Maximum BPS: %u", hdr->max_bps); offset += sizeof(hdr->max_bps); bearer = pntohl(&hdr->bearer); - proto_tree_add_item(tree, offset, sizeof(hdr->bearer), + proto_tree_add_text(tree, offset, sizeof(hdr->bearer), "Bearer capabilities: %s (%u)", bearertype2str(bearer), bearer); offset += sizeof(hdr->bearer); frame = pntohl(&hdr->frame); - proto_tree_add_item(tree, offset, sizeof(hdr->frame), + proto_tree_add_text(tree, offset, sizeof(hdr->frame), "Framing capabilities: %s (%u)", frametype2str(frame), frame); offset += sizeof(hdr->frame); - proto_tree_add_item(tree, offset, sizeof(hdr->win_size), + proto_tree_add_text(tree, offset, sizeof(hdr->win_size), "Receive window size: %u", hdr->win_size); offset += sizeof(hdr->win_size); - proto_tree_add_item(tree, offset, sizeof(hdr->delay), + proto_tree_add_text(tree, offset, sizeof(hdr->delay), "Processing delay: %u", hdr->delay); offset += sizeof(hdr->delay); - proto_tree_add_item(tree, offset, sizeof(hdr->phone_len), + proto_tree_add_text(tree, offset, sizeof(hdr->phone_len), "Phone number length: %u", hdr->phone_len); offset += sizeof(hdr->phone_len); - proto_tree_add_item(tree, offset, sizeof(hdr->resv), + proto_tree_add_text(tree, offset, sizeof(hdr->resv), "Reserved: %u", hdr->resv); offset += sizeof(hdr->resv); - proto_tree_add_item(tree, offset, sizeof(hdr->phone), + proto_tree_add_text(tree, offset, sizeof(hdr->phone), "Phone number: %s", hdr->phone); offset += sizeof(hdr->phone); - proto_tree_add_item(tree, offset, sizeof(hdr->subaddr), + proto_tree_add_text(tree, offset, sizeof(hdr->subaddr), "Subaddress: %s", hdr->subaddr); offset += sizeof(hdr->subaddr); } @@ -638,39 +637,39 @@ static void dissect_out_reply(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct out_reply * hdr = (struct out_reply *)(pd + offset); - proto_tree_add_item(tree, offset, sizeof(hdr->call_id), + proto_tree_add_text(tree, offset, sizeof(hdr->call_id), "Call ID: %u", hdr->call_id); offset += sizeof(hdr->call_id); - proto_tree_add_item(tree, offset, sizeof(hdr->peer_id), + proto_tree_add_text(tree, offset, sizeof(hdr->peer_id), "Peer's call ID: %u", hdr->peer_id); offset += sizeof(hdr->peer_id); - proto_tree_add_item(tree, offset, sizeof(hdr->result), + proto_tree_add_text(tree, offset, sizeof(hdr->result), "Result: %s (%u)", outresulttype2str(hdr->result), hdr->result); offset += sizeof(hdr->result); - proto_tree_add_item(tree, offset, sizeof(hdr->error), + proto_tree_add_text(tree, offset, sizeof(hdr->error), "Error: %s (%u)", errortype2str(hdr->error), hdr->error); offset += sizeof(hdr->error); - proto_tree_add_item(tree, offset, sizeof(hdr->cause), + proto_tree_add_text(tree, offset, sizeof(hdr->cause), "Cause code: %u", hdr->cause); offset += sizeof(hdr->cause); - proto_tree_add_item(tree, offset, sizeof(hdr->speed), + proto_tree_add_text(tree, offset, sizeof(hdr->speed), "Connect speed: %u", hdr->speed); offset += sizeof(hdr->speed); - proto_tree_add_item(tree, offset, sizeof(hdr->win_size), + proto_tree_add_text(tree, offset, sizeof(hdr->win_size), "Receive window size: %u", hdr->win_size); offset += sizeof(hdr->win_size); - proto_tree_add_item(tree, offset, sizeof(hdr->delay), + proto_tree_add_text(tree, offset, sizeof(hdr->delay), "Processing delay: %u", hdr->delay); offset += sizeof(hdr->delay); - proto_tree_add_item(tree, offset, sizeof(hdr->channel_id), + proto_tree_add_text(tree, offset, sizeof(hdr->channel_id), "Physical channel ID: %u", hdr->channel_id); offset += sizeof(hdr->channel_id); } @@ -681,40 +680,40 @@ dissect_in_req(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct in_req * hdr = (struct in_req *)(pd + offset); guint32 bearer; - proto_tree_add_item(tree, offset, sizeof(hdr->call_id), + proto_tree_add_text(tree, offset, sizeof(hdr->call_id), "Call ID: %u", hdr->call_id); offset += sizeof(hdr->call_id); - proto_tree_add_item(tree, offset, sizeof(hdr->call_serial), + proto_tree_add_text(tree, offset, sizeof(hdr->call_serial), "Call serial number: %u", hdr->call_serial); offset += sizeof(hdr->call_serial); bearer = pntohl(&hdr->bearer); - proto_tree_add_item(tree, offset, sizeof(hdr->bearer), + proto_tree_add_text(tree, offset, sizeof(hdr->bearer), "Bearer capabilities: %s (%u)", bearertype2str(bearer), bearer); offset += sizeof(hdr->bearer); - proto_tree_add_item(tree, offset, sizeof(hdr->channel_id), + proto_tree_add_text(tree, offset, sizeof(hdr->channel_id), "Physical channel ID: %u", hdr->channel_id); offset += sizeof(hdr->channel_id); - proto_tree_add_item(tree, offset, sizeof(hdr->dialed_len), + proto_tree_add_text(tree, offset, sizeof(hdr->dialed_len), "Dialed number length: %u", hdr->dialed_len); offset += sizeof(hdr->dialed_len); - proto_tree_add_item(tree, offset, sizeof(hdr->dialing_len), + proto_tree_add_text(tree, offset, sizeof(hdr->dialing_len), "Dialing number length: %u", hdr->dialing_len); offset += sizeof(hdr->dialing_len); - proto_tree_add_item(tree, offset, sizeof(hdr->dialed), + proto_tree_add_text(tree, offset, sizeof(hdr->dialed), "Dialed number: %s", hdr->dialed); offset += sizeof(hdr->dialed); - proto_tree_add_item(tree, offset, sizeof(hdr->dialing), + proto_tree_add_text(tree, offset, sizeof(hdr->dialing), "Dialing number: %s", hdr->dialing); offset += sizeof(hdr->dialing); - proto_tree_add_item(tree, offset, sizeof(hdr->subaddr), + proto_tree_add_text(tree, offset, sizeof(hdr->subaddr), "Subaddress: %s", hdr->subaddr); offset += sizeof(hdr->subaddr); } @@ -723,31 +722,31 @@ static void dissect_in_reply(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct in_reply * hdr = (struct in_reply *)(pd + offset); - proto_tree_add_item(tree, offset, sizeof(hdr->call_id), + proto_tree_add_text(tree, offset, sizeof(hdr->call_id), "Call ID: %u", hdr->call_id); offset += sizeof(hdr->call_id); - proto_tree_add_item(tree, offset, sizeof(hdr->peer_id), + proto_tree_add_text(tree, offset, sizeof(hdr->peer_id), "Peer's call ID: %u", hdr->peer_id); offset += sizeof(hdr->peer_id); - proto_tree_add_item(tree, offset, sizeof(hdr->result), + proto_tree_add_text(tree, offset, sizeof(hdr->result), "Result: %s (%u)", inresulttype2str(hdr->result), hdr->result); offset += sizeof(hdr->result); - proto_tree_add_item(tree, offset, sizeof(hdr->error), + proto_tree_add_text(tree, offset, sizeof(hdr->error), "Error: %s (%u)", errortype2str(hdr->error), hdr->error); offset += sizeof(hdr->error); - proto_tree_add_item(tree, offset, sizeof(hdr->win_size), + proto_tree_add_text(tree, offset, sizeof(hdr->win_size), "Receive window size: %u", hdr->win_size); offset += sizeof(hdr->win_size); - proto_tree_add_item(tree, offset, sizeof(hdr->delay), + proto_tree_add_text(tree, offset, sizeof(hdr->delay), "Processing delay: %u", hdr->delay); offset += sizeof(hdr->delay); - proto_tree_add_item(tree, offset, sizeof(hdr->resv), + proto_tree_add_text(tree, offset, sizeof(hdr->resv), "Reserved: %u", hdr->resv); offset += sizeof(hdr->resv); } @@ -757,28 +756,28 @@ dissect_in_connected(const u_char *pd, int offset, frame_data *fd, proto_tree *t struct in_connected * hdr = (struct in_connected *)(pd + offset); guint32 frame; - proto_tree_add_item(tree, offset, sizeof(hdr->peer_id), + proto_tree_add_text(tree, offset, sizeof(hdr->peer_id), "Peer's call ID: %u", hdr->peer_id); offset += sizeof(hdr->peer_id); - proto_tree_add_item(tree, offset, sizeof(hdr->resv), + proto_tree_add_text(tree, offset, sizeof(hdr->resv), "Reserved: %u", hdr->resv); offset += sizeof(hdr->resv); - proto_tree_add_item(tree, offset, sizeof(hdr->speed), + proto_tree_add_text(tree, offset, sizeof(hdr->speed), "Connect speed: %u", hdr->speed); offset += sizeof(hdr->speed); - proto_tree_add_item(tree, offset, sizeof(hdr->win_size), + proto_tree_add_text(tree, offset, sizeof(hdr->win_size), "Receive window size: %u", hdr->win_size); offset += sizeof(hdr->win_size); - proto_tree_add_item(tree, offset, sizeof(hdr->delay), + proto_tree_add_text(tree, offset, sizeof(hdr->delay), "Processing delay: %u", hdr->delay); offset += sizeof(hdr->delay); frame = pntohl(&hdr->frame); - proto_tree_add_item(tree, offset, sizeof(hdr->frame), + proto_tree_add_text(tree, offset, sizeof(hdr->frame), "Framing capabilities: %s (%u)", frametype2str(frame), frame); offset += sizeof(hdr->frame); } @@ -787,11 +786,11 @@ static void dissect_clear_req(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct clear_req * hdr = (struct clear_req *)(pd + offset); - proto_tree_add_item(tree, offset, sizeof(hdr->call_id), + proto_tree_add_text(tree, offset, sizeof(hdr->call_id), "Call ID: %u", hdr->call_id); offset += sizeof(hdr->call_id); - proto_tree_add_item(tree, offset, sizeof(hdr->resv), + proto_tree_add_text(tree, offset, sizeof(hdr->resv), "Reserved: %u", hdr->resv); offset += sizeof(hdr->resv); } @@ -800,27 +799,27 @@ static void dissect_disc_notify(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct disc_notify * hdr = (struct disc_notify *)(pd + offset); - proto_tree_add_item(tree, offset, sizeof(hdr->call_id), + proto_tree_add_text(tree, offset, sizeof(hdr->call_id), "Call ID: %u", hdr->call_id); offset += sizeof(hdr->call_id); - proto_tree_add_item(tree, offset, sizeof(hdr->result), + proto_tree_add_text(tree, offset, sizeof(hdr->result), "Result: %s (%u)", discresulttype2str(hdr->result), hdr->result); offset += sizeof(hdr->result); - proto_tree_add_item(tree, offset, sizeof(hdr->error), + proto_tree_add_text(tree, offset, sizeof(hdr->error), "Error: %s (%u)", errortype2str(hdr->error), hdr->error); offset += sizeof(hdr->error); - proto_tree_add_item(tree, offset, sizeof(hdr->cause), + proto_tree_add_text(tree, offset, sizeof(hdr->cause), "Cause code: %u", hdr->cause); offset += sizeof(hdr->cause); - proto_tree_add_item(tree, offset, sizeof(hdr->resv), + proto_tree_add_text(tree, offset, sizeof(hdr->resv), "Reserved: %u", hdr->resv); offset += sizeof(hdr->resv); - proto_tree_add_item(tree, offset, sizeof(hdr->stats), + proto_tree_add_text(tree, offset, sizeof(hdr->stats), "Call statistics: %s", hdr->stats); offset += sizeof(hdr->stats); } @@ -829,35 +828,35 @@ static void dissect_error_notify(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct error_notify * hdr = (struct error_notify *)(pd + offset); - proto_tree_add_item(tree, offset, sizeof(hdr->peer_id), + proto_tree_add_text(tree, offset, sizeof(hdr->peer_id), "Peer's call ID: %u", hdr->peer_id); offset += sizeof(hdr->peer_id); - proto_tree_add_item(tree, offset, sizeof(hdr->resv), + proto_tree_add_text(tree, offset, sizeof(hdr->resv), "Reserved: %u", hdr->resv); offset += sizeof(hdr->resv); - proto_tree_add_item(tree, offset, sizeof(hdr->crc), + proto_tree_add_text(tree, offset, sizeof(hdr->crc), "CRC errors: %u", hdr->crc); offset += sizeof(hdr->crc); - proto_tree_add_item(tree, offset, sizeof(hdr->frame), + proto_tree_add_text(tree, offset, sizeof(hdr->frame), "Framing errors: %u", hdr->frame); offset += sizeof(hdr->frame); - proto_tree_add_item(tree, offset, sizeof(hdr->hardware), + proto_tree_add_text(tree, offset, sizeof(hdr->hardware), "Hardware overruns: %u", hdr->hardware); offset += sizeof(hdr->hardware); - proto_tree_add_item(tree, offset, sizeof(hdr->buffer), + proto_tree_add_text(tree, offset, sizeof(hdr->buffer), "Buffer overruns: %u", hdr->buffer); offset += sizeof(hdr->buffer); - proto_tree_add_item(tree, offset, sizeof(hdr->timeout), + proto_tree_add_text(tree, offset, sizeof(hdr->timeout), "Time-out errors: %u", hdr->timeout); offset += sizeof(hdr->timeout); - proto_tree_add_item(tree, offset, sizeof(hdr->alignment), + proto_tree_add_text(tree, offset, sizeof(hdr->alignment), "Alignment errors: %u", hdr->alignment); offset += sizeof(hdr->alignment); } @@ -866,19 +865,19 @@ static void dissect_set_link(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { struct set_link * hdr = (struct set_link *)(pd + offset); - proto_tree_add_item(tree, offset, sizeof(hdr->peer_id), + proto_tree_add_text(tree, offset, sizeof(hdr->peer_id), "Peer's call ID: %u", hdr->peer_id); offset += sizeof(hdr->peer_id); - proto_tree_add_item(tree, offset, sizeof(hdr->resv), + proto_tree_add_text(tree, offset, sizeof(hdr->resv), "Reserved: %u", hdr->resv); offset += sizeof(hdr->resv); - proto_tree_add_item(tree, offset, sizeof(hdr->send_acm), + proto_tree_add_text(tree, offset, sizeof(hdr->send_acm), "Send ACCM: %#08x", hdr->send_acm); offset += sizeof(hdr->send_acm); - proto_tree_add_item(tree, offset, sizeof(hdr->recv_acm), + proto_tree_add_text(tree, offset, sizeof(hdr->recv_acm), "Recv ACCM: %#08x", hdr->recv_acm); offset += sizeof(hdr->recv_acm); } diff --git a/packet-raw.c b/packet-raw.c index a9188729c4..f0fab49ab0 100644 --- a/packet-raw.c +++ b/packet-raw.c @@ -1,7 +1,7 @@ /* packet-raw.c * Routines for raw packet disassembly * - * $Id: packet-raw.c,v 1.9 1999/03/23 03:14:43 gram Exp $ + * $Id: packet-raw.c,v 1.10 1999/07/07 22:51:52 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -71,10 +71,9 @@ dissect_raw( const u_char *pd, frame_data *fd, proto_tree *tree ) { /* populate a tree in the second pane with the status of the link layer (ie none) */ if(tree) { - ti = proto_tree_add_item(tree, 0, 0, "Raw packet data" ); - fh_tree = proto_tree_new(); - proto_item_add_subtree(ti, fh_tree, ETT_RAW); - proto_tree_add_item(fh_tree, 0, 0, "No link information available"); + ti = proto_tree_add_text(tree, 0, 0, "Raw packet data" ); + fh_tree = proto_item_add_subtree(ti, ETT_RAW); + proto_tree_add_text(fh_tree, 0, 0, "No link information available"); } /* So far, the only time we get raw connection types are with Linux and diff --git a/packet-rip.c b/packet-rip.c index b4d3a992e7..7d1a780638 100644 --- a/packet-rip.c +++ b/packet-rip.c @@ -2,7 +2,7 @@ * Routines for RIPv1 and RIPv2 packet disassembly * (c) Copyright Hannes R. Boehm * - * $Id: packet-rip.c,v 1.8 1999/03/23 03:14:43 gram Exp $ + * $Id: packet-rip.c,v 1.9 1999/07/07 22:51:52 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -90,14 +90,13 @@ dissect_rip(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { col_add_str(fd, COL_INFO, packet_type[rip_header.command]); if (tree) { - ti = proto_tree_add_item(tree, offset, (fd->cap_len - offset), "Routing Information Protocol"); - rip_tree = proto_tree_new(); - proto_item_add_subtree(ti, rip_tree, ETT_RIP); + ti = proto_tree_add_text(tree, offset, (fd->cap_len - offset), "Routing Information Protocol"); + rip_tree = proto_item_add_subtree(ti, ETT_RIP); - proto_tree_add_item(rip_tree, offset, 1, "Command: %d (%s)", rip_header.command, packet_type[rip_header.command]); - proto_tree_add_item(rip_tree, offset + 1, 1, "Version: %d", rip_header.version); + proto_tree_add_text(rip_tree, offset, 1, "Command: %d (%s)", rip_header.command, packet_type[rip_header.command]); + proto_tree_add_text(rip_tree, offset + 1, 1, "Version: %d", rip_header.version); if(rip_header.version == RIPv2) - proto_tree_add_item(rip_tree, offset + 2 , 2, "Routing Domain: %d", ntohs(rip_header.domain)); + proto_tree_add_text(rip_tree, offset + 2 , 2, "Routing Domain: %d", ntohs(rip_header.domain)); /* skip header */ offset += RIP_HEADER_LENGTH; @@ -109,7 +108,7 @@ dissect_rip(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { family = ntohs(rip_entry.vektor.family); switch (family) { case 2: /* IP */ - ti = proto_tree_add_item(rip_tree, offset, + ti = proto_tree_add_text(rip_tree, offset, RIP_ENTRY_LENGTH, "IP Address: %s, Metric: %ld", ip_to_str((guint8 *) &(rip_entry.vektor.ip)), (long)ntohl(rip_entry.vektor.metric)); @@ -117,13 +116,13 @@ dissect_rip(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { offset, ti); break; case 0xFFFF: - proto_tree_add_item(rip_tree, offset, + proto_tree_add_text(rip_tree, offset, RIP_ENTRY_LENGTH, "Authentication"); dissect_rip_authentication(&rip_entry.authentication, offset, ti); break; default: - proto_tree_add_item(rip_tree, offset, + proto_tree_add_text(rip_tree, offset, RIP_ENTRY_LENGTH, "Unknown address family %u", family); break; @@ -140,22 +139,21 @@ dissect_ip_rip_vektor(guint8 version, const e_rip_vektor *rip_vektor, { proto_tree *rip_vektor_tree; - rip_vektor_tree = proto_tree_new(); - proto_item_add_subtree(tree, rip_vektor_tree, ETT_RIP_VEC); + rip_vektor_tree = proto_item_add_subtree(tree, ETT_RIP_VEC); - proto_tree_add_item(rip_vektor_tree, offset, 2, "Address Family ID: IP"); + proto_tree_add_text(rip_vektor_tree, offset, 2, "Address Family ID: IP"); if(version == RIPv2) - proto_tree_add_item(rip_vektor_tree, offset + 2 , 2, "Route Tag: %d", + proto_tree_add_text(rip_vektor_tree, offset + 2 , 2, "Route Tag: %d", ntohs(rip_vektor->tag)); - proto_tree_add_item(rip_vektor_tree, offset + 4, 4, "IP Address: %s", + proto_tree_add_text(rip_vektor_tree, offset + 4, 4, "IP Address: %s", ip_to_str((guint8 *) &(rip_vektor->ip))); if(version == RIPv2) { - proto_tree_add_item(rip_vektor_tree, offset + 8 , 4, "Netmask: %s", + proto_tree_add_text(rip_vektor_tree, offset + 8 , 4, "Netmask: %s", ip_to_str((guint8 *) &(rip_vektor->mask))); - proto_tree_add_item(rip_vektor_tree, offset + 12, 4, "Next Hop: %s", + proto_tree_add_text(rip_vektor_tree, offset + 12, 4, "Next Hop: %s", ip_to_str((guint8 *) &(rip_vektor->next_hop))); } - proto_tree_add_item(rip_vektor_tree, offset + 16, 4, "Metric: %ld", + proto_tree_add_text(rip_vektor_tree, offset + 16, 4, "Metric: %ld", (long)ntohl(rip_vektor->metric)); } @@ -166,14 +164,13 @@ dissect_rip_authentication(const e_rip_authentication *rip_authentication, proto_tree *rip_authentication_tree; guint16 authtype; - rip_authentication_tree = proto_tree_new(); - proto_item_add_subtree(tree, rip_authentication_tree, ETT_RIP_VEC); + rip_authentication_tree = proto_item_add_subtree(tree, ETT_RIP_VEC); authtype = ntohs(rip_authentication->authtype); - proto_tree_add_item(rip_authentication_tree, offset + 2, 2, + proto_tree_add_text(rip_authentication_tree, offset + 2, 2, "Authentication type: %u", authtype); if (authtype == 2) - proto_tree_add_item(rip_authentication_tree, offset + 4 , 16, + proto_tree_add_text(rip_authentication_tree, offset + 4 , 16, "Password: %.16s", rip_authentication->authentication); } diff --git a/packet-rsvp.c b/packet-rsvp.c index fec28437c6..5f5c73c609 100644 --- a/packet-rsvp.c +++ b/packet-rsvp.c @@ -3,7 +3,7 @@ * * (c) Copyright Ashok Narayanan * - * $Id: packet-rsvp.c,v 1.1 1999/06/11 16:44:51 gram Exp $ + * $Id: packet-rsvp.c,v 1.2 1999/07/07 22:51:52 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -160,27 +160,25 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) if (tree) { msg_length = pntohs(pd+offset+6); - ti = proto_tree_add_item(tree, offset, msg_length, + ti = proto_tree_add_text(tree, offset, msg_length, "Resource ReserVation Protocol (RSVP)"); - rsvp_tree = proto_tree_new(); - proto_item_add_subtree(ti, rsvp_tree, ETT_RSVP); + rsvp_tree = proto_item_add_subtree(ti, ETT_RSVP); - ti = proto_tree_add_item(rsvp_tree, offset, + ti = proto_tree_add_text(rsvp_tree, offset, sizeof(rsvp_header), "RSVP Header"); - rsvp_header_tree = proto_tree_new(); - proto_item_add_subtree(ti, rsvp_header_tree, ETT_RSVP_HDR); + rsvp_header_tree = proto_item_add_subtree(ti, ETT_RSVP_HDR); - proto_tree_add_item(rsvp_header_tree, offset, 1, "RSVP Version: %d", + proto_tree_add_text(rsvp_header_tree, offset, 1, "RSVP Version: %d", (hdr->ver_flags & 0xf0)>>4); - proto_tree_add_item(rsvp_header_tree, offset, 1, "Flags: %02X", + proto_tree_add_text(rsvp_header_tree, offset, 1, "Flags: %02X", hdr->ver_flags & 0xf); - proto_tree_add_item(rsvp_header_tree, offset+1, 1, "Message Type: %d - %s", + proto_tree_add_text(rsvp_header_tree, offset+1, 1, "Message Type: %d - %s", hdr->message_type, packet_type?packet_type:"Unknown"); - proto_tree_add_item(rsvp_header_tree, offset + 2 , 2, "Message Checksum"); - proto_tree_add_item(rsvp_header_tree, offset + 4 , 1, "Sending TTL: %d", + proto_tree_add_text(rsvp_header_tree, offset + 2 , 2, "Message Checksum"); + proto_tree_add_text(rsvp_header_tree, offset + 4 , 1, "Sending TTL: %d", hdr->sending_ttl); - proto_tree_add_item(rsvp_header_tree, offset + 6 , 2, "Message length: %d", + proto_tree_add_text(rsvp_header_tree, offset + 6 , 2, "Message length: %d", msg_length); offset += sizeof(rsvp_header); @@ -189,42 +187,41 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) obj = (rsvp_object *)&pd[offset]; obj_length = pntohs(pd+offset); if (offset + obj_length > fd->cap_len) { - proto_tree_add_item(rsvp_tree, offset, 1, + proto_tree_add_text(rsvp_tree, offset, 1, "Further data not captured"); break; } object_type = match_strval(obj->class, rsvp_class_vals); if (!object_type) object_type = "Unknown"; - ti = proto_tree_add_item(rsvp_tree, offset, + ti = proto_tree_add_text(rsvp_tree, offset, obj_length, "%s (%d)", object_type, obj->class); - rsvp_object_tree = proto_tree_new(); offset2 = offset + sizeof(rsvp_object); switch(obj->class) { case RSVP_CLASS_SESSION : - proto_item_add_subtree(ti, rsvp_object_tree, ETT_RSVP_SESSION); - proto_tree_add_item(rsvp_object_tree, offset, 2, "Length: %d", + rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_SESSION); + proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", obj_length); - proto_tree_add_item(rsvp_object_tree, offset+2, 1, + proto_tree_add_text(rsvp_object_tree, offset+2, 1, "Class number: %d - %s", obj->class, object_type); switch(obj->type) { case 1: { rsvp_session_ipv4 *sess = (rsvp_session_ipv4 *)obj; - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: 1 - IPv4"); - proto_tree_add_item(rsvp_object_tree, offset2, 4, + proto_tree_add_text(rsvp_object_tree, offset2, 4, "Destination address: %s", ip_to_str((guint8 *) &(sess->destination))); - proto_tree_add_item(rsvp_object_tree, offset2+4, 1, + proto_tree_add_text(rsvp_object_tree, offset2+4, 1, "Protocol: %d", sess->protocol); - proto_tree_add_item(rsvp_object_tree, offset2+5, 1, + proto_tree_add_text(rsvp_object_tree, offset2+5, 1, "Flags: %d", sess->flags); - proto_tree_add_item(rsvp_object_tree, offset2+6, 2, + proto_tree_add_text(rsvp_object_tree, offset2+6, 2, "Destination port: %d", pntohs(pd+offset2+6)); break; @@ -232,48 +229,48 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) case 2: { rsvp_session_ipv6 *sess = (rsvp_session_ipv6 *)obj; - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: 2 - IPv6"); - proto_tree_add_item(rsvp_object_tree, offset2, 4, + proto_tree_add_text(rsvp_object_tree, offset2, 4, "Destination address: %s", ip6_to_str(&(sess->destination))); - proto_tree_add_item(rsvp_object_tree, offset2+16, 1, + proto_tree_add_text(rsvp_object_tree, offset2+16, 1, "Protocol: %d", sess->protocol); - proto_tree_add_item(rsvp_object_tree, offset2+17, 1, + proto_tree_add_text(rsvp_object_tree, offset2+17, 1, "Flags: %d", sess->flags); - proto_tree_add_item(rsvp_object_tree, offset2+18, 2, + proto_tree_add_text(rsvp_object_tree, offset2+18, 2, "Destination port: %d", pntohs(pd+offset2+18)); break; } default: { - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: Unknown (%d)", obj->type); i = obj_length - sizeof(rsvp_object); - proto_tree_add_item(rsvp_object_tree, offset2, i, + proto_tree_add_text(rsvp_object_tree, offset2, i, "Data (%d bytes)", i); } } break; case RSVP_CLASS_HOP : - proto_item_add_subtree(ti, rsvp_object_tree, ETT_RSVP_HOP); - proto_tree_add_item(rsvp_object_tree, offset, 2, "Length: %d", + rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_HOP); + proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", obj_length); - proto_tree_add_item(rsvp_object_tree, offset+2, 1, + proto_tree_add_text(rsvp_object_tree, offset+2, 1, "Class number: %d - %s", obj->class, object_type); switch(obj->type) { case 1: { rsvp_hop_ipv4 *hop = (rsvp_hop_ipv4 *)obj; - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: 1 - IPv4"); - proto_tree_add_item(rsvp_object_tree, offset2, 4, + proto_tree_add_text(rsvp_object_tree, offset2, 4, "Neighbor address: %s", ip_to_str((guint8 *) &(hop->neighbor))); - proto_tree_add_item(rsvp_object_tree, offset2+4, 4, + proto_tree_add_text(rsvp_object_tree, offset2+4, 4, "Logical interface: %0x", pntohl(pd+offset2+4)); break; @@ -281,40 +278,40 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) case 2: { rsvp_hop_ipv6 *hop = (rsvp_hop_ipv6 *)obj; - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: 2 - IPv6"); - proto_tree_add_item(rsvp_object_tree, offset2, 4, + proto_tree_add_text(rsvp_object_tree, offset2, 4, "Neighbor address: %s", ip6_to_str(&(hop->neighbor))); - proto_tree_add_item(rsvp_object_tree, offset2+16, 4, + proto_tree_add_text(rsvp_object_tree, offset2+16, 4, "Logical interface: %0x", pntohl(pd+offset2+16)); break; } default: { - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: Unknown (%d)", obj->type); i = obj_length - sizeof(rsvp_object); - proto_tree_add_item(rsvp_object_tree, offset2, i, + proto_tree_add_text(rsvp_object_tree, offset2, i, "Data (%d bytes)", i); } } break; case RSVP_CLASS_TIME_VALUES : - proto_item_add_subtree(ti, rsvp_object_tree, ETT_RSVP_TIME_VALUES); - proto_tree_add_item(rsvp_object_tree, offset, 2, "Length: %d", + rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_TIME_VALUES); + proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", obj_length); - proto_tree_add_item(rsvp_object_tree, offset+2, 1, + proto_tree_add_text(rsvp_object_tree, offset+2, 1, "Class number: %d - %s", obj->class, object_type); switch(obj->type) { case 1: { - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: 1"); - proto_tree_add_item(rsvp_object_tree, offset2, 4, + proto_tree_add_text(rsvp_object_tree, offset2, 4, "Refresh interval: %u ms (%u seconds)", pntohl(pd+offset2), pntohl(pd+offset2)/1000); @@ -322,11 +319,11 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) } default: { - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: Unknown (%d)", obj->type); i = obj_length - sizeof(rsvp_object); - proto_tree_add_item(rsvp_object_tree, offset2, i, + proto_tree_add_text(rsvp_object_tree, offset2, i, "Data (%d bytes)", i); break; } @@ -334,10 +331,10 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) break; case RSVP_CLASS_ERROR : - proto_item_add_subtree(ti, rsvp_object_tree, ETT_RSVP_ERROR); - proto_tree_add_item(rsvp_object_tree, offset, 2, "Length: %d", + rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_ERROR); + proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", obj_length); - proto_tree_add_item(rsvp_object_tree, offset+2, 1, + proto_tree_add_text(rsvp_object_tree, offset+2, 1, "Class number: %d - %s", obj->class, object_type); switch(obj->type) { @@ -346,17 +343,17 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) char *err_str = match_strval(err->error_code, rsvp_error_vals); if (!err_str) err_str = "Unknown"; - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: 1 - IPv4"); - proto_tree_add_item(rsvp_object_tree, offset2, 4, + proto_tree_add_text(rsvp_object_tree, offset2, 4, "Error node: %s", ip_to_str((guint8 *) &(err->error_node))); - proto_tree_add_item(rsvp_object_tree, offset2+4, 1, + proto_tree_add_text(rsvp_object_tree, offset2+4, 1, "Flags: %02x", err->flags); - proto_tree_add_item(rsvp_object_tree, offset2+5, 1, + proto_tree_add_text(rsvp_object_tree, offset2+5, 1, "Error code: %d - %s", err->error_code, err_str); - proto_tree_add_item(rsvp_object_tree, offset2+6, 2, + proto_tree_add_text(rsvp_object_tree, offset2+6, 2, "Error value: %d", pntohs(pd+offset2+6)); break; @@ -366,28 +363,28 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) rsvp_error_ipv6 *err = (rsvp_error_ipv6 *)obj; char *err_str = match_strval(err->error_code, rsvp_error_vals); if (!err_str) err_str = "Unknown"; - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: 2 - IPv6"); - proto_tree_add_item(rsvp_object_tree, offset2, 4, + proto_tree_add_text(rsvp_object_tree, offset2, 4, "Error node: %s", ip6_to_str(&(err->error_node))); - proto_tree_add_item(rsvp_object_tree, offset2+16, 1, + proto_tree_add_text(rsvp_object_tree, offset2+16, 1, "Flags: %02x", err->flags); - proto_tree_add_item(rsvp_object_tree, offset2+17, 1, + proto_tree_add_text(rsvp_object_tree, offset2+17, 1, "Error code: %d - %s", err->error_code, err_str); - proto_tree_add_item(rsvp_object_tree, offset2+18, 2, + proto_tree_add_text(rsvp_object_tree, offset2+18, 2, "Error value: %d", pntohs(pd+offset2+18)); break; } default: { - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: Unknown (%d)", obj->type); i = obj_length - sizeof(rsvp_object); - proto_tree_add_item(rsvp_object_tree, offset2, i, + proto_tree_add_text(rsvp_object_tree, offset2, i, "Data (%d bytes)", i); } } @@ -396,20 +393,20 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) case RSVP_CLASS_SCOPE : mylen = obj_length; - proto_item_add_subtree(ti, rsvp_object_tree, ETT_RSVP_SCOPE); - proto_tree_add_item(rsvp_object_tree, offset, 2, "Length: %d", + rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_SCOPE); + proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", obj_length); - proto_tree_add_item(rsvp_object_tree, offset+2, 1, + proto_tree_add_text(rsvp_object_tree, offset+2, 1, "Class number: %d - %s", obj->class, object_type); switch(obj->type) { case 1: { unsigned long ip; - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: 1 - IPv4"); while (mylen > sizeof(rsvp_object)) { ip = pntohl(pd+offset2); - proto_tree_add_item(rsvp_object_tree, offset2, 4, + proto_tree_add_text(rsvp_object_tree, offset2, 4, "IPv4 Address: %s", ip_to_str((guint8 *) &ip)); offset2 += 4; @@ -420,11 +417,11 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) case 2: { struct e_in6_addr *ip; - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: 2 - IPv6"); while (mylen>sizeof(rsvp_object)) { ip = (struct e_in6_addr *)pd+offset2; - proto_tree_add_item(rsvp_object_tree, offset2, 16, + proto_tree_add_text(rsvp_object_tree, offset2, 16, "IPv6 Address: %s", ip6_to_str(ip)); offset2 += 16; @@ -434,21 +431,21 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) } default: { - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: Unknown (%d)", obj->type); i = obj_length - sizeof(rsvp_object); - proto_tree_add_item(rsvp_object_tree, offset2, i, + proto_tree_add_text(rsvp_object_tree, offset2, i, "Data (%d bytes)", i); } } break; case RSVP_CLASS_STYLE : - proto_item_add_subtree(ti, rsvp_object_tree, ETT_RSVP_STYLE); - proto_tree_add_item(rsvp_object_tree, offset, 2, "Length: %d", + rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_STYLE); + proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", obj_length); - proto_tree_add_item(rsvp_object_tree, offset+2, 1, + proto_tree_add_text(rsvp_object_tree, offset+2, 1, "Class number: %d - %s", obj->class, object_type); switch(obj->type) { @@ -456,19 +453,19 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) unsigned long ip = pntohl(pd+offset2); char *style_str = match_strval(ip, style_vals); if (!style_str) style_str = "Unknown"; - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: 1"); - proto_tree_add_item(rsvp_object_tree, offset2+5, 1, + proto_tree_add_text(rsvp_object_tree, offset2+5, 1, "Style: %ld - %s", ip, style_str); break; } default: { - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: Unknown (%d)", obj->type); i = obj_length - sizeof(rsvp_object); - proto_tree_add_item(rsvp_object_tree, offset2, i, + proto_tree_add_text(rsvp_object_tree, offset2, i, "Data (%d bytes)", i); break; } @@ -476,18 +473,18 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) break; case RSVP_CLASS_CONFIRM : - proto_item_add_subtree(ti, rsvp_object_tree, ETT_RSVP_CONFIRM); - proto_tree_add_item(rsvp_object_tree, offset, 2, "Length: %d", + rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_CONFIRM); + proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", obj_length); - proto_tree_add_item(rsvp_object_tree, offset+2, 1, + proto_tree_add_text(rsvp_object_tree, offset+2, 1, "Class number: %d - %s", obj->class, object_type); switch(obj->type) { case 1: { rsvp_confirm_ipv4 *confirm = (rsvp_confirm_ipv4 *)obj; - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: 1 - IPv4"); - proto_tree_add_item(rsvp_object_tree, offset2, 4, + proto_tree_add_text(rsvp_object_tree, offset2, 4, "Receiver address: %s", ip_to_str((guint8 *) &(confirm->receiver))); break; @@ -495,72 +492,72 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) case 2: { rsvp_confirm_ipv6 *confirm = (rsvp_confirm_ipv6 *)obj; - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: 2 - IPv6"); - proto_tree_add_item(rsvp_object_tree, offset2, 16, + proto_tree_add_text(rsvp_object_tree, offset2, 16, "Receiver address: %s", ip6_to_str(&(confirm->receiver))); break; } default: { - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: Unknown (%d)", obj->type); i = obj_length - sizeof(rsvp_object); - proto_tree_add_item(rsvp_object_tree, offset2, i, + proto_tree_add_text(rsvp_object_tree, offset2, i, "Data (%d bytes)", i); } } break; case RSVP_CLASS_SENDER_TEMPLATE : - proto_item_add_subtree(ti, rsvp_object_tree, ETT_RSVP_SENDER_TEMPLATE); - proto_tree_add_item(rsvp_object_tree, offset, 2, "Length: %d", + rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_SENDER_TEMPLATE); + proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", obj_length); - proto_tree_add_item(rsvp_object_tree, offset+2, 1, + proto_tree_add_text(rsvp_object_tree, offset+2, 1, "Class number: %d - %s", obj->class, object_type); goto common_template; case RSVP_CLASS_FILTER_SPEC : - proto_item_add_subtree(ti, rsvp_object_tree, ETT_RSVP_FILTER_SPEC); - proto_tree_add_item(rsvp_object_tree, offset, 2, "Length: %d", + rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_FILTER_SPEC); + proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", obj_length); - proto_tree_add_item(rsvp_object_tree, offset+2, 1, + proto_tree_add_text(rsvp_object_tree, offset+2, 1, "Class number: %d - %s", obj->class, object_type); common_template: switch(obj->type) { case 1: { rsvp_template_ipv4 *tem = (rsvp_template_ipv4 *)obj; - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: 1 - IPv4"); - proto_tree_add_item(rsvp_object_tree, offset2, 4, + proto_tree_add_text(rsvp_object_tree, offset2, 4, "Source address: %s", ip_to_str((guint8 *) &(tem->source))); - proto_tree_add_item(rsvp_object_tree, offset2+6, 2, + proto_tree_add_text(rsvp_object_tree, offset2+6, 2, "Source port: %d", pntohs(pd+offset2+6)); break; } case 2: { rsvp_template_ipv6 *tem = (rsvp_template_ipv6 *)obj; - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: 2 - IPv6"); - proto_tree_add_item(rsvp_object_tree, offset2, 16, + proto_tree_add_text(rsvp_object_tree, offset2, 16, "Source address: %s", ip6_to_str(&(tem->source))); - proto_tree_add_item(rsvp_object_tree, offset2+18, 2, + proto_tree_add_text(rsvp_object_tree, offset2+18, 2, "Source port: %d", pntohs(pd+offset2+18)); break; } default: { - proto_tree_add_item(rsvp_object_tree, offset+3, 1, + proto_tree_add_text(rsvp_object_tree, offset+3, 1, "C-type: Unknown (%d)", obj->type); i = obj_length - sizeof(rsvp_object); - proto_tree_add_item(rsvp_object_tree, offset2, i, + proto_tree_add_text(rsvp_object_tree, offset2, i, "Data (%d bytes)", i); } } @@ -569,59 +566,58 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) case RSVP_CLASS_SENDER_TSPEC : { IS_tspec *tspec = (IS_tspec *)obj; - proto_item_add_subtree(ti, rsvp_object_tree, - ETT_RSVP_SENDER_TSPEC); - proto_tree_add_item(rsvp_object_tree, offset, 2, "Length: %d", + rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_SENDER_TSPEC); + proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", obj_length); - proto_tree_add_item(rsvp_object_tree, offset+2, 1, + proto_tree_add_text(rsvp_object_tree, offset+2, 1, "Class number: %d - %s", obj->class, object_type); - proto_tree_add_item(rsvp_object_tree, offset2, 1, + proto_tree_add_text(rsvp_object_tree, offset2, 1, "Message format version: %d", tspec->version>>4); - proto_tree_add_item(rsvp_object_tree, offset2+2, 2, + proto_tree_add_text(rsvp_object_tree, offset2+2, 2, "Data length: %d words, not including header", pntohs(pd+offset2+2)); - proto_tree_add_item(rsvp_object_tree, offset2+4, 1, + proto_tree_add_text(rsvp_object_tree, offset2+4, 1, "Service header: %d - %s", tspec->service_header, tspec->service_header==1 ? "Default/global information (INTSRV_GENERAL)" : "Unknown"); - proto_tree_add_item(rsvp_object_tree, offset2+6, 2, + proto_tree_add_text(rsvp_object_tree, offset2+6, 2, "Length of service %d data: %d words, " "not including header", tspec->service_header, pntohs(pd+offset2+6)>>12); /* Token bucket TSPEC */ - proto_tree_add_item(rsvp_object_tree, offset2+8, 1, + proto_tree_add_text(rsvp_object_tree, offset2+8, 1, "Parameter ID: %d - %s", tspec->param_id, tspec->param_id==127 ? "Token Bucket TSpec" : "Unknown"); - proto_tree_add_item(rsvp_object_tree, offset2+9, 1, + proto_tree_add_text(rsvp_object_tree, offset2+9, 1, "Parameter %d flags: %d", tspec->param_id, tspec->flags_tspec); - proto_tree_add_item(rsvp_object_tree, offset2+10, 2, + proto_tree_add_text(rsvp_object_tree, offset2+10, 2, "Length of parameter %d data: %d words, " "not including header", tspec->param_id, pntohs(pd+offset2+10)); - proto_tree_add_item(rsvp_object_tree, offset2+12, 4, + proto_tree_add_text(rsvp_object_tree, offset2+12, 4, "Token bucket rate: %ld", ieee_to_long(pd+offset2+12)); - proto_tree_add_item(rsvp_object_tree, offset2+16, 4, + proto_tree_add_text(rsvp_object_tree, offset2+16, 4, "Token bucket size: %ld", ieee_to_long(pd+offset2+16)); - proto_tree_add_item(rsvp_object_tree, offset2+20, 4, + proto_tree_add_text(rsvp_object_tree, offset2+20, 4, "Peak data rate: %ld", ieee_to_long(pd+offset2+20)); - proto_tree_add_item(rsvp_object_tree, offset2+24, 4, + proto_tree_add_text(rsvp_object_tree, offset2+24, 4, "Minimum policed unit: %d", pntohl(pd+offset2+24)); - proto_tree_add_item(rsvp_object_tree, offset2+28, 4, + proto_tree_add_text(rsvp_object_tree, offset2+28, 4, "Maximum policed unit: %d", pntohl(pd+offset2+28)); @@ -633,54 +629,53 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) char *qos_str = match_strval(flowspec->service_header, qos_vals); char *is_param_str = match_strval(flowspec->param_id, svc_vals); - proto_item_add_subtree(ti, rsvp_object_tree, - ETT_RSVP_FLOWSPEC); - proto_tree_add_item(rsvp_object_tree, offset, 2, "Length: %d", + rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_FLOWSPEC); + proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", obj_length); - proto_tree_add_item(rsvp_object_tree, offset+2, 1, + proto_tree_add_text(rsvp_object_tree, offset+2, 1, "Class number: %d - %s", obj->class, object_type); if (!qos_str) qos_str = "Unknown"; if (!is_param_str) is_param_str="Unknown"; - proto_tree_add_item(rsvp_object_tree, offset2, 1, + proto_tree_add_text(rsvp_object_tree, offset2, 1, "Message format version: %d", flowspec->version>>4); - proto_tree_add_item(rsvp_object_tree, offset2+2, 2, + proto_tree_add_text(rsvp_object_tree, offset2+2, 2, "Data length: %d words, not including header", pntohs(pd+offset2+2)); - proto_tree_add_item(rsvp_object_tree, offset2+4, 1, + proto_tree_add_text(rsvp_object_tree, offset2+4, 1, "Service header: %d - %s", flowspec->service_header, qos_str); - proto_tree_add_item(rsvp_object_tree, offset2+6, 2, + proto_tree_add_text(rsvp_object_tree, offset2+6, 2, "Length of service %d data: %d words, " "not including header", flowspec->service_header, pntohs(pd+offset2+6)>>12); - proto_tree_add_item(rsvp_object_tree, offset2+8, 1, + proto_tree_add_text(rsvp_object_tree, offset2+8, 1, "Parameter ID: %d - %s", flowspec->param_id, is_param_str); - proto_tree_add_item(rsvp_object_tree, offset2+9, 1, + proto_tree_add_text(rsvp_object_tree, offset2+9, 1, "Parameter %d flags: %d", flowspec->param_id, flowspec->flags_tspec); - proto_tree_add_item(rsvp_object_tree, offset2+10, 2, + proto_tree_add_text(rsvp_object_tree, offset2+10, 2, "Length of parameter %d data: %d words, " "not including header", flowspec->param_id, pntohs(pd+offset2+10)); - proto_tree_add_item(rsvp_object_tree, offset2+12, 4, + proto_tree_add_text(rsvp_object_tree, offset2+12, 4, "Token bucket rate: %ld", ieee_to_long(pd+offset2+12)); - proto_tree_add_item(rsvp_object_tree, offset2+16, 4, + proto_tree_add_text(rsvp_object_tree, offset2+16, 4, "Token bucket size: %ld", ieee_to_long(pd+offset2+16)); - proto_tree_add_item(rsvp_object_tree, offset2+20, 4, + proto_tree_add_text(rsvp_object_tree, offset2+20, 4, "Peak data rate: %ld", ieee_to_long(pd+offset2+20)); - proto_tree_add_item(rsvp_object_tree, offset2+24, 4, + proto_tree_add_text(rsvp_object_tree, offset2+24, 4, "Minimum policed unit: %d", pntohl(pd+offset2+24)); - proto_tree_add_item(rsvp_object_tree, offset2+28, 4, + proto_tree_add_text(rsvp_object_tree, offset2+28, 4, "Maximum policed unit: %d", pntohl(pd+offset2+28)); if (flowspec->service_header!=QOS_GUARANTEED) @@ -689,21 +684,21 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) /* Guaranteed-rate RSpec */ is_param_str = match_strval(flowspec->param_id_rspec, svc_vals); if (!is_param_str) is_param_str="Unknown"; - proto_tree_add_item(rsvp_object_tree, offset2+32, 1, + proto_tree_add_text(rsvp_object_tree, offset2+32, 1, "Parameter ID: %d - %s", flowspec->param_id, is_param_str); - proto_tree_add_item(rsvp_object_tree, offset2+33, 1, + proto_tree_add_text(rsvp_object_tree, offset2+33, 1, "Parameter %d flags: %d", flowspec->param_id, flowspec->flags_rspec); - proto_tree_add_item(rsvp_object_tree, offset2+34, 2, + proto_tree_add_text(rsvp_object_tree, offset2+34, 2, "Length of parameter %d data: %d words, " "not including header", flowspec->param_id, pntohs(pd+offset2+34)); - proto_tree_add_item(rsvp_object_tree, offset2+36, 4, + proto_tree_add_text(rsvp_object_tree, offset2+36, 4, "Rate: %ld", ieee_to_long(pd+offset2+36)); - proto_tree_add_item(rsvp_object_tree, offset2+40, 4, + proto_tree_add_text(rsvp_object_tree, offset2+40, 4, "Slack term: %d", pntohl(pd+offset2+40)); @@ -719,17 +714,17 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) int tree_num; mylen = obj_length; - proto_item_add_subtree(ti, rsvp_object_tree, ETT_RSVP_ADSPEC); - proto_tree_add_item(rsvp_object_tree, offset, 2, "Length: %d", + rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_ADSPEC); + proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", obj_length); - proto_tree_add_item(rsvp_object_tree, offset+2, 1, + proto_tree_add_text(rsvp_object_tree, offset+2, 1, "Class number: %d - %s", obj->class, object_type); - proto_tree_add_item(rsvp_object_tree, offset2, 1, + proto_tree_add_text(rsvp_object_tree, offset2, 1, "Message format version: %d", (*((unsigned char *)pd+offset2))>>4); - proto_tree_add_item(rsvp_object_tree, offset2+2, 2, + proto_tree_add_text(rsvp_object_tree, offset2+2, 2, "Data length: %d words, not including header", pntohs(pd+offset2+2)); offset2+=4; @@ -739,18 +734,17 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) shdr = (service_hdr *)(pd + offset2); str = match_strval(shdr->service_num, adspec_services); - ti = proto_tree_add_item(rsvp_object_tree, offset2, + ti = proto_tree_add_text(rsvp_object_tree, offset2, (pntohs(&shdr->length)+1)<<2, str?str:"Unknown"); - adspec_tree = proto_tree_new(); - proto_item_add_subtree(ti, adspec_tree, tree_num++); - proto_tree_add_item(adspec_tree, offset2, 1, + adspec_tree = proto_item_add_subtree(ti, tree_num++); + proto_tree_add_text(adspec_tree, offset2, 1, "Service header %d - %s", shdr->service_num, str); - proto_tree_add_item(adspec_tree, offset2+1, 1, + proto_tree_add_text(adspec_tree, offset2+1, 1, (shdr->break_bit&0x80)? "Break bit set":"Break bit not set"); - proto_tree_add_item(adspec_tree, offset2+2, 2, + proto_tree_add_text(adspec_tree, offset2+2, 2, "Data length: %d words, not including header", pntohs(&shdr->length)); offset2+=4; i=(pntohs(&shdr->length)+1)<<2; mylen-=4; @@ -767,7 +761,7 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) case 135: case 136: /* 32-bit unsigned integer */ - proto_tree_add_item(adspec_tree, offset2, + proto_tree_add_text(adspec_tree, offset2, (pntohs(&phdr->length)+1)<<2, "%s - %lu (type %d, length %d)", str, @@ -777,7 +771,7 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) case 6: /* IEEE float */ - proto_tree_add_item(adspec_tree, offset2, + proto_tree_add_text(adspec_tree, offset2, (pntohs(&phdr->length)+1)<<2, "%s - %lu (type %d, length %d)", str, @@ -785,14 +779,14 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) phdr->id, pntohs(&phdr->length)); break; default: - proto_tree_add_item(adspec_tree, offset2, + proto_tree_add_text(adspec_tree, offset2, (pntohs(&phdr->length)+1)<<2, "%s (type %d, length %d)", str, phdr->id, pntohs(&phdr->length)); } } else { - proto_tree_add_item(adspec_tree, offset2, + proto_tree_add_text(adspec_tree, offset2, (pntohs(&phdr->length)+1)<<2, "Unknown (type %d, length %d)", phdr->id, pntohs(&phdr->length)); @@ -806,33 +800,33 @@ dissect_rsvp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) } case RSVP_CLASS_INTEGRITY : - proto_item_add_subtree(ti, rsvp_object_tree, ETT_RSVP_INTEGRITY); - proto_tree_add_item(rsvp_object_tree, offset, 2, "Length: %d", + rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_INTEGRITY); + proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", obj_length); - proto_tree_add_item(rsvp_object_tree, offset+2, 1, + proto_tree_add_text(rsvp_object_tree, offset+2, 1, "Class number: %d - %s", obj->class, object_type); goto default_class; case RSVP_CLASS_POLICY : - proto_item_add_subtree(ti, rsvp_object_tree, ETT_RSVP_POLICY); - proto_tree_add_item(rsvp_object_tree, offset, 2, "Length: %d", + rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_POLICY); + proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", obj_length); - proto_tree_add_item(rsvp_object_tree, offset+2, 1, + proto_tree_add_text(rsvp_object_tree, offset+2, 1, "Class number: %d - %s", obj->class, object_type); goto default_class; default : - proto_item_add_subtree(ti, rsvp_object_tree, ETT_RSVP_UNKNOWN_CLASS); - proto_tree_add_item(rsvp_object_tree, offset, 2, "Length: %d", + rsvp_object_tree = proto_item_add_subtree(ti, ETT_RSVP_UNKNOWN_CLASS); + proto_tree_add_text(rsvp_object_tree, offset, 2, "Length: %d", obj_length); - proto_tree_add_item(rsvp_object_tree, offset+2, 1, + proto_tree_add_text(rsvp_object_tree, offset+2, 1, "Class number: %d - %s", obj->class, object_type); default_class: i = obj_length - sizeof(rsvp_object); - proto_tree_add_item(rsvp_object_tree, offset2, i, + proto_tree_add_text(rsvp_object_tree, offset2, i, "Data (%d bytes)", i); break; diff --git a/packet-rtsp.c b/packet-rtsp.c index 785d17b39a..350286306a 100644 --- a/packet-rtsp.c +++ b/packet-rtsp.c @@ -4,7 +4,7 @@ * Jason Lango * Liberally copied from packet-http.c, by Guy Harris * - * $Id: packet-rtsp.c,v 1.1 1999/07/07 00:34:56 guy Exp $ + * $Id: packet-rtsp.c,v 1.2 1999/07/07 22:51:53 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -104,10 +104,9 @@ void dissect_rtsp(const u_char *pd, int offset, frame_data *fd, rtsp_tree = NULL; if (tree) { - ti = proto_tree_add_item(tree, offset, END_OF_FRAME, + ti = proto_tree_add_text(tree, offset, END_OF_FRAME, "Real Time Streaming Protocol"); - rtsp_tree = proto_tree_new(); - proto_item_add_subtree(ti, rtsp_tree, ETT_RTSP); + rtsp_tree = proto_item_add_subtree(ti, ETT_RTSP); } while (data < dataend) { @@ -195,7 +194,7 @@ void dissect_rtsp(const u_char *pd, int offset, frame_data *fd, * Put this line. */ if (rtsp_tree) { - proto_tree_add_item(rtsp_tree, offset, linelen, "%s", + proto_tree_add_text(rtsp_tree, offset, linelen, "%s", format_text(data, linelen)); } offset += linelen; @@ -208,7 +207,7 @@ void dissect_rtsp(const u_char *pd, int offset, frame_data *fd, col_add_str(fd, COL_PROTOCOL, "RTSP/SDP"); } else if (rtsp_tree && data < dataend) { - proto_tree_add_item(rtsp_tree, offset, END_OF_FRAME, + proto_tree_add_text(rtsp_tree, offset, END_OF_FRAME, "Data (%d bytes)", END_OF_FRAME); } } diff --git a/packet-sdp.c b/packet-sdp.c index 25f5f28a83..c81554b712 100644 --- a/packet-sdp.c +++ b/packet-sdp.c @@ -4,7 +4,7 @@ * Jason Lango * Liberally copied from packet-http.c, by Guy Harris * - * $Id: packet-sdp.c,v 1.1 1999/07/07 00:34:56 guy Exp $ + * $Id: packet-sdp.c,v 1.2 1999/07/07 22:51:53 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -68,10 +68,9 @@ void dissect_sdp(const u_char *pd, int offset, frame_data *fd, if (!tree) return; - ti = proto_tree_add_item(tree, offset, END_OF_FRAME, + ti = proto_tree_add_text(tree, offset, END_OF_FRAME, "Session Description Protocol"); - sdp_tree = proto_tree_new(); - proto_item_add_subtree(ti, sdp_tree, ETT_SDP); + sdp_tree = proto_item_add_subtree(ti, ETT_SDP); section = 0; for (; data < dataend; offset += linelen, data = lineend) { @@ -89,7 +88,7 @@ void dissect_sdp(const u_char *pd, int offset, frame_data *fd, type = data[0]; if (data[1] != '=') { - proto_tree_add_item(sdp_tree, offset, linelen, + proto_tree_add_text(sdp_tree, offset, linelen, "Invalid line: %s", format_text(data, linelen)); continue; @@ -164,13 +163,13 @@ void dissect_sdp(const u_char *pd, int offset, frame_data *fd, break; } - proto_tree_add_item(sdp_tree, offset, linelen, + proto_tree_add_text(sdp_tree, offset, linelen, "%s (%c): %s", typename, type, format_text(value, valuelen)); } if (data < dataend) { - proto_tree_add_item(sdp_tree, offset, END_OF_FRAME, + proto_tree_add_text(sdp_tree, offset, END_OF_FRAME, "Data (%d bytes)", END_OF_FRAME); } } diff --git a/packet-smb.c b/packet-smb.c index 5edeaa6958..9ae2b4d39c 100644 --- a/packet-smb.c +++ b/packet-smb.c @@ -2,7 +2,7 @@ * Routines for smb packet dissection * Copyright 1999, Richard Sharpe * - * $Id: packet-smb.c,v 1.14 1999/07/01 04:04:36 sharpe Exp $ + * $Id: packet-smb.c,v 1.15 1999/07/07 22:51:53 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -316,7 +316,7 @@ dissect_unknown_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, END_OF_FRAME, "Data (%u bytes)", + proto_tree_add_text(tree, offset, END_OF_FRAME, "Data (%u bytes)", END_OF_FRAME); } @@ -421,7 +421,7 @@ dissect_treecon_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 1, "Word Count (WCT): %u", WordCount); + proto_tree_add_text(tree, offset, 1, "Word Count (WCT): %u", WordCount); } @@ -433,7 +433,7 @@ dissect_treecon_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); + proto_tree_add_text(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); } @@ -445,7 +445,7 @@ dissect_treecon_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 1, "BufferFormat1: %u", BufferFormat1); + proto_tree_add_text(tree, offset, 1, "BufferFormat1: %u", BufferFormat1); } @@ -457,7 +457,7 @@ dissect_treecon_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, strlen(SharePath) + 1, "Share Path: %s", SharePath); + proto_tree_add_text(tree, offset, strlen(SharePath) + 1, "Share Path: %s", SharePath); } @@ -469,7 +469,7 @@ dissect_treecon_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 1, "BufferFormat2: %u", BufferFormat2); + proto_tree_add_text(tree, offset, 1, "BufferFormat2: %u", BufferFormat2); } @@ -481,7 +481,7 @@ dissect_treecon_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, strlen(Password) + 1, "Password: %s", Password); + proto_tree_add_text(tree, offset, strlen(Password) + 1, "Password: %s", Password); } @@ -493,7 +493,7 @@ dissect_treecon_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 1, "BufferFormat3: %u", BufferFormat3); + proto_tree_add_text(tree, offset, 1, "BufferFormat3: %u", BufferFormat3); } @@ -505,7 +505,7 @@ dissect_treecon_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, strlen(Service) + 1, "Service: %s", Service); + proto_tree_add_text(tree, offset, strlen(Service) + 1, "Service: %s", Service); } @@ -521,7 +521,7 @@ dissect_treecon_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 1, "Word Count (WCT): %u", WordCount); + proto_tree_add_text(tree, offset, 1, "Word Count (WCT): %u", WordCount); } @@ -533,7 +533,7 @@ dissect_treecon_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Max Buffer Size: %u", MaxBufferSize); + proto_tree_add_text(tree, offset, 2, "Max Buffer Size: %u", MaxBufferSize); } @@ -545,7 +545,7 @@ dissect_treecon_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "TID: %u", TID); + proto_tree_add_text(tree, offset, 2, "TID: %u", TID); } @@ -557,7 +557,7 @@ dissect_treecon_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); + proto_tree_add_text(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); } @@ -611,7 +611,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 1, "Word Count (WCT): %u", WordCount); + proto_tree_add_text(tree, offset, 1, "Word Count (WCT): %u", WordCount); } @@ -623,7 +623,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 1, "AndXCommand: %u", AndXCommand); + proto_tree_add_text(tree, offset, 1, "AndXCommand: %u", AndXCommand); } @@ -635,7 +635,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 1, "AndXReserved: %u", AndXReserved); + proto_tree_add_text(tree, offset, 1, "AndXReserved: %u", AndXReserved); } @@ -647,7 +647,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 2, "AndXOffset: %u", AndXOffset); + proto_tree_add_text(tree, offset, 2, "AndXOffset: %u", AndXOffset); } @@ -659,7 +659,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 2, "MaxBufferSize: %u", MaxBufferSize); + proto_tree_add_text(tree, offset, 2, "MaxBufferSize: %u", MaxBufferSize); } @@ -671,7 +671,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 2, "MaxMpxCount: %u", MaxMpxCount); + proto_tree_add_text(tree, offset, 2, "MaxMpxCount: %u", MaxMpxCount); } @@ -683,7 +683,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 2, "VcNumber: %u", VcNumber); + proto_tree_add_text(tree, offset, 2, "VcNumber: %u", VcNumber); } @@ -695,7 +695,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 4, "SessionKey: %u", SessionKey); + proto_tree_add_text(tree, offset, 4, "SessionKey: %u", SessionKey); } @@ -707,7 +707,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 2, "PasswordLen: %u", PasswordLen); + proto_tree_add_text(tree, offset, 2, "PasswordLen: %u", PasswordLen); } @@ -719,7 +719,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 4, "Reserved: %u", Reserved); + proto_tree_add_text(tree, offset, 4, "Reserved: %u", Reserved); } @@ -731,7 +731,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); + proto_tree_add_text(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); } @@ -743,7 +743,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, strlen(AccountName) + 1, "AccountName: %s", AccountName); + proto_tree_add_text(tree, offset, strlen(AccountName) + 1, "AccountName: %s", AccountName); } @@ -755,7 +755,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, strlen(PrimaryDomain) + 1, "PrimaryDomain: %s", PrimaryDomain); + proto_tree_add_text(tree, offset, strlen(PrimaryDomain) + 1, "PrimaryDomain: %s", PrimaryDomain); } @@ -767,7 +767,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, strlen(NativeOS) + 1, "NativeOS: %s", NativeOS); + proto_tree_add_text(tree, offset, strlen(NativeOS) + 1, "NativeOS: %s", NativeOS); } @@ -783,7 +783,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 1, "Word Count (WCT): %u", WordCount); + proto_tree_add_text(tree, offset, 1, "Word Count (WCT): %u", WordCount); } @@ -795,7 +795,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 1, "AndXCommand: %u", AndXCommand); + proto_tree_add_text(tree, offset, 1, "AndXCommand: %u", AndXCommand); } @@ -807,7 +807,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 1, "AndXReserved: %u", AndXReserved); + proto_tree_add_text(tree, offset, 1, "AndXReserved: %u", AndXReserved); } @@ -819,7 +819,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 2, "AndXOffset: %u", AndXOffset); + proto_tree_add_text(tree, offset, 2, "AndXOffset: %u", AndXOffset); } @@ -831,7 +831,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 2, "MaxBufferSize: %u", MaxBufferSize); + proto_tree_add_text(tree, offset, 2, "MaxBufferSize: %u", MaxBufferSize); } @@ -843,7 +843,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 2, "MaxMpxCount: %u", MaxMpxCount); + proto_tree_add_text(tree, offset, 2, "MaxMpxCount: %u", MaxMpxCount); } @@ -855,7 +855,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 2, "VcNumber: %u", VcNumber); + proto_tree_add_text(tree, offset, 2, "VcNumber: %u", VcNumber); } @@ -867,7 +867,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 4, "SessionKey: %u", SessionKey); + proto_tree_add_text(tree, offset, 4, "SessionKey: %u", SessionKey); } @@ -879,7 +879,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 2, "ANSI Account Password Length: %u", ANSIAccountPasswordLength); + proto_tree_add_text(tree, offset, 2, "ANSI Account Password Length: %u", ANSIAccountPasswordLength); } @@ -891,7 +891,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 2, "UNICODE Account Password Length: %u", UNICODEAccountPasswordLength); + proto_tree_add_text(tree, offset, 2, "UNICODE Account Password Length: %u", UNICODEAccountPasswordLength); } @@ -903,7 +903,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 4, "Reserved: %u", Reserved); + proto_tree_add_text(tree, offset, 4, "Reserved: %u", Reserved); } @@ -915,36 +915,35 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - ti = proto_tree_add_item(tree, offset, 4, "Capabilities: 0x%04x", Capabilities); - Capabilities_tree = proto_tree_new(); - proto_item_add_subtree(ti, Capabilities_tree, ETT_SMB_CAPABILITIES); - proto_tree_add_item(Capabilities_tree, offset, 4, "%s", + ti = proto_tree_add_text(tree, offset, 4, "Capabilities: 0x%04x", Capabilities); + Capabilities_tree = proto_item_add_subtree(ti, ETT_SMB_CAPABILITIES); + proto_tree_add_text(Capabilities_tree, offset, 4, "%s", decode_boolean_bitfield(Capabilities, 0x0001, 32, " Raw Mode supported", " Raw Mode not supported")); - proto_tree_add_item(Capabilities_tree, offset, 4, "%s", + proto_tree_add_text(Capabilities_tree, offset, 4, "%s", decode_boolean_bitfield(Capabilities, 0x0002, 32, " Raw Mode supported", " MPX Mode not supported")); - proto_tree_add_item(Capabilities_tree, offset, 4, "%s", + proto_tree_add_text(Capabilities_tree, offset, 4, "%s", decode_boolean_bitfield(Capabilities, 0x0004, 32," Unicode supported", " Unicode not supported")); - proto_tree_add_item(Capabilities_tree, offset, 4, "%s", + proto_tree_add_text(Capabilities_tree, offset, 4, "%s", decode_boolean_bitfield(Capabilities, 0x0008, 32, " Large Files supported", " Large Files not supported")); - proto_tree_add_item(Capabilities_tree, offset, 4, "%s", + proto_tree_add_text(Capabilities_tree, offset, 4, "%s", decode_boolean_bitfield(Capabilities, 0x0010, 32, " NT LM 0.12 SMBs supported", " NT LM 0.12 SMBs not supported")); - proto_tree_add_item(Capabilities_tree, offset, 4, "%s", + proto_tree_add_text(Capabilities_tree, offset, 4, "%s", decode_boolean_bitfield(Capabilities, 0x0020, 32, " RPC Remote APIs supported", " RPC Remote APIs not supported")); - proto_tree_add_item(Capabilities_tree, offset, 4, "%s", + proto_tree_add_text(Capabilities_tree, offset, 4, "%s", decode_boolean_bitfield(Capabilities, 0x0040, 32, " NT Status Codes supported", " NT Status Codes not supported")); - proto_tree_add_item(Capabilities_tree, offset, 4, "%s", + proto_tree_add_text(Capabilities_tree, offset, 4, "%s", decode_boolean_bitfield(Capabilities, 0x0080, 32, " Level 2 OpLocks supported", " Level 2 OpLocks not supported")); - proto_tree_add_item(Capabilities_tree, offset, 4, "%s", + proto_tree_add_text(Capabilities_tree, offset, 4, "%s", decode_boolean_bitfield(Capabilities, 0x0100, 32, " Lock&Read supported", " Lock&Read not supported")); - proto_tree_add_item(Capabilities_tree, offset, 4, "%s", + proto_tree_add_text(Capabilities_tree, offset, 4, "%s", decode_boolean_bitfield(Capabilities, 0x0200, 32, " NT Find supported", " NT Find not supported")); - proto_tree_add_item(Capabilities_tree, offset, 4, "%s", + proto_tree_add_text(Capabilities_tree, offset, 4, "%s", decode_boolean_bitfield(Capabilities, 0x1000, 32, " DFS supported", " DFS not supported")); - proto_tree_add_item(Capabilities_tree, offset, 4, "%s", + proto_tree_add_text(Capabilities_tree, offset, 4, "%s", decode_boolean_bitfield(Capabilities, 0x4000, 32, " Large READX supported", " Large READX not supported")); - proto_tree_add_item(Capabilities_tree, offset, 4, "%s", + proto_tree_add_text(Capabilities_tree, offset, 4, "%s", decode_boolean_bitfield(Capabilities, 0x8000, 32, " Large WRITEX supported", " Large WRITEX not supported")); - proto_tree_add_item(Capabilities_tree, offset, 4, "%s", + proto_tree_add_text(Capabilities_tree, offset, 4, "%s", decode_boolean_bitfield(Capabilities, 0x80000000, 32, " Extended Security Exchanges supported", " Extended Security Exchanges not supported")); } @@ -957,7 +956,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count: %u", ByteCount); + proto_tree_add_text(tree, offset, 2, "Byte Count: %u", ByteCount); } @@ -969,7 +968,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, strlen(ANSIPassword) + 1, "ANSI Password: %s", ANSIPassword); + proto_tree_add_text(tree, offset, strlen(ANSIPassword) + 1, "ANSI Password: %s", ANSIPassword); } @@ -983,7 +982,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, strlen(UNICODEPassword) + 1, "UNICODE Password: %s", UNICODEPassword); + proto_tree_add_text(tree, offset, strlen(UNICODEPassword) + 1, "UNICODE Password: %s", UNICODEPassword); } @@ -997,7 +996,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, strlen(AccountName) + 1, "Account Name: %s", AccountName); + proto_tree_add_text(tree, offset, strlen(AccountName) + 1, "Account Name: %s", AccountName); } @@ -1009,7 +1008,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, strlen(PrimaryDomain) + 1, "Primary Domain: %s", PrimaryDomain); + proto_tree_add_text(tree, offset, strlen(PrimaryDomain) + 1, "Primary Domain: %s", PrimaryDomain); } @@ -1021,7 +1020,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, strlen(NativeOS) + 1, "Native OS: %s", NativeOS); + proto_tree_add_text(tree, offset, strlen(NativeOS) + 1, "Native OS: %s", NativeOS); } @@ -1033,7 +1032,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, strlen(NativeLanManType) + 1, "Native LanMan Type: %s", NativeLanManType); + proto_tree_add_text(tree, offset, strlen(NativeLanManType) + 1, "Native LanMan Type: %s", NativeLanManType); } @@ -1060,7 +1059,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 1, "Word Count (WCT): %u", WordCount); + proto_tree_add_text(tree, offset, 1, "Word Count (WCT): %u", WordCount); } @@ -1072,7 +1071,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 1, "AndXCommand: %u", AndXCommand); + proto_tree_add_text(tree, offset, 1, "AndXCommand: %u", AndXCommand); } @@ -1084,7 +1083,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 1, "AndXReserved: %u", AndXReserved); + proto_tree_add_text(tree, offset, 1, "AndXReserved: %u", AndXReserved); } @@ -1096,7 +1095,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 2, "AndXOffset: %u", AndXOffset); + proto_tree_add_text(tree, offset, 2, "AndXOffset: %u", AndXOffset); } @@ -1108,7 +1107,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 2, "Action: %u", Action); + proto_tree_add_text(tree, offset, 2, "Action: %u", Action); } @@ -1120,7 +1119,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); + proto_tree_add_text(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); } @@ -1132,7 +1131,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, strlen(NativeOS) + 1, "NativeOS: %s", NativeOS); + proto_tree_add_text(tree, offset, strlen(NativeOS) + 1, "NativeOS: %s", NativeOS); } @@ -1144,7 +1143,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, strlen(NativeLanMan) + 1, "NativeLanMan: %s", NativeLanMan); + proto_tree_add_text(tree, offset, strlen(NativeLanMan) + 1, "NativeLanMan: %s", NativeLanMan); } @@ -1156,7 +1155,7 @@ dissect_ssetup_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree if (tree) { - proto_tree_add_item(tree, offset, strlen(PrimaryDomain) + 1, "PrimaryDomain: %s", PrimaryDomain); + proto_tree_add_text(tree, offset, strlen(PrimaryDomain) + 1, "PrimaryDomain: %s", PrimaryDomain); } @@ -1194,9 +1193,9 @@ dissect_tcon_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 1, "Invalid TCON_ANDX format. WCT should be 2, 3, or 4 ..., not %u", wct); + proto_tree_add_text(tree, offset, 1, "Invalid TCON_ANDX format. WCT should be 2, 3, or 4 ..., not %u", wct); - proto_tree_add_item(tree, offset, END_OF_FRAME, "Data"); + proto_tree_add_text(tree, offset, END_OF_FRAME, "Data"); return; @@ -1206,7 +1205,7 @@ dissect_tcon_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 1, "Word Count (WCT): %u", wct); + proto_tree_add_text(tree, offset, 1, "Word Count (WCT): %u", wct); } @@ -1216,11 +1215,11 @@ dissect_tcon_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 1, "Next Command: %s", + proto_tree_add_text(tree, offset, 1, "Next Command: %s", (andxcmd == 0xFF) ? "No further commands": decode_smb_name(andxcmd)); - proto_tree_add_item(tree, offset + 1, 1, "Reserved (MBZ): %u", pd[offset+1]); + proto_tree_add_text(tree, offset + 1, 1, "Reserved (MBZ): %u", pd[offset+1]); } @@ -1230,7 +1229,7 @@ dissect_tcon_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 2, "Offset to next command: %u", andxoffs); + proto_tree_add_text(tree, offset, 2, "Offset to next command: %u", andxoffs); } @@ -1244,10 +1243,9 @@ dissect_tcon_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - ti = proto_tree_add_item(tree, offset, 2, "Additional Flags: 0x%02x", flags); - flags_tree = proto_tree_new(); - proto_item_add_subtree(ti, flags_tree, ETT_SMB_AFLAGS); - proto_tree_add_item(flags_tree, offset, 2, "%s", + ti = proto_tree_add_text(tree, offset, 2, "Additional Flags: 0x%02x", flags); + flags_tree = proto_item_add_subtree(ti, ETT_SMB_AFLAGS); + proto_tree_add_text(flags_tree, offset, 2, "%s", decode_boolean_bitfield(flags, 0x01, 16, "Disconnect TID", "Don't disconnect TID")); @@ -1260,7 +1258,7 @@ dissect_tcon_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 2, "Password Length: %u", passwdlen); + proto_tree_add_text(tree, offset, 2, "Password Length: %u", passwdlen); } @@ -1270,7 +1268,7 @@ dissect_tcon_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count (BCC): %u", bcc); + proto_tree_add_text(tree, offset, 2, "Byte Count (BCC): %u", bcc); } @@ -1280,7 +1278,7 @@ dissect_tcon_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, strlen(str) + 1, "Password: %s", str); + proto_tree_add_text(tree, offset, strlen(str) + 1, "Password: %s", str); } @@ -1290,7 +1288,7 @@ dissect_tcon_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, strlen(str) + 1, "Path: %s", str); + proto_tree_add_text(tree, offset, strlen(str) + 1, "Path: %s", str); } @@ -1300,7 +1298,7 @@ dissect_tcon_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, strlen(str) + 1, "Service: %s", str); + proto_tree_add_text(tree, offset, strlen(str) + 1, "Service: %s", str); } @@ -1314,7 +1312,7 @@ dissect_tcon_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count (BCC): %u", bcc); + proto_tree_add_text(tree, offset, 2, "Byte Count (BCC): %u", bcc); } @@ -1324,7 +1322,7 @@ dissect_tcon_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, strlen(str) + 1, "Service Type: %s", + proto_tree_add_text(tree, offset, strlen(str) + 1, "Service Type: %s", str); } @@ -1339,7 +1337,7 @@ dissect_tcon_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { /* Should break out the bits */ - proto_tree_add_item(tree, offset, 2, "Optional Support: 0x%04x", + proto_tree_add_text(tree, offset, 2, "Optional Support: 0x%04x", optionsup); } @@ -1350,7 +1348,7 @@ dissect_tcon_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count (BCC): %u", bcc); + proto_tree_add_text(tree, offset, 2, "Byte Count (BCC): %u", bcc); } @@ -1360,7 +1358,7 @@ dissect_tcon_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, strlen(str) + 1, "Service: %s", str); + proto_tree_add_text(tree, offset, strlen(str) + 1, "Service: %s", str); } @@ -1370,7 +1368,7 @@ dissect_tcon_andx_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, strlen(str) + 1, "Native File System: %s", str); + proto_tree_add_text(tree, offset, strlen(str) + 1, "Native File System: %s", str); } @@ -1407,9 +1405,9 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr !((wct == 13) && (dirn == 0)) && !((wct == 17) && (dirn == 0))) { if (tree) { - proto_tree_add_item(tree, offset, 1, "Invalid Negotiate Protocol format. WCT should be zero or 1 or 13 or 17 ..., not %u", wct); + proto_tree_add_text(tree, offset, 1, "Invalid Negotiate Protocol format. WCT should be zero or 1 or 13 or 17 ..., not %u", wct); - proto_tree_add_item(tree, offset, END_OF_FRAME, "Data"); + proto_tree_add_text(tree, offset, END_OF_FRAME, "Data"); return; } @@ -1417,7 +1415,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 1, "Word Count (WCT): %d", wct); + proto_tree_add_text(tree, offset, 1, "Word Count (WCT): %d", wct); } @@ -1433,7 +1431,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count (BCC): %u", bcc); + proto_tree_add_text(tree, offset, 2, "Byte Count (BCC): %u", bcc); } @@ -1441,9 +1439,8 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - ti = proto_tree_add_item(tree, offset, END_OF_FRAME, "Dialects"); - dialects = proto_tree_new(); - proto_item_add_subtree(ti, dialects, ETT_SMB_DIALECTS); + ti = proto_tree_add_text(tree, offset, END_OF_FRAME, "Dialects"); + dialects = proto_item_add_subtree(ti, ETT_SMB_DIALECTS); } @@ -1452,7 +1449,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(dialects, offset, 1, "Dialect Marker: %d", pd[offset]); + proto_tree_add_text(dialects, offset, 1, "Dialect Marker: %d", pd[offset]); } @@ -1462,7 +1459,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(dialects, offset, strlen(str)+1, "Dialect: %s", str); + proto_tree_add_text(dialects, offset, strlen(str)+1, "Dialect: %s", str); } @@ -1479,12 +1476,12 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (dialect == 0xFFFF) { /* Server didn't like them dialects */ - proto_tree_add_item(tree, offset, 2, "Supplied dialects not recognized"); + proto_tree_add_text(tree, offset, 2, "Supplied dialects not recognized"); } else { - proto_tree_add_item(tree, offset, 2, "Dialect Index: %u, PC NETWORK PROTGRAM 1.0", dialect); + proto_tree_add_text(tree, offset, 2, "Dialect Index: %u, PC NETWORK PROTGRAM 1.0", dialect); } @@ -1496,7 +1493,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count (BCC): %u", bcc); + proto_tree_add_text(tree, offset, 2, "Byte Count (BCC): %u", bcc); } @@ -1506,7 +1503,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Dialect Index: %u, Greater than CORE PROTOCOL and up to LANMAN2.1", GSHORT(pd, offset)); + proto_tree_add_text(tree, offset, 2, "Dialect Index: %u, Greater than CORE PROTOCOL and up to LANMAN2.1", GSHORT(pd, offset)); } @@ -1518,14 +1515,13 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - ti = proto_tree_add_item(tree, offset, 2, "Security Mode: 0x%04x", mode); - mode_tree = proto_tree_new(); - proto_item_add_subtree(ti, mode_tree, ETT_SMB_MODE); - proto_tree_add_item(mode_tree, offset, 2, "%s", + ti = proto_tree_add_text(tree, offset, 2, "Security Mode: 0x%04x", mode); + mode_tree = proto_item_add_subtree(ti, ETT_SMB_MODE); + proto_tree_add_text(mode_tree, offset, 2, "%s", decode_boolean_bitfield(mode, 0x0001, 16, "Security = User", "Security = Share")); - proto_tree_add_item(mode_tree, offset, 2, "%s", + proto_tree_add_text(mode_tree, offset, 2, "%s", decode_boolean_bitfield(mode, 0x0002, 16, "Passwords = Encrypted", "Passwords = Plaintext")); @@ -1536,7 +1532,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Max buffer size: %u", GSHORT(pd, offset)); + proto_tree_add_text(tree, offset, 2, "Max buffer size: %u", GSHORT(pd, offset)); } @@ -1544,7 +1540,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Max multiplex count: %u", GSHORT(pd, offset)); + proto_tree_add_text(tree, offset, 2, "Max multiplex count: %u", GSHORT(pd, offset)); } @@ -1552,7 +1548,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Max vcs: %u", GSHORT(pd, offset)); + proto_tree_add_text(tree, offset, 2, "Max vcs: %u", GSHORT(pd, offset)); } @@ -1562,14 +1558,13 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - ti = proto_tree_add_item(tree, offset, 2, "Raw Mode: 0x%04x", rawmode); - rawmode_tree = proto_tree_new(); - proto_item_add_subtree(ti, rawmode_tree, ETT_SMB_RAWMODE); - proto_tree_add_item(rawmode_tree, offset, 2, "%s", + ti = proto_tree_add_text(tree, offset, 2, "Raw Mode: 0x%04x", rawmode); + rawmode_tree = proto_item_add_subtree(ti, ETT_SMB_RAWMODE); + proto_tree_add_text(rawmode_tree, offset, 2, "%s", decode_boolean_bitfield(rawmode, 0x01, 16, "Read Raw supported", "Read Raw not supported")); - proto_tree_add_item(rawmode_tree, offset, 2, "%s", + proto_tree_add_text(rawmode_tree, offset, 2, "%s", decode_boolean_bitfield(rawmode, 0x02, 16, "Write Raw supported", "Write Raw not supported")); @@ -1580,7 +1575,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 4, "Session key: %08x", GWORD(pd, offset)); + proto_tree_add_text(tree, offset, 4, "Session key: %08x", GWORD(pd, offset)); } @@ -1590,9 +1585,9 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Server Time: %s", + proto_tree_add_text(tree, offset, 2, "Server Time: %s", dissect_dos_time(GSHORT(pd, offset))); - proto_tree_add_item(tree, offset + 2, 2, "Server Date: %s", + proto_tree_add_text(tree, offset + 2, 2, "Server Date: %s", dissect_dos_date(GSHORT(pd, offset + 2))); } @@ -1603,7 +1598,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Server time zone: %i min from UTC", + proto_tree_add_text(tree, offset, 2, "Server time zone: %i min from UTC", (signed)GSSHORT(pd, offset)); } @@ -1616,7 +1611,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Challenge Length: %u", enckeylen); + proto_tree_add_text(tree, offset, 2, "Challenge Length: %u", enckeylen); } @@ -1624,7 +1619,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Reserved: %u (MBZ)", GSHORT(pd, offset)); + proto_tree_add_text(tree, offset, 2, "Reserved: %u (MBZ)", GSHORT(pd, offset)); } @@ -1634,7 +1629,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count (BCC): %u", bcc); + proto_tree_add_text(tree, offset, 2, "Byte Count (BCC): %u", bcc); } @@ -1646,7 +1641,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, enckeylen, "Challenge: %s", + proto_tree_add_text(tree, offset, enckeylen, "Challenge: %s", bytes_to_str(str, enckeylen)); } @@ -1660,7 +1655,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, strlen(str)+1, "Primary Domain: %s", str); + proto_tree_add_text(tree, offset, strlen(str)+1, "Primary Domain: %s", str); } @@ -1670,7 +1665,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Dialect Index: %u, Greater than LANMAN2.1", GSHORT(pd, offset)); + proto_tree_add_text(tree, offset, 2, "Dialect Index: %u, Greater than LANMAN2.1", GSHORT(pd, offset)); } @@ -1680,22 +1675,21 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - ti = proto_tree_add_item(tree, offset, 1, "Security Mode: 0x%02x", mode); - mode_tree = proto_tree_new(); - proto_item_add_subtree(ti, mode_tree, ETT_SMB_MODE); - proto_tree_add_item(mode_tree, offset, 1, "%s", + ti = proto_tree_add_text(tree, offset, 1, "Security Mode: 0x%02x", mode); + mode_tree = proto_item_add_subtree(ti, ETT_SMB_MODE); + proto_tree_add_text(mode_tree, offset, 1, "%s", decode_boolean_bitfield(mode, 0x01, 8, "Security = User", "Security = Share")); - proto_tree_add_item(mode_tree, offset, 1, "%s", + proto_tree_add_text(mode_tree, offset, 1, "%s", decode_boolean_bitfield(mode, 0x02, 8, "Passwords = Encrypted", "Passwords = Plaintext")); - proto_tree_add_item(mode_tree, offset, 1, "%s", + proto_tree_add_text(mode_tree, offset, 1, "%s", decode_boolean_bitfield(mode, 0x04, 8, "Security signatures enabled", "Security signatures not enabled")); - proto_tree_add_item(mode_tree, offset, 1, "%s", + proto_tree_add_text(mode_tree, offset, 1, "%s", decode_boolean_bitfield(mode, 0x08, 8, "Security signatures required", "Security signatures not required")); @@ -1706,7 +1700,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Max multiplex count: %u", GSHORT(pd, offset)); + proto_tree_add_text(tree, offset, 2, "Max multiplex count: %u", GSHORT(pd, offset)); } @@ -1714,7 +1708,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Max vcs: %u", GSHORT(pd, offset)); + proto_tree_add_text(tree, offset, 2, "Max vcs: %u", GSHORT(pd, offset)); } @@ -1722,7 +1716,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Max buffer size: %u", GWORD(pd, offset)); + proto_tree_add_text(tree, offset, 2, "Max buffer size: %u", GWORD(pd, offset)); } @@ -1730,7 +1724,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 4, "Max raw size: %u", GWORD(pd, offset)); + proto_tree_add_text(tree, offset, 4, "Max raw size: %u", GWORD(pd, offset)); } @@ -1738,7 +1732,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 4, "Session key: %08x", GWORD(pd, offset)); + proto_tree_add_text(tree, offset, 4, "Session key: %08x", GWORD(pd, offset)); } @@ -1748,62 +1742,61 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - ti = proto_tree_add_item(tree, offset, 4, "Capabilities: 0x%04x", caps); - caps_tree = proto_tree_new(); - proto_item_add_subtree(ti, caps_tree, ETT_SMB_CAPABILITIES); - proto_tree_add_item(caps_tree, offset, 4, "%s", + ti = proto_tree_add_text(tree, offset, 4, "Capabilities: 0x%04x", caps); + caps_tree = proto_item_add_subtree(ti, ETT_SMB_CAPABILITIES); + proto_tree_add_text(caps_tree, offset, 4, "%s", decode_boolean_bitfield(caps, 0x0001, 32, "Raw Mode supported", "Raw Mode not supported")); - proto_tree_add_item(caps_tree, offset, 4, "%s", + proto_tree_add_text(caps_tree, offset, 4, "%s", decode_boolean_bitfield(caps, 0x0002, 32, "MPX Mode supported", "MPX Mode not supported")); - proto_tree_add_item(caps_tree, offset, 4, "%s", + proto_tree_add_text(caps_tree, offset, 4, "%s", decode_boolean_bitfield(caps, 0x0004, 32, "Unicode supported", "Unicode not supported")); - proto_tree_add_item(caps_tree, offset, 4, "%s", + proto_tree_add_text(caps_tree, offset, 4, "%s", decode_boolean_bitfield(caps, 0x0008, 32, "Large files supported", "Large files not supported")); - proto_tree_add_item(caps_tree, offset, 4, "%s", + proto_tree_add_text(caps_tree, offset, 4, "%s", decode_boolean_bitfield(caps, 0x0010, 32, "NT LM 0.12 SMBs supported", "NT LM 0.12 SMBs not supported")); - proto_tree_add_item(caps_tree, offset, 4, "%s", + proto_tree_add_text(caps_tree, offset, 4, "%s", decode_boolean_bitfield(caps, 0x0020, 32, "RPC remote APIs supported", "RPC remote APIs not supported")); - proto_tree_add_item(caps_tree, offset, 4, "%s", + proto_tree_add_text(caps_tree, offset, 4, "%s", decode_boolean_bitfield(caps, 0x0040, 32, "NT status codes supported", "NT status codes not supported")); - proto_tree_add_item(caps_tree, offset, 4, "%s", + proto_tree_add_text(caps_tree, offset, 4, "%s", decode_boolean_bitfield(caps, 0x0080, 32, "Level 2 OpLocks supported", "Level 2 OpLocks not supported")); - proto_tree_add_item(caps_tree, offset, 4, "%s", + proto_tree_add_text(caps_tree, offset, 4, "%s", decode_boolean_bitfield(caps, 0x0100, 32, "Lock&Read supported", "Lock&Read not supported")); - proto_tree_add_item(caps_tree, offset, 4, "%s", + proto_tree_add_text(caps_tree, offset, 4, "%s", decode_boolean_bitfield(caps, 0x0200, 32, "NT Find supported", "NT Find not supported")); - proto_tree_add_item(caps_tree, offset, 4, "%s", + proto_tree_add_text(caps_tree, offset, 4, "%s", decode_boolean_bitfield(caps, 0x1000, 32, "DFS supported", "DFS not supported")); - proto_tree_add_item(caps_tree, offset, 4, "%s", + proto_tree_add_text(caps_tree, offset, 4, "%s", decode_boolean_bitfield(caps, 0x4000, 32, "Large READX supported", "Large READX not supported")); - proto_tree_add_item(caps_tree, offset, 4, "%s", + proto_tree_add_text(caps_tree, offset, 4, "%s", decode_boolean_bitfield(caps, 0x8000, 32, "Large WRITEX supported", "Large WRITEX not supported")); - proto_tree_add_item(caps_tree, offset, 4, "%s", + proto_tree_add_text(caps_tree, offset, 4, "%s", decode_boolean_bitfield(caps, 0x80000000, 32, "Extended security exchanges supported", "Extended security exchanges not supported")); @@ -1815,8 +1808,8 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 4, "System Time Low: 0x%08x", GWORD(pd, offset)); - proto_tree_add_item(tree, offset + 4, 4, "System Time High: 0x%08x", GWORD(pd, offset + 4)); + proto_tree_add_text(tree, offset, 4, "System Time Low: 0x%08x", GWORD(pd, offset)); + proto_tree_add_text(tree, offset + 4, 4, "System Time High: 0x%08x", GWORD(pd, offset + 4)); } @@ -1826,7 +1819,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Server time zone: %i min from UTC", + proto_tree_add_text(tree, offset, 2, "Server time zone: %i min from UTC", (signed)GSSHORT(pd, offset)); } @@ -1839,7 +1832,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 1, "Encryption key len: %u", enckeylen); + proto_tree_add_text(tree, offset, 1, "Encryption key len: %u", enckeylen); } @@ -1849,7 +1842,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte count (BCC): %u", bcc); + proto_tree_add_text(tree, offset, 2, "Byte count (BCC): %u", bcc); } @@ -1863,7 +1856,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (tree) { - proto_tree_add_item(tree, offset, enckeylen, "Challenge encryption key: %s", + proto_tree_add_text(tree, offset, enckeylen, "Challenge encryption key: %s", bytes_to_str(str, enckeylen)); } @@ -1882,9 +1875,9 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr if (caps & 0x0004) { ustr = unicode_to_str(str, &ustr_len); - proto_tree_add_item(tree, offset, ustr_len+2, "OEM domain name: %s", ustr); + proto_tree_add_text(tree, offset, ustr_len+2, "OEM domain name: %s", ustr); } else { - proto_tree_add_item(tree, offset, strlen(str)+1, "OEM domain name: %s", str); + proto_tree_add_text(tree, offset, strlen(str)+1, "OEM domain name: %s", str); } } @@ -1894,7 +1887,7 @@ dissect_negprot_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tr default: /* Baddd */ if (tree) - proto_tree_add_item(tree, offset, 1, "Bad format, should never get here"); + proto_tree_add_text(tree, offset, 1, "Bad format, should never get here"); return; } @@ -1918,7 +1911,7 @@ dissect_deletedir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 1, "Word Count (WCT): %u", WordCount); + proto_tree_add_text(tree, offset, 1, "Word Count (WCT): %u", WordCount); } @@ -1930,7 +1923,7 @@ dissect_deletedir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); + proto_tree_add_text(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); } @@ -1942,7 +1935,7 @@ dissect_deletedir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 1, "Buffer Format: %u", BufferFormat); + proto_tree_add_text(tree, offset, 1, "Buffer Format: %u", BufferFormat); } @@ -1954,7 +1947,7 @@ dissect_deletedir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, strlen(DirectoryName) + 1, "Directory Name: %s", DirectoryName); + proto_tree_add_text(tree, offset, strlen(DirectoryName) + 1, "Directory Name: %s", DirectoryName); } @@ -1970,7 +1963,7 @@ dissect_deletedir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 1, "Word Count (WCT): %u", WordCount); + proto_tree_add_text(tree, offset, 1, "Word Count (WCT): %u", WordCount); } @@ -1982,7 +1975,7 @@ dissect_deletedir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); + proto_tree_add_text(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); } @@ -2009,7 +2002,7 @@ dissect_createdir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 1, "Word Count (WCT): %u", WordCount); + proto_tree_add_text(tree, offset, 1, "Word Count (WCT): %u", WordCount); } @@ -2021,7 +2014,7 @@ dissect_createdir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); + proto_tree_add_text(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); } @@ -2033,7 +2026,7 @@ dissect_createdir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 1, "Buffer Format: %u", BufferFormat); + proto_tree_add_text(tree, offset, 1, "Buffer Format: %u", BufferFormat); } @@ -2045,7 +2038,7 @@ dissect_createdir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, strlen(DirectoryName) + 1, "Directory Name: %s", DirectoryName); + proto_tree_add_text(tree, offset, strlen(DirectoryName) + 1, "Directory Name: %s", DirectoryName); } @@ -2061,7 +2054,7 @@ dissect_createdir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 1, "Word Count (WCT): %u", WordCount); + proto_tree_add_text(tree, offset, 1, "Word Count (WCT): %u", WordCount); } @@ -2073,7 +2066,7 @@ dissect_createdir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree * if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); + proto_tree_add_text(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); } @@ -2100,7 +2093,7 @@ dissect_checkdir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *t if (tree) { - proto_tree_add_item(tree, offset, 1, "Word Count (WCT): %u", WordCount); + proto_tree_add_text(tree, offset, 1, "Word Count (WCT): %u", WordCount); } @@ -2112,7 +2105,7 @@ dissect_checkdir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *t if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); + proto_tree_add_text(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); } @@ -2124,7 +2117,7 @@ dissect_checkdir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *t if (tree) { - proto_tree_add_item(tree, offset, 1, "Buffer Format: %u", BufferFormat); + proto_tree_add_text(tree, offset, 1, "Buffer Format: %u", BufferFormat); } @@ -2136,7 +2129,7 @@ dissect_checkdir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *t if (tree) { - proto_tree_add_item(tree, offset, strlen(DirectoryName) + 1, "Directory Name: %s", DirectoryName); + proto_tree_add_text(tree, offset, strlen(DirectoryName) + 1, "Directory Name: %s", DirectoryName); } @@ -2152,7 +2145,7 @@ dissect_checkdir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *t if (tree) { - proto_tree_add_item(tree, offset, 1, "Word Count (WCT): %u", WordCount); + proto_tree_add_text(tree, offset, 1, "Word Count (WCT): %u", WordCount); } @@ -2164,7 +2157,7 @@ dissect_checkdir_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *t if (tree) { - proto_tree_add_item(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); + proto_tree_add_text(tree, offset, 2, "Byte Count (BCC): %u", ByteCount); } @@ -2609,17 +2602,16 @@ dissect_smb(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, "Server Message Block Protocol"); - smb_tree = proto_tree_new(); - proto_item_add_subtree(ti, smb_tree, ETT_SMB); + smb_tree = proto_item_add_subtree(ti, ETT_SMB); /* 0xFFSMB is actually a 1 byte msg type and 3 byte server * component ... SMB is only one used */ - proto_tree_add_item(smb_tree, offset, 1, "Message Type: 0xFF"); - proto_tree_add_item(smb_tree, offset+1, 3, "Server Component: SMB"); + proto_tree_add_text(smb_tree, offset, 1, "Message Type: 0xFF"); + proto_tree_add_text(smb_tree, offset+1, 3, "Server Component: SMB"); } @@ -2627,7 +2619,7 @@ dissect_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int if (tree) { - proto_tree_add_item(smb_tree, offset, 1, "Command: %s", decode_smb_name(cmd)); + proto_tree_add_text(smb_tree, offset, 1, "Command: %s", decode_smb_name(cmd)); } @@ -2639,7 +2631,7 @@ dissect_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int if (tree) { - proto_tree_add_item(smb_tree, offset, 1, "Error Class: %s", + proto_tree_add_text(smb_tree, offset, 1, "Error Class: %s", val_to_str((guint8)pd[offset], errcls_types, "Unknown Error Class (%x)")); } @@ -2651,7 +2643,7 @@ dissect_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int if (tree) { - proto_tree_add_item(smb_tree, offset, 1, "Reserved: %i", errcode1); + proto_tree_add_text(smb_tree, offset, 1, "Reserved: %i", errcode1); } @@ -2661,7 +2653,7 @@ dissect_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int if (tree) { - proto_tree_add_item(smb_tree, offset, 2, "Error Code: %s", + proto_tree_add_text(smb_tree, offset, 2, "Error Code: %s", decode_smb_error(errcls, errcode)); } @@ -2674,36 +2666,35 @@ dissect_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int if (tree) { - tf = proto_tree_add_item(smb_tree, offset, 1, "Flags: 0x%02x", flags); + tf = proto_tree_add_text(smb_tree, offset, 1, "Flags: 0x%02x", flags); - flags_tree = proto_tree_new(); - proto_item_add_subtree(tf, flags_tree, ETT_SMB_FLAGS); - proto_tree_add_item(flags_tree, offset, 1, "%s", + flags_tree = proto_item_add_subtree(tf, ETT_SMB_FLAGS); + proto_tree_add_text(flags_tree, offset, 1, "%s", decode_boolean_bitfield(flags, 0x01, 8, "Lock&Read, Write&Unlock supported", "Lock&Read, Write&Unlock not supported")); - proto_tree_add_item(flags_tree, offset, 1, "%s", + proto_tree_add_text(flags_tree, offset, 1, "%s", decode_boolean_bitfield(flags, 0x02, 8, "Receive buffer posted", "Receive buffer not posted")); - proto_tree_add_item(flags_tree, offset, 1, "%s", + proto_tree_add_text(flags_tree, offset, 1, "%s", decode_boolean_bitfield(flags, 0x08, 8, "Path names caseless", "Path names case sensitive")); - proto_tree_add_item(flags_tree, offset, 1, "%s", + proto_tree_add_text(flags_tree, offset, 1, "%s", decode_boolean_bitfield(flags, 0x10, 8, "Pathnames canonicalized", "Pathnames not canonicalized")); - proto_tree_add_item(flags_tree, offset, 1, "%s", + proto_tree_add_text(flags_tree, offset, 1, "%s", decode_boolean_bitfield(flags, 0x20, 8, "OpLocks requested/granted", "OpLocks not requested/granted")); - proto_tree_add_item(flags_tree, offset, 1, "%s", + proto_tree_add_text(flags_tree, offset, 1, "%s", decode_boolean_bitfield(flags, 0x40, 8, "Notify all", "Notify open only")); - proto_tree_add_item(flags_tree, offset, 1, "%s", + proto_tree_add_text(flags_tree, offset, 1, "%s", decode_boolean_bitfield(flags, SMB_FLAGS_DIRN, 8, "Response to client/redirector", "Request to server")); @@ -2715,39 +2706,38 @@ dissect_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int if (tree) { - tf = proto_tree_add_item(smb_tree, offset, 1, "Flags2: 0x%04x", flags2); + tf = proto_tree_add_text(smb_tree, offset, 1, "Flags2: 0x%04x", flags2); - flags2_tree = proto_tree_new(); - proto_item_add_subtree(tf, flags2_tree, ETT_SMB_FLAGS2); - proto_tree_add_item(flags2_tree, offset, 1, "%s", + flags2_tree = proto_item_add_subtree(tf, ETT_SMB_FLAGS2); + proto_tree_add_text(flags2_tree, offset, 1, "%s", decode_boolean_bitfield(flags2, 0x0001, 16, "Long file names supported", "Long file names not supported")); - proto_tree_add_item(flags2_tree, offset, 1, "%s", + proto_tree_add_text(flags2_tree, offset, 1, "%s", decode_boolean_bitfield(flags2, 0x0002, 16, "Extended attributes supported", "Extended attributes not supported")); - proto_tree_add_item(flags2_tree, offset, 1, "%s", + proto_tree_add_text(flags2_tree, offset, 1, "%s", decode_boolean_bitfield(flags2, 0x0004, 16, "Security signatures supported", "Security signatures not supported")); - proto_tree_add_item(flags2_tree, offset, 1, "%s", + proto_tree_add_text(flags2_tree, offset, 1, "%s", decode_boolean_bitfield(flags2, 0x0800, 16, "Extended security negotiation supported", "Extended security negotiation not supported")); - proto_tree_add_item(flags2_tree, offset, 1, "%s", + proto_tree_add_text(flags2_tree, offset, 1, "%s", decode_boolean_bitfield(flags2, 0x1000, 16, "Resolve pathnames with DFS", "Don't resolve pathnames with DFS")); - proto_tree_add_item(flags2_tree, offset, 1, "%s", + proto_tree_add_text(flags2_tree, offset, 1, "%s", decode_boolean_bitfield(flags2, 0x2000, 16, "Permit reads if execute-only", "Don't permit reads if execute-only")); - proto_tree_add_item(flags2_tree, offset, 1, "%s", + proto_tree_add_text(flags2_tree, offset, 1, "%s", decode_boolean_bitfield(flags2, 0x4000, 16, "Error codes are NT error codes", "Error codes are DOS error codes")); - proto_tree_add_item(flags2_tree, offset, 1, "%s", + proto_tree_add_text(flags2_tree, offset, 1, "%s", decode_boolean_bitfield(flags2, 0x8000, 16, "Strings are Unicode", "Strings are ASCII")); @@ -2758,7 +2748,7 @@ dissect_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int if (tree) { - proto_tree_add_item(smb_tree, offset, 12, "Reserved: 6 WORDS"); + proto_tree_add_text(smb_tree, offset, 12, "Reserved: 6 WORDS"); } @@ -2770,7 +2760,7 @@ dissect_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int if (tree) { - proto_tree_add_item(smb_tree, offset, 2, "Network Path/Tree ID (TID): %i (%04x)", tid, tid); + proto_tree_add_text(smb_tree, offset, 2, "Network Path/Tree ID (TID): %i (%04x)", tid, tid); } @@ -2782,7 +2772,7 @@ dissect_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int if (tree) { - proto_tree_add_item(smb_tree, offset, 2, "Process ID (PID): %i (%04x)", pid, pid); + proto_tree_add_text(smb_tree, offset, 2, "Process ID (PID): %i (%04x)", pid, pid); } @@ -2794,7 +2784,7 @@ dissect_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int if (tree) { - proto_tree_add_item(smb_tree, offset, 2, "User ID (UID): %i (%04x)", uid, uid); + proto_tree_add_text(smb_tree, offset, 2, "User ID (UID): %i (%04x)", uid, uid); } @@ -2806,7 +2796,7 @@ dissect_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, int if (tree) { - proto_tree_add_item(smb_tree, offset, 2, "Multiplex ID (MID): %i (%04x)", mid, mid); + proto_tree_add_text(smb_tree, offset, 2, "Multiplex ID (MID): %i (%04x)", mid, mid); } diff --git a/packet-snmp.c b/packet-snmp.c index cb898d72cb..d7edc838e8 100644 --- a/packet-snmp.c +++ b/packet-snmp.c @@ -2,7 +2,7 @@ * Routines for SNMP (simple network management protocol) * D.Jorand (c) 1998 * - * $Id: packet-snmp.c,v 1.3 1999/06/12 04:17:19 guy Exp $ + * $Id: packet-snmp.c,v 1.4 1999/07/07 22:51:54 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -452,18 +452,17 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) if(tree) { /* all_length=header_length+pdu_type_length+request_id_length+error_status_length+error_index_length; */ all_length=fd->pkt_len-offset; - item = proto_tree_add_item(tree, offset, all_length, "Simple Network Management Protocol"); - snmp_tree = proto_tree_new(); - proto_item_add_subtree(item, snmp_tree, ETT_SNMP); - proto_tree_add_item(snmp_tree, offset, header_length, "Community: \"%s\", Version: %s", community, val_to_str(version, versions, "Unknown version %#x")); + item = proto_tree_add_text(tree, offset, all_length, "Simple Network Management Protocol"); + snmp_tree = proto_item_add_subtree(item, ETT_SNMP); + proto_tree_add_text(snmp_tree, offset, header_length, "Community: \"%s\", Version: %s", community, val_to_str(version, versions, "Unknown version %#x")); offset+=header_length; - proto_tree_add_item(snmp_tree, offset, pdu_type_length, "%s", pdu_type_string); + proto_tree_add_text(snmp_tree, offset, pdu_type_length, "%s", pdu_type_string); offset+=pdu_type_length; - proto_tree_add_item(snmp_tree, offset, request_id_length, "Request Id.: %#x", (unsigned int)request_id); + proto_tree_add_text(snmp_tree, offset, request_id_length, "Request Id.: %#x", (unsigned int)request_id); offset+=request_id_length; - proto_tree_add_item(snmp_tree, offset, error_status_length, "Error Status: %s", val_to_str(error_status, error_statuses, "Unknown (%d)")); + proto_tree_add_text(snmp_tree, offset, error_status_length, "Error Status: %s", val_to_str(error_status, error_statuses, "Unknown (%d)")); offset+=error_status_length; - proto_tree_add_item(snmp_tree, offset, error_index_length, "Error Index: %d", (int)error_index); + proto_tree_add_text(snmp_tree, offset, error_index_length, "Error Index: %d", (int)error_index); offset+=error_index_length; } else { offset+=header_length; @@ -481,12 +480,11 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) col_add_str(fd, COL_INFO, pdu_type_string); if(tree) { all_length=fd->pkt_len-offset; - item = proto_tree_add_item(tree, offset, all_length, "Simple Network Management Protocol"); - snmp_tree = proto_tree_new(); - proto_item_add_subtree(item, snmp_tree, ETT_SNMP); - proto_tree_add_item(snmp_tree, offset, header_length, "Community: \"%s\", Version: %s", community, val_to_str(version, versions, "Unknown version %#x")); + item = proto_tree_add_text(tree, offset, all_length, "Simple Network Management Protocol"); + snmp_tree = proto_item_add_subtree(item, ETT_SNMP); + proto_tree_add_text(snmp_tree, offset, header_length, "Community: \"%s\", Version: %s", community, val_to_str(version, versions, "Unknown version %#x")); offset+=header_length; - proto_tree_add_item(snmp_tree, offset, pdu_type_length, "Pdu type: %s", pdu_type_string); + proto_tree_add_text(snmp_tree, offset, pdu_type_length, "Pdu type: %s", pdu_type_string); offset+=pdu_type_length; } else { offset+=header_length; @@ -510,7 +508,7 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) strcat(vb_string,tmp_string); } if(tree) { - proto_tree_add_item(snmp_tree, offset, tmp_length, "Enterprise: %s", vb_string); + proto_tree_add_text(snmp_tree, offset, tmp_length, "Enterprise: %s", vb_string); } offset+=tmp_length; @@ -525,7 +523,7 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) } tmp_length-=length; if(tree) { - proto_tree_add_item(snmp_tree, offset, tmp_length, "Agent address: %d.%d.%d.%d", + proto_tree_add_text(snmp_tree, offset, tmp_length, "Agent address: %d.%d.%d.%d", vb_string_value[0],vb_string_value[1],vb_string_value[2],vb_string_value[3]); } offset+=tmp_length; @@ -540,7 +538,7 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) } tmp_length-=length; if(tree) { - proto_tree_add_item(snmp_tree, offset, tmp_length, "Trap type: %s", val_to_str(trap_type, trap_types, "Unknown (%d)")); + proto_tree_add_text(snmp_tree, offset, tmp_length, "Trap type: %s", val_to_str(trap_type, trap_types, "Unknown (%d)")); } offset+=tmp_length; @@ -554,7 +552,7 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) } tmp_length-=length; if(tree) { - proto_tree_add_item(snmp_tree, offset, tmp_length, "Specific trap type: %ld (%#lx)", (long)specific_type, (long)specific_type); + proto_tree_add_text(snmp_tree, offset, tmp_length, "Specific trap type: %ld (%#lx)", (long)specific_type, (long)specific_type); } offset+=tmp_length; @@ -568,7 +566,7 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) } tmp_length-=length; if(tree) { - proto_tree_add_item(snmp_tree, offset, tmp_length, "Timestamp: %lu", (unsigned long)timestamp); + proto_tree_add_text(snmp_tree, offset, tmp_length, "Timestamp: %lu", (unsigned long)timestamp); } offset+=tmp_length; } @@ -640,7 +638,7 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) sprint_objid(vb_string2, vb_name, vb_name_length); - proto_tree_add_item(snmp_tree, offset, tmp_length, "Object identifier %d: %s (%s)", vb_index, vb_string, vb_string2); + proto_tree_add_text(snmp_tree, offset, tmp_length, "Object identifier %d: %s (%s)", vb_index, vb_string, vb_string2); } offset+=tmp_length; @@ -664,7 +662,7 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) return; } if(tree) { - proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: NULL"); + proto_tree_add_text(snmp_tree, offset, tmp_length, "Value: NULL"); } offset+=tmp_length; break; @@ -679,7 +677,7 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) return; } if(tree) { - proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: %ld (%#lx)", (long)vb_integer_value, (long)vb_integer_value); + proto_tree_add_text(snmp_tree, offset, tmp_length, "Value: %ld (%#lx)", (long)vb_integer_value, (long)vb_integer_value); } offset+=tmp_length; break; @@ -697,7 +695,7 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) return; } if(tree) { - proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: %lu (%#lx)", (unsigned long)vb_unsigned_value, (unsigned long)vb_unsigned_value); + proto_tree_add_text(snmp_tree, offset, tmp_length, "Value: %lu (%#lx)", (unsigned long)vb_unsigned_value, (unsigned long)vb_unsigned_value); } offset+=tmp_length; break; @@ -718,7 +716,7 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) return; } if(tree) { - proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: %lu:%lu (%#lx:%lx)", + proto_tree_add_text(snmp_tree, offset, tmp_length, "Value: %lu:%lu (%#lx:%lx)", vb_counter64_value.high, vb_counter64_value.low, vb_counter64_value.high, @@ -744,7 +742,7 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) sprintf(tmp_string, OID_FORMAT_STRING1, vb_oid_value[i]); strcat(vb_string,tmp_string); } - proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: %s", vb_string); + proto_tree_add_text(snmp_tree, offset, tmp_length, "Value: %s", vb_string); } offset+=tmp_length; break; @@ -774,9 +772,9 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) sprintf(tmp_string, ".%03d", (int)vb_string_value[i]); strcat(vb_string,tmp_string); } - proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: %s", vb_string); + proto_tree_add_text(snmp_tree, offset, tmp_length, "Value: %s", vb_string); }else { - proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: %s", vb_string_value); + proto_tree_add_text(snmp_tree, offset, tmp_length, "Value: %s", vb_string_value); } } offset+=tmp_length; @@ -793,7 +791,7 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) return; } if(tree) { - proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: %ld:%lu (%#lx:%lx)", + proto_tree_add_text(snmp_tree, offset, tmp_length, "Value: %ld:%lu (%#lx:%lx)", vb_counter64_value.high, vb_counter64_value.low, vb_counter64_value.high, @@ -813,7 +811,7 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) return; } if(tree) { - proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: %f", (double)vb_float_value); + proto_tree_add_text(snmp_tree, offset, tmp_length, "Value: %f", (double)vb_float_value); } offset+=tmp_length; break; @@ -828,7 +826,7 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) return; } if(tree) { - proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: %f", vb_double_value); + proto_tree_add_text(snmp_tree, offset, tmp_length, "Value: %f", vb_double_value); } offset+=tmp_length; break; @@ -836,17 +834,17 @@ dissect_snmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) case SNMP_NOSUCHOBJECT: if(tree) { - proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: no such object"); + proto_tree_add_text(snmp_tree, offset, tmp_length, "Value: no such object"); } break; case SNMP_NOSUCHINSTANCE: if(tree) { - proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: no such instance"); + proto_tree_add_text(snmp_tree, offset, tmp_length, "Value: no such instance"); } break; case SNMP_ENDOFMIBVIEW: if(tree) { - proto_tree_add_item(snmp_tree, offset, tmp_length, "Value: end of mib view"); + proto_tree_add_text(snmp_tree, offset, tmp_length, "Value: end of mib view"); } break; diff --git a/packet-tcp.c b/packet-tcp.c index f9534a9322..371d9feed3 100644 --- a/packet-tcp.c +++ b/packet-tcp.c @@ -1,7 +1,7 @@ /* packet-tcp.c * Routines for TCP packet disassembly * - * $Id: packet-tcp.c,v 1.25 1999/07/07 00:34:57 guy Exp $ + * $Id: packet-tcp.c,v 1.26 1999/07/07 22:51:55 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -144,7 +144,7 @@ static void dissect_tcpopt_maxseg(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: %u bytes", name, pntohs(opd)); tcp_info_append_uint("MSS", pntohs(opd)); } @@ -153,7 +153,7 @@ static void dissect_tcpopt_wscale(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: %u bytes", name, *opd); tcp_info_append_uint("WS", *opd); } @@ -166,17 +166,16 @@ dissect_tcpopt_sack(proto_tree *opt_tree, const char *name, const u_char *opd, proto_item *tf; guint leftedge, rightedge; - tf = proto_tree_add_item(opt_tree, offset, optlen, "%s:", name); + tf = proto_tree_add_text(opt_tree, offset, optlen, "%s:", name); offset += 2; /* skip past type and length */ optlen -= 2; /* subtract size of type and length */ while (optlen > 0) { if (field_tree == NULL) { /* Haven't yet made a subtree out of this option. Do so. */ - field_tree = proto_tree_new(); - proto_item_add_subtree(tf, field_tree, ETT_TCP_OPTION_SACK); + field_tree = proto_item_add_subtree(tf, ETT_TCP_OPTION_SACK); } 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; } @@ -185,7 +184,7 @@ dissect_tcpopt_sack(proto_tree *opt_tree, const char *name, const u_char *opd, opd += 4; optlen -= 4; 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; } @@ -193,7 +192,7 @@ dissect_tcpopt_sack(proto_tree *opt_tree, const char *name, const u_char *opd, rightedge = pntohl(opd); opd += 4; optlen -= 4; - proto_tree_add_item(field_tree, offset, 8, + proto_tree_add_text(field_tree, offset, 8, "left edge = %u, right edge = %u", leftedge, rightedge); tcp_info_append_uint("SLE", leftedge); tcp_info_append_uint("SRE", rightedge); @@ -205,7 +204,7 @@ static void dissect_tcpopt_echo(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: %u", name, pntohl(opd)); tcp_info_append_uint("ECHO", pntohl(opd)); } @@ -214,7 +213,7 @@ static void dissect_tcpopt_timestamp(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: tsval %u, tsecr %u", name, pntohl(opd), pntohl(opd + 4)); tcp_info_append_uint("TSV", pntohl(opd)); tcp_info_append_uint("TSER", pntohl(opd + 4)); @@ -224,7 +223,7 @@ static void dissect_tcpopt_cc(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: %u", name, pntohl(opd)); tcp_info_append_uint("CC", pntohl(opd)); } @@ -389,45 +388,43 @@ dissect_tcp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { } if (tree) { - ti = proto_tree_add_item(tree, offset, hlen, + ti = proto_tree_add_text(tree, offset, hlen, "Transmission Control Protocol"); - tcp_tree = proto_tree_new(); - proto_item_add_subtree(ti, tcp_tree, ETT_TCP); - proto_tree_add_item(tcp_tree, offset, 2, "Source port: %s (%u)", + tcp_tree = proto_item_add_subtree(ti, ETT_TCP); + proto_tree_add_text(tcp_tree, offset, 2, "Source port: %s (%u)", get_tcp_port(th.th_sport), th.th_sport); - proto_tree_add_item(tcp_tree, offset + 2, 2, "Destination port: %s (%u)", + proto_tree_add_text(tcp_tree, offset + 2, 2, "Destination port: %s (%u)", get_tcp_port(th.th_dport), th.th_dport); - proto_tree_add_item(tcp_tree, offset + 4, 4, "Sequence number: %u", + proto_tree_add_text(tcp_tree, offset + 4, 4, "Sequence number: %u", th.th_seq); if (th.th_flags & TH_ACK) - proto_tree_add_item(tcp_tree, offset + 8, 4, "Acknowledgement number: %u", + proto_tree_add_text(tcp_tree, offset + 8, 4, "Acknowledgement number: %u", th.th_ack); - proto_tree_add_item(tcp_tree, offset + 12, 1, "Header length: %u bytes", hlen); - tf = proto_tree_add_item(tcp_tree, offset + 13, 1, "Flags: 0x%x", th.th_flags); - field_tree = proto_tree_new(); - proto_item_add_subtree(tf, field_tree, ETT_TCP_FLAGS); - proto_tree_add_item(field_tree, offset + 13, 1, "%s", + proto_tree_add_text(tcp_tree, offset + 12, 1, "Header length: %u bytes", hlen); + tf = proto_tree_add_text(tcp_tree, offset + 13, 1, "Flags: 0x%x", th.th_flags); + field_tree = proto_item_add_subtree(tf, ETT_TCP_FLAGS); + proto_tree_add_text(field_tree, offset + 13, 1, "%s", decode_boolean_bitfield(th.th_flags, TH_URG, sizeof (th.th_flags)*8, "Urgent pointer", "No urgent pointer")); - proto_tree_add_item(field_tree, offset + 13, 1, "%s", + proto_tree_add_text(field_tree, offset + 13, 1, "%s", decode_boolean_bitfield(th.th_flags, TH_ACK, sizeof (th.th_flags)*8, "Acknowledgment", "No acknowledgment")); - proto_tree_add_item(field_tree, offset + 13, 1, "%s", + proto_tree_add_text(field_tree, offset + 13, 1, "%s", decode_boolean_bitfield(th.th_flags, TH_PUSH, sizeof (th.th_flags)*8, "Push", "No push")); - proto_tree_add_item(field_tree, offset + 13, 1, "%s", + proto_tree_add_text(field_tree, offset + 13, 1, "%s", decode_boolean_bitfield(th.th_flags, TH_RST, sizeof (th.th_flags)*8, "Reset", "No reset")); - proto_tree_add_item(field_tree, offset + 13, 1, "%s", + proto_tree_add_text(field_tree, offset + 13, 1, "%s", decode_boolean_bitfield(th.th_flags, TH_SYN, sizeof (th.th_flags)*8, "Syn", "No Syn")); - proto_tree_add_item(field_tree, offset + 13, 1, "%s", + proto_tree_add_text(field_tree, offset + 13, 1, "%s", decode_boolean_bitfield(th.th_flags, TH_FIN, sizeof (th.th_flags)*8, "Fin", "No Fin")); - proto_tree_add_item(tcp_tree, offset + 14, 2, "Window size: %u", th.th_win); - proto_tree_add_item(tcp_tree, offset + 16, 2, "Checksum: 0x%04x", th.th_sum); + proto_tree_add_text(tcp_tree, offset + 14, 2, "Window size: %u", th.th_win); + proto_tree_add_text(tcp_tree, offset + 16, 2, "Checksum: 0x%04x", th.th_sum); if (th.th_flags & TH_URG) - proto_tree_add_item(tcp_tree, offset + 18, 2, "Urgent pointer: 0x%04x", + proto_tree_add_text(tcp_tree, offset + 18, 2, "Urgent pointer: 0x%04x", th.th_urp); } @@ -436,10 +433,9 @@ dissect_tcp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { /* There's more than just the fixed-length header. Decode the options. */ optlen = hlen - sizeof (e_tcphdr); /* length of options, in bytes */ - tf = proto_tree_add_item(tcp_tree, offset + 20, optlen, + tf = proto_tree_add_text(tcp_tree, offset + 20, optlen, "Options: (%d bytes)", optlen); - field_tree = proto_tree_new(); - proto_item_add_subtree(tf, field_tree, ETT_TCP_OPTIONS); + field_tree = proto_item_add_subtree(tf, ETT_TCP_OPTIONS); dissect_ip_tcp_options(field_tree, &pd[offset + 20], offset + 20, optlen, tcpopts, N_TCP_OPTS, TCPOPT_EOL); } diff --git a/packet-telnet.c b/packet-telnet.c index 8a9256f67b..0f8d120496 100644 --- a/packet-telnet.c +++ b/packet-telnet.c @@ -2,7 +2,7 @@ * Routines for telnet packet dissection * Copyright 1999, Richard Sharpe * - * $Id: packet-telnet.c,v 1.2 1999/04/05 23:39:51 guy Exp $ + * $Id: packet-telnet.c,v 1.3 1999/07/07 22:51:55 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -139,18 +139,16 @@ void telnet_sub_option(proto_tree *telnet_tree, char *rr, int *i, int offset, in subneg_len = i1 - *i + 2; - ti = proto_tree_add_item(telnet_tree, offset, subneg_len, "Suboption Begin: %s", opt); + ti = proto_tree_add_text(telnet_tree, offset, subneg_len, "Suboption Begin: %s", opt); - option_tree = proto_tree_new(); + option_tree = proto_item_add_subtree(ti, ETT_TELNET_SUBOPT); - proto_item_add_subtree(ti, option_tree, ETT_TELNET_SUBOPT); - - proto_tree_add_item(option_tree, offset + 2, subneg_len - 2, "%s %s", (req ? "Send your" : "Here's my"), opt); + proto_tree_add_text(option_tree, offset + 2, subneg_len - 2, "%s %s", (req ? "Send your" : "Here's my"), opt); if (req == 0) { /* Add the value */ memcpy(sub_opt_data, rr + *i + 2, subneg_len - 2); - proto_tree_add_item(option_tree, offset + 4, subneg_len - 4, "Value: %s", format_text(sub_opt_data, subneg_len - 4)); + proto_tree_add_text(option_tree, offset + 4, subneg_len - 4, "Value: %s", format_text(sub_opt_data, subneg_len - 4)); *i += subneg_len - 2; } @@ -169,85 +167,85 @@ void telnet_command(proto_tree *telnet_tree, char *rr, int *i, int offset, int m case TN_EOF: - proto_tree_add_item(telnet_tree, offset, 2, "Command: End of File"); + proto_tree_add_text(telnet_tree, offset, 2, "Command: End of File"); (*i)++; break; case TN_SUSP: - proto_tree_add_item(telnet_tree, offset, 2, "Command: Suspend Current Process"); + proto_tree_add_text(telnet_tree, offset, 2, "Command: Suspend Current Process"); (*i)++; break; case TN_ABORT: - proto_tree_add_item(telnet_tree, offset, 2, "Command: Abort Process"); + proto_tree_add_text(telnet_tree, offset, 2, "Command: Abort Process"); (*i)++; break; case TN_EOR: - proto_tree_add_item(telnet_tree, offset, 2, "Command: End of Record"); + proto_tree_add_text(telnet_tree, offset, 2, "Command: End of Record"); (*i)++; break; case TN_SE: - proto_tree_add_item(telnet_tree, offset, 2, "Command: Suboption End"); + proto_tree_add_text(telnet_tree, offset, 2, "Command: Suboption End"); (*i)++; break; case TN_NOP: - proto_tree_add_item(telnet_tree, offset, 2, "Command: No Operation"); + proto_tree_add_text(telnet_tree, offset, 2, "Command: No Operation"); (*i)++; break; case TN_DM: - proto_tree_add_item(telnet_tree, offset, 2, "Command: Data Mark"); + proto_tree_add_text(telnet_tree, offset, 2, "Command: Data Mark"); (*i)++; break; case TN_BRK: - proto_tree_add_item(telnet_tree, offset, 2, "Command: Break"); + proto_tree_add_text(telnet_tree, offset, 2, "Command: Break"); (*i)++; break; case TN_IP: - proto_tree_add_item(telnet_tree, offset, 2, "Command: Interrupt Process"); + proto_tree_add_text(telnet_tree, offset, 2, "Command: Interrupt Process"); (*i)++; break; case TN_AO: - proto_tree_add_item(telnet_tree, offset, 2, "Command: Abort Output"); + proto_tree_add_text(telnet_tree, offset, 2, "Command: Abort Output"); (*i)++; break; case TN_AYT: - proto_tree_add_item(telnet_tree, offset, 2, "Command: Are You There?"); + proto_tree_add_text(telnet_tree, offset, 2, "Command: Are You There?"); (*i)++; break; case TN_EC: - proto_tree_add_item(telnet_tree, offset, 2, "Command: Escape Character"); + proto_tree_add_text(telnet_tree, offset, 2, "Command: Escape Character"); (*i)++; break; case TN_EL: - proto_tree_add_item(telnet_tree, offset, 2, "Command: Erase Line"); + proto_tree_add_text(telnet_tree, offset, 2, "Command: Erase Line"); (*i)++; break; case TN_GA: - proto_tree_add_item(telnet_tree, offset, 2, "Command: Go Ahead"); + proto_tree_add_text(telnet_tree, offset, 2, "Command: Go Ahead"); (*i)++; break; @@ -264,7 +262,7 @@ void telnet_command(proto_tree *telnet_tree, char *rr, int *i, int offset, int m else opt = options[(unsigned int)rr[*i + 1]]; - proto_tree_add_item(telnet_tree, offset, 3, "Command: Will %s", opt); + proto_tree_add_text(telnet_tree, offset, 3, "Command: Will %s", opt); *i += 2; /* skip two chars */ break; @@ -275,7 +273,7 @@ void telnet_command(proto_tree *telnet_tree, char *rr, int *i, int offset, int m else opt = options[(unsigned int)rr[*i + 1]]; - proto_tree_add_item(telnet_tree, offset, 3, "Command: Won't %s", opt); + proto_tree_add_text(telnet_tree, offset, 3, "Command: Won't %s", opt); *i += 2; /* skip two chars */ break; @@ -286,7 +284,7 @@ void telnet_command(proto_tree *telnet_tree, char *rr, int *i, int offset, int m else opt = options[(unsigned int)rr[*i + 1]]; - proto_tree_add_item(telnet_tree, offset, 3, "Command: Do %s", opt); + proto_tree_add_text(telnet_tree, offset, 3, "Command: Do %s", opt); *i += 2; /* skip two chars */ break; @@ -297,7 +295,7 @@ void telnet_command(proto_tree *telnet_tree, char *rr, int *i, int offset, int m else opt = options[(unsigned int)rr[*i + 1]]; - proto_tree_add_item(telnet_tree, offset, 3, "Command: Don't %s", opt); + proto_tree_add_text(telnet_tree, offset, 3, "Command: Don't %s", opt); *i += 2; /* skip two chars */ break; @@ -333,10 +331,9 @@ dissect_telnet(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, i memcpy(rr, pd + offset, max_data); - ti = proto_tree_add_item(tree, offset, END_OF_FRAME, + ti = proto_tree_add_text(tree, offset, END_OF_FRAME, "Telnet Protocol"); - telnet_tree = proto_tree_new(); - proto_item_add_subtree(ti, telnet_tree, ETT_TELNET); + telnet_tree = proto_item_add_subtree(ti, ETT_TELNET); i1 = i2 = i3 = 0; @@ -346,7 +343,7 @@ dissect_telnet(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, i if (strlen(data) > 0) { - proto_tree_add_item(telnet_tree, offset + i2, strlen(data), "Data: %s", format_text(data, strlen(data))); + proto_tree_add_text(telnet_tree, offset + i2, strlen(data), "Data: %s", format_text(data, strlen(data))); memset(data, '\0', sizeof(data)); i3 = 0; @@ -369,7 +366,7 @@ dissect_telnet(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, i if (strlen(data) > 0) { /* Still some data to add */ - proto_tree_add_item(telnet_tree, offset + i2, strlen(data), "Data: %s", format_text(data, strlen(data))); + proto_tree_add_text(telnet_tree, offset + i2, strlen(data), "Data: %s", format_text(data, strlen(data))); } diff --git a/packet-tftp.c b/packet-tftp.c index de1cb3eb1f..221ef1ae9e 100644 --- a/packet-tftp.c +++ b/packet-tftp.c @@ -3,7 +3,7 @@ * * Richard Sharpe * - * $Id: packet-tftp.c,v 1.3 1999/05/13 05:46:04 guy Exp $ + * $Id: packet-tftp.c,v 1.4 1999/07/07 22:51:56 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -88,55 +88,54 @@ dissect_tftp(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, "Trivial File Transfer Protocol"); - tftp_tree = proto_tree_new(); - proto_item_add_subtree(ti, tftp_tree, ETT_TFTP); + tftp_tree = proto_item_add_subtree(ti, ETT_TFTP); switch (i1 = pntohs(pd+offset)) { case RRQ: - proto_tree_add_item(tftp_tree, offset, 2, "Read Request"); + proto_tree_add_text(tftp_tree, offset, 2, "Read Request"); offset += 2; i1 = strlen(pd+offset); - proto_tree_add_item(tftp_tree, offset, i1+1, "Source File: %s", pd+offset); + proto_tree_add_text(tftp_tree, offset, i1+1, "Source File: %s", pd+offset); offset += i1 + 1; - proto_tree_add_item(tftp_tree, offset, END_OF_FRAME, "Type: %s",pd+offset); + proto_tree_add_text(tftp_tree, offset, END_OF_FRAME, "Type: %s",pd+offset); break; case WRQ: - proto_tree_add_item(tftp_tree, offset, 2, "Write Request"); + proto_tree_add_text(tftp_tree, offset, 2, "Write Request"); offset += 2; i1 = strlen(pd+offset); - proto_tree_add_item(tftp_tree, offset, i1+1, "Destination File: %s", pd+offset); + proto_tree_add_text(tftp_tree, offset, i1+1, "Destination File: %s", pd+offset); offset += i1 + 1; - proto_tree_add_item(tftp_tree, offset+2, END_OF_FRAME, "Type: %s",pd+offset); + proto_tree_add_text(tftp_tree, offset+2, END_OF_FRAME, "Type: %s",pd+offset); break; case DATA: - proto_tree_add_item(tftp_tree, offset, 2, "Data Packet"); + proto_tree_add_text(tftp_tree, offset, 2, "Data Packet"); offset += 2; i1 = pntohs(pd+offset); - proto_tree_add_item(tftp_tree, offset, 2, "Block = %u", i1); + proto_tree_add_text(tftp_tree, offset, 2, "Block = %u", i1); offset += 2; - proto_tree_add_item(tftp_tree, offset, END_OF_FRAME, + proto_tree_add_text(tftp_tree, offset, END_OF_FRAME, "Data (%d bytes)", END_OF_FRAME); break; case ACK: - proto_tree_add_item(tftp_tree, offset, 2, "Acknowledgement"); + proto_tree_add_text(tftp_tree, offset, 2, "Acknowledgement"); offset += 2; i1 = pntohs(pd+offset); - proto_tree_add_item(tftp_tree, offset, END_OF_FRAME, "Block = %u", i1); + proto_tree_add_text(tftp_tree, offset, END_OF_FRAME, "Block = %u", i1); break; case ERROR: - proto_tree_add_item(tftp_tree, offset, 2, "Error Code"); + proto_tree_add_text(tftp_tree, offset, 2, "Error Code"); offset += 2; i1 = pntohs(pd+offset); - proto_tree_add_item(tftp_tree, offset, 2, "Code = %s", tftp_errors[i1 % 8]); + proto_tree_add_text(tftp_tree, offset, 2, "Code = %s", tftp_errors[i1 % 8]); offset += 2; - proto_tree_add_item(tftp_tree, offset, END_OF_FRAME, "Error Message: %s", pd + offset); + proto_tree_add_text(tftp_tree, offset, END_OF_FRAME, "Error Message: %s", pd + offset); break; default: - proto_tree_add_item(tftp_tree, offset, 2, "Unknown TFTP Request: %0X.", i1); + proto_tree_add_text(tftp_tree, offset, 2, "Unknown TFTP Request: %0X.", i1); offset += 2; - proto_tree_add_item(tftp_tree, offset, END_OF_FRAME, + proto_tree_add_text(tftp_tree, offset, END_OF_FRAME, "Data (%d bytes)", END_OF_FRAME); break; } diff --git a/packet-tr.c b/packet-tr.c index fce7be4279..a7eca11f17 100644 --- a/packet-tr.c +++ b/packet-tr.c @@ -2,7 +2,7 @@ * Routines for Token-Ring packet disassembly * Gilbert Ramirez * - * $Id: packet-tr.c,v 1.14 1999/06/16 20:14:51 gram Exp $ + * $Id: packet-tr.c,v 1.15 1999/07/07 22:51:56 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -36,36 +36,85 @@ #include #include "packet.h" #include "etypes.h" + +int proto_tr = -1; +int hf_tr_dst = -1; +int hf_tr_src = -1; +int hf_tr_dst_vendor = -1; +int hf_tr_src_vendor = -1; +int hf_tr_sr = -1; +int hf_tr_ac = -1; +int hf_tr_priority = -1; +int hf_tr_frame = -1; +int hf_tr_monitor_cnt = -1; +int hf_tr_priority_reservation = -1; +int hf_tr_fc = -1; +int hf_tr_fc_type = -1; +int hf_tr_fc_pcf = -1; +int hf_tr_rif_bytes = -1; +int hf_tr_broadcast = -1; +int hf_tr_max_frame_size = -1; +int hf_tr_direction = -1; +int hf_tr_rif = -1; +int hf_tr_rif_ring = -1; +int hf_tr_rif_bridge = -1; + +static const value_string ac_vals[] = { + { 0, "Token" }, + { 0x10, "Frame" }, + { 0, NULL } +}; + +static const value_string pcf_vals[] = { + { 0, "Normal buffer" }, + { 1, "Express buffer" }, + { 2, "Purge" }, + { 3, "Claim Token" }, + { 4, "Beacon" }, + { 5, "Active Monitor Present" }, + { 6, "Standby Monitor Present" }, + { 0, NULL }, +}; + +static const value_string frame_vals[] = { + { 0, "MAC" }, + { 64, "LLC" }, + { 128, "Reserved" }, + { 0, NULL }, +}; + +static const value_string broadcast_vals[] = { + { 0 << 5, "Non-broadcast" }, + { 1 << 5, "Non-broadcast" }, + { 2 << 5, "Non-broadcast" }, + { 3 << 5, "Non-broadcast" }, + { 4 << 5, "All-routes broadcast" }, + { 5 << 5, "All-routes broadcast" }, + { 6 << 5, "Single-route broadcast" }, + { 7 << 5, "Single-route broadcast" }, + { 0, NULL } +}; + +static const value_string max_frame_size_vals[] = { + { 0, "516" }, + { 1, "1500" }, + { 2, "2052" }, + { 3, "4472" }, + { 4, "8144" }, + { 5, "11407" }, + { 6, "17800" }, + { 0, NULL } +}; + +static const value_string direction_vals[] = { + { 0, "From originating station (-->)" }, + { 128, "To originating station (<--)" }, + { 0, NULL } +}; static void add_ring_bridge_pairs(int rcf_len, const u_char *pd, proto_tree *tree); -static char* -sr_broadcast(u_char val) { - - if (val < 4) { - return "Non-broadcast"; - } - else if (val < 6) { - return "All-routes broadcast"; - } - else { - return "Single-route broadcast"; - } -} - -static int -sr_frame(u_char val) { - - int rc_frame[7] = { 516, 1500, 2052, 4472, 8144, 11407, 17800 }; - - if (val > 6) { - return -1; - } - else return rc_frame[val]; -} - - void capture_tr(const u_char *pd, guint32 cap_len, packet_counts *ld) { @@ -115,10 +164,6 @@ capture_tr(const u_char *pd, guint32 cap_len, packet_counts *ld) { source_routed = 1; } -/* else { - printf("0e+%d = %02X 0f+%d = %02X\n", trn_rif_bytes, pd[0x0e + trn_rif_bytes], - trn_rif_bytes, pd[0x0f + trn_rif_bytes]); - } */ } @@ -163,7 +208,7 @@ capture_tr(const u_char *pd, guint32 cap_len, packet_counts *ld) { void dissect_tr(const u_char *pd, frame_data *fd, proto_tree *tree) { - proto_tree *fh_tree, *bf_tree; + proto_tree *tr_tree, *bf_tree; proto_item *ti; int offset = 14; @@ -184,35 +229,9 @@ dissect_tr(const u_char *pd, frame_data *fd, proto_tree *tree) { guint8 trn_shost_nonsr[6]; - static const value_string ac_vals[] = { - { 0, "Token" }, - { 0x10, "Frame" }, - { 0, NULL } - }; - - static const value_string pcf_vals[] = { - { 0, "Normal buffer" }, - { 1, "Express buffer" }, - { 2, "Purge" }, - { 3, "Claim Token" }, - { 4, "Beacon" }, - { 5, "Active Monitor Present" }, - { 6, "Standby Monitor Present" }, - { 0, NULL }, - }; - - static const value_string frame_vals[] = { - { 0, "MAC" }, - { 64, "LLC" }, - { 128, "Reserved" }, - { 0, NULL }, - }; /* Token-Ring Strings */ char *fc[] = { "MAC", "LLC", "Reserved", "Unknown" }; - char *rc_arrow[] = { "-->", "<--" }; - char *rc_direction[] = { "From originating station", - "To originating station" }; /* get the data */ memcpy(&trn_ac, &pd[0], sizeof(guint8)); @@ -296,60 +315,61 @@ dissect_tr(const u_char *pd, frame_data *fd, proto_tree *tree) { /* protocol analysis tree */ if (tree) { - ti = proto_tree_add_item(tree, 0, 14 + actual_rif_bytes, "Token-Ring"); - fh_tree = proto_tree_new(); - proto_item_add_subtree(ti, fh_tree, ETT_TOKEN_RING); + /* Create Token-Ring Tree */ + ti = proto_tree_add_item(tree, proto_tr, 0, 14 + actual_rif_bytes, NULL); + tr_tree = proto_item_add_subtree(ti, ETT_TOKEN_RING); - ti = proto_tree_add_item(fh_tree, 0, 1, "Access Control (0x%02x)", trn_ac); - bf_tree = proto_tree_new(); - proto_item_add_subtree(ti, bf_tree, ETT_TOKEN_RING_AC); + /* Create the Access Control bitfield tree */ + ti = proto_tree_add_item_format(tr_tree, hf_tr_ac, 0, 1, trn_ac, + "Access Control (0x%02x)", trn_ac); + bf_tree = proto_item_add_subtree(ti, ETT_TOKEN_RING_AC); - proto_tree_add_item(bf_tree, 0, 1, "%s", + proto_tree_add_item_format(bf_tree, hf_tr_priority, 0, 1, trn_ac & 0xe0, decode_numeric_bitfield(trn_ac, 0xe0, 8, "Priority = %d")); - proto_tree_add_item(bf_tree, 0, 1, "%s", + proto_tree_add_item_format(bf_tree, hf_tr_frame, 0, 1, trn_ac & 0x10, decode_enumerated_bitfield(trn_ac, 0x10, 8, ac_vals, "%s")); - proto_tree_add_item(bf_tree, 0, 1, "%s", + proto_tree_add_item_format(bf_tree, hf_tr_monitor_cnt, 0, 1, trn_ac & 0x08, decode_numeric_bitfield(trn_ac, 0x08, 8, "Monitor Count")); - proto_tree_add_item(bf_tree, 0, 1, "%s", + proto_tree_add_item_format(bf_tree, hf_tr_priority_reservation, 0, 1, trn_ac & 0x07, decode_numeric_bitfield(trn_ac, 0x07, 8, "Priority Reservation = %d")); + /* Create the Frame Control bitfield tree */ + ti = proto_tree_add_item_format(tr_tree, hf_tr_fc, 1, 1, trn_fc, + "Frame Control (0x%02x)", trn_fc); + bf_tree = proto_item_add_subtree(ti, ETT_TOKEN_RING_FC); - ti = proto_tree_add_item(fh_tree, 1, 1, "Frame Control (0x%02x)", trn_fc); - bf_tree = proto_tree_new(); - proto_item_add_subtree(ti, bf_tree, ETT_TOKEN_RING_FC); - - proto_tree_add_item(bf_tree, 1, 1, "%s", + proto_tree_add_item_format(bf_tree, hf_tr_fc_type, 1, 1, trn_fc & 0xc0, decode_enumerated_bitfield(trn_fc, 0xc0, 8, frame_vals, "%s")); - proto_tree_add_item(bf_tree, 1, 1, "%s", + proto_tree_add_item_format(bf_tree, hf_tr_fc_pcf, 1, 1, trn_fc & 0x0f, decode_enumerated_bitfield(trn_fc, 0x0f, 8, pcf_vals, "%s")); - proto_tree_add_item(fh_tree, 2, 6, "Destination: %s", - ether_to_str((guint8 *) trn_dhost)); - proto_tree_add_item(fh_tree, 8, 6, "Source: %s", - ether_to_str((guint8 *) trn_shost)); + proto_tree_add_item(tr_tree, hf_tr_dst, 2, 6, trn_dhost); + proto_tree_add_item_hidden(tr_tree, hf_tr_dst_vendor, 2, 3, trn_dhost); + proto_tree_add_item(tr_tree, hf_tr_src, 8, 6, trn_shost); + proto_tree_add_item_hidden(tr_tree, hf_tr_src_vendor, 8, 3, trn_shost); + proto_tree_add_item_hidden(tr_tree, hf_tr_sr, 8, 1, source_routed); - if (source_routed) { - proto_tree_add_item(fh_tree, 14, 1, "RIF length: %d bytes", trn_rif_bytes); + /* non-source-routed version of src addr */ + proto_tree_add_item_hidden(tr_tree, hf_tr_src, 8, 6, trn_shost_nonsr); + proto_tree_add_item_hidden(tr_tree, hf_tr_src_vendor, 8, 3, trn_shost_nonsr); - proto_tree_add_item(fh_tree, 15, 1, - "%s, up to %d bytes in frame (LF=%d)", - sr_broadcast((pd[14] & 224) >> 5), - sr_frame((pd[15] & 112) >> 4), - (pd[15] & 112) >> 4); + if (source_routed) { + /* RCF Byte 1 */ + proto_tree_add_item(tr_tree, hf_tr_rif_bytes, 14, 1, trn_rif_bytes); + proto_tree_add_item(tr_tree, hf_tr_broadcast, 14, 1, pd[14] & 224); - proto_tree_add_item(fh_tree, 15, 1, - "Direction: %s (%s)", - rc_direction[(pd[15] & 128) >> 7], - rc_arrow[(pd[15] & 128) >> 7]); + /* RCF Byte 2 */ + proto_tree_add_item(tr_tree, hf_tr_max_frame_size, 15, 1, pd[15] & 112); + proto_tree_add_item(tr_tree, hf_tr_direction, 15, 1, pd[15] & 128); /* if we have more than 2 bytes of RIF, then we have ring/bridge pairs */ if (trn_rif_bytes > 2) { - add_ring_bridge_pairs(trn_rif_bytes, pd, fh_tree); + add_ring_bridge_pairs(trn_rif_bytes, pd, tr_tree); } } @@ -363,24 +383,11 @@ dissect_tr(const u_char *pd, frame_data *fd, proto_tree *tree) { tcpdump. W/o that, however, I'm guessing that DSAP == SSAP if the frame type is LLC. It's very much a hack. -- Gilbert Ramirez */ if (actual_rif_bytes > trn_rif_bytes) { - /*printf("trn_rif %d actual_rif %d\n", trn_rif_bytes, actual_rif_bytes);*/ - proto_tree_add_item(fh_tree, 14 + trn_rif_bytes, actual_rif_bytes - trn_rif_bytes, + proto_tree_add_text(tr_tree, 14 + trn_rif_bytes, actual_rif_bytes - trn_rif_bytes, "Empty RIF from Linux 2.0.x driver. The sniffing NIC " "is also running a protocol stack."); } - /* - if (source_routed && (trn_rif_bytes == 2) && silly_linux) { - proto_tree_add_item(fh_tree, 14 + trn_rif_bytes, 18 - actual_rif_bytes, - "Empty RIF from Linux 2.0.x driver. The sniffing NIC " - "is also running a protocol stack."); - } - else if ((!source_routed) && silly_linux ) { - proto_tree_add_item(fh_tree, 14, 18, - "Empty RIF from Linux 2.0.x driver. The sniffing NIC " - "is also running a protocol stack."); - }*/ } - /* The package is either MAC or LLC */ switch (frame_type) { /* MAC */ @@ -416,17 +423,46 @@ add_ring_bridge_pairs(int rcf_len, const u_char *pd, proto_tree *tree) if (j==1) { segment=pntohs(&pd[16]) >> 4; size = sprintf(buffer, "%03X",segment); + proto_tree_add_item_hidden(tree, hf_tr_rif_ring, 16, 2, segment); buff_offset += size; } segment=pntohs(&pd[17+j]) >> 4; brdgnmb=pd[16+j] & 0x0f; size = sprintf(buffer+buff_offset, "-%01X-%03X",brdgnmb,segment); + proto_tree_add_item_hidden(tree, hf_tr_rif_ring, 17+j, 2, segment); + proto_tree_add_item_hidden(tree, hf_tr_rif_bridge, 16+j, 1, brdgnmb); buff_offset += size; } + proto_tree_add_item(tree, hf_tr_rif, 16, rcf_len << 1, buffer); +} - proto_tree_add_item(tree, 16, rcf_len << 1, - "Ring-Bridge Pairs: %s", - buffer); +void +proto_register_tr(void) +{ + const hf_register_info hf[] = { + { "Access Control", "tr.ac", &hf_tr_ac, FT_UINT8, NULL }, + { "Priority", "tr.priority", &hf_tr_priority, FT_UINT8, NULL }, + { "Frame", "tr.frame", &hf_tr_frame, FT_VALS_UINT8, VALS(ac_vals) }, + { "Monitor Count", "tr.monitor_cnt", &hf_tr_monitor_cnt, FT_UINT8, NULL }, + { "Priority Reservation","tr.priority_reservation", &hf_tr_priority_reservation, FT_UINT8, NULL }, + { "Frame Control", "tr.fc", &hf_tr_fc, FT_UINT8, NULL }, + { "Frame Type", "tr.frame_type", &hf_tr_fc_type, FT_VALS_UINT8, VALS(frame_vals) }, + { "Frame PCF", "tr.frame_pcf", &hf_tr_fc_pcf, FT_VALS_UINT8, VALS(pcf_vals) }, + { "Destination", "tr.dst", &hf_tr_dst, FT_ETHER, NULL }, + { "Source", "tr.src", &hf_tr_src, FT_ETHER, NULL }, + { "Destination Hardware Vendor", "tr.dst_vendor", &hf_tr_dst_vendor, FT_ETHER_VENDOR, NULL }, + { "Source Hardware Vendor", "tr.src_vendor", &hf_tr_src_vendor, FT_ETHER_VENDOR, NULL }, + { "Source Routed", "tr.sr", &hf_tr_sr, FT_BOOLEAN, NULL }, + { "RIF Bytes", "tr.rif_bytes", &hf_tr_rif_bytes, FT_UINT8, NULL }, + { "Broadcast Type", "tr.broadcast", &hf_tr_broadcast, FT_VALS_UINT8, VALS(broadcast_vals) }, + { "Maximum Frame Size", "tr.max_frame_size", &hf_tr_max_frame_size, FT_VALS_UINT8, VALS(max_frame_size_vals) }, + { "Direction", "tr.direction", &hf_tr_direction, FT_VALS_UINT8, VALS(direction_vals) }, + { "Ring-Bridge Pairs", "tr.rif", &hf_tr_rif, FT_STRING, NULL }, + { "RIF Ring", "tr.rif_ring", &hf_tr_rif_ring, FT_UINT16, NULL }, + { "RIF Bridge", "tr.rif_bridge", &hf_tr_rif_bridge, FT_UINT8, NULL }, + }; + proto_tr = proto_register_protocol("Token-Ring", "tr"); + proto_register_field_array(proto_tr, hf, array_length(hf)); } diff --git a/packet-trmac.c b/packet-trmac.c index 5bba8b17f2..ff58766fc8 100644 --- a/packet-trmac.c +++ b/packet-trmac.c @@ -2,7 +2,7 @@ * Routines for Token-Ring Media Access Control * Gilbert Ramirez * - * $Id: packet-trmac.c,v 1.11 1999/03/23 03:14:44 gram Exp $ + * $Id: packet-trmac.c,v 1.12 1999/07/07 22:51:56 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -81,161 +81,159 @@ sv_text(const u_char *pd, int pkt_offset, proto_tree *tree) u_char errors[6]; /* isolating or non-isolating */ /* this just adds to the clutter on the screen... - proto_tree_add_item(tree, pkt_offset, 1, + proto_tree_add_text(tree, pkt_offset, 1, "Subvector Length: %d bytes", sv_length);*/ switch(pd[1]) { case 0x01: /* Beacon Type */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Beacon Type: %s", beacon[ pntohs( &pd[2] ) ] ); break; case 0x02: /* NAUN */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "NAUN: %s", ether_to_str((guint8*)&pd[2])); break; case 0x03: /* Local Ring Number */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Local Ring Number: 0x%04X (%d)", pntohs( &pd[2] ), pntohs( &pd[2] )); break; case 0x04: /* Assign Physical Location */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Assign Physical Location: 0x%08X", pntohl( &pd[2] ) ); break; case 0x05: /* Soft Error Report Value */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Soft Error Report Value: %d ms", 10 * pntohs( &pd[2] ) ); break; case 0x06: /* Enabled Function Classes */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Enabled Function Classes: %04X", pntohs( &pd[2] ) ); break; case 0x07: /* Allowed Access Priority */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Allowed Access Priority: %04X", pntohs( &pd[2] ) ); break; case 0x09: /* Correlator */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Correlator: %04X", pntohs( &pd[2] ) ); break; case 0x0A: /* Address of last neighbor notification */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Address of Last Neighbor Notification: %s", ether_to_str((guint8*)&pd[2])); break; case 0x0B: /* Physical Location */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Physical Location: 0x%08X", pntohl( &pd[2] ) ); break; case 0x20: /* Response Code */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Response Code: 0x%04X 0x%04X", pntohl( &pd[2] ), pntohl( &pd[4] ) ); break; case 0x21: /* Reserved */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Reserved: 0x%04X", pntohs( &pd[2] ) ); break; case 0x22: /* Product Instance ID */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Product Instance ID: ..."); break; case 0x23: /* Ring Station Microcode Level */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Ring Station Microcode Level: ..."); break; case 0x26: /* Wrap data */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Wrap Data: ... (%d bytes)", sv_length - 2); break; case 0x27: /* Frame Forward */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Frame Forward: ... (%d bytes)", sv_length - 2); break; case 0x29: /* Ring Station Status Subvector */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Ring Station Status Subvector: ..."); break; case 0x2A: /* Transmit Status Code */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Transmit Status Code: %04X", pntohs( &pd[2] ) ); break; case 0x2B: /* Group Address */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Group Address: %08X", pntohl( &pd[2] ) ); break; case 0x2C: /* Functional Address */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Functional Address: %08X", pntohl( &pd[2] ) ); break; case 0x2D: /* Isolating Error Counts */ memcpy(errors, &pd[2], 6); - ti = proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + ti = proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Isolating Error Counts (%d total)", errors[0] + errors[1] + errors[2] + errors[3] + errors[4]); - sv_tree = proto_tree_new(); - proto_item_add_subtree(ti, sv_tree, ETT_TR_IERR_CNT); + sv_tree = proto_item_add_subtree(ti, ETT_TR_IERR_CNT); - proto_tree_add_item(sv_tree, pkt_offset+2, 1, + proto_tree_add_text(sv_tree, pkt_offset+2, 1, "Line Errors: %d", errors[0]); - proto_tree_add_item(sv_tree, pkt_offset+3, 1, + proto_tree_add_text(sv_tree, pkt_offset+3, 1, "Internal Errors: %d", errors[1]); - proto_tree_add_item(sv_tree, pkt_offset+4, 1, + proto_tree_add_text(sv_tree, pkt_offset+4, 1, "Burst Errors: %d", errors[2]); - proto_tree_add_item(sv_tree, pkt_offset+5, 1, + proto_tree_add_text(sv_tree, pkt_offset+5, 1, "A/C Errors: %d", errors[3]); - proto_tree_add_item(sv_tree, pkt_offset+6, 1, + proto_tree_add_text(sv_tree, pkt_offset+6, 1, "Abort delimiter transmitted: %d", errors[4]); break; case 0x2E: /* Non-Isolating Error Counts */ memcpy(errors, &pd[2], 6); - ti = proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + ti = proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Non-Isolating Error Counts (%d total)", errors[0] + errors[1] + errors[2] + errors[3] + errors[4]); - sv_tree = proto_tree_new(); - proto_item_add_subtree(ti, sv_tree, ETT_TR_NERR_CNT); + sv_tree = proto_item_add_subtree(ti, ETT_TR_NERR_CNT); - proto_tree_add_item(sv_tree, pkt_offset+2, 1, + proto_tree_add_text(sv_tree, pkt_offset+2, 1, "Lost Frame Errors: %d", errors[0]); - proto_tree_add_item(sv_tree, pkt_offset+3, 1, + proto_tree_add_text(sv_tree, pkt_offset+3, 1, "Receiver Congestion: %d", errors[1]); - proto_tree_add_item(sv_tree, pkt_offset+4, 1, + proto_tree_add_text(sv_tree, pkt_offset+4, 1, "Frame-Copied Congestion: %d", errors[2]); - proto_tree_add_item(sv_tree, pkt_offset+5, 1, + proto_tree_add_text(sv_tree, pkt_offset+5, 1, "Frequency Errors: %d", errors[3]); - proto_tree_add_item(sv_tree, pkt_offset+6, 1, + proto_tree_add_text(sv_tree, pkt_offset+6, 1, "Token Errors: %d", errors[4]); break; case 0x30: /* Error Code */ - proto_tree_add_item(tree, pkt_offset+1, sv_length-1, + proto_tree_add_text(tree, pkt_offset+1, sv_length-1, "Error Code: %04X", pntohs( &pd[2] ) ); break; default: /* Unknown */ - proto_tree_add_item(tree, pkt_offset+1, 1, + proto_tree_add_text(tree, pkt_offset+1, 1, "Unknown Sub-Vector: 0x%02X", pd[1]); } return sv_length; @@ -255,10 +253,9 @@ dissect_trmac(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { mv_length = pntohs(&pd[offset]); if (tree) { - ti = proto_tree_add_item(tree, offset, mv_length, + ti = proto_tree_add_text(tree, offset, mv_length, "Media Access Control"); - mac_tree = proto_tree_new(); - proto_item_add_subtree(ti, mac_tree, ETT_TR_MAC); + mac_tree = proto_item_add_subtree(ti, ETT_TR_MAC); } /* Interpret the major vector */ @@ -272,16 +269,16 @@ dissect_trmac(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { if (tree) { if (mv_text) - proto_tree_add_item(mac_tree, offset+3, 1, "Major Vector Command: %s", + proto_tree_add_text(mac_tree, offset+3, 1, "Major Vector Command: %s", mv_text); else - proto_tree_add_item(mac_tree, offset+3, 1, "Major Vector Command: %02X (Unknown)", + proto_tree_add_text(mac_tree, offset+3, 1, "Major Vector Command: %02X (Unknown)", pd[offset+3]); - proto_tree_add_item(mac_tree, offset, 2, "Total Length: %d bytes", + proto_tree_add_text(mac_tree, offset, 2, "Total Length: %d bytes", mv_length); - proto_tree_add_item(mac_tree, offset+2, 1, "Source Class: %s", + proto_tree_add_text(mac_tree, offset+2, 1, "Source Class: %s", class[ pd[offset+2] & 0x0f ]); - proto_tree_add_item(mac_tree, offset+2, 1, "Destination Class: %s", + proto_tree_add_text(mac_tree, offset+2, 1, "Destination Class: %s", class[ pd[offset+2] >> 4 ]); /* interpret the subvectors */ diff --git a/packet-udp.c b/packet-udp.c index aaaa28c5f0..f020984bbb 100644 --- a/packet-udp.c +++ b/packet-udp.c @@ -1,7 +1,7 @@ /* packet-udp.c * Routines for UDP packet disassembly * - * $Id: packet-udp.c,v 1.18 1999/06/25 07:15:02 guy Exp $ + * $Id: packet-udp.c,v 1.19 1999/07/07 22:51:57 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -191,15 +191,14 @@ dissect_udp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { col_add_fstr(fd, COL_UNRES_DST_PORT, "%u", uh_dport); if (tree) { - ti = proto_tree_add_item(tree, offset, 8, "User Datagram Protocol"); - udp_tree = proto_tree_new(); - proto_item_add_subtree(ti, udp_tree, ETT_UDP); - proto_tree_add_item(udp_tree, offset, 2, "Source port: %s (%u)", + ti = proto_tree_add_text(tree, offset, 8, "User Datagram Protocol"); + udp_tree = proto_item_add_subtree(ti, ETT_UDP); + proto_tree_add_text(udp_tree, offset, 2, "Source port: %s (%u)", get_udp_port(uh_sport), uh_sport); - proto_tree_add_item(udp_tree, offset + 2, 2, "Destination port: %s (%u)", + proto_tree_add_text(udp_tree, offset + 2, 2, "Destination port: %s (%u)", get_udp_port(uh_dport), uh_dport); - proto_tree_add_item(udp_tree, offset + 4, 2, "Length: %u", uh_ulen); - proto_tree_add_item(udp_tree, offset + 6, 2, "Checksum: 0x%04x", uh_sum); + proto_tree_add_text(udp_tree, offset + 4, 2, "Length: %u", uh_ulen); + proto_tree_add_text(udp_tree, offset + 6, 2, "Checksum: 0x%04x", uh_sum); } /* Skip over header */ diff --git a/packet-vines.c b/packet-vines.c index 0df823efe0..72f036a6e2 100644 --- a/packet-vines.c +++ b/packet-vines.c @@ -1,7 +1,7 @@ /* packet-vines.c * Routines for Banyan VINES protocol packet disassembly * - * $Id: packet-vines.c,v 1.6 1999/03/23 03:14:45 gram Exp $ + * $Id: packet-vines.c,v 1.7 1999/07/07 22:51:57 gram Exp $ * * Don Lafontaine * @@ -84,11 +84,10 @@ dissect_vines_frp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree } if (tree) { - ti = proto_tree_add_item(tree, offset, 2, "Vines Fragmentation Protocol"); - vines_frp_tree = proto_tree_new(); - proto_item_add_subtree(ti, vines_frp_tree, ETT_VINES_FRP); - proto_tree_add_item(vines_frp_tree, offset, 1, "Control Flags: 0x%02x = %s fragment", vines_frp_ctrl, frp_flags_str); - proto_tree_add_item(vines_frp_tree, offset + 1, 1, "Sequence Number: 0x%02x", vines_frp_seqno); + ti = proto_tree_add_text(tree, offset, 2, "Vines Fragmentation Protocol"); + vines_frp_tree = proto_item_add_subtree(ti, ETT_VINES_FRP); + proto_tree_add_text(vines_frp_tree, offset, 1, "Control Flags: 0x%02x = %s fragment", vines_frp_ctrl, frp_flags_str); + proto_tree_add_text(vines_frp_tree, offset + 1, 1, "Sequence Number: 0x%02x", vines_frp_seqno); } /* Skip over header */ @@ -195,14 +194,13 @@ dissect_vines(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) */ if (tree) { - ti = proto_tree_add_item(tree, offset, (viph.vip_pktlen), "Vines IP"); - vip_tree = proto_tree_new(); - proto_item_add_subtree(ti, vip_tree, ETT_VINES); - proto_tree_add_item(vip_tree, offset, 2, "Packet checksum: 0x%04x", viph.vip_chksum); - proto_tree_add_item(vip_tree, offset + 2, 2, "Packet length: 0x%04x (%d)", viph.vip_pktlen, viph.vip_pktlen); - proto_tree_add_item(vip_tree, offset + 4, 1, "Transport control: 0x%02x", + ti = proto_tree_add_text(tree, offset, (viph.vip_pktlen), "Vines IP"); + vip_tree = proto_item_add_subtree(ti, ETT_VINES); + proto_tree_add_text(vip_tree, offset, 2, "Packet checksum: 0x%04x", viph.vip_chksum); + proto_tree_add_text(vip_tree, offset + 2, 2, "Packet length: 0x%04x (%d)", viph.vip_pktlen, viph.vip_pktlen); + proto_tree_add_text(vip_tree, offset + 4, 1, "Transport control: 0x%02x", viph.vip_tctl); - proto_tree_add_item(vip_tree, offset + 5, 1, "Protocol: 0x%02x", viph.vip_proto); + proto_tree_add_text(vip_tree, offset + 5, 1, "Protocol: 0x%02x", viph.vip_proto); } @@ -283,18 +281,17 @@ void dissect_vines_spp(const u_char *pd, int offset, frame_data *fd, proto_tree */ if (tree) { - ti = proto_tree_add_item(tree, offset, sizeof(viph), "Vines SPP"); - vspp_tree = proto_tree_new(); - proto_item_add_subtree(ti, vspp_tree, ETT_VINES_SPP); - proto_tree_add_item(vspp_tree, offset, 2, "Source port: 0x%04x", viph.vspp_sport); - proto_tree_add_item(vspp_tree, offset+2, 2, "Destination port: 0x%04x", viph.vspp_dport); - proto_tree_add_item(vspp_tree, offset+4, 1, "Packet type: 0x%02x", viph.vspp_pkttype); - proto_tree_add_item(vspp_tree, offset+5, 1, "Control: 0x%02x", viph.vspp_control); - proto_tree_add_item(vspp_tree, offset+6, 2, "Local Connection ID: 0x%04x", viph.vspp_lclid); - proto_tree_add_item(vspp_tree, offset+8, 2, "Remote Connection ID: 0x%04x", viph.vspp_rmtid); - proto_tree_add_item(vspp_tree, offset+10, 2, "Sequence number: 0x%04x", viph.vspp_seqno); - proto_tree_add_item(vspp_tree, offset+12, 2, "Ack number: 0x%04x", viph.vspp_ack); - proto_tree_add_item(vspp_tree, offset+14, 2, "Window: 0x%04x", viph.vspp_win); + ti = proto_tree_add_text(tree, offset, sizeof(viph), "Vines SPP"); + vspp_tree = proto_item_add_subtree(ti, ETT_VINES_SPP); + proto_tree_add_text(vspp_tree, offset, 2, "Source port: 0x%04x", viph.vspp_sport); + proto_tree_add_text(vspp_tree, offset+2, 2, "Destination port: 0x%04x", viph.vspp_dport); + proto_tree_add_text(vspp_tree, offset+4, 1, "Packet type: 0x%02x", viph.vspp_pkttype); + proto_tree_add_text(vspp_tree, offset+5, 1, "Control: 0x%02x", viph.vspp_control); + proto_tree_add_text(vspp_tree, offset+6, 2, "Local Connection ID: 0x%04x", viph.vspp_lclid); + proto_tree_add_text(vspp_tree, offset+8, 2, "Remote Connection ID: 0x%04x", viph.vspp_rmtid); + proto_tree_add_text(vspp_tree, offset+10, 2, "Sequence number: 0x%04x", viph.vspp_seqno); + proto_tree_add_text(vspp_tree, offset+12, 2, "Ack number: 0x%04x", viph.vspp_ack); + proto_tree_add_text(vspp_tree, offset+14, 2, "Window: 0x%04x", viph.vspp_win); } } diff --git a/packet.c b/packet.c index 162e33006a..f06d7046ef 100644 --- a/packet.c +++ b/packet.c @@ -1,7 +1,7 @@ /* packet.c * Routines for packet disassembly * - * $Id: packet.c,v 1.28 1999/06/22 03:39:06 guy Exp $ + * $Id: packet.c,v 1.29 1999/07/07 22:51:57 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -54,6 +54,11 @@ extern capture_file cf; +int proto_frame = -1; +int hf_frame_arrival_time = -1; +int hf_frame_packet_len = -1; +int hf_frame_capture_len = -1; + gchar * ether_to_str(const guint8 *ad) { static gchar str[3][18]; @@ -176,6 +181,50 @@ bytes_to_str(const guint8 *bd, int bd_len) { return cur; } +static const char *mon_names[12] = { + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" +}; + +gchar * +abs_time_to_str(struct timeval *abs_time) +{ + struct tm *tmp; + static gchar *cur; + static char str[3][3+1+2+2+4+1+2+1+2+1+2+1+4+1 + 5 /* extra */]; + + if (cur == &str[0][0]) { + cur = &str[1][0]; + } else if (cur == &str[1][0]) { + cur = &str[2][0]; + } else { + cur = &str[0][0]; + } + + tmp = localtime(&abs_time->tv_sec); + sprintf(cur, "%s %2d, %d %02d:%02d:%02d.%04ld", + mon_names[tmp->tm_mon], + tmp->tm_mday, + tmp->tm_year + 1900, + tmp->tm_hour, + tmp->tm_min, + tmp->tm_sec, + (long)abs_time->tv_usec/100); + + return cur; +} + + /* * Given a pointer into a data buffer, and to the end of the buffer, * find the end of the (putative) line at that position in the data @@ -396,7 +445,7 @@ match_strval(guint32 val, const value_string *vs) { return(vs[i].strptr); i++; } - + return(NULL); } @@ -485,7 +534,7 @@ decode_numeric_bitfield(guint32 val, guint32 mask, int width, gint check_col(frame_data *fd, gint el) { int i; - + if (fd->cinfo) { for (i = 0; i < fd->cinfo->num_cols; i++) { if (fd->cinfo->fmt_matx[i][el]) @@ -568,29 +617,13 @@ col_add_str(frame_data *fd, gint el, const gchar* str) { } } -static const char *mon_names[12] = { - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec" -}; - /* this routine checks the frame type from the cf structure */ void dissect_packet(const u_char *pd, frame_data *fd, proto_tree *tree) { proto_tree *fh_tree; proto_item *ti; - struct tm *tmp; - time_t then; + struct timeval tv; /* Put in frame header information. */ if (check_col(fd, COL_CLS_TIME)) @@ -603,31 +636,26 @@ dissect_packet(const u_char *pd, frame_data *fd, proto_tree *tree) col_add_delta_time(fd, COL_DELTA_TIME); if (tree) { - ti = proto_tree_add_item(tree, 0, fd->cap_len, - "Frame (%d on wire, %d captured)", - fd->pkt_len, fd->cap_len); - - fh_tree = proto_tree_new(); - proto_item_add_subtree(ti, fh_tree, ETT_FRAME); - then = fd->abs_secs; - tmp = localtime(&then); - proto_tree_add_item(fh_tree, 0, 0, - "Frame arrived on %s %2d, %d %02d:%02d:%02d.%04ld", - mon_names[tmp->tm_mon], - tmp->tm_mday, - tmp->tm_year + 1900, - tmp->tm_hour, - tmp->tm_min, - tmp->tm_sec, - (long)fd->abs_usecs/100); - - proto_tree_add_item(fh_tree, 0, 0, "Total frame length: %d bytes", - fd->pkt_len); - proto_tree_add_item(fh_tree, 0, 0, "Capture frame length: %d bytes", - fd->cap_len); + ti = proto_tree_add_item_format(tree, proto_frame, 0, fd->cap_len, + NULL, "Frame (%d on wire, %d captured)", fd->pkt_len, fd->cap_len); + + fh_tree = proto_item_add_subtree(ti, ETT_FRAME); + + tv.tv_sec = fd->abs_secs; + tv.tv_usec = fd->abs_usecs; + + proto_tree_add_item(fh_tree, hf_frame_arrival_time, + 0, 0, &tv); + + proto_tree_add_item_format(fh_tree, hf_frame_packet_len, + 0, 0, fd->pkt_len, "Packet Length: %d byte%s", fd->pkt_len, + plurality(fd->pkt_len, "", "s")); + + proto_tree_add_item_format(fh_tree, hf_frame_capture_len, + 0, 0, fd->cap_len, "Capture Length: %d byte%s", fd->cap_len, + plurality(fd->cap_len, "", "s")); } -#ifdef WITH_WIRETAP switch (fd->lnk_t) { case WTAP_ENCAP_ETHERNET : dissect_eth(pd, fd, tree); @@ -648,26 +676,33 @@ dissect_packet(const u_char *pd, frame_data *fd, proto_tree *tree) dissect_raw(pd, fd, tree); break; } -#else - switch (cf.lnk_t) { - case DLT_EN10MB : - dissect_eth(pd, fd, tree); - break; - case DLT_FDDI : - dissect_fddi(pd, fd, tree); - break; - case DLT_IEEE802 : - dissect_tr(pd, fd, tree); - break; - case DLT_NULL : - dissect_null(pd, fd, tree); - break; - case DLT_PPP : - dissect_ppp(pd, fd, tree); - break; - case DLT_RAW : - dissect_raw(pd, fd, tree); - break; - } -#endif +} + +void +proto_register_frame(void) +{ + proto_frame = proto_register_protocol ( + /* name */ "Frame", + /* abbrev */ "frame"); + + hf_frame_arrival_time = proto_register_field ( + /* name */ "Arrival Time", + /* abbrev */ "frame.time", + /* ftype */ FT_ABSOLUTE_TIME, + /* parent */ proto_frame, + /* vals[] */ NULL ); + + hf_frame_packet_len = proto_register_field( + /* name */ "Total Frame Length", + /* abbrev */ "frame.frame_len", + /* ftype */ FT_UINT32, + /* parent */ proto_frame, + /* vals[] */ NULL ); + + hf_frame_capture_len = proto_register_field( + /* name */ "Capture Frame Length", + /* abbrev */ "frame.cap_len", + /* ftype */ FT_UINT32, + /* parent */ proto_frame, + /* vals[] */ NULL ); } diff --git a/packet.h b/packet.h index 2b7955f1e3..ac45a52230 100644 --- a/packet.h +++ b/packet.h @@ -1,7 +1,7 @@ /* packet.h * Definitions for packet disassembly structures and routines * - * $Id: packet.h,v 1.64 1999/07/07 00:34:58 guy Exp $ + * $Id: packet.h,v 1.65 1999/07/07 22:51:58 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -27,6 +27,10 @@ #ifndef __PACKET_H__ #define __PACKET_H__ +#ifndef __PROTO_H__ +#include "proto.h" +#endif + /* Pointer versions of ntohs and ntohl. Given a pointer to a member of a * byte array, returns the value of the two or four bytes at the pointer. * The pletoh[sl] versions return the little-endian representation. @@ -65,12 +69,18 @@ #endif #endif +/* Useful when you have an array whose size you can tell at compile-time */ +#define array_length(x) (sizeof x / sizeof x[0]) + + /* Useful when highlighting regions inside a dissect_*() function. With this * macro, you can highlight from an arbitrary offset to the end of the * frame. See dissect_data() for an example. */ #define END_OF_FRAME (fd->cap_len - offset) - + +/* To pass one of two strings, singular or plural */ +#define plurality(d,s,p) ((d) == 1 ? (s) : (p)) typedef struct _column_info { gint num_cols; /* Number of columns */ @@ -102,9 +112,8 @@ typedef struct _frame_data { guint32 del_usecs; /* Delta microseconds */ long file_off; /* File offset */ column_info *cinfo; /* Column formatting information */ -#ifdef WITH_WIRETAP - int lnk_t; /* Per-packet encapsulation/data-link type */ -#endif + int lnk_t; /* Per-packet encapsulation/data-link type */ + gboolean passed_dfilter; /* TRUE = display, FALSE = no display */ } frame_data; typedef struct _packet_info { @@ -140,6 +149,7 @@ typedef struct tcp_extra_data { add_subtree() call. */ enum { + ETT_NONE, ETT_FRAME, ETT_IEEE8023, ETT_ETHER2, @@ -298,6 +308,7 @@ enum { /* Utility routines used by packet*.c */ gchar* ether_to_str(const guint8 *); gchar* ip_to_str(const guint8 *); +gchar* abs_time_to_str(struct timeval*); gchar* time_secs_to_str(guint32); gchar* bytes_to_str(const guint8 *, int); const u_char *find_line_end(const u_char *data, const u_char *dataend, @@ -327,25 +338,6 @@ void col_append_fstr(frame_data *, gint, gchar *, ...); void col_add_str(frame_data *, gint, const gchar *); void col_append_str(frame_data *, gint, gchar *); -/* Routines in packet.c */ - -typedef struct GtkWidget proto_tree; -typedef struct GtkWidget proto_item; - -struct GtkWidget; - -void proto_item_set_len(proto_item *ti, gint len); -proto_tree* proto_tree_new(void); -void proto_item_add_subtree(proto_item *ti, proto_tree *subtree, gint idx); - -#if __GNUC__ == 2 -proto_item* proto_tree_add_item(proto_tree *tree, gint start, gint len, - gchar *format, ...) - __attribute__((format (printf, 4, 5))); -#else -proto_item* proto_tree_add_item(proto_tree *tree, gint start, gint len, - gchar *format, ...); -#endif void dissect_packet(const u_char *, frame_data *, proto_tree *); /* @@ -448,12 +440,12 @@ void dissect_gre(const u_char *, int, frame_data *, proto_tree *); void init_dissect_udp(void); /* These functions are in ethertype.c */ -gchar *ethertype_to_str(guint16 etype, const char *fmt); void capture_ethertype(guint16 etype, int offset, const u_char *pd, guint32 cap_len, packet_counts *ld); void ethertype(guint16 etype, int offset, const u_char *pd, frame_data *fd, proto_tree *tree, - proto_tree *fh_tree); + proto_tree *fh_tree, int item_id); +extern const value_string etype_vals[]; /* These functions are in packet-arp.c */ gchar *arphrdaddr_to_str(guint8 *ad, int ad_len, guint16 type); diff --git a/print.c b/print.c index d9b5d36c47..53bba697e8 100644 --- a/print.c +++ b/print.c @@ -1,7 +1,7 @@ /* print.c * Routines for printing packet analysis trees. * - * $Id: print.c,v 1.10 1999/06/21 19:04:35 gram Exp $ + * $Id: print.c,v 1.11 1999/07/07 22:51:58 gram Exp $ * * Gilbert Ramirez * @@ -38,8 +38,8 @@ #endif #include "ethereal.h" -#include "gtkpacket.h" #include "packet.h" +#include "gtkpacket.h" #include "prefs.h" #include "print.h" #include "ps.h" diff --git a/proto.c b/proto.c new file mode 100644 index 0000000000..7bdd2f54b4 --- /dev/null +++ b/proto.c @@ -0,0 +1,620 @@ +/* proto.c + * Routines for protocol tree + * + * $Id: proto.c,v 1.1 1999/07/07 22:51:59 gram Exp $ + * + * Ethereal - Network traffic analyzer + * By Gerald Combs + * 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 +#endif + +#ifndef _STDIO_H +#include +#endif + +#include + +#ifndef _STRING_H +#include +#endif + +#ifdef NEED_SNPRINTF_H +# include "snprintf.h" +#endif + +#ifndef __G_LIB_H__ +#include +#endif + +#ifndef __PROTO_H__ +#include "proto.h" +#endif + +#ifndef __PACKET_H__ +#include "packet.h" +#endif + +#ifndef __RESOLV_H__ +#include "resolv.h" +#endif + +#define cVALS(x) (const value_string*)(x) + +static void +proto_tree_free_node(GNode *node, gpointer data); + +static struct header_field_info* +find_hfinfo_record(int hfindex); + +static proto_item * +proto_tree_add_item_value(proto_tree *tree, int hfindex, gint start, + gint length, int include_format, int visible, va_list ap); + +static gboolean proto_check_id(GNode *node, gpointer data); + +void dfilter_yacc_init(void); + +/* centralization of registration functions */ +void proto_register_data(void); +void proto_register_eth(void); +void proto_register_fddi(void); +void proto_register_frame(void); +void proto_register_ip(void); +void proto_register_llc(void); +void proto_register_null(void); +void proto_register_tr(void); + +int hf_text_only = 1; + +/* Contains information about protocols and header fields. Used when + * dissectors register their data */ +GMemChunk *gmc_hfinfo = NULL; + +/* Contains information about a field when a dissector calls + * proto_tree_add_item. */ +GMemChunk *gmc_field_info = NULL; + +/* String space for protocol and field items for the GUI */ +GMemChunk *gmc_item_labels = NULL; + +/* List which stores protocols and fields that have been registered */ +GPtrArray *gpa_hfinfo = NULL; + + +/* initialize data structures and register protocols and fields */ +void +proto_init(void) +{ + if (gmc_hfinfo) + g_mem_chunk_destroy(gmc_hfinfo); + if (gmc_field_info) + g_mem_chunk_destroy(gmc_field_info); + if (gmc_item_labels) + g_mem_chunk_destroy(gmc_item_labels); + if (gpa_hfinfo) + g_ptr_array_free(gpa_hfinfo, FALSE); /* ever needs to be TRUE? */ + + gmc_hfinfo = g_mem_chunk_new("gmc_hfinfo", + sizeof(struct header_field_info), 50 * sizeof(struct + header_field_info), G_ALLOC_ONLY); + gmc_field_info = g_mem_chunk_new("gmc_field_info", + sizeof(struct field_info), 200 * sizeof(struct field_info), + G_ALLOC_AND_FREE); + gmc_item_labels = g_mem_chunk_new("gmc_item_labels", + ITEM_LABEL_LENGTH, 20 * ITEM_LABEL_LENGTH, + G_ALLOC_AND_FREE); + gpa_hfinfo = g_ptr_array_new(); + + /* Have each dissector register its protocols and fields. The + * order doesn't matter. Put the calls in alphabetical order + * just to make it easy. */ + proto_register_data(); + proto_register_eth(); + proto_register_fddi(); + proto_register_frame(); + proto_register_ip(); + proto_register_llc(); + proto_register_null(); + proto_register_tr(); + + /* Register one special-case FT_TEXT_ONLY field for use when + converting ethereal to new-style proto_tree. These fields + are merely strings on the GUI tree; they are not filterable */ + hf_text_only = proto_register_field ( + /* name */ "Text", + /* abbrev */ "text", + /* ftype */ FT_TEXT_ONLY, + /* parent */ -1, + /* vals[] */ NULL ); + + dfilter_yacc_init(); +} + +/* frees the resources that the dissection a proto_tree uses */ +void +proto_tree_free(proto_tree *tree) +{ + g_node_traverse((GNode*)tree, G_IN_ORDER, G_TRAVERSE_ALL, -1, + (GNodeTraverseFunc)proto_tree_free_node, NULL); +} + +static void +proto_tree_free_node(GNode *node, gpointer data) +{ + field_info *fi = (field_info*) (node->data); + if (fi->representation) + g_mem_chunk_free(gmc_item_labels, fi->representation); + if (fi->hfinfo->type == FT_STRING) + g_free(fi->value.string); + g_mem_chunk_free(gmc_field_info, fi); +} + +/* Finds a record in the hf_info_records array. */ +static struct header_field_info* +find_hfinfo_record(int hfindex) +{ + g_assert(hfindex >= 0 && hfindex < gpa_hfinfo->len); + return g_ptr_array_index(gpa_hfinfo, hfindex); +} + +proto_item * +proto_tree_add_item(proto_tree *tree, int hfindex, gint start, gint length, ...) +{ + proto_item *pi; + va_list ap; + + va_start(ap, length); + pi = proto_tree_add_item_value(tree, hfindex, start, length, 0, 1, ap); + va_end(ap); + + return pi; +} + +proto_item * +proto_tree_add_item_hidden(proto_tree *tree, int hfindex, gint start, gint length, ...) +{ + proto_item *pi; + va_list ap; + + va_start(ap, length); + pi = proto_tree_add_item_value(tree, hfindex, start, length, 0, 0, ap); + va_end(ap); + + return pi; +} + +proto_item * +proto_tree_add_item_format(proto_tree *tree, int hfindex, gint start, gint length, ...) +{ + proto_item *pi; + va_list ap; + + va_start(ap, length); + pi = proto_tree_add_item_value(tree, hfindex, start, length, 1, 1, ap); + va_end(ap); + + return pi; +} + +proto_item * +proto_tree_add_text(proto_tree *tree, gint start, gint length, ...) +{ + proto_item *pi; + va_list ap; + + va_start(ap, length); + pi = proto_tree_add_item_value(tree, hf_text_only, start, length, 1, 1, ap); + va_end(ap); + + return pi; +} + +static proto_item * +proto_tree_add_item_value(proto_tree *tree, int hfindex, gint start, + gint length, int include_format, int visible, va_list ap) +{ + proto_item *pi; + field_info *fi; + char *junk, *format; + + if (!tree) + return(NULL); + + fi = g_mem_chunk_alloc(gmc_field_info); + + fi->hfinfo = find_hfinfo_record(hfindex); + g_assert(fi->hfinfo != NULL); + fi->start = start; + fi->length = length; + fi->tree_type = ETT_NONE; + fi->visible = visible; + +/* from the stdarg man page on Solaris 2.6: +NOTES + It is up to the calling routine to specify in some manner + how many arguments there are, since it is not always possi- + ble to determine the number of arguments from the stack + frame. For example, execl is passed a zero pointer to sig- + nal the end of the list. printf can tell how many arguments + there are by the format. It is non-portable to specify a + second argument of char, short, or float to va_arg, because + arguments seen by the called function are not char, short, + or float. C converts char and short arguments to int and + converts float arguments to double before passing them to a + function. +*/ + switch(fi->hfinfo->type) { + case FT_NONE: + junk = va_arg(ap, guint8*); + break; + + case FT_BOOLEAN: + fi->value.boolean = va_arg(ap, unsigned int) ? TRUE : FALSE; + break; + + case FT_UINT8: + case FT_VALS_UINT8: + fi->value.numeric = va_arg(ap, unsigned int); + break; + + case FT_UINT16: + case FT_VALS_UINT16: + fi->value.numeric = va_arg(ap, unsigned int); + break; + + case FT_UINT32: + case FT_VALS_UINT24: + case FT_VALS_UINT32: + case FT_RELATIVE_TIME: + case FT_IPv4: + case FT_IPXSERVER: + fi->value.numeric = va_arg(ap, guint32); + break; + + case FT_ETHER: + case FT_ETHER_VENDOR: +/* fi->value.ether = va_arg(ap, guint8*);*/ + memcpy(fi->value.ether, va_arg(ap, guint8*), 6); + break; + + case FT_ABSOLUTE_TIME: + memcpy(&fi->value.abs_time, va_arg(ap, struct timeval*), + sizeof(struct timeval)); + break; + + case FT_STRING: + fi->value.string = g_strdup(va_arg(ap, char*)); /* XXX */ + break; + + case FT_TEXT_ONLY: + ; /* nothing */ + break; + + default: + g_error("hfinfo->type %d not handled\n", fi->hfinfo->type); + break; + } + + pi = (proto_item*) g_node_new(fi); + g_node_append((GNode*)tree, (GNode*)pi); + + /* are there any formatting arguments? */ + if (visible && include_format) { + fi->representation = g_mem_chunk_alloc(gmc_item_labels); + format = va_arg(ap, char*); + vsnprintf(fi->representation, ITEM_LABEL_LENGTH, + format, ap); + } + else { + fi->representation = NULL; + } + + return pi; +} + +void +proto_item_set_len(proto_item *pi, gint length) +{ + field_info *fi = (field_info*) (((GNode*)pi)->data); + fi->length = length; +} + +proto_tree* +proto_tree_create_root(void) +{ + return (proto_tree*) g_node_new(NULL); +} + +proto_tree* +proto_item_add_subtree(proto_item *pi, gint idx) { + field_info *fi = (field_info*) (((GNode*)pi)->data); + fi->tree_type = idx; + return (proto_tree*) pi; +} + + +int +proto_register_protocol(char *name, char *abbrev) +{ + return proto_register_field(name, abbrev, FT_NONE, -1, NULL); +} + +void +proto_register_field_array(int parent, const hf_register_info *hf, int num_records) +{ + int field_id, i; + const hf_register_info *ptr = hf; + + for (i = 0; i < num_records; i++, ptr++) { + field_id = proto_register_field(ptr->name, ptr->abbrev, + ptr->type, parent, ptr->vals); + *ptr->p_id = field_id; + } +} + + +int +proto_register_field(char *name, char *abbrev, enum ftenum type, int parent, + struct value_string* vals) +{ + struct header_field_info *hfinfo; + + hfinfo = g_mem_chunk_alloc(gmc_hfinfo); + hfinfo->name = name; /* should I g_strdup? */ + hfinfo->abbrev = abbrev; /* should I g_strdup? */ + hfinfo->type = type; + hfinfo->parent = parent; /* this field differentiates protos and fields */ + hfinfo->vals = vals; + + g_assert((vals == NULL) || (type == FT_VALS_UINT8 || type == FT_VALS_UINT16 || + type == FT_VALS_UINT24 || type == FT_VALS_UINT32)); + + /* if we always add and never delete, then id == len - 1 is correct */ + g_ptr_array_add(gpa_hfinfo, hfinfo); + hfinfo->id = gpa_hfinfo->len - 1; + return hfinfo->id; +} + +void +proto_item_fill_label(field_info *fi, gchar *label_str) +{ + char *s; + + switch(fi->hfinfo->type) { + case FT_NONE: + snprintf(label_str, ITEM_LABEL_LENGTH, + "%s", fi->hfinfo->name); + break; + + case FT_BOOLEAN: + snprintf(label_str, ITEM_LABEL_LENGTH, + "%s: %s", fi->hfinfo->name, + fi->value.boolean == TRUE ? "True" : "False"); + break; + + case FT_UINT8: + case FT_UINT16: + case FT_UINT32: + snprintf(label_str, ITEM_LABEL_LENGTH, + "%s: %d", fi->hfinfo->name, + fi->value.numeric); + break; + + case FT_ABSOLUTE_TIME: + snprintf(label_str, ITEM_LABEL_LENGTH, + "%s: %s", fi->hfinfo->name, + abs_time_to_str(&fi->value.abs_time)); + break; + + case FT_VALS_UINT8: + s = match_strval(fi->value.numeric, cVALS(fi->hfinfo->vals)); + snprintf(label_str, ITEM_LABEL_LENGTH, + "%s: %s (0x%02x)", fi->hfinfo->name, + (s ? s : "Unknown"), fi->value.numeric); + break; + + case FT_VALS_UINT16: + s = match_strval(fi->value.numeric, cVALS(fi->hfinfo->vals)); + snprintf(label_str, ITEM_LABEL_LENGTH, + "%s: %s (0x%04x)", fi->hfinfo->name, + (s ? s : "Unknown"), fi->value.numeric); + break; + + case FT_VALS_UINT24: + s = match_strval(fi->value.numeric, cVALS(fi->hfinfo->vals)); + snprintf(label_str, ITEM_LABEL_LENGTH, + "%s: %s (0x%06x)", fi->hfinfo->name, + (s ? s : "Unknown"), fi->value.numeric); + break; + + + case FT_VALS_UINT32: + s = match_strval(fi->value.numeric, cVALS(fi->hfinfo->vals)); + snprintf(label_str, ITEM_LABEL_LENGTH, + "%s: %s (0x%08x)", fi->hfinfo->name, + (s ? s : "Unknown"), fi->value.numeric); + break; + + case FT_ETHER: + snprintf(label_str, ITEM_LABEL_LENGTH, + "%s: %s (%s)", fi->hfinfo->name, + ether_to_str(fi->value.ether), + get_ether_name(fi->value.ether)); + break; + + case FT_ETHER_VENDOR: + snprintf(label_str, ITEM_LABEL_LENGTH, + "%s: %02x:%02x:%02x (%s)", fi->hfinfo->name, + fi->value.ether[0], + fi->value.ether[1], + fi->value.ether[2], + get_manuf_name(fi->value.ether)); + break; + + case FT_IPv4: + snprintf(label_str, ITEM_LABEL_LENGTH, + "%s: %s (%s)", fi->hfinfo->name, + get_hostname(fi->value.numeric), + ip_to_str((guint8*)&fi->value.numeric)); + break; + + case FT_STRING: + snprintf(label_str, ITEM_LABEL_LENGTH, + "%s: %s", fi->hfinfo->name, fi->value.string); + break; + + default: + g_error("hfinfo->type %d not handled\n", fi->hfinfo->type); + break; + } +} + +int +proto_registrar_n(void) +{ + return gpa_hfinfo->len; +} + +char* +proto_registrar_get_abbrev(int n) +{ + struct header_field_info *hfinfo; + + hfinfo = find_hfinfo_record(n); + if (hfinfo) + return hfinfo->abbrev; + else + return NULL; +} + +int +proto_registrar_get_ftype(int n) +{ + struct header_field_info *hfinfo; + + hfinfo = find_hfinfo_record(n); + if (hfinfo) + return hfinfo->type; + else + return -1; +} + +int +proto_registrar_get_parent(int n) +{ + struct header_field_info *hfinfo; + + hfinfo = find_hfinfo_record(n); + if (hfinfo) + return hfinfo->parent; + else + return -2; +} + +gboolean +proto_registrar_is_protocol(int n) +{ + struct header_field_info *hfinfo; + + hfinfo = find_hfinfo_record(n); + if (hfinfo) + return (hfinfo->parent == -1 ? TRUE : FALSE); + else + return FALSE; +} + +typedef struct find_id_info { + int target; + GNode *result; +} find_id_info; + +/* looks for a protocol or a header field in a proto_tree. Assumes that protocols + * are at the top level, and header fields only occur underneath their parent's + * subtree. Returns NULL if field not found + */ +proto_item* +proto_find_field(proto_tree* tree, int id) +{ + find_id_info fiinfo; + int parent_protocol; + proto_tree *subtree; + + fiinfo.target = id; + fiinfo.result = NULL; + + /* do a quicker check if field is a protocol */ + if (proto_registrar_is_protocol(id) == TRUE) { + return proto_find_protocol(tree, id); + } + + /* find the field's parent protocol */ + parent_protocol = proto_registrar_get_parent(id); + subtree = proto_find_protocol(tree, parent_protocol); + + /* if there is a tree with that protocol, search it for the field */ + if (subtree) + g_node_traverse((GNode*)subtree, G_IN_ORDER, G_TRAVERSE_ALL, -1, proto_check_id, &fiinfo); + + return (proto_item*) fiinfo.result; +} + + +/* Looks for a protocol at the top layer of the tree. + * Assumption: a protocol can occur only once in a proto_tree. + */ +proto_item* +proto_find_protocol(proto_tree* tree, int protocol_id) +{ + find_id_info fiinfo; + + fiinfo.target = protocol_id; + fiinfo.result = NULL; + + g_node_traverse((GNode*)tree, G_IN_ORDER, G_TRAVERSE_ALL, 2, proto_check_id, &fiinfo); + return (proto_item*) fiinfo.result; +} + + +static gboolean +proto_check_id(GNode *node, gpointer data) +{ + field_info *fi = (field_info*) (node->data); + find_id_info *fiinfo = (find_id_info*) data; + + if (fi) { /* !fi == the top most container node which holds nothing */ + if (fi->hfinfo->id == fiinfo->target) { + fiinfo->result = node; + return TRUE; /* halt traversal */ + } + } + return FALSE; /* keep traversing */ +} + +void +proto_get_field_values(proto_tree* subtree, GNodeTraverseFunc fill_array_func, proto_tree_search_info *sinfo) +{ + g_node_traverse((GNode*)subtree, G_IN_ORDER, G_TRAVERSE_ALL, -1, fill_array_func, sinfo); +} diff --git a/proto.h b/proto.h new file mode 100644 index 0000000000..59bede3fa8 --- /dev/null +++ b/proto.h @@ -0,0 +1,165 @@ +/* proto.h + * Definitions for protocol display + * + * $Id: proto.h,v 1.1 1999/07/07 22:51:59 gram Exp $ + * + * Ethereal - Network traffic analyzer + * By Gerald Combs + * 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 __PROTO_H__ +#define __PROTO_H__ + +#ifdef HAVE_SYS_TIME_H + #ifndef _SYS_TIME_H + #include + #endif +#endif + +/* needs glib.h */ +typedef struct GNode proto_tree; +typedef struct GNode proto_item; +struct value_string; + +#define ITEM_LABEL_LENGTH 240 + +/* In order to make a const value_string[] look like a value_string*, I + * need this macro */ +#define VALS(x) (struct value_string*)(x) + + +/* field types */ +enum ftenum { + FT_NONE, /* used for protocol labels (thus no field type) */ + FT_BOOLEAN, /* TRUE and FALSE come from */ + FT_UINT8, + FT_UINT16, + FT_UINT32, + FT_ABSOLUTE_TIME, + FT_RELATIVE_TIME, + FT_STRING, + FT_ETHER, + FT_ETHER_VENDOR, + FT_BYTES, + FT_IPv4, + FT_IPv6, + FT_IPXSERVER, + FT_VALS_UINT8, + FT_VALS_UINT16, + FT_VALS_UINT24, + FT_VALS_UINT32, + FT_TEXT_ONLY, /* non-filterable, used when converting ethereal + from old-style proto_tree to new-style proto_tree */ + NUM_FIELD_TYPES /* last item number plus one */ +}; + + +typedef struct header_field_info { + char *name; + char *abbrev; + enum ftenum type; + int parent; + struct value_string *vals; + int id; /* assigned by order of registration */ +/* int color; for use by GUI code */ +} header_field_info; + +/*extern struct header_field_info hfinfo[];*/ + +/* Used when registering many fields at once */ +typedef struct hf_register_info { + char *name; + char *abbrev; + int *p_id; /* pointer to int; written to by register() function */ + enum ftenum type; + struct value_string *vals; +} hf_register_info; + + +/* Info stored in each proto_item GNode */ +typedef struct field_info { + struct header_field_info *hfinfo; + gint start; + gint length; + gint tree_type; /* ETT_* */ + char *representation; /* for GUI tree */ + int visible; + union { + gboolean boolean; + guint32 numeric; + struct timeval abs_time; /* the whole struct, not a pointer */ + gchar *string; + guint8 ether[6]; + } value; +} field_info; + + +typedef struct proto_tree_search_info { + int target_field; + GArray *result_array; + guint8 *packet_data; +} proto_tree_search_info; + +void proto_init(void); +void proto_item_set_len(proto_item *ti, gint length); +proto_tree* proto_tree_create_root(void); +void proto_tree_free(proto_tree *tree); +proto_tree* proto_item_add_subtree(proto_item *ti, gint idx); + +int +proto_register_field(char *name, char *abbrev, enum ftenum type, int parent, + struct value_string* vals); + +int +proto_register_protocol(char *name, char *abbrev); + +void +proto_register_field_array(int parent, const hf_register_info *hf, int num_records); + +proto_item * +proto_tree_add_item(proto_tree *tree, int hfindex, gint start, + gint length, ...); + +proto_item * +proto_tree_add_item_hidden(proto_tree *tree, int hfindex, gint start, + gint length, ...); + +proto_item * +proto_tree_add_item_format(proto_tree *tree, int hfindex, gint start, + gint length, ...); + +proto_item * +proto_tree_add_text(proto_tree *tree, gint start, gint length, ...); + +void +proto_item_fill_label(field_info *fi, gchar *label_str); + +/* useful functions for external routines to get info about registered protos and fields */ +int proto_registrar_n(void); +char* proto_registrar_get_abbrev(int n); +int proto_registrar_get_ftype(int n); +int proto_registrar_get_parent(int n); +gboolean proto_registrar_is_protocol(int n); +proto_item* proto_find_field(proto_tree* tree, int id); +proto_item* proto_find_protocol(proto_tree* tree, int protocol_id); +void proto_get_field_values(proto_tree* subtree, GNodeTraverseFunc fill_array_func, + proto_tree_search_info *sinfo); + +#endif /* proto.h */ diff --git a/resolv.c b/resolv.c index cb46eb3e0d..3d44e15121 100644 --- a/resolv.c +++ b/resolv.c @@ -1,7 +1,7 @@ /* resolv.c * Routines for network object lookup * - * $Id: resolv.c,v 1.6 1999/03/28 18:32:00 gram Exp $ + * $Id: resolv.c,v 1.7 1999/07/07 22:51:59 gram Exp $ * * Laurent Deniel * @@ -284,7 +284,6 @@ static u_char *host_name_lookup6(struct e_in6_addr *addr) /* unknown host or DNS timeout */ #endif /* INET6 */ sprintf(name, "%s", ip6_to_str(addr)); - return (name); } @@ -834,3 +833,25 @@ extern u_char *get_manuf_name(u_char *addr) return manufp->name; } /* get_manuf_name */ + + + +/* return IP address of either hostname or IP address in text format. + * Used more in the dfilter parser rather than in packet dissectors */ +unsigned long get_host_ipaddr(const char *host) +{ + struct hostent *hp = NULL; + unsigned long ipaddr; + + hp = gethostbyname(host); + if (hp == NULL) { + hp = gethostbyaddr(host, strlen(host), AF_INET); + if (hp == NULL) { + return 0; + } + } + + memcpy(&ipaddr, hp->h_addr, hp->h_length); + + return ntohl(ipaddr); +} diff --git a/resolv.h b/resolv.h index 31e04d1b03..4782f60f30 100644 --- a/resolv.h +++ b/resolv.h @@ -1,7 +1,7 @@ /* resolv.h * Definitions for network object lookup * - * $Id: resolv.h,v 1.4 1999/03/28 18:32:01 gram Exp $ + * $Id: resolv.h,v 1.5 1999/07/07 22:51:59 gram Exp $ * * Laurent Deniel * @@ -72,4 +72,7 @@ extern u_char *get_ether_addr(u_char *name); /* adds a hostname/IP in the hash table */ extern void add_host_name(u_int addr, u_char *name); +/* Returns IP address for a string representing the hostname or dotted-decial IP address */ +unsigned long get_host_ipaddr(const char *host); + #endif /* __RESOLV_H__ */ diff --git a/summary.c b/summary.c index ca98e0b036..85816a697a 100644 --- a/summary.c +++ b/summary.c @@ -1,7 +1,7 @@ /* summary.c * Routines for capture file summary window * - * $Id: summary.c,v 1.2 1999/07/04 06:41:19 guy Exp $ + * $Id: summary.c,v 1.3 1999/07/07 22:52:00 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -83,7 +83,6 @@ extern capture_file cf; char * string_for_format(guint16 cd_t){ switch (cd_t) { -#ifdef WITH_WIRETAP case WTAP_FILE_WTAP: return "wiretap"; case WTAP_FILE_PCAP: @@ -100,18 +99,6 @@ char * string_for_format(guint16 cd_t){ return "Network Monitor"; case WTAP_FILE_NETXRAY: return "NetXray/Sniffer Pro"; -#else - case CD_WIRE: - return "wiretap"; - case CD_SNOOP: - return "snoop"; - case CD_PCAP_BE: - return "pcap-be"; - case CD_PCAP_LE: - return "pcap-le"; - case CD_NA_UNCOMPR: - return "network-associates"; -#endif default: return "unknown"; } @@ -136,7 +123,8 @@ tally_frame_data(gpointer cf, gpointer st) { sum_tally->stop_time = cur_time; } sum_tally->bytes += cur_frame->pkt_len; - sum_tally->count++; + if (cur_frame->passed_dfilter) + sum_tally->filtered_count++; } void @@ -171,7 +159,7 @@ summary_prep_cb(GtkWidget *w, gpointer d) { st->stop_time = secs_usecs(first_frame->abs_secs,first_frame->abs_usecs) ; st->bytes = 0; - st->count = 0; + st->filtered_count = 0; cur_glist = cf.plist; for (i = 0; i < cf.count; i++){ @@ -238,6 +226,10 @@ seconds", seconds); snprintf(string_buff, SUM_STR_MAX, "Packet count: %i", cf.count); add_string_to_box(string_buff, data_box); + /* Filtered Packet count */ + snprintf(string_buff, SUM_STR_MAX, "Filtered packet count: %i", st->filtered_count); + add_string_to_box(string_buff, data_box); + /* Packets per second */ if (seconds > 0){ snprintf(string_buff, SUM_STR_MAX, "Avg. packets/sec: %.3f", @@ -279,15 +271,15 @@ traffic_bytes/seconds); } add_string_to_box(string_buff, capture_box); - /* Display filter */ - if (cf.dfilter) { + /* Display filter. The situation where cf.dfilter="" and cf.dfcode=NULL can exist, + so I'll check for both */ + if (cf.dfilter && cf.dfcode) { snprintf(string_buff, SUM_STR_MAX, "Display filter: %s", cf.dfilter); } else { sprintf(string_buff, "Display filter: none"); } add_string_to_box(string_buff, capture_box); - /* Capture filter */ if (cf.cfilter) { snprintf(string_buff, SUM_STR_MAX, "Capture filter: %s", cf.cfilter); @@ -295,11 +287,7 @@ traffic_bytes/seconds); sprintf(string_buff, "Capture filter: none"); } add_string_to_box(string_buff, capture_box); -#if (GTK_MINOR_VERSION > 1) || ((GTK_MICRO_VERSION > 1) && (GTK_MINOR_VERSION > 0)) gtk_window_set_position(GTK_WINDOW(sum_open_w), GTK_WIN_POS_MOUSE); -#else - gtk_window_position(GTK_WINDOW(sum_open_w), GTK_WIN_POS_MOUSE); -#endif gtk_widget_show(sum_open_w); } diff --git a/summary.h b/summary.h index 8e6ffba88b..915c0bf7a8 100644 --- a/summary.h +++ b/summary.h @@ -1,7 +1,7 @@ /* summary.h * Definitions for capture file summary windows * - * $Id: summary.h,v 1.1 1999/06/22 22:02:12 gram Exp $ + * $Id: summary.h,v 1.2 1999/07/07 22:52:00 gram Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -30,7 +30,7 @@ typedef struct _summary_tally { guint32 bytes; double start_time; double stop_time; - guint32 count; + guint32 filtered_count; } summary_tally; diff --git a/wiretap/ChangeLog b/wiretap/ChangeLog index 34dc54b7c4..9b7f7681cd 100644 --- a/wiretap/ChangeLog +++ b/wiretap/ChangeLog @@ -1,3 +1,6 @@ +July 7, 1999 + Removed display filter support. + May 12, 1999 Guy added support for Netmon 2.0 files. @@ -26,3 +29,4 @@ January 1, 1999 December 10, 1998 Proper timestamp calculations added to ngsniffer.c and lanalyzer.c + diff --git a/wiretap/Makefile.am b/wiretap/Makefile.am index 60bb34af84..77c3e73398 100644 --- a/wiretap/Makefile.am +++ b/wiretap/Makefile.am @@ -1,35 +1,12 @@ -bin_PROGRAMS = wiretap -noinst_LIBRARIES = @LIBWIRETAP_A@ +noinst_LIBRARIES = libwiretap.a -EXTRA_PROGRAMS = filterc -EXTRA_LIBRARIES = libwiretap.a - -EXTRA_DIST = \ - rt-grammar-skel.y \ - rt-scanner-skel.l \ - ct-grammar.y \ - ct-scanner.l \ - filter-eth \ - filter-tr +#EXTRA_LIBRARIES = libwiretap.a CLEANFILES = \ libwiretap.a \ - filterc \ - *~ \ - ct-grammar.c \ - ct-scanner.c \ - ct-grammar.h \ - rt-grammar.c \ - rt-grammar.y \ - rt-scanner.c \ - rt-scanner.l \ - rt-grammar.h + *~ libwiretap_a_SOURCES = \ - bpf.h \ - bpf.c \ - bpf-engine.c \ - bpf-engine.h \ buffer.c \ buffer.h \ config.h \ @@ -46,49 +23,7 @@ libwiretap_a_SOURCES = \ netxray.h \ ngsniffer.c \ ngsniffer.h \ - rt-compile.h \ - rt-compile.c \ - rt-global.h \ - rt-grammar.h \ - rt-grammar.y \ - rt-scanner.l \ snoop.c \ snoop.h \ wtap.c \ wtap.h - - -filterc_SOURCES = \ - ct-compile.c \ - ct-compile.h \ - ct-grammar.h \ - ct-grammar.y \ - ct-scanner.l \ - ct-main.c \ - glib-new.h \ - glib-new.c - -FILTERS = \ - filter-eth \ - filter-tr - -YFLAGS=-d -p wtap_ -LFLAGS=-i -Pwtap_ - -ct-scanner.c : ct-scanner.l - @rm -f $@ - $(LEX) $(LFLAGS) -t $< > $@ - -rt-grammar.y rt-scanner.l : rt-grammar-skel.y rt-scanner-skel.l $(FILTERS) - $(MAKE) filterc - cat $(FILTERS) | ./filterc > /dev/null - -rt-scanner.c : rt-scanner.l rt-grammar.c - @rm -f $@ - $(LEX) $(LFLAGS) -t $< > $@ - -wiretap_SOURCES = \ - wiretap.c \ - glib-new.c - -wiretap_LDADD = libwiretap.a diff --git a/wiretap/Makefile.in b/wiretap/Makefile.in index 1dfc16c40e..ac64d08b57 100644 --- a/wiretap/Makefile.in +++ b/wiretap/Makefile.in @@ -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 = : @@ -65,41 +66,21 @@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_CONFIG = @GTK_CONFIG@ GTK_LIBS = @GTK_LIBS@ LEX = @LEX@ -LIBWIRETAP_A = @LIBWIRETAP_A@ MAKEINFO = @MAKEINFO@ PACKAGE = @PACKAGE@ RANLIB = @RANLIB@ VERSION = @VERSION@ YACC = @YACC@ -bin_PROGRAMS = wiretap -noinst_LIBRARIES = @LIBWIRETAP_A@ +noinst_LIBRARIES = libwiretap.a -EXTRA_PROGRAMS = filterc -EXTRA_LIBRARIES = libwiretap.a +#EXTRA_LIBRARIES = libwiretap.a -EXTRA_DIST = rt-grammar-skel.y rt-scanner-skel.l ct-grammar.y ct-scanner.l filter-eth filter-tr +CLEANFILES = libwiretap.a *~ -CLEANFILES = libwiretap.a filterc *~ ct-grammar.c ct-scanner.c ct-grammar.h rt-grammar.c rt-grammar.y rt-scanner.c rt-scanner.l rt-grammar.h +libwiretap_a_SOURCES = buffer.c buffer.h config.h file.c iptrace.c iptrace.h lanalyzer.c lanalyzer.h libpcap.c libpcap.h netmon.c netmon.h netxray.c netxray.h ngsniffer.c ngsniffer.h snoop.c snoop.h wtap.c wtap.h - -libwiretap_a_SOURCES = bpf.h bpf.c bpf-engine.c bpf-engine.h buffer.c buffer.h config.h file.c iptrace.c iptrace.h lanalyzer.c lanalyzer.h libpcap.c libpcap.h netmon.c netmon.h netxray.c netxray.h ngsniffer.c ngsniffer.h rt-compile.h rt-compile.c rt-global.h rt-grammar.h rt-grammar.y rt-scanner.l snoop.c snoop.h wtap.c wtap.h - - -filterc_SOURCES = ct-compile.c ct-compile.h ct-grammar.h ct-grammar.y ct-scanner.l ct-main.c glib-new.h glib-new.c - - -FILTERS = filter-eth filter-tr - - -YFLAGS = -d -p wtap_ -LFLAGS = -i -Pwtap_ - -wiretap_SOURCES = wiretap.c glib-new.c - - -wiretap_LDADD = libwiretap.a ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs CONFIG_HEADER = config.h @@ -112,49 +93,31 @@ CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ libwiretap_a_LIBADD = -libwiretap_a_OBJECTS = bpf.o bpf-engine.o buffer.o file.o iptrace.o \ -lanalyzer.o libpcap.o netmon.o netxray.o ngsniffer.o rt-compile.o \ -rt-grammar.o rt-scanner.o snoop.o wtap.o +libwiretap_a_OBJECTS = buffer.o file.o iptrace.o lanalyzer.o libpcap.o \ +netmon.o netxray.o ngsniffer.o snoop.o wtap.o AR = ar -PROGRAMS = $(bin_PROGRAMS) - -filterc_OBJECTS = ct-compile.o ct-grammar.o ct-scanner.o ct-main.o \ -glib-new.o -filterc_LDADD = $(LDADD) -filterc_DEPENDENCIES = -filterc_LDFLAGS = -wiretap_OBJECTS = wiretap.o glib-new.o -wiretap_DEPENDENCIES = libwiretap.a -wiretap_LDFLAGS = -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LEXLIB = @LEXLIB@ -YLWRAP = $(top_srcdir)/../ylwrap CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ DIST_COMMON = README ./stamp-h.in AUTHORS COPYING ChangeLog INSTALL \ Makefile.am Makefile.in NEWS acconfig.h acinclude.m4 aclocal.m4 \ -config.h.in configure configure.in ct-grammar.c ct-scanner.c \ -rt-grammar.c rt-scanner.c +config.h.in configure configure.in DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) -TAR = tar +TAR = gtar GZIP_ENV = --best -DEP_FILES = .deps/bpf-engine.P .deps/bpf.P .deps/buffer.P \ -.deps/ct-compile.P .deps/ct-grammar.P .deps/ct-main.P \ -.deps/ct-scanner.P .deps/file.P .deps/glib-new.P .deps/iptrace.P \ +DEP_FILES = .deps/buffer.P .deps/file.P .deps/iptrace.P \ .deps/lanalyzer.P .deps/libpcap.P .deps/netmon.P .deps/netxray.P \ -.deps/ngsniffer.P .deps/rt-compile.P .deps/rt-grammar.P \ -.deps/rt-scanner.P .deps/snoop.P .deps/wiretap.P .deps/wtap.P -SOURCES = $(libwiretap_a_SOURCES) $(filterc_SOURCES) $(wiretap_SOURCES) -OBJECTS = $(libwiretap_a_OBJECTS) $(filterc_OBJECTS) $(wiretap_OBJECTS) +.deps/ngsniffer.P .deps/snoop.P .deps/wtap.P +SOURCES = $(libwiretap_a_SOURCES) +OBJECTS = $(libwiretap_a_OBJECTS) all: all-redirect .SUFFIXES: -.SUFFIXES: .S .c .l .o .s .y +.SUFFIXES: .S .c .o .s $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile @@ -228,46 +191,6 @@ libwiretap.a: $(libwiretap_a_OBJECTS) $(libwiretap_a_DEPENDENCIES) $(AR) cru libwiretap.a $(libwiretap_a_OBJECTS) $(libwiretap_a_LIBADD) $(RANLIB) libwiretap.a -mostlyclean-binPROGRAMS: - -clean-binPROGRAMS: - -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) - -distclean-binPROGRAMS: - -maintainer-clean-binPROGRAMS: - -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - $(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)/'`; \ - else :; fi; \ - done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - list='$(bin_PROGRAMS)'; for p in $$list; do \ - rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - done - -filterc: $(filterc_OBJECTS) $(filterc_DEPENDENCIES) - @rm -f filterc - $(LINK) $(filterc_LDFLAGS) $(filterc_OBJECTS) $(filterc_LDADD) $(LIBS) - -wiretap: $(wiretap_OBJECTS) $(wiretap_DEPENDENCIES) - @rm -f wiretap - $(LINK) $(wiretap_LDFLAGS) $(wiretap_OBJECTS) $(wiretap_LDADD) $(LIBS) -.l.c: - $(SHELL) $(YLWRAP) "$(LEX)" $< $(LEX_OUTPUT_ROOT).c $@ -- $(AM_LFLAGS) $(LFLAGS) -.y.c: - $(SHELL) $(YLWRAP) "$(YACC)" $< y.tab.c $*.c y.tab.h $*.h -- $(AM_YFLAGS) $(YFLAGS) -ct-grammar.h: ct-grammar.c -rt-grammar.h: rt-grammar.c - - tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) @@ -343,7 +266,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 \ @@ -393,7 +316,7 @@ installcheck: installcheck-am all-recursive-am: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive -install-exec-am: install-binPROGRAMS +install-exec-am: install-exec: install-exec-am install-data-am: @@ -402,14 +325,13 @@ install-data: install-data-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am install: install-am -uninstall-am: uninstall-binPROGRAMS +uninstall-am: uninstall: uninstall-am -all-am: Makefile $(LIBRARIES) $(PROGRAMS) config.h +all-am: Makefile $(LIBRARIES) config.h all-redirect: all-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install + $(MAKE) $(AM_MAKEFLAGS) INSTALL_STRIP_FLAG=-s install installdirs: - $(mkinstalldirs) $(DESTDIR)$(bindir) mostlyclean-generic: @@ -422,31 +344,29 @@ distclean-generic: -rm -f config.cache config.log stamp-h stamp-h[0-9]* maintainer-clean-generic: - -test -z "ct-scannerlrt-scannerlct-grammarhct-grammarcrt-grammarhrt-grammarc" || rm -f ct-scannerl rt-scannerl ct-grammarh ct-grammarc rt-grammarh rt-grammarc mostlyclean-am: mostlyclean-hdr mostlyclean-noinstLIBRARIES \ - mostlyclean-compile mostlyclean-binPROGRAMS \ - mostlyclean-tags mostlyclean-depend mostlyclean-generic + mostlyclean-compile mostlyclean-tags mostlyclean-depend \ + mostlyclean-generic mostlyclean: mostlyclean-am -clean-am: clean-hdr clean-noinstLIBRARIES clean-compile \ - clean-binPROGRAMS clean-tags clean-depend clean-generic \ - mostlyclean-am +clean-am: clean-hdr clean-noinstLIBRARIES clean-compile clean-tags \ + clean-depend clean-generic mostlyclean-am clean: clean-am distclean-am: distclean-hdr distclean-noinstLIBRARIES distclean-compile \ - distclean-binPROGRAMS distclean-tags distclean-depend \ - distclean-generic clean-am + distclean-tags distclean-depend distclean-generic \ + clean-am distclean: distclean-am -rm -f config.status maintainer-clean-am: maintainer-clean-hdr \ maintainer-clean-noinstLIBRARIES \ - maintainer-clean-compile maintainer-clean-binPROGRAMS \ - maintainer-clean-tags maintainer-clean-depend \ - maintainer-clean-generic distclean-am + maintainer-clean-compile maintainer-clean-tags \ + maintainer-clean-depend maintainer-clean-generic \ + distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." @@ -457,30 +377,16 @@ maintainer-clean: maintainer-clean-am mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \ clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ mostlyclean-compile distclean-compile clean-compile \ -maintainer-clean-compile mostlyclean-binPROGRAMS distclean-binPROGRAMS \ -clean-binPROGRAMS maintainer-clean-binPROGRAMS uninstall-binPROGRAMS \ -install-binPROGRAMS tags mostlyclean-tags distclean-tags clean-tags \ -maintainer-clean-tags distdir mostlyclean-depend distclean-depend \ -clean-depend maintainer-clean-depend info-am info dvi-am dvi check \ -check-am installcheck-am installcheck all-recursive-am install-exec-am \ -install-exec install-data-am install-data install-am install \ -uninstall-am uninstall all-redirect all-am all installdirs \ +maintainer-clean-compile tags mostlyclean-tags distclean-tags \ +clean-tags maintainer-clean-tags distdir mostlyclean-depend \ +distclean-depend clean-depend maintainer-clean-depend info-am info \ +dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \ +install-exec-am install-exec install-data-am install-data install-am \ +install uninstall-am uninstall all-redirect all-am all installdirs \ mostlyclean-generic distclean-generic clean-generic \ maintainer-clean-generic clean mostlyclean distclean maintainer-clean -ct-scanner.c : ct-scanner.l - @rm -f $@ - $(LEX) $(LFLAGS) -t $< > $@ - -rt-grammar.y rt-scanner.l : rt-grammar-skel.y rt-scanner-skel.l $(FILTERS) - $(MAKE) filterc - cat $(FILTERS) | ./filterc > /dev/null - -rt-scanner.c : rt-scanner.l rt-grammar.c - @rm -f $@ - $(LEX) $(LFLAGS) -t $< > $@ - # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/wiretap/aclocal.m4 b/wiretap/aclocal.m4 index f9344e6d59..6b96f7217a 100644 --- a/wiretap/aclocal.m4 +++ b/wiretap/aclocal.m4 @@ -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 @@ -218,6 +218,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] diff --git a/wiretap/bpf-engine.c b/wiretap/bpf-engine.c deleted file mode 100644 index d1bff53587..0000000000 --- a/wiretap/bpf-engine.c +++ /dev/null @@ -1,318 +0,0 @@ -/* bpf-engine.c - * ------------ - * The BPF engine used for offline ("display") filters in wiretap. - * The code is taken from the Linux Socket Filter, and only slightly - * modified for use in wiretap. - * - * Gilbert Ramirez - */ - -/* - * Linux Socket Filter - Kernel level socket filtering - * - * Author: - * Jay Schulist - * - * Based on the design of: - * - The Berkeley Packet Filter - * - * 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. - */ - -#include -#include "wtap.h" -#include "bpf-engine.h" - - -/* - * Decode and apply filter instructions to the skb->data. - * Return length to keep, 0 for none. skb is the data we are - * filtering, filter is the array of filter instructions, and - * len is the number of filter blocks in the array. - */ - -int bpf_run_filter(unsigned char *data, int len, struct bpf_instruction *filter, int flen) -{ - struct bpf_instruction *fentry; /* We walk down these */ - guint32 A = 0; /* Accumulator */ - guint32 X = 0; /* Index Register */ - guint32 mem[BPF_MEMWORDS]; /* Scratch Memory Store */ - int k; - int pc; - int *t; - - /* - * Process array of filter instructions. - */ - - for(pc = 0; pc < flen; pc++) - { - fentry = &filter[pc]; - if(fentry->code & BPF_X) - t=&X; - else - t=&fentry->k; - - switch(fentry->code) - { - case BPF_ALU|BPF_ADD|BPF_X: - case BPF_ALU|BPF_ADD|BPF_K: - A += *t; - continue; - - case BPF_ALU|BPF_SUB|BPF_X: - case BPF_ALU|BPF_SUB|BPF_K: - A -= *t; - continue; - - case BPF_ALU|BPF_MUL|BPF_X: - case BPF_ALU|BPF_MUL|BPF_K: - A *= *t; - continue; - - case BPF_ALU|BPF_DIV|BPF_X: - case BPF_ALU|BPF_DIV|BPF_K: - if(*t == 0) - return (0); - A /= *t; - continue; - - case BPF_ALU|BPF_AND|BPF_X: - case BPF_ALU|BPF_AND|BPF_K: - A &= *t; - continue; - - case BPF_ALU|BPF_OR|BPF_X: - case BPF_ALU|BPF_OR|BPF_K: - A |= *t; - continue; - - case BPF_ALU|BPF_LSH|BPF_X: - case BPF_ALU|BPF_LSH|BPF_K: - A <<= *t; - continue; - - case BPF_ALU|BPF_RSH|BPF_X: - case BPF_ALU|BPF_RSH|BPF_K: - A >>= *t; - continue; - - case BPF_ALU|BPF_NEG: - A = -A; - continue; - - case BPF_JMP|BPF_JA: - pc += fentry->k; - continue; - - case BPF_JMP|BPF_JGT|BPF_K: - pc += (A > fentry->k) ? fentry->jt : fentry->jf; - continue; - - case BPF_JMP|BPF_JGE|BPF_K: - pc += (A >= fentry->k) ? fentry->jt : fentry->jf; - continue; - - case BPF_JMP|BPF_JEQ|BPF_K: - pc += (A == fentry->k) ? fentry->jt : fentry->jf; - continue; - - case BPF_JMP|BPF_JSET|BPF_K: - pc += (A & fentry->k) ? fentry->jt : fentry->jf; - continue; - - case BPF_JMP|BPF_JGT|BPF_X: - pc += (A > X) ? fentry->jt : fentry->jf; - continue; - - case BPF_JMP|BPF_JGE|BPF_X: - pc += (A >= X) ? fentry->jt : fentry->jf; - continue; - - case BPF_JMP|BPF_JEQ|BPF_X: - pc += (A == X) ? fentry->jt : fentry->jf; - continue; - - case BPF_JMP|BPF_JSET|BPF_X: - pc += (A & X) ? fentry->jt : fentry->jf; - continue; - case BPF_LD|BPF_W|BPF_ABS: - k = fentry->k; - if(k + sizeof(long) > len) - return (0); - A = pntohl(&data[k]); - continue; - - case BPF_LD|BPF_H|BPF_ABS: - k = fentry->k; - if(k + sizeof(short) > len) - return (0); - A = pntohs(&data[k]); - continue; - - case BPF_LD|BPF_B|BPF_ABS: - k = fentry->k; - if(k >= len) - return (0); - A = data[k]; - continue; - - case BPF_LD|BPF_W|BPF_LEN: - A = len; - continue; - - case BPF_LDX|BPF_W|BPF_LEN: - X = len; - continue; - - case BPF_LD|BPF_W|BPF_IND: - k = X + fentry->k; - if(k + sizeof(guint32) > len) - return (0); - A = pntohl(&data[k]); - continue; - - case BPF_LD|BPF_H|BPF_IND: - k = X + fentry->k; - if(k + sizeof(guint16) > len) - return (0); - A = pntohs(&data[k]); - continue; - - case BPF_LD|BPF_B|BPF_IND: - k = X + fentry->k; - if(k >= len) - return (0); - A = data[k]; - continue; - - case BPF_LDX|BPF_B|BPF_MSH: - /* - * Hack for BPF to handle TOS etc - */ - k = fentry->k; - if(k >= len) - return (0); - X = (data[fentry->k] & 0xf) << 2; - continue; - - case BPF_LD|BPF_IMM: - A = fentry->k; - continue; - - case BPF_LDX|BPF_IMM: - X = fentry->k; - continue; - - case BPF_LD|BPF_MEM: - A = mem[fentry->k]; - continue; - - case BPF_LDX|BPF_MEM: - X = mem[fentry->k]; - continue; - - case BPF_MISC|BPF_TAX: - X = A; - continue; - - case BPF_MISC|BPF_TXA: - A = X; - continue; - - case BPF_RET|BPF_K: - return ((unsigned int)fentry->k); - - case BPF_RET|BPF_A: - return ((unsigned int)A); - - case BPF_ST: - mem[fentry->k] = A; - continue; - - case BPF_STX: - mem[fentry->k] = X; - continue; - - - - default: - /* Invalid instruction counts as RET */ - return (0); - } - } - - g_error("Filter ruleset ran off the end.\n"); - return (0); -} - -/* - * Check the user's filter code. If we let some ugly - * filter code slip through kaboom! - */ - -int bpf_chk_filter(struct bpf_instruction *filter, int flen) -{ - struct bpf_instruction *ftest; - int pc; - - /* - * Check the filter code now. - */ - for(pc = 0; pc < flen; pc++) - { - /* - * All jumps are forward as they are not signed - */ - - ftest = &filter[pc]; - if(BPF_CLASS(ftest->code) == BPF_JMP) - { - /* - * But they mustn't jump off the end. - */ - if(BPF_OP(ftest->code) == BPF_JA) - { - if(pc + ftest->k + 1>= (unsigned)flen) - return (-1); - } - else - { - /* - * For conditionals both must be safe - */ - if(pc + ftest->jt +1 >= flen || pc + ftest->jf +1 >= flen) - return (-1); - } - } - - /* - * Check that memory operations use valid addresses. - */ - - if(ftest->k <0 || ftest->k >= BPF_MEMWORDS) - { - /* - * But it might not be a memory operation... - */ - - if (BPF_CLASS(ftest->code) == BPF_ST) - return -1; - if((BPF_CLASS(ftest->code) == BPF_LD) && - (BPF_MODE(ftest->code) == BPF_MEM)) - return (-1); - } - } - - /* - * The program must end with a return. We don't care where they - * jumped within the script (its always forwards) but in the - * end they _will_ hit this. - */ - - return (BPF_CLASS(filter[flen - 1].code) == BPF_RET)?0:-1; -} - diff --git a/wiretap/bpf-engine.h b/wiretap/bpf-engine.h deleted file mode 100644 index 24f87ae30a..0000000000 --- a/wiretap/bpf-engine.h +++ /dev/null @@ -1,120 +0,0 @@ -/* bpf-engine.h - * ------------ - * The BPF engine used for offline ("display") filters in wiretap. - * The code is taken from the Linux Socket Filter, and only slightly - * modified for use in wiretap. - * - * Gilbert Ramirez - */ - -/* - * Linux Socket Filter - Kernel level socket filtering - * - * Author: - * Jay Schulist - * - * Based on the design of: - * - The Berkeley Packet Filter - * - * 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. - */ - -/* - * Linux Socket Filter Data Structures - */ - -/* - * Current version of the filter code architecture. - */ -#define BPF_MAJOR_VERSION 1 -#define BPF_MINOR_VERSION 1 - -/* each BPF instruction is a block of 8 bytes */ -struct bpf_instruction { - guint16 code; /* Actual filter code */ - guint8 jt; /* Jump true */ - guint8 jf; /* Jump false */ - guint32 k; /* Generic multiuse field */ - -}; - -struct bpf_code_unit { - int line_label; - struct bpf_instruction bpf; -}; - -int bpf_run_filter(unsigned char *data, int len, struct bpf_instruction *filter, int flen); -int bpf_chk_filter(struct bpf_instruction *filter, int flen); - -/* - * Instruction classes - */ - -#define BPF_CLASS(code) ((code) & 0x07) -#define BPF_LD 0x00 -#define BPF_LDX 0x01 -#define BPF_ST 0x02 -#define BPF_STX 0x03 -#define BPF_ALU 0x04 -#define BPF_JMP 0x05 -#define BPF_RET 0x06 -#define BPF_MISC 0x07 - -/* ld/ldx fields */ -#define BPF_SIZE(code) ((code) & 0x18) -#define BPF_W 0x00 -#define BPF_H 0x08 -#define BPF_B 0x10 -#define BPF_MODE(code) ((code) & 0xe0) -#define BPF_IMM 0x00 -#define BPF_ABS 0x20 -#define BPF_IND 0x40 -#define BPF_MEM 0x60 -#define BPF_LEN 0x80 -#define BPF_MSH 0xa0 - -/* alu/jmp fields */ -#define BPF_OP(code) ((code) & 0xf0) -#define BPF_ADD 0x00 -#define BPF_SUB 0x10 -#define BPF_MUL 0x20 -#define BPF_DIV 0x30 -#define BPF_OR 0x40 -#define BPF_AND 0x50 -#define BPF_LSH 0x60 -#define BPF_RSH 0x70 -#define BPF_NEG 0x80 -#define BPF_JA 0x00 -#define BPF_JEQ 0x10 -#define BPF_JGT 0x20 -#define BPF_JGE 0x30 -#define BPF_JSET 0x40 -#define BPF_SRC(code) ((code) & 0x08) -#define BPF_K 0x00 -#define BPF_X 0x08 - -/* ret - BPF_K and BPF_X also apply */ -#define BPF_RVAL(code) ((code) & 0x18) -#define BPF_A 0x10 - -/* misc */ -#define BPF_MISCOP(code) ((code) & 0xf8) -#define BPF_TAX 0x00 -#define BPF_TXA 0x80 - -#define BPF_MAXINSNS 512 - -/* - * Macros for filter block array initializers. - */ -#define BPF_STMT(code, k) { (unsigned short)(code), 0, 0, k } -#define BPF_JUMP(code, k, jt, jf) { (unsigned short)(code), jt, jf, k } - -/* - * Number of scratch memory words for: BPF_ST and BPF_STX - */ -#define BPF_MEMWORDS 16 - diff --git a/wiretap/bpf.c b/wiretap/bpf.c deleted file mode 100644 index 3f02859d13..0000000000 --- a/wiretap/bpf.c +++ /dev/null @@ -1,373 +0,0 @@ -/* - * bpf.c - * ----- - * Creates and handles the BPF code produced by wiretap. - * - * Gilbert Ramirez - */ - -#ifndef __G_LIB_H__ -#include -#endif - -#include -#include - -#include "wtap.h" -#include "rt-compile.h" -#include "rt-global.h" -#include "bpf-engine.h" -#include "bpf.h" - - -static GList *bpf_code_just_parsed = NULL; -static struct bpf_instruction *bpf_record = NULL; - -static int -bpf_clean_jump(GList *L, int i_this, int jmp, int num_bpf_instructions, - int i_ret_success, int i_ret_failure); -static void -bpf_pass1(GList *L); - -static GList* -bpf_mk_bytecmp(int ftype, int rel_opcode, guint8 *bytes); - -static void -bpf_optimize(GList *L); - -static int -bpf_attach(wtap *wth); - -static void -bpf_attach_record(gpointer bpf_code, gpointer junk); - -static int -offline_attach(wtap *wth); - - -/* sets function pointers in rt-grammar.y to point to the BPF-related - * functions */ -void -wtap_filter_bpf_init(void) -{ - mk_bytecmp = bpf_mk_bytecmp; - mk_optimize = bpf_optimize; - mk_attach = bpf_attach; -} - -/* almost the same as bpf_init... */ -void -wtap_filter_offline_init(wtap *wth) -{ - int fi; /* filter index */ - - mk_bytecmp = bpf_mk_bytecmp; - mk_optimize = bpf_optimize; - mk_attach = offline_attach; - - wtap_filter_offline_clear(wth); - - /* make the offline filter array */ - wth->filter.offline = g_malloc(sizeof(int*) * WTAP_NUM_ENCAP_TYPES); - wth->filter_type = WTAP_FILTER_OFFLINE; - wth->offline_filter_lengths = g_malloc(sizeof(int) * WTAP_NUM_ENCAP_TYPES); - - for (fi = 0; fi < WTAP_NUM_ENCAP_TYPES; fi++) { - wth->filter.offline[fi] = NULL; - } -} - -/* Removes an offline filter from a wtap struct, and frees memory used - * by that filter */ -void -wtap_filter_offline_clear(wtap *wth) -{ - int fi; /* filter index */ - - if (wth->filter.offline) { - for (fi = 0; fi < WTAP_NUM_ENCAP_TYPES; fi++) { - if (wth->filter.offline[fi]) - g_free(wth->filter.offline[fi]); - } - g_free(wth->filter.offline); - g_free(wth->offline_filter_lengths); - } - wth->filter_type = WTAP_FILTER_NONE; -} - -/* Allocate a new bpf_code_unit structure and initialize the BPF instruction - * codes to the values passed by the caller. */ -static struct bpf_code_unit * -bpf_code_unit_alloc(guint8 label, guint16 code, guint8 jt, guint8 jf, guint32 k) -{ - struct bpf_code_unit *bpf; - - bpf = g_malloc(sizeof(struct bpf_code_unit)); - bpf->line_label = label; - bpf->bpf.code = code; - bpf->bpf.jt = jt; - bpf->bpf.jf = jf; - bpf->bpf.k = k; - - /*g_print("{ %d { 0x%02x, %d, %d, 0x%08x }},\n", - label, code, jt, jf, k);*/ - return bpf; -} - - -/* Finds ftype in the bytecmp_table, the relation, and the n-string -byte array, and creates BPF that will check those bytes */ -static GList* -bpf_mk_bytecmp(int ftype, int rel_opcode, guint8 *bytes) -{ - GList *L; - struct bpf_code_unit *bpf; - int len_to_cmp, offset, endpoint, label; - bytecmp_info *b; - - L = g_list_alloc(); - - /* find the field in the table */ - b = lookup_bytecmp(ftype); - - /* How many bytes do we have to compare, and where? */ - len_to_cmp = b->length; - offset = b->offset; - endpoint = len_to_cmp + offset; - /*g_print("len_to_cmp=%d, offset=%d, endpoint=%d\n", - len_to_cmp, offset, endpoint); - g_print("bytes: (%d) %02X:%02X:%02X\n", - bytes[0], bytes[1], bytes[2], bytes[3]);*/ - - label = NEXT_BLOCK; - /* loop until we have written instructions to compare - all bytes */ - while (len_to_cmp) { - - if (len_to_cmp >= 4) { - bpf = bpf_code_unit_alloc(label, - BPF_LD|BPF_W|BPF_ABS, - 0, 0, endpoint - 4); - g_list_append(L, bpf); - label = NO_LABEL; - - endpoint -= 4; - bpf = bpf_code_unit_alloc(NO_LABEL, - BPF_JMP|BPF_JEQ, - (len_to_cmp == 4 ? END_OF_PROGRAM_SUCCESS : 0), - NEXT_BLOCK, - phtonl(&bytes[len_to_cmp-3])); - g_list_append(L, bpf); - - len_to_cmp -= 4; - } - else if (len_to_cmp == 3) { - bpf = bpf_code_unit_alloc(label, - BPF_LD|BPF_W|BPF_ABS, - 0, 0, endpoint - 3); - g_list_append(L, bpf); - label = NO_LABEL; - endpoint -= 3; - - bpf = bpf_code_unit_alloc(NO_LABEL, - BPF_ALU|BPF_AND, - 0, 0, 0xffffff); - /*htonl(0xffffff));*/ - g_list_append(L, bpf); - - bpf = bpf_code_unit_alloc(NO_LABEL, - BPF_JMP|BPF_JEQ, - (len_to_cmp == 3 ? END_OF_PROGRAM_SUCCESS : 0), - NEXT_BLOCK, - phtonl(&bytes[len_to_cmp-2]) & 0xffffff00); - g_list_append(L, bpf); - - len_to_cmp -= 3; - } - else if (len_to_cmp == 2) { - bpf = bpf_code_unit_alloc(label, - BPF_LD|BPF_H|BPF_ABS, - 0, 0, endpoint - 2); - g_list_append(L, bpf); - label = NO_LABEL; - - endpoint -= 2; - bpf = bpf_code_unit_alloc(NO_LABEL, - BPF_JMP|BPF_JEQ, - (len_to_cmp == 2 ? END_OF_PROGRAM_SUCCESS : 0), - NEXT_BLOCK, - (guint32)phtons(&bytes[len_to_cmp-1])); - g_list_append(L, bpf); - - len_to_cmp -= 2; - } - else if (len_to_cmp == 1) { - bpf = bpf_code_unit_alloc(label, - BPF_LD|BPF_B|BPF_ABS, - 0, 0, endpoint - 1); - g_list_append(L, bpf); - label = NO_LABEL; - - endpoint--; - bpf = bpf_code_unit_alloc(NO_LABEL, - BPF_JMP|BPF_JEQ, - END_OF_PROGRAM_SUCCESS, NEXT_BLOCK, - bytes[len_to_cmp]); - g_list_append(L, bpf); - len_to_cmp--; - } - } - - - L = g_list_remove(L, 0); - return L; -} - - -static void -bpf_optimize(GList *L) -{ - bpf_pass1(L); - bpf_code_just_parsed = L; -} - -/* after the BPF code is constructed from the parser, this step is run. During - * pass1 we: - * - * 1. Clean up the jump variables - */ -static void -bpf_pass1(GList *L) -{ - struct bpf_code_unit *bpf; - int num_bpf_instructions; - int i_ret_success; - int i_ret_failure; - int i; - - /* Attach a SUCCESS return to the end of the BPF code */ - bpf = bpf_code_unit_alloc(END_OF_PROGRAM_SUCCESS, BPF_RET, 0, 0, 0xffff); - g_list_append(L, bpf); - - /* Attach a FAILURE return to the end of the BPF code */ - bpf = bpf_code_unit_alloc(END_OF_PROGRAM_FAILURE, BPF_RET, 0, 0, 0); - g_list_append(L, bpf); - - num_bpf_instructions = g_list_length(L); - i_ret_success = num_bpf_instructions - 2; - i_ret_failure = num_bpf_instructions - 1; - - for(i = 0; i < num_bpf_instructions; i++) { - bpf = (struct bpf_code_unit*) g_list_nth_data(L, i); - if (!bpf) - continue; - - /* Check for Jump to end failure/success */ - if (bpf->bpf.code & BPF_JMP) { - - bpf->bpf.jt = bpf_clean_jump(L, i, bpf->bpf.jt, num_bpf_instructions, - i_ret_success, i_ret_failure); - - bpf->bpf.jf = bpf_clean_jump(L, i, bpf->bpf.jf, num_bpf_instructions, - i_ret_success, i_ret_failure); - } - } -} - -static int -bpf_clean_jump(GList *L, int i_this, int jmp, int num_bpf_instructions, - int i_ret_success, int i_ret_failure) -{ - int i; - struct bpf_code_unit *bpf; - - switch(jmp) { - case END_OF_PROGRAM_SUCCESS: - return i_ret_success - i_this - 1; - - case END_OF_PROGRAM_FAILURE: - return i_ret_failure - i_this - 1; - - case NEXT_BLOCK: - for (i = i_this + 1; i < num_bpf_instructions; i++) { - bpf = (struct bpf_code_unit*) g_list_nth_data(L, i); - if (!bpf) - continue; - if (bpf->line_label == NEXT_BLOCK) { - return i - i_this - 1; - } - } - /* failed to find NEXT_BLOCK.... chose FAILURE */ - return i_ret_failure - i_this - 1; - - /* default: nothing */ - } - return jmp; -} - - - -/* Takes code from bpf_code_just_parsed and attaches it to wth - * returns 1 if sucessfull, 0 if not */ -static int bpf_attach(wtap *wth) -{ - if (wth->filter.bpf) - g_free(wth->filter.bpf); - - /* filter_length will be number of bpf_block records */ - wth->filter_length = g_list_length(bpf_code_just_parsed) - 1; - - wth->filter.bpf = g_malloc(wth->filter_length * - sizeof(struct bpf_instruction)); - wth->filter_type = WTAP_FILTER_BPF; - - bpf_record = wth->filter.bpf; - - g_list_foreach(bpf_code_just_parsed, bpf_attach_record, NULL); - - if (bpf_chk_filter(wth->filter.bpf, wth->filter_length) == 0) - return 1; - else - return 0; - -} - -void bpf_attach_record(gpointer bpf_code, gpointer junk) -{ - struct bpf_code_unit *bpf_c = (struct bpf_code_unit*) bpf_code; - - struct bpf_instruction *bpf_i; - - if (!bpf_c) - return; - - bpf_i = &(bpf_c->bpf); - memcpy(bpf_record, bpf_i, sizeof(struct bpf_instruction)); - bpf_record++; -} - - -/* Takes code from bpf_code_just_parsed and attachs it to wth. - * returns 1 if sucessfull, 0 if not */ -static int offline_attach(wtap *wth) -{ - /* filter_length will be number of bpf_instruction records */ - wth->offline_filter_lengths[comp_encap_type] = - g_list_length(bpf_code_just_parsed); - - /* Make space for this filter */ - wth->filter.offline[comp_encap_type] = - g_malloc(wth->offline_filter_lengths[comp_encap_type] - * sizeof(struct bpf_instruction)); - - bpf_record = wth->filter.offline[comp_encap_type]; - - g_list_foreach(bpf_code_just_parsed, bpf_attach_record, NULL); - - if (bpf_chk_filter(wth->filter.offline[comp_encap_type], - wth->offline_filter_lengths[comp_encap_type]) == 0) - return 1; - else - return 0; -} - diff --git a/wiretap/bpf.h b/wiretap/bpf.h deleted file mode 100644 index 81b8572873..0000000000 --- a/wiretap/bpf.h +++ /dev/null @@ -1,22 +0,0 @@ - -/* we limit the number of BPF records a jmp can take by using a few of the - * jmp values as special identifiers during the compilation process. Many - * pieces of code need to jump to the end of the entire BPF block, returing - * either a successful value or a failure value (either the number of bytes - * to read, or 0). The code creator uses these 4 variables to represent - * the retval of failure or success, then the code cleaner fills in the - * true value for these variables. - */ -#define NO_LABEL 255 -#define END_OF_PROGRAM_FAILURE 254 -#define END_OF_PROGRAM_SUCCESS 253 -#define NEXT_BLOCK 252 - -void -wtap_filter_bpf_init(void); - -void -wtap_filter_offline_init(wtap *wth); - -void -wtap_filter_offline_clear(wtap *wth); diff --git a/wiretap/configure b/wiretap/configure index 45010c7b50..5f52b5ff45 100755 --- a/wiretap/configure +++ b/wiretap/configure @@ -23,9 +23,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)" # Initialize some variables set by options. # The variables have the same names as the options, with @@ -567,7 +564,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:571: checking for a BSD compatible install" >&5 +echo "configure:568: 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 @@ -620,7 +617,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:624: checking whether build environment is sane" >&5 +echo "configure:621: checking whether build environment is sane" >&5 # Just in case sleep 1 echo timestamp > conftestfile @@ -677,7 +674,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:681: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:678: 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 @@ -704,6 +701,7 @@ else fi + PACKAGE=libwtap.a VERSION=0.0.0 @@ -723,7 +721,7 @@ EOF missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 -echo "configure:727: checking for working aclocal" >&5 +echo "configure:725: 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. @@ -736,7 +734,7 @@ else fi echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 -echo "configure:740: checking for working autoconf" >&5 +echo "configure:738: 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. @@ -749,7 +747,7 @@ else fi echo $ac_n "checking for working automake""... $ac_c" 1>&6 -echo "configure:753: checking for working automake" >&5 +echo "configure:751: 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. @@ -762,7 +760,7 @@ else fi echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 -echo "configure:766: checking for working autoheader" >&5 +echo "configure:764: 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. @@ -775,7 +773,7 @@ else fi echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 -echo "configure:779: checking for working makeinfo" >&5 +echo "configure:777: 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 @@ fi # 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:799: checking for $ac_word" >&5 +echo "configure:797: 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 @@ -825,7 +823,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:829: checking for $ac_word" >&5 +echo "configure:827: 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 @@ -876,7 +874,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:880: checking for $ac_word" >&5 +echo "configure:878: 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 @@ -908,7 +906,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:912: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:910: 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. @@ -919,12 +917,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF -#line 923 "configure" +#line 921 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:928: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:926: \"$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 @@ -950,12 +948,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:954: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:952: 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:959: checking whether we are using GNU C" >&5 +echo "configure:957: 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 @@ -964,7 +962,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:968: \"$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:966: \"$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 @@ -983,7 +981,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:987: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:985: 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 @@ -1017,7 +1015,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:1021: checking for $ac_word" >&5 +echo "configure:1019: 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 @@ -1049,7 +1047,7 @@ 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:1053: checking for $ac_word" >&5 +echo "configure:1051: 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 @@ -1080,7 +1078,7 @@ done test -n "$YACC" || YACC="yacc" echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:1084: checking how to run the C preprocessor" >&5 +echo "configure:1082: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -1095,13 +1093,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1105: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1103: \"$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 : @@ -1112,13 +1110,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1122: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1120: \"$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 : @@ -1129,13 +1127,13 @@ else rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1139: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1137: \"$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 : @@ -1165,7 +1163,7 @@ 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:1169: checking for $ac_word" >&5 +echo "configure:1167: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1198,7 +1196,7 @@ test -n "$LEX" || LEX=""$missing_dir/missing flex"" # Extract the first word of "flex", so it can be a program name with args. set dummy flex; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1202: checking for $ac_word" >&5 +echo "configure:1200: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1232,7 +1230,7 @@ then *) ac_lib=l ;; esac echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6 -echo "configure:1236: checking for yywrap in -l$ac_lib" >&5 +echo "configure:1234: checking for yywrap in -l$ac_lib" >&5 ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1240,7 +1238,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$ac_lib $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1253: \"$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 @@ -1274,7 +1272,7 @@ fi fi echo $ac_n "checking lex output file root""... $ac_c" 1>&6 -echo "configure:1278: checking lex output file root" >&5 +echo "configure:1276: checking lex output file root" >&5 if eval "test \"`echo '$''{'ac_cv_prog_lex_root'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1295,7 +1293,7 @@ echo "$ac_t""$ac_cv_prog_lex_root" 1>&6 LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root echo $ac_n "checking whether yytext is a pointer""... $ac_c" 1>&6 -echo "configure:1299: checking whether yytext is a pointer" >&5 +echo "configure:1297: checking whether yytext is a pointer" >&5 if eval "test \"`echo '$''{'ac_cv_prog_lex_yytext_pointer'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1307,14 +1305,14 @@ echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c ac_save_LIBS="$LIBS" LIBS="$LIBS $LEXLIB" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1316: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_prog_lex_yytext_pointer=yes else @@ -1338,7 +1336,7 @@ fi # 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:1342: checking to see if we can add '-Wall' to CFLAGS" >&5 +echo "configure:1340: 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 @@ -1400,7 +1398,7 @@ fi # Extract the first word of "glib-config", so it can be a program name with args. set dummy glib-config; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1404: checking for $ac_word" >&5 +echo "configure:1402: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_GLIB_CONFIG'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1435,7 +1433,7 @@ fi min_glib_version=1.1.0 echo $ac_n "checking for GLIB - version >= $min_glib_version""... $ac_c" 1>&6 -echo "configure:1439: checking for GLIB - version >= $min_glib_version" >&5 +echo "configure:1437: checking for GLIB - version >= $min_glib_version" >&5 no_glib="" if test "$GLIB_CONFIG" = "no" ; then no_glib=yes @@ -1458,7 +1456,7 @@ echo "configure:1439: checking for GLIB - version >= $min_glib_version" >&5 echo $ac_n "cross compiling; assumed OK... $ac_c" else cat > conftest.$ac_ext < @@ -1534,7 +1532,7 @@ main () } EOF -if { (eval echo configure:1538: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1536: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else @@ -1568,7 +1566,7 @@ fi CFLAGS="$CFLAGS $GLIB_CFLAGS" LIBS="$LIBS $GLIB_LIBS" cat > conftest.$ac_ext < @@ -1578,7 +1576,7 @@ int main() { return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ; return 0; } EOF -if { (eval echo configure:1582: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1580: \"$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 GLIB or finding the wrong" @@ -1668,7 +1666,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:1672: checking for $ac_word" >&5 +echo "configure:1670: 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 @@ -1703,7 +1701,7 @@ fi min_gtk_version=1.0.0 echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6 -echo "configure:1707: checking for GTK - version >= $min_gtk_version" >&5 +echo "configure:1705: checking for GTK - version >= $min_gtk_version" >&5 no_gtk="" if test "$GTK_CONFIG" = "no" ; then no_gtk=yes @@ -1726,7 +1724,7 @@ echo "configure:1707: checking for GTK - version >= $min_gtk_version" >&5 echo $ac_n "cross compiling; assumed OK... $ac_c" else cat > conftest.$ac_ext < @@ -1804,7 +1802,7 @@ main () } EOF -if { (eval echo configure:1808: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1806: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else @@ -1838,7 +1836,7 @@ fi CFLAGS="$CFLAGS $GTK_CFLAGS" LIBS="$LIBS $GTK_LIBS" cat > conftest.$ac_ext < @@ -1848,7 +1846,7 @@ int main() { return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ; return 0; } EOF -if { (eval echo configure:1852: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1850: \"$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" @@ -1892,36 +1890,13 @@ EOF fi -# Wiretap check (copied and modified from ethereal) -echo $ac_n "checking whether to include wiretap library""... $ac_c" 1>&6 -echo "configure:1898: 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 - LIBWIRETAP_A="libwiretap.a" - ;; - *) - echo "$ac_t""no" 1>&6 - LIBWIRETAP_A="" - ;; - esac -else - echo "$ac_t""no" 1>&6 - -fi - - - echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:1920: checking for ANSI C header files" >&5 +echo "configure:1895: 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 < #include @@ -1929,7 +1904,7 @@ else #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1933: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1908: \"$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* @@ -1946,7 +1921,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 @@ -1964,7 +1939,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 @@ -1985,7 +1960,7 @@ if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') @@ -1996,7 +1971,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF -if { (eval echo configure:2000: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1975: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then : else @@ -2023,17 +1998,17 @@ for ac_hdr in unistd.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:2027: checking for $ac_hdr" >&5 +echo "configure:2002: 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 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2037: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2012: \"$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* @@ -2217,7 +2192,6 @@ s%@GLIB_LIBS@%$GLIB_LIBS%g s%@GTK_CONFIG@%$GTK_CONFIG%g s%@GTK_CFLAGS@%$GTK_CFLAGS%g s%@GTK_LIBS@%$GTK_LIBS%g -s%@LIBWIRETAP_A@%$LIBWIRETAP_A%g CEOF EOF diff --git a/wiretap/configure.in b/wiretap/configure.in index ddadbef14d..15b9e90e37 100644 --- a/wiretap/configure.in +++ b/wiretap/configure.in @@ -1,4 +1,4 @@ -# $Id: configure.in,v 1.9 1999/03/28 18:32:02 gram Exp $ +# $Id: configure.in,v 1.10 1999/07/07 22:52:53 gram Exp $ dnl Process this file with autoconf to produce a configure script. AC_INIT(wtap.c) AM_INIT_AUTOMAKE(libwtap.a, 0.0.0) @@ -28,25 +28,6 @@ if test "x$GLIB_CFLAGS" = x ; then AC_DEFINE(HAVE_GLIB10) fi -# Wiretap check (copied and modified from ethereal) -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) - LIBWIRETAP_A="libwiretap.a" - ;; - *) - AC_MSG_RESULT(no) - LIBWIRETAP_A="" - ;; - esac ], - AC_MSG_RESULT(no) -) -AC_SUBST(LIBWIRETAP_A) - dnl Checks for header files AC_HEADER_STDC AC_CHECK_HEADERS(unistd.h) diff --git a/wiretap/ct-compile.c b/wiretap/ct-compile.c deleted file mode 100644 index eea612b9e8..0000000000 --- a/wiretap/ct-compile.c +++ /dev/null @@ -1,487 +0,0 @@ -/* ct-compile.c - ------------ - Compile-time filter-compiler for Wiretap - -*/ - -#include -#include - -#include "config.h" -#include "ct-compile.h" - -#ifdef HAVE_GLIB10 -#include "glib-new.h" -#endif - -#define LINE_SIZE 1024 - -GHashTable *field_hash; -GHashTable *protocol_hash; -char *protocol_name = NULL; -int rt_iteration; - -extern struct field_info working_field; /* in ct-grammar.y */ - -char *ftype_text[] = { - "NONE", - "BOOLEAN", - "ETHER", - "IPv4ADDR", - "UINT8", - "UINT16", - "UINT32", - "BYTE" -}; - -char *ctype_text[] = { - "NONE", - "ANDMASK", - "BYTECMP", - "EITHEROF" -}; - -static -int many_list_subtype(struct field_info *val); - -/* Called by main() to initialize the global variables that ct-compile.c - * worries about. */ -void compiler_init(void) -{ - field_hash = g_hash_table_new(g_str_hash, g_str_equal); - protocol_hash = g_hash_table_new(g_str_hash, g_str_equal); - field_info_init(&working_field); -} - -/* takes a pointer to a field_info struct that the parser built, - * makes a copy of the struct, and adds it to our list of fields */ -void field_info_add(struct field_info *fi, char *protocol) -{ - struct field_info *new_fi; - - /* Make a duplicate of the field_info struct, destroying - * the pointers of the old struct in the process. */ - new_fi = g_memdup(fi, sizeof(struct field_info)); - new_fi->name = fi->name; - new_fi->short_name = fi->short_name; - new_fi->description = fi->description; - new_fi->many_list = fi->many_list; - new_fi->aliases = fi->aliases; - fi->name = NULL; - fi->short_name = NULL; - fi->description = NULL; - fi->many_list = NULL; - fi->aliases = NULL; - - /* Find the parent */ - new_fi->parent = g_hash_table_lookup(protocol_hash, protocol); - if (!new_fi) - g_print("Cannot find parent protocol %s for field %s\n", - protocol, new_fi->name); - - g_hash_table_insert(field_hash, new_fi->name, new_fi); - - g_print("field_info_add added %s (%s) \n\t" - "ftype=%s, off=%d, len=%d, val=%d, ctype=%s\n", - new_fi->name, - new_fi->description, - ftype_text[new_fi->field_type], new_fi->offset, - new_fi->length, new_fi->value, - ctype_text[new_fi->computation_type]); -} - -/* initialize a field_info struct */ -void field_info_init(struct field_info *fi) -{ - /* put NULLs in the fields that field_info_zero assumes - * that a non-NULL value corresponds to allocated memory. */ - fi->name = NULL; - fi->description = NULL; - fi->aliases = NULL; - fi->many_list = NULL; - - field_info_zero(fi); -} - -/* zero out the values of an existing field_info struct */ -void field_info_zero(struct field_info *fi) -{ - if (fi->name) - free(fi->name); - if (fi->short_name) - free(fi->short_name); - if (fi->description) - free(fi->description); - - fi->field_type = 0; - fi->computation_type = CTYPE_NONE; - fi->offset = 0; - fi->length = 0; - fi->value = 0; - fi->parent = NULL; - - if (fi->aliases) - g_slist_free(fi->aliases); - if (fi->many_list) - g_slist_free(fi->many_list); - - fi->aliases = g_slist_alloc(); - fi->many_list = g_slist_alloc(); -} - -void show_aliases(gpointer alias, gpointer field) -{ - if (alias) - g_print("%s ", ((GString*)alias)->str); - -} -/* add alias(es) to this field */ -void field_info_add_alias(char *field_name, GSList *aliases) -{ - struct field_info *fi; - - fi = g_hash_table_lookup(field_hash, field_name); - - if (!fi) { - g_print("Could not find field %s to alias.\n", field_name); - return; - } - - g_slist_concat(fi->aliases, aliases); - g_print("(%s) added aliases: ", fi->name); - g_slist_foreach(fi->aliases, show_aliases, NULL); - g_print("\n"); -} - -/* Given a list of GStrings of field_names, return a list of field_info - * pointers */ -GSList* field_info_list(GSList *field_names, char *protocol) -{ - GSList *new_list; - char *protocol_dot; - - protocol_dot = g_strjoin("", protocol, ".", NULL); - g_slist_foreach(field_names, field_info_list_func1, protocol_dot); - - new_list = g_slist_alloc(); - g_slist_foreach(field_names, field_info_list_func2, new_list); - - return new_list; -} - -void field_info_list_func1(gpointer node, gpointer protocol) -{ - if(node) - g_string_prepend((GString*)node, (char*)protocol); -} - - -void field_info_list_func2(gpointer node, gpointer new_list) -{ - if (node) - g_slist_append(new_list, - g_hash_table_lookup(field_hash, - ((GString*)node)->str)); -/* if (node) - g_print("info_list added %s\n", ((GString*)node)->str);*/ -} - - -/* add a protocol to the hash */ -void protocol_layer_add(char *name, char *description) -{ - struct protocol_layer *new_pr; - - new_pr = g_malloc(sizeof(struct protocol_layer)); - - new_pr->name = g_strdup(name); - new_pr->description = g_strdup(description); - - g_hash_table_insert(protocol_hash, new_pr->name, new_pr); - - g_print("protocol_layer_add added %s (%s)\n", - new_pr->name, - new_pr->description); -} - -/* Creates rt-scanner.l from rt-scanner-skel.l */ -void write_rt_lex(void) -{ - char buf[LINE_SIZE]; - FILE *in, *out; - - if (!(in = fopen("rt-scanner-skel.l", "r"))) { - g_error("Could not open rt-scanner-skel.l for reading."); - exit(1); - } - - if (!(out = fopen("rt-scanner.l", "w"))) { - g_error("Could not open rt-scanner.l for writing."); - exit(1); - } - - while(fgets(buf, LINE_SIZE, in)) { - if (strcmp(buf, "/* ct-compile: lex tokens */\n") == 0) { - write_rt_lex_tokens(out); - continue; - } - else { - fprintf(out, "%s", buf); - } - } - fclose(in); - fclose(out); -} - - -void write_rt_lex_tokens(FILE *out) -{ - g_hash_table_foreach(field_hash, rt_lex_tokens, out); -} - -void rt_lex_tokens(gpointer key, gpointer value, gpointer out) -{ - char *upcase; - - if (!value) { - g_print("key %s has no value.\n", (char*)key); - return; - } - - protocol_name = ((struct field_info*) value)->parent->name; - if (((struct field_info*) value)->aliases) { - g_slist_foreach(((struct field_info*) value)->aliases, - rt_lex_tokens_aliases, out); - } - upcase = rt_lex_token_upcase(((struct field_info*)value)->name); - fprintf((FILE*)out, "%s\\.%s\t return %s;\n", protocol_name, - ((struct field_info*) value)->short_name, - upcase); - - free(upcase); -} - -char* rt_lex_token_upcase(char *text) -{ - char *new_text; - char *p; - new_text = g_strdup(text); - g_strup(new_text); - - /* s/\./_/g */ - for (p = new_text; *p; p++) { - if (*p == '.') { - *p = '_'; - } - } - return new_text; -} - - -void rt_lex_tokens_aliases(gpointer node, gpointer out) -{ - if (node) { - fprintf((FILE*)out, "%s\\.%s\t|\n", - protocol_name, - ((GString*) node)->str); - } -} - -/* Creates rt-grammar.y from rt-grammar-skel.y */ -void write_rt_yacc(void) -{ - char buf[LINE_SIZE]; - FILE *in, *out; - - if (!(in = fopen("rt-grammar-skel.y", "r"))) { - g_error("Could not open rt-grammar-skel.y for reading."); - exit(1); - } - - if (!(out = fopen("rt-grammar.y", "w"))) { - g_error("Could not open rt-scanner.l for writing."); - exit(1); - } - - while(fgets(buf, LINE_SIZE, in)) { - if (strcmp(buf, "/* ct-compile: bytecmp_table */\n") == 0) { - write_rt_bytecmp_table(out); - continue; - } - else if (strcmp(buf, "/* ct-compile: eitherof_table */\n") == 0) { - write_rt_eitherof_table(out); - continue; - } - else if (strcmp(buf, "/* ct-compile: yacc tokens */\n") == 0) { - write_rt_yacc_tokens(out); - continue; - } - else if (strcmp(buf, "/* ct-compile: bytecmp_lval */\n") == 0) { - write_rt_bytecmp_lval(out); - continue; - } - else { - fprintf(out, "%s", buf); - } - } - fclose(in); - fclose(out); -} - -/* ------------------------- BYTECMP_TABLE -------------------- */ -void write_rt_bytecmp_table(FILE *out) -{ - fprintf(out, "bytecmp_info bytecmp_table[] = {\n"); - g_hash_table_foreach(field_hash, rt_bytecmp_table, out); - fprintf(out, "\t{ 0, 0, 0, 0 }\n};\n"); -} - -void rt_bytecmp_table(gpointer key, gpointer value, gpointer out) -{ - char *upcase; - struct field_info *val = (struct field_info*) value; - - if (!val) { - g_print("key %s has no value.\n", (char*)key); - return; - } - - /* return now if we're not dealing with a bytecmp field */ - if (val->computation_type == CTYPE_EITHEROF) { - if (many_list_subtype(val) != CTYPE_BYTECMP) - return; - } - else if (val->computation_type != CTYPE_BYTECMP) { - return; - } - - upcase = rt_lex_token_upcase(((struct field_info*)value)->name); - fprintf((FILE*)out, "\t{ %s, %d, %d, %d },\n", - upcase, val->computation_type, val->offset, val->length); - free(upcase); -} - -static -int many_list_subtype(struct field_info *val) -{ - struct field_info *fi; - gchar *field1; - - if (!val->many_list) - return 0; - - field1 = ((GString*)g_slist_nth_data(val->many_list, 1))->str; - fi = g_hash_table_lookup(field_hash, field1); - - if (!fi) - return 0; - - return fi->computation_type;; -} - -/* ------------------- EITHEROF_TABLE ------------------------ */ -void write_rt_eitherof_table(FILE *out) -{ - fprintf(out, "eitherof_info eitherof_table[] = {\n"); - g_hash_table_foreach(field_hash, rt_eitherof_table, out); - fprintf(out, "\t{ 0, 0, 0, 0 }\n};\n"); -} - -void rt_eitherof_table(gpointer key, gpointer value, gpointer out) -{ - char *upcase_field, *upcase_field1, *upcase_field2; - struct field_info *val = (struct field_info*) value; - - if (!val) { - g_print("key %s has no value.\n", (char*)key); - return; - } - - if (val->computation_type != CTYPE_EITHEROF) { - return; - } - - upcase_field = rt_lex_token_upcase(((struct field_info*)value)->name); - g_print("EITHEROF checking %s\n", upcase_field); - if (val->many_list) { - g_print("getting fields\n"); - upcase_field1 = ((GString*)g_slist_nth_data(val->many_list, 1))->str; - g_print("got field1 %s\n", upcase_field1); - upcase_field2 = ((GString*)g_slist_nth_data(val->many_list, 2))->str; - g_print("got field2 %s\n", upcase_field2); - upcase_field1 = rt_lex_token_upcase(upcase_field1); - g_print("got field1 %s\n", upcase_field1); - upcase_field2 = rt_lex_token_upcase(upcase_field2); - g_print("got field2 %s\n", upcase_field2); - } - else - return; - - fprintf((FILE*)out, "\t{ %s, %d, %s, %s },\n", - upcase_field, val->computation_type, - upcase_field1, upcase_field2); - free(upcase_field); - free(upcase_field1); - free(upcase_field2); -} - -/* ---------------------- YACC_TOKENS ---------------------------- */ -void write_rt_yacc_tokens(FILE *out) -{ - g_hash_table_foreach(field_hash, rt_yacc_tokens, out); -} - -void rt_yacc_tokens(gpointer key, gpointer value, gpointer out) -{ - char *upcase; - struct field_info *val = (struct field_info*) value; - - if (!val) { - g_print("key %s has no value.\n", (char*)key); - return; - } - - upcase = rt_lex_token_upcase(((struct field_info*)value)->name); - fprintf((FILE*)out, "%%token \t%s\n", upcase); - free(upcase); -} - -/* ------------------------ BYTECMP_LVAL -------------------------- */ -void write_rt_bytecmp_lval(FILE *out) -{ - rt_iteration = 0; - g_hash_table_foreach(field_hash, rt_bytecmp_lval, out); - fprintf(out, "\t;\n"); -} - -void rt_bytecmp_lval(gpointer key, gpointer value, gpointer out) -{ - char *upcase; - struct field_info *val = (struct field_info*) value; - - if (!val) { - g_print("key %s has no value.\n", (char*)key); - return; - } - - if (val->computation_type == CTYPE_EITHEROF) { - if (many_list_subtype(val) != CTYPE_BYTECMP) - return; - } - else if (val->computation_type != CTYPE_BYTECMP) { - return; - } - - if (rt_iteration == 0) { - fprintf(out, "bytecmp_lval:\t"); - } - else { - fprintf(out,"\t|\t"); - } - - upcase = rt_lex_token_upcase(((struct field_info*)value)->name); - fprintf((FILE*)out, "\t%s { $$ = %s; }\n", - upcase, upcase); - free(upcase); - rt_iteration++; -} diff --git a/wiretap/ct-compile.h b/wiretap/ct-compile.h deleted file mode 100644 index d76a5e5ce9..0000000000 --- a/wiretap/ct-compile.h +++ /dev/null @@ -1,104 +0,0 @@ -/* ct-compile.h - ------------ - Compile-time filter-compiler for Wiretap - -*/ - -#ifndef __G_LIB_H__ -#include -#endif - -/* field type IDs */ -#define FTYPE_BOOLEAN 1 -#define FTYPE_ETHER 2 -#define FTYPE_IPv4ADDR 3 -#define FTYPE_UINT8 4 -#define FTYPE_UINT16 5 -#define FTYPE_UINT32 6 -#define FTYPE_BYTE 7 - -/* field lengths */ -#define FLEN_BOOLEAN 1 -#define FLEN_ETHER 6 -#define FLEN_IPv4ADDR 4 -#define FLEN_UINT8 1 -#define FLEN_UINT16 2 -#define FLEN_UINT32 4 -/* FLEN_BYTE doesn't get a fixed length, of course */ - -/* computation types */ -#define CTYPE_NONE 0 -#define CTYPE_ANDMASK 1 -#define CTYPE_BYTECMP 2 -#define CTYPE_EITHEROF 3 - -/* Protocol-layer information */ -struct protocol_layer { - char *name; - char *description; - GSList *parents; -}; - -/* Fields */ -struct field_info { - char *name; - char *short_name; - char *description; - int field_type; - int computation_type; - int offset; - int value; - int length; - - GSList *aliases; - GSList *many_list; - - struct protocol_layer *parent; -}; - -/* Add a field-info struct to the compiler's list of fields */ -void field_info_add(struct field_info *fi, char *protocol); - -/* Initialize values in a field_info struct. This can only be run once per - * structure, as it would cause a memory leak if used multiple times. */ -void field_info_init(struct field_info *fi); - -/* Zero-out the values in a field_info struct. This can be used more than once - * per structure, as it avoids a memory leak. But call field_info_init the - * first time, and field_info_zero for all other times */ -void field_info_zero(struct field_info *fi); - -/* add alias(es) to this field */ -void field_info_add_alias(char *field_name, GSList *aliases); - -/* add a protocol to the hash */ -void protocol_layer_add(char *name, char *description); - -/* Given a list of GStrings of field names, returns a list of pointers - * to field_info structs */ -GSList* field_info_list(GSList *field_names, char *protocol); - -/* used by field_info_list() */ -void field_info_list_func1(gpointer node, gpointer protocol); -void field_info_list_func2(gpointer node, gpointer new_list); - -void compiler_init(void); -void write_rt_lex(void); -void write_rt_lex_tokens(FILE *out); -void rt_lex_tokens(gpointer key, gpointer value, gpointer out); -void rt_lex_tokens_aliases(gpointer node, gpointer out); -char* rt_lex_token_upcase(char *text); - -void write_rt_yacc(void); -void write_rt_bytecmp_table(FILE *out); -void rt_bytecmp_table(gpointer key, gpointer value, gpointer out); -void write_rt_eitherof_table(FILE *out); -void rt_eitherof_table(gpointer key, gpointer value, gpointer out); -void write_rt_yacc_tokens(FILE *out); -void rt_yacc_tokens(gpointer key, gpointer value, gpointer out); -void write_rt_bytecmp_lval(FILE *out); -void rt_bytecmp_lval(gpointer key, gpointer value, gpointer out); - -int wtap_lex(void); -int wtap_parse(void); -void wtap_error(char *string); diff --git a/wiretap/ct-grammar.y b/wiretap/ct-grammar.y deleted file mode 100644 index 5841e5c737..0000000000 --- a/wiretap/ct-grammar.y +++ /dev/null @@ -1,149 +0,0 @@ -%{ - -#include -#include -#include "ct-compile.h" - -#include "config.h" - -#ifdef HAVE_GLIB10 -#include "glib-new.h" -#endif - -struct field_info working_field; -gchar *current_protocol = NULL; -char *full_field_name = NULL; - -%} - -%union { - gint d; - GString *s; - GSList *a; -} - -%type sentence protocol -%type parents text_list - -%token TEXT PROTOCOL PARENTS QUOTED -%token NUMBER BOOLEAN ETHER UINT8 UINT16 UINT32 BYTE -%token FIELD ALIAS -%token AND_MASK BYTE_OFFSET EITHER_OF - -%% - -paragraph: /* EMPTY */ - | paragraph sentence - ; - -sentence: protocol -{ - if (current_protocol) - free(current_protocol); - current_protocol = g_strdup($1->str); -} - | parents -{ - g_print("sentence Got parents %d\n", g_slist_length($1)); -} - | alias { } - | field { } - ; - -protocol: PROTOCOL TEXT QUOTED ';' -{ - protocol_layer_add($2->str, $3->str); - $$ = $2; -} - ; - -parents: PARENTS text_list ';' -{ - $$ = $2; - g_slist_free($2); -} - ; - -alias: ALIAS TEXT text_list ';' -{ - full_field_name = g_strjoin(".", current_protocol, $2->str, NULL); - field_info_add_alias(full_field_name, $3); - g_free(full_field_name); -} - - -field: FIELD TEXT QUOTED ',' field_type ',' field_location ';' -{ - working_field.name = g_strjoin(".", current_protocol, $2->str, NULL); - working_field.short_name = g_strdup($2->str); - working_field.description = g_strdup($3->str); - - field_info_add(&working_field, current_protocol); - field_info_zero(&working_field); -} - - -field_type: BOOLEAN -{ - working_field.field_type = FTYPE_BOOLEAN; - working_field.length = FLEN_BOOLEAN; -} - | ETHER -{ - working_field.field_type = FTYPE_ETHER; - working_field.length = FLEN_ETHER; -} - | UINT8 -{ - working_field.field_type = FTYPE_UINT8; - working_field.length = FLEN_UINT8; -} - | UINT16 -{ - working_field.field_type = FTYPE_UINT16; - working_field.length = FLEN_UINT16; -} - | UINT32 -{ - working_field.field_type = FTYPE_UINT32; - working_field.length = FLEN_UINT32; -} - | BYTE '[' NUMBER ']' -{ - working_field.field_type = FTYPE_BYTE; - working_field.length = $3; -} - ; - -field_location: AND_MASK '(' NUMBER '@' NUMBER ')' -{ - working_field.computation_type = CTYPE_ANDMASK; - working_field.value = $3; - working_field.offset = $5; -} - | BYTE_OFFSET '(' NUMBER ')' -{ - working_field.computation_type = CTYPE_BYTECMP; - working_field.offset = $3; -} - | EITHER_OF '(' text_list ')' -{ - working_field.computation_type = CTYPE_EITHEROF; - working_field.many_list = field_info_list($3, current_protocol); - g_slist_free($3); -} - - ; - -text_list: TEXT -{ - $$ = g_slist_alloc(); - g_slist_append($$, $1); -} - | text_list ',' TEXT -{ - $$ = $1; - g_slist_append($$, $3); -} - - ; diff --git a/wiretap/ct-main.c b/wiretap/ct-main.c deleted file mode 100644 index 7e7bb9fbd8..0000000000 --- a/wiretap/ct-main.c +++ /dev/null @@ -1,24 +0,0 @@ -/* ct-main.c - * --------- - * Wiretap filter compilter - */ - - -#include - -#include "ct-compile.h" - - -int main(void) -{ - FILE *yyin; - - yyin = stdin; - - compiler_init(); - wtap_parse(); - write_rt_lex(); - write_rt_yacc(); - - return 0; -} diff --git a/wiretap/ct-scanner.l b/wiretap/ct-scanner.l deleted file mode 100644 index 7e33ad0313..0000000000 --- a/wiretap/ct-scanner.l +++ /dev/null @@ -1,74 +0,0 @@ -%{ -#include -#include -#include "ct-grammar.h" -int lex_line_number = 1; -%} - -N ([0-9]+|(0X|0x)[0-9A-Fa-f]+) -B [0-9A-Fa-f][0-9A-Fa-f]? -W [A-Za-z_] -quoted \"[^"\n]*["\n] - -%% - -\n lex_line_number++; -[\t ]+ /* eat whitespace */ -#.* /* one-line shell-style comments */ - -{quoted} { - wtap_lval.s = g_string_new(wtap_text + 1); - g_string_truncate(wtap_lval.s, strlen(wtap_text) - 2); -/* g_print("lex made QUOTED (%s)\n", wtap_lval.s->str);*/ - return QUOTED; -} - -";" return ';'; -"," return ','; -"(" return '('; -")" return ')'; -"@" return '@'; -"[" return '['; -"]" return ']'; - -protocol return PROTOCOL; -parents return PARENTS; -field return FIELD; -alias return ALIAS; - -boolean return BOOLEAN; -ether return ETHER; -uint8 return UINT8; -uint16 return UINT16; -uint32 return UINT32; -byte return BYTE; - -and_mask return AND_MASK; -byte_offset return BYTE_OFFSET; -either_of return EITHER_OF; - - -{N} { - wtap_lval.d = atoi(wtap_text); - return NUMBER; -} - -{W}+ { - wtap_lval.s = g_string_new(wtap_text); -/* g_print("lex made TEXT (%s)\n", wtap_lval.s->str);*/ - return TEXT; - } - -%% - -int -wtap_wrap() -{ - return 1; -} - -void wtap_error(char *string) -{ - fprintf(stderr,"%s on line %d\n",string, lex_line_number); - exit(0); -} diff --git a/wiretap/file.c b/wiretap/file.c index 5a13761002..0c9f760da5 100644 --- a/wiretap/file.c +++ b/wiretap/file.c @@ -1,6 +1,6 @@ /* file.c * - * $Id: file.c,v 1.9 1999/03/01 18:57:04 gram Exp $ + * $Id: file.c,v 1.10 1999/07/07 22:52:54 gram Exp $ * * Wiretap Library * Copyright (c) 1998 by Gilbert Ramirez @@ -53,10 +53,6 @@ wtap* wtap_open_offline(char *filename) /* initialization */ wth->file_encap = WTAP_ENCAP_NONE; - wth->filter.offline = NULL; - wth->filter_type = WTAP_FILTER_NONE; - wth->filter_length = 0; - wth->offline_filter_lengths = NULL; /* Try all file types */ diff --git a/wiretap/filter-eth b/wiretap/filter-eth deleted file mode 100644 index 4bed0033cd..0000000000 --- a/wiretap/filter-eth +++ /dev/null @@ -1,38 +0,0 @@ -# filter-eth -# -# Ethernet Filter -# - -protocol eth "Ethernet"; -#length variable; -parents none; - -field src "Source Hardware Address", - ether, - byte_offset(6); - -field dst "Destination Hardware Address", - ether, - byte_offset(0); - -field srcvendor "Vendor of Source Hardware Address", - byte[3], - byte_offset(6); - -field dstvendor "Vendor of Destination Hardware Address", - byte[3], - byte_offset(0); - -alias src srcaddr; -alias dst dest, dstaddr, destaddr; - -field addr "Hardware Address", - ether, - either_of(src, dst); - -alias addr hwaddr; - -field vendor "Hardware Vendor", - byte[3], - either_of(srcvendor, dstvendor); - diff --git a/wiretap/filter-tr b/wiretap/filter-tr deleted file mode 100644 index bfc704754e..0000000000 --- a/wiretap/filter-tr +++ /dev/null @@ -1,57 +0,0 @@ -# filter-tr -# -# Token-Ring Filter -# - -protocol tr "Token-Ring"; -#length variable; -parents none; - -field sr "Source-Routed Flag", - boolean, - and_mask(127 @ 8); - -field src "Source Hardware Address", - ether, - byte_offset(8); - -field dst "Destination Hardware Address", - ether, - byte_offset(2); - -field srcvendor "Vendor of Source Hardware Address", - byte[3], - byte_offset(8); - -field dstvendor "Vendor of Destination Hardware Address", - byte[3], - byte_offset(2); - -field _next "Next protocol layer", - uint8, - and_mask(192 @ 1); - -alias src srcaddr; -alias dst dest, dstaddr, destaddr; -alias dstvendor destvendor; - -field addr "Hardware Address", - ether, - either_of(src, dst); - -alias addr hwaddr; - -field vendor "Hardware Vendor", - byte[3], - either_of(srcvendor, dstvendor); - - -#next_protocol { -# 64 : trmac -# 128 : llc -#} - -#next_offset { -# ldx -# df -#} diff --git a/wiretap/glib-new.c b/wiretap/glib-new.c deleted file mode 100644 index d8f6ee6d1c..0000000000 --- a/wiretap/glib-new.c +++ /dev/null @@ -1,105 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "config.h" -#ifdef HAVE_GLIB10 - -#include -#include -#include - -gpointer -g_memdup (const gpointer mem, - guint byte_size) -{ - gpointer new_mem; - - if (mem) - { - new_mem = g_malloc (byte_size); - memcpy (new_mem, mem, byte_size); - } - else - new_mem = NULL; - - return new_mem; -} - -gchar* -g_strjoin (const gchar *separator, - ...) -{ - gchar *string, *s; - va_list args; - guint len; - guint separator_len; - - if(separator == NULL) - separator = ""; - - separator_len = strlen (separator); - - va_start(args, separator); - - s = va_arg(args, gchar *); - - if(s) { - len = strlen(s) + 1; - - while((s = va_arg(args, gchar*))) - { - len += separator_len + strlen(s); - } - va_end(args); - - string = g_new (gchar, len); - - va_start(args, separator); - - *string = 0; - s = va_arg(args, gchar*); - strcat (string, s); - - while((s = va_arg(args, gchar*))) - { - strcat(string, separator); - strcat(string, s); - } - - } else - string = g_strdup(""); - - va_end(args); - - return string; -} - -/* this was introduced sometime between glib-1.0.1 and glib-1.0.4 */ -gpointer -g_slist_nth_data (GSList *list, - guint n) -{ - while ((n-- > 0) && list) - list = list->next; - - return list ? list->data : NULL; -} - - -#endif diff --git a/wiretap/glib-new.h b/wiretap/glib-new.h deleted file mode 100644 index 562efdbbb2..0000000000 --- a/wiretap/glib-new.h +++ /dev/null @@ -1,30 +0,0 @@ -/* GLIB - Library of useful routines for C programming - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -gpointer -g_memdup (const gpointer mem, - guint byte_size); - -gchar* -g_strjoin (const gchar *separator, - ...); - -gpointer -g_slist_nth_data (GSList *list, - guint n); diff --git a/wiretap/rt-compile.c b/wiretap/rt-compile.c deleted file mode 100644 index d11fe4c62c..0000000000 --- a/wiretap/rt-compile.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * rt-compile.c - * ------------ - * - */ - -#include -#include "wtap.h" -#include "bpf.h" -#include "rt-compile.h" -#include "rt-global.h" - -int (*mk_attach) - (wtap *wth); - -/* Takes a string representing a display filter, compiles it, and -if the filter compiles successfully, attaches the filter to the wtap handle. -The tricky part comes from the fact that some display filters are -datalink-type-independent (they refer to layers 3 and above of the OSI -protocol stack), whereas others are datalink-type-dependent. Furthermore, some -trace files supported by wiretap can handle more than one datalink type. - -We rely on the user to use the proper logic for multiple datalink types. For -example, if the user has a trace file with ethernet and token-ring packets, -and wants to filter on the MAC-layer broadcast address, he should write: - - (eth.dst eq ff:ff:ff:ff:ff:ff or tr.dst eq ff:ff:ff:ff:ff:ff) - -That is, "eth.dst eq ...." fails for a token-ring interface, and -"tr.dst eq ...." fails for an ethernet device. A logical "or" is needed -to find MAC-level broadcast addresses in both datalink types. */ - -int wtap_offline_filter(wtap *wth, char *filter) -{ - int encap_type; - - if (!filter) - return 0; - - /* temporary hack */ - if (filter[0] == 0) { - wtap_filter_offline_clear(wth); - return 0; - } - - /* we use the BPF engine for offline filters */ - wtap_filter_offline_init(wth); - wth->filter_text = g_strdup(filter); - - /* if the file format we are using has a per-file encapsulation - * type, then we can go ahead and compile the display filter for - * that datalink type. Otherwise, we'll guess ethernet. - */ - if (wth->file_encap != WTAP_ENCAP_NONE) - encap_type = wth->file_encap; - else - encap_type = WTAP_ENCAP_ETHERNET; - - if (!wtap_offline_filter_compile(wth, encap_type)) { - wtap_filter_offline_clear(wth); - return -1; - } - - return 0; -} - -/* this function is called from within wiretap to recompile the same display - * filter for a different datalink type. This is needed for trace files that - * have more than one encapsulation type in the same file - */ -int wtap_offline_filter_compile(wtap *wth, int encap_type) -{ - comp_encap_type = encap_type; - filter_parsed = 0; - wtap_lex_init(wth->filter_text); - wtap_parse(); - - if (!filter_parsed) - return 0; - - return mk_attach(wth); -} diff --git a/wiretap/rt-compile.h b/wiretap/rt-compile.h deleted file mode 100644 index d7a27aba32..0000000000 --- a/wiretap/rt-compile.h +++ /dev/null @@ -1,29 +0,0 @@ - -#ifndef __WTAP_H_ -#include "wtap.h" -#endif - -/* Holds info for fields defined as bytecmp. */ -typedef struct { - int ftype; - int ctype; - int offset; - int length; -} bytecmp_info; - - -/* Holds info for fields defined as either_of */ -typedef struct { - int ftype; - int ctype; - int field1; - int field2; -} eitherof_info; - -int wtap_lex(void); -int wtap_parse(void); -void wtap_error(char *string); - -void wtap_lex_init(char *); - -int wtap_offline_filter_compile(wtap *wth, int encap_type); diff --git a/wiretap/rt-global.h b/wiretap/rt-global.h deleted file mode 100644 index 952acc939a..0000000000 --- a/wiretap/rt-global.h +++ /dev/null @@ -1,23 +0,0 @@ - - -extern GList* (*mk_bytecmp) - (int ftype, int rel_opcode, guint8 *bytes); - -extern void (*mk_optimize) - (GList *L); - - -/* for those modules that are interested in mk_attach, - * wtap.h will have already been included. - */ -#ifdef __WTAP_H__ -extern int (*mk_attach) - (wtap *wth); -#endif - -extern bytecmp_info bytecmp_table[]; -extern int comp_encap_type; -extern int filter_parsed; - -bytecmp_info* lookup_bytecmp(int ftype); -eitherof_info* lookup_eitherof(int ftype); diff --git a/wiretap/rt-grammar-skel.y b/wiretap/rt-grammar-skel.y deleted file mode 100644 index b14d7b31f1..0000000000 --- a/wiretap/rt-grammar-skel.y +++ /dev/null @@ -1,134 +0,0 @@ -%{ - -#ifndef __G_LIB_H__ -#include -#endif - -#include "rt-compile.h" -#include "rt-global.h" -#include "ct-compile.h" - -GList* (*mk_bytecmp) (int ftype, int rel_opcode, guint8 *bytes); -void (*mk_optimize) (GList *L); - -/* The encapsulation type for which we are compiling the filter */ -int comp_encap_type; -int filter_parsed = 0; - -bytecmp_info *bytecmp; -eitherof_info *either; -GList *L1, *L2; - -/* ct-compile: bytecmp_table */ -/*bytecmp_info bytecmp_table[] = { - { ETH_TYPE, 12, 2 }, - { TR_DST, 2, 6 }, - { TR_SRC, 8, 6 }, - { ETH_DSTVENDOR, 0, 3 }, - { 0, 0, 0 } -};*/ - -/* ct-compile: eitherof_table */ -/*eitherof_table[] = { - { TR_VENDOR, CTYPE_BYTECMP, TR_SRCVENDOR, TR_DSTVENDOR }, - { TR_ADDR, CTYPE_BYTECMP, TR_SRCADDR, TR_DSTADDR } -}; -*/ -%} - -%union { - gint d; - guint8 *b; - GString *s; - GList *L; -} - -%type bytecmp_lval -%type sentence bytecmp_relation -%type bytecmp_test; - -%token BYTES -%token QUOTED TEXT -%token NUMBER -%token EQ NE - -/* ct-compile: yacc tokens */ - -%% - -paragraph: /* EMPTY */ - | paragraph sentence { mk_optimize($2); filter_parsed = 1; } - ; - -sentence: bytecmp_relation { $$ = $1 } - ; - - -bytecmp_relation: bytecmp_lval bytecmp_test BYTES -{ - bytecmp = lookup_bytecmp($1); - if (bytecmp->ctype == CTYPE_EITHEROF) { - either = lookup_eitherof($1); - L1 = mk_bytecmp(either->field1, $2, $3); - L2 = mk_bytecmp(either->field2, $2, $3); - $$ = g_list_concat(L1, L2); - } - else { - $$ = mk_bytecmp($1, $2, $3); - } -} - ; - -/* ct-compile: bytecmp_lval */ -/*bytecmp_lval: TR_DST { $$ = TR_DST; } - | TR_SRC { $$ = TR_SRC; } - | TR_SRCVENDOR { $$ = TR_SRCVENDOR; } - | TR_DSTVENDOR { $$ = TR_DSTVENDOR; } - ;*/ - -bytecmp_test: EQ { $$ = EQ; } - | NE { $$ = NE; } - ; - -%% - -bytecmp_info* -lookup_bytecmp(int ftype) -{ - bytecmp_info *b = &bytecmp_table[0]; - bytecmp_info *ret_val = NULL; - - /* find the field in the table */ - while (b->ftype != 0) { - if (b->ftype == ftype) { - ret_val = b; - break; - } - else { - b++; - } - } - - return ret_val; -} - - -eitherof_info* -lookup_eitherof(int ftype) -{ - eitherof_info *e = &eitherof_table[0]; - eitherof_info *ret_val = NULL; - - /* find the field in the table */ - while (e->ftype != 0) { - if (e->ftype == ftype) { - ret_val = e; - break; - } - else { - e++; - } - } - - return ret_val; -} diff --git a/wiretap/rt-scanner-skel.l b/wiretap/rt-scanner-skel.l deleted file mode 100644 index 6a14f8f343..0000000000 --- a/wiretap/rt-scanner-skel.l +++ /dev/null @@ -1,160 +0,0 @@ -%{ -#include -#include "rt-grammar.h" -guint8* parse_bytes(char *text); -enum nibble_t { high, low }; -static char *in_buffer; - -/* from libpcap */ -#ifdef FLEX_SCANNER -#define YY_NO_UNPUT -#undef YY_INPUT -#define YY_INPUT(buf, result, max)\ - {\ - char *src = in_buffer;\ - int i;\ -\ - if (*src == 0)\ - result = YY_NULL;\ - else {\ - for (i = 0; *src && i < max; ++i)\ - buf[i] = *src++;\ - in_buffer += i;\ - result = i;\ - }\ - } -#else -#undef getc -#define getc(fp) (*in_buffer == 0 ? EOF : *in_buffer++) -#endif - - -%} - -N ([0-9]+|(0X|0x)[0-9A-Fa-f]+) -B [0-9A-Fa-f][0-9A-Fa-f]?([-:.]?[0-9A-Fa-f][0-9A-Fa-f]?)* -W [A-Za-z_] -quoted \"[^"\n]*["\n] - -%% - -[\n\t ]+ /* eat whitespace */ - -{quoted} { - wtap_lval.s = g_string_new(wtap_text + 1); - g_string_truncate(wtap_lval.s, strlen(wtap_text) - 2); - return QUOTED; -} - -";" return ';'; -"," return ','; -"(" return '('; -")" return ')'; -"@" return '@'; - -/* ct-compile: lex tokens */ - -eq return EQ; -ne return NE; - -{B} { - wtap_lval.b = parse_bytes(wtap_text); - return BYTES; -} - -{N} { - wtap_lval.d = atoi(wtap_text); - return NUMBER; -} - -{W}+ { - wtap_lval.s = g_string_new(wtap_text); - return TEXT; - } - -%% - -guint8* -parse_bytes(char *text) -{ - guint8 buffer[256]; - guint8 index = 0; - char *cp; - char character; - guint8 byte_val=0; - gchar *dup_ptr; - enum nibble_t nibble = high; - - for (cp = text; (*cp != '\x0') && index < 256; cp++) { - character = *cp; - - if (nibble == high) { - /* assumes ASCII, not EBCDIC */ - if (character >= '0' && character <= '9') { - byte_val = (character - '0') << 4; - } - else if (character >= 'A' && character <= 'F') { - byte_val = (character - 'A' + 10) << 4; - } - else if (character >= 'a' && character <= 'f') { - byte_val = (character - 'a' + 10) << 4; - } - else { - continue; - } - nibble = low; - continue; - } - else { - /* assumes ASCII, not EBCDIC */ - if (character >= '0' && character <= '9') { - byte_val += (character - '0'); - } - else if (character >= 'A' && character <= 'F') { - byte_val += (character - 'A' + 10); - } - else if (character >= 'a' && character <= 'f') { - byte_val += (character - 'a' + 10); - } - else { - byte_val >>= 4; - } - nibble = high; - - buffer[index] = byte_val; - index++; - } - - } - - /* did we finish mid-nibble? */ - if (nibble == low) { - buffer[index] = byte_val >> 4; - index++; - } - - dup_ptr = g_malloc(index + 1); - dup_ptr[0] = index; - memcpy(dup_ptr + 1, buffer, index); - return dup_ptr; -} - - -void wtap_error(char *string) -{ - g_error("%s\n",string); - exit(0); -} - -void -wtap_lex_init(char *buf) -{ - in_buffer = buf; -} - -int -yywrap() -{ - return 1; -} - diff --git a/wiretap/wtap.c b/wiretap/wtap.c index e002d18e01..a88c3d70a4 100644 --- a/wiretap/wtap.c +++ b/wiretap/wtap.c @@ -1,6 +1,6 @@ /* wtap.c * - * $Id: wtap.c,v 1.7 1999/03/01 18:57:07 gram Exp $ + * $Id: wtap.c,v 1.8 1999/07/07 22:52:56 gram Exp $ * * Wiretap Library * Copyright (c) 1998 by Gilbert Ramirez @@ -75,35 +75,9 @@ void wtap_close(wtap *wth) void wtap_loop(wtap *wth, int count, wtap_handler callback, u_char* user) { int data_offset; - int ret; - int pkt_encap; while ((data_offset = wth->subtype_read(wth)) > 0) { - /* offline filter? */ - if (wth->filter_type == WTAP_FILTER_OFFLINE) { - pkt_encap = wth->phdr.pkt_encap; - - /* do we have a compiled filter for this - * encapsulation type? */ - if (!wth->filter.offline[pkt_encap]) - wtap_offline_filter_compile(wth, pkt_encap); - - /* run the filter */ - ret = bpf_run_filter( - buffer_start_ptr(wth->frame_buffer), - wth->phdr.caplen, - wth->filter.offline[pkt_encap], - wth->offline_filter_lengths[pkt_encap] - ); - - /* if the packet made it through the filter, - * send the data to the user */ - if (ret > 0) - callback(user, &wth->phdr, data_offset, - buffer_start_ptr(wth->frame_buffer)); - } - else - callback(user, &wth->phdr, data_offset, - buffer_start_ptr(wth->frame_buffer)); + callback(user, &wth->phdr, data_offset, + buffer_start_ptr(wth->frame_buffer)); } } diff --git a/wiretap/wtap.h b/wiretap/wtap.h index 230e702a32..61c302e4e4 100644 --- a/wiretap/wtap.h +++ b/wiretap/wtap.h @@ -1,6 +1,6 @@ /* wtap.h * - * $Id: wtap.h,v 1.18 1999/05/12 21:40:07 guy Exp $ + * $Id: wtap.h,v 1.19 1999/07/07 22:52:57 gram Exp $ * * Wiretap Library * Copyright (c) 1998 by Gilbert Ramirez @@ -136,23 +136,11 @@ typedef struct wtap { file formats that have per-file encapsulation types */ - union { - struct bpf_instruction *bpf; - struct bpf_instruction **offline; - } filter; - - gchar *filter_text; - int filter_type; - int filter_length; /* length in bytes or records, - depending upon filter_type */ - - int *offline_filter_lengths; } wtap; wtap* wtap_open_offline(char *filename); void wtap_loop(wtap *wth, int, wtap_handler, u_char*); -int wtap_offline_filter(wtap *wth, char *filter); FILE* wtap_file(wtap *wth); int wtap_snapshot_length(wtap *wth); /* per file */ -- 2.34.1