Merge tcpdump 4.2.1.

MFC after:	2 weeks
This commit is contained in:
Xin LI 2012-05-17 05:11:57 +00:00
commit cac3dcd5f9
167 changed files with 5160 additions and 34394 deletions

View File

@ -1,3 +1,64 @@
Friday December 9, 2011. guy@alum.mit.edu.
Summary for 4.2.1 tcpdump release
Only build the Babel printer if IPv6 is enabled.
Support Babel on port 6696 as well as 6697.
Include ppi.h in release tarball.
Include all the test files in the release tarball, and don't
"include" test files that no longer exist.
Don't assume we have <rpc/rpc.h> - check for it.
Support "-T carp" as a way of dissecting IP protocol 112 as CARP
rather than VRRP.
Support Hilscher NetAnalyzer link-layer header format.
Constify some pointers and fix compiler warnings.
Get rid of never-true test.
Fix an unintended fall-through in a case statement in the ARP
printer.
Fix several cases where sizeof(sizeof(XXX)) was used when just
sizeof(XXX) was intended.
Make stricter sanity checks in the ES-IS printer.
Get rid of some GCCisms that caused builds to fai with compilers
that don't support them.
Fix typo in man page.
Added length checks to Babel printer.
Sunday July 24, 2011. mcr@sandelman.ca.
Summary for 4.2.+
merged 802.15.4 decoder from Dmitry Eremin-Solenikov <dbaryshkov
at gmail dot com>
updates to forces for new port numbers
Use "-H", not "-h", for the 802.11s option. (-h always help)
Better ICMPv6 checksum handling.
add support for the RPKI/Router Protocol, per -ietf-sidr-rpki-rtr-12
get rid of uuencoded pcap test files, git can do binary.
sFlow changes for 64-bit counters.
fixes for PPI packet header handling and printing.
Add DCB Exchange protocol (DCBX) version 1.01.
Babel dissector, from Juliusz Chroboczek and Grégoire Henry.
improvements to radiotap for rate values > 127.
Many improvements to ForCES decode, including fix SCTP TML port
updated RPL type code to RPL-17 draft
Improve printout of DHCPv6 options.
added support and test case for QinQ (802.1q VLAN) packets
Handle DLT_IEEE802_15_4_NOFCS like DLT_IEEE802_15_4.
Build fixes for Sparc and other machines with alignment restrictions.
Merged changes from Debian package.
PGM: Add ACK decoding and add PGMCC DATA and FEEDBACK options.
Build fixes for OSX (Snow Leopard and others)
Add support for IEEE 802.15.4 packets
Tue. July 20, 2010. guy@alum.mit.edu.
Summary for 4.1.2 tcpdump release
If -U is specified, flush the file after creating it, so it's
not zero-length
Fix TCP flags output description, and some typoes, in the man
page
Add a -h flag, and only attempt to recognize 802.11s mesh
headers if it's set
When printing the link-layer type list, send *all* output to
stderr
Include the CFLAGS setting when configure was run in the
compiler flags
Thu. April 1, 2010. guy@alum.mit.edu.
Summary for 4.1.1 tcpdump release
Fix build on systems with PF, such as FreeBSD and OpenBSD.

View File

@ -10,6 +10,7 @@ The current maintainers:
Additional people who have contributed patches:
A Costa <agcosta at gis dot net>
Aaron Campbell <aaron at arbor dot net>
Alfredo Andres <aandres at s21sec dot com>
Albert Chin <china at thewrittenword dot com>
@ -18,9 +19,10 @@ Additional people who have contributed patches:
Andrew Brown <atatat at atatdot dot net>
Andrew Church <andrew at users dot sourceforge dot net>
Andrew Hintz <adhintz at users dot sourceforge dot net>
Andrew Silent <andrew at nording dot ru>
Andrew Nording <andrew at nording dot ru>
Andrew Tridgell <tridge at linuxcare dot com>
Andy Heffernan <ahh at juniper dot net>
Anton Bernal <anton at juniper dot net>
Arkadiusz Miskiewicz <misiek at pld dot org dot pl>
Armando L. Caro Jr. <acaro at mail dot eecis dot udel dot edu>
Arnaldo Carvalho de Melo <acme at ghostprotocols dot net>
@ -37,9 +39,10 @@ Additional people who have contributed patches:
Charles M. Hannum <mycroft at netbsd dot org>
Chris Cogdon <chris at cogdon dot org>
Chris G. Demetriou <cgd at netbsd dot org>
Christian Sievers <c_s at users dot sourceforge dot net>
Chris Jepeway <jepeway at blasted-heath dot com>
Chris Larson <clarson at kergoth dot com>
Christian Sievers <c_s at users dot sourceforge dot net>
Christophe Rhodes <csr21 at cantab dot net>
Craig Rodrigues <rodrigc at mediaone dot net>
Crist J. Clark <cjclark at alum dot mit dot edu>
Daniel Hagerty <hag at ai dot mit dot edu>
@ -48,6 +51,7 @@ Additional people who have contributed patches:
David Horn <dhorn2000 at gmail dot com>
David Smith <dsmith at redhat dot com>
David Young <dyoung at ojctech dot com>
Dmitry Eremin-Solenikov <dbaryshkov at gmail dot com>
Don Ebright <Don dot Ebright at compuware dot com>
Eddie Kohler <xexd at sourceforge dot net>
Elmar Kirchner <elmar at juniper dot net>
@ -65,8 +69,9 @@ Additional people who have contributed patches:
Gert Doering <gert at greenie dot muc dot de>
Greg Minshall <minshall at acm dot org>
Greg Stark <gsstark at mit dot edu>
Grégoire Henry <henry@pps.jussieu.fr>
Gilbert Ramirez Jr. <gram at xiexie dot org>
Gisle Vanem <giva at bgnett dot no>
Gisle Vanem <gvanem at broadpark dot no>
Hannes Viertel <hviertel at juniper dot net>
Hank Leininger <tcpdump-workers at progressive-comp dot com>
Harry Raaymakers <harryr at connect dot com dot au>
@ -89,7 +94,9 @@ Additional people who have contributed patches:
Joerg Mayer <jmayer@loplof.de>
Jørgen Thomsen <jth at jth dot net>
Julian Cowley <julian at lava dot net>
Juliusz Chroboczek <jch@pps.jussieu.fr>
Kaarthik Sivakumar <kaarthik at torrentnet dot com>
Kaladhar Musunuru <kaladharm at sourceforge dot net>
Karl Norby <karl-norby at sourceforge dot net>
Kazushi Sugyo <sugyo at pb dot jp dot nec dot com>
Kelly Carmichael <kcarmich at ipapp dot com>
@ -120,8 +127,10 @@ Additional people who have contributed patches:
Michael Shalayeff <mickey at openbsd dot org>
Michael Shields <shields at msrl dot com>
Michael T. Stolarchuk <mts at off dot to>
Michal Sekletar <msekleta at redhat dot com>
Michele "mydecay" Marchetto <smarchetto1 at tin dot it>
Mike Frysinger <vapier at gmail dot com>
Minto Jeyananth <minto at juniper dot net>
Monroe Williams <monroe at pobox dot com>
Motonori Shindo <mshindo at mshindo dot net>
Nathan J. Williams <nathanw at MIT dot EDU>
@ -136,9 +145,11 @@ Additional people who have contributed patches:
Paolo Abeni <paolo dot abeni at email dot it>
Pascal Hennequin <pascal dot hennequin at int-evry dot fr>
Pasvorn Boonmark <boonmark at juniper dot net>
Paul Ferrell <pflarr at sourceforge dot net>
Paul Mundt <lethal at linux-sh dot org>
Paul S. Traina <pst at freebsd dot org>
Pavlin Radoslavov <pavlin at icir dot org>
Pawel Worach <pawel dot worach at gmail dot com>
Pekka Savola <pekkas at netcore dot fi>
Peter Fales <peter at fales-lorenz dot net>
Peter Jeremy <peter dot jeremy at alcatel dot com dot au>
@ -154,8 +165,10 @@ Additional people who have contributed patches:
Rob Braun <bbraun at synack dot net>
Robert Edmonds <stu-42 at sourceforge dot net>
Roderick Schertler <roderick at argon dot org>
Romain Francoise <rfrancoise at debian dot org>
Sagun Shakya <sagun dot shakya at sun dot com>
Sami Farin <safari at iki dot fi>
Scott Mcmillan <scott.a.mcmillan at intel dot com>
Scott Rose <syberpunk at users dot sourceforge dot net>
Sebastian Krahmer <krahmer at cs dot uni-potsdam dot de>
Sebastien Raveau <sebastien dot raveau at epita dot fr>
@ -172,6 +185,7 @@ Additional people who have contributed patches:
Toshihiro Kanda <candy at fct dot kgc dot co dot jp>
Uns Lider <unslider at miranda dot org>
Victor Oppleman <oppleman at users dot sourceforge dot net>
Weesan Lee <weesan at juniper dot net>
Wesley Griffin <wgriffin at users dot sourceforge dot net>
Wesley Shields <wxs at FreeBSD dot org>
Wilbert de Graaf <wilbertdg at hetnet dot nl>

View File

@ -26,6 +26,7 @@
# Top level hierarchy
prefix = @prefix@
exec_prefix = @exec_prefix@
datarootdir = @datarootdir@
# Pathname of directory to install the binary
sbindir = @sbindir@
# Pathname of directory to install the man page
@ -46,7 +47,8 @@ INCLS = -I. @V_INCLS@
DEFS = @DEFS@ @CPPFLAGS@ @V_DEFS@
# Standard CFLAGS
CFLAGS = $(CCOPT) $(DEFS) $(INCLS)
CFLAGS = @CFLAGS@
FULL_CFLAGS = $(CCOPT) $(DEFS) $(INCLS) $(CFLAGS)
# Standard LDFLAGS
LDFLAGS = @LDFLAGS@
@ -64,15 +66,15 @@ RANLIB = @RANLIB@
# problem if you don't own the file but can write to the directory.
.c.o:
@rm -f $@
$(CC) $(CFLAGS) -c $(srcdir)/$*.c
$(CC) $(FULL_CFLAGS) -c $(srcdir)/$*.c
CSRC = addrtoname.c af.c checksum.c cpack.c gmpls.c oui.c gmt2local.c ipproto.c \
nlpid.c l2vpn.c machdep.c parsenfsfh.c \
print-802_11.c print-ap1394.c print-ah.c print-arcnet.c \
print-aodv.c print-arp.c print-ascii.c print-atalk.c print-atm.c \
print-beep.c print-bfd.c print-bgp.c print-bootp.c print-bt.c \
print-cdp.c print-cfm.c print-chdlc.c print-cip.c print-cnfp.c \
print-dccp.c print-decnet.c \
nlpid.c l2vpn.c machdep.c parsenfsfh.c in_cksum.c \
print-802_11.c print-802_15_4.c print-ap1394.c print-ah.c \
print-arcnet.c print-aodv.c print-arp.c print-ascii.c print-atalk.c \
print-atm.c print-beep.c print-bfd.c print-bgp.c \
print-bootp.c print-bt.c print-carp.c print-cdp.c print-cfm.c \
print-chdlc.c print-cip.c print-cnfp.c print-dccp.c print-decnet.c \
print-domain.c print-dtp.c print-dvmrp.c print-enc.c print-egp.c \
print-eap.c print-eigrp.c\
print-esp.c print-ether.c print-fddi.c print-fr.c \
@ -83,8 +85,9 @@ CSRC = addrtoname.c af.c checksum.c cpack.c gmpls.c oui.c gmt2local.c ipproto.c
print-lmp.c print-lspping.c print-lwapp.c \
print-lwres.c print-mobile.c print-mpcp.c print-mpls.c print-msdp.c \
print-nfs.c print-ntp.c print-null.c print-olsr.c print-ospf.c \
print-pgm.c print-pim.c print-ppp.c print-pppoe.c print-pptp.c \
print-radius.c print-raw.c print-rip.c print-rrcp.c print-rsvp.c \
print-pgm.c print-pim.c \
print-ppi.c print-ppp.c print-pppoe.c print-pptp.c \
print-radius.c print-raw.c print-rip.c print-rpki-rtr.c print-rrcp.c print-rsvp.c \
print-rx.c print-sctp.c print-sflow.c print-sip.c print-sl.c print-sll.c \
print-slow.c print-snmp.c print-stp.c print-sunatm.c print-sunrpc.c \
print-symantec.c print-syslog.c print-tcp.c print-telnet.c print-tftp.c \
@ -165,6 +168,7 @@ HDR = \
oui.h \
pcap-missing.h \
pmap_prot.h \
ppi.h \
ppp.h \
route6d.h \
rpc_auth.h \
@ -226,16 +230,12 @@ EXTRA_DIST = \
lbl/os-ultrix4.h \
makemib \
missing/addrinfo.h \
missing/addrsize.h \
missing/bittypes.h \
missing/dlnames.c \
missing/datalinks.c \
missing/getnameinfo.c \
missing/inet_aton.c \
missing/inet_ntop.c \
missing/inet_pton.c \
missing/resolv6.h \
missing/resolv_ext.h \
missing/snprintf.c \
missing/sockstorage.h \
missing/strdup.c \
@ -245,6 +245,7 @@ EXTRA_DIST = \
mkdep \
packetdat.awk \
pcap_dump_ftell.c \
print-babel.c \
print-dhcp6.c \
print-frag6.c \
print-icmp6.c \
@ -262,12 +263,18 @@ EXTRA_DIST = \
stime.awk \
strcasecmp.c \
tcpdump.1.in \
tests/02-sunrise-sunset-esp.puu \
tests/08-sunrise-sunset-aes.puu \
tests/08-sunrise-sunset-esp2.puu \
tests/02-sunrise-sunset-esp.pcap \
tests/08-sunrise-sunset-aes.pcap \
tests/08-sunrise-sunset-esp2.pcap \
tests/QinQpacket.out \
tests/QinQpacket.pcap \
tests/QinQpacketv.out \
tests/TESTLIST \
tests/TESTonce \
tests/TESTrun.sh \
tests/babel.pcap \
tests/babel1.out \
tests/babel1v.out \
tests/bgp-infinite-loop.pcap \
tests/bgp_vpn_attrset.out \
tests/bgp_vpn_attrset.pcap \
@ -279,8 +286,8 @@ EXTRA_DIST = \
tests/e1000g.pcap \
tests/eapon1.gdbinit \
tests/eapon1.out \
tests/eapon1.puu \
tests/eapon2.puu \
tests/eapon1.pcap \
tests/empty.uu \
tests/esp-secrets.txt \
tests/esp0.out \
tests/esp1.gdbinit \
@ -292,61 +299,57 @@ EXTRA_DIST = \
tests/esp5.gdbinit \
tests/esp5.out \
tests/espudp1.out \
tests/espudp1.puu \
tests/espudp1.pcap \
tests/forces1.out \
tests/forces1.pcap \
tests/forces1vvv.out \
tests/forces1vvvv.out \
tests/forces2.out \
tests/forces2.pcap \
tests/forces2v.out \
tests/forces2vv.out \
tests/ikev2.puu \
tests/forces3vvv.out \
tests/ikev2four.out \
tests/ikev2four.puu \
tests/ikev2four.pcap \
tests/ikev2fourv.out \
tests/ikev2fourv4.out \
tests/ikev2pI2-secrets.txt \
tests/ikev2pI2.out \
tests/ikev2pI2.puu \
tests/isakmp-delete-segfault.puu \
tests/isakmp-identification-segfault.puu \
tests/isakmp-pointer-loop.puu \
tests/ikev2pI2.pcap \
tests/isakmp-delete-segfault.pcap \
tests/isakmp-identification-segfault.pcap \
tests/isakmp-pointer-loop.pcap \
tests/isakmp1.out \
tests/isakmp2.out \
tests/isakmp3.out \
tests/isakmp4.out \
tests/isakmp4500.puu \
tests/isakmp4500.pcap \
tests/isis-infinite-loop.pcap \
tests/ldp-infinite-loop.pcap \
tests/lmp.out \
tests/lmp.puu \
tests/lmp.pcap \
tests/lmp.sh \
tests/lspping-fec-ldp.pcap \
tests/lspping-fec-rsvp.pcap \
tests/mpls-ldp-hello.out \
tests/mpls-ldp-hello.puu \
tests/mpls-ldp-hello.pcap \
tests/mpls-traceroute.pcap \
tests/ospf-gmpls.out \
tests/ospf-gmpls.puu \
tests/ospf-gmpls.pcap \
tests/print-A.out \
tests/print-AA.out \
tests/print-capX.out \
tests/print-capXX.out \
tests/print-flags.puu \
tests/print-flags.pcap \
tests/print-flags.sh \
tests/print-x.out \
tests/print-xx.out \
tests/rsvp-infinite-loop.pcap \
tests/sflow_multiple_counter_30_pdus.out \
tests/sflow_multiple_counter_30_pdus.pcap \
vfprintf.c \
win32/Include/Arpa/tftp.h \
win32/Include/errno.h \
win32/Include/getopt.h \
win32/Include/inetprivate.h \
win32/Include/telnet.h \
win32/Include/w32_fzs.h \
win32/Include/Netinet/in_systm.h \
win32/Include/Netinet/ip.h \
win32/Src/getopt.c \
win32/prj/GNUmakefile \
win32/prj/WinDump.dsp \
@ -356,7 +359,7 @@ all: $(PROG)
$(PROG): $(OBJ) @V_PCAPDEP@
@rm -f $@
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJ) $(LIBS)
$(CC) $(FULL_CFLAGS) $(LDFLAGS) -o $@ $(OBJ) $(LIBS)
$(LIBNETDISSECT): $(LIBNETDISSECT_OBJ)
@rm -f $@
@ -364,30 +367,30 @@ $(LIBNETDISSECT): $(LIBNETDISSECT_OBJ)
$(RANLIB) $@
datalinks.o: $(srcdir)/missing/datalinks.c
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/datalinks.c
$(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/datalinks.c
dlnames.o: $(srcdir)/missing/dlnames.c
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/dlnames.c
$(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/dlnames.c
getnameinfo.o: $(srcdir)/missing/getnameinfo.c
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/getnameinfo.c
$(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/getnameinfo.c
getaddrinfo.o: $(srcdir)/missing/getaddrinfo.c
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/getaddrinfo.c
$(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/getaddrinfo.c
inet_pton.o: $(srcdir)/missing/inet_pton.c
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/inet_pton.c
$(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/inet_pton.c
inet_ntop.o: $(srcdir)/missing/inet_ntop.c
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/inet_ntop.c
$(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/inet_ntop.c
inet_aton.o: $(srcdir)/missing/inet_aton.c
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/inet_aton.c
$(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/inet_aton.c
snprintf.o: $(srcdir)/missing/snprintf.c
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/snprintf.c
$(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/snprintf.c
strlcat.o: $(srcdir)/missing/strlcat.c
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/strlcat.c
$(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/strlcat.c
strlcpy.o: $(srcdir)/missing/strlcpy.c
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/strlcpy.c
$(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/strlcpy.c
strsep.o: $(srcdir)/missing/strsep.c
$(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/strsep.c
$(CC) $(FULL_CFLAGS) -o $@ -c $(srcdir)/missing/strsep.c
version.o: version.c
$(CC) $(CFLAGS) -c version.c
$(CC) $(FULL_CFLAGS) -c version.c
version.c: $(srcdir)/VERSION
@rm -f $@
@ -423,9 +426,9 @@ clean:
distclean:
rm -f $(CLEANFILES) Makefile config.cache config.log config.status \
config.h gnuc.h os-proto.h stamp-h stamp-h.in $(PROG).1
rm -rf autom4te.cache
check: tcpdump
uudecode --help || (echo "No uudecode program found, not running tests"; echo "apt-get/rpm install sharutils?"; exit 1)
(cd tests && ./TESTrun.sh)
tags: $(TAGFILES)

View File

@ -1 +1 @@
4.1.1
4.2.1

View File

@ -8,12 +8,6 @@
/* Define if you enable support for the libsmi. */
#undef LIBSMI
/* define if you have struct __res_state_ext */
#undef HAVE_RES_STATE_EXT
/* define if your struct __res_state has the nsort member */
#undef HAVE_NEW_RES_STATE
/* define if you have the addrinfo function. */
#undef HAVE_ADDRINFO
@ -23,15 +17,6 @@
/* define ifyou have the h_errno variable. */
#undef HAVE_H_ERRNO
/* define if IN6ADDRSZ is defined (XXX not used!) */
#undef HAVE_IN6ADDRSZ
/* define if INADDRSZ is defined (XXX not used!) */
#undef HAVE_INADDRSZ
/* define if RES_USE_INET6 is defined */
#undef HAVE_RES_USE_INET6
/* define if you have struct sockaddr_storage */
#undef HAVE_SOCKADDR_STORAGE
@ -68,9 +53,6 @@
/* define if you have getrpcbynumber() */
#undef HAVE_GETRPCBYNUMBER
/* AIX hack. */
#undef _SUN
/* Workaround for missing 64-bit formats */
#undef PRId64
#undef PRIo64

View File

@ -509,6 +509,34 @@ etheraddr_string(register const u_char *ep)
return (tp->e_name);
}
const char *
le64addr_string(const u_char *ep)
{
const unsigned int len = 8;
register u_int i;
register char *cp;
register struct enamemem *tp;
char buf[BUFSIZE];
tp = lookup_bytestring(ep, len);
if (tp->e_name)
return (tp->e_name);
cp = buf;
for (i = len; i > 0 ; --i) {
*cp++ = hex[*(ep + i - 1) >> 4];
*cp++ = hex[*(ep + i - 1) & 0xf];
*cp++ = ':';
}
cp --;
*cp = '\0';
tp->e_name = strdup(buf);
return (tp->e_name);
}
const char *
linkaddr_string(const u_char *ep, const unsigned int type, const unsigned int len)
{

View File

@ -34,6 +34,7 @@ enum {
extern const char *linkaddr_string(const u_char *, const unsigned int, const unsigned int);
extern const char *etheraddr_string(const u_char *);
extern const char *le64addr_string(const u_char *);
extern const char *etherproto_string(u_short);
extern const char *tcpport_string(u_short);
extern const char *udpport_string(u_short);

View File

@ -37,7 +37,7 @@ struct bootp {
u_int8_t bp_sname[64]; /* server host name */
u_int8_t bp_file[128]; /* boot file name */
u_int8_t bp_vend[64]; /* vendor-specific area */
};
} UNALIGNED;
/*
* UDP port numbers, server and client.
@ -217,7 +217,7 @@ struct cmu_vend {
struct in_addr v_ins1, v_ins2; /* IEN-116 name servers */
struct in_addr v_ts1, v_ts2; /* Time servers */
u_int8_t v_unused[24]; /* currently unused */
};
} UNALIGNED;
/* v_flags values */

View File

@ -8,12 +8,6 @@
/* Define if you enable support for the libsmi. */
#undef LIBSMI
/* define if you have struct __res_state_ext */
#undef HAVE_RES_STATE_EXT
/* define if your struct __res_state has the nsort member */
#undef HAVE_NEW_RES_STATE
/* define if you have the addrinfo function. */
#undef HAVE_ADDRINFO
@ -23,15 +17,6 @@
/* define ifyou have the h_errno variable. */
#undef HAVE_H_ERRNO
/* define if IN6ADDRSZ is defined (XXX not used!) */
#undef HAVE_IN6ADDRSZ
/* define if INADDRSZ is defined (XXX not used!) */
#undef HAVE_INADDRSZ
/* define if RES_USE_INET6 is defined */
#undef HAVE_RES_USE_INET6
/* define if you have struct sockaddr_storage */
#undef HAVE_SOCKADDR_STORAGE
@ -68,9 +53,6 @@
/* define if you have getrpcbynumber() */
#undef HAVE_GETRPCBYNUMBER
/* AIX hack. */
#undef _SUN
/* Workaround for missing 64-bit formats */
#undef PRId64
#undef PRIo64
@ -108,6 +90,9 @@
/* Define to 1 if you have the <fcntl.h> header file. */
#undef HAVE_FCNTL_H
/* Define to 1 if you have the `fork' function. */
#undef HAVE_FORK
/* Define to 1 if you have the `getnameinfo' function. */
#undef HAVE_GETNAMEINFO
@ -165,6 +150,9 @@
/* Define to 1 if you have the `pcap_lib_version' function. */
#undef HAVE_PCAP_LIB_VERSION
/* Define to 1 if you have the `pcap_set_tstamp_type' function. */
#undef HAVE_PCAP_SET_TSTAMP_TYPE
/* Define to 1 if you have the <pcap/usb.h> header file. */
#undef HAVE_PCAP_USB_H
@ -174,6 +162,9 @@
/* Define to 1 if you have the <rpc/rpcent.h> header file. */
#undef HAVE_RPC_RPCENT_H
/* Define to 1 if you have the <rpc/rpc.h> header file. */
#undef HAVE_RPC_RPC_H
/* Define to 1 if you have the `setlinebuf' function. */
#undef HAVE_SETLINEBUF
@ -237,6 +228,9 @@
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define to 1 if you have the `vfork' function. */
#undef HAVE_VFORK
/* Define to 1 if you have the `vfprintf' function. */
#undef HAVE_VFPRINTF
@ -276,21 +270,6 @@
/* return value of signal handlers */
#undef RETSIGVAL
/* The size of `char', as computed by sizeof. */
#undef SIZEOF_CHAR
/* The size of `int', as computed by sizeof. */
#undef SIZEOF_INT
/* The size of `long', as computed by sizeof. */
#undef SIZEOF_LONG
/* The size of `long long', as computed by sizeof. */
#undef SIZEOF_LONG_LONG
/* The size of `short', as computed by sizeof. */
#undef SIZEOF_SHORT
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
@ -303,6 +282,9 @@
/* needed on HP-UX */
#undef _HPUX_SOURCE
/* define on AIX to get certain functions */
#undef _SUN
/* define if your compiler allows __attribute__((format)) to be applied to
function pointers */
#undef __ATTRIBUTE___FORMAT_OK_FOR_FUNCTION_POINTERS

File diff suppressed because it is too large Load Diff

View File

@ -29,7 +29,7 @@ AC_C___ATTRIBUTE__
if test "$ac_cv___attribute__" = "yes"; then
AC_C___ATTRIBUTE___FORMAT_FUNCTION_POINTER
fi
AC_CHECK_HEADERS(fcntl.h rpc/rpcent.h netdnet/dnetdb.h)
AC_CHECK_HEADERS(fcntl.h rpc/rpc.h rpc/rpcent.h netdnet/dnetdb.h)
AC_CHECK_HEADERS(net/pfvar.h, , , [#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>])
@ -60,6 +60,33 @@ AC_HEADER_TIME
case "$host_os" in
darwin*)
AC_ARG_ENABLE(universal,
AC_HELP_STRING([--disable-universal],[don't build universal on OS X]))
if test "$enable_universal" != "no"; then
case "$host_os" in
darwin9.*)
#
# Leopard. Build for x86 and 32-bit PowerPC, with
# x86 first. (That's what Apple does.)
#
V_CCOPT="$V_CCOPT -arch i386 -arch ppc"
LDFLAGS="$LDFLAGS -arch i386 -arch ppc"
;;
darwin10.*)
#
# Snow Leopard. Build for x86-64 and x86, with
# x86-64 first. (That's what Apple does.)
#
V_CCOPT="$V_CCOPT -arch x86_64 -arch i386"
LDFLAGS="$LDFLAGS -arch x86_64 -arch i386"
;;
esac
fi
;;
linux*)
AC_MSG_CHECKING(Linux kernel version)
if test "$cross_compiling" = yes; then
@ -172,7 +199,7 @@ AC_ARG_ENABLE(ipv6,
--disable-ipv6 disable ipv6 support],
[ case "$enableval" in
yes) AC_MSG_RESULT(yes)
LOCALSRC="print-ip6.c print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c $LOCALSRC"
LOCALSRC="print-ip6.c print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c print-babel.c $LOCALSRC"
AC_DEFINE(INET6)
ipv6=yes
;;
@ -194,7 +221,7 @@ main()
}
],
[ AC_MSG_RESULT(yes)
LOCALSRC="print-ip6.c print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c $LOCALSRC"
LOCALSRC="print-ip6.c print-ip6opts.c print-mobility.c print-ripng.c print-icmp6.c print-frag6.c print-rt6.c print-ospf6.c print-dhcp6.c print-babel.c $LOCALSRC"
AC_DEFINE(INET6)
ipv6=yes],
[ AC_MSG_RESULT(no)
@ -467,15 +494,6 @@ if test "$td_cv_decl_netdnet_dnetdb_h_dnet_htoa" = yes; then
AC_DEFINE(HAVE_NETDNET_DNETDB_H_DNET_HTOA)
fi
dnl
dnl check sizeof basic types.
dnl They're very likely to be wrong for cross-compiling.
AC_CHECK_SIZEOF(char, 1)
AC_CHECK_SIZEOF(short, 2)
AC_CHECK_SIZEOF(int, 4)
AC_CHECK_SIZEOF(long, 4)
AC_CHECK_SIZEOF(long long, 8)
dnl
dnl Checks for addrinfo structure
AC_STRUCT_ADDRINFO(ac_cv_addrinfo)
@ -504,34 +522,8 @@ if test "$ac_cv_sa_storage" = no; then
missing_includes=yes
fi
dnl
dnl Checks for IN[6]ADDRSZ
AC_CHECK_ADDRSZ(ac_cv_addrsz)
if test "$ac_cv_addrsz" = no; then
missing_includes=yes
fi
dnl
dnl Checks for RES_USE_INET6
AC_CHECK_RES_USE_INET6(ac_cv_res_inet6)
if test "$ac_cv_res_inet6" = no; then
missing_includes=yes
fi
dnl
dnl Checks for res_state_ext structure
AC_STRUCT_RES_STATE_EXT(ac_cv_res_state_ext)
if test "$ac_cv_res_state_ext" = no; then
missing_includes=yes
fi
dnl
dnl Checks if res_state structure has nsort member.
AC_STRUCT_RES_STATE(ac_cv_res_state)
AC_REPLACE_FUNCS(vfprintf strcasecmp strlcat strlcpy strdup strsep)
AC_CHECK_FUNCS(strftime)
AC_CHECK_FUNCS(fork vfork strftime)
AC_CHECK_FUNCS(setlinebuf alarm)
needsnprintf=no
@ -723,8 +715,17 @@ fi
#
# Do we have the new open API? Check for pcap_create, and assume that,
# if we do, we also have pcap_activate() and the other new routines.
# if we do, we also have pcap_activate() and the other new routines
# introduced in libpcap 1.0.0.
#
AC_CHECK_FUNCS(pcap_create)
if test $ac_cv_func_pcap_create = "yes" ; then
#
# OK, do we have pcap_set_tstamp_type? If so, assume we have
# pcap_list_tstamp_types and pcap_free_tstamp_types as well.
#
AC_CHECK_FUNCS(pcap_set_tstamp_type)
fi
AC_CHECK_FUNCS(pcap_findalldevs pcap_dump_flush pcap_lib_version)
if test $ac_cv_func_pcap_findalldevs = "yes" ; then
@ -803,7 +804,7 @@ case "$host_os" in
aix*)
dnl Workaround to enable certain features
AC_DEFINE(_SUN)
AC_DEFINE(_SUN,1,[define on AIX to get certain functions])
;;
hpux*)
@ -849,16 +850,6 @@ if test -f /dev/bpf0 ; then
V_GROUP=bpf
fi
#
# Check for some headers introduced in later versions of libpcap
# and used by some printers.
#
savedcppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $V_INCLS"
AC_CHECK_HEADERS(pcap/bluetooth.h)
AC_CHECK_HEADERS(pcap/usb.h)
CPPFLAGS="$savedcppflags"
AC_CHECK_HEADERS(sys/bitypes.h)
AC_CHECK_TYPE([int8_t], ,
@ -980,6 +971,19 @@ if test "$ac_lbl_inttypes_h_defines_formats" = no; then
])
fi
#
# Check for some headers introduced in later versions of libpcap
# and used by some printers.
#
# Those headers use the {u_}intN_t types, so we must do this after
# we check for what's needed to get them defined.
#
savedcppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $V_INCLS"
AC_CHECK_HEADERS(pcap/bluetooth.h,,,[#include <tcpdump-stdinc.h>])
AC_CHECK_HEADERS(pcap/usb.h,,,[#include <tcpdump-stdinc.h>])
CPPFLAGS="$savedcppflags"
AC_PROG_RANLIB
AC_LBL_DEVEL(V_CCOPT)
@ -1063,8 +1067,10 @@ if test "$want_libcrypto" != "no"; then
fi
AC_CHECK_LIB(crypto, DES_cbc_encrypt)
savedppflags="$CPPLAGS"
CPPFLAGS="$CPPFLAGS $V_INCLS"
AC_CHECK_HEADERS(openssl/evp.h)
CPPFLAGS="$savedcppflags"
else
#
# Not found. Did the user explicitly ask for it?
@ -1079,8 +1085,8 @@ fi
dnl
dnl set additional include path if necessary
if test "$missing_includes" = "yes"; then
CPPFLAGS="$CPPFLAGS -I\$(srcdir)/missing"
V_INCLS="$V_INCLS -I\$(srcdir)/missing"
CPPFLAGS="$CPPFLAGS -I$srcdir/missing"
V_INCLS="$V_INCLS -I$srcdir/missing"
fi
AC_SUBST(V_CCOPT)

View File

@ -38,7 +38,7 @@
#include "cpack.h"
#include "extract.h"
static u_int8_t *
u_int8_t *
cpack_next_boundary(u_int8_t *buf, u_int8_t *p, size_t alignment)
{
size_t misalignment = (size_t)(p - buf) % alignment;
@ -53,7 +53,7 @@ cpack_next_boundary(u_int8_t *buf, u_int8_t *p, size_t alignment)
* wordsize bytes remain in the buffer after the boundary. Otherwise,
* return a pointer to the boundary.
*/
static u_int8_t *
u_int8_t *
cpack_align_and_reserve(struct cpack_state *cs, size_t wordsize)
{
u_int8_t *next;

View File

@ -43,6 +43,9 @@ int cpack_uint16(struct cpack_state *, u_int16_t *);
int cpack_uint32(struct cpack_state *, u_int32_t *);
int cpack_uint64(struct cpack_state *, u_int64_t *);
u_int8_t *cpack_next_boundary(u_int8_t *buf, u_int8_t *p, size_t alignment);
u_int8_t *cpack_align_and_reserve(struct cpack_state *cs, size_t wordsize);
#define cpack_int8(__s, __p) cpack_uint8((__s), (u_int8_t*)(__p))
#define cpack_int16(__s, __p) cpack_uint16((__s), (u_int16_t*)(__p))
#define cpack_int32(__s, __p) cpack_uint32((__s), (u_int32_t*)(__p))

View File

@ -104,6 +104,20 @@
#ifndef ETHERTYPE_8021Q
#define ETHERTYPE_8021Q 0x8100
#endif
/* see:
http://en.wikipedia.org/wiki/IEEE_802.1Q
and http://en.wikipedia.org/wiki/QinQ
*/
#ifndef ETHERTYPE_8021Q9100
#define ETHERTYPE_8021Q9100 0x9100
#endif
#ifndef ETHERTYPE_8021Q9200
#define ETHERTYPE_8021Q9200 0x9200
#endif
#ifndef ETHERTYPE_8021QinQ
#define ETHERTYPE_8021QinQ 0x88a8
#endif
#ifndef ETHERTYPE_IPX
#define ETHERTYPE_IPX 0x8137
#endif

View File

@ -585,7 +585,7 @@ int pkeyitlv_print(register const u_char * pptr, register u_int len,
u_int16_t op_msk, int indent);
int pdatacnt_print(register const u_char * pptr, register u_int len,
u_int32_t IDcnt, u_int16_t op_msk, int indent);
u_int16_t IDcnt, u_int16_t op_msk, int indent);
int pdata_print(register const u_char * pptr, register u_int len,
u_int16_t op_msk, int indent);

View File

@ -158,6 +158,10 @@ struct ieee80211_radiotap_header {
* Unitless indication of the Rx/Tx antenna for this packet.
* The first antenna is antenna 0.
*
* IEEE80211_RADIOTAP_RX_FLAGS u_int16_t bitmap
*
* Properties of received frames. See flags defined below.
*
* IEEE80211_RADIOTAP_XCHANNEL u_int32_t bitmap
* u_int16_t MHz
* u_int8_t channel number
@ -168,6 +172,25 @@ struct ieee80211_radiotap_header {
* finally the maximum regulatory transmit power cap in .5 dBm
* units. This property supersedes IEEE80211_RADIOTAP_CHANNEL
* and only one of the two should be present.
*
* IEEE80211_RADIOTAP_MCS u_int8_t known
* u_int8_t flags
* u_int8_t mcs
*
* Bitset indicating which fields have known values, followed
* by bitset of flag values, followed by the MCS rate index as
* in IEEE 802.11n.
*
* IEEE80211_RADIOTAP_VENDOR_NAMESPACE
* u_int8_t OUI[3]
* u_int8_t subspace
* u_int16_t length
*
* The Vendor Namespace Field contains three sub-fields. The first
* sub-field is 3 bytes long. It contains the vendor's IEEE 802
* Organizationally Unique Identifier (OUI). The fourth byte is a
* vendor-specific "namespace selector."
*
*/
enum ieee80211_radiotap_type {
IEEE80211_RADIOTAP_TSFT = 0,
@ -184,8 +207,12 @@ enum ieee80211_radiotap_type {
IEEE80211_RADIOTAP_ANTENNA = 11,
IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12,
IEEE80211_RADIOTAP_DB_ANTNOISE = 13,
IEEE80211_RADIOTAP_RX_FLAGS = 14,
/* NB: gap for netbsd definitions */
IEEE80211_RADIOTAP_XCHANNEL = 18,
IEEE80211_RADIOTAP_MCS = 19,
IEEE80211_RADIOTAP_NAMESPACE = 29,
IEEE80211_RADIOTAP_VENDOR_NAMESPACE = 30,
IEEE80211_RADIOTAP_EXT = 31
};
@ -206,6 +233,19 @@ enum ieee80211_radiotap_type {
#define IEEE80211_CHAN_HT40U 0x20000 /* HT 40 channel w/ ext above */
#define IEEE80211_CHAN_HT40D 0x40000 /* HT 40 channel w/ ext below */
/* Useful combinations of channel characteristics, borrowed from Ethereal */
#define IEEE80211_CHAN_A \
(IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM)
#define IEEE80211_CHAN_B \
(IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK)
#define IEEE80211_CHAN_G \
(IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN)
#define IEEE80211_CHAN_TA \
(IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM | IEEE80211_CHAN_TURBO)
#define IEEE80211_CHAN_TG \
(IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN | IEEE80211_CHAN_TURBO)
/* For IEEE80211_RADIOTAP_FLAGS */
#define IEEE80211_RADIOTAP_F_CFP 0x01 /* sent/received
* during CFP
@ -226,6 +266,26 @@ enum ieee80211_radiotap_type {
* (to 32-bit boundary)
*/
#define IEEE80211_RADIOTAP_F_BADFCS 0x40 /* does not pass FCS check */
#define IEEE80211_RADIOTAP_F_SHORTGI 0x80 /* HT short GI */
/* For IEEE80211_RADIOTAP_RX_FLAGS */
#define IEEE80211_RADIOTAP_F_RX_BADFCS 0x0001 /* frame failed crc check */
#define IEEE80211_RADIOTAP_F_RX_PLCP_CRC 0x0002 /* frame failed PLCP CRC check */
/* For IEEE80211_RADIOTAP_MCS known */
#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_KNOWN 0x01
#define IEEE80211_RADIOTAP_MCS_MCS_INDEX_KNOWN 0x02 /* MCS index field */
#define IEEE80211_RADIOTAP_MCS_GUARD_INTERVAL_KNOWN 0x04
#define IEEE80211_RADIOTAP_MCS_HT_FORMAT_KNOWN 0x08
#define IEEE80211_RADIOTAP_MCS_FEC_TYPE_KNOWN 0x10
/* For IEEE80211_RADIOTAP_MCS flags */
#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_MASK 0x03
#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_20 0
#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_40 1
#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_20L 2
#define IEEE80211_RADIOTAP_MCS_BANDWIDTH_20U 3
#define IEEE80211_RADIOTAP_MCS_SHORT_GI 0x04 /* short guard interval */
#define IEEE80211_RADIOTAP_MCS_HT_GREENFIELD 0x08
#define IEEE80211_RADIOTAP_MCS_FEC_LDPC 0x10
#endif /* _NET_IF_IEEE80211RADIOTAP_H_ */

200
contrib/tcpdump/in_cksum.c Normal file
View File

@ -0,0 +1,200 @@
/* in_cksum.c
* 4.4-Lite-2 Internet checksum routine, modified to take a vector of
* pointers/lengths giving the pieces to be checksummed. Also using
* Tahoe/CGI version of ADDCARRY(x) macro instead of from portable version.
*/
/*
* Copyright (c) 1988, 1992, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)in_cksum.c 8.1 (Berkeley) 6/10/93
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <tcpdump-stdinc.h>
#include "interface.h"
/*
* Checksum routine for Internet Protocol family headers (Portable Version).
*
* This routine is very heavily used in the network
* code and should be modified for each CPU to be as fast as possible.
*/
#define ADDCARRY(x) {if ((x) > 65535) (x) -= 65535;}
#define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; ADDCARRY(sum);}
u_int16_t
in_cksum(const struct cksum_vec *vec, int veclen)
{
register const u_int16_t *w;
register int sum = 0;
register int mlen = 0;
int byte_swapped = 0;
union {
u_int8_t c[2];
u_int16_t s;
} s_util;
union {
u_int16_t s[2];
u_int32_t l;
} l_util;
for (; veclen != 0; vec++, veclen--) {
if (vec->len == 0)
continue;
w = (const u_int16_t *)(void *)vec->ptr;
if (mlen == -1) {
/*
* The first byte of this chunk is the continuation
* of a word spanning between this chunk and the
* last chunk.
*
* s_util.c[0] is already saved when scanning previous
* chunk.
*/
s_util.c[1] = *(const u_int8_t *)w;
sum += s_util.s;
w = (const u_int16_t *)(void *)((const u_int8_t *)w + 1);
mlen = vec->len - 1;
} else
mlen = vec->len;
/*
* Force to even boundary.
*/
if ((1 & (unsigned long) w) && (mlen > 0)) {
REDUCE;
sum <<= 8;
s_util.c[0] = *(const u_int8_t *)w;
w = (const u_int16_t *)(void *)((const u_int8_t *)w + 1);
mlen--;
byte_swapped = 1;
}
/*
* Unroll the loop to make overhead from
* branches &c small.
*/
while ((mlen -= 32) >= 0) {
sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3];
sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7];
sum += w[8]; sum += w[9]; sum += w[10]; sum += w[11];
sum += w[12]; sum += w[13]; sum += w[14]; sum += w[15];
w += 16;
}
mlen += 32;
while ((mlen -= 8) >= 0) {
sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3];
w += 4;
}
mlen += 8;
if (mlen == 0 && byte_swapped == 0)
continue;
REDUCE;
while ((mlen -= 2) >= 0) {
sum += *w++;
}
if (byte_swapped) {
REDUCE;
sum <<= 8;
byte_swapped = 0;
if (mlen == -1) {
s_util.c[1] = *(const u_int8_t *)w;
sum += s_util.s;
mlen = 0;
} else
mlen = -1;
} else if (mlen == -1)
s_util.c[0] = *(const u_int8_t *)w;
}
if (mlen == -1) {
/* The last mbuf has odd # of bytes. Follow the
standard (the odd byte may be shifted left by 8 bits
or not as determined by endian-ness of the machine) */
s_util.c[1] = 0;
sum += s_util.s;
}
REDUCE;
return (~sum & 0xffff);
}
/*
* Given the host-byte-order value of the checksum field in a packet
* header, and the network-byte-order computed checksum of the data
* that the checksum covers (including the checksum itself), compute
* what the checksum field *should* have been.
*/
u_int16_t
in_cksum_shouldbe(u_int16_t sum, u_int16_t computed_sum)
{
u_int32_t shouldbe;
/*
* The value that should have gone into the checksum field
* is the negative of the value gotten by summing up everything
* *but* the checksum field.
*
* We can compute that by subtracting the value of the checksum
* field from the sum of all the data in the packet, and then
* computing the negative of that value.
*
* "sum" is the value of the checksum field, and "computed_sum"
* is the negative of the sum of all the data in the packets,
* so that's -(-computed_sum - sum), or (sum + computed_sum).
*
* All the arithmetic in question is one's complement, so the
* addition must include an end-around carry; we do this by
* doing the arithmetic in 32 bits (with no sign-extension),
* and then adding the upper 16 bits of the sum, which contain
* the carry, to the lower 16 bits of the sum, and then do it
* again in case *that* sum produced a carry.
*
* As RFC 1071 notes, the checksum can be computed without
* byte-swapping the 16-bit words; summing 16-bit words
* on a big-endian machine gives a big-endian checksum, which
* can be directly stuffed into the big-endian checksum fields
* in protocol headers, and summing words on a little-endian
* machine gives a little-endian checksum, which must be
* byte-swapped before being stuffed into a big-endian checksum
* field.
*
* "computed_sum" is a network-byte-order value, so we must put
* it in host byte order before subtracting it from the
* host-byte-order value from the header; the adjusted checksum
* will be in host byte order, which is what we'll return.
*/
shouldbe = sum;
shouldbe += ntohs(computed_sum);
shouldbe = (shouldbe & 0xFFFF) + (shouldbe >> 16);
shouldbe = (shouldbe & 0xFFFF) + (shouldbe >> 16);
return shouldbe;
}

View File

@ -28,10 +28,6 @@
#include "os-proto.h"
#endif
#ifndef HAVE___ATTRIBUTE__
#define __attribute__(x)
#endif
/* snprintf et al */
#include <stdarg.h>
@ -74,6 +70,7 @@ extern char *strsep(char **, const char *);
#define PT_CNFP 7 /* Cisco NetFlow protocol */
#define PT_TFTP 8 /* trivial file transfer protocol */
#define PT_AODV 9 /* Ad-hoc On-demand Distance Vector Protocol */
#define PT_CARP 10 /* Common Address Redundancy Protocol */
#ifndef min
#define min(a,b) ((a)>(b)?(b):(a))
@ -166,7 +163,6 @@ extern void hex_and_ascii_print(const char *, const u_char *, u_int);
extern void hex_print_with_offset(const char *, const u_char *, u_int, u_int);
extern void hex_print(const char *, const u_char *, u_int);
extern void telnet_print(const u_char *, u_int);
extern int ethertype_print(u_short, const u_char *, u_int, u_int);
extern int llc_print(const u_char *, u_int, u_int, const u_char *,
const u_char *, u_short *);
extern int snap_print(const u_char *, u_int, u_int, u_int);
@ -189,9 +185,6 @@ extern u_int enc_if_print(const struct pcap_pkthdr *, const u_char *);
extern u_int pflog_if_print(const struct pcap_pkthdr *, const u_char *);
extern u_int arcnet_if_print(const struct pcap_pkthdr *, const u_char *);
extern u_int arcnet_linux_if_print(const struct pcap_pkthdr *, const u_char *);
extern void ether_print(const u_char *, u_int, u_int,
void (*)(const u_char *), const u_char *);
extern u_int ether_if_print(const struct pcap_pkthdr *, const u_char *);
extern u_int token_print(const u_char *, u_int, u_int);
extern u_int token_if_print(const struct pcap_pkthdr *, const u_char *);
extern void fddi_print(const u_char *, u_int, u_int);
@ -231,6 +224,7 @@ extern void cisco_autorp_print(const u_char *, u_int);
extern void rsvp_print(const u_char *, u_int);
extern void ldp_print(const u_char *, u_int);
extern void lldp_print(const u_char *, u_int);
extern void rpki_rtr_print(const u_char *, u_int);
extern void lmp_print(const u_char *, u_int);
extern void lspping_print(const u_char *, u_int);
extern void lwapp_control_print(const u_char *, u_int, int);
@ -297,6 +291,7 @@ extern const char *nt_errstr(u_int32_t);
extern void print_data(const unsigned char *, int);
extern void l2tp_print(const u_char *, u_int);
extern void vrrp_print(const u_char *, u_int, int);
extern void carp_print(const u_char *, u_int, int);
extern void slow_print(const u_char *, u_int);
extern void sflow_print(const u_char *, u_int);
extern void mpcp_print(const u_char *, u_int);
@ -322,10 +317,9 @@ extern u_int bt_if_print(const struct pcap_pkthdr *, const u_char *);
extern u_int usb_linux_48_byte_print(const struct pcap_pkthdr *, const u_char *);
extern u_int usb_linux_64_byte_print(const struct pcap_pkthdr *, const u_char *);
#ifdef INET6
extern void ip6_print(const u_char *, u_int);
extern void ip6_opt_print(const u_char *, int);
extern int nextproto6_cksum(const struct ip6_hdr *, const u_short *, u_int, u_int);
extern int hbhopt_print(const u_char *);
extern int dstopt_print(const u_char *);
extern int frag6_print(const u_char *, const u_char *);
@ -334,9 +328,15 @@ extern void ripng_print(const u_char *, unsigned int);
extern int rt6_print(const u_char *, const u_char *);
extern void ospf6_print(const u_char *, u_int);
extern void dhcp6_print(const u_char *, u_int);
extern void babel_print(const u_char *, u_int);
extern int mask62plen(const u_char *);
#endif /*INET6*/
extern u_short in_cksum(const u_short *, register u_int, int);
struct cksum_vec {
const u_int8_t *ptr;
int len;
};
extern u_int16_t in_cksum(const struct cksum_vec *, int);
extern u_int16_t in_cksum_shouldbe(u_int16_t, u_int16_t);
#ifndef HAVE_BPF_DUMP
@ -356,6 +356,7 @@ extern netdissect_options *gndo;
#define bflag gndo->ndo_bflag
#define eflag gndo->ndo_eflag
#define fflag gndo->ndo_fflag
#define jflag gndo->ndo_jflag
#define Kflag gndo->ndo_Kflag
#define nflag gndo->ndo_nflag
#define Nflag gndo->ndo_Nflag
@ -384,6 +385,7 @@ extern netdissect_options *gndo;
#define Cflag_count gndo->ndo_Cflag_count
#define Gflag_count gndo->ndo_Gflag_count
#define Gflag_time gndo->ndo_Gflag_time
#define Hflag gndo->ndo_Hflag
#define snaplen gndo->ndo_snaplen
#define snapend gndo->ndo_snapend

View File

@ -62,7 +62,7 @@ struct ip {
u_int8_t ip_p; /* protocol */
u_int16_t ip_sum; /* checksum */
struct in_addr ip_src,ip_dst; /* source and dest address */
};
} UNALIGNED;
#define IP_MAXPACKET 65535 /* maximum packet size */
@ -134,7 +134,7 @@ struct ip_timestamp {
u_int32_t ipt_time;
} ipt_ta[1];
} ipt_timestamp;
};
} UNALIGNED;
/* flag bits for ipt_flg */
#define IPOPT_TS_TSONLY 0 /* timestamps only */
@ -161,4 +161,4 @@ struct ip_timestamp {
#define IP_MSS 576 /* default maximum segment size */
/* in print-ip.c */
extern u_int32_t ip_finddst(const struct ip *);
extern int nextproto4_cksum(const struct ip *, const u_int8_t *, u_int, u_int);

View File

@ -86,21 +86,7 @@ struct ip6_hdr {
} ip6_ctlun;
struct in6_addr ip6_src; /* source address */
struct in6_addr ip6_dst; /* destination address */
};
/*
* Pseudo header, used for higher layer checksumming.
*/
union ip6_pseudo_hdr {
struct {
struct in6_addr ph_src;
struct in6_addr ph_dst;
u_int32_t ph_len;
u_int8_t ph_zero[3];
u_int8_t ph_nxt;
} ph;
u_int16_t pa[20];
};
} UNALIGNED;
#define ip6_vfc ip6_ctlun.ip6_un2_vfc
#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
@ -123,25 +109,23 @@ union ip6_pseudo_hdr {
*/
struct ip6_ext {
u_char ip6e_nxt;
u_char ip6e_len;
};
u_int8_t ip6e_nxt;
u_int8_t ip6e_len;
} UNALIGNED;
/* Hop-by-Hop options header */
/* XXX should we pad it to force alignment on an 8-byte boundary? */
struct ip6_hbh {
u_int8_t ip6h_nxt; /* next header */
u_int8_t ip6h_len; /* length in units of 8 octets */
/* followed by options */
};
} UNALIGNED;
/* Destination options header */
/* XXX should we pad it to force alignment on an 8-byte boundary? */
struct ip6_dest {
u_int8_t ip6d_nxt; /* next header */
u_int8_t ip6d_len; /* length in units of 8 octets */
/* followed by options */
};
} UNALIGNED;
/* Option types and related macros */
#define IP6OPT_PAD1 0x00 /* 00 0 00000 */
@ -177,7 +161,7 @@ struct ip6_rthdr {
u_int8_t ip6r_type; /* routing type */
u_int8_t ip6r_segleft; /* segments left */
/* followed by routing type specific data */
};
} UNALIGNED;
/* Type 0 Routing header */
struct ip6_rthdr0 {
@ -188,7 +172,7 @@ struct ip6_rthdr0 {
u_int8_t ip6r0_reserved; /* reserved field */
u_int8_t ip6r0_slmap[3]; /* strict/loose bit map */
struct in6_addr ip6r0_addr[1]; /* up to 23 addresses */
};
} UNALIGNED;
/* Fragment header */
struct ip6_frag {
@ -196,10 +180,13 @@ struct ip6_frag {
u_int8_t ip6f_reserved; /* reserved field */
u_int16_t ip6f_offlg; /* offset, reserved, and flag */
u_int32_t ip6f_ident; /* identification */
};
} UNALIGNED;
#define IP6F_OFF_MASK 0xfff8 /* mask out offset from ip6f_offlg */
#define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */
#define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */
/* in print-ip6.c */
extern int nextproto6_cksum(const struct ip6_hdr *, const u_int8_t *, u_int, u_int);
#endif /* not _NETINET_IP6_H_ */

View File

@ -55,6 +55,7 @@ const struct tok ipproto_values[] = {
{ IPPROTO_PGM, "PGM" },
{ IPPROTO_SCTP, "SCTP" },
{ IPPROTO_MOBILITY, "Mobility" },
{ IPPROTO_CARP, "CARP" },
{ 0, NULL }
};

View File

@ -134,6 +134,9 @@ extern const struct tok ipproto_values[];
#ifndef IPPROTO_VRRP
#define IPPROTO_VRRP 112
#endif
#ifndef IPPROTO_CARP
#define IPPROTO_CARP 112
#endif
#ifndef IPPROTO_PGM
#define IPPROTO_PGM 113
#endif

View File

@ -1,36 +0,0 @@
/*
* Copyright (C) 1999 WIDE Project.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef INADDRSZ
#define INADDRSZ 4 /* IPv4 T_A */
#endif
#ifndef IN6ADDRSZ
#define IN6ADDRSZ 16 /* IPv6 T_AAAA */
#endif

View File

@ -1,117 +0,0 @@
/*
* Copyright (C) 1999 WIDE Project.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef HAVE_U_INT8_T
#if SIZEOF_CHAR == 1
typedef unsigned char u_int8_t;
#elif SIZEOF_INT == 1
typedef unsigned int u_int8_t;
#else /* XXX */
#error "there's no appropriate type for u_int8_t"
#endif
#endif /* HAVE_U_INT8_T */
#ifndef HAVE_U_INT16_T
#if SIZEOF_SHORT == 2
typedef unsigned short u_int16_t;
#elif SIZEOF_INT == 2
typedef unsigned int u_int16_t;
#elif SIZEOF_CHAR == 2
typedef unsigned char u_int16_t;
#else /* XXX */
#error "there's no appropriate type for u_int16_t"
#endif
#endif /* HAVE_U_INT16_T */
#ifndef HAVE_U_INT32_T
#if SIZEOF_INT == 4
typedef unsigned int u_int32_t;
#elif SIZEOF_LONG == 4
typedef unsigned long u_int32_t;
#elif SIZEOF_SHORT == 4
typedef unsigned short u_int32_t;
#else /* XXX */
#error "there's no appropriate type for u_int32_t"
#endif
#endif /* HAVE_U_INT32_T */
#ifndef HAVE_U_INT64_T
#if SIZEOF_LONG_LONG == 8
typedef unsigned long long u_int64_t;
#elif defined(_MSC_EXTENSIONS)
typedef unsigned _int64 u_int64_t;
#elif SIZEOF_INT == 8
typedef unsigned int u_int64_t;
#elif SIZEOF_LONG == 8
typedef unsigned long u_int64_t;
#elif SIZEOF_SHORT == 8
typedef unsigned short u_int64_t;
#else /* XXX */
#error "there's no appropriate type for u_int64_t"
#endif
#endif /* HAVE_U_INT64_T */
#ifndef PRId64
#ifdef _MSC_EXTENSIONS
#define PRId64 "I64d"
#else /* _MSC_EXTENSIONS */
#define PRId64 "lld"
#endif /* _MSC_EXTENSIONS */
#endif /* PRId64 */
#ifndef PRIo64
#ifdef _MSC_EXTENSIONS
#define PRIo64 "I64o"
#else /* _MSC_EXTENSIONS */
#define PRIo64 "llo"
#endif /* _MSC_EXTENSIONS */
#endif /* PRIo64 */
#ifndef PRIx64
#ifdef _MSC_EXTENSIONS
#define PRIx64 "I64x"
#else /* _MSC_EXTENSIONS */
#define PRIx64 "llx"
#endif /* _MSC_EXTENSIONS */
#endif /* PRIx64 */
#ifndef PRIu64
#ifdef _MSC_EXTENSIONS
#define PRIu64 "I64u"
#else /* _MSC_EXTENSIONS */
#define PRIu64 "llu"
#endif /* _MSC_EXTENSIONS */
#endif /* PRIu64 */

View File

@ -1,36 +0,0 @@
/*
* Copyright (C) 1999 WIDE Project.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/*
* Resolver options for IPv6.
* XXX: this should be in an offical include file. There may be conflicts...
*/
#ifndef HAVE_RES_USE_INET6
#define RES_USE_INET6 0x80000000 /* use/map IPv6 in gethostbyname() */
#endif

View File

@ -1,49 +0,0 @@
/*
* Copyright (C) 1999 WIDE Project.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef MAXRESOLVSORT /* XXX */
#define MAXRESOLVSORT 10 /* number of net to sort on */
#endif
#ifndef HAVE_RES_STATE_EXT
struct __res_state_ext {
struct sockaddr_storage nsaddr_list[MAXNS];
struct {
int af; /* address family for addr, mask */
union {
struct in_addr ina;
#ifdef INET6
struct in6_addr in6a;
#endif
} addr, mask;
} sort_list[MAXRESOLVSORT];
};
#endif
extern struct __res_state_ext _res_ext;

View File

@ -107,6 +107,7 @@ struct netdissect_options {
int ndo_Iflag; /* rfmon (monitor) mode */
int ndo_Oflag; /* run filter code optimizer */
int ndo_dlt; /* if != -1, ask libpcap for the DLT it names*/
int ndo_jflag; /* packet time stamp source */
int ndo_pflag; /* don't go promiscuous */
int ndo_Cflag; /* rotate dump files after this many bytes */
@ -116,6 +117,7 @@ struct netdissect_options {
time_t ndo_Gflag_time; /* The last time_t the dump file was rotated. */
int ndo_Wflag; /* recycle output files after this number of files */
int ndo_WflagChars;
int ndo_Hflag; /* dissect 802.11s draft mesh standard */
int ndo_suppress_default_print; /* don't use default_print() for unknown packet types */
const char *ndo_dltname;
@ -157,7 +159,7 @@ struct netdissect_options {
void (*ndo_error)(netdissect_options *,
const char *fmt, ...)
#ifdef __ATTRIBUTE___FORMAT_OK_FOR_FUNCTION_POINTERS
__attribute__ ((format (printf, 2, 3)))
__attribute__ ((noreturn, format (printf, 2, 3)))
#endif
;
void (*ndo_warning)(netdissect_options *,
@ -252,6 +254,9 @@ extern char *copy_argv(netdissect_options *, char **);
extern void safeputchar(int);
extern void safeputs(const char *, int);
#define PLURAL_SUFFIX(n) \
(((n) != 1) ? "s" : "")
#if 0
extern const char *isonsap_string(netdissect_options *, const u_char *);
extern const char *protoid_string(netdissect_options *, const u_char *);
@ -263,6 +268,12 @@ extern const char *dnnum_string(netdissect_options *, u_short);
#include <pcap.h>
typedef u_int (*if_ndo_printer)(struct netdissect_options *ndo,
const struct pcap_pkthdr *, const u_char *);
typedef u_int (*if_printer)(const struct pcap_pkthdr *, const u_char *);
extern if_ndo_printer lookup_ndo_printer(int);
extern if_printer lookup_printer(int);
extern void eap_print(netdissect_options *,const u_char *, u_int);
extern int esp_print(netdissect_options *,
@ -281,6 +292,22 @@ extern void ip_print_inner(netdissect_options *ndo,
const u_char *bp2);
extern void rrcp_print(netdissect_options *,const u_char *, u_int);
extern void ether_print(netdissect_options *,
const u_char *, u_int, u_int,
void (*)(netdissect_options *, const u_char *),
const u_char *);
extern u_int ether_if_print(netdissect_options *,
const struct pcap_pkthdr *,const u_char *);
extern u_int netanalyzer_if_print(netdissect_options *,
const struct pcap_pkthdr *,const u_char *);
extern u_int netanalyzer_transparent_if_print(netdissect_options *,
const struct pcap_pkthdr *,
const u_char *);
extern int ethertype_print(netdissect_options *,u_short, const u_char *,
u_int, u_int);
/* stuff that has not yet been rototiled */
#if 0
extern void ascii_print(netdissect_options *,u_int);
@ -291,8 +318,6 @@ extern void hex_print_with_offset(netdissect_options *,const char *,
u_int, u_int);
extern void hex_print(netdissect_options *,const char *, u_int);
extern void telnet_print(netdissect_options *,const u_char *, u_int);
extern int ethertype_print(netdissect_options *,u_short, const u_char *,
u_int, u_int);
extern int llc_print(netdissect_options *,
const u_char *, u_int, u_int, const u_char *,
const u_char *, u_short *);
@ -319,7 +344,6 @@ extern void egp_print(netdissect_options *,const u_char *, u_int,
const u_char *);
extern void arcnet_if_print(u_char*,const struct pcap_pkthdr *,const u_char *);
extern void ether_if_print(u_char *,const struct pcap_pkthdr *,const u_char *);
extern void token_if_print(u_char *,const struct pcap_pkthdr *,const u_char *);
extern void fddi_if_print(u_char *,const struct pcap_pkthdr *, const u_char *);
@ -333,6 +357,7 @@ extern void igmp_print(netdissect_options *,
register const u_char *, u_int);
extern void igrp_print(netdissect_options *,const u_char *, u_int,
const u_char *);
extern int nextproto4_cksum(const struct ip *, const u_int8_t *, u_int, u_int);
extern void ipN_print(netdissect_options *,const u_char *, u_int);
extern void ipx_print(netdissect_options *,const u_char *, u_int);
extern void isoclns_print(netdissect_options *,const u_char *,
@ -378,6 +403,7 @@ extern void raw_if_print(u_char *,
const struct pcap_pkthdr *, const u_char *);
extern void rip_print(netdissect_options *,const u_char *, u_int);
extern void rpki_rtr_print(netdissect_options *,const u_char *, u_int);
extern void sctp_print(netdissect_options *ndo,
const u_char *bp, const u_char *bp2,
@ -424,6 +450,8 @@ extern void l2tp_print(netdissect_options *,const u_char *, u_int);
extern void lcp_print(netdissect_options *,const u_char *, u_int);
extern void vrrp_print(netdissect_options *,const u_char *bp,
u_int len, int ttl);
extern void carp_print(netdissect_options *,const u_char *bp,
u_int len, int ttl);
extern void cdp_print(netdissect_options *,const u_char *,
u_int, u_int, const u_char *, const u_char *);
extern void stp_print(netdissect_options *,const u_char *p, u_int length);
@ -433,12 +461,15 @@ extern void pptp_print(netdissect_options *,const u_char *, u_int);
#endif
extern u_int ipnet_if_print(netdissect_options *,const struct pcap_pkthdr *, const u_char *);
extern u_int ppi_if_print(netdissect_options *,const struct pcap_pkthdr *, const u_char *);
extern u_int ieee802_15_4_if_print(netdissect_options *,const struct pcap_pkthdr *, const u_char *);
#if 0
#ifdef INET6
extern void ip6_print(netdissect_options *,const u_char *, u_int);
#if 0
extern void ip6_opt_print(netdissect_options *,const u_char *, int);
extern int nextproto6_cksum(const struct ip6_hdr *, const u_short *, u_int, u_int);
extern int nextproto6_cksum(const struct ip6_hdr *, const u_int8_t *, u_int, u_int);
extern int hbhopt_print(netdissect_options *,const u_char *);
extern int dstopt_print(netdissect_options *,const u_char *);
extern int frag6_print(netdissect_options *,const u_char *,
@ -453,11 +484,17 @@ extern void dhcp6_print(netdissect_options *,const u_char *,
extern void zephyr_print(netdissect_options * ndo,
const u_char *cp, int length);
#endif /* 0 */
#endif /*INET6*/
extern u_short in_cksum(const u_short *,
register u_int, int);
#if 0
struct cksum_vec {
const u_int8_t *ptr;
int len;
};
extern u_int16_t in_cksum(const struct cksum_vec *, int);
extern u_int16_t in_cksum_shouldbe(u_int16_t, u_int16_t);
#endif
extern void esp_print_decodesecret(netdissect_options *ndo);

View File

@ -324,5 +324,5 @@ struct ospfhdr {
#define ospf_lsa ospf_un.un_lsa
/* Functions shared by ospf and ospf6 */
extern int ospf_print_te_lsa(u_int8_t *, u_int);
extern int ospf_print_grace_lsa(u_int8_t *, u_int);
extern int ospf_print_te_lsa(const u_int8_t *, u_int);
extern int ospf_print_grace_lsa(const u_int8_t *, u_int);

View File

@ -42,6 +42,7 @@ const struct tok oui_values[] = {
{ OUI_IEEE_8021_PRIVATE, "IEEE 802.1 Private"},
{ OUI_IEEE_8023_PRIVATE, "IEEE 802.3 Private"},
{ OUI_TIA, "ANSI/TIA"},
{ OUI_DCBX, "DCBX"},
{ 0, NULL }
};

View File

@ -30,6 +30,7 @@ extern const struct tok smi_values[];
#define OUI_IEEE_8021_PRIVATE 0x0080c2 /* IEEE 802.1 Organisation Specific - Annex F */
#define OUI_IEEE_8023_PRIVATE 0x00120f /* IEEE 802.3 Organisation Specific - Annex G */
#define OUI_TIA 0x0012bb /* TIA - Telecommunications Industry Association - ANSI/TIA-1057- 2006 */
#define OUI_DCBX 0x001B21 /* DCBX */
/*
* These are SMI Network Management Private Enterprise Codes for

9
contrib/tcpdump/ppi.h Normal file
View File

@ -0,0 +1,9 @@
typedef struct ppi_header {
uint8_t ppi_ver;
uint8_t ppi_flags;
uint16_t ppi_len;
uint32_t ppi_dlt;
} ppi_header_t;
#define PPI_HDRLEN 8

View File

@ -46,6 +46,15 @@ static const char rcsid[] _U_ =
#include "ieee802_11.h"
#include "ieee802_11_radio.h"
/* Radiotap state */
/* This is used to save state when parsing/processing parameters */
struct radiotap_state
{
u_int32_t present;
u_int8_t rate;
};
#define PRINT_SSID(p) \
if (p.ssid_present) { \
printf(" ("); \
@ -74,26 +83,403 @@ static const char rcsid[] _U_ =
printf("%s", \
CAPABILITY_PRIVACY(p.capability_info) ? ", PRIVACY" : "" );
static const int ieee80211_htrates[16] = {
13, /* IFM_IEEE80211_MCS0 */
26, /* IFM_IEEE80211_MCS1 */
39, /* IFM_IEEE80211_MCS2 */
52, /* IFM_IEEE80211_MCS3 */
78, /* IFM_IEEE80211_MCS4 */
104, /* IFM_IEEE80211_MCS5 */
117, /* IFM_IEEE80211_MCS6 */
130, /* IFM_IEEE80211_MCS7 */
26, /* IFM_IEEE80211_MCS8 */
52, /* IFM_IEEE80211_MCS9 */
78, /* IFM_IEEE80211_MCS10 */
104, /* IFM_IEEE80211_MCS11 */
156, /* IFM_IEEE80211_MCS12 */
208, /* IFM_IEEE80211_MCS13 */
234, /* IFM_IEEE80211_MCS14 */
260, /* IFM_IEEE80211_MCS15 */
#define MAX_MCS_INDEX 76
/*
* Indices are:
*
* the MCS index (0-76);
*
* 0 for 20 MHz, 1 for 40 MHz;
*
* 0 for a long guard interval, 1 for a short guard interval.
*/
static const float ieee80211_float_htrates[MAX_MCS_INDEX+1][2][2] = {
/* MCS 0 */
{ /* 20 Mhz */ { 6.5, /* SGI */ 7.2, },
/* 40 Mhz */ { 13.5, /* SGI */ 15.0, },
},
/* MCS 1 */
{ /* 20 Mhz */ { 13.0, /* SGI */ 14.4, },
/* 40 Mhz */ { 27.0, /* SGI */ 30.0, },
},
/* MCS 2 */
{ /* 20 Mhz */ { 19.5, /* SGI */ 21.7, },
/* 40 Mhz */ { 40.5, /* SGI */ 45.0, },
},
/* MCS 3 */
{ /* 20 Mhz */ { 26.0, /* SGI */ 28.9, },
/* 40 Mhz */ { 54.0, /* SGI */ 60.0, },
},
/* MCS 4 */
{ /* 20 Mhz */ { 39.0, /* SGI */ 43.3, },
/* 40 Mhz */ { 81.0, /* SGI */ 90.0, },
},
/* MCS 5 */
{ /* 20 Mhz */ { 52.0, /* SGI */ 57.8, },
/* 40 Mhz */ { 108.0, /* SGI */ 120.0, },
},
/* MCS 6 */
{ /* 20 Mhz */ { 58.5, /* SGI */ 65.0, },
/* 40 Mhz */ { 121.5, /* SGI */ 135.0, },
},
/* MCS 7 */
{ /* 20 Mhz */ { 65.0, /* SGI */ 72.2, },
/* 40 Mhz */ { 135.0, /* SGI */ 150.0, },
},
/* MCS 8 */
{ /* 20 Mhz */ { 13.0, /* SGI */ 14.4, },
/* 40 Mhz */ { 27.0, /* SGI */ 30.0, },
},
/* MCS 9 */
{ /* 20 Mhz */ { 26.0, /* SGI */ 28.9, },
/* 40 Mhz */ { 54.0, /* SGI */ 60.0, },
},
/* MCS 10 */
{ /* 20 Mhz */ { 39.0, /* SGI */ 43.3, },
/* 40 Mhz */ { 81.0, /* SGI */ 90.0, },
},
/* MCS 11 */
{ /* 20 Mhz */ { 52.0, /* SGI */ 57.8, },
/* 40 Mhz */ { 108.0, /* SGI */ 120.0, },
},
/* MCS 12 */
{ /* 20 Mhz */ { 78.0, /* SGI */ 86.7, },
/* 40 Mhz */ { 162.0, /* SGI */ 180.0, },
},
/* MCS 13 */
{ /* 20 Mhz */ { 104.0, /* SGI */ 115.6, },
/* 40 Mhz */ { 216.0, /* SGI */ 240.0, },
},
/* MCS 14 */
{ /* 20 Mhz */ { 117.0, /* SGI */ 130.0, },
/* 40 Mhz */ { 243.0, /* SGI */ 270.0, },
},
/* MCS 15 */
{ /* 20 Mhz */ { 130.0, /* SGI */ 144.4, },
/* 40 Mhz */ { 270.0, /* SGI */ 300.0, },
},
/* MCS 16 */
{ /* 20 Mhz */ { 19.5, /* SGI */ 21.7, },
/* 40 Mhz */ { 40.5, /* SGI */ 45.0, },
},
/* MCS 17 */
{ /* 20 Mhz */ { 39.0, /* SGI */ 43.3, },
/* 40 Mhz */ { 81.0, /* SGI */ 90.0, },
},
/* MCS 18 */
{ /* 20 Mhz */ { 58.5, /* SGI */ 65.0, },
/* 40 Mhz */ { 121.5, /* SGI */ 135.0, },
},
/* MCS 19 */
{ /* 20 Mhz */ { 78.0, /* SGI */ 86.7, },
/* 40 Mhz */ { 162.0, /* SGI */ 180.0, },
},
/* MCS 20 */
{ /* 20 Mhz */ { 117.0, /* SGI */ 130.0, },
/* 40 Mhz */ { 243.0, /* SGI */ 270.0, },
},
/* MCS 21 */
{ /* 20 Mhz */ { 156.0, /* SGI */ 173.3, },
/* 40 Mhz */ { 324.0, /* SGI */ 360.0, },
},
/* MCS 22 */
{ /* 20 Mhz */ { 175.5, /* SGI */ 195.0, },
/* 40 Mhz */ { 364.5, /* SGI */ 405.0, },
},
/* MCS 23 */
{ /* 20 Mhz */ { 195.0, /* SGI */ 216.7, },
/* 40 Mhz */ { 405.0, /* SGI */ 450.0, },
},
/* MCS 24 */
{ /* 20 Mhz */ { 26.0, /* SGI */ 28.9, },
/* 40 Mhz */ { 54.0, /* SGI */ 60.0, },
},
/* MCS 25 */
{ /* 20 Mhz */ { 52.0, /* SGI */ 57.8, },
/* 40 Mhz */ { 108.0, /* SGI */ 120.0, },
},
/* MCS 26 */
{ /* 20 Mhz */ { 78.0, /* SGI */ 86.7, },
/* 40 Mhz */ { 162.0, /* SGI */ 180.0, },
},
/* MCS 27 */
{ /* 20 Mhz */ { 104.0, /* SGI */ 115.6, },
/* 40 Mhz */ { 216.0, /* SGI */ 240.0, },
},
/* MCS 28 */
{ /* 20 Mhz */ { 156.0, /* SGI */ 173.3, },
/* 40 Mhz */ { 324.0, /* SGI */ 360.0, },
},
/* MCS 29 */
{ /* 20 Mhz */ { 208.0, /* SGI */ 231.1, },
/* 40 Mhz */ { 432.0, /* SGI */ 480.0, },
},
/* MCS 30 */
{ /* 20 Mhz */ { 234.0, /* SGI */ 260.0, },
/* 40 Mhz */ { 486.0, /* SGI */ 540.0, },
},
/* MCS 31 */
{ /* 20 Mhz */ { 260.0, /* SGI */ 288.9, },
/* 40 Mhz */ { 540.0, /* SGI */ 600.0, },
},
/* MCS 32 */
{ /* 20 Mhz */ { 0.0, /* SGI */ 0.0, }, /* not valid */
/* 40 Mhz */ { 6.0, /* SGI */ 6.7, },
},
/* MCS 33 */
{ /* 20 Mhz */ { 39.0, /* SGI */ 43.3, },
/* 40 Mhz */ { 81.0, /* SGI */ 90.0, },
},
/* MCS 34 */
{ /* 20 Mhz */ { 52.0, /* SGI */ 57.8, },
/* 40 Mhz */ { 108.0, /* SGI */ 120.0, },
},
/* MCS 35 */
{ /* 20 Mhz */ { 65.0, /* SGI */ 72.2, },
/* 40 Mhz */ { 135.0, /* SGI */ 150.0, },
},
/* MCS 36 */
{ /* 20 Mhz */ { 58.5, /* SGI */ 65.0, },
/* 40 Mhz */ { 121.5, /* SGI */ 135.0, },
},
/* MCS 37 */
{ /* 20 Mhz */ { 78.0, /* SGI */ 86.7, },
/* 40 Mhz */ { 162.0, /* SGI */ 180.0, },
},
/* MCS 38 */
{ /* 20 Mhz */ { 97.5, /* SGI */ 108.3, },
/* 40 Mhz */ { 202.5, /* SGI */ 225.0, },
},
/* MCS 39 */
{ /* 20 Mhz */ { 52.0, /* SGI */ 57.8, },
/* 40 Mhz */ { 108.0, /* SGI */ 120.0, },
},
/* MCS 40 */
{ /* 20 Mhz */ { 65.0, /* SGI */ 72.2, },
/* 40 Mhz */ { 135.0, /* SGI */ 150.0, },
},
/* MCS 41 */
{ /* 20 Mhz */ { 65.0, /* SGI */ 72.2, },
/* 40 Mhz */ { 135.0, /* SGI */ 150.0, },
},
/* MCS 42 */
{ /* 20 Mhz */ { 78.0, /* SGI */ 86.7, },
/* 40 Mhz */ { 162.0, /* SGI */ 180.0, },
},
/* MCS 43 */
{ /* 20 Mhz */ { 91.0, /* SGI */ 101.1, },
/* 40 Mhz */ { 189.0, /* SGI */ 210.0, },
},
/* MCS 44 */
{ /* 20 Mhz */ { 91.0, /* SGI */ 101.1, },
/* 40 Mhz */ { 189.0, /* SGI */ 210.0, },
},
/* MCS 45 */
{ /* 20 Mhz */ { 104.0, /* SGI */ 115.6, },
/* 40 Mhz */ { 216.0, /* SGI */ 240.0, },
},
/* MCS 46 */
{ /* 20 Mhz */ { 78.0, /* SGI */ 86.7, },
/* 40 Mhz */ { 162.0, /* SGI */ 180.0, },
},
/* MCS 47 */
{ /* 20 Mhz */ { 97.5, /* SGI */ 108.3, },
/* 40 Mhz */ { 202.5, /* SGI */ 225.0, },
},
/* MCS 48 */
{ /* 20 Mhz */ { 97.5, /* SGI */ 108.3, },
/* 40 Mhz */ { 202.5, /* SGI */ 225.0, },
},
/* MCS 49 */
{ /* 20 Mhz */ { 117.0, /* SGI */ 130.0, },
/* 40 Mhz */ { 243.0, /* SGI */ 270.0, },
},
/* MCS 50 */
{ /* 20 Mhz */ { 136.5, /* SGI */ 151.7, },
/* 40 Mhz */ { 283.5, /* SGI */ 315.0, },
},
/* MCS 51 */
{ /* 20 Mhz */ { 136.5, /* SGI */ 151.7, },
/* 40 Mhz */ { 283.5, /* SGI */ 315.0, },
},
/* MCS 52 */
{ /* 20 Mhz */ { 156.0, /* SGI */ 173.3, },
/* 40 Mhz */ { 324.0, /* SGI */ 360.0, },
},
/* MCS 53 */
{ /* 20 Mhz */ { 65.0, /* SGI */ 72.2, },
/* 40 Mhz */ { 135.0, /* SGI */ 150.0, },
},
/* MCS 54 */
{ /* 20 Mhz */ { 78.0, /* SGI */ 86.7, },
/* 40 Mhz */ { 162.0, /* SGI */ 180.0, },
},
/* MCS 55 */
{ /* 20 Mhz */ { 91.0, /* SGI */ 101.1, },
/* 40 Mhz */ { 189.0, /* SGI */ 210.0, },
},
/* MCS 56 */
{ /* 20 Mhz */ { 78.0, /* SGI */ 86.7, },
/* 40 Mhz */ { 162.0, /* SGI */ 180.0, },
},
/* MCS 57 */
{ /* 20 Mhz */ { 91.0, /* SGI */ 101.1, },
/* 40 Mhz */ { 189.0, /* SGI */ 210.0, },
},
/* MCS 58 */
{ /* 20 Mhz */ { 104.0, /* SGI */ 115.6, },
/* 40 Mhz */ { 216.0, /* SGI */ 240.0, },
},
/* MCS 59 */
{ /* 20 Mhz */ { 117.0, /* SGI */ 130.0, },
/* 40 Mhz */ { 243.0, /* SGI */ 270.0, },
},
/* MCS 60 */
{ /* 20 Mhz */ { 104.0, /* SGI */ 115.6, },
/* 40 Mhz */ { 216.0, /* SGI */ 240.0, },
},
/* MCS 61 */
{ /* 20 Mhz */ { 117.0, /* SGI */ 130.0, },
/* 40 Mhz */ { 243.0, /* SGI */ 270.0, },
},
/* MCS 62 */
{ /* 20 Mhz */ { 130.0, /* SGI */ 144.4, },
/* 40 Mhz */ { 270.0, /* SGI */ 300.0, },
},
/* MCS 63 */
{ /* 20 Mhz */ { 130.0, /* SGI */ 144.4, },
/* 40 Mhz */ { 270.0, /* SGI */ 300.0, },
},
/* MCS 64 */
{ /* 20 Mhz */ { 143.0, /* SGI */ 158.9, },
/* 40 Mhz */ { 297.0, /* SGI */ 330.0, },
},
/* MCS 65 */
{ /* 20 Mhz */ { 97.5, /* SGI */ 108.3, },
/* 40 Mhz */ { 202.5, /* SGI */ 225.0, },
},
/* MCS 66 */
{ /* 20 Mhz */ { 117.0, /* SGI */ 130.0, },
/* 40 Mhz */ { 243.0, /* SGI */ 270.0, },
},
/* MCS 67 */
{ /* 20 Mhz */ { 136.5, /* SGI */ 151.7, },
/* 40 Mhz */ { 283.5, /* SGI */ 315.0, },
},
/* MCS 68 */
{ /* 20 Mhz */ { 117.0, /* SGI */ 130.0, },
/* 40 Mhz */ { 243.0, /* SGI */ 270.0, },
},
/* MCS 69 */
{ /* 20 Mhz */ { 136.5, /* SGI */ 151.7, },
/* 40 Mhz */ { 283.5, /* SGI */ 315.0, },
},
/* MCS 70 */
{ /* 20 Mhz */ { 156.0, /* SGI */ 173.3, },
/* 40 Mhz */ { 324.0, /* SGI */ 360.0, },
},
/* MCS 71 */
{ /* 20 Mhz */ { 175.5, /* SGI */ 195.0, },
/* 40 Mhz */ { 364.5, /* SGI */ 405.0, },
},
/* MCS 72 */
{ /* 20 Mhz */ { 156.0, /* SGI */ 173.3, },
/* 40 Mhz */ { 324.0, /* SGI */ 360.0, },
},
/* MCS 73 */
{ /* 20 Mhz */ { 175.5, /* SGI */ 195.0, },
/* 40 Mhz */ { 364.5, /* SGI */ 405.0, },
},
/* MCS 74 */
{ /* 20 Mhz */ { 195.0, /* SGI */ 216.7, },
/* 40 Mhz */ { 405.0, /* SGI */ 450.0, },
},
/* MCS 75 */
{ /* 20 Mhz */ { 195.0, /* SGI */ 216.7, },
/* 40 Mhz */ { 405.0, /* SGI */ 450.0, },
},
/* MCS 76 */
{ /* 20 Mhz */ { 214.5, /* SGI */ 238.3, },
/* 40 Mhz */ { 445.5, /* SGI */ 495.0, },
},
};
#define PRINT_HT_RATE(_sep, _r, _suf) \
printf("%s%.1f%s", _sep, (.5 * ieee80211_htrates[(_r) & 0xf]), _suf)
static const char *auth_alg_text[]={"Open System","Shared Key","EAP"};
#define NUM_AUTH_ALGS (sizeof auth_alg_text / sizeof auth_alg_text[0])
@ -269,6 +655,7 @@ static int
parse_elements(struct mgmt_body_t *pbody, const u_char *p, int offset,
u_int length)
{
u_int elementlen;
struct ssid_t ssid;
struct challenge_t challenge;
struct rates_t rates;
@ -487,12 +874,13 @@ parse_elements(struct mgmt_body_t *pbody, const u_char *p, int offset,
return 0;
if (length < 2)
return 0;
if (!TTEST2(*(p + offset + 2), *(p + offset + 1)))
elementlen = *(p + offset + 1);
if (!TTEST2(*(p + offset + 2), elementlen))
return 0;
if (length < (u_int)(*(p + offset + 1) + 2))
if (length < elementlen + 2)
return 0;
offset += *(p + offset + 1) + 2;
length -= *(p + offset + 1) + 2;
offset += elementlen + 2;
length -= elementlen + 2;
break;
}
}
@ -1321,7 +1709,8 @@ ieee802_11_print(const u_char *p, u_int length, u_int orig_caplen, int pad,
hdrlen = extract_header_length(fc);
if (pad)
hdrlen = roundup2(hdrlen, 4);
if (FC_TYPE(fc) == T_DATA && DATA_FRAME_IS_QOS(FC_SUBTYPE(fc))) {
if (Hflag && FC_TYPE(fc) == T_DATA &&
DATA_FRAME_IS_QOS(FC_SUBTYPE(fc))) {
meshdrlen = extract_mesh_header_length(p+hdrlen);
hdrlen += meshdrlen;
} else
@ -1461,7 +1850,8 @@ print_chaninfo(int freq, int flags)
}
static int
print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags)
print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags,
struct radiotap_state *state, u_int32_t presentflags)
{
union {
int8_t i8;
@ -1476,9 +1866,18 @@ print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags)
switch (bit) {
case IEEE80211_RADIOTAP_FLAGS:
rc = cpack_uint8(s, &u.u8);
if (rc != 0)
break;
*flags = u.u8;
break;
case IEEE80211_RADIOTAP_RATE:
rc = cpack_uint8(s, &u.u8);
if (rc != 0)
break;
/* Save state rate */
state->rate = u.u8;
break;
case IEEE80211_RADIOTAP_DB_ANTSIGNAL:
case IEEE80211_RADIOTAP_DB_ANTNOISE:
case IEEE80211_RADIOTAP_ANTENNA:
@ -1497,6 +1896,7 @@ print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags)
case IEEE80211_RADIOTAP_FHSS:
case IEEE80211_RADIOTAP_LOCK_QUALITY:
case IEEE80211_RADIOTAP_TX_ATTENUATION:
case IEEE80211_RADIOTAP_RX_FLAGS:
rc = cpack_uint16(s, &u.u16);
break;
case IEEE80211_RADIOTAP_DB_TX_ATTENUATION:
@ -1520,6 +1920,45 @@ print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags)
break;
rc = cpack_uint8(s, &u4.u8);
break;
case IEEE80211_RADIOTAP_MCS:
rc = cpack_uint8(s, &u.u8);
if (rc != 0)
break;
rc = cpack_uint8(s, &u2.u8);
if (rc != 0)
break;
rc = cpack_uint8(s, &u3.u8);
break;
case IEEE80211_RADIOTAP_VENDOR_NAMESPACE: {
u_int8_t vns[3];
u_int16_t length;
u_int8_t subspace;
if ((cpack_align_and_reserve(s, 2)) == NULL) {
rc = -1;
break;
}
rc = cpack_uint8(s, &vns[0]);
if (rc != 0)
break;
rc = cpack_uint8(s, &vns[1]);
if (rc != 0)
break;
rc = cpack_uint8(s, &vns[2]);
if (rc != 0)
break;
rc = cpack_uint8(s, &subspace);
if (rc != 0)
break;
rc = cpack_uint16(s, &length);
if (rc != 0)
break;
/* Skip up to length */
s->c_next += length;
break;
}
default:
/* this bit indicates a field whose
* size we do not know, so we cannot
@ -1534,18 +1973,64 @@ print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags)
return rc;
}
/* Preserve the state present flags */
state->present = presentflags;
switch (bit) {
case IEEE80211_RADIOTAP_CHANNEL:
/*
* If CHANNEL and XCHANNEL are both present, skip
* CHANNEL.
*/
if (presentflags & (1 << IEEE80211_RADIOTAP_XCHANNEL))
break;
print_chaninfo(u.u16, u2.u16);
break;
case IEEE80211_RADIOTAP_FHSS:
printf("fhset %d fhpat %d ", u.u16 & 0xff, (u.u16 >> 8) & 0xff);
break;
case IEEE80211_RADIOTAP_RATE:
if (u.u8 & 0x80)
PRINT_HT_RATE("", u.u8, " Mb/s ");
else
PRINT_RATE("", u.u8, " Mb/s ");
/*
* XXX On FreeBSD rate & 0x80 means we have an MCS. On
* Linux and AirPcap it does not. (What about
* Mac OS X, NetBSD, OpenBSD, and DragonFly BSD?)
*
* This is an issue either for proprietary extensions
* to 11a or 11g, which do exist, or for 11n
* implementations that stuff a rate value into
* this field, which also appear to exist.
*
* We currently handle that by assuming that
* if the 0x80 bit is set *and* the remaining
* bits have a value between 0 and 15 it's
* an MCS value, otherwise it's a rate. If
* there are cases where systems that use
* "0x80 + MCS index" for MCS indices > 15,
* or stuff a rate value here between 64 and
* 71.5 Mb/s in here, we'll need a preference
* setting. Such rates do exist, e.g. 11n
* MCS 7 at 20 MHz with a long guard interval.
*/
if (u.u8 >= 0x80 && u.u8 <= 0x8f) {
/*
* XXX - we don't know the channel width
* or guard interval length, so we can't
* convert this to a data rate.
*
* If you want us to show a data rate,
* use the MCS field, not the Rate field;
* the MCS field includes not only the
* MCS index, it also includes bandwidth
* and guard interval information.
*
* XXX - can we get the channel width
* from XChannel and the guard interval
* information from Flags, at least on
* FreeBSD?
*/
printf("MCS %u ", u.u8 & 0x7f);
} else
printf("%2.1f Mb/s ", .5*u.u8);
break;
case IEEE80211_RADIOTAP_DBM_ANTSIGNAL:
printf("%ddB signal ", u.i8);
@ -1589,9 +2074,89 @@ print_radiotap_field(struct cpack_state *s, u_int32_t bit, u_int8_t *flags)
case IEEE80211_RADIOTAP_TSFT:
printf("%" PRIu64 "us tsft ", u.u64);
break;
case IEEE80211_RADIOTAP_RX_FLAGS:
/* Do nothing for now */
break;
case IEEE80211_RADIOTAP_XCHANNEL:
print_chaninfo(u2.u16, u.u32);
break;
case IEEE80211_RADIOTAP_MCS: {
static const char *bandwidth[4] = {
"20 MHz",
"40 MHz",
"20 MHz (L)",
"20 MHz (U)"
};
float htrate;
if (u.u8 & IEEE80211_RADIOTAP_MCS_MCS_INDEX_KNOWN) {
/*
* We know the MCS index.
*/
if (u3.u8 <= MAX_MCS_INDEX) {
/*
* And it's in-range.
*/
if (u.u8 & (IEEE80211_RADIOTAP_MCS_BANDWIDTH_KNOWN|IEEE80211_RADIOTAP_MCS_GUARD_INTERVAL_KNOWN)) {
/*
* And we know both the bandwidth and
* the guard interval, so we can look
* up the rate.
*/
htrate =
ieee80211_float_htrates \
[u3.u8] \
[((u2.u8 & IEEE80211_RADIOTAP_MCS_BANDWIDTH_MASK) == IEEE80211_RADIOTAP_MCS_BANDWIDTH_40 ? 1 : 0)] \
[((u2.u8 & IEEE80211_RADIOTAP_MCS_SHORT_GI) ? 1 : 0)];
} else {
/*
* We don't know both the bandwidth
* and the guard interval, so we can
* only report the MCS index.
*/
htrate = 0.0;
}
} else {
/*
* The MCS value is out of range.
*/
htrate = 0.0;
}
if (htrate != 0.0) {
/*
* We have the rate.
* Print it.
*/
printf("%.1f Mb/s MCS %u ", htrate, u3.u8);
} else {
/*
* We at least have the MCS index.
* Print it.
*/
printf("MCS %u ", u3.u8);
}
}
if (u.u8 & IEEE80211_RADIOTAP_MCS_BANDWIDTH_KNOWN) {
printf("%s ",
bandwidth[u2.u8 & IEEE80211_RADIOTAP_MCS_BANDWIDTH_MASK]);
}
if (u.u8 & IEEE80211_RADIOTAP_MCS_GUARD_INTERVAL_KNOWN) {
printf("%s GI ",
(u2.u8 & IEEE80211_RADIOTAP_MCS_SHORT_GI) ?
"short" : "lon");
}
if (u.u8 & IEEE80211_RADIOTAP_MCS_HT_FORMAT_KNOWN) {
printf("%s ",
(u2.u8 & IEEE80211_RADIOTAP_MCS_HT_GREENFIELD) ?
"greenfield" : "mixed");
}
if (u.u8 & IEEE80211_RADIOTAP_MCS_FEC_TYPE_KNOWN) {
printf("%s FEC ",
(u2.u8 & IEEE80211_RADIOTAP_MCS_FEC_LDPC) ?
"LDPC" : "BCC");
}
break;
}
}
return 0;
}
@ -1611,6 +2176,7 @@ ieee802_11_radio_print(const u_char *p, u_int length, u_int caplen)
struct cpack_state cpacker;
struct ieee80211_radiotap_header *hdr;
u_int32_t present, next_present;
u_int32_t presentflags = 0;
u_int32_t *presentp, *last_presentp;
enum ieee80211_radiotap_type bit;
int bit0;
@ -1619,6 +2185,7 @@ ieee802_11_radio_print(const u_char *p, u_int length, u_int caplen)
u_int8_t flags;
int pad;
u_int fcslen;
struct radiotap_state state;
if (caplen < sizeof(*hdr)) {
printf("[|802.11]");
@ -1660,6 +2227,11 @@ ieee802_11_radio_print(const u_char *p, u_int length, u_int caplen)
fcslen = 0;
for (bit0 = 0, presentp = &hdr->it_present; presentp <= last_presentp;
presentp++, bit0 += 32) {
presentflags = EXTRACT_LE_32BITS(presentp);
/* Clear state. */
memset(&state, 0, sizeof(state));
for (present = EXTRACT_LE_32BITS(presentp); present;
present = next_present) {
/* clear the least significant bit that is set */
@ -1669,16 +2241,16 @@ ieee802_11_radio_print(const u_char *p, u_int length, u_int caplen)
bit = (enum ieee80211_radiotap_type)
(bit0 + BITNO_32(present ^ next_present));
if (print_radiotap_field(&cpacker, bit, &flags) != 0)
if (print_radiotap_field(&cpacker, bit, &flags, &state, presentflags) != 0)
goto out;
}
}
out:
if (flags & IEEE80211_RADIOTAP_F_DATAPAD)
pad = 1; /* Atheros padding */
if (flags & IEEE80211_RADIOTAP_F_FCS)
fcslen = 4; /* FCS at end of packet */
out:
return len + ieee802_11_print(p + len, length - len, caplen - len, pad,
fcslen);
#undef BITNO_32

View File

@ -0,0 +1,183 @@
/*
* Copyright (c) 2009
* Siemens AG, All rights reserved.
* Dmitry Eremin-Solenikov (dbaryshkov@gmail.com)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that: (1) source code distributions
* retain the above copyright notice and this paragraph in its entirety, (2)
* distributions including binary code include the above copyright notice and
* this paragraph in its entirety in the documentation or other materials
* provided with the distribution, and (3) all advertising materials mentioning
* features or use of this software display the following acknowledgement:
* ``This product includes software developed by the University of California,
* Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
* the University nor the names of its contributors may be used to endorse
* or promote products derived from this software without specific prior
* written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <tcpdump-stdinc.h>
#include <stdio.h>
#include <pcap.h>
#include <string.h>
#include "interface.h"
#include "addrtoname.h"
#include "extract.h"
static const char *ftypes[] = {
"Beacon", /* 0 */
"Data", /* 1 */
"ACK", /* 2 */
"Command", /* 3 */
"Reserved", /* 4 */
"Reserved", /* 5 */
"Reserved", /* 6 */
"Reserved", /* 7 */
};
static int
extract_header_length(u_int16_t fc)
{
int len = 0;
switch ((fc >> 10) & 0x3) {
case 0x00:
if (fc & (1 << 6)) /* intra-PAN with none dest addr */
return -1;
break;
case 0x01:
return -1;
case 0x02:
len += 4;
break;
case 0x03:
len += 10;
break;
}
switch ((fc >> 14) & 0x3) {
case 0x00:
break;
case 0x01:
return -1;
case 0x02:
len += 4;
break;
case 0x03:
len += 10;
break;
}
if (fc & (1 << 6)) {
if (len < 2)
return -1;
len -= 2;
}
return len;
}
u_int
ieee802_15_4_if_print(struct netdissect_options *ndo,
const struct pcap_pkthdr *h, const u_char *p)
{
u_int caplen = h->caplen;
int hdrlen;
u_int16_t fc;
u_int8_t seq;
if (caplen < 3) {
ND_PRINT((ndo, "[|802.15.4] %x", caplen));
return caplen;
}
fc = EXTRACT_LE_16BITS(p);
hdrlen = extract_header_length(fc);
seq = EXTRACT_LE_8BITS(p + 2);
p += 3;
caplen -= 3;
ND_PRINT((ndo,"IEEE 802.15.4 %s packet ", ftypes[fc & 0x7]));
if (vflag)
ND_PRINT((ndo,"seq %02x ", seq));
if (hdrlen == -1) {
ND_PRINT((ndo,"malformed! "));
return caplen;
}
if (!vflag) {
p+= hdrlen;
caplen -= hdrlen;
} else {
u_int16_t panid = 0;
switch ((fc >> 10) & 0x3) {
case 0x00:
ND_PRINT((ndo,"none "));
break;
case 0x01:
ND_PRINT((ndo,"reserved destination addressing mode"));
return 0;
case 0x02:
panid = EXTRACT_LE_16BITS(p);
p += 2;
ND_PRINT((ndo,"%04x:%04x ", panid, EXTRACT_LE_16BITS(p)));
p += 2;
break;
case 0x03:
panid = EXTRACT_LE_16BITS(p);
p += 2;
ND_PRINT((ndo,"%04x:%s ", panid, le64addr_string(p)));
p += 8;
break;
}
ND_PRINT((ndo,"< ");
switch ((fc >> 14) & 0x3) {
case 0x00:
ND_PRINT((ndo,"none "));
break;
case 0x01:
ND_PRINT((ndo,"reserved source addressing mode"));
return 0;
case 0x02:
if (!(fc & (1 << 6))) {
panid = EXTRACT_LE_16BITS(p);
p += 2;
}
ND_PRINT((ndo,"%04x:%04x ", panid, EXTRACT_LE_16BITS(p)));
p += 2;
break;
case 0x03:
if (!(fc & (1 << 6))) {
panid = EXTRACT_LE_16BITS(p);
p += 2;
}
ND_PRINT((ndo,"%04x:%s ", panid, le64addr_string(p))));
p += 8;
break;
}
caplen -= hdrlen;
}
if (!suppress_default_print)
(ndo->ndo_default_print)(ndo, p, caplen);
return 0;
}

View File

@ -106,7 +106,7 @@ ap1394_if_print(const struct pcap_pkthdr *h, const u_char *p)
p += FIREWIRE_HDRLEN;
ether_type = EXTRACT_16BITS(&fp->firewire_type);
if (ethertype_print(ether_type, p, length, caplen) == 0) {
if (ethertype_print(gndo, ether_type, p, length, caplen) == 0) {
/* ether_type not known, print raw packet */
if (!eflag)
ap1394_hdr_print((u_char *)fp, length + FIREWIRE_HDRLEN);

View File

@ -265,7 +265,7 @@ arcnet_encap_print(u_char arctype, const u_char *p,
#ifdef INET6
case ARCTYPE_INET6:
ip6_print(p, length);
ip6_print(gndo, p, length);
return (1);
#endif /*INET6*/

View File

@ -320,6 +320,7 @@ arp_print(netdissect_options *ndo,
return;
case ARPHRD_FRELAY:
linkaddr = LINKADDR_FRELAY;
break;
default:
linkaddr = LINKADDR_ETHER;
break;

View File

@ -101,30 +101,19 @@ llap_print(register const u_char *bp, u_int length)
u_short snet;
u_int hdrlen;
#if 0
/*
* Our packet is on a 4-byte boundary, as we're either called
* directly from a top-level link-layer printer (ltalk_if_print)
* or from the UDP printer. The LLAP+DDP header is a multiple
* of 4 bytes in length, so the DDP payload is also on a 4-byte
* boundary, and we don't need to align it before calling
* "ddp_print()".
*/
if (length < sizeof(*lp)) {
(void)printf(" [|llap %u]", length);
return (length);
}
lp = (const struct LAP *)bp;
bp += sizeof(*lp);
length -= sizeof(*lp);
#else
{
static struct LAP lp_ = {0, 0, lapDDP};
lp = &lp_;
}
#endif
hdrlen = sizeof(*lp);
switch (lp->type) {
case lapShortDDP:
if (length < ddpSSize) {
(void)printf(" [|sddp %d]", length);
(void)printf(" [|sddp %u]", length);
return (length);
}
sdp = (const struct atShortDDP *)bp;
@ -140,7 +129,7 @@ llap_print(register const u_char *bp, u_int length)
case lapDDP:
if (length < ddpSize) {
(void)printf(" [|ddp %d]", length);
(void)printf(" [|ddp %u]", length);
return (length);
}
dp = (const struct atDDP *)bp;
@ -163,7 +152,7 @@ llap_print(register const u_char *bp, u_int length)
#endif
default:
printf("%d > %d at-lap#%d %d",
printf("%d > %d at-lap#%d %u",
lp->src, lp->dst, lp->type, length);
break;
}
@ -185,7 +174,7 @@ atalk_print(register const u_char *bp, u_int length)
printf("AT ");
if (length < ddpSize) {
(void)printf(" [|ddp %d]", length);
(void)printf(" [|ddp %u]", length);
return;
}
dp = (const struct atDDP *)bp;
@ -274,6 +263,10 @@ atp_print(register const struct atATP *ap, u_int length)
fputs(tstr, stdout);
return;
}
if (length < sizeof(*ap)) {
(void)printf(" [|atp %u]", length);
return;
}
length -= sizeof(*ap);
switch (ap->control & 0xc0) {
@ -285,7 +278,7 @@ atp_print(register const struct atATP *ap, u_int length)
atp_bitmap_print(ap->bitmap);
if (length != 0)
(void)printf(" [len=%d]", length);
(void)printf(" [len=%u]", length);
switch (ap->control & (atpEOM|atpSTS)) {
case atpEOM:
@ -301,7 +294,7 @@ atp_print(register const struct atATP *ap, u_int length)
break;
case atpRspCode:
(void)printf(" atp-resp%s%d:%d (%d)",
(void)printf(" atp-resp%s%d:%d (%u)",
ap->control & atpEOM? "*" : " ",
EXTRACT_16BITS(&ap->transID), ap->bitmap, length);
switch (ap->control & (atpXO|atpSTS)) {
@ -324,7 +317,7 @@ atp_print(register const struct atATP *ap, u_int length)
/* length should be zero */
if (length)
(void)printf(" [len=%d]", length);
(void)printf(" [len=%u]", length);
/* there shouldn't be any control flags */
if (ap->control & (atpXO|atpEOM|atpSTS)) {
@ -346,7 +339,7 @@ atp_print(register const struct atATP *ap, u_int length)
break;
default:
(void)printf(" atp-0x%x %d (%d)", ap->control,
(void)printf(" atp-0x%x %d (%u)", ap->control,
EXTRACT_16BITS(&ap->transID), length);
break;
}
@ -396,14 +389,14 @@ nbp_print(register const struct atNBP *np, u_int length, register u_short snet,
const u_char *ep;
if (length < nbpHeaderSize) {
(void)printf(" truncated-nbp %d", length);
(void)printf(" truncated-nbp %u", length);
return;
}
length -= nbpHeaderSize;
if (length < 8) {
/* must be room for at least one tuple */
(void)printf(" truncated-nbp %d", length + nbpHeaderSize);
(void)printf(" truncated-nbp %u", length + nbpHeaderSize);
return;
}
/* ep points to end of available data */
@ -448,7 +441,7 @@ nbp_print(register const struct atNBP *np, u_int length, register u_short snet,
break;
default:
(void)printf(" nbp-0x%x %d (%d)", np->control, np->id,
(void)printf(" nbp-0x%x %d (%u)", np->control, np->id,
length);
break;
}
@ -560,19 +553,17 @@ ataddr_string(u_short atnet, u_char athost)
if (first && (first = 0, !nflag)
&& (fp = fopen("/etc/atalk.names", "r"))) {
char line[256];
int i1, i2, i3;
int i1, i2;
while (fgets(line, sizeof(line), fp)) {
if (line[0] == '\n' || line[0] == 0 || line[0] == '#')
continue;
if (sscanf(line, "%d.%d.%d %256s", &i1, &i2, &i3,
nambuf) == 4)
if (sscanf(line, "%d.%d %256s", &i1, &i2, nambuf) == 3)
/* got a hostname. */
i3 |= ((i1 << 8) | i2) << 8;
else if (sscanf(line, "%d.%d %256s", &i1, &i2,
nambuf) == 3)
i2 |= (i1 << 8);
else if (sscanf(line, "%d %256s", &i1, nambuf) == 2)
/* got a net name */
i3 = (((i1 << 8) | i2) << 8) | 255;
i2 = (i1 << 8) | 255;
else
continue;
@ -605,11 +596,9 @@ ataddr_string(u_short atnet, u_char athost)
tp->addr = (atnet << 8) | athost;
tp->nxt = newhnamemem();
if (athost != 255)
(void)snprintf(nambuf, sizeof(nambuf), "%d.%d.%d",
atnet >> 8, atnet & 0xff, athost);
(void)snprintf(nambuf, sizeof(nambuf), "%d.%d", atnet, athost);
else
(void)snprintf(nambuf, sizeof(nambuf), "%d.%d", atnet >> 8,
atnet & 0xff);
(void)snprintf(nambuf, sizeof(nambuf), "%d", atnet);
tp->name = strdup(nambuf);
return (tp->name);

View File

@ -272,10 +272,12 @@ sig_print(const u_char *p, int caplen)
printf(":%s ",
tok2str(msgtype2str, "msgtype#%d", p[MSG_TYPE_POS]));
if (caplen < CALL_REF_POS+3) {
printf("[|atm]");
return;
}
/*
* The call reference comes before the message type,
* so if we know we have the message type, which we
* do from the caplen test above, we also know we have
* the call reference.
*/
call_ref = EXTRACT_24BITS(&p[CALL_REF_POS]);
printf("CALL_REF:0x%06x", call_ref);
} else {

View File

@ -0,0 +1,414 @@
/*
* Copyright (c) 2007-2011 Grégoire Henry, Juliusz Chroboczek
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <tcpdump-stdinc.h>
#include <stdio.h>
#include <string.h>
#include "addrtoname.h"
#include "interface.h"
#include "extract.h"
static void babel_print_v2(const u_char *cp, u_int length);
void
babel_print(const u_char *cp, u_int length) {
printf("babel");
TCHECK2(*cp, 4);
if(cp[0] != 42) {
printf(" malformed header");
return;
} else {
printf(" %d", cp[1]);
}
switch(cp[1]) {
case 2:
babel_print_v2(cp,length);
break;
default:
printf(" unknown version");
break;
}
return;
trunc:
printf(" [|babel]");
return;
}
#define MESSAGE_PAD1 0
#define MESSAGE_PADN 1
#define MESSAGE_ACK_REQ 2
#define MESSAGE_ACK 3
#define MESSAGE_HELLO 4
#define MESSAGE_IHU 5
#define MESSAGE_ROUTER_ID 6
#define MESSAGE_NH 7
#define MESSAGE_UPDATE 8
#define MESSAGE_REQUEST 9
#define MESSAGE_MH_REQUEST 10
static const char *
format_id(const u_char *id)
{
static char buf[25];
snprintf(buf, 25, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7]);
buf[24] = '\0';
return buf;
}
static const unsigned char v4prefix[16] =
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0, 0, 0, 0 };
static const char *
format_prefix(const u_char *prefix, unsigned char plen)
{
static char buf[50];
if(plen >= 96 && memcmp(prefix, v4prefix, 12) == 0)
snprintf(buf, 50, "%s/%u", ipaddr_string(prefix + 12), plen - 96);
else
snprintf(buf, 50, "%s/%u", ip6addr_string(prefix), plen);
buf[49] = '\0';
return buf;
}
static const char *
format_address(const u_char *prefix)
{
if(memcmp(prefix, v4prefix, 12) == 0)
return ipaddr_string(prefix + 12);
else
return ip6addr_string(prefix);
}
static int
network_prefix(int ae, int plen, unsigned int omitted,
const unsigned char *p, const unsigned char *dp,
unsigned int len, unsigned char *p_r)
{
unsigned pb;
unsigned char prefix[16];
if(plen >= 0)
pb = (plen + 7) / 8;
else if(ae == 1)
pb = 4;
else
pb = 16;
if(pb > 16)
return -1;
memset(prefix, 0, 16);
switch(ae) {
case 0: break;
case 1:
if(omitted > 4 || pb > 4 || (pb > omitted && len < pb - omitted))
return -1;
memcpy(prefix, v4prefix, 12);
if(omitted) {
if (dp == NULL) return -1;
memcpy(prefix, dp, 12 + omitted);
}
if(pb > omitted) memcpy(prefix + 12 + omitted, p, pb - omitted);
break;
case 2:
if(omitted > 16 || (pb > omitted && len < pb - omitted))
return -1;
if(omitted) {
if (dp == NULL) return -1;
memcpy(prefix, dp, omitted);
}
if(pb > omitted) memcpy(prefix + omitted, p, pb - omitted);
break;
case 3:
if(pb > 8 && len < pb - 8) return -1;
prefix[0] = 0xfe;
prefix[1] = 0x80;
if(pb > 8) memcpy(prefix + 8, p, pb - 8);
break;
default:
return -1;
}
memcpy(p_r, prefix, 16);
return 1;
}
static int
network_address(int ae, const unsigned char *a, unsigned int len,
unsigned char *a_r)
{
return network_prefix(ae, -1, 0, a, NULL, len, a_r);
}
#define ICHECK(i, l) \
if ((i) + (l) > bodylen || (i) + (l) > length) goto corrupt;
static void
babel_print_v2(const u_char *cp, u_int length) {
u_int i;
u_short bodylen;
u_char v4_prefix[16] =
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0, 0, 0, 0 };
u_char v6_prefix[16] = {0};
TCHECK2(*cp, 4);
if (length < 4)
goto corrupt;
bodylen = EXTRACT_16BITS(cp + 2);
printf(" (%u)", bodylen);
/* Process the TLVs in the body */
i = 0;
while(i < bodylen) {
const u_char *message;
u_char type, len;
message = cp + 4 + i;
TCHECK2(*message, 2);
ICHECK(i, 2);
type = message[0];
len = message[1];
TCHECK2(*message, 2 + len);
ICHECK(i, 2 + len);
switch(type) {
case MESSAGE_PAD1: {
if(!vflag)
printf(" pad1");
else
printf("\n\tPad 1");
}
break;
case MESSAGE_PADN: {
if(!vflag)
printf(" padN");
else
printf("\n\tPad %d", len + 2);
}
break;
case MESSAGE_ACK_REQ: {
u_short nonce, interval;
if(!vflag)
printf(" ack-req");
else {
printf("\n\tAcknowledgment Request ");
if(len < 6) goto corrupt;
nonce = EXTRACT_16BITS(message + 4);
interval = EXTRACT_16BITS(message + 6);
printf("%04x %d", nonce, interval);
}
}
break;
case MESSAGE_ACK: {
u_short nonce;
if(!vflag)
printf(" ack");
else {
printf("\n\tAcknowledgment ");
if(len < 2) goto corrupt;
nonce = EXTRACT_16BITS(message + 2);
printf("%04x", nonce);
}
}
break;
case MESSAGE_HELLO: {
u_short seqno, interval;
if(!vflag)
printf(" hello");
else {
printf("\n\tHello ");
if(len < 6) goto corrupt;
seqno = EXTRACT_16BITS(message + 4);
interval = EXTRACT_16BITS(message + 6);
printf("seqno %u interval %u", seqno, interval);
}
}
break;
case MESSAGE_IHU: {
unsigned short txcost, interval;
if(!vflag)
printf(" ihu");
else {
u_char address[16];
int rc;
printf("\n\tIHU ");
if(len < 6) goto corrupt;
txcost = EXTRACT_16BITS(message + 4);
interval = EXTRACT_16BITS(message + 6);
rc = network_address(message[2], message + 8, len - 6, address);
if(rc < 0) { printf("[|babel]"); break; }
printf("%s txcost %u interval %d",
format_address(address), txcost, interval);
}
}
break;
case MESSAGE_ROUTER_ID: {
if(!vflag)
printf(" router-id");
else {
printf("\n\tRouter Id");
if(len < 10) goto corrupt;
printf(" %s", format_id(message + 4));
}
}
break;
case MESSAGE_NH: {
if(!vflag)
printf(" nh");
else {
int rc;
u_char nh[16];
printf("\n\tNext Hop");
if(len < 2) goto corrupt;
rc = network_address(message[2], message + 4, len - 2, nh);
if(rc < 0) goto corrupt;
printf(" %s", format_address(nh));
}
}
break;
case MESSAGE_UPDATE: {
if(!vflag) {
printf(" update");
if(len < 1)
printf("/truncated");
else
printf("%s%s%s",
(message[3] & 0x80) ? "/prefix": "",
(message[3] & 0x40) ? "/id" : "",
(message[3] & 0x3f) ? "/unknown" : "");
} else {
u_short interval, seqno, metric;
u_char plen;
int rc;
u_char prefix[16];
printf("\n\tUpdate");
if(len < 10) goto corrupt;
plen = message[4] + (message[2] == 1 ? 96 : 0);
rc = network_prefix(message[2], message[4], message[5],
message + 12,
message[2] == 1 ? v4_prefix : v6_prefix,
len - 10, prefix);
if(rc < 0) goto corrupt;
interval = EXTRACT_16BITS(message + 6);
seqno = EXTRACT_16BITS(message + 8);
metric = EXTRACT_16BITS(message + 10);
printf("%s%s%s %s metric %u seqno %u interval %u",
(message[3] & 0x80) ? "/prefix": "",
(message[3] & 0x40) ? "/id" : "",
(message[3] & 0x3f) ? "/unknown" : "",
format_prefix(prefix, plen),
metric, seqno, interval);
if(message[3] & 0x80) {
if(message[2] == 1)
memcpy(v4_prefix, prefix, 16);
else
memcpy(v6_prefix, prefix, 16);
}
}
}
break;
case MESSAGE_REQUEST: {
if(!vflag)
printf(" request");
else {
int rc;
u_char prefix[16], plen;
printf("\n\tRequest ");
if(len < 2) goto corrupt;
plen = message[3] + (message[2] == 1 ? 96 : 0);
rc = network_prefix(message[2], message[3], 0,
message + 4, NULL, len - 2, prefix);
if(rc < 0) goto corrupt;
plen = message[3] + (message[2] == 1 ? 96 : 0);
printf("for %s",
message[2] == 0 ? "any" : format_prefix(prefix, plen));
}
}
break;
case MESSAGE_MH_REQUEST : {
if(!vflag)
printf(" mh-request");
else {
int rc;
u_short seqno;
u_char prefix[16], plen;
printf("\n\tMH-Request ");
if(len < 14) goto corrupt;
seqno = EXTRACT_16BITS(message + 4);
rc = network_prefix(message[2], message[3], 0,
message + 16, NULL, len - 14, prefix);
if(rc < 0) goto corrupt;
plen = message[3] + (message[2] == 1 ? 96 : 0);
printf("(%u hops) for %s seqno %u id %s",
message[6], format_prefix(prefix, plen),
seqno, format_id(message + 8));
}
}
break;
default:
if(!vflag)
printf(" unknown");
else
printf("\n\tUnknown message type %d", type);
}
i += len + 2;
}
return;
trunc:
printf(" [|babel]");
return;
corrupt:
printf(" (corrupt)");
return;
}

View File

@ -401,8 +401,11 @@ static struct tok bgp_safi_values[] = {
#define BGP_EXT_COM_L2INFO 0x800a /* draft-kompella-ppvpn-l2vpn */
#define BGP_EXT_COM_SOURCE_AS 0x0009 /* draft-ietf-l3vpn-2547bis-mcast-bgp-02.txt */
#define BGP_EXT_COM_VRF_RT_IMP 0x010a /* draft-ietf-l3vpn-2547bis-mcast-bgp-02.txt */
#define BGP_EXT_COM_SOURCE_AS 0x0009 /* RFC-ietf-l3vpn-2547bis-mcast-bgp-08.txt */
#define BGP_EXT_COM_VRF_RT_IMP 0x010b /* RFC-ietf-l3vpn-2547bis-mcast-bgp-08.txt */
#define BGP_EXT_COM_L2VPN_RT_0 0x000a /* L2VPN Identifier,Format AS(2bytes):AN(4bytes) */
#define BGP_EXT_COM_L2VPN_RT_1 0xF10a /* L2VPN Identifier,Format IP address:AN(2bytes) */
/* http://www.cisco.com/en/US/tech/tk436/tk428/technologies_tech_note09186a00801eb09a.shtml */
#define BGP_EXT_COM_EIGRP_GEN 0x8800
@ -443,6 +446,8 @@ static struct tok bgp_extd_comm_subtype_values[] = {
{ BGP_EXT_COM_EIGRP_EXT_REMPROTO_REMMETRIC , "eigrp-external-route (remote-proto, remote-metric)" },
{ BGP_EXT_COM_SOURCE_AS, "source-AS" },
{ BGP_EXT_COM_VRF_RT_IMP, "vrf-route-import"},
{ BGP_EXT_COM_L2VPN_RT_0, "l2vpn-id"},
{ BGP_EXT_COM_L2VPN_RT_1, "l2vpn-id"},
{ 0, NULL},
};
@ -951,6 +956,27 @@ decode_labeled_vpn_l2(const u_char *pptr, char *buf, u_int buflen)
plen=EXTRACT_16BITS(pptr);
tlen=plen;
pptr+=2;
/* Old and new L2VPN NLRI share AFI/SAFI
* -> Assume a 12 Byte-length NLRI is auto-discovery-only
* and > 17 as old format. Complain for the middle case
*/
if (plen==12) {
/* assume AD-only with RD, BGPNH */
TCHECK2(pptr[0],12);
buf[0]='\0';
strlen=snprintf(buf, buflen, "RD: %s, BGPNH: %s",
bgp_vpn_rd_print(pptr),
/* need something like getname() here */
getname(pptr+8)
);
UPDATE_BUF_BUFLEN(buf, buflen, strlen);
pptr+=12;
tlen-=12;
return plen;
} else if (plen>17) {
/* assume old format */
/* RD, ID, LBLKOFF, LBLBASE */
TCHECK2(pptr[0],15);
buf[0]='\0';
strlen=snprintf(buf, buflen, "RD: %s, CE-ID: %u, Label-Block Offset: %u, Label Base %u",
@ -1003,6 +1029,12 @@ decode_labeled_vpn_l2(const u_char *pptr, char *buf, u_int buflen)
}
return plen+2;
} else {
/* complain bitterly ? */
/* fall through */
goto trunc;
}
trunc:
return -2;
}
@ -1939,6 +1971,7 @@ bgp_attr_print(const struct bgp_attr *attr, const u_char *pptr, int len)
switch(extd_comm) {
case BGP_EXT_COM_RT_0:
case BGP_EXT_COM_RO_0:
case BGP_EXT_COM_L2VPN_RT_0:
printf(": %u:%u (= %s)",
EXTRACT_16BITS(tptr+2),
EXTRACT_32BITS(tptr+4),
@ -1946,6 +1979,7 @@ bgp_attr_print(const struct bgp_attr *attr, const u_char *pptr, int len)
break;
case BGP_EXT_COM_RT_1:
case BGP_EXT_COM_RO_1:
case BGP_EXT_COM_L2VPN_RT_1:
case BGP_EXT_COM_VRF_RT_IMP:
printf(": %s:%u",
getname(tptr+2),

View File

@ -0,0 +1,88 @@
/* $OpenBSD: print-carp.c,v 1.6 2009/10/27 23:59:55 deraadt Exp $ */
/*
* Copyright (c) 2000 William C. Fenner.
* All rights reserved.
*
* Kevin Steves <ks@hp.se> July 2000
* Modified to:
* - print version, type string and packet length
* - print IP address count if > 1 (-v)
* - verify checksum (-v)
* - print authentication string (-v)
*
* Copyright (c) 2011 Advanced Computing Technologies
* George V. Neille-Neil
*
* Modified to:
* - work correctly with CARP
* - compile into the latest tcpdump
* - print out the counter
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that: (1) source code
* distributions retain the above copyright notice and this paragraph
* in its entirety, and (2) distributions including binary code include
* the above copyright notice and this paragraph in its entirety in
* the documentation or other materials provided with the distribution.
* The name of William C. Fenner may not be used to endorse or
* promote products derived from this software without specific prior
* written permission. THIS SOFTWARE IS PROVIDED ``AS IS'' AND
* WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
* LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE.
*
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <tcpdump-stdinc.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include "interface.h"
#include "extract.h"
#include "addrtoname.h"
void
carp_print(register const u_char *bp, register u_int len, int ttl)
{
int version, type;
const char *type_s;
TCHECK(bp[0]);
version = (bp[0] & 0xf0) >> 4;
type = bp[0] & 0x0f;
if (type == 1)
type_s = "advertise";
else
type_s = "unknown";
printf("CARPv%d-%s %d: ", version, type_s, len);
if (ttl != 255)
printf("[ttl=%d!] ", ttl);
if (version != 2 || type != 1)
return;
TCHECK(bp[2]);
TCHECK(bp[5]);
printf("vhid=%d advbase=%d advskew=%d authlen=%d ",
bp[1], bp[5], bp[2], bp[3]);
if (vflag) {
struct cksum_vec vec[1];
vec[0].ptr = (const u_int8_t *)bp;
vec[0].len = len;
if (TTEST2(bp[0], len) && in_cksum(vec, 1))
printf(" (bad carp cksum %x!)",
EXTRACT_16BITS(&bp[6]));
}
printf("counter=%" PRIu64, EXTRACT_64BITS(&bp[8]));
return;
trunc:
printf("[|carp]");
}

View File

@ -124,7 +124,7 @@ cdp_print(const u_char *pptr, u_int length, u_int caplen)
tok2str(cdp_tlv_values,"unknown field type", type),
type,
len,
len>1 ? "s" : ""); /* plural */
PLURAL_SUFFIX(len)); /* plural */
switch (type) {

View File

@ -85,7 +85,7 @@ chdlc_print(register const u_char *p, u_int length) {
break;
#ifdef INET6
case ETHERTYPE_IPV6:
ip6_print(p, length);
ip6_print(gndo, p, length);
break;
#endif
case CHDLC_TYPE_SLARP:

View File

@ -60,7 +60,7 @@ static const char *dccp_feature_nums[] = {
"check data checksum",
};
static inline int dccp_csum_coverage(const struct dccp_hdr* dh, u_int len)
static inline u_int dccp_csum_coverage(const struct dccp_hdr* dh, u_int len)
{
u_int cov;
@ -73,61 +73,15 @@ static inline int dccp_csum_coverage(const struct dccp_hdr* dh, u_int len)
static int dccp_cksum(const struct ip *ip,
const struct dccp_hdr *dh, u_int len)
{
int cov = dccp_csum_coverage(dh, len);
union phu {
struct phdr {
u_int32_t src;
u_int32_t dst;
u_char mbz;
u_char proto;
u_int16_t len;
} ph;
u_int16_t pa[6];
} phu;
const u_int16_t *sp;
/* pseudo-header.. */
phu.ph.mbz = 0;
phu.ph.len = htons(len);
phu.ph.proto = IPPROTO_DCCP;
memcpy(&phu.ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t));
if (IP_HL(ip) == 5)
memcpy(&phu.ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t));
else
phu.ph.dst = ip_finddst(ip);
sp = &phu.pa[0];
return in_cksum((u_short *)dh, cov, sp[0]+sp[1]+sp[2]+sp[3]+sp[4]+sp[5]);
return nextproto4_cksum(ip, (const u_int8_t *)(void *)dh,
dccp_csum_coverage(dh, len), IPPROTO_DCCP);
}
#ifdef INET6
static int dccp6_cksum(const struct ip6_hdr *ip6, const struct dccp_hdr *dh, u_int len)
{
size_t i;
u_int32_t sum = 0;
int cov = dccp_csum_coverage(dh, len);
union {
struct {
struct in6_addr ph_src;
struct in6_addr ph_dst;
u_int32_t ph_len;
u_int8_t ph_zero[3];
u_int8_t ph_nxt;
} ph;
u_int16_t pa[20];
} phu;
/* pseudo-header */
memset(&phu, 0, sizeof(phu));
phu.ph.ph_src = ip6->ip6_src;
phu.ph.ph_dst = ip6->ip6_dst;
phu.ph.ph_len = htonl(len);
phu.ph.ph_nxt = IPPROTO_DCCP;
for (i = 0; i < sizeof(phu.pa) / sizeof(phu.pa[0]); i++)
sum += phu.pa[i];
return in_cksum((u_short *)dh, cov, sum);
return nextproto6_cksum(ip6, (const u_int8_t *)(void *)dh,
dccp_csum_coverage(dh, len), IPPROTO_DCCP);
}
#endif

View File

@ -229,15 +229,15 @@ dhcp6opt_name(int type)
case DH6OPT_SIP_SERVER_A:
return "SIP-servers-address";
case DH6OPT_DNS:
return "DNS";
return "DNS-server";
case DH6OPT_DNSNAME:
return "DNS-name";
return "DNS-search-list";
case DH6OPT_IA_PD:
return "IA_PD";
case DH6OPT_IA_PD_PREFIX:
return "IA_PD-prefix";
case DH6OPT_NTP_SERVERS:
return "NTP-Server";
return "NTP-server";
case DH6OPT_LIFETIME:
return "lifetime";
case DH6OPT_NIS_SERVERS:

View File

@ -80,7 +80,7 @@ enc_if_print(const struct pcap_pkthdr *h, register const u_char *p)
break;
#ifdef INET6
case AF_INET6:
ip6_print(p, length);
ip6_print(gndo, p, length);
break;
#endif /*INET6*/
}

View File

@ -25,6 +25,7 @@ static const char rcsid[] _U_ =
"@(#) $Header: /tcpdump/master/tcpdump/print-ether.c,v 1.106 2008-02-06 10:47:53 guy Exp $ (LBL)";
#endif
#define NETDISSECT_REWORKED
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
@ -47,6 +48,9 @@ const struct tok ethertype_values[] = {
{ ETHERTYPE_MPLS_MULTI, "MPLS multicast" },
{ ETHERTYPE_IPV6, "IPv6" },
{ ETHERTYPE_8021Q, "802.1Q" },
{ ETHERTYPE_8021Q9100, "802.1Q-9100" },
{ ETHERTYPE_8021QinQ, "802.1Q-QinQ" },
{ ETHERTYPE_8021Q9200, "802.1Q-9200" },
{ ETHERTYPE_VMAN, "VMAN" },
{ ETHERTYPE_PUP, "PUP" },
{ ETHERTYPE_ARP, "ARP"},
@ -86,33 +90,34 @@ const struct tok ethertype_values[] = {
};
static inline void
ether_hdr_print(register const u_char *bp, u_int length)
ether_hdr_print(netdissect_options *ndo,
const u_char *bp, u_int length)
{
register const struct ether_header *ep;
u_int16_t ether_type;
ep = (const struct ether_header *)bp;
(void)printf("%s > %s",
(void)ND_PRINT((ndo, "%s > %s",
etheraddr_string(ESRC(ep)),
etheraddr_string(EDST(ep)));
etheraddr_string(EDST(ep))));
ether_type = EXTRACT_16BITS(&ep->ether_type);
if (!qflag) {
if (!ndo->ndo_qflag) {
if (ether_type <= ETHERMTU)
(void)printf(", 802.3");
(void)ND_PRINT((ndo, ", 802.3"));
else
(void)printf(", ethertype %s (0x%04x)",
(void)ND_PRINT((ndo, ", ethertype %s (0x%04x)",
tok2str(ethertype_values,"Unknown", ether_type),
ether_type);
ether_type));
} else {
if (ether_type <= ETHERMTU)
(void)printf(", 802.3");
(void)ND_PRINT((ndo, ", 802.3"));
else
(void)printf(", %s", tok2str(ethertype_values,"Unknown Ethertype (0x%04x)", ether_type));
(void)ND_PRINT((ndo, ", %s", tok2str(ethertype_values,"Unknown Ethertype (0x%04x)", ether_type)));
}
(void)printf(", length %u: ", length);
(void)ND_PRINT((ndo, ", length %u: ", length));
}
/*
@ -122,8 +127,9 @@ ether_hdr_print(register const u_char *bp, u_int length)
* frame's protocol, and an argument to pass to that function.
*/
void
ether_print(const u_char *p, u_int length, u_int caplen,
void (*print_encap_header)(const u_char *), const u_char *encap_header_arg)
ether_print(netdissect_options *ndo,
const u_char *p, u_int length, u_int caplen,
void (*print_encap_header)(netdissect_options *ndo, const u_char *), const u_char *encap_header_arg)
{
struct ether_header *ep;
u_int orig_length;
@ -131,14 +137,14 @@ ether_print(const u_char *p, u_int length, u_int caplen,
u_short extracted_ether_type;
if (caplen < ETHER_HDRLEN || length < ETHER_HDRLEN) {
printf("[|ether]");
ND_PRINT((ndo, "[|ether]"));
return;
}
if (eflag) {
if (ndo->ndo_eflag) {
if (print_encap_header != NULL)
(*print_encap_header)(encap_header_arg);
ether_hdr_print(p, length);
(*print_encap_header)(ndo, encap_header_arg);
ether_hdr_print(ndo, p, length);
}
orig_length = length;
@ -158,36 +164,39 @@ ether_print(const u_char *p, u_int length, u_int caplen,
if (llc_print(p, length, caplen, ESRC(ep), EDST(ep),
&extracted_ether_type) == 0) {
/* ether_type not known, print raw packet */
if (!eflag) {
if (!ndo->ndo_eflag) {
if (print_encap_header != NULL)
(*print_encap_header)(encap_header_arg);
ether_hdr_print((u_char *)ep, orig_length);
(*print_encap_header)(ndo, encap_header_arg);
ether_hdr_print(ndo, (u_char *)ep, orig_length);
}
if (!suppress_default_print)
default_print(p, caplen);
if (!ndo->ndo_suppress_default_print)
ndo->ndo_default_print(ndo, p, caplen);
}
} else if (ether_type == ETHERTYPE_8021Q) {
} else if (ether_type == ETHERTYPE_8021Q ||
ether_type == ETHERTYPE_8021Q9100 ||
ether_type == ETHERTYPE_8021Q9200 ||
ether_type == ETHERTYPE_8021QinQ) {
/*
* Print VLAN information, and then go back and process
* the enclosed type field.
*/
if (caplen < 4 || length < 4) {
printf("[|vlan]");
ND_PRINT((ndo, "[|vlan]"));
return;
}
if (eflag) {
if (ndo->ndo_eflag) {
u_int16_t tag = EXTRACT_16BITS(p);
printf("vlan %u, p %u%s, ",
ND_PRINT((ndo, "vlan %u, p %u%s, ",
tag & 0xfff,
tag >> 13,
(tag & 0x1000) ? ", CFI" : "");
(tag & 0x1000) ? ", CFI" : ""));
}
ether_type = EXTRACT_16BITS(p + 2);
if (eflag && ether_type > ETHERMTU)
printf("ethertype %s, ", tok2str(ethertype_values,"0x%04x", ether_type));
if (ndo->ndo_eflag && ether_type > ETHERMTU)
ND_PRINT((ndo, "ethertype %s, ", tok2str(ethertype_values,"0x%04x", ether_type)));
p += 4;
length -= 4;
caplen -= 4;
@ -206,26 +215,26 @@ ether_print(const u_char *p, u_int length, u_int caplen,
if (llc_print(p, length, caplen, ESRC(ep), EDST(ep),
&extracted_ether_type) == 0) {
/* ether_type not known, print raw packet */
if (!eflag) {
if (!ndo->ndo_eflag) {
if (print_encap_header != NULL)
(*print_encap_header)(encap_header_arg);
ether_hdr_print((u_char *)ep, orig_length);
(*print_encap_header)(ndo, encap_header_arg);
ether_hdr_print(ndo, (u_char *)ep, orig_length);
}
if (!suppress_default_print)
default_print(p, caplen);
if (!ndo->ndo_suppress_default_print)
ndo->ndo_default_print(ndo, p, caplen);
}
} else {
if (ethertype_print(ether_type, p, length, caplen) == 0) {
if (ethertype_print(ndo, ether_type, p, length, caplen) == 0) {
/* ether_type not known, print raw packet */
if (!eflag) {
if (!ndo->ndo_eflag) {
if (print_encap_header != NULL)
(*print_encap_header)(encap_header_arg);
ether_hdr_print((u_char *)ep, orig_length);
(*print_encap_header)(ndo, encap_header_arg);
ether_hdr_print(ndo, (u_char *)ep, orig_length);
}
if (!suppress_default_print)
default_print(p, caplen);
if (!ndo->ndo_suppress_default_print)
ndo->ndo_default_print(ndo, p, caplen);
}
}
}
@ -237,13 +246,71 @@ ether_print(const u_char *p, u_int length, u_int caplen,
* is the number of bytes actually captured.
*/
u_int
ether_if_print(const struct pcap_pkthdr *h, const u_char *p)
ether_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
const u_char *p)
{
ether_print(p, h->len, h->caplen, NULL, NULL);
ether_print(ndo, p, h->len, h->caplen, NULL, NULL);
return (ETHER_HDRLEN);
}
/*
* This is the top level routine of the printer. 'p' points
* to the ether header of the packet, 'h->ts' is the timestamp,
* 'h->len' is the length of the packet off the wire, and 'h->caplen'
* is the number of bytes actually captured.
*
* This is for DLT_NETANALYZER, which has a 4-byte pseudo-header
* before the Ethernet header.
*/
u_int
netanalyzer_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
const u_char *p)
{
/*
* Fail if we don't have enough data for the Hilscher pseudo-header.
*/
if (h->len < 4 || h->caplen < 4) {
printf("[|netanalyzer]");
return (h->caplen);
}
/* Skip the pseudo-header. */
ether_print(ndo, p + 4, h->len - 4, h->caplen - 4, NULL, NULL);
return (4 + ETHER_HDRLEN);
}
/*
* This is the top level routine of the printer. 'p' points
* to the ether header of the packet, 'h->ts' is the timestamp,
* 'h->len' is the length of the packet off the wire, and 'h->caplen'
* is the number of bytes actually captured.
*
* This is for DLT_NETANALYZER_TRANSPARENT, which has a 4-byte
* pseudo-header, a 7-byte Ethernet preamble, and a 1-byte Ethernet SOF
* before the Ethernet header.
*/
u_int
netanalyzer_transparent_if_print(netdissect_options *ndo,
const struct pcap_pkthdr *h,
const u_char *p)
{
/*
* Fail if we don't have enough data for the Hilscher pseudo-header,
* preamble, and SOF.
*/
if (h->len < 12 || h->caplen < 12) {
printf("[|netanalyzer-transparent]");
return (h->caplen);
}
/* Skip the pseudo-header, preamble, and SOF. */
ether_print(ndo, p + 12, h->len - 12, h->caplen - 12, NULL, NULL);
return (12 + ETHER_HDRLEN);
}
/*
* Prints the packet payload, given an Ethernet type code for the payload's
* protocol.
@ -252,85 +319,87 @@ ether_if_print(const struct pcap_pkthdr *h, const u_char *p)
*/
int
ethertype_print(u_short ether_type, const u_char *p, u_int length, u_int caplen)
ethertype_print(netdissect_options *ndo,
u_short ether_type, const u_char *p,
u_int length, u_int caplen)
{
switch (ether_type) {
case ETHERTYPE_IP:
ip_print(gndo, p, length);
ip_print(ndo, p, length);
return (1);
#ifdef INET6
case ETHERTYPE_IPV6:
ip6_print(p, length);
ip6_print(ndo, p, length);
return (1);
#endif /*INET6*/
case ETHERTYPE_ARP:
case ETHERTYPE_REVARP:
arp_print(gndo, p, length, caplen);
arp_print(ndo, p, length, caplen);
return (1);
case ETHERTYPE_DN:
decnet_print(p, length, caplen);
decnet_print(/*ndo,*/p, length, caplen);
return (1);
case ETHERTYPE_ATALK:
if (vflag)
if (ndo->ndo_vflag)
fputs("et1 ", stdout);
atalk_print(p, length);
atalk_print(/*ndo,*/p, length);
return (1);
case ETHERTYPE_AARP:
aarp_print(p, length);
aarp_print(/*ndo,*/p, length);
return (1);
case ETHERTYPE_IPX:
printf("(NOV-ETHII) ");
ipx_print(p, length);
ND_PRINT((ndo, "(NOV-ETHII) "));
ipx_print(/*ndo,*/p, length);
return (1);
case ETHERTYPE_ISO:
isoclns_print(p+1, length-1, length-1);
isoclns_print(/*ndo,*/p+1, length-1, length-1);
return(1);
case ETHERTYPE_PPPOED:
case ETHERTYPE_PPPOES:
case ETHERTYPE_PPPOED2:
case ETHERTYPE_PPPOES2:
pppoe_print(p, length);
pppoe_print(/*ndo,*/p, length);
return (1);
case ETHERTYPE_EAPOL:
eap_print(gndo, p, length);
eap_print(ndo, p, length);
return (1);
case ETHERTYPE_RRCP:
rrcp_print(gndo, p - 14 , length + 14);
rrcp_print(ndo, p - 14 , length + 14);
return (1);
case ETHERTYPE_PPP:
if (length) {
printf(": ");
ppp_print(p, length);
ppp_print(/*ndo,*/p, length);
}
return (1);
case ETHERTYPE_MPCP:
mpcp_print(p, length);
mpcp_print(/*ndo,*/p, length);
return (1);
case ETHERTYPE_SLOW:
slow_print(p, length);
slow_print(/*ndo,*/p, length);
return (1);
case ETHERTYPE_CFM:
case ETHERTYPE_CFM_OLD:
cfm_print(p, length);
cfm_print(/*ndo,*/p, length);
return (1);
case ETHERTYPE_LLDP:
lldp_print(p, length);
lldp_print(/*ndo,*/p, length);
return (1);
case ETHERTYPE_LOOPBACK:
@ -338,7 +407,7 @@ ethertype_print(u_short ether_type, const u_char *p, u_int length, u_int caplen)
case ETHERTYPE_MPLS:
case ETHERTYPE_MPLS_MULTI:
mpls_print(p, length);
mpls_print(/*ndo,*/p, length);
return (1);
case ETHERTYPE_LAT:

View File

@ -213,7 +213,7 @@ pkeyitlv_print(register const u_char * pptr, register u_int len,
int
pdatacnt_print(register const u_char * pptr, register u_int len,
u_int32_t IDcnt, u_int16_t op_msk, int indent)
u_int16_t IDcnt, u_int16_t op_msk, int indent)
{
u_int i;
int rc;
@ -285,6 +285,7 @@ pdatacnt_print(register const u_char * pptr, register u_int len,
rc = ops->print((const u_char *)pdtlv,
tll + pad + TLV_HDRL, op_msk,
indent + 2);
len -= (TLV_HDRL + pad + tll);
} else {
printf("Invalid path data content type 0x%x len %d\n",
type, EXTRACT_16BITS(&pdtlv->length));
@ -298,7 +299,7 @@ pdatacnt_print(register const u_char * pptr, register u_int len,
}
}
}
return 0;
return len;
trunc:
fputs("[|forces]", stdout);
@ -312,6 +313,8 @@ pdata_print(register const u_char * pptr, register u_int len,
const struct pathdata_h *pdh = (struct pathdata_h *)pptr;
char *ib = indent_pr(indent, 0);
u_int minsize = 0;
int more_pd = 0;
u_int16_t idcnt = 0;
TCHECK(*pdh);
if (len < sizeof(struct pathdata_h))
@ -326,7 +329,8 @@ pdata_print(register const u_char * pptr, register u_int len,
}
pptr += sizeof(struct pathdata_h);
len -= sizeof(struct pathdata_h);
minsize = EXTRACT_16BITS(&pdh->pIDcnt) * 4;
idcnt = EXTRACT_16BITS(&pdh->pIDcnt);
minsize = idcnt * 4;
if (len < minsize) {
printf("\t\t\ttruncated IDs expected %uB got %uB\n", minsize,
len);
@ -334,7 +338,15 @@ pdata_print(register const u_char * pptr, register u_int len,
printf("]\n");
return -1;
}
return pdatacnt_print(pptr, len, EXTRACT_16BITS(&pdh->pIDcnt), op_msk, indent);
more_pd = pdatacnt_print(pptr, len, idcnt, op_msk, indent);
if (more_pd > 0) {
int consumed = len - more_pd;
pptr += consumed;
len = more_pd;
/* XXX: Argh, recurse some more */
return recpdoptlv_print(pptr, len, op_msk, indent+1);
} else
return 0;
trunc:
fputs("[|forces]", stdout);

View File

@ -258,7 +258,7 @@ fr_print(register const u_char *p, u_int length)
if (eflag)
fr_hdr_print(length, addr_len, dlci, flags, extracted_ethertype);
if (ethertype_print(extracted_ethertype,
if (ethertype_print(gndo, extracted_ethertype,
p+addr_len+ETHERTYPE_LEN,
length-addr_len-ETHERTYPE_LEN,
length-addr_len-ETHERTYPE_LEN) == 0)
@ -288,7 +288,7 @@ fr_print(register const u_char *p, u_int length)
#ifdef INET6
case NLPID_IP6:
ip6_print(p, length);
ip6_print(gndo, p, length);
break;
#endif
case NLPID_CLNP:

View File

@ -210,7 +210,7 @@ gre_print_0(const u_char *bp, u_int length)
break;
#ifdef INET6
case ETHERTYPE_IPV6:
ip6_print(bp, len);
ip6_print(gndo, bp, len);
break;
#endif
case ETHERTYPE_MPLS:
@ -226,7 +226,7 @@ gre_print_0(const u_char *bp, u_int length)
isoclns_print(bp, len, len);
break;
case ETHERTYPE_TEB:
ether_print(bp, len, len, NULL, NULL);
ether_print(gndo, bp, len, len, NULL, NULL);
break;
default:
printf("gre-proto-0x%x", prot);

View File

@ -348,6 +348,7 @@ icmp_print(const u_char *bp, u_int plen, const u_char *bp2, int fragmented)
const struct icmp_mpls_ext_object_header_t *icmp_mpls_ext_object_header;
u_int hlen, dport, mtu, obj_tlen, obj_class_num, obj_ctype;
char buf[MAXHOSTNAMELEN + 100];
struct cksum_vec vec[1];
dp = (struct icmp *)bp;
ext_dp = (struct icmp_ext_t *)bp;
@ -562,8 +563,11 @@ icmp_print(const u_char *bp, u_int plen, const u_char *bp2, int fragmented)
(void)printf("ICMP %s, length %u", str, plen);
if (vflag && !fragmented) { /* don't attempt checksumming if this is a frag */
u_int16_t sum, icmp_sum;
struct cksum_vec vec[1];
if (TTEST2(*bp, plen)) {
sum = in_cksum((u_short*)dp, plen, 0);
vec[0].ptr = (const u_int8_t *)(void *)dp;
vec[0].len = plen;
sum = in_cksum(vec, 1);
if (sum != 0) {
icmp_sum = EXTRACT_16BITS(&dp->icmp_cksum);
(void)printf(" (wrong icmp cksum %x (->%x)!)",
@ -600,11 +604,13 @@ icmp_print(const u_char *bp, u_int plen, const u_char *bp2, int fragmented)
* to check if an extension header is present. This is expedient,
* however not all implementations set the length field proper.
*/
if (!ext_dp->icmp_length &&
in_cksum((const u_short *)&ext_dp->icmp_ext_version_res,
plen - ICMP_EXTD_MINLEN, 0)) {
if (!ext_dp->icmp_length) {
vec[0].ptr = (const u_int8_t *)(void *)&ext_dp->icmp_ext_version_res;
vec[0].len = plen - ICMP_EXTD_MINLEN;
if (in_cksum(vec, 1)) {
return;
}
}
printf("\n\tMPLS extension v%u",
ICMP_MPLS_EXT_EXTRACT_VERSION(*(ext_dp->icmp_ext_version_res)));
@ -619,10 +625,11 @@ icmp_print(const u_char *bp, u_int plen, const u_char *bp2, int fragmented)
}
hlen = plen - ICMP_EXTD_MINLEN;
vec[0].ptr = (const u_int8_t *)(void *)&ext_dp->icmp_ext_version_res;
vec[0].len = hlen;
printf(", checksum 0x%04x (%scorrect), length %u",
EXTRACT_16BITS(ext_dp->icmp_ext_checksum),
in_cksum((const u_short *)&ext_dp->icmp_ext_version_res,
plen - ICMP_EXTD_MINLEN, 0) ? "in" : "",
in_cksum(vec, 1) ? "in" : "",
hlen);
hlen -= 4; /* subtract common header size */

View File

@ -197,50 +197,20 @@ print_lladdr(const u_int8_t *p, size_t l)
static int icmp6_cksum(const struct ip6_hdr *ip6, const struct icmp6_hdr *icp,
u_int len)
{
size_t i;
register const u_int16_t *sp;
u_int32_t sum;
union {
struct {
struct in6_addr ph_src;
struct in6_addr ph_dst;
u_int32_t ph_len;
u_int8_t ph_zero[3];
u_int8_t ph_nxt;
} ph;
u_int16_t pa[20];
} phu;
/* pseudo-header */
memset(&phu, 0, sizeof(phu));
phu.ph.ph_src = ip6->ip6_src;
phu.ph.ph_dst = ip6->ip6_dst;
phu.ph.ph_len = htonl(len);
phu.ph.ph_nxt = IPPROTO_ICMPV6;
sum = 0;
for (i = 0; i < sizeof(phu.pa) / sizeof(phu.pa[0]); i++)
sum += phu.pa[i];
sp = (const u_int16_t *)icp;
for (i = 0; i < (len & ~1); i += 2)
sum += *sp++;
if (len & 1)
sum += htons((*(const u_int8_t *)sp) << 8);
while (sum > 0xffff)
sum = (sum & 0xffff) + (sum >> 16);
sum = ~sum & 0xffff;
return (sum);
return (nextproto6_cksum(ip6, (const u_int8_t *)(void *)icp, len,
IPPROTO_ICMPV6));
}
enum ND_RPL_CODE {
ND_RPL_DAG_IS=0x01,
ND_RPL_DAG_IO=0x02,
ND_RPL_DAO =0x04
ND_RPL_DIS =0x00,
ND_RPL_DIO =0x01,
ND_RPL_DAO =0x02,
ND_RPL_DAO_ACK=0x03,
ND_RPL_SDIS =0x80,
ND_RPL_SDIO =0x81,
ND_RPL_SDAO =0x82,
ND_RPL_SDAO_ACK=0x83,
ND_RPL_SCC =0x8A,
};
enum ND_RPL_DIO_FLAGS {
@ -266,17 +236,25 @@ rpl_print(netdissect_options *ndo,
const u_char *bp, u_int length _U_)
{
struct nd_rpl_dio *dio = (struct nd_rpl_dio *)bp;
int secured = hdr->icmp6_code & 0x80;
int basecode= hdr->icmp6_code & 0x7f;
ND_TCHECK(dio->rpl_dagid);
switch(hdr->icmp6_code) {
case ND_RPL_DAG_IS:
ND_PRINT((ndo, ", DAG Information Solicitation"));
if(secured) {
ND_PRINT((ndo, ", (SEC)"));
} else {
ND_PRINT((ndo, ", (CLR)"));
}
switch(basecode) {
case ND_RPL_DIS:
ND_PRINT((ndo, "DODAG Information Solicitation"));
if(ndo->ndo_vflag) {
}
break;
case ND_RPL_DAG_IO:
ND_PRINT((ndo, ", DAG Information Object"));
case ND_RPL_DIO:
ND_PRINT((ndo, "DODAG Information Object"));
if(ndo->ndo_vflag) {
char dagid[65];
char *d = dagid;
@ -299,12 +277,17 @@ rpl_print(netdissect_options *ndo,
}
break;
case ND_RPL_DAO:
ND_PRINT((ndo, ", Destination Advertisement Object"));
ND_PRINT((ndo, "Destination Advertisement Object"));
if(ndo->ndo_vflag) {
}
break;
case ND_RPL_DAO_ACK:
ND_PRINT((ndo, "Destination Advertisement Object Ack"));
if(ndo->ndo_vflag) {
}
break;
default:
ND_PRINT((ndo, ", RPL message, unknown code %u",hdr->icmp6_code));
ND_PRINT((ndo, "RPL message, unknown code %u",hdr->icmp6_code));
break;
}
return;
@ -336,12 +319,15 @@ icmp6_print(netdissect_options *ndo,
TCHECK(dp->icmp6_cksum);
if (vflag && !fragmented) {
int sum = dp->icmp6_cksum;
u_int16_t sum, udp_sum;
if (TTEST2(bp[0], length)) {
udp_sum = EXTRACT_16BITS(&dp->icmp6_cksum);
sum = icmp6_cksum(ip, dp, length);
if (sum != 0)
(void)printf("[bad icmp6 cksum %x!] ", sum);
(void)printf("[bad icmp6 cksum 0x%04x -> 0x%04x!] ",
udp_sum,
in_cksum_shouldbe(udp_sum, sum));
else
(void)printf("[icmp6 sum ok] ");
}

View File

@ -259,6 +259,8 @@ print_igmpv3_query(register const u_char *bp, register u_int len)
void
igmp_print(register const u_char *bp, register u_int len)
{
struct cksum_vec vec[1];
if (qflag) {
(void)printf("igmp");
return;
@ -327,7 +329,9 @@ igmp_print(register const u_char *bp, register u_int len)
if (vflag && TTEST2(bp[0], len)) {
/* Check the IGMP checksum */
if (in_cksum((const u_short*)bp, len, 0))
vec[0].ptr = bp;
vec[0].len = len;
if (in_cksum(vec, 1))
printf(" bad igmp cksum %x!", EXTRACT_16BITS(&bp[2]));
}
return;

View File

@ -89,7 +89,7 @@ ip_printroute(register const u_char *cp, u_int length)
* This is used for UDP and TCP pseudo-header in the checksum
* calculation.
*/
u_int32_t
static u_int32_t
ip_finddst(const struct ip *ip)
{
int length;
@ -131,6 +131,39 @@ ip_finddst(const struct ip *ip)
return retval;
}
/*
* Compute a V4-style checksum by building a pseudoheader.
*/
int
nextproto4_cksum(const struct ip *ip, const u_int8_t *data,
u_int len, u_int next_proto)
{
struct phdr {
u_int32_t src;
u_int32_t dst;
u_char mbz;
u_char proto;
u_int16_t len;
} ph;
struct cksum_vec vec[2];
/* pseudo-header.. */
ph.len = htons((u_int16_t)len);
ph.mbz = 0;
ph.proto = next_proto;
memcpy(&ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t));
if (IP_HL(ip) == 5)
memcpy(&ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t));
else
ph.dst = ip_finddst(ip);
vec[0].ptr = (const u_int8_t *)(void *)&ph;
vec[0].len = sizeof(ph);
vec[1].ptr = data;
vec[1].len = len;
return (in_cksum(vec, 2));
}
static void
ip_printts(register const u_char *cp, u_int length)
{
@ -270,92 +303,6 @@ ip_optprint(register const u_char *cp, u_int length)
printf("[|ip]");
}
/*
* compute an IP header checksum.
* don't modifiy the packet.
*/
u_short
in_cksum(const u_short *addr, register u_int len, int csum)
{
int nleft = len;
const u_short *w = addr;
u_short answer;
int sum = csum;
/*
* Our algorithm is simple, using a 32 bit accumulator (sum),
* we add sequential 16 bit words to it, and at the end, fold
* back all the carry bits from the top 16 bits into the lower
* 16 bits.
*/
while (nleft > 1) {
sum += *w++;
nleft -= 2;
}
if (nleft == 1)
sum += htons(*(u_char *)w<<8);
/*
* add back carry outs from top 16 bits to low 16 bits
*/
sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
sum += (sum >> 16); /* add carry */
answer = ~sum; /* truncate to 16 bits */
return (answer);
}
/*
* Given the host-byte-order value of the checksum field in a packet
* header, and the network-byte-order computed checksum of the data
* that the checksum covers (including the checksum itself), compute
* what the checksum field *should* have been.
*/
u_int16_t
in_cksum_shouldbe(u_int16_t sum, u_int16_t computed_sum)
{
u_int32_t shouldbe;
/*
* The value that should have gone into the checksum field
* is the negative of the value gotten by summing up everything
* *but* the checksum field.
*
* We can compute that by subtracting the value of the checksum
* field from the sum of all the data in the packet, and then
* computing the negative of that value.
*
* "sum" is the value of the checksum field, and "computed_sum"
* is the negative of the sum of all the data in the packets,
* so that's -(-computed_sum - sum), or (sum + computed_sum).
*
* All the arithmetic in question is one's complement, so the
* addition must include an end-around carry; we do this by
* doing the arithmetic in 32 bits (with no sign-extension),
* and then adding the upper 16 bits of the sum, which contain
* the carry, to the lower 16 bits of the sum, and then do it
* again in case *that* sum produced a carry.
*
* As RFC 1071 notes, the checksum can be computed without
* byte-swapping the 16-bit words; summing 16-bit words
* on a big-endian machine gives a big-endian checksum, which
* can be directly stuffed into the big-endian checksum fields
* in protocol headers, and summing words on a little-endian
* machine gives a little-endian checksum, which must be
* byte-swapped before being stuffed into a big-endian checksum
* field.
*
* "computed_sum" is a network-byte-order value, so we must put
* it in host byte order before subtracting it from the
* host-byte-order value from the header; the adjusted checksum
* will be in host byte order, which is what we'll return.
*/
shouldbe = sum;
shouldbe += ntohs(computed_sum);
shouldbe = (shouldbe & 0xFFFF) + (shouldbe >> 16);
shouldbe = (shouldbe & 0xFFFF) + (shouldbe >> 16);
return shouldbe;
}
#define IP_RES 0x8000
static struct tok ip_frag_values[] = {
@ -378,6 +325,7 @@ ip_print_demux(netdissect_options *ndo,
struct ip_print_demux_state *ipds)
{
struct protoent *proto;
struct cksum_vec vec[1];
again:
switch (ipds->nh) {
@ -482,7 +430,7 @@ ip_print_demux(netdissect_options *ndo,
case IPPROTO_IPV4:
/* DVMRP multicast tunnel (ip-in-ip encapsulation) */
ip_print(gndo, ipds->cp, ipds->len);
ip_print(ndo, ipds->cp, ipds->len);
if (! vflag) {
ND_PRINT((ndo, " (ipip-proto-4)"));
return;
@ -492,7 +440,7 @@ ip_print_demux(netdissect_options *ndo,
#ifdef INET6
case IPPROTO_IPV6:
/* ip6-in-ip encapsulation */
ip6_print(ipds->cp, ipds->len);
ip6_print(ndo, ipds->cp, ipds->len);
break;
#endif /*INET6*/
@ -510,12 +458,25 @@ ip_print_demux(netdissect_options *ndo,
break;
case IPPROTO_PIM:
pim_print(ipds->cp, ipds->len,
in_cksum((const u_short*)ipds->cp, ipds->len, 0));
vec[0].ptr = ipds->cp;
vec[0].len = ipds->len;
pim_print(ipds->cp, ipds->len, in_cksum(vec, 1));
break;
case IPPROTO_VRRP:
if (packettype == PT_CARP) {
if (vflag)
(void)printf("carp %s > %s: ",
ipaddr_string(&ipds->ip->ip_src),
ipaddr_string(&ipds->ip->ip_dst));
carp_print(ipds->cp, ipds->len, ipds->ip->ip_ttl);
} else {
if (vflag)
(void)printf("vrrp %s > %s: ",
ipaddr_string(&ipds->ip->ip_src),
ipaddr_string(&ipds->ip->ip_dst));
vrrp_print(ipds->cp, ipds->len, ipds->ip->ip_ttl);
}
break;
case IPPROTO_PGM:
@ -563,6 +524,7 @@ ip_print(netdissect_options *ndo,
struct ip_print_demux_state *ipds=&ipd;
const u_char *ipend;
u_int hlen;
struct cksum_vec vec[1];
u_int16_t sum, ip_sum;
struct protoent *proto;
@ -575,7 +537,7 @@ ip_print(netdissect_options *ndo,
else if (!eflag)
printf("IP ");
if ((u_char *)(ipds->ip + 1) > snapend) {
if ((u_char *)(ipds->ip + 1) > ndo->ndo_snapend) {
printf("[|ip]");
return;
}
@ -613,8 +575,8 @@ ip_print(netdissect_options *ndo,
* Cut off the snapshot length to the end of the IP payload.
*/
ipend = bp + ipds->len;
if (ipend < snapend)
snapend = ipend;
if (ipend < ndo->ndo_snapend)
ndo->ndo_snapend = ipend;
ipds->len -= hlen;
@ -660,8 +622,10 @@ ip_print(netdissect_options *ndo,
printf(")");
}
if (!Kflag && (u_char *)ipds->ip + hlen <= snapend) {
sum = in_cksum((const u_short *)ipds->ip, hlen, 0);
if (!Kflag && (u_char *)ipds->ip + hlen <= ndo->ndo_snapend) {
vec[0].ptr = (const u_int8_t *)(void *)ipds->ip;
vec[0].len = hlen;
sum = in_cksum(vec, 1);
if (sum != 0) {
ip_sum = EXTRACT_16BITS(&ipds->ip->ip_sum);
(void)printf(", bad cksum %x (->%x)!", ip_sum,
@ -724,7 +688,7 @@ ipN_print(register const u_char *bp, register u_int length)
return;
#ifdef INET6
case 6:
ip6_print (bp, length);
ip6_print (gndo, bp, length);
return;
#endif
default:

View File

@ -50,32 +50,38 @@ static const char rcsid[] _U_ =
* Compute a V6-style checksum by building a pseudoheader.
*/
int
nextproto6_cksum(const struct ip6_hdr *ip6, const u_short *data,
nextproto6_cksum(const struct ip6_hdr *ip6, const u_int8_t *data,
u_int len, u_int next_proto)
{
size_t i;
u_int32_t sum = 0;
union ip6_pseudo_hdr phu;
struct {
struct in6_addr ph_src;
struct in6_addr ph_dst;
u_int32_t ph_len;
u_int8_t ph_zero[3];
u_int8_t ph_nxt;
} ph;
struct cksum_vec vec[2];
/* pseudo-header */
memset(&phu, 0, sizeof(phu));
phu.ph.ph_src = ip6->ip6_src;
phu.ph.ph_dst = ip6->ip6_dst;
phu.ph.ph_len = htonl(len);
phu.ph.ph_nxt = next_proto;
memset(&ph, 0, sizeof(ph));
ph.ph_src = ip6->ip6_src;
ph.ph_dst = ip6->ip6_dst;
ph.ph_len = htonl(len);
ph.ph_nxt = next_proto;
for (i = 0; i < sizeof(phu.pa) / sizeof(phu.pa[0]); i++) {
sum += phu.pa[i];
}
vec[0].ptr = (const u_int8_t *)(void *)&ph;
vec[0].len = sizeof(ph);
vec[1].ptr = data;
vec[1].len = len;
return in_cksum(data, len, sum);
return in_cksum(vec, 2);
}
/*
* print an IP6 datagram.
*/
void
ip6_print(register const u_char *bp, register u_int length)
ip6_print(netdissect_options *ndo, const u_char *bp, u_int length)
{
register const struct ip6_hdr *ip6;
register int advance;
@ -91,62 +97,62 @@ ip6_print(register const u_char *bp, register u_int length)
TCHECK(*ip6);
if (length < sizeof (struct ip6_hdr)) {
(void)printf("truncated-ip6 %u", length);
(void)ND_PRINT((ndo, "truncated-ip6 %u", length));
return;
}
if (!eflag)
printf("IP6 ");
if (!ndo->ndo_eflag)
ND_PRINT((ndo, "IP6 "));
payload_len = EXTRACT_16BITS(&ip6->ip6_plen);
len = payload_len + sizeof(struct ip6_hdr);
if (length < len)
(void)printf("truncated-ip6 - %u bytes missing!",
len - length);
(void)ND_PRINT((ndo, "truncated-ip6 - %u bytes missing!",
len - length));
if (vflag) {
if (ndo->ndo_vflag) {
flow = EXTRACT_32BITS(&ip6->ip6_flow);
printf("(");
ND_PRINT((ndo, "("));
#if 0
/* rfc1883 */
if (flow & 0x0f000000)
(void)printf("pri 0x%02x, ", (flow & 0x0f000000) >> 24);
(void)ND_PRINT((ndo, "pri 0x%02x, ", (flow & 0x0f000000) >> 24));
if (flow & 0x00ffffff)
(void)printf("flowlabel 0x%06x, ", flow & 0x00ffffff);
(void)ND_PRINT((ndo, "flowlabel 0x%06x, ", flow & 0x00ffffff));
#else
/* RFC 2460 */
if (flow & 0x0ff00000)
(void)printf("class 0x%02x, ", (flow & 0x0ff00000) >> 20);
(void)ND_PRINT((ndo, "class 0x%02x, ", (flow & 0x0ff00000) >> 20));
if (flow & 0x000fffff)
(void)printf("flowlabel 0x%05x, ", flow & 0x000fffff);
(void)ND_PRINT((ndo, "flowlabel 0x%05x, ", flow & 0x000fffff));
#endif
(void)printf("hlim %u, next-header %s (%u) payload length: %u) ",
(void)ND_PRINT((ndo, "hlim %u, next-header %s (%u) payload length: %u) ",
ip6->ip6_hlim,
tok2str(ipproto_values,"unknown",ip6->ip6_nxt),
ip6->ip6_nxt,
payload_len);
payload_len));
}
/*
* Cut off the snapshot length to the end of the IP payload.
*/
ipend = bp + len;
if (ipend < snapend)
snapend = ipend;
if (ipend < ndo->ndo_snapend)
ndo->ndo_snapend = ipend;
cp = (const u_char *)ip6;
advance = sizeof(struct ip6_hdr);
nh = ip6->ip6_nxt;
while (cp < snapend && advance > 0) {
while (cp < ndo->ndo_snapend && advance > 0) {
cp += advance;
len -= advance;
if (cp == (const u_char *)(ip6 + 1) &&
nh != IPPROTO_TCP && nh != IPPROTO_UDP &&
nh != IPPROTO_DCCP && nh != IPPROTO_SCTP) {
(void)printf("%s > %s: ", ip6addr_string(&ip6->ip6_src),
ip6addr_string(&ip6->ip6_dst));
(void)ND_PRINT((ndo, "%s > %s: ", ip6addr_string(&ip6->ip6_src),
ip6addr_string(&ip6->ip6_dst)));
}
switch (nh) {
@ -160,7 +166,7 @@ ip6_print(register const u_char *bp, register u_int length)
break;
case IPPROTO_FRAGMENT:
advance = frag6_print(cp, (const u_char *)ip6);
if (snapend <= cp + advance)
if (ndo->ndo_snapend <= cp + advance)
return;
nh = *cp;
fragmented = 1;
@ -198,7 +204,7 @@ ip6_print(register const u_char *bp, register u_int length)
udp_print(cp, len, (const u_char *)ip6, fragmented);
return;
case IPPROTO_ICMPV6:
icmp6_print(gndo, cp, len, (const u_char *)ip6, fragmented);
icmp6_print(ndo, cp, len, (const u_char *)ip6, fragmented);
return;
case IPPROTO_AH:
advance = ah_print(cp);
@ -207,7 +213,7 @@ ip6_print(register const u_char *bp, register u_int length)
case IPPROTO_ESP:
{
int enh, padlen;
advance = esp_print(gndo, cp, len, (const u_char *)ip6, &enh, &padlen);
advance = esp_print(ndo, cp, len, (const u_char *)ip6, &enh, &padlen);
nh = enh & 0xff;
len -= padlen;
break;
@ -221,7 +227,7 @@ ip6_print(register const u_char *bp, register u_int length)
}
case IPPROTO_PIM:
pim_print(cp, len, nextproto6_cksum(ip6, (u_short *)cp, len,
pim_print(cp, len, nextproto6_cksum(ip6, cp, len,
IPPROTO_PIM));
return;
@ -230,11 +236,11 @@ ip6_print(register const u_char *bp, register u_int length)
return;
case IPPROTO_IPV6:
ip6_print(cp, len);
ip6_print(ndo, cp, len);
return;
case IPPROTO_IPV4:
ip_print(gndo, cp, len);
ip_print(ndo, cp, len);
return;
case IPPROTO_PGM:
@ -250,18 +256,18 @@ ip6_print(register const u_char *bp, register u_int length)
return;
case IPPROTO_NONE:
(void)printf("no next header");
(void)ND_PRINT((ndo, "no next header"));
return;
default:
(void)printf("ip-proto-%d %d", nh, len);
(void)ND_PRINT((ndo, "ip-proto-%d %d", nh, len));
return;
}
}
return;
trunc:
(void)printf("[|ip6]");
(void)ND_PRINT((ndo, "[|ip6]"));
}
#endif /* INET6 */

View File

@ -69,7 +69,7 @@ ipnet_print(struct netdissect_options *ndo, const u_char *p, u_int length, u_int
#ifdef INET6
case IPH_AF_INET6:
ip6_print(p, length);
ip6_print(ndo, p, length);
break;
#endif /*INET6*/

View File

@ -198,7 +198,7 @@ ipx_rip_print(const u_short *ipx, u_int length)
(void)printf("ipx-rip-req");
if (length > 0) {
TCHECK(ipx[3]);
(void)printf(" %u/%d.%d", EXTRACT_32BITS(&ipx[0]),
(void)printf(" %08x/%d.%d", EXTRACT_32BITS(&ipx[0]),
EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3]));
}
break;
@ -206,7 +206,7 @@ ipx_rip_print(const u_short *ipx, u_int length)
(void)printf("ipx-rip-resp");
for (i = 0; i < 50 && length > 0; i++) {
TCHECK(ipx[3]);
(void)printf(" %u/%d.%d", EXTRACT_32BITS(&ipx[0]),
(void)printf(" %08x/%d.%d", EXTRACT_32BITS(&ipx[0]),
EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3]));
ipx += 4;

View File

@ -395,12 +395,14 @@ static struct tok isis_subtlv_link_attribute_values[] = {
};
#define ISIS_SUBTLV_AUTH_SIMPLE 1
#define ISIS_SUBTLV_AUTH_GENERIC 3 /* rfc 5310 */
#define ISIS_SUBTLV_AUTH_MD5 54
#define ISIS_SUBTLV_AUTH_MD5_LEN 16
#define ISIS_SUBTLV_AUTH_PRIVATE 255
static struct tok isis_subtlv_auth_values[] = {
{ ISIS_SUBTLV_AUTH_SIMPLE, "simple text password"},
{ ISIS_SUBTLV_AUTH_GENERIC, "Generic Crypto key-id"},
{ ISIS_SUBTLV_AUTH_MD5, "HMAC-MD5 password"},
{ ISIS_SUBTLV_AUTH_PRIVATE, "Routing Domain private password"},
{ 0, NULL }
@ -441,8 +443,8 @@ static struct tok clnp_flag_values[] = {
#define ISIS_MASK_MTFLAGS(x) ((x)&0xf000)
static struct tok isis_mt_flag_values[] = {
{ 0x4000, "sub-TLVs present"},
{ 0x8000, "ATT bit set"},
{ 0x4000, "ATT bit set"},
{ 0x8000, "Overload bit set"},
{ 0, NULL}
};
@ -618,10 +620,6 @@ struct isis_tlv_lsp {
void isoclns_print(const u_int8_t *p, u_int length, u_int caplen)
{
const struct isis_common_header *header;
header = (const struct isis_common_header *)p;
if (caplen <= 1) { /* enough bytes on the wire ? */
printf("|OSI");
return;
@ -664,7 +662,7 @@ void isoclns_print(const u_int8_t *p, u_int length, u_int caplen)
#ifdef INET6
case NLPID_IP6:
ip6_print(p+1, length-1);
ip6_print(gndo, p+1, length-1);
break;
#endif
@ -1179,15 +1177,15 @@ esis_print(const u_int8_t *pptr, u_int length)
}
/* now walk the options */
while (li >= 2) {
while (li != 0) {
u_int op, opli;
const u_int8_t *tptr;
TCHECK2(*pptr, 2);
if (li < 2) {
printf(", bad opts/li");
return;
}
TCHECK2(*pptr, 2);
op = *pptr++;
opli = *pptr++;
li -= 2;
@ -1206,8 +1204,11 @@ esis_print(const u_int8_t *pptr, u_int length)
switch (op) {
case ESIS_OPTION_ES_CONF_TIME:
if (opli == 2) {
TCHECK2(*pptr, 2);
printf("%us", EXTRACT_16BITS(tptr));
} else
printf("(bad length)");
break;
case ESIS_OPTION_PROTOCOLS:
@ -1779,7 +1780,7 @@ static int isis_print (const u_int8_t *p, u_int length)
u_int8_t pdu_type, max_area, id_length, tlv_type, tlv_len, tmp, alen, lan_alen, prefix_len;
u_int8_t ext_is_len, ext_ip_len, mt_len;
const u_int8_t *optr, *pptr, *tptr;
u_short packet_len,pdu_len;
u_short packet_len,pdu_len, key_id;
u_int i,vendor_id;
int sigcheck;
@ -2377,6 +2378,15 @@ static int isis_print (const u_int8_t *p, u_int length)
#endif
printf(" (%s)", tok2str(signature_check_values, "Unknown", sigcheck));
break;
case ISIS_SUBTLV_AUTH_GENERIC:
key_id = EXTRACT_16BITS((tptr+1));
printf("%u, password: ", key_id);
for(i=1 + sizeof(u_int16_t);i<tlv_len;i++) {
if (!TTEST2(*(tptr+i), 1))
goto trunctlv;
printf("%02x",*(tptr+i));
}
break;
case ISIS_SUBTLV_AUTH_PRIVATE:
default:

View File

@ -486,7 +486,7 @@ juniper_ggsn_print(const struct pcap_pkthdr *h, register const u_char *p)
break;
#ifdef INET6
case JUNIPER_PROTO_IPV6:
ip6_print(p, l2info.length);
ip6_print(gndo, p, l2info.length);
break;
#endif /* INET6 */
default:
@ -647,7 +647,7 @@ juniper_pppoe_print(const struct pcap_pkthdr *h, register const u_char *p)
p+=l2info.header_len;
/* this DLT contains nothing but raw ethernet frames */
ether_print(p, l2info.length, l2info.caplen, NULL, NULL);
ether_print(gndo, p, l2info.length, l2info.caplen, NULL, NULL);
return l2info.header_len;
}
#endif
@ -664,7 +664,7 @@ juniper_ether_print(const struct pcap_pkthdr *h, register const u_char *p)
p+=l2info.header_len;
/* this DLT contains nothing but raw Ethernet frames */
ether_print(p, l2info.length, l2info.caplen, NULL, NULL);
ether_print(gndo, p, l2info.length, l2info.caplen, NULL, NULL);
return l2info.header_len;
}
#endif
@ -736,7 +736,7 @@ juniper_pppoe_atm_print(const struct pcap_pkthdr *h, register const u_char *p)
extracted_ethertype = EXTRACT_16BITS(p);
/* this DLT contains nothing but raw PPPoE frames,
* prepended with a type field*/
if (ethertype_print(extracted_ethertype,
if (ethertype_print(gndo, extracted_ethertype,
p+ETHERTYPE_LEN,
l2info.length-ETHERTYPE_LEN,
l2info.caplen-ETHERTYPE_LEN) == 0)
@ -779,7 +779,7 @@ juniper_mlppp_print(const struct pcap_pkthdr *h, register const u_char *p)
return l2info.header_len;
#ifdef INET6
case JUNIPER_LSQ_L3_PROTO_IPV6:
ip6_print(p,l2info.length);
ip6_print(gndo, p,l2info.length);
return l2info.header_len;
#endif
case JUNIPER_LSQ_L3_PROTO_MPLS:
@ -834,7 +834,7 @@ juniper_mfr_print(const struct pcap_pkthdr *h, register const u_char *p)
return l2info.header_len;
#ifdef INET6
case JUNIPER_LSQ_L3_PROTO_IPV6:
ip6_print(p,l2info.length);
ip6_print(gndo, p,l2info.length);
return l2info.header_len;
#endif
case JUNIPER_LSQ_L3_PROTO_MPLS:
@ -987,7 +987,7 @@ juniper_atm2_print(const struct pcap_pkthdr *h, register const u_char *p)
if (l2info.direction != JUNIPER_BPF_PKT_IN && /* ether-over-1483 encaps ? */
(EXTRACT_32BITS(l2info.cookie) & ATM2_GAP_COUNT_MASK)) {
ether_print(p, l2info.length, l2info.caplen, NULL, NULL);
ether_print(gndo, p, l2info.length, l2info.caplen, NULL, NULL);
return l2info.header_len;
}
@ -1073,7 +1073,7 @@ ip_heuristic_guess(register const u_char *p, u_int length) {
case 0x6d:
case 0x6e:
case 0x6f:
ip6_print(p, length);
ip6_print(gndo, p, length);
break;
#endif
default:

View File

@ -61,9 +61,9 @@ static const struct tok lecop2str[] = {
};
static void
lane_hdr_print(const u_char *bp)
lane_hdr_print(netdissect_options *ndo, const u_char *bp)
{
(void)printf("lecid:%x ", EXTRACT_16BITS(bp));
(void)ND_PRINT((ndo, "lecid:%x ", EXTRACT_16BITS(bp)));
}
/*
@ -106,7 +106,7 @@ lane_print(const u_char *p, u_int length, u_int caplen)
* Now print the encapsulated frame, under the assumption
* that it's an Ethernet frame.
*/
ether_print(p, length, caplen, lane_hdr_print, p - 2);
ether_print(gndo, p, length, caplen, lane_hdr_print, p - 2);
}
u_int

View File

@ -419,7 +419,7 @@ snap_print(const u_char *p, u_int length, u_int caplen, u_int bridge_pad)
* Cisco hardware; the protocol ID is
* an Ethernet protocol type.
*/
ret = ethertype_print(et, p, length, caplen);
ret = ethertype_print(gndo, et, p, length, caplen);
if (ret)
return (ret);
break;
@ -434,7 +434,7 @@ snap_print(const u_char *p, u_int length, u_int caplen, u_int bridge_pad)
* but used 0x000000 and an Ethernet
* packet type for AARP packets.
*/
ret = ethertype_print(et, p, length, caplen);
ret = ethertype_print(gndo, et, p, length, caplen);
if (ret)
return (ret);
}
@ -481,7 +481,7 @@ snap_print(const u_char *p, u_int length, u_int caplen, u_int bridge_pad)
/*
* What remains is an Ethernet packet.
*/
ether_print(p, length, caplen, NULL, NULL);
ether_print(gndo, p, length, caplen, NULL, NULL);
return (1);
case PID_RFC2684_802_5_FCS:

View File

@ -12,10 +12,11 @@
* LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE.
*
* support for the IEEE Link Discovery Protocol as per 802.1ab
* support for the IEEE Link Discovery Protocol as per 802.1AB
*
* Original code by Hannes Gredler (hannes@juniper.net)
* IEEE and TIA extensions by Carles Kishimoto <carles.kishimoto@gmail.com>
* DCBX extensions by Kaladhar Musunuru <kaladharm@sourceforge.net>
*/
#ifndef lint
@ -541,6 +542,23 @@ static const struct tok lldp_aggregation_values[] = {
{ 0, NULL}
};
/*
* DCBX protocol subtypes.
*/
#define LLDP_DCBX_SUBTYPE_1 1
#define LLDP_DCBX_SUBTYPE_2 2
static const struct tok lldp_dcbx_subtype_values[] = {
{ LLDP_DCBX_SUBTYPE_1, "DCB Capability Exchange Protocol Rev 1" },
{ LLDP_DCBX_SUBTYPE_2, "DCB Capability Exchange Protocol Rev 1.01" },
{ 0, NULL}
};
#define LLDP_DCBX_CONTROL_TLV 1
#define LLDP_DCBX_PRIORITY_GROUPS_TLV 2
#define LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV 3
#define LLDP_DCBX_APPLICATION_TLV 4
/*
* Interface numbering subtypes.
*/
@ -556,13 +574,17 @@ static const struct tok lldp_intf_numb_subtype_values[] = {
#define LLDP_INTF_NUM_LEN 5
/*
* Print IEEE private extensions. (802.1 annex F)
* Print IEEE 802.1 private extensions. (802.1AB annex E)
*/
static int
lldp_private_8021_print(const u_char *tptr)
lldp_private_8021_print(const u_char *tptr, u_int tlv_len)
{
int subtype, hexdump = FALSE;
u_int sublen;
if (tlv_len < 4) {
return hexdump;
}
subtype = *(tptr+3);
printf("\n\t %s Subtype (%u)",
@ -571,24 +593,47 @@ lldp_private_8021_print(const u_char *tptr)
switch (subtype) {
case LLDP_PRIVATE_8021_SUBTYPE_PORT_VLAN_ID:
if (tlv_len < 6) {
return hexdump;
}
printf("\n\t port vlan id (PVID): %u",
EXTRACT_16BITS(tptr+4));
break;
case LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_VLAN_ID:
if (tlv_len < 7) {
return hexdump;
}
printf("\n\t port and protocol vlan id (PPVID): %u, flags [%s] (0x%02x)",
EXTRACT_16BITS(tptr+5),
bittok2str(lldp_8021_port_protocol_id_values, "none", *(tptr+4)),
*(tptr+4));
break;
case LLDP_PRIVATE_8021_SUBTYPE_VLAN_NAME:
if (tlv_len < 6) {
return hexdump;
}
printf("\n\t vlan id (VID): %u",
EXTRACT_16BITS(tptr+4));
if (tlv_len < 7) {
return hexdump;
}
sublen = *(tptr+6);
if (tlv_len < 7+sublen) {
return hexdump;
}
printf("\n\t vlan name: ");
safeputs((const char *)tptr+7, *(tptr+6));
safeputs((const char *)tptr+7, sublen);
break;
case LLDP_PRIVATE_8021_SUBTYPE_PROTOCOL_IDENTITY:
if (tlv_len < 5) {
return hexdump;
}
sublen = *(tptr+4);
if (tlv_len < 5+sublen) {
return hexdump;
}
printf("\n\t protocol identity: ");
safeputs((const char *)tptr+5, *(tptr+4));
safeputs((const char *)tptr+5, sublen);
break;
default:
@ -600,13 +645,16 @@ lldp_private_8021_print(const u_char *tptr)
}
/*
* Print IEEE private extensions. (802.3)
* Print IEEE 802.3 private extensions. (802.3bc)
*/
static int
lldp_private_8023_print(const u_char *tptr)
lldp_private_8023_print(const u_char *tptr, u_int tlv_len)
{
int subtype, hexdump = FALSE;
if (tlv_len < 4) {
return hexdump;
}
subtype = *(tptr+3);
printf("\n\t %s Subtype (%u)",
@ -615,6 +663,9 @@ lldp_private_8023_print(const u_char *tptr)
switch (subtype) {
case LLDP_PRIVATE_8023_SUBTYPE_MACPHY:
if (tlv_len < 9) {
return hexdump;
}
printf("\n\t autonegotiation [%s] (0x%02x)",
bittok2str(lldp_8023_autonegotiation_values, "none", *(tptr+4)),
*(tptr+4));
@ -627,6 +678,9 @@ lldp_private_8023_print(const u_char *tptr)
break;
case LLDP_PRIVATE_8023_SUBTYPE_MDIPOWER:
if (tlv_len < 7) {
return hexdump;
}
printf("\n\t MDI power support [%s], power pair %s, power class %s",
bittok2str(lldp_mdi_values, "none", *(tptr+4)),
tok2str(lldp_mdi_power_pairs_values, "unknown", *(tptr+5)),
@ -634,6 +688,9 @@ lldp_private_8023_print(const u_char *tptr)
break;
case LLDP_PRIVATE_8023_SUBTYPE_LINKAGGR:
if (tlv_len < 9) {
return hexdump;
}
printf("\n\t aggregation status [%s], aggregation port ID %u",
bittok2str(lldp_aggregation_values, "none", *(tptr+4)),
EXTRACT_32BITS(tptr+5));
@ -674,8 +731,12 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len)
int subtype, hexdump = FALSE;
u_int8_t location_format;
u_int16_t power_val;
u_int8_t lci_len, ca_type, ca_len;
u_int lci_len;
u_int8_t ca_type, ca_len;
if (tlv_len < 4) {
return hexdump;
}
subtype = *(tptr+3);
printf("\n\t %s Subtype (%u)",
@ -684,6 +745,9 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len)
switch (subtype) {
case LLDP_PRIVATE_TIA_SUBTYPE_CAPABILITIES:
if (tlv_len < 7) {
return hexdump;
}
printf("\n\t Media capabilities [%s] (0x%04x)",
bittok2str(lldp_tia_capabilities_values, "none",
EXTRACT_16BITS(tptr+4)), EXTRACT_16BITS(tptr+4));
@ -693,6 +757,9 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len)
break;
case LLDP_PRIVATE_TIA_SUBTYPE_NETWORK_POLICY:
if (tlv_len < 8) {
return hexdump;
}
printf("\n\t Application type [%s] (0x%02x)",
tok2str(lldp_tia_application_type_values, "none", *(tptr+4)),
*(tptr+4));
@ -707,6 +774,9 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len)
break;
case LLDP_PRIVATE_TIA_SUBTYPE_LOCAL_ID:
if (tlv_len < 5) {
return hexdump;
}
location_format = *(tptr+4);
printf("\n\t Location data format %s (0x%02x)",
tok2str(lldp_tia_location_data_format_values, "unknown", location_format),
@ -714,6 +784,9 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len)
switch (location_format) {
case LLDP_TIA_LOCATION_DATA_FORMAT_COORDINATE_BASED:
if (tlv_len < 21) {
return hexdump;
}
printf("\n\t Latitude resolution %u, latitude value %" PRIu64,
(*(tptr+5)>>2), lldp_extract_latlon(tptr+5));
printf("\n\t Longitude resolution %u, longitude value %" PRIu64,
@ -730,7 +803,16 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len)
break;
case LLDP_TIA_LOCATION_DATA_FORMAT_CIVIC_ADDRESS:
if (tlv_len < 6) {
return hexdump;
}
lci_len = *(tptr+5);
if (lci_len < 3) {
return hexdump;
}
if (tlv_len < 7+lci_len) {
return hexdump;
}
printf("\n\t LCI length %u, LCI what %s (0x%02x), Country-code ",
lci_len,
tok2str(lldp_tia_location_lci_what_values, "unknown", *(tptr+6)),
@ -744,6 +826,9 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len)
/* Decode each civic address element */
while (lci_len > 0) {
if (lci_len < 2) {
return hexdump;
}
ca_type = *(tptr);
ca_len = *(tptr+1);
@ -758,6 +843,9 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len)
if ( ca_type == 0 || ca_len == 0) {
return hexdump;
}
if (lci_len < ca_len) {
return hexdump;
}
safeputs((const char *)tptr, ca_len);
tptr += ca_len;
@ -777,6 +865,9 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len)
break;
case LLDP_PRIVATE_TIA_SUBTYPE_EXTENDED_POWER_MDI:
if (tlv_len < 7) {
return hexdump;
}
printf("\n\t Power type [%s]",
(*(tptr+4)&0xC0>>6) ? "PD device" : "PSE device");
printf(", Power source [%s]",
@ -812,24 +903,196 @@ lldp_private_tia_print(const u_char *tptr, u_int tlv_len)
return hexdump;
}
/*
* Print DCBX Protocol fields (V 1.01).
*/
static int
lldp_private_dcbx_print(const u_char *pptr, u_int len)
{
int subtype, hexdump = FALSE;
u_int8_t tval;
u_int16_t tlv;
u_int32_t i, pgval, uval;
u_int tlen, tlv_type, tlv_len;
const u_char *tptr, *mptr;
if (len < 4) {
return hexdump;
}
subtype = *(pptr+3);
printf("\n\t %s Subtype (%u)",
tok2str(lldp_dcbx_subtype_values, "unknown", subtype),
subtype);
/* by passing old version */
if (subtype == LLDP_DCBX_SUBTYPE_1)
return TRUE;
tptr = pptr + 4;
tlen = len - 4;
while (tlen >= sizeof(tlv)) {
TCHECK2(*tptr, sizeof(tlv));
tlv = EXTRACT_16BITS(tptr);
tlv_type = LLDP_EXTRACT_TYPE(tlv);
tlv_len = LLDP_EXTRACT_LEN(tlv);
hexdump = FALSE;
tlen -= sizeof(tlv);
tptr += sizeof(tlv);
/* loop check */
if (!tlv_type || !tlv_len) {
break;
}
TCHECK2(*tptr, tlv_len);
if (tlen < tlv_len) {
goto trunc;
}
/* decode every tlv */
switch (tlv_type) {
case LLDP_DCBX_CONTROL_TLV:
if (tlv_len < 10) {
goto trunc;
}
printf("\n\t Control - Protocol Control (type 0x%x, length %d)",
LLDP_DCBX_CONTROL_TLV, tlv_len);
printf("\n\t Oper_Version: %d", *tptr);
printf("\n\t Max_Version: %d", *(tptr+1));
printf("\n\t Sequence Number: %d", EXTRACT_32BITS(tptr+2));
printf("\n\t Acknowledgement Number: %d",
EXTRACT_32BITS(tptr+6));
break;
case LLDP_DCBX_PRIORITY_GROUPS_TLV:
if (tlv_len < 17) {
goto trunc;
}
printf("\n\t Feature - Priority Group (type 0x%x, length %d)",
LLDP_DCBX_PRIORITY_GROUPS_TLV, tlv_len);
printf("\n\t Oper_Version: %d", *tptr);
printf("\n\t Max_Version: %d", *(tptr+1));
printf("\n\t Info block(0x%02X): ", *(tptr+2));
tval = *(tptr+2);
printf("Enable bit: %d, Willing bit: %d, Error Bit: %d",
(tval & 0x80) ? 1 : 0, (tval & 0x40) ? 1 : 0,
(tval & 0x20) ? 1 : 0);
printf("\n\t SubType: %d", *(tptr+3));
printf("\n\t Priority Allocation");
pgval = EXTRACT_32BITS(tptr+4);
for (i = 0; i <= 7; i++) {
tval = *(tptr+4+(i/2));
printf("\n\t PgId_%d: %d",
i, (pgval >> (28-4*i)) & 0xF);
}
printf("\n\t Priority Group Allocation");
for (i = 0; i <= 7; i++)
printf("\n\t Pg percentage[%d]: %d", i, *(tptr+8+i));
printf("\n\t NumTCsSupported: %d", *(tptr+8+8));
break;
case LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV:
if (tlv_len < 6) {
goto trunc;
}
printf("\n\t Feature - Priority Flow Control");
printf(" (type 0x%x, length %d)",
LLDP_DCBX_PRIORITY_FLOW_CONTROL_TLV, tlv_len);
printf("\n\t Oper_Version: %d", *tptr);
printf("\n\t Max_Version: %d", *(tptr+1));
printf("\n\t Info block(0x%02X): ", *(tptr+2));
tval = *(tptr+2);
printf("Enable bit: %d, Willing bit: %d, Error Bit: %d",
(tval & 0x80) ? 1 : 0, (tval & 0x40) ? 1 : 0,
(tval & 0x20) ? 1 : 0);
printf("\n\t SubType: %d", *(tptr+3));
tval = *(tptr+4);
printf("\n\t PFC Config (0x%02X)", *(tptr+4));
for (i = 0; i <= 7; i++)
printf("\n\t Priority Bit %d: %s",
i, (tval & (1 << i)) ? "Enabled" : "Disabled");
printf("\n\t NumTCPFCSupported: %d", *(tptr+5));
break;
case LLDP_DCBX_APPLICATION_TLV:
if (tlv_len < 4) {
goto trunc;
}
printf("\n\t Feature - Application (type 0x%x, length %d)",
LLDP_DCBX_APPLICATION_TLV, tlv_len);
printf("\n\t Oper_Version: %d", *tptr);
printf("\n\t Max_Version: %d", *(tptr+1));
printf("\n\t Info block(0x%02X): ", *(tptr+2));
tval = *(tptr+2);
printf("Enable bit: %d, Willing bit: %d, Error Bit: %d",
(tval & 0x80) ? 1 : 0, (tval & 0x40) ? 1 : 0,
(tval & 0x20) ? 1 : 0);
printf("\n\t SubType: %d", *(tptr+3));
tval = tlv_len - 4;
mptr = tptr + 4;
while (tval >= 6) {
printf("\n\t Application Value");
printf("\n\t Application Protocol ID: 0x%04x",
EXTRACT_16BITS(mptr));
uval = EXTRACT_24BITS(mptr+2);
printf("\n\t SF (0x%x) Application Protocol ID is %s",
(uval >> 22),
(uval >> 22) ? "Socket Number" : "L2 EtherType");
printf("\n\t OUI: 0x%06x", uval & 0x3fffff);
printf("\n\t User Priority Map: 0x%02x", *(mptr+5));
tval = tval - 6;
mptr = mptr + 6;
}
break;
default:
hexdump = TRUE;
break;
}
/* do we also want to see a hex dump ? */
if (vflag > 1 || (vflag && hexdump)) {
print_unknown_data(tptr,"\n\t ", tlv_len);
}
tlen -= tlv_len;
tptr += tlv_len;
}
trunc:
return hexdump;
}
static char *
lldp_network_addr_print(const u_char *tptr) {
lldp_network_addr_print(const u_char *tptr, u_int len) {
u_int8_t af;
static char buf[BUFSIZE];
const char * (*pfunc)(const u_char *);
if (len < 1)
return NULL;
len--;
af = *tptr;
switch (af) {
case AFNUM_INET:
if (len < 4)
return NULL;
pfunc = getname;
break;
#ifdef INET6
case AFNUM_INET6:
if (len < 16)
return NULL;
pfunc = getname6;
break;
#endif
case AFNUM_802:
if (len < 6)
return NULL;
pfunc = etheraddr_string;
break;
default:
@ -854,10 +1117,14 @@ lldp_mgmt_addr_tlv_print(const u_char *pptr, u_int len) {
u_int8_t mgmt_addr_len, intf_num_subtype, oid_len;
const u_char *tptr;
u_int tlen;
char *mgmt_addr;
tlen = len;
tptr = pptr;
if (tlen < 1) {
return 0;
}
mgmt_addr_len = *tptr++;
tlen--;
@ -865,9 +1132,12 @@ lldp_mgmt_addr_tlv_print(const u_char *pptr, u_int len) {
return 0;
}
mgmt_addr = lldp_network_addr_print(tptr, mgmt_addr_len);
if (mgmt_addr == NULL) {
return 0;
}
printf("\n\t Management Address length %u, %s",
mgmt_addr_len,
lldp_network_addr_print(tptr));
mgmt_addr_len, mgmt_addr);
tptr += mgmt_addr_len;
tlen -= mgmt_addr_len;
@ -890,6 +1160,9 @@ lldp_mgmt_addr_tlv_print(const u_char *pptr, u_int len) {
if (tlen) {
oid_len = *tptr;
if (tlen < oid_len) {
return 0;
}
if (oid_len) {
printf("\n\t OID length %u", oid_len);
safeputs((const char *)tptr+1, oid_len);
@ -906,6 +1179,7 @@ lldp_print(register const u_char *pptr, register u_int len) {
u_int16_t tlv, cap, ena_cap;
u_int oui, tlen, hexdump, tlv_type, tlv_len;
const u_char *tptr;
char *network_addr;
tptr = pptr;
tlen = len;
@ -939,16 +1213,111 @@ lldp_print(register const u_char *pptr, register u_int len) {
}
TCHECK2(*tptr, tlv_len);
if (tlen < tlv_len) {
goto trunc;
}
switch (tlv_type) {
case LLDP_CHASSIS_ID_TLV:
if (vflag) {
if (tlv_len < 2) {
goto trunc;
}
subtype = *tptr;
printf("\n\t Subtype %s (%u): ",
tok2str(lldp_chassis_subtype_values, "Unknown", subtype),
subtype);
switch (subtype) {
case LLDP_CHASSIS_MAC_ADDR_SUBTYPE:
if (tlv_len < 1+6) {
goto trunc;
}
printf("%s", etheraddr_string(tptr+1));
break;
case LLDP_CHASSIS_INTF_NAME_SUBTYPE: /* fall through */
case LLDP_CHASSIS_LOCAL_SUBTYPE:
case LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE:
case LLDP_CHASSIS_INTF_ALIAS_SUBTYPE:
case LLDP_CHASSIS_PORT_COMP_SUBTYPE:
safeputs((const char *)tptr+1, tlv_len-1);
break;
case LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE:
network_addr = lldp_network_addr_print(tptr+1, tlv_len-1);
if (network_addr == NULL) {
goto trunc;
}
printf("%s", network_addr);
break;
default:
hexdump = TRUE;
break;
}
}
break;
case LLDP_PORT_ID_TLV:
if (vflag) {
if (tlv_len < 2) {
goto trunc;
}
subtype = *tptr;
printf("\n\t Subtype %s (%u): ",
tok2str(lldp_port_subtype_values, "Unknown", subtype),
subtype);
switch (subtype) {
case LLDP_PORT_MAC_ADDR_SUBTYPE:
if (tlv_len < 1+6) {
goto trunc;
}
printf("%s", etheraddr_string(tptr+1));
break;
case LLDP_PORT_INTF_NAME_SUBTYPE: /* fall through */
case LLDP_PORT_LOCAL_SUBTYPE:
case LLDP_PORT_AGENT_CIRC_ID_SUBTYPE:
case LLDP_PORT_INTF_ALIAS_SUBTYPE:
case LLDP_PORT_PORT_COMP_SUBTYPE:
safeputs((const char *)tptr+1, tlv_len-1);
break;
case LLDP_PORT_NETWORK_ADDR_SUBTYPE:
network_addr = lldp_network_addr_print(tptr+1, tlv_len-1);
if (network_addr == NULL) {
goto trunc;
}
printf("%s", network_addr);
break;
default:
hexdump = TRUE;
break;
}
}
break;
case LLDP_TTL_TLV:
if (vflag) {
if (tlv_len < 2) {
goto trunc;
}
printf(": TTL %us", EXTRACT_16BITS(tptr));
}
break;
case LLDP_SYSTEM_NAME_TLV:
case LLDP_PORT_DESCR_TLV:
if (vflag) {
printf(": ");
safeputs((const char *)tptr, tlv_len);
}
break;
case LLDP_SYSTEM_NAME_TLV:
/*
* The system name is also print in non-verbose mode
* similar to the CDP printer.
@ -963,13 +1332,6 @@ lldp_print(register const u_char *pptr, register u_int len) {
}
break;
case LLDP_PORT_DESCR_TLV:
if (vflag) {
printf(": ");
safeputs((const char *)tptr, tlv_len);
}
break;
case LLDP_SYSTEM_DESCR_TLV:
if (vflag) {
printf("\n\t ");
@ -977,93 +1339,17 @@ lldp_print(register const u_char *pptr, register u_int len) {
}
break;
case LLDP_CHASSIS_ID_TLV:
if (vflag) {
subtype = *tptr;
printf("\n\t Subtype %s (%u): ",
tok2str(lldp_chassis_subtype_values, "Unknown", subtype),
subtype);
switch (subtype) {
case LLDP_CHASSIS_MAC_ADDR_SUBTYPE:
printf("%s", etheraddr_string(tptr+1));
break;
case LLDP_CHASSIS_INTF_NAME_SUBTYPE: /* fall through */
case LLDP_CHASSIS_LOCAL_SUBTYPE:
case LLDP_CHASSIS_CHASSIS_COMP_SUBTYPE:
case LLDP_CHASSIS_INTF_ALIAS_SUBTYPE:
case LLDP_CHASSIS_PORT_COMP_SUBTYPE:
safeputs((const char *)tptr+1, tlv_len-1);
break;
case LLDP_CHASSIS_NETWORK_ADDR_SUBTYPE:
printf("%s", lldp_network_addr_print(tptr+1));
break;
default:
hexdump = TRUE;
break;
}
}
break;
case LLDP_PORT_ID_TLV:
if (vflag) {
subtype = *tptr;
printf("\n\t Subtype %s (%u): ",
tok2str(lldp_port_subtype_values, "Unknown", subtype),
subtype);
switch (subtype) {
case LLDP_PORT_MAC_ADDR_SUBTYPE:
printf("%s", etheraddr_string(tptr+1));
break;
case LLDP_PORT_INTF_NAME_SUBTYPE: /* fall through */
case LLDP_PORT_LOCAL_SUBTYPE:
case LLDP_PORT_AGENT_CIRC_ID_SUBTYPE:
case LLDP_PORT_INTF_ALIAS_SUBTYPE:
case LLDP_PORT_PORT_COMP_SUBTYPE:
safeputs((const char *)tptr+1, tlv_len-1);
break;
case LLDP_PORT_NETWORK_ADDR_SUBTYPE:
printf("%s", lldp_network_addr_print(tptr+1));
break;
default:
hexdump = TRUE;
break;
}
}
break;
case LLDP_PRIVATE_TLV:
if (vflag) {
oui = EXTRACT_24BITS(tptr);
printf(": OUI %s (0x%06x)", tok2str(oui_values, "Unknown", oui), oui);
switch (oui) {
case OUI_IEEE_8021_PRIVATE:
hexdump = lldp_private_8021_print(tptr);
break;
case OUI_IEEE_8023_PRIVATE:
hexdump = lldp_private_8023_print(tptr);
break;
case OUI_TIA:
hexdump = lldp_private_tia_print(tptr, tlv_len);
break;
default:
hexdump = TRUE;
break;
}
}
break;
case LLDP_SYSTEM_CAP_TLV:
if (vflag) {
/*
* XXX - IEEE Std 802.1AB-2009 says the first octet
* if a chassis ID subtype, with the system
* capabilities and enabled capabilities following
* it.
*/
if (tlv_len < 4) {
goto trunc;
}
cap = EXTRACT_16BITS(tptr);
ena_cap = EXTRACT_16BITS(tptr+2);
printf("\n\t System Capabilities [%s] (0x%04x)",
@ -1075,12 +1361,40 @@ lldp_print(register const u_char *pptr, register u_int len) {
case LLDP_MGMT_ADDR_TLV:
if (vflag) {
if (!lldp_mgmt_addr_tlv_print(tptr, tlen)) {
if (!lldp_mgmt_addr_tlv_print(tptr, tlv_len)) {
goto trunc;
}
}
break;
case LLDP_PRIVATE_TLV:
if (vflag) {
if (tlv_len < 3) {
goto trunc;
}
oui = EXTRACT_24BITS(tptr);
printf(": OUI %s (0x%06x)", tok2str(oui_values, "Unknown", oui), oui);
switch (oui) {
case OUI_IEEE_8021_PRIVATE:
hexdump = lldp_private_8021_print(tptr, tlv_len);
break;
case OUI_IEEE_8023_PRIVATE:
hexdump = lldp_private_8023_print(tptr, tlv_len);
break;
case OUI_TIA:
hexdump = lldp_private_tia_print(tptr, tlv_len);
break;
case OUI_DCBX:
hexdump = lldp_private_dcbx_print(tptr, tlv_len);
break;
default:
hexdump = TRUE;
break;
}
}
break;
default:
hexdump = TRUE;
break;

View File

@ -72,6 +72,7 @@ mobile_print(const u_char *bp, u_int length)
{
const u_char *cp = bp +8 ;
const struct mobile_ip *mob;
struct cksum_vec vec[1];
u_short proto,crc;
u_char osp =0; /* old source address present */
@ -101,7 +102,9 @@ mobile_print(const u_char *bp, u_int length)
(void)printf("> %s ",ipaddr_string(&mob->odst));
(void)printf("(oproto=%d)",proto>>8);
}
if (in_cksum((u_short *)mob, osp ? 12 : 8, 0)!=0) {
vec[0].ptr = (const u_int8_t *)(void *)mob;
vec[0].len = osp ? 12 : 8;
if (in_cksum(vec, 1)!=0) {
(void)printf(" (bad checksum %d)",crc);
}

View File

@ -54,6 +54,13 @@ static const char *mpls_labelname[] = {
/*15*/ "rsvd",
};
enum mpls_packet_type {
PT_UNKNOWN,
PT_IPV4,
PT_IPV6,
PT_OSI
};
/*
* RFC3032: MPLS label stack encoding
*/
@ -63,6 +70,7 @@ mpls_print(const u_char *bp, u_int length)
const u_char *p;
u_int32_t label_entry;
u_int16_t label_stack_depth = 0;
enum mpls_packet_type pt = PT_UNKNOWN;
p = bp;
printf("MPLS");
@ -70,7 +78,7 @@ mpls_print(const u_char *bp, u_int length)
TCHECK2(*p, sizeof(label_entry));
label_entry = EXTRACT_32BITS(p);
printf("%s(label %u",
label_stack_depth ? "\n\t" : " ",
(label_stack_depth && vflag) ? "\n\t" : " ",
MPLS_LABEL(label_entry));
label_stack_depth++;
if (vflag &&
@ -84,40 +92,48 @@ mpls_print(const u_char *bp, u_int length)
p += sizeof(label_entry);
} while (!MPLS_STACK(label_entry));
/*
* Try to figure out the packet type.
*/
switch (MPLS_LABEL(label_entry)) {
case 0: /* IPv4 explicit NULL label */
case 3: /* IPv4 implicit NULL label */
if (vflag>0) {
printf("\n\t");
ip_print(gndo, p, length - (p - bp));
}
else printf(", IP, length: %u",length);
pt = PT_IPV4;
break;
#ifdef INET6
case 2: /* IPv6 explicit NULL label */
if (vflag>0) {
printf("\n\t");
ip6_print(p, length - (p - bp));
}
else printf(", IPv6, length: %u",length);
pt = PT_IPV6;
break;
#endif
default:
/*
* Generally there's no indication of protocol in MPLS label
* encoding, however draft-hsmit-isis-aal5mux-00.txt describes
* a technique that looks at the first payload byte if the BOS (bottom of stack)
* bit is set and tries to determine the network layer protocol
* 0x45-0x4f is IPv4
* 0x60-0x6f is IPv6
* 0x81-0x83 is OSI (CLNP,ES-IS,IS-IS)
* this technique is sometimes known as NULL encapsulation
* and decoding is particularly useful for control-plane traffic [BGP]
* which cisco by default sends MPLS encapsulated
* encoding.
*
* However, draft-hsmit-isis-aal5mux-00.txt describes a
* technique for encapsulating IS-IS and IP traffic on the
* same ATM virtual circuit; you look at the first payload
* byte to determine the network layer protocol, based on
* the fact that
*
* 1) the first byte of an IP header is 0x45-0x4f
* for IPv4 and 0x60-0x6f for IPv6;
*
* 2) the first byte of an OSI CLNP packet is 0x81,
* the first byte of an OSI ES-IS packet is 0x82,
* and the first byte of an OSI IS-IS packet is
* 0x83;
*
* so the network layer protocol can be inferred from the
* first byte of the packet, if the protocol is one of the
* ones listed above.
*
* Cisco sends control-plane traffic MPLS-encapsulated in
* this fashion.
*/
if (MPLS_STACK(label_entry)) { /* only do this if the stack bit is set */
switch(*p) {
case 0x45:
case 0x46:
case 0x47:
@ -129,13 +145,9 @@ mpls_print(const u_char *bp, u_int length)
case 0x4d:
case 0x4e:
case 0x4f:
if (vflag>0) {
printf("\n\t");
ip_print(gndo, p, length - (p - bp));
}
else printf(", IP, length: %u",length);
pt = PT_IPV4;
break;
#ifdef INET6
case 0x60:
case 0x61:
case 0x62:
@ -152,29 +164,55 @@ mpls_print(const u_char *bp, u_int length)
case 0x6d:
case 0x6e:
case 0x6f:
if (vflag>0) {
printf("\n\t");
ip6_print(p, length - (p - bp));
}
else printf(", IPv6, length: %u",length);
pt = PT_IPV6;
break;
#endif
case 0x81:
case 0x82:
case 0x83:
if (vflag>0) {
printf("\n\t");
isoclns_print(p, length - (p - bp), length - (p - bp));
}
else printf(", OSI, length: %u",length);
pt = PT_OSI;
break;
default:
/* ok bail out - we did not figure out what it is*/
break;
}
}
/*
* Print the payload.
*/
if (pt == PT_UNKNOWN) {
if (!suppress_default_print)
default_print(p, length - (p - bp));
return;
}
if (vflag)
printf("\n\t");
else
printf(" ");
switch (pt) {
case PT_IPV4:
ip_print(gndo, p, length - (p - bp));
break;
case PT_IPV6:
#ifdef INET6
ip6_print(gndo, p, length - (p - bp));
#else
printf("IPv6, length: %u", length);
#endif
break;
case PT_OSI:
isoclns_print(p, length - (p - bp), length - (p - bp));
break;
default:
break;
}
return;
trunc:
printf("[|MPLS]");

View File

@ -127,7 +127,7 @@ null_if_print(const struct pcap_pkthdr *h, const u_char *p)
case BSD_AFNUM_INET6_BSD:
case BSD_AFNUM_INET6_FREEBSD:
case BSD_AFNUM_INET6_DARWIN:
ip6_print(p, length);
ip6_print(gndo, p, length);
break;
#endif

View File

@ -197,7 +197,7 @@ static int ospf_decode_v2(const struct ospfhdr *, const u_char *);
static int ospf_decode_lls(const struct ospfhdr *, register u_int);
int
ospf_print_grace_lsa (u_int8_t *tptr, u_int ls_length) {
ospf_print_grace_lsa (const u_int8_t *tptr, u_int ls_length) {
u_int tlv_type, tlv_length;
@ -279,7 +279,7 @@ ospf_print_grace_lsa (u_int8_t *tptr, u_int ls_length) {
}
int
ospf_print_te_lsa (u_int8_t *tptr, u_int ls_length) {
ospf_print_te_lsa (const u_int8_t *tptr, u_int ls_length) {
u_int tlv_type, tlv_length, subtlv_type, subtlv_length;
u_int priority_level, te_class, count_srlg;
@ -1028,7 +1028,7 @@ ospf_decode_v2(register const struct ospfhdr *op,
lsap = op->ospf_lsu.lsu_lsa;
TCHECK(op->ospf_lsu.lsu_count);
lsa_count_max = EXTRACT_32BITS(&op->ospf_lsu.lsu_count);
printf(", %d LSA%s",lsa_count_max, lsa_count_max > 1 ? "s" : "");
printf(", %d LSA%s",lsa_count_max, PLURAL_SUFFIX(lsa_count_max));
for (lsa_count=1;lsa_count <= lsa_count_max;lsa_count++) {
printf("\n\t LSA #%u",lsa_count);
lsap = (const struct lsa *)ospf_print_lsa(lsap);

View File

@ -162,7 +162,7 @@ pflog_if_print(const struct pcap_pkthdr *h, register const u_char *p)
#if OPENBSD_AF_INET6 != AF_INET6
case OPENBSD_AF_INET6: /* XXX: read pcap files */
#endif
ip6_print(p, length);
ip6_print(gndo, p, length);
break;
#endif

View File

@ -72,6 +72,12 @@ struct pgm_nak {
/* ... options */
};
struct pgm_ack {
u_int32_t pgma_rx_max_seq;
u_int32_t pgma_bitmap;
/* ... options */
};
struct pgm_poll {
u_int32_t pgmp_seq;
u_int16_t pgmp_round;
@ -134,6 +140,9 @@ typedef enum _pgm_type {
#define PGM_OPT_CR 0x10
#define PGM_OPT_CRQST 0x11
#define PGM_OPT_PGMCC_DATA 0x12
#define PGM_OPT_PGMCC_FEEDBACK 0x13
#define PGM_OPT_MASK 0x7f
#define PGM_OPT_END 0x80 /* end of options marker */
@ -446,6 +455,17 @@ pgm_print(register const u_char *bp, register u_int length,
break;
}
case PGM_ACK: {
struct pgm_ack *ack;
ack = (struct pgm_ack *)(pgm + 1);
TCHECK(*ack);
(void)printf("ACK seq %u",
EXTRACT_32BITS(&ack->pgma_rx_max_seq));
bp = (u_char *) (ack + 1);
break;
}
case PGM_SPMR:
(void)printf("SPMR");
break;
@ -736,6 +756,74 @@ pgm_print(register const u_char *bp, register u_int length,
opts_len -= 4;
break;
case PGM_OPT_PGMCC_DATA:
flags1 = *bp++;
flags2 = *bp++;
offset = EXTRACT_32BITS(bp);
bp += sizeof(u_int32_t);
switch (EXTRACT_16BITS(bp)) {
case AFI_IP:
addr_size = sizeof(struct in_addr);
nla_af = AF_INET;
break;
#ifdef INET6
case AFI_IP6:
addr_size = sizeof(struct in6_addr);
nla_af = AF_INET6;
break;
#endif
default:
goto trunc;
break;
}
bp += (2 * sizeof(u_int16_t));
if (opt_len != 12 + addr_size) {
(void)printf("[Bad OPT_PGMCC_DATA option, length %u != 12 + address size]", opt_len);
return;
}
TCHECK2(*bp, addr_size);
nla = bp;
bp += addr_size;
inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf));
(void)printf(" PGMCC DATA %u %s", offset, (char*)nla);
opts_len -= 16;
break;
case PGM_OPT_PGMCC_FEEDBACK:
flags1 = *bp++;
flags2 = *bp++;
offset = EXTRACT_32BITS(bp);
bp += sizeof(u_int32_t);
switch (EXTRACT_16BITS(bp)) {
case AFI_IP:
addr_size = sizeof(struct in_addr);
nla_af = AF_INET;
break;
#ifdef INET6
case AFI_IP6:
addr_size = sizeof(struct in6_addr);
nla_af = AF_INET6;
break;
#endif
default:
goto trunc;
break;
}
bp += (2 * sizeof(u_int16_t));
if (opt_len != 12 + addr_size) {
(void)printf("[Bad OPT_PGMCC_FEEDBACK option, length %u != 12 + address size]", opt_len);
return;
}
TCHECK2(*bp, addr_size);
nla = bp;
bp += addr_size;
inet_ntop(nla_af, nla, nla_buf, sizeof(nla_buf));
(void)printf(" PGMCC FEEDBACK %u %s", offset, (char*)nla);
opts_len -= 16;
break;
default:
(void)printf(" OPT_%02X [%d] ", opt_type, opt_len);
bp += opt_len;

View File

@ -31,7 +31,15 @@ static const char rcsid[] _U_ =
#endif
#include <tcpdump-stdinc.h>
#include <stdio.h>
#include <stdlib.h>
#include "interface.h"
#include "addrtoname.h"
#include "extract.h"
#include "ip.h"
#define PIMV2_TYPE_HELLO 0
#define PIMV2_TYPE_REGISTER 1
@ -110,16 +118,6 @@ struct pim {
u_short pim_cksum; /* IP style check sum */
};
#include <stdio.h>
#include <stdlib.h>
#include "interface.h"
#include "addrtoname.h"
#include "extract.h"
#include "ip.h"
static void pimv2_print(register const u_char *bp, register u_int len, u_int cksum);
static void
@ -401,8 +399,12 @@ cisco_autorp_print(register const u_char *bp, register u_int len)
TCHECK2(bp[0], 6);
(void)printf("%c%s%s/%d", s, bp[0] & 1 ? "!" : "",
ipaddr_string(&bp[2]), bp[1]);
if (bp[0] & 0xfe)
(void)printf("[rsvd=0x%02x]", bp[0] & 0xfe);
if (bp[0] & 0x02) {
(void)printf(" bidir");
}
if (bp[0] & 0xfc) {
(void)printf("[rsvd=0x%02x]", bp[0] & 0xfc);
}
s = ',';
bp += 6; len -= 6;
}
@ -770,7 +772,7 @@ pimv2_print(register const u_char *bp, register u_int len, u_int cksum)
break;
#ifdef INET6
case 6: /* IPv6 */
ip6_print(bp, len);
ip6_print(gndo, bp, len);
break;
#endif
default:

104
contrib/tcpdump/print-ppi.c Normal file
View File

@ -0,0 +1,104 @@
/*
* Oracle
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <tcpdump-stdinc.h>
#include <stdio.h>
#include <pcap.h>
#include "netdissect.h"
#include "interface.h"
#include "extract.h"
#include "ppi.h"
#ifdef DLT_PPI
static inline void
ppi_header_print(struct netdissect_options *ndo, const u_char *bp, u_int length)
{
const ppi_header_t *hdr;
u_int32_t dlt;
u_int16_t len;
hdr = (const ppi_header_t *)bp;
len = EXTRACT_16BITS(&hdr->ppi_len);
dlt = EXTRACT_32BITS(&hdr->ppi_dlt);
if (!ndo->ndo_qflag) {
ND_PRINT((ndo,", V.%d DLT %s (%d) len %d", hdr->ppi_ver,
pcap_datalink_val_to_name(dlt), dlt,
len));
} else {
ND_PRINT((ndo,", %s", pcap_datalink_val_to_name(dlt)));
}
ND_PRINT((ndo, ", length %u: ", length));
}
static void
ppi_print(struct netdissect_options *ndo,
const struct pcap_pkthdr *h, const u_char *p)
{
if_ndo_printer ndo_printer;
if_printer printer;
ppi_header_t *hdr;
u_int caplen = h->caplen;
u_int length = h->len;
u_int32_t dlt;
if (caplen < sizeof(ppi_header_t)) {
ND_PRINT((ndo, "[|ppi]"));
return;
}
hdr = (ppi_header_t *)p;
dlt = EXTRACT_32BITS(&hdr->ppi_dlt);
if (ndo->ndo_eflag)
ppi_header_print(ndo, p, length);
length -= sizeof(ppi_header_t);
caplen -= sizeof(ppi_header_t);
p += sizeof(ppi_header_t);
if ((printer = lookup_printer(dlt)) != NULL) {
printer(h, p);
} else if ((ndo_printer = lookup_ndo_printer(dlt)) != NULL) {
ndo_printer(ndo, h, p);
} else {
if (!ndo->ndo_eflag)
ppi_header_print(ndo, (u_char *)hdr,
length + sizeof(ppi_header_t));
if (!ndo->ndo_suppress_default_print)
ndo->ndo_default_print(ndo, p, caplen);
}
}
/*
* This is the top level routine of the printer. 'p' points
* to the ether header of the packet, 'h->ts' is the timestamp,
* 'h->len' is the length of the packet off the wire, and 'h->caplen'
* is the number of bytes actually captured.
*/
u_int
ppi_if_print(struct netdissect_options *ndo,
const struct pcap_pkthdr *h, const u_char *p)
{
ppi_print(ndo, h, p);
return (sizeof(ppi_header_t));
}
/*
* Local Variables:
* c-style: whitesmith
* c-basic-offset: 8
* End:
*/
#endif /* DLT_PPI */

View File

@ -1305,7 +1305,7 @@ ppp_hdlc(const u_char *p, int length)
goto cleanup;
#ifdef INET6
case PPP_IPV6:
ip6_print(b+1, t - b - 1);
ip6_print(gndo, b+1, t - b - 1);
goto cleanup;
#endif
default: /* no luck - try next guess */
@ -1370,7 +1370,7 @@ handle_ppp(u_int proto, const u_char *p, int length)
#ifdef INET6
case ETHERTYPE_IPV6: /*XXX*/
case PPP_IPV6:
ip6_print(p, length);
ip6_print(gndo, p, length);
break;
#endif
case ETHERTYPE_IPX: /*XXX*/
@ -1677,11 +1677,11 @@ ppp_bsdos_if_print(const struct pcap_pkthdr *h _U_, register const u_char *p _U_
p += hdrlength;
switch (ptype) {
case PPP_IP:
ip_print(p, length);
ip_print(gndo, p, length);
break;
#ifdef INET6
case PPP_IPV6:
ip6_print(p, length);
ip6_print(gndo, p, length);
break;
#endif
case PPP_MPLS_UCAST:
@ -1696,11 +1696,11 @@ ppp_bsdos_if_print(const struct pcap_pkthdr *h _U_, register const u_char *p _U_
p += hdrlength;
switch (ptype) {
case PPP_IP:
ip_print(p, length);
ip_print(gndo, p, length);
break;
#ifdef INET6
case PPP_IPV6:
ip6_print(p, length);
ip6_print(gndo, p, length);
break;
#endif
case PPP_MPLS_UCAST:
@ -1732,12 +1732,12 @@ ppp_bsdos_if_print(const struct pcap_pkthdr *h _U_, register const u_char *p _U_
break;
#ifdef INET6
case PPP_IPV6:
ip6_print(p, length);
ip6_print(gndo, p, length);
break;
#endif
case PPP_MPLS_UCAST:
case PPP_MPLS_MCAST:
mpls_print(p, length);
mpls_print(gndo, p, length);
break;
default:
printf("%s ", tok2str(ppptype2str, "unknown PPP protocol (0x%04x)", ptype));

View File

@ -0,0 +1,368 @@
/*
* Copyright (c) 1998-2011 The TCPDUMP project
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that: (1) source code
* distributions retain the above copyright notice and this paragraph
* in its entirety, and (2) distributions including binary code include
* the above copyright notice and this paragraph in its entirety in
* the documentation or other materials provided with the distribution.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND
* WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
* LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE.
*
* support for the The RPKI/Router Protocol Protocol as per draft-ietf-sidr-rpki-rtr-12
*
* Original code by Hannes Gredler (hannes@juniper.net)
*/
#ifndef lint
static const char rcsid[] _U_ =
"@(#) $Header: /tcpdump/master/tcpdump/print-rpki_rtr.c,v 1.10 2008-03-20 09:30:56 hannes Exp $";
#endif
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <tcpdump-stdinc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "interface.h"
#include "extract.h"
#include "addrtoname.h"
/*
* RPKI/Router PDU header
*
* Here's what the PDU header looks like.
* The length does include the version and length fields.
*/
typedef struct rpki_rtr_pdu_ {
u_char version; /* Version number */
u_char pdu_type; /* PDU type */
union {
u_char cache_nonce[2]; /* Cache Nonce */
u_char error_code[2]; /* Error code */
} u;
u_char length[4];
} rpki_rtr_pdu;
#define RPKI_RTR_PDU_OVERHEAD (offsetof(rpki_rtr_pdu, rpki_rtr_pdu_msg))
/*
* IPv4 Prefix PDU.
*/
typedef struct rpki_rtr_pdu_ipv4_prefix_ {
rpki_rtr_pdu pdu_header;
u_char flags;
u_char prefix_length;
u_char max_length;
u_char zero;
u_char prefix[4];
u_char as[4];
} rpki_rtr_pdu_ipv4_prefix;
/*
* IPv6 Prefix PDU.
*/
typedef struct rpki_rtr_pdu_ipv6_prefix_ {
rpki_rtr_pdu pdu_header;
u_char flags;
u_char prefix_length;
u_char max_length;
u_char zero;
u_char prefix[16];
u_char as[4];
} rpki_rtr_pdu_ipv6_prefix;
/*
* Error report PDU.
*/
typedef struct rpki_rtr_pdu_error_report_ {
rpki_rtr_pdu pdu_header;
u_char encapsulated_pdu_length[4]; /* Encapsulated PDU length */
} rpki_rtr_pdu_error_report;
/*
* PDU type codes
*/
#define RPKI_RTR_SERIAL_NOTIFY_PDU 0
#define RPKI_RTR_SERIAL_QUERY_PDU 1
#define RPKI_RTR_RESET_QUERY_PDU 2
#define RPKI_RTR_CACHE_RESPONSE_PDU 3
#define RPKI_RTR_IPV4_PREFIX_PDU 4
#define RPKI_RTR_IPV6_PREFIX_PDU 6
#define RPKI_RTR_END_OF_DATA_PDU 7
#define RPKI_RTR_CACHE_RESET_PDU 8
#define RPKI_RTR_ERROR_REPORT_PDU 10
static const struct tok rpki_rtr_pdu_values[] = {
{ RPKI_RTR_SERIAL_NOTIFY_PDU, "Serial Notify" },
{ RPKI_RTR_SERIAL_QUERY_PDU, "Serial Query" },
{ RPKI_RTR_RESET_QUERY_PDU, "Reset Query" },
{ RPKI_RTR_CACHE_RESPONSE_PDU, "Cache Response" },
{ RPKI_RTR_IPV4_PREFIX_PDU, "IPV4 Prefix" },
{ RPKI_RTR_IPV6_PREFIX_PDU, "IPV6 Prefix" },
{ RPKI_RTR_END_OF_DATA_PDU, "End of Data" },
{ RPKI_RTR_CACHE_RESET_PDU, "Cache Reset" },
{ RPKI_RTR_ERROR_REPORT_PDU, "Error Report" },
{ 0, NULL}
};
static const struct tok rpki_rtr_error_codes[] = {
{ 0, "Corrupt Data" },
{ 1, "Internal Error" },
{ 2, "No Data Available" },
{ 3, "Invalid Request" },
{ 4, "Unsupported Protocol Version" },
{ 5, "Unsupported PDU Type" },
{ 6, "Withdrawal of Unknown Record" },
{ 7, "Duplicate Announcement Received" },
{ 0, NULL}
};
/*
* Build a identation string for a given identation level.
* XXX this should be really in util.c
*/
static char *
indent_string (u_int indent)
{
static char buf[20];
u_int idx;
idx = 0;
buf[idx] = '\0';
/*
* Does the static buffer fit ?
*/
if (sizeof(buf) < ((indent/8) + (indent %8) + 2)) {
return buf;
}
/*
* Heading newline.
*/
buf[idx] = '\n';
idx++;
while (indent >= 8) {
buf[idx] = '\t';
idx++;
indent -= 8;
}
while (indent > 0) {
buf[idx] = ' ';
idx++;
indent--;
}
/*
* Trailing zero.
*/
buf[idx] = '\0';
return buf;
}
/*
* Print a single PDU.
*/
static void
rpki_rtr_pdu_print (const u_char *tptr, u_int indent)
{
const rpki_rtr_pdu *pdu_header;
u_int pdu_type, pdu_len, hexdump;
const u_char *msg;
pdu_header = (rpki_rtr_pdu *)tptr;
pdu_type = pdu_header->pdu_type;
pdu_len = EXTRACT_32BITS(pdu_header->length);
hexdump = FALSE;
printf("%sRPKI-RTRv%u, %s PDU (%u), length: %u",
indent_string(8),
pdu_header->version,
tok2str(rpki_rtr_pdu_values, "Unknown", pdu_type),
pdu_type, pdu_len);
switch (pdu_type) {
/*
* The following PDUs share the message format.
*/
case RPKI_RTR_SERIAL_NOTIFY_PDU:
case RPKI_RTR_SERIAL_QUERY_PDU:
case RPKI_RTR_END_OF_DATA_PDU:
msg = (const u_char *)(pdu_header + 1);
printf("%sCache-Nonce: 0x%04x, Serial: %u",
indent_string(indent+2),
EXTRACT_16BITS(pdu_header->u.cache_nonce),
EXTRACT_32BITS(msg));
break;
/*
* The following PDUs share the message format.
*/
case RPKI_RTR_RESET_QUERY_PDU:
case RPKI_RTR_CACHE_RESET_PDU:
/*
* Zero payload PDUs.
*/
break;
case RPKI_RTR_CACHE_RESPONSE_PDU:
printf("%sCache-Nonce: 0x%04x",
indent_string(indent+2),
EXTRACT_16BITS(pdu_header->u.cache_nonce));
break;
case RPKI_RTR_IPV4_PREFIX_PDU:
{
rpki_rtr_pdu_ipv4_prefix *pdu;
pdu = (rpki_rtr_pdu_ipv4_prefix *)tptr;
printf("%sIPv4 Prefix %s/%u-%u, origin-as %u, flags 0x%02x",
indent_string(indent+2),
ipaddr_string(pdu->prefix),
pdu->prefix_length, pdu->max_length,
EXTRACT_32BITS(pdu->as), pdu->flags);
}
break;
#ifdef INET6
case RPKI_RTR_IPV6_PREFIX_PDU:
{
rpki_rtr_pdu_ipv6_prefix *pdu;
pdu = (rpki_rtr_pdu_ipv6_prefix *)tptr;
printf("%sIPv6 Prefix %s/%u-%u, origin-as %u, flags 0x%02x",
indent_string(indent+2),
ip6addr_string(pdu->prefix),
pdu->prefix_length, pdu->max_length,
EXTRACT_32BITS(pdu->as), pdu->flags);
}
break;
#endif
case RPKI_RTR_ERROR_REPORT_PDU:
{
rpki_rtr_pdu_error_report *pdu;
u_int encapsulated_pdu_length, text_length, tlen, error_code;
u_char buf[80];
pdu = (rpki_rtr_pdu_error_report *)tptr;
encapsulated_pdu_length = EXTRACT_32BITS(pdu->encapsulated_pdu_length);
tlen = pdu_len;
error_code = EXTRACT_16BITS(pdu->pdu_header.u.error_code);
printf("%sError code: %s (%u), Encapsulated PDU length: %u",
indent_string(indent+2),
tok2str(rpki_rtr_error_codes, "Unknown", error_code),
error_code, encapsulated_pdu_length);
tptr += sizeof(*pdu);
tlen -= sizeof(*pdu);
/*
* Recurse if there is an encapsulated PDU.
*/
if (encapsulated_pdu_length &&
(encapsulated_pdu_length <= tlen)) {
printf("%s-----encapsulated PDU-----", indent_string(indent+4));
rpki_rtr_pdu_print(tptr, indent+2);
}
tptr += encapsulated_pdu_length;
tlen -= encapsulated_pdu_length;
/*
* Extract, trail-zero and print the Error message.
*/
text_length = 0;
if (tlen > 4) {
text_length = EXTRACT_32BITS(tptr);
tptr += 4;
tlen -= 4;
}
if (text_length && (text_length <= tlen )) {
memcpy(buf, tptr, MIN(sizeof(buf)-1, text_length));
buf[text_length] = '\0';
printf("%sError text: %s", indent_string(indent+2), buf);
}
}
break;
default:
/*
* Unknown data, please hexdump.
*/
hexdump = TRUE;
}
/* do we also want to see a hex dump ? */
if (vflag > 1 || (vflag && hexdump)) {
print_unknown_data(tptr,"\n\t ", pdu_len);
}
}
void
rpki_rtr_print(register const u_char *pptr, register u_int len) {
u_int tlen, pdu_type, pdu_len;
const u_char *tptr;
const rpki_rtr_pdu *pdu_header;
tptr = pptr;
tlen = len;
if (!vflag) {
printf(", RPKI-RTR");
return;
}
while (tlen >= sizeof(rpki_rtr_pdu)) {
TCHECK2(*tptr, sizeof(rpki_rtr_pdu));
pdu_header = (rpki_rtr_pdu *)tptr;
pdu_type = pdu_header->pdu_type;
pdu_len = EXTRACT_32BITS(pdu_header->length);
/* infinite loop check */
if (!pdu_type || !pdu_len) {
break;
}
TCHECK2(*tptr, pdu_len);
if (tlen < pdu_len) {
goto trunc;
}
/*
* Print the PDU.
*/
rpki_rtr_pdu_print(tptr, 8);
tlen -= pdu_len;
tptr += pdu_len;
}
return;
trunc:
printf("\n\t[|RPKI-RTR]");
}
/*
* Local Variables:
* c-style: whitesmith
* c-basic-offset: 4
* End:
*/

View File

@ -111,8 +111,8 @@ rrcp_print(netdissect_options *ndo,
if (rrcp_opcode==1 || rrcp_opcode==2){
ND_TCHECK2(*(rrcp + RRCP_REG_ADDR_OFFSET), 6);
ND_PRINT((ndo, " addr=0x%04x, data=0x%08x",
EXTRACT_16BITS(rrcp + RRCP_REG_ADDR_OFFSET),
EXTRACT_32BITS(rrcp + RRCP_REG_DATA_OFFSET)));
EXTRACT_LE_16BITS(rrcp + RRCP_REG_ADDR_OFFSET),
EXTRACT_LE_32BITS(rrcp + RRCP_REG_DATA_OFFSET)));
}
if (rrcp_proto==1){
ND_TCHECK2(*(rrcp + RRCP_AUTHKEY_OFFSET), 2);

View File

@ -59,9 +59,9 @@ static const char rcsid[] _U_ =
#include "ip6.h"
#endif
#define CHAN_HP 6700
#define CHAN_MP 6701
#define CHAN_LP 6702
#define CHAN_HP 6704
#define CHAN_MP 6705
#define CHAN_LP 6706
struct tok ForCES_channels[] = {
{ CHAN_HP, "ForCES HP" },

View File

@ -15,6 +15,8 @@
* The SFLOW protocol as per http://www.sflow.org/developers/specifications.php
*
* Original code by Carles Kishimoto <carles.kishimoto@gmail.com>
*
* Expansion and refactoring by Rick Jones <rick.jones2@hp.com>
*/
#ifndef lint
@ -87,6 +89,18 @@ static const struct tok sflow_format_values[] = {
{ 0, NULL}
};
struct sflow_flow_sample_t {
u_int8_t seqnum[4];
u_int8_t typesource[4];
u_int8_t rate[4];
u_int8_t pool[4];
u_int8_t drops[4];
u_int8_t in_interface[4];
u_int8_t out_interface[4];
u_int8_t records[4];
};
struct sflow_expanded_flow_sample_t {
u_int8_t seqnum[4];
u_int8_t type[4];
@ -156,6 +170,36 @@ struct sflow_expanded_flow_raw_t {
u_int8_t header_size[4];
};
struct sflow_ethernet_frame_t {
u_int8_t length[4];
u_int8_t src_mac[8];
u_int8_t dst_mac[8];
u_int8_t type[4];
};
struct sflow_extended_switch_data_t {
u_int8_t src_vlan[4];
u_int8_t src_pri[4];
u_int8_t dst_vlan[4];
u_int8_t dst_pri[4];
};
struct sflow_counter_record_t {
u_int8_t format[4];
u_int8_t length[4];
};
struct sflow_flow_record_t {
u_int8_t format[4];
u_int8_t length[4];
};
struct sflow_counter_sample_t {
u_int8_t seqnum[4];
u_int8_t typesource[4];
u_int8_t records[4];
};
struct sflow_expanded_counter_sample_t {
u_int8_t seqnum[4];
u_int8_t type[4];
@ -259,22 +303,523 @@ struct sflow_vlan_counter_t {
u_int8_t discards[4];
};
static int
print_sflow_counter_generic(const u_char *pointer, u_int len) {
const struct sflow_generic_counter_t *sflow_gen_counter;
if (len < sizeof(struct sflow_generic_counter_t))
return 1;
sflow_gen_counter = (const struct sflow_generic_counter_t *)pointer;
printf("\n\t ifindex %u, iftype %u, ifspeed %" PRIu64 ", ifdirection %u (%s)",
EXTRACT_32BITS(sflow_gen_counter->ifindex),
EXTRACT_32BITS(sflow_gen_counter->iftype),
EXTRACT_64BITS(sflow_gen_counter->ifspeed),
EXTRACT_32BITS(sflow_gen_counter->ifdirection),
tok2str(sflow_iface_direction_values, "Unknown",
EXTRACT_32BITS(sflow_gen_counter->ifdirection)));
printf("\n\t ifstatus %u, adminstatus: %s, operstatus: %s",
EXTRACT_32BITS(sflow_gen_counter->ifstatus),
EXTRACT_32BITS(sflow_gen_counter->ifstatus)&1 ? "up" : "down",
(EXTRACT_32BITS(sflow_gen_counter->ifstatus)>>1)&1 ? "up" : "down");
printf("\n\t In octets %" PRIu64
", unicast pkts %u, multicast pkts %u, broadcast pkts %u, discards %u",
EXTRACT_64BITS(sflow_gen_counter->ifinoctets),
EXTRACT_32BITS(sflow_gen_counter->ifinunicastpkts),
EXTRACT_32BITS(sflow_gen_counter->ifinmulticastpkts),
EXTRACT_32BITS(sflow_gen_counter->ifinbroadcastpkts),
EXTRACT_32BITS(sflow_gen_counter->ifindiscards));
printf("\n\t In errors %u, unknown protos %u",
EXTRACT_32BITS(sflow_gen_counter->ifinerrors),
EXTRACT_32BITS(sflow_gen_counter->ifinunkownprotos));
printf("\n\t Out octets %" PRIu64
", unicast pkts %u, multicast pkts %u, broadcast pkts %u, discards %u",
EXTRACT_64BITS(sflow_gen_counter->ifoutoctets),
EXTRACT_32BITS(sflow_gen_counter->ifoutunicastpkts),
EXTRACT_32BITS(sflow_gen_counter->ifoutmulticastpkts),
EXTRACT_32BITS(sflow_gen_counter->ifoutbroadcastpkts),
EXTRACT_32BITS(sflow_gen_counter->ifoutdiscards));
printf("\n\t Out errors %u, promisc mode %u",
EXTRACT_32BITS(sflow_gen_counter->ifouterrors),
EXTRACT_32BITS(sflow_gen_counter->ifpromiscmode));
return 0;
}
static int
print_sflow_counter_ethernet(const u_char *pointer, u_int len){
const struct sflow_ethernet_counter_t *sflow_eth_counter;
if (len < sizeof(struct sflow_ethernet_counter_t))
return 1;
sflow_eth_counter = (const struct sflow_ethernet_counter_t *)pointer;
printf("\n\t align errors %u, fcs errors %u, single collision %u, multiple collision %u, test error %u",
EXTRACT_32BITS(sflow_eth_counter->alignerrors),
EXTRACT_32BITS(sflow_eth_counter->fcserrors),
EXTRACT_32BITS(sflow_eth_counter->single_collision_frames),
EXTRACT_32BITS(sflow_eth_counter->multiple_collision_frames),
EXTRACT_32BITS(sflow_eth_counter->test_errors));
printf("\n\t deferred %u, late collision %u, excessive collision %u, mac trans error %u",
EXTRACT_32BITS(sflow_eth_counter->deferred_transmissions),
EXTRACT_32BITS(sflow_eth_counter->late_collisions),
EXTRACT_32BITS(sflow_eth_counter->excessive_collisions),
EXTRACT_32BITS(sflow_eth_counter->mac_transmit_errors));
printf("\n\t carrier error %u, frames too long %u, mac receive errors %u, symbol errors %u",
EXTRACT_32BITS(sflow_eth_counter->carrier_sense_errors),
EXTRACT_32BITS(sflow_eth_counter->frame_too_longs),
EXTRACT_32BITS(sflow_eth_counter->mac_receive_errors),
EXTRACT_32BITS(sflow_eth_counter->symbol_errors));
return 0;
}
static int
print_sflow_counter_token_ring(const u_char *pointer _U_, u_int len _U_) {
return 0;
}
static int
print_sflow_counter_basevg(const u_char *pointer, u_int len) {
const struct sflow_100basevg_counter_t *sflow_100basevg_counter;
if (len < sizeof(struct sflow_100basevg_counter_t))
return 1;
sflow_100basevg_counter = (const struct sflow_100basevg_counter_t *)pointer;
printf("\n\t in high prio frames %u, in high prio octets %" PRIu64,
EXTRACT_32BITS(sflow_100basevg_counter->in_highpriority_frames),
EXTRACT_64BITS(sflow_100basevg_counter->in_highpriority_octets));
printf("\n\t in norm prio frames %u, in norm prio octets %" PRIu64,
EXTRACT_32BITS(sflow_100basevg_counter->in_normpriority_frames),
EXTRACT_64BITS(sflow_100basevg_counter->in_normpriority_octets));
printf("\n\t in ipm errors %u, oversized %u, in data errors %u, null addressed frames %u",
EXTRACT_32BITS(sflow_100basevg_counter->in_ipmerrors),
EXTRACT_32BITS(sflow_100basevg_counter->in_oversized),
EXTRACT_32BITS(sflow_100basevg_counter->in_data_errors),
EXTRACT_32BITS(sflow_100basevg_counter->in_null_addressed_frames));
printf("\n\t out high prio frames %u, out high prio octets %" PRIu64
", trans into frames %u",
EXTRACT_32BITS(sflow_100basevg_counter->out_highpriority_frames),
EXTRACT_64BITS(sflow_100basevg_counter->out_highpriority_octets),
EXTRACT_32BITS(sflow_100basevg_counter->transitioninto_frames));
printf("\n\t in hc high prio octets %" PRIu64
", in hc norm prio octets %" PRIu64
", out hc high prio octets %" PRIu64,
EXTRACT_64BITS(sflow_100basevg_counter->hc_in_highpriority_octets),
EXTRACT_64BITS(sflow_100basevg_counter->hc_in_normpriority_octets),
EXTRACT_64BITS(sflow_100basevg_counter->hc_out_highpriority_octets));
return 0;
}
static int
print_sflow_counter_vlan(const u_char *pointer, u_int len) {
const struct sflow_vlan_counter_t *sflow_vlan_counter;
if (len < sizeof(struct sflow_vlan_counter_t))
return 1;
sflow_vlan_counter = (const struct sflow_vlan_counter_t *)pointer;
printf("\n\t vlan_id %u, octets %" PRIu64
", unicast_pkt %u, multicast_pkt %u, broadcast_pkt %u, discards %u",
EXTRACT_32BITS(sflow_vlan_counter->vlan_id),
EXTRACT_64BITS(sflow_vlan_counter->octets),
EXTRACT_32BITS(sflow_vlan_counter->unicast_pkt),
EXTRACT_32BITS(sflow_vlan_counter->multicast_pkt),
EXTRACT_32BITS(sflow_vlan_counter->broadcast_pkt),
EXTRACT_32BITS(sflow_vlan_counter->discards));
return 0;
}
struct sflow_processor_counter_t {
u_int8_t five_sec_util[4];
u_int8_t one_min_util[4];
u_int8_t five_min_util[4];
u_int8_t total_memory[8];
u_int8_t free_memory[8];
};
static int
print_sflow_counter_processor(const u_char *pointer, u_int len) {
const struct sflow_processor_counter_t *sflow_processor_counter;
if (len < sizeof(struct sflow_processor_counter_t))
return 1;
sflow_processor_counter = (const struct sflow_processor_counter_t *)pointer;
printf("\n\t 5sec %u, 1min %u, 5min %u, total_mem %" PRIu64
", total_mem %" PRIu64,
EXTRACT_32BITS(sflow_processor_counter->five_sec_util),
EXTRACT_32BITS(sflow_processor_counter->one_min_util),
EXTRACT_32BITS(sflow_processor_counter->five_min_util),
EXTRACT_64BITS(sflow_processor_counter->total_memory),
EXTRACT_64BITS(sflow_processor_counter->free_memory));
return 0;
}
static int
sflow_print_counter_records(const u_char *pointer, u_int len, u_int records) {
u_int nrecords;
const u_char *tptr;
u_int tlen;
u_int counter_type;
u_int counter_len;
u_int enterprise;
const struct sflow_counter_record_t *sflow_counter_record;
nrecords = records;
tptr = pointer;
tlen = len;
while (nrecords > 0) {
/* do we have the "header?" */
if (tlen < sizeof(struct sflow_counter_record_t))
return 1;
sflow_counter_record = (const struct sflow_counter_record_t *)tptr;
enterprise = EXTRACT_32BITS(sflow_counter_record->format);
counter_type = enterprise & 0x0FFF;
enterprise = enterprise >> 20;
counter_len = EXTRACT_32BITS(sflow_counter_record->length);
printf("\n\t enterprise %u, %s (%u) length %u",
enterprise,
(enterprise == 0) ? tok2str(sflow_counter_type_values,"Unknown",counter_type) : "Unknown",
counter_type,
counter_len);
tptr += sizeof(struct sflow_counter_record_t);
tlen -= sizeof(struct sflow_counter_record_t);
if (tlen < counter_len)
return 1;
if (enterprise == 0) {
switch (counter_type) {
case SFLOW_COUNTER_GENERIC:
if (print_sflow_counter_generic(tptr,tlen))
return 1;
break;
case SFLOW_COUNTER_ETHERNET:
if (print_sflow_counter_ethernet(tptr,tlen))
return 1;
break;
case SFLOW_COUNTER_TOKEN_RING:
if (print_sflow_counter_token_ring(tptr,tlen))
return 1;
break;
case SFLOW_COUNTER_BASEVG:
if (print_sflow_counter_basevg(tptr,tlen))
return 1;
break;
case SFLOW_COUNTER_VLAN:
if (print_sflow_counter_vlan(tptr,tlen))
return 1;
break;
case SFLOW_COUNTER_PROCESSOR:
if (print_sflow_counter_processor(tptr,tlen))
return 1;
break;
default:
if (vflag <= 1)
print_unknown_data(tptr, "\n\t\t", counter_len);
break;
}
}
tptr += counter_len;
tlen -= counter_len;
nrecords--;
}
return 0;
}
static int
sflow_print_counter_sample(const u_char *pointer, u_int len) {
const struct sflow_counter_sample_t *sflow_counter_sample;
u_int nrecords;
u_int typesource;
u_int type;
u_int index;
if (len < sizeof(struct sflow_counter_sample_t))
return 1;
sflow_counter_sample = (const struct sflow_counter_sample_t *)pointer;
typesource = EXTRACT_32BITS(sflow_counter_sample->typesource);
nrecords = EXTRACT_32BITS(sflow_counter_sample->records);
type = typesource >> 24;
index = typesource & 0x0FFF;
printf(" seqnum %u, type %u, idx %u, records %u",
EXTRACT_32BITS(sflow_counter_sample->seqnum),
type,
index,
nrecords);
return sflow_print_counter_records(pointer + sizeof(struct sflow_counter_sample_t),
len - sizeof(struct sflow_counter_sample_t),
nrecords);
}
static int
sflow_print_expanded_counter_sample(const u_char *pointer, u_int len) {
const struct sflow_expanded_counter_sample_t *sflow_expanded_counter_sample;
u_int nrecords;
if (len < sizeof(struct sflow_expanded_counter_sample_t))
return 1;
sflow_expanded_counter_sample = (const struct sflow_expanded_counter_sample_t *)pointer;
nrecords = EXTRACT_32BITS(sflow_expanded_counter_sample->records);
printf(" seqnum %u, type %u, idx %u, records %u",
EXTRACT_32BITS(sflow_expanded_counter_sample->seqnum),
EXTRACT_32BITS(sflow_expanded_counter_sample->type),
EXTRACT_32BITS(sflow_expanded_counter_sample->index),
nrecords);
return sflow_print_counter_records(pointer + sizeof(struct sflow_expanded_counter_sample_t),
len - sizeof(struct sflow_expanded_counter_sample_t),
nrecords);
}
static int
print_sflow_raw_packet(const u_char *pointer, u_int len) {
const struct sflow_expanded_flow_raw_t *sflow_flow_raw;
if (len < sizeof(struct sflow_expanded_flow_raw_t))
return 1;
sflow_flow_raw = (const struct sflow_expanded_flow_raw_t *)pointer;
printf("\n\t protocol %s (%u), length %u, stripped bytes %u, header_size %u",
tok2str(sflow_flow_raw_protocol_values,"Unknown",EXTRACT_32BITS(sflow_flow_raw->protocol)),
EXTRACT_32BITS(sflow_flow_raw->protocol),
EXTRACT_32BITS(sflow_flow_raw->length),
EXTRACT_32BITS(sflow_flow_raw->stripped_bytes),
EXTRACT_32BITS(sflow_flow_raw->header_size));
/* QUESTION - should we attempt to print the raw header itself?
assuming of course there is wnough data present to do so... */
return 0;
}
static int
print_sflow_ethernet_frame(const u_char *pointer, u_int len) {
const struct sflow_ethernet_frame_t *sflow_ethernet_frame;
if (len < sizeof(struct sflow_ethernet_frame_t))
return 1;
sflow_ethernet_frame = (const struct sflow_ethernet_frame_t *)pointer;
printf("\n\t frame len %u, type %u",
EXTRACT_32BITS(sflow_ethernet_frame->length),
EXTRACT_32BITS(sflow_ethernet_frame->type));
return 0;
}
static int
print_sflow_extended_switch_data(const u_char *pointer, u_int len) {
const struct sflow_extended_switch_data_t *sflow_extended_sw_data;
if (len < sizeof(struct sflow_extended_switch_data_t))
return 1;
sflow_extended_sw_data = (const struct sflow_extended_switch_data_t *)pointer;
printf("\n\t src vlan %u, src pri %u, dst vlan %u, dst pri %u",
EXTRACT_32BITS(sflow_extended_sw_data->src_vlan),
EXTRACT_32BITS(sflow_extended_sw_data->src_pri),
EXTRACT_32BITS(sflow_extended_sw_data->dst_vlan),
EXTRACT_32BITS(sflow_extended_sw_data->dst_pri));
return 0;
}
static int
sflow_print_flow_records(const u_char *pointer, u_int len, u_int records) {
u_int nrecords;
const u_char *tptr;
u_int tlen;
u_int flow_type;
u_int enterprise;
u_int flow_len;
const struct sflow_flow_record_t *sflow_flow_record;
nrecords = records;
tptr = pointer;
tlen = len;
while (nrecords > 0) {
/* do we have the "header?" */
if (tlen < sizeof(struct sflow_flow_record_t))
return 1;
sflow_flow_record = (const struct sflow_flow_record_t *)tptr;
/* so, the funky encoding means we cannot blythly mask-off
bits, we must also check the enterprise. */
enterprise = EXTRACT_32BITS(sflow_flow_record->format);
flow_type = enterprise & 0x0FFF;
enterprise = enterprise >> 12;
flow_len = EXTRACT_32BITS(sflow_flow_record->length);
printf("\n\t enterprise %u %s (%u) length %u",
enterprise,
(enterprise == 0) ? tok2str(sflow_flow_type_values,"Unknown",flow_type) : "Unknown",
flow_type,
flow_len);
tptr += sizeof(struct sflow_flow_record_t);
tlen -= sizeof(struct sflow_flow_record_t);
if (tlen < flow_len)
return 1;
if (enterprise == 0) {
switch (flow_type) {
case SFLOW_FLOW_RAW_PACKET:
if (print_sflow_raw_packet(tptr,tlen))
return 1;
break;
case SFLOW_FLOW_EXTENDED_SWITCH_DATA:
if (print_sflow_extended_switch_data(tptr,tlen))
return 1;
break;
case SFLOW_FLOW_ETHERNET_FRAME:
if (print_sflow_ethernet_frame(tptr,tlen))
return 1;
break;
/* FIXME these need a decoder */
case SFLOW_FLOW_IPV4_DATA:
case SFLOW_FLOW_IPV6_DATA:
case SFLOW_FLOW_EXTENDED_ROUTER_DATA:
case SFLOW_FLOW_EXTENDED_GATEWAY_DATA:
case SFLOW_FLOW_EXTENDED_USER_DATA:
case SFLOW_FLOW_EXTENDED_URL_DATA:
case SFLOW_FLOW_EXTENDED_MPLS_DATA:
case SFLOW_FLOW_EXTENDED_NAT_DATA:
case SFLOW_FLOW_EXTENDED_MPLS_TUNNEL:
case SFLOW_FLOW_EXTENDED_MPLS_VC:
case SFLOW_FLOW_EXTENDED_MPLS_FEC:
case SFLOW_FLOW_EXTENDED_MPLS_LVP_FEC:
case SFLOW_FLOW_EXTENDED_VLAN_TUNNEL:
break;
default:
if (vflag <= 1)
print_unknown_data(tptr, "\n\t\t", flow_len);
break;
}
}
tptr += flow_len;
tlen -= flow_len;
nrecords--;
}
return 0;
}
static int
sflow_print_flow_sample(const u_char *pointer, u_int len) {
const struct sflow_flow_sample_t *sflow_flow_sample;
u_int nrecords;
u_int typesource;
u_int type;
u_int index;
if (len < sizeof(struct sflow_flow_sample_t))
return 1;
sflow_flow_sample = (struct sflow_flow_sample_t *)pointer;
typesource = EXTRACT_32BITS(sflow_flow_sample->typesource);
nrecords = EXTRACT_32BITS(sflow_flow_sample->records);
type = typesource >> 24;
index = typesource & 0x0FFF;
printf(" seqnum %u, type %u, idx %u, rate %u, pool %u, drops %u, input %u output %u records %u",
EXTRACT_32BITS(sflow_flow_sample->seqnum),
type,
index,
EXTRACT_32BITS(sflow_flow_sample->rate),
EXTRACT_32BITS(sflow_flow_sample->pool),
EXTRACT_32BITS(sflow_flow_sample->drops),
EXTRACT_32BITS(sflow_flow_sample->in_interface),
EXTRACT_32BITS(sflow_flow_sample->out_interface),
nrecords);
return sflow_print_flow_records(pointer + sizeof(struct sflow_flow_sample_t),
len - sizeof(struct sflow_flow_sample_t),
nrecords);
}
static int
sflow_print_expanded_flow_sample(const u_char *pointer, u_int len) {
const struct sflow_expanded_flow_sample_t *sflow_expanded_flow_sample;
u_int nrecords;
if (len < sizeof(struct sflow_expanded_flow_sample_t))
return 1;
sflow_expanded_flow_sample = (const struct sflow_expanded_flow_sample_t *)pointer;
nrecords = EXTRACT_32BITS(sflow_expanded_flow_sample->records);
printf(" seqnum %u, type %u, idx %u, rate %u, pool %u, drops %u, records %u",
EXTRACT_32BITS(sflow_expanded_flow_sample->seqnum),
EXTRACT_32BITS(sflow_expanded_flow_sample->type),
EXTRACT_32BITS(sflow_expanded_flow_sample->index),
EXTRACT_32BITS(sflow_expanded_flow_sample->rate),
EXTRACT_32BITS(sflow_expanded_flow_sample->pool),
EXTRACT_32BITS(sflow_expanded_flow_sample->drops),
EXTRACT_32BITS(sflow_expanded_flow_sample->records));
return sflow_print_flow_records(pointer + sizeof(struct sflow_expanded_flow_sample_t),
len - sizeof(struct sflow_expanded_flow_sample_t),
nrecords);
}
void
sflow_print(const u_char *pptr, u_int len) {
const struct sflow_datagram_t *sflow_datagram;
const struct sflow_sample_header *sflow_sample;
const struct sflow_expanded_flow_sample_t *sflow_expanded_flow_sample;
const struct sflow_expanded_flow_raw_t *sflow_flow_raw;
const struct sflow_expanded_counter_sample_t *sflow_expanded_counter_sample;
const struct sflow_generic_counter_t *sflow_gen_counter;
const struct sflow_ethernet_counter_t *sflow_eth_counter;
const struct sflow_100basevg_counter_t *sflow_100basevg_counter;
const struct sflow_vlan_counter_t *sflow_vlan_counter;
const u_char *tptr;
int tlen;
u_int tlen;
u_int32_t sflow_sample_type, sflow_sample_len;
int nsamples, nrecords, counter_len, counter_type, flow_len, flow_type;
u_int32_t nsamples;
tptr = pptr;
tlen = len;
@ -318,9 +863,14 @@ sflow_print(const u_char *pptr, u_int len) {
while (nsamples > 0 && tlen > 0) {
sflow_sample = (const struct sflow_sample_header *)tptr;
TCHECK(*sflow_sample);
sflow_sample_type = (EXTRACT_32BITS(sflow_sample->format)&0x0FFF);
sflow_sample_len = EXTRACT_32BITS(sflow_sample->len);
if (tlen < sizeof(struct sflow_sample_header))
goto trunc;
tptr += sizeof(struct sflow_sample_header);
tlen -= sizeof(struct sflow_sample_header);
@ -334,226 +884,33 @@ sflow_print(const u_char *pptr, u_int len) {
return;
}
/* did we capture enough for fully decoding the sample ? */
if (!TTEST2(*tptr, sflow_sample_len))
if (tlen < sflow_sample_len)
goto trunc;
/* did we capture enough for fully decoding the sample ? */
TCHECK2(*tptr, sflow_sample_len);
switch(sflow_sample_type) {
case SFLOW_FLOW_SAMPLE: /* XXX */
case SFLOW_FLOW_SAMPLE:
if (sflow_print_flow_sample(tptr,tlen))
goto trunc;
break;
case SFLOW_COUNTER_SAMPLE: /* XXX */
case SFLOW_COUNTER_SAMPLE:
if (sflow_print_counter_sample(tptr,tlen))
goto trunc;
break;
case SFLOW_EXPANDED_FLOW_SAMPLE:
sflow_expanded_flow_sample = (const struct sflow_expanded_flow_sample_t *)tptr;
nrecords = EXTRACT_32BITS(sflow_expanded_flow_sample->records);
printf(" seqnum %u, type %u, idx %u, rate %u, pool %u, drops %u, records %u",
EXTRACT_32BITS(sflow_expanded_flow_sample->seqnum),
EXTRACT_32BITS(sflow_expanded_flow_sample->type),
EXTRACT_32BITS(sflow_expanded_flow_sample->index),
EXTRACT_32BITS(sflow_expanded_flow_sample->rate),
EXTRACT_32BITS(sflow_expanded_flow_sample->pool),
EXTRACT_32BITS(sflow_expanded_flow_sample->drops),
EXTRACT_32BITS(sflow_expanded_flow_sample->records));
tptr+= sizeof(struct sflow_expanded_flow_sample_t);
tlen-= sizeof(struct sflow_expanded_flow_sample_t);
while ( nrecords > 0 && tlen > 0) {
/* decode Flow record - 2 bytes */
flow_type = EXTRACT_32BITS(tptr)&0x0FFF;
flow_len = EXTRACT_32BITS(tptr+4);
printf("\n\t %s (%u) length %u",
tok2str(sflow_flow_type_values,"Unknown",flow_type),
flow_type,
flow_len);
tptr += 8;
tlen -= 8;
/* did we capture enough for fully decoding the flow ? */
if (!TTEST2(*tptr, flow_len))
if (sflow_print_expanded_flow_sample(tptr,tlen))
goto trunc;
switch(flow_type) {
case SFLOW_FLOW_RAW_PACKET:
sflow_flow_raw = (const struct sflow_expanded_flow_raw_t *)tptr;
printf("\n\t protocol %s (%u), length %u, stripped bytes %u, header_size %u",
tok2str(sflow_flow_raw_protocol_values,"Unknown",EXTRACT_32BITS(sflow_flow_raw->protocol)),
EXTRACT_32BITS(sflow_flow_raw->protocol),
EXTRACT_32BITS(sflow_flow_raw->length),
EXTRACT_32BITS(sflow_flow_raw->stripped_bytes),
EXTRACT_32BITS(sflow_flow_raw->header_size));
break;
/*
* FIXME those are the defined flow types that lack a decoder
*/
case SFLOW_FLOW_ETHERNET_FRAME:
case SFLOW_FLOW_IPV4_DATA:
case SFLOW_FLOW_IPV6_DATA:
case SFLOW_FLOW_EXTENDED_SWITCH_DATA:
case SFLOW_FLOW_EXTENDED_ROUTER_DATA:
case SFLOW_FLOW_EXTENDED_GATEWAY_DATA:
case SFLOW_FLOW_EXTENDED_USER_DATA:
case SFLOW_FLOW_EXTENDED_URL_DATA:
case SFLOW_FLOW_EXTENDED_MPLS_DATA:
case SFLOW_FLOW_EXTENDED_NAT_DATA:
case SFLOW_FLOW_EXTENDED_MPLS_TUNNEL:
case SFLOW_FLOW_EXTENDED_MPLS_VC:
case SFLOW_FLOW_EXTENDED_MPLS_FEC:
case SFLOW_FLOW_EXTENDED_MPLS_LVP_FEC:
case SFLOW_FLOW_EXTENDED_VLAN_TUNNEL:
break;
default:
if (vflag <= 1)
print_unknown_data(tptr, "\n\t ", flow_len);
break;
}
tptr += flow_len;
tlen -= flow_len;
nrecords--;
}
break;
case SFLOW_EXPANDED_COUNTER_SAMPLE:
sflow_expanded_counter_sample = (const struct sflow_expanded_counter_sample_t *)tptr;
nrecords = EXTRACT_32BITS(sflow_expanded_counter_sample->records);
printf(" seqnum %u, type %u, idx %u, records %u",
EXTRACT_32BITS(sflow_expanded_counter_sample->seqnum),
EXTRACT_32BITS(sflow_expanded_counter_sample->type),
EXTRACT_32BITS(sflow_expanded_counter_sample->index),
nrecords);
tptr+= sizeof(struct sflow_expanded_counter_sample_t);
tlen-= sizeof(struct sflow_expanded_counter_sample_t);
while ( nrecords > 0 && tlen > 0) {
/* decode counter record - 2 bytes */
counter_type = EXTRACT_32BITS(tptr)&0x0FFF;
counter_len = EXTRACT_32BITS(tptr+4);
printf("\n\t %s (%u) length %u",
tok2str(sflow_counter_type_values,"Unknown",counter_type),
counter_type,
counter_len);
tptr += 8;
tlen -= 8;
/* did we capture enough for fully decoding the counter ? */
if (!TTEST2(*tptr, counter_len))
if (sflow_print_expanded_counter_sample(tptr,tlen))
goto trunc;
break;
switch(counter_type) {
case SFLOW_COUNTER_GENERIC:
sflow_gen_counter = (const struct sflow_generic_counter_t *)tptr;
printf("\n\t ifindex %u, iftype %u, ifspeed %u, ifdirection %u (%s)",
EXTRACT_32BITS(sflow_gen_counter->ifindex),
EXTRACT_32BITS(sflow_gen_counter->iftype),
EXTRACT_32BITS(sflow_gen_counter->ifspeed),
EXTRACT_32BITS(sflow_gen_counter->ifdirection),
tok2str(sflow_iface_direction_values, "Unknown",
EXTRACT_32BITS(sflow_gen_counter->ifdirection)));
printf("\n\t ifstatus %u, adminstatus: %s, operstatus: %s",
EXTRACT_32BITS(sflow_gen_counter->ifstatus),
EXTRACT_32BITS(sflow_gen_counter->ifstatus)&1 ? "up" : "down",
(EXTRACT_32BITS(sflow_gen_counter->ifstatus)>>1)&1 ? "up" : "down");
printf("\n\t In octets %" PRIu64
", unicast pkts %u, multicast pkts %u, broadcast pkts %u, discards %u",
EXTRACT_64BITS(sflow_gen_counter->ifinoctets),
EXTRACT_32BITS(sflow_gen_counter->ifinunicastpkts),
EXTRACT_32BITS(sflow_gen_counter->ifinmulticastpkts),
EXTRACT_32BITS(sflow_gen_counter->ifinbroadcastpkts),
EXTRACT_32BITS(sflow_gen_counter->ifindiscards));
printf("\n\t In errors %u, unknown protos %u",
EXTRACT_32BITS(sflow_gen_counter->ifinerrors),
EXTRACT_32BITS(sflow_gen_counter->ifinunkownprotos));
printf("\n\t Out octets %" PRIu64
", unicast pkts %u, multicast pkts %u, broadcast pkts %u, discards %u",
EXTRACT_64BITS(sflow_gen_counter->ifoutoctets),
EXTRACT_32BITS(sflow_gen_counter->ifoutunicastpkts),
EXTRACT_32BITS(sflow_gen_counter->ifoutmulticastpkts),
EXTRACT_32BITS(sflow_gen_counter->ifoutbroadcastpkts),
EXTRACT_32BITS(sflow_gen_counter->ifoutdiscards));
printf("\n\t Out errors %u, promisc mode %u",
EXTRACT_32BITS(sflow_gen_counter->ifouterrors),
EXTRACT_32BITS(sflow_gen_counter->ifpromiscmode));
break;
case SFLOW_COUNTER_ETHERNET:
sflow_eth_counter = (const struct sflow_ethernet_counter_t *)tptr;
printf("\n\t align errors %u, fcs errors %u, single collision %u, multiple collision %u, test error %u",
EXTRACT_32BITS(sflow_eth_counter->alignerrors),
EXTRACT_32BITS(sflow_eth_counter->fcserrors),
EXTRACT_32BITS(sflow_eth_counter->single_collision_frames),
EXTRACT_32BITS(sflow_eth_counter->multiple_collision_frames),
EXTRACT_32BITS(sflow_eth_counter->test_errors));
printf("\n\t deferred %u, late collision %u, excessive collision %u, mac trans error %u",
EXTRACT_32BITS(sflow_eth_counter->deferred_transmissions),
EXTRACT_32BITS(sflow_eth_counter->late_collisions),
EXTRACT_32BITS(sflow_eth_counter->excessive_collisions),
EXTRACT_32BITS(sflow_eth_counter->mac_transmit_errors));
printf("\n\t carrier error %u, frames too long %u, mac receive errors %u, symbol errors %u",
EXTRACT_32BITS(sflow_eth_counter->carrier_sense_errors),
EXTRACT_32BITS(sflow_eth_counter->frame_too_longs),
EXTRACT_32BITS(sflow_eth_counter->mac_receive_errors),
EXTRACT_32BITS(sflow_eth_counter->symbol_errors));
break;
case SFLOW_COUNTER_TOKEN_RING: /* XXX */
break;
case SFLOW_COUNTER_BASEVG:
sflow_100basevg_counter = (const struct sflow_100basevg_counter_t *)tptr;
printf("\n\t in high prio frames %u, in high prio octets %" PRIu64,
EXTRACT_32BITS(sflow_100basevg_counter->in_highpriority_frames),
EXTRACT_64BITS(sflow_100basevg_counter->in_highpriority_octets));
printf("\n\t in norm prio frames %u, in norm prio octets %" PRIu64,
EXTRACT_32BITS(sflow_100basevg_counter->in_normpriority_frames),
EXTRACT_64BITS(sflow_100basevg_counter->in_normpriority_octets));
printf("\n\t in ipm errors %u, oversized %u, in data errors %u, null addressed frames %u",
EXTRACT_32BITS(sflow_100basevg_counter->in_ipmerrors),
EXTRACT_32BITS(sflow_100basevg_counter->in_oversized),
EXTRACT_32BITS(sflow_100basevg_counter->in_data_errors),
EXTRACT_32BITS(sflow_100basevg_counter->in_null_addressed_frames));
printf("\n\t out high prio frames %u, out high prio octets %" PRIu64
", trans into frames %u",
EXTRACT_32BITS(sflow_100basevg_counter->out_highpriority_frames),
EXTRACT_64BITS(sflow_100basevg_counter->out_highpriority_octets),
EXTRACT_32BITS(sflow_100basevg_counter->transitioninto_frames));
printf("\n\t in hc high prio octets %" PRIu64
", in hc norm prio octets %" PRIu64
", out hc high prio octets %" PRIu64,
EXTRACT_64BITS(sflow_100basevg_counter->hc_in_highpriority_octets),
EXTRACT_64BITS(sflow_100basevg_counter->hc_in_normpriority_octets),
EXTRACT_64BITS(sflow_100basevg_counter->hc_out_highpriority_octets));
break;
case SFLOW_COUNTER_VLAN:
sflow_vlan_counter = (const struct sflow_vlan_counter_t *)tptr;
printf("\n\t vlan_id %u, octets %" PRIu64
", unicast_pkt %u, multicast_pkt %u, broadcast_pkt %u, discards %u",
EXTRACT_32BITS(sflow_vlan_counter->vlan_id),
EXTRACT_64BITS(sflow_vlan_counter->octets),
EXTRACT_32BITS(sflow_vlan_counter->unicast_pkt),
EXTRACT_32BITS(sflow_vlan_counter->multicast_pkt),
EXTRACT_32BITS(sflow_vlan_counter->broadcast_pkt),
EXTRACT_32BITS(sflow_vlan_counter->discards));
break;
case SFLOW_COUNTER_PROCESSOR: /* XXX */
break;
default:
if (vflag <= 1)
print_unknown_data(tptr, "\n\t\t", counter_len);
break;
}
tptr += counter_len;
tlen -= counter_len;
nrecords--;
}
break;
default:
if (vflag <= 1)
print_unknown_data(tptr, "\n\t ", sflow_sample_len);

View File

@ -75,7 +75,7 @@ sl_if_print(const struct pcap_pkthdr *h, const u_char *p)
break;
#ifdef INET6
case 6:
ip6_print((u_char *)ip, length);
ip6_print(gndo, (u_char *)ip, length);
break;
#endif
default:

View File

@ -218,7 +218,7 @@ sll_if_print(const struct pcap_pkthdr *h, const u_char *p)
caplen -= 4;
goto recurse;
} else {
if (ethertype_print(ether_type, p, length, caplen) == 0) {
if (ethertype_print(gndo, ether_type, p, length, caplen) == 0) {
/* ether_type not known, print raw packet */
if (!eflag)
sll_print(sllp, length + SLL_HDR_LEN);

View File

@ -47,12 +47,12 @@ static const char rcsid[] _U_ =
#include <tcpdump-stdinc.h>
#ifdef HAVE_GETRPCBYNUMBER
#if defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H)
#include <rpc/rpc.h>
#ifdef HAVE_RPC_RPCENT_H
#include <rpc/rpcent.h>
#endif /* HAVE_RPC_RPCENT_H */
#endif /* HAVE_GETRPCBYNUMBER */
#endif /* defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H) */
#include <stdio.h>
#include <string.h>
@ -153,7 +153,7 @@ static char *
progstr(prog)
u_int32_t prog;
{
#ifdef HAVE_GETRPCBYNUMBER
#if defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H)
register struct rpcent *rp;
#endif
static char buf[32];
@ -161,12 +161,12 @@ progstr(prog)
if (lastprog != 0 && prog == lastprog)
return (buf);
#ifdef HAVE_GETRPCBYNUMBER
#if defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H)
rp = getrpcbynumber(prog);
if (rp == NULL)
#endif
(void) snprintf(buf, sizeof(buf), "#%u", prog);
#ifdef HAVE_GETRPCBYNUMBER
#if defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H)
else
strlcpy(buf, rp->r_name, sizeof(buf));
#endif

View File

@ -107,7 +107,7 @@ symantec_if_print(const struct pcap_pkthdr *h, const u_char *p)
if (!suppress_default_print)
default_print(p, caplen);
} else if (ethertype_print(ether_type, p, length, caplen) == 0) {
} else if (ethertype_print(gndo, ether_type, p, length, caplen) == 0) {
/* ether_type not known, print raw packet */
if (!eflag)
symantec_hdr_print((u_char *)sp, length + sizeof (struct symantec_header));

View File

@ -129,31 +129,8 @@ static int tcp_cksum(register const struct ip *ip,
register const struct tcphdr *tp,
register u_int len)
{
union phu {
struct phdr {
u_int32_t src;
u_int32_t dst;
u_char mbz;
u_char proto;
u_int16_t len;
} ph;
u_int16_t pa[6];
} phu;
const u_int16_t *sp;
/* pseudo-header.. */
phu.ph.len = htons((u_int16_t)len);
phu.ph.mbz = 0;
phu.ph.proto = IPPROTO_TCP;
memcpy(&phu.ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t));
if (IP_HL(ip) == 5)
memcpy(&phu.ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t));
else
phu.ph.dst = ip_finddst(ip);
sp = &phu.pa[0];
return in_cksum((u_short *)tp, len,
sp[0]+sp[1]+sp[2]+sp[3]+sp[4]+sp[5]);
return (nextproto4_cksum(ip, (const u_int8_t *)tp, len,
IPPROTO_TCP));
}
void
@ -294,7 +271,6 @@ tcp_print(register const u_char *bp, register u_int length,
* both directions).
*/
#ifdef INET6
memset(&tha, 0, sizeof(tha));
rev = 0;
if (ip6) {
src = &ip6->ip6_src;
@ -315,6 +291,27 @@ tcp_print(register const u_char *bp, register u_int length,
tha.port = sport << 16 | dport;
}
} else {
/*
* Zero out the tha structure; the src and dst
* fields are big enough to hold an IPv6
* address, but we only have IPv4 addresses
* and thus must clear out the remaining 124
* bits.
*
* XXX - should we just clear those bytes after
* copying the IPv4 addresses, rather than
* zeroing out the entire structure and then
* overwriting some of the zeroes?
*
* XXX - this could fail if we see TCP packets
* with an IPv6 address with the lower 124 bits
* all zero and also see TCP packes with an
* IPv4 address with the same 32 bits as the
* upper 32 bits of the IPv6 address in question.
* Can that happen? Is it likely enough to be
* an issue?
*/
memset(&tha, 0, sizeof(tha));
src = &ip->ip_src;
dst = &ip->ip_dst;
if (sport > dport)
@ -393,34 +390,40 @@ tcp_print(register const u_char *bp, register u_int length,
return;
}
if (IP_V(ip) == 4 && vflag && !Kflag && !fragmented) {
if (vflag && !Kflag && !fragmented) {
/* Check the checksum, if possible. */
u_int16_t sum, tcp_sum;
if (IP_V(ip) == 4) {
if (TTEST2(tp->th_sport, length)) {
sum = tcp_cksum(ip, tp, length);
(void)printf(", cksum 0x%04x",EXTRACT_16BITS(&tp->th_sum));
if (sum != 0) {
tcp_sum = EXTRACT_16BITS(&tp->th_sum);
(void)printf(" (incorrect -> 0x%04x)",in_cksum_shouldbe(tcp_sum, sum));
} else
(void)printf(", cksum 0x%04x", tcp_sum);
if (sum != 0)
(void)printf(" (incorrect -> 0x%04x)",
in_cksum_shouldbe(tcp_sum, sum));
else
(void)printf(" (correct)");
}
}
#ifdef INET6
if (IP_V(ip) == 6 && ip6->ip6_plen && vflag && !Kflag && !fragmented) {
u_int16_t sum,tcp_sum;
else if (IP_V(ip) == 6 && ip6->ip6_plen) {
if (TTEST2(tp->th_sport, length)) {
sum = nextproto6_cksum(ip6, (u_short *)tp, length, IPPROTO_TCP);
(void)printf(", cksum 0x%04x",EXTRACT_16BITS(&tp->th_sum));
if (sum != 0) {
sum = nextproto6_cksum(ip6, (const u_int8_t *)tp, length, IPPROTO_TCP);
tcp_sum = EXTRACT_16BITS(&tp->th_sum);
(void)printf(" (incorrect -> 0x%04x)",in_cksum_shouldbe(tcp_sum, sum));
} else
(void)printf(", cksum 0x%04x", tcp_sum);
if (sum != 0)
(void)printf(" (incorrect -> 0x%04x)",
in_cksum_shouldbe(tcp_sum, sum));
else
(void)printf(" (correct)");
}
}
#endif
}
length -= hlen;
if (vflag > 1 || length > 0 || flags & (TH_SYN | TH_FIN | TH_RST)) {
@ -661,6 +664,8 @@ tcp_print(register const u_char *bp, register u_int length,
ns_print(bp + 2, length - 2, 0);
} else if (sport == MSDP_PORT || dport == MSDP_PORT) {
msdp_print(bp, length);
} else if (sport == RPKI_RTR_PORT || dport == RPKI_RTR_PORT) {
rpki_rtr_print(bp, length);
}
else if (length > 0 && (sport == LDP_PORT || dport == LDP_PORT)) {
ldp_print(bp, length);

View File

@ -99,15 +99,7 @@ tftp_print(register const u_char *bp, u_int length)
case RRQ:
case WRQ:
case OACK:
/*
* XXX Not all arpa/tftp.h's specify th_stuff as any
* array; use address of th_block instead
*/
#ifdef notdef
p = (u_char *)tp->th_stuff;
#else
p = (u_char *)&tp->th_block;
#endif
putchar(' ');
/* Print filename or first option */
if (opcode != OACK)

View File

@ -35,7 +35,6 @@ static const char rcsid[] _U_ =
#ifdef SEGSIZE
#undef SEGSIZE
#endif
#include <arpa/tftp.h>
#include <stdio.h>
#include <string.h>
@ -289,75 +288,16 @@ static int udp_cksum(register const struct ip *ip,
register const struct udphdr *up,
register u_int len)
{
union phu {
struct phdr {
u_int32_t src;
u_int32_t dst;
u_char mbz;
u_char proto;
u_int16_t len;
} ph;
u_int16_t pa[6];
} phu;
register const u_int16_t *sp;
/* pseudo-header.. */
phu.ph.len = htons((u_int16_t)len);
phu.ph.mbz = 0;
phu.ph.proto = IPPROTO_UDP;
memcpy(&phu.ph.src, &ip->ip_src.s_addr, sizeof(u_int32_t));
if (IP_HL(ip) == 5)
memcpy(&phu.ph.dst, &ip->ip_dst.s_addr, sizeof(u_int32_t));
else
phu.ph.dst = ip_finddst(ip);
sp = &phu.pa[0];
return in_cksum((u_short *)up, len,
sp[0]+sp[1]+sp[2]+sp[3]+sp[4]+sp[5]);
return (nextproto4_cksum(ip, (const u_int8_t *)(void *)up, len,
IPPROTO_UDP));
}
#ifdef INET6
static int udp6_cksum(const struct ip6_hdr *ip6, const struct udphdr *up,
u_int len)
{
size_t i;
register const u_int16_t *sp;
u_int32_t sum;
union {
struct {
struct in6_addr ph_src;
struct in6_addr ph_dst;
u_int32_t ph_len;
u_int8_t ph_zero[3];
u_int8_t ph_nxt;
} ph;
u_int16_t pa[20];
} phu;
/* pseudo-header */
memset(&phu, 0, sizeof(phu));
phu.ph.ph_src = ip6->ip6_src;
phu.ph.ph_dst = ip6->ip6_dst;
phu.ph.ph_len = htonl(len);
phu.ph.ph_nxt = IPPROTO_UDP;
sum = 0;
for (i = 0; i < sizeof(phu.pa) / sizeof(phu.pa[0]); i++)
sum += phu.pa[i];
sp = (const u_int16_t *)up;
for (i = 0; i < (len & ~1); i += 2)
sum += *sp++;
if (len & 1)
sum += htons((*(const u_int8_t *)sp) << 8);
while (sum > 0xffff)
sum = (sum & 0xffff) + (sum >> 16);
sum = ~sum & 0xffff;
return (sum);
return (nextproto6_cksum(ip6, (const u_int8_t *)(void *)up, len,
IPPROTO_UDP));
}
#endif
@ -570,31 +510,46 @@ udp_print(register const u_char *bp, u_int length,
}
udpipaddr_print(ip, sport, dport);
if (IP_V(ip) == 4 && (vflag > 1) && !Kflag && !fragmented) {
int sum = up->uh_sum;
if (sum == 0) {
if (vflag && !Kflag && !fragmented) {
/* Check the checksum, if possible. */
u_int16_t sum, udp_sum;
/*
* XXX - do this even if vflag == 1?
* TCP does, and we do so for UDP-over-IPv6.
*/
if (IP_V(ip) == 4 && (vflag > 1)) {
udp_sum = EXTRACT_16BITS(&up->uh_sum);
if (udp_sum == 0) {
(void)printf("[no cksum] ");
} else if (TTEST2(cp[0], length)) {
sum = udp_cksum(ip, up, length + sizeof(struct udphdr));
if (sum != 0)
(void)printf("[bad udp cksum %x!] ", sum);
else
if (sum != 0) {
(void)printf("[bad udp cksum 0x%04x -> 0x%04x!] ",
udp_sum,
in_cksum_shouldbe(udp_sum, sum));
} else
(void)printf("[udp sum ok] ");
}
}
#ifdef INET6
if (IP_V(ip) == 6 && ip6->ip6_plen && vflag && !Kflag && !fragmented) {
int sum = up->uh_sum;
else if (IP_V(ip) == 6 && ip6->ip6_plen) {
/* for IPv6, UDP checksum is mandatory */
if (TTEST2(cp[0], length)) {
sum = udp6_cksum(ip6, up, length + sizeof(struct udphdr));
if (sum != 0)
(void)printf("[bad udp cksum %x!] ", sum);
else
udp_sum = EXTRACT_16BITS(&up->uh_sum);
if (sum != 0) {
(void)printf("[bad udp cksum 0x%04x -> 0x%04x!] ",
udp_sum,
in_cksum_shouldbe(udp_sum, sum));
} else
(void)printf("[udp sum ok] ");
}
}
#endif
}
if (!qflag) {
#define ISPORT(p) (dport == (p) || sport == (p))
@ -654,9 +609,10 @@ udp_print(register const u_char *bp, u_int length,
#ifdef INET6
else if (ISPORT(RIPNG_PORT))
ripng_print((const u_char *)(up + 1), length);
else if (ISPORT(DHCP6_SERV_PORT) || ISPORT(DHCP6_CLI_PORT)) {
else if (ISPORT(DHCP6_SERV_PORT) || ISPORT(DHCP6_CLI_PORT))
dhcp6_print((const u_char *)(up + 1), length);
}
else if (ISPORT(BABEL_PORT) || ISPORT(BABEL_PORT_OLD))
babel_print((const u_char *)(up + 1), length);
#endif /*INET6*/
/*
* Kludge in test for whiteboard packets.

View File

@ -110,9 +110,15 @@ vrrp_print(register const u_char *bp, register u_int len, int ttl)
int i;
char c;
if (TTEST2(bp[0], len) && in_cksum((const u_short*)bp, len, 0))
if (TTEST2(bp[0], len)) {
struct cksum_vec vec[1];
vec[0].ptr = bp;
vec[0].len = len;
if (in_cksum(vec, 1))
printf(", (bad vrrp cksum %x)",
EXTRACT_16BITS(&bp[6]));
}
printf(", addrs");
if (naddrs > 1)
printf("(%d)", naddrs);

View File

@ -105,6 +105,7 @@ struct tcphdr {
#define NFS_PORT 2049
#endif
#define MSDP_PORT 639
#define RPKI_RTR_PORT 2222 /* experimental up until sidr-wg registers a well-known port */
#define LDP_PORT 646
#ifndef SMB_PORT
#define SMB_PORT 445

View File

@ -131,10 +131,43 @@ typedef char* caddr_t;
#endif /* WIN32 */
#ifdef INET6
#include "ip6.h"
#ifndef HAVE___ATTRIBUTE__
#define __attribute__(x)
#endif
/*
* Used to declare a structure unaligned, so that the C compiler,
* if necessary, generates code that doesn't assume alignment.
* This is required because there is no guarantee that the packet
* data we get from libpcap/WinPcap is properly aligned.
*
* This assumes that, for all compilers that support __attribute__:
*
* 1) they support __attribute__((packed));
*
* 2) for all instruction set architectures requiring strict
* alignment, declaring a structure with that attribute
* causes the compiler to generate code that handles
* misaligned 2-byte, 4-byte, and 8-byte integral
* quantities.
*
* It does not (yet) handle compilers where you can get the compiler
* to generate code of that sort by some other means.
*
* This is required in order to, for example, keep the compiler from
* generating, for
*
* if (bp->bp_htype == 1 && bp->bp_hlen == 6 && bp->bp_op == BOOTPREQUEST) {
*
* in print-bootp.c, code that loads the first 4-byte word of a
* "struct bootp", masking out the bp_hops field, and comparing the result
* against 0x01010600.
*
* Note: this also requires that padding be put into the structure,
* at least for compilers where it's implemented as __attribute__((packed)).
*/
#define UNALIGNED __attribute__((packed))
#if defined(WIN32) || defined(MSDOS)
#define FOPEN_READ_TXT "rt"
#define FOPEN_READ_BIN "rb"
@ -147,7 +180,7 @@ typedef char* caddr_t;
#define FOPEN_WRITE_BIN FOPEN_WRITE_TXT
#endif
#if defined(__GNUC__) && defined(__i386__) && !defined(__ntohl)
#if defined(__GNUC__) && defined(__i386__) && !defined(__APPLE__) && !defined(__ntohl)
#undef ntohl
#undef ntohs
#undef htonl

View File

@ -29,7 +29,7 @@ tcpdump \- dump traffic on a network
.na
.B tcpdump
[
.B \-AbdDefIKlLnNOpqRStuUvxX
.B \-AbdDefhHIJKlLnNOpqRStuUvxX
] [
.B \-B
.I buffer_size
@ -56,6 +56,10 @@ tcpdump \- dump traffic on a network
.I interface
]
[
.B \-j
.I tstamp_type
]
[
.B \-m
.I module
]
@ -256,7 +260,7 @@ Print the link-level header on each dump line.
.B \-E
Use \fIspi@ipaddr algo:secret\fP for decrypting IPsec ESP packets that
are addressed to \fIaddr\fP and contain Security Parameter Index value
\fIspi\fP. This combination may be repeated with comma or newline seperation.
\fIspi\fP. This combination may be repeated with comma or newline separation.
.IP
Note that setting the secret for IPv4 ESP packets is supported at this time.
.IP
@ -272,7 +276,7 @@ The ability to decrypt packets is only present if \fItcpdump\fP was compiled
with cryptography enabled.
.IP
\fIsecret\fP is the ASCII text for ESP secret key.
If preceeded by 0x, then a hex value will be read.
If preceded by 0x, then a hex value will be read.
.IP
The option assumes RFC2406 ESP, not RFC1827 ESP.
The option is only for debugging purposes, and
@ -319,6 +323,13 @@ If used in conjunction with the
.B \-C
option, filenames will take the form of `\fIfile\fP<count>'.
.TP
.B \-h
Print the tcpdump and libpcap version strings, print a usage message,
and exit.
.TP
.B \-H
Attempt to detect 802.11s draft mesh headers.
.TP
.B \-i
Listen on \fIinterface\fP.
If unspecified, \fItcpdump\fP searches the system interface list for the
@ -359,6 +370,18 @@ monitor mode will be shown; if
is specified, only those link-layer types available when in monitor mode
will be shown.
.TP
.B \-j
Set the time stamp type for the capture to \fItstamp_type\fP. The names
to use for the time stamp types are given in
.BR pcap-tstamp-type (@MAN_MISC_INFO@);
not all the types listed there will necessarily be valid for any given
interface.
.TP
.B \-J
List the supported time stamp types for the interface and exit. If the
time stamp type cannot be set for the interface, no time stamp types are
listed.
.TP
.B \-K
Don't attempt to verify IP, TCP, or UDP checksums. This is useful for
interfaces that perform some or all of those checksum calculation in
@ -615,7 +638,10 @@ savefile name as the only argument, make the flags & arguments arrangements
and execute the command that you want.
.TP
.B \-Z
Drops privileges (if root) and changes user ID to
If
.I tcpdump
is running as root, after opening the capture device or input savefile,
but before opening any savefiles for output, change the user ID to
.I user
and the group ID to the primary group of
.IR user .
@ -871,8 +897,8 @@ The general format of a tcp protocol line is:
\fISrc\fP and \fIdst\fP are the source and destination IP
addresses and ports.
\fIFlags\fP are some combination of S (SYN),
F (FIN), P (PUSH), R (RST), W (ECN CWR) or E (ECN-Echo), or a single
`.' (no flags).
F (FIN), P (PUSH), R (RST), U (URG), W (ECN CWR), E (ECN-Echo) or
`.' (ACK), or `none' if no flags are set.
\fIData-seqno\fP describes the portion of sequence space covered
by the data in this packet (see example below).
\fIAck\fP is sequence number of the next data expected the other
@ -919,8 +945,7 @@ bytes and there was a max-segment-size option requesting an mss of
Csam replies with a similar packet except it includes a piggy-backed
ack for rtsg's SYN.
Rtsg then acks csam's SYN.
The `.' means no
flags were set.
The `.' means the ACK flag was set.
The packet contained no data so there is no data sequence number.
Note that the ack sequence
number is a small integer (1).
@ -1266,7 +1291,6 @@ RA, \fInot\fP set) and `|' (truncated message, TC, set).
If the
`question' section doesn't contain exactly one entry, `[\fIn\fPq]'
is printed.
.HD
SMB/CIFS decoding
.LP
@ -1274,19 +1298,18 @@ SMB/CIFS decoding
on UDP/137, UDP/138 and TCP/139.
Some primitive decoding of IPX and
NetBEUI SMB data is also done.
.LP
By default a fairly minimal decode is done, with a much more detailed
decode done if -v is used.
Be warned that with -v a single SMB packet
may take up a page or more, so only use -v if you really want all the
gory details.
For information on SMB packet formats and what all te fields mean see
.LP
For information on SMB packet formats and what all the fields mean see
www.cifs.org or the pub/samba/specs/ directory on your favorite
samba.org mirror site.
The SMB patches were written by Andrew Tridgell
(tridge@samba.org).
.HD
NFS Requests and Replies
.LP
@ -1639,7 +1662,7 @@ Ethernet interface removed the packet from the wire and when the kernel
serviced the `new packet' interrupt.
.SH "SEE ALSO"
stty(1), pcap(3PCAP), bpf(4), nit(4P), pcap-savefile(@MAN_FILE_FORMATS@),
pcap-filter(@MAN_MISC_INFO@)
pcap-filter(@MAN_MISC_INFO@), pcap-tstamp-type(@MAN_MISC_INFO@)
.SH AUTHORS
The original authors are:
.LP

View File

@ -94,6 +94,9 @@ netdissect_options *gndo = &Gndo;
static int dflag; /* print filter code */
static int Lflag; /* list available data link types and exit */
#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
static int Jflag; /* list available time stamp types */
#endif
static char *zflag = NULL; /* compress each savefile using a specified command (like gzip or bzip2) */
static int infodelay;
@ -114,7 +117,8 @@ static void ndo_default_print(netdissect_options *, const u_char *, u_int);
static void dump_packet_and_trunc(u_char *, const struct pcap_pkthdr *, const u_char *);
static void dump_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
static void droproot(const char *, const char *);
static void ndo_error(netdissect_options *ndo, const char *fmt, ...);
static void ndo_error(netdissect_options *ndo, const char *fmt, ...)
__attribute__ ((noreturn, format (printf, 2, 3)));
static void ndo_warning(netdissect_options *ndo, const char *fmt, ...);
#ifdef SIGINFO
@ -132,10 +136,6 @@ RETSIGTYPE requestinfo(int);
static void info(int);
static u_int packets_captured;
typedef u_int (*if_printer)(const struct pcap_pkthdr *, const u_char *);
typedef u_int (*if_ndo_printer)(struct netdissect_options *ndo,
const struct pcap_pkthdr *, const u_char *);
struct printer {
if_printer f;
int type;
@ -153,7 +153,6 @@ static struct printer printers[] = {
#ifdef DLT_ARCNET_LINUX
{ arcnet_linux_if_print, DLT_ARCNET_LINUX },
#endif
{ ether_if_print, DLT_EN10MB },
{ token_if_print, DLT_IEEE802 },
#ifdef DLT_LANE8023
{ lane_if_print, DLT_LANE8023 },
@ -305,13 +304,29 @@ static struct printer printers[] = {
};
static struct ndo_printer ndo_printers[] = {
{ ether_if_print, DLT_EN10MB },
#ifdef DLT_IPNET
{ ipnet_if_print, DLT_IPNET },
#endif
#ifdef DLT_IEEE802_15_4
{ ieee802_15_4_if_print, DLT_IEEE802_15_4 },
#endif
#ifdef DLT_IEEE802_15_4_NOFCS
{ ieee802_15_4_if_print, DLT_IEEE802_15_4_NOFCS },
#endif
#ifdef DLT_PPI
{ ppi_if_print, DLT_PPI },
#endif
#ifdef DLT_NETANALYZER
{ netanalyzer_if_print, DLT_NETANALYZER },
#endif
#ifdef DLT_NETANALYZER_TRANSPARENT
{ netanalyzer_transparent_if_print, DLT_NETANALYZER_TRANSPARENT },
#endif
{ NULL, 0 },
};
static if_printer
if_printer
lookup_printer(int type)
{
struct printer *p;
@ -324,7 +339,7 @@ lookup_printer(int type)
/* NOTREACHED */
}
static if_ndo_printer
if_ndo_printer
lookup_ndo_printer(int type)
{
struct ndo_printer *p;
@ -361,6 +376,40 @@ struct dump_info {
pcap_dumper_t *p;
};
#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
static void
show_tstamp_types_and_exit(const char *device, pcap_t *pd)
{
int n_tstamp_types;
int *tstamp_types = 0;
const char *tstamp_type_name;
int i;
n_tstamp_types = pcap_list_tstamp_types(pd, &tstamp_types);
if (n_tstamp_types < 0)
error("%s", pcap_geterr(pd));
if (n_tstamp_types == 0) {
fprintf(stderr, "Time stamp type cannot be set for %s\n",
device);
exit(0);
}
fprintf(stderr, "Time stamp types for %s (use option -j to set):\n",
device);
for (i = 0; i < n_tstamp_types; i++) {
tstamp_type_name = pcap_tstamp_type_val_to_name(tstamp_types[i]);
if (tstamp_type_name != NULL) {
(void) fprintf(stderr, " %s (%s)\n", tstamp_type_name,
pcap_tstamp_type_val_to_description(tstamp_types[i]));
} else {
(void) fprintf(stderr, " %d\n", tstamp_types[i]);
}
}
pcap_free_tstamp_types(tstamp_types);
exit(0);
}
#endif
static void
show_dlts_and_exit(const char *device, pcap_t *pd)
{
@ -402,13 +451,13 @@ show_dlts_and_exit(const char *device, pcap_t *pd)
if (lookup_printer(dlts[n_dlts]) == NULL
&& lookup_ndo_printer(dlts[n_dlts]) == NULL)
(void) fprintf(stderr, " (printing not supported)");
putchar('\n');
fprintf(stderr, "\n");
} else {
(void) fprintf(stderr, " DLT %d (printing not supported)\n",
dlts[n_dlts]);
}
}
free(dlts);
pcap_free_datalinks(dlts);
exit(0);
}
@ -430,6 +479,16 @@ show_dlts_and_exit(const char *device, pcap_t *pd)
#define I_FLAG
#endif /* HAVE_PCAP_CREATE */
#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
#define j_FLAG "j:"
#define j_FLAG_USAGE " [ -j tstamptype ]"
#define J_FLAG "J"
#else /* PCAP_ERROR_TSTAMP_TYPE_NOTSUP */
#define j_FLAG
#define j_FLAG_USAGE
#define J_FLAG
#endif /* PCAP_ERROR_TSTAMP_TYPE_NOTSUP */
#ifdef HAVE_PCAP_FINDALLDEVS
#ifndef HAVE_PCAP_IF_T
#undef HAVE_PCAP_FINDALLDEVS
@ -574,6 +633,7 @@ main(int argc, char **argv)
if(wsockinit() != 0) return 1;
#endif /* WIN32 */
jflag=-1; /* not set */
gndo->ndo_Oflag=1;
gndo->ndo_Rflag=1;
gndo->ndo_dlt=-1;
@ -600,9 +660,8 @@ main(int argc, char **argv)
smiInit("tcpdump");
#endif
opterr = 0;
while (
(op = getopt(argc, argv, "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:G:i:" I_FLAG "KlLm:M:nNOpqr:Rs:StT:u" U_FLAG "vw:W:xXy:Yz:Z:")) != -1)
(op = getopt(argc, argv, "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:G:hHi:" I_FLAG j_FLAG J_FLAG "KlLm:M:nNOpqr:Rs:StT:u" U_FLAG "vw:W:xXy:Yz:Z:")) != -1)
switch (op) {
case 'a':
@ -695,6 +754,14 @@ main(int argc, char **argv)
}
break;
case 'h':
usage();
break;
case 'H':
++Hflag;
break;
case 'i':
if (optarg[0] == '0' && optarg[1] == 0)
error("Invalid adapter index");
@ -742,6 +809,18 @@ main(int argc, char **argv)
break;
#endif /* HAVE_PCAP_CREATE */
#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
case 'j':
jflag = pcap_tstamp_type_name_to_val(optarg);
if (jflag < 0)
error("invalid time stamp type %s", optarg);
break;
case 'J':
Jflag++;
break;
#endif
case 'l':
#ifdef WIN32
/*
@ -856,6 +935,8 @@ main(int argc, char **argv)
packettype = PT_TFTP;
else if (strcasecmp(optarg, "aodv") == 0)
packettype = PT_AODV;
else if (strcasecmp(optarg, "carp") == 0)
packettype = PT_CARP;
else
error("unknown packet type `%s'", optarg);
break;
@ -1034,6 +1115,10 @@ main(int argc, char **argv)
pd = pcap_create(device, ebuf);
if (pd == NULL)
error("%s", ebuf);
#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
if (Jflag)
show_tstamp_types_and_exit(device, pd);
#endif
/*
* Is this an interface that supports monitor mode?
*/
@ -1043,16 +1128,16 @@ main(int argc, char **argv)
supports_monitor_mode = 0;
status = pcap_set_snaplen(pd, snaplen);
if (status != 0)
error("%s: pcap_set_snaplen failed: %s",
error("%s: Can't set snapshot length: %s",
device, pcap_statustostr(status));
status = pcap_set_promisc(pd, !pflag);
if (status != 0)
error("%s: pcap_set_promisc failed: %s",
error("%s: Can't set promiscuous mode: %s",
device, pcap_statustostr(status));
if (Iflag) {
status = pcap_set_rfmon(pd, 1);
if (status != 0)
error("%s: pcap_set_rfmon failed: %s",
error("%s: Can't set monitor mode: %s",
device, pcap_statustostr(status));
}
status = pcap_set_timeout(pd, 1000);
@ -1062,9 +1147,17 @@ main(int argc, char **argv)
if (Bflag != 0) {
status = pcap_set_buffer_size(pd, Bflag);
if (status != 0)
error("%s: pcap_set_buffer_size failed: %s",
error("%s: Can't set buffer size: %s",
device, pcap_statustostr(status));
}
#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
if (jflag != -1) {
status = pcap_set_tstamp_type(pd, jflag);
if (status < 0)
error("%s: Can't set time stamp type: %s",
device, pcap_statustostr(status));
}
#endif
status = pcap_activate(pd);
if (status < 0) {
/*
@ -1170,14 +1263,40 @@ main(int argc, char **argv)
(void)setsignal(SIGPIPE, cleanup);
(void)setsignal(SIGTERM, cleanup);
(void)setsignal(SIGINT, cleanup);
(void)setsignal(SIGCHLD, child_cleanup);
#endif /* WIN32 */
#if defined(HAVE_FORK) || defined(HAVE_VFORK)
(void)setsignal(SIGCHLD, child_cleanup);
#endif
/* Cooperate with nohup(1) */
#ifndef WIN32
if ((oldhandler = setsignal(SIGHUP, cleanup)) != SIG_DFL)
(void)setsignal(SIGHUP, oldhandler);
#endif /* WIN32 */
#ifndef WIN32
/*
* If a user name was specified with "-Z", attempt to switch to
* that user's UID. This would probably be used with sudo,
* to allow tcpdump to be run in a special restricted
* account (if you just want to allow users to open capture
* devices, and can't just give users that permission,
* you'd make tcpdump set-UID or set-GID).
*
* Tcpdump doesn't necessarily write only to one savefile;
* the general only way to allow a -Z instance to write to
* savefiles as the user under whose UID it's run, rather
* than as the user specified with -Z, would thus be to switch
* to the original user ID before opening a capture file and
* then switch back to the -Z user ID after opening the savefile.
* Switching to the -Z user ID only after opening the first
* savefile doesn't handle the general case.
*/
if (getuid() == 0 || geteuid() == 0) {
if (username || chroot_dir)
droproot(username, chroot_dir);
}
#endif /* WIN32 */
if (pcap_setfilter(pd, &fcode) < 0)
error("%s", pcap_geterr(pd));
if (WFileName) {
@ -1207,6 +1326,10 @@ main(int argc, char **argv)
callback = dump_packet;
pcap_userdata = (u_char *)p;
}
#ifdef HAVE_PCAP_DUMP_FLUSH
if (Uflag)
pcap_dump_flush(p);
#endif
} else {
type = pcap_datalink(pd);
printinfo.ndo_type = 1;
@ -1227,16 +1350,7 @@ main(int argc, char **argv)
callback = print_packet;
pcap_userdata = (u_char *)&printinfo;
}
#ifndef WIN32
/*
* We cannot do this earlier, because we want to be able to open
* the file (if done) for writing before giving up permissions.
*/
if (getuid() == 0 || geteuid() == 0) {
if (username || chroot_dir)
droproot(username, chroot_dir);
}
#endif /* WIN32 */
#ifdef SIGINFO
/*
* We can't get statistics when reading from a file rather
@ -1365,13 +1479,13 @@ cleanup(int signo _U_)
On windows, we do not use a fork, so we do not care less about
waiting a child processes to die
*/
#ifndef WIN32
#if defined(HAVE_FORK) || defined(HAVE_VFORK)
static RETSIGTYPE
child_cleanup(int signo _U_)
{
wait(NULL);
}
#endif /* WIN32 */
#endif /* HAVE_FORK && HAVE_VFORK */
static void
info(register int verbose)
@ -1392,34 +1506,41 @@ info(register int verbose)
if (!verbose)
fprintf(stderr, "%s: ", program_name);
(void)fprintf(stderr, "%u packets captured", packets_captured);
(void)fprintf(stderr, "%u packet%s captured", packets_captured,
PLURAL_SUFFIX(packets_captured));
if (!verbose)
fputs(", ", stderr);
else
putc('\n', stderr);
(void)fprintf(stderr, "%u packets received by filter", stat.ps_recv);
(void)fprintf(stderr, "%u packet%s received by filter", stat.ps_recv,
PLURAL_SUFFIX(stat.ps_recv));
if (!verbose)
fputs(", ", stderr);
else
putc('\n', stderr);
(void)fprintf(stderr, "%u packets dropped by kernel", stat.ps_drop);
(void)fprintf(stderr, "%u packet%s dropped by kernel", stat.ps_drop,
PLURAL_SUFFIX(stat.ps_drop));
if (stat.ps_ifdrop != 0) {
if (!verbose)
fputs(", ", stderr);
else
putc('\n', stderr);
(void)fprintf(stderr, "%u packets dropped by interface\n",
stat.ps_ifdrop);
(void)fprintf(stderr, "%u packet%s dropped by interface\n",
stat.ps_ifdrop, PLURAL_SUFFIX(stat.ps_ifdrop));
} else
putc('\n', stderr);
infoprint = 0;
}
#ifndef WIN32
#if defined(HAVE_FORK) || defined(HAVE_VFORK)
static void
compress_savefile(const char *filename)
{
# ifdef HAVE_FORK
if (fork())
# else
if (vfork())
# endif
return;
/*
* Set to lowest priority so that this doesn't disturb the capture
@ -1435,15 +1556,20 @@ compress_savefile(const char *filename)
zflag,
filename,
strerror(errno));
# ifdef HAVE_FORK
exit(1);
# else
_exit(1);
# endif
}
#else /* WIN32 */
#else /* HAVE_FORK && HAVE_VFORK */
static void
compress_savefile(const char *filename)
{
fprintf(stderr,
"compress_savefile failed. Functionality not implemented under windows\n");
"compress_savefile failed. Functionality not implemented under your system\n");
}
#endif /* WIN32 */
#endif /* HAVE_FORK && HAVE_VFORK */
static void
dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
@ -1782,17 +1908,17 @@ usage(void)
#endif /* WIN32 */
#endif /* HAVE_PCAP_LIB_VERSION */
(void)fprintf(stderr,
"Usage: %s [-aAbd" D_FLAG "ef" I_FLAG "KlLnNOpqRStu" U_FLAG "vxX]" B_FLAG_USAGE " [ -c count ]\n", program_name);
"Usage: %s [-aAbd" D_FLAG "efhH" I_FLAG J_FLAG "KlLnNOpqRStu" U_FLAG "vxX]" B_FLAG_USAGE " [ -c count ]\n", program_name);
(void)fprintf(stderr,
"\t\t[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]\n");
(void)fprintf(stderr,
"\t\t[ -i interface ] [ -M secret ] [ -r file ]\n");
"\t\t[ -i interface ]" j_FLAG_USAGE " [ -M secret ]\n");
(void)fprintf(stderr,
"\t\t[ -s snaplen ] [ -T type ] [ -w file ] [ -W filecount ]\n");
"\t\t[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]\n");
(void)fprintf(stderr,
"\t\t[ -y datalinktype ] [ -z command ] [ -Z user ]\n");
"\t\t[ -W filecount ] [ -y datalinktype ] [ -z command ]\n");
(void)fprintf(stderr,
"\t\t[ expression ]\n");
"\t\t[ -Z user ] [ expression ]\n");
exit(1);
}

View File

@ -1,34 +0,0 @@
begin 644 02-sunrise-sunset-esp.pcap
MU,.RH0(`!``````````````&```!``````````````"6````E@```!```&1D
M11```&1D(P@`10``B/]G``!`,O:5P`$"%\`!`BT2-%9X`````4P@12\\L)(1
MTZ=(S>7($>.<3N@\_I:AY"K/TKAZJP719"NCKYP;PT(0+$"M%=]-X"`*8V.'
M-'$1A]02"3N#OZI#&1R]A*1;`G8S@YFQ]<H7S))417Y9!E4:<$'CW)%VZ&_3
M_]T`L+P1^!`PEP``````````E@```)8````0``!D9$40``!D9",(`$4``(C_
M:```0#+VE,`!`A?``0(M$C16>`````(:<$'CW)%VZ',2KQMB@CN?'"^GJ<=:
MD-0`+.V^J'2AK).'XQ_B"B8:[%A_+K[6KS2'XR[UN`,R"BJP?^].ZM#/[$)#
M17^!D"8_[BZ>GU4Z*$7I"N$U*>J47?C-4;I>#`%6+#0%]D75YC']*Z\`````
M`````)8```"6````$```9&1%$```9&0C"`!%``"(_VD``$`R]I/``0(7P`$"
M+1(T5G@````#7?C-4;I>#`%@W%89?QJ#$TJ,4G\FO&HO=F+,,%1E(]);XI]T
MV7W.RY$2=JZ1%!QCNX[;^.JD4W91;7)NJWV2MF4?7`=&_3OWW%V&6RIXKB75
M#;2TWNL"A:MF!I@_5R^]L6;Z`L?E@1:T&71G``````````"6````E@```!``
M`&1D11```&1D(P@`10``B/]J``!`,O:2P`$"%\`!`BT2-%9X````!*MF!I@_
M5R^]%';9*Q:S_B]]O_8FV:2K1A!]/SQHI7>OS815*I?4%/:.=BBJUEGJ(X8\
M<SZ>P1E/@&P\9MR)DP3[UCWI@,MR%A$\CR]=G(("[CFB7AUN$AENZOO&\:7%
M2KLW<'NP,L(I=!;8=0``````````E@```)8````0``!D9$40``!D9",(`$4`
M`(C_:P``0#+VD<`!`A?``0(M$C16>`````5NZOO&\:7%2J12,9;LOK"-S,=$
MO0]X+J(OJQED#PLBRY[\^352UZK&57<R0L9JQ:KH6`)BUN$`5]1WU@"A!8TM
MO^)<;`-SW;1HQO$CE\#`O[W[17GW[0G&M,^T?7>6,Z<:%73AWV3:;Y/:=@(`
M`````````)8```"6````$```9&1%$```9&0C"`!%``"(_VP``$`R]I#``0(7
MP`$"+1(T5G@````&M,^T?7>6,Z=>N_YZQFV[H1^6\!/I*IMAOHZE\E0M.Z!X
M#[0EG3#>%]7`]*2F?@S4X2''TK09J@NG/.HEXCE./..K^'-@":X[\?0L+B`S
MQA\HTK\'J]:S]N6O`]\)NQD)9;H2P\K`^NX37`R5``````````"6````E@``
M`!```&1D11```&1D(P@`10``B/]M``!`,O:/P`$"%\`!`BT2-%9X````!^6O
M`]\)NQD)>BYZ>`/DA=N;A2...3-7FZOK?:5KGXBN`/E?$\[-11-$G#E;(>N"
M+<$/YP'SM$>16LU18&Q]9)$]0)/M]:2Z#A6]-,SM*>FI/`X*K-*-:KS3IW<"
MO(>(P(K=:X::SJ;O[J>0K```````````E@```)8````0``!D9$40``!D9",(
M`$4``(C_;@``0#+VCL`!`A?``0(M$C16>`````C3IW<"O(>(P'-43;C[`MCD
M`BMZAX]F!?'Z$8Q"5HYMVDC9"8I^O(Z4!/)`/IVD-(ZK)_52-H2XK+,(-LR)
MM)K#XLF">KY0>C?\[MA%3F%$?ORJ@:>O]5H>?-$OQH)J<ZFOW_+K%G=UG0"[
"G'T`
`
end

View File

@ -1,36 +0,0 @@
begin 644 08-sunrise-sunset-aes.pcap
MU,.RH0(`!``````````````&```!``````````````"F````I@```!```&1D
M11```&1D(P@`10``F/SJ``!`,OD"P`$"%\`!`BW1(T5G`````>:['.C0J(%P
MVF'>(TU6&*"9A,`,/KS\:>DH>O_L(51)_[YY"L<H#LJ/;(BQ)=[*$<APY/A1
M-"T@(`_Q&)S!C)$*7S?G3Q4H\F=)OYF+P@S&11%^*]S)N@L*TZ@!:&&:QFZT
ML'#7<>9?8'?J4V:_.]B+6UR\T>39D+=NA;$``````````*8```"F````$```
M9&1%$```9&0C"`!%``"8_.L``$`R^0'``0(7P`$"+=$C16<````";K2P<-=Q
MYE]@=^I39K\[V$1HDU9'L,6BVK.^B4]E6QY&:?3?T)G?"RSU;X!J]]7S)<`,
M*L!SYO^RUWR?!EIJMWU=5B406YL-I`]LK`^;-3%(NEY#R`ST=W40=:*[M$*8
M#<KX)19@.`.4_5YD^:V;G@3>`GLTK(5ZCS"BC@``````````I@```*8````0
M``!D9$40``!D9",(`$4``)C\[```0#+Y`,`!`A?``0(MT2-%9P````,-RO@E
M%F`X`Y3]7F3YK9N>=6-;U&'6">_4H80DMY^Z9E3ZL3[ONN*L<"Z@7(VO]XT^
M/2JP<(/^8NTO-4\/B5AJEC4N;,\"7-&(;9AM_2G5A1C.[LBK3')P?AE;$I[)
M!8N&RC?OTD7<V)AIU4,*E>7ELURFXRD/JD(:@RER``````````"F````I@``
M`!```&1D11```&1D(P@`10``F/SM``!`,OC_P`$"%\`!`BW1(T5G````!(;*
M-^_21=S8F&G50PJ5Y>5K%@R;)A(E<5YD'@86@GT"-&&MHP*.A=?%=:FDZH=4
M*9":>]'G'CB4%2?PJ"2^H*51\8P!9T`X3#;F+H$[<GW7=?K.R30-'6'L3AO8
MR=:M3S$GIZ>4Z$7ZL0<\S=S\%`:BW9U2'@U^@D,,:.P``````````*8```"F
M````$```9&1%$```9&0C"`!%``"8_.X``$`R^/[``0(7P`$"+=$C16<````%
M,2>GIY3H1?JQ!SS-W/P4!BW&*&A[$!XGK<^M^>_X193"G"1QTWG>Q"CO25$"
MPM+1+8[6&(17\EE\P:6-WVPT=911?@'-Z,,/UVZ2!QV(X4513U9]P62CJMS>
M^ODBGHU=%T.H2&Z<4,8(!4,2[&A4^H="L:+`=4G?*(7,2@``````````I@``
M`*8````0``!D9$40``!D9",(`$4``)C\[P``0#+X_<`!`A?``0(MT2-%9P``
M``870ZA(;IQ0Q@@%0Q+L:%3Z@*HQPZA]3STWDY#CYJGOJH)K<KVT9G61>>I'
MEHMF"X!^G,H@,YWT7^=60.3/$7?AYH)G9GBD%%#,D]!EDA]B*?UE>U96+"5\
MK=""/.LO'__^;$N<E@!.2&3^@U:P__8_'D^YC!41E,!@!6<K``````````"F
M````I@```!```&1D11```&1D(P@`10``F/SP``!`,OC\P`$"%\`!`BW1(T5G
M````!_YL2YR6`$Y(9/Z#5K#_]C_ZJU%7M?L23>I`L#D]@&G?Z7B2O#GI?NDK
MF[7JPN,8V\H>%G+)'+%+FL*&\8+H2^KFWF5YQ:$4V!,1?G;=OYD;!,3YD'V(
MW[Y!I(U=X9[\:L)(5GBJ,B!-5N$.CGV$VLD^R?Z,KL[AMI(ZC-P`````````
M`*8```"F````$```9&1%$```9&0C"`!%``"8_/$``$`R^/O``0(7P`$"+=$C
M16<````(PDA6>*HR($U6X0Z.?83:R;Y0<E/4SN)UX;Q:D$D%K(DZZ:^_\K$'
MZQ81NT4KBGD#Z=_^`E^!HS*KHEJ!)!KE>&'2065/"*M'ELXD?1%3\L3TC.UK
HKWB(C5O@78>9LQ^<0Z6]F=:<;@[>L^;/\-6WB81[GX)<MS0B=>LGD@``
`
end

View File

@ -1,43 +0,0 @@
begin 644 08-sunrise-sunset-esp2.pcap
MU,.RH0(`!``````````````&```!``````````````#.````S@```!```&1D
M11```&1D(P@`10``P"E-``!`,LQXP`$"%\`!`BT2-%9X`````4=!+\5+F8`+
M[[NOU-#98*AO5\780X[VDXF@2W8<10:J!'!Z!-[7N4CFNRKIH;PUA1SL"Y9\
M-?_3N_,W/@*T+C/"]=S[`;D!/;`SR5,3+><9K.^\9N><18TY9Z\!I\S./L8R
MFE53,S6Y5X_Z\(T)ZIUS?X$8>&(_MT1"!SV:VPP!\XU$[3S-5L)4-O"&>]`Z
M1:./61=%C6`6U1/65"A&KUE902]*``````````#.````S@```!```&1D11``
M`&1D(P@`10``P"E/``!`,LQVP`$"%\`!`BT2-%9X`````CIU^SX%;G^!GUSP
MSA<?/8FY?L/'^2]6'&3[\-NES3E]33Z$Q]#7D9$8TFS5);?S?)ZJOP4;ZD-M
M+0_/@#*U=7A9;FYR*5&/^V%MSFEM`DAZY,8'<0.9M^'::<M+M2G0LG6*S/[3
M?T`IIJUJ[GW,L+&PH<AR&K(]^=[K7IMGD[`8[ONL8LD3AM`N@$S!*?=;*8=>
ML7P6FM81),N>T/1Z'"P7H5;```````````#.````S@```!```&1D11```&1D
M(P@`10``P"E1``!`,LQTP`$"%\`!`BT2-%9X`````R4)-P&F>HPK/?_$MTFC
M^TOO=/L#W_APTK6MIH_BC*I7\L<,9(?/0M"HK3[T3F;(Y2V70$P5?D'7GFIB
MJZ/C",S/BD!9N8GV"\.;GVME[P!@!B1"DT=1W0_75FMI23H!T2^C);4GY>`I
M-2T^O_0_WU&$)&+/P)%[TQUQ-T7G%\RXYJT0HO</^*)F`^2<W8KTY.W<FK4K
M8UC+J'.*X)NH%<UTK+K+``````````#.````S@```!```&1D11```&1D(P@`
M10``P"E3``!`,LQRP`$"%\`!`BT2-%9X````!)`9]]SHKI[EGW4M?W8>[$=<
M`@@TL1#(Y980]E*/!^2@G`*&S9O^QMS1S?/`TL=5F9B(12?(145>Y2I+;+T?
MKWUD@&.7U36]K-$[.%9CB*FK^E8>N:K/)4#$]ZO/:=#;MRH-)_139\,W6M4T
M7SQ?BBX&GT,+A3#BB5^O=>+GKIC-4]5VBP)D-S<X2O)H[_/#M*T+&$\7PL.M
M>7-)\W&;<@_J@,*!``````````#.````S@```!```&1D11```&1D(P@`10``
MP"E5``!`,LQPP`$"%\`!`BT2-%9X````!0OIFA;,@2C4HF3>5!-C(0>5LR0"
M='1\OQ.!-?@D(U0!453"<Q/!\*CDK.&OU'+WE:^7J8"AMS<@UYX*,<(&YA2Q
MGQ(.3+0\#`!+`.TE,;\3:.<+F:?=T@.KOBL%VAAX9_RY$/^%$C+I*4&S<AM]
MP*]SZ"RD'G.AJH76?SV&2HQLF+!J/QZ;.:<LB::-]+AE1+&);M^]`XZ-W2CX
M+&CPZINP*9?>``````````#.````S@```!```&1D11```&1D(P@`10``P"E7
M``!`,LQNP`$"%\`!`BT2-%9X````!I0M"-THEF=+!L=>A3N,\1+"'Z7(J?O0
M.B?)(#X=/5F-.">%3.X'(=JKK:W<MZF2^8#73C[US$-O&ZZ+L:94R9E2#=J=
M18HP?AN`5^)A+HW6EB*5P=AZ(S"\TIBZ'\.=]4A,#18'0/R_#C:4XX_?>ZMN
M=B+^Q3"(KE\1299]=5E,'.&U(`H9N)+>9FS/`CA*>D^>AV.-C(S\)BM&)*XM
M^BF__^<_``````````#.````S@```!```&1D11```&1D(P@`10``P"E9``!`
M,LQLP`$"%\`!`BT2-%9X````!R"SQ'[6%(;Q>>O+]CS6D*+AD3IMC\^MMK8[
M:T3)KM06!G^.H\>%UAT@)X6JL9\3V.HR"+_Q^_T-O$Y_S":_TP;V,LIV1O]H
M-G@DOL'V-5)O@%<%!#O$2V,AS@W7(&$IX.YKK]\K#>FITU)<>O42T2GKFW+^
M\/[,>E4P[Q"+7O,Y1(R22LND[H+469(%3,SN&3:U:/I`'&R@<`<TR"-4:&8+
MQ5SX``````````#.````S@```!```&1D11```&1D(P@`10``P"E;``!`,LQJ
MP`$"%\`!`BT2-%9X````"*',]A6A,Q(*B+]=&6X&T*L^\)Z6N%,G)(.;6X-K
MM@&4<FRJ]#IJ%Y'-^T+4[&;0;_%7HM85LR8W(>HKGOV,^#L9,QF%)W^9!VFM
MXG'XY]CWI5VF33?7,*P?6:.PS'&[\N$7W<*==+;P*$./4*OH&=O,6G!JIN>I
M'ZDP*D&4K>SK-\/!7\Z&<&5J4%NU?NRM&25'*_"'UE3VH&?U]/V@932UYZT\
`
end

View File

@ -1,51 +0,0 @@
# BGP test
bgp_vpn_attrset bgp_vpn_attrset.pcap bgp_vpn_attrset.out -t -v
# EAP tests
eapon1 eapon1.pcap eapon1.out -t
# ESP tests
esp0 02-sunrise-sunset-esp.pcap esp0.out -t
esp1 02-sunrise-sunset-esp.pcap esp1.out -t -E "0x12345678@192.1.2.45 3des-cbc-hmac96:0x4043434545464649494a4a4c4c4f4f515152525454575758"
esp2 08-sunrise-sunset-esp2.pcap esp2.out -t -E "0x12345678@192.1.2.45 3des-cbc-hmac96:0x43434545464649494a4a4c4c4f4f51515252545457575840,0xabcdabcd@192.0.1.1 3des-cbc-hmac96:0x434545464649494a4a4c4c4f4f5151525254545757584043"
esp3 02-sunrise-sunset-esp.pcap esp1.out -t -E "3des-cbc-hmac96:0x4043434545464649494a4a4c4c4f4f515152525454575758"
esp4 08-sunrise-sunset-esp2.pcap esp2.out -t -E "file esp-secrets.txt"
esp5 08-sunrise-sunset-aes.pcap esp5.out -t -E "file esp-secrets.txt"
espudp1 espudp1.pcap espudp1.out -t -E "file esp-secrets.txt"
# ISAKMP tests
isakmp1 isakmp-delete-segfault.pcap isakmp1.out -t
isakmp2 isakmp-pointer-loop.pcap isakmp2.out -t
isakmp3 isakmp-identification-segfault.pcap isakmp3.out -t -v
isakmp4 isakmp4500.pcap isakmp4.out -t -E "file esp-secrets.txt"
# LMP tests (what is it?)
# fails right now.
#lmp lmp.pcap lmp.out -t -v -v
# MPLS tests
mpls-ldp-hello mpls-ldp-hello.pcap mpls-ldp-hello.out -t -v
# OSPF tests
ospf-gmpls ospf-gmpls.pcap ospf-gmpls.out -t -v
# IKEv2 tests
ikev2four ikev2four.pcap ikev2four.out -t -v
ikev2fourv ikev2four.pcap ikev2fourv.out -t -v -v -v
ikev2fourv4 ikev2four.pcap ikev2fourv4.out -t -v -v -v -v
ikev2pI2 ikev2pI2.pcap ikev2pI2.out -t -E "file ikev2pI2-secrets.txt" -v -v -v -v
# IETF ROLL RPL packets
dio01 dio.pcap dio.out -t -v
# IPNET encapsulated site
e1000g e1000g.pcap e1000g.out -t
# IETF FORCES WG packets and printer
forces01 forces1.pcap forces1.out -t
forces02 forces2.pcap forces2.out -t
forces02v forces2.pcap forces2v.out -t -v
forces02vv forces2.pcap forces2vv.out -t -v -v
forces01vvv forces1.pcap forces1vvv.out -t -v -v -v
forces01vvvv forces1.pcap forces1vvvv.out -t -v -v -v -v

View File

@ -1,46 +0,0 @@
#!/usr/bin/perl
system("mkdir -p NEW DIFF");
if(@ARGV == 1) {
open(TESTLIST, "TESTLIST") || die "can not open TESTLIST: $!\n";
$wanted = $ARGV[0];
#print "Searching for test case $wanted\n";
while(<TESTLIST>) {
#print "Processing $_\n";
next unless (/^$wanted/);
chop;
($name,$input,$output,$options)=split(/\s+/,$_, 4);
last;
}
close(TESTLIST);
die "Can not find test $wanted\n" unless defined($input);
} elsif(@ARGV == 4) {
$name=$ARGV[0];
$input=$ARGV[1];
$output=$ARGV[2];
$options=$ARGV[3];
} else {
print "Usage: TESTonce name [input output options]\n";
exit 20;
}
print "Running $name. \n";
print " Input: $input, OUTPUT: $output, OPTIONS: $options\n";
if (! -f $input) {
($puu = $input) =~ s/\.pcap/\.puu/;
if( -f $puu) {
print "Uudecoding $puu to make $input\n";
system("uudecode $puu");
}
}
print " ";
exec("../tcpdump -n -r $input $options | tee NEW/$output | diff -w - $output >DIFF/$output.diff");
@cores = glob("core*");
exit 10 if (@cores > 0);
exit 0;

View File

@ -1,63 +0,0 @@
#!/bin/sh
mkdir -p NEW
mkdir -p DIFF
passed=0
failed=0
# first run any specific tests.
for i in *.sh
do
case $i in TEST*.sh) continue;; esac
if sh ./$i >DIFF/$i.result
then
echo $i: passed.
rm -f DIFF/$i.result
passed=$(($passed + 1))
else
echo $i: failed.
failed=$(($failed + 1))
fi
done
echo $passed >.passed
echo $failed >.failed
# now run typical tests
cat TESTLIST | while read name input output options
do
case $name in
\#*) continue;;
'') continue;;
esac
if ./TESTonce $name $input $output "$options"
then
echo $name: passed.
rm -f DIFF/$output.diff
passed=$(($passed + 1))
echo $passed >.passed
else
echo $name: failed.
failed=$(($failed + 1))
echo $failed >.failed
fi
done
# I hate shells with their stupid, useless subshells.
passed=`cat .passed`
failed=`cat .failed`
# exit with number of failing tests.
echo
echo
printf "%4u tests failed\n" $failed
printf "%4u tests passed\n" $passed
echo
echo
exit $failed

View File

@ -1,19 +0,0 @@
IP (tos 0xc0, ttl 62, id 58628, offset 0, flags [none], proto TCP (6), length 173)
12.4.4.4.2051 > 12.1.1.1.179: Flags [P.], cksum 0xcf18 (correct), seq 3293077573:3293077694, ack 3348108582, win 16384, options [nop,nop,TS val 383131 ecr 890299], length 121: BGP, length: 121
Update Message (2), length: 121
Origin (1), length: 1, Flags [T]: IGP
AS Path (2), length: 0, Flags [T]: empty
Local Preference (5), length: 4, Flags [T]: 100
Extended Community (16), length: 8, Flags [OT]:
target (0x0002), Flags [none]: 300:300 (= 0.0.1.44)
Attribute Set (128), length: 36, Flags [OT]:
Origin AS: 65001
Origin (1), length: 1, Flags [T]: IGP
AS Path (2), length: 4, Flags [T]: 5555
Local Preference (5), length: 4, Flags [T]: 44
Originator ID (9), length: 4, Flags [O]: 22.5.5.5
Cluster List (10), length: 4, Flags [O]: 22.5.5.5
Multi-Protocol Reach NLRI (14), length: 30, Flags [OE]:
AFI: IPv4 (1), SAFI: labeled VPN Unicast (128)
nexthop: RD: 0:0 (= 0.0.0.0), 12.4.4.4, nh-length: 12, no SNPA
RD: 500:500 (= 0.0.1.244), 133.0.0.0/8, label:100208 (bottom)

View File

@ -1 +0,0 @@
IP6 (hlim 255, next-header ICMPv6 (58) payload length: 24) fe80::1000:ff:fe64:6423 > ff02::1: [icmp6 sum ok] ICMP6, RPL, length 24, DAG Information Object [seq:10,instance:42,rank:1,dagid:thisismynicedag1]

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More